diff --git a/dist/frappe-charts.esm.js b/dist/frappe-charts.esm.js index 671b6cd..38dd8f5 100644 --- a/dist/frappe-charts.esm.js +++ b/dist/frappe-charts.esm.js @@ -306,6 +306,10 @@ class SvgTip { } } +/** + * Returns the value of a number upto 2 decimal places. + * @param {Number} d Any number + */ function floatTwo(d) { return parseFloat(d.toFixed(2)); } @@ -3685,6 +3689,7 @@ class AxisChart extends BaseChart { // removeDataPoint(index = 0) {} } +// import MultiAxisChart from './charts/MultiAxisChart'; const chartTypes = { bar: AxisChart, line: AxisChart, diff --git a/dist/frappe-charts.min.cjs.js b/dist/frappe-charts.min.cjs.js index 8ff951f..815372e 100644 --- a/dist/frappe-charts.min.cjs.js +++ b/dist/frappe-charts.min.cjs.js @@ -1,2 +1,4332 @@ -"use strict";function __$styleInject(t,e){void 0===e&&(e={});var n=e.insertAt;if(t&&"undefined"!=typeof document){var i=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===n&&i.firstChild?i.insertBefore(a,i.firstChild):i.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}function $(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function getOffset(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 isElementInViewport(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 getElementContentWidth(t){var e=window.getComputedStyle(t),n=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-n}function fire(t,e,n){var i=document.createEvent("HTMLEvents");i.initEvent(e,!0,!0);for(var a in n)i[a]=n[a];return t.dispatchEvent(i)}function getTopOffset(t){return t.titleHeight+t.margins.top+t.paddings.top}function getLeftOffset(t){return t.margins.left+t.paddings.left}function getExtraHeight(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function getExtraWidth(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function _classCallCheck$4(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function floatTwo(t){return parseFloat(t.toFixed(2))}function fillArray(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n||(n=i?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(n);return t=i?a.concat(t):t.concat(a)}function getStringWidth(t,e){return(t+"").length*e}function getPositionByAngle(t,e){return{x:Math.sin(t*ANGLE_RATIO)*e,y:Math.cos(t*ANGLE_RATIO)*e}}function getBarHeightAndYAttr(t,e){var n=void 0,i=void 0;return t<=e?(n=e-t,i=t):(n=t-e,i=e),[n,i]}function equilizeNoOfElements(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return n>0?t=fillArray(t,n):e=fillArray(e,n),[t,e]}function limitColor(t){return t>255?255:t<0?0:t}function lightenDarkenColor(t,e){var n=getColor(t),i=!1;"#"==n[0]&&(n=n.slice(1),i=!0);var a=parseInt(n,16),r=limitColor((a>>16)+e),o=limitColor((a>>8&255)+e),s=limitColor((255&a)+e);return(i?"#":"")+(s|o<<8|r<<16).toString(16)}function isValidColor(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)}function $$1(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function createSVG(t,e){var n=document.createElementNS("http://www.w3.org/2000/svg",t);for(var i in e){var a=e[i];if("inside"===i)$$1(a).appendChild(n);else if("around"===i){var r=$$1(a);r.parentNode.insertBefore(n,r),n.appendChild(r)}else"styles"===i?"object"===(void 0===a?"undefined":_typeof$2(a))&&Object.keys(a).map(function(t){n.style[t]=a[t]}):("className"===i&&(i="class"),"innerHTML"===i?n.textContent=a:n.setAttribute(i,a))}return n}function renderVerticalGradient(t,e){return createSVG("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function setGradientStop(t,e,n,i){return createSVG("stop",{inside:t,style:"stop-color: "+n,offset:e,"stop-opacity":i})}function makeSVGContainer(t,e,n,i){return createSVG("svg",{className:e,inside:t,width:n,height:i})}function makeSVGDefs(t){return createSVG("defs",{inside:t})}function makeSVGGroup(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,i={className:t,transform:e};return n&&(i.inside=n),createSVG("g",i)}function makePath(t){return createSVG("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"}})}function makeArcPathStr(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,r=n.x+t.x,o=n.y+t.y,s=n.x+e.x,l=n.y+e.y;return"M"+n.x+" "+n.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+i+" "+i+" 0 0 "+(a?1:0)+"\n\t\t"+s+" "+l+" z"}function makeGradient(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="path-fill-gradient-"+e+"-"+(n?"lighter":"default"),a=renderVerticalGradient(t,i),r=[1,.6,.2];return n&&(r=[.4,.2,0]),setGradientStop(a,"0%",e,r[0]),setGradientStop(a,"50%",e,r[1]),setGradientStop(a,"100%",e,r[2]),i}function percentageBar(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:PERCENTAGE_BAR_DEFAULT_DEPTH,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return createSVG("rect",{className:"percentage-bar",x:t,y:e,width:n,height:i,fill:r,styles:{stroke:lightenDarkenColor(r,-25),"stroke-dasharray":"0, "+(i+n)+", "+n+", "+i,"stroke-width":a}})}function heatSquare(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"none",r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o={className:t,x:e,y:n,width:i,height:i,fill:a};return Object.keys(r).map(function(t){o[t]=r[t]}),createSVG("rect",o)}function legendBar(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4],r={className:"legend-bar",x:0,y:0,width:n,height:"2px",fill:i},o=createSVG("text",{className:"legend-dataset-text",x:0,y:0,dy:2*FONT_SIZE+"px","font-size":1.2*FONT_SIZE+"px","text-anchor":"start",fill:FONT_FILL,innerHTML:a}),s=createSVG("g",{transform:"translate("+t+", "+e+")"});return s.appendChild(createSVG("rect",r)),s.appendChild(o),s}function legendDot(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4],r={className:"legend-dot",cx:0,cy:0,r:n,fill:i},o=createSVG("text",{className:"legend-dataset-text",x:0,y:0,dx:FONT_SIZE+"px",dy:FONT_SIZE/3+"px","font-size":1.2*FONT_SIZE+"px","text-anchor":"start",fill:FONT_FILL,innerHTML:a}),s=createSVG("g",{transform:"translate("+t+", "+e+")"});return s.appendChild(createSVG("circle",r)),s.appendChild(o),s}function makeText(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},r=a.fontSize||FONT_SIZE;return createSVG("text",{className:t,x:e,y:n,dy:(void 0!==a.dy?a.dy:r/2)+"px","font-size":r+"px",fill:a.fill||FONT_FILL,"text-anchor":a.textAnchor||"start",innerHTML:i})}function makeVertLine(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=BASE_LINE_COLOR);var r=createSVG("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:n,y2:i,styles:{stroke:a.stroke}}),o=createSVG("text",{x:0,y:n>i?n+LABEL_MARGIN:n-LABEL_MARGIN-FONT_SIZE,dy:FONT_SIZE+"px","font-size":FONT_SIZE+"px","text-anchor":"middle",innerHTML:e+""}),s=createSVG("g",{transform:"translate("+t+", 0)"});return s.appendChild(r),s.appendChild(o),s}function makeHoriLine(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=BASE_LINE_COLOR),a.lineType||(a.lineType="");var r=createSVG("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:n,x2:i,y1:0,y2:0,styles:{stroke:a.stroke}}),o=createSVG("text",{x:n3&&void 0!==arguments[3]?arguments[3]:{};i.pos||(i.pos="left"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke=BASE_LINE_COLOR),i.className||(i.className="");var a=-1*AXIS_TICK_LENGTH,r="span"===i.mode?n+AXIS_TICK_LENGTH:0;return"tick"===i.mode&&"right"===i.pos&&(a=n+AXIS_TICK_LENGTH,r=n),a+=i.offset,r+=i.offset,makeHoriLine(t,e,a,r,{stroke:i.stroke,className:i.className,lineType:i.lineType})}function xLine(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};i.pos||(i.pos="bottom"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke=BASE_LINE_COLOR),i.className||(i.className="");var a=n+AXIS_TICK_LENGTH,r="span"===i.mode?-1*AXIS_TICK_LENGTH:n;return"tick"===i.mode&&"top"===i.pos&&(a=-1*AXIS_TICK_LENGTH,r=0),makeVertLine(t,e,a,r,{stroke:i.stroke,className:i.className,lineType:i.lineType})}function yMarker(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};i.labelPos||(i.labelPos="right");var a=createSVG("text",{className:"chart-label",x:"left"===i.labelPos?LABEL_MARGIN:n-getStringWidth(e,5)-LABEL_MARGIN,y:0,dy:FONT_SIZE/-2+"px","font-size":FONT_SIZE+"px","text-anchor":"start",innerHTML:e+""}),r=makeHoriLine(t,"",0,n,{stroke:i.stroke||BASE_LINE_COLOR,className:i.className||"",lineType:i.lineType});return r.appendChild(a),r}function yRegion(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},r=t-e,o=createSVG("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:BASE_LINE_COLOR,"stroke-dasharray":n+", "+r},x:0,y:0,width:n,height:r});a.labelPos||(a.labelPos="right");var s=createSVG("text",{className:"chart-label",x:"left"===a.labelPos?LABEL_MARGIN:n-getStringWidth(i+"",4.5)-LABEL_MARGIN,y:0,dy:FONT_SIZE/-2+"px","font-size":FONT_SIZE+"px","text-anchor":"start",innerHTML:i+""}),l=createSVG("g",{transform:"translate(0, "+e+")"});return l.appendChild(o),l.appendChild(s),l}function datasetBar(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,s=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=getBarHeightAndYAttr(e,s.zeroLine),u=_slicedToArray(l,2),c=u[0],h=u[1];h-=o,0===c&&(c=s.minHeight,h-=s.minHeight);var d=createSVG("rect",{className:"bar mini",style:"fill: "+i,"data-point-index":r,x:t,y:h,width:n,height:c});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var f=createSVG("text",{className:"data-point-value",x:n/2,y:0,dy:FONT_SIZE/2*-1+"px","font-size":FONT_SIZE+"px","text-anchor":"middle",innerHTML:a}),p=createSVG("g",{"data-point-index":r,transform:"translate("+t+", "+h+")"});return p.appendChild(d),p.appendChild(f),p}return d}function datasetDot(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,o=createSVG("circle",{style:"fill: "+i,"data-point-index":r,cx:t,cy:e,r:n});if((a+="")||a.length){o.setAttribute("cy",0),o.setAttribute("cx",0);var s=createSVG("text",{className:"data-point-value",x:0,y:0,dy:FONT_SIZE/2*-1-n+"px","font-size":FONT_SIZE+"px","text-anchor":"middle",innerHTML:a}),l=createSVG("g",{"data-point-index":r,transform:"translate("+t+", "+e+")"});return l.appendChild(o),l.appendChild(s),l}return o}function getPaths(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},r=e.map(function(e,n){return t[n]+","+e}).join("L"),o=makePath("M"+r,"line-graph-path",n);if(i.heatline){var s=makeGradient(a.svgDefs,n);o.style.stroke="url(#"+s+")"}var l={path:o};if(i.regionFill){var u=makeGradient(a.svgDefs,n,!0),c="M"+t[0]+","+a.zeroLine+"L"+r+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=makePath(c,"region-fill","none","url(#"+u+")")}return l}function translate(t,e,n,i){var a="string"==typeof e?e:e.join(", ");return[t,{transform:n.join(", ")},i,STD_EASING,"translate",{transform:a}]}function translateVertLine(t,e,n){return translate(t,[n,0],[e,0],MARKER_LINE_ANIM_DUR)}function translateHoriLine(t,e,n){return translate(t,[0,n],[0,e],MARKER_LINE_ANIM_DUR)}function animateRegion(t,e,n,i){var a=e-n,r=t.childNodes[0];return[[r,{height:a,"stroke-dasharray":r.getAttribute("width")+", "+a},MARKER_LINE_ANIM_DUR,STD_EASING],translate(t,[0,i],[0,n],MARKER_LINE_ANIM_DUR)]}function animateBar(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,r=getBarHeightAndYAttr(n,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),o=_slicedToArray$2(r,2),s=o[0],l=o[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:i,height:s},UNIT_ANIM_DUR,STD_EASING],translate(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],MARKER_LINE_ANIM_DUR)]:[[t,{width:i,height:s,x:e,y:l},UNIT_ANIM_DUR,STD_EASING]]}function animateDot(t,e,n){return"circle"!==t.nodeName?[translate(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,n],MARKER_LINE_ANIM_DUR)]:[[t,{cx:e,cy:n},UNIT_ANIM_DUR,STD_EASING]]}function animatePath(t,e,n,i){var a=[],r=n.map(function(t,n){return e[n]+","+t}).join("L"),o=[t.path,{d:"M"+r},PATH_ANIM_DUR,STD_EASING];if(a.push(o),t.region){var s=e[0]+","+i+"L",l="L"+e.slice(-1)[0]+", "+i,u=[t.region,{d:"M"+s+r+l},PATH_ANIM_DUR,STD_EASING];a.push(u)}return a}function animatePathStr(t,e){return[t,{d:e},UNIT_ANIM_DUR,STD_EASING]}function _toConsumableArray$1(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o=t.cloneNode(!0),s=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 c=r[l]||t.getAttribute(l),h=e[l],d={attributeName:l,from:c,to:h,begin:"0s",dur:n/1e3+"s",values:c+";"+h,keySplines:EASING[i],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var f in d)u.setAttribute(f,d[f]);o.appendChild(u),a?s.setAttribute(l,"translate("+h+")"):s.setAttribute(l,h)}return[o,s]}function transform(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function animateSVG(t,e){var n=[],i=[];e.map(function(t){var e=t[0],a=e.parentNode,r=void 0,o=void 0;t[0]=e;var s=animateSVGElement.apply(void 0,_toConsumableArray$1(t)),l=_slicedToArray$1(s,2);r=l[0],o=l[1],n.push(o),i.push([r,a]),a.replaceChild(r,e)});var a=t.cloneNode(!0);return i.map(function(t,i){t[1].replaceChild(n[i],t[0]),e[i][0]=n[i]}),a}function runSMILAnimation(t,e,n){if(0!==n.length){var i=animateSVG(e,n);e.parentNode==t&&(t.removeChild(e),t.appendChild(i)),setTimeout(function(){i.parentNode==t&&(t.removeChild(i),t.appendChild(e))},REPLACE_ALL_NEW_DUR)}}function downloadFile(t,e){var n=document.createElement("a");n.style="display: none";var i=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(i);n.href=a,n.download=t,document.body.appendChild(n),n.click(),setTimeout(function(){document.body.removeChild(n),window.URL.revokeObjectURL(a)},300)}function prepareForExport(t){var e=t.cloneNode(!0);e.classList.add("chart-container"),e.setAttribute("xmlns","http://www.w3.org/2000/svg"),e.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=$.create("style",{innerHTML:CSSTEXT});e.insertBefore(n,e.firstChild);var i=$.create("div");return i.appendChild(e),i.innerHTML}function _classCallCheck$3(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck$2(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn$1(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits$1(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function treatAsUtc(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function getYyyyMmDd(t){var e=t.getDate(),n=t.getMonth()+1;return[t.getFullYear(),(n>9?"":"0")+n,(e>9?"":"0")+e].join("-")}function clone(t){return new Date(t.getTime())}function getWeeksBetween(t,e){var n=setDayToSunday(t);return Math.ceil(getDaysBetween(n,e)/NO_OF_DAYS_IN_WEEK)}function getDaysBetween(t,e){var n=SEC_IN_DAY*NO_OF_MILLIS;return(treatAsUtc(e)-treatAsUtc(t))/n}function areInSameMonth(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function getMonthName(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=MONTH_NAMES[t];return e?n.slice(0,3):n}function getLastDateInMonth(t,e){return new Date(e,t+1,0)}function setDayToSunday(t){var e=clone(t),n=e.getDay();return 0!==n&&addDays(e,-1*n),e}function addDays(t,e){t.setDate(t.getDate()+e)}function _classCallCheck$5(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function getComponent(t,e,n){var i=Object.keys(componentConfigs).filter(function(e){return t.includes(e)}),a=componentConfigs[i[0]];return Object.assign(a,{constants:e,getData:n}),new ChartComponent(a)}function _toConsumableArray(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var n=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,n)),n]}function getChartRangeIntervals(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Math.ceil(t),i=Math.floor(e),a=n-i,r=a,o=1;a>5&&(a%2!=0&&(a=++n-i),r=a/2,o=2),a<=2&&(o=a/(r=4)),0===a&&(r=5,o=1);for(var s=[],l=0;l<=r;l++)s.push(i+o*l);return s}function getChartIntervals(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=normalize(t),i=_slicedToArray$4(n,2),a=i[0],r=i[1],o=e?e/Math.pow(10,r):0,s=getChartRangeIntervals(a=a.toFixed(6),o);return s=s.map(function(t){return t*Math.pow(10,r)})}function calcChartIntervals(t){function e(t,e){for(var n=getChartIntervals(t),i=n[1]-n[0],a=0,r=1;a1&&void 0!==arguments[1]&&arguments[1],i=Math.max.apply(Math,_toConsumableArray$4(t)),a=Math.min.apply(Math,_toConsumableArray$4(t)),r=[];if(i>=0&&a>=0)normalize(i)[1],r=n?getChartIntervals(i,a):getChartIntervals(i);else if(i>0&&a<0){var o=Math.abs(a);i>=o?(normalize(i)[1],r=e(i,o)):(normalize(o)[1],r=e(o,i).map(function(t){return-1*t}))}else if(i<=0&&a<=0){var s=Math.abs(a),l=Math.abs(i);normalize(s)[1],r=(r=n?getChartIntervals(s,l):getChartIntervals(s)).reverse().map(function(t){return-1*t})}return r}function getZeroIndex(t){var e=getIntervalSize(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 getIntervalSize(t){return t[1]-t[0]}function getValueRange(t){return t[t.length-1]-t[0]}function scale(t,e){return floatTwo(e.zeroLine-t*e.scaleMultiplier)}function getClosestInArray(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=e.reduce(function(e,n){return Math.abs(n-t)n?e.slice(0,n):fillArray(e,n-e.length,0)}else t.values=a;r?t.chartType=r:t.chartType||(t.chartType=AXIS_CHART_DEFAULT_TYPE)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=t/e.length;i<=0&&(i=1);var a=i/DEFAULT_CHAR_WIDTH;return e.map(function(t,e){return(t+="").length>a&&(n?e%Math.ceil(t.length/a)!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function _toConsumableArray$5(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],n=arguments[2];return"axis-mixed"===t?(n.type="line",new AxisChart(e,n)):chartTypes[t]?new chartTypes[t](e,n):void console.error("Undefined chart type: "+t)}Object.defineProperty(exports,"__esModule",{value:!0}),__$styleInject('.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:1;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 asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,a){var s={key:t,arg:e,resolve:n,reject:a,next:null};o?o=o.next=s:(r=o=s,i(t,e))})}function i(n,r){try{var o=e[n](r),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){i("next",t)},function(t){i("throw",t)}):a(o.done?"return":"normal",o.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":r.resolve({value:e,done:!0});break;case"throw":r.reject(e);break;default:r.resolve({value:e,done:!1})}(r=r.next)?i(r.key,r.arg):o=null}var r,o;this._invoke=n,"function"!=typeof e.return&&(this.return=void 0)}return"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)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),_typeof="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};$.create=function(t,e){var n=document.createElement(t);for(var i in e){var a=e[i];if("inside"===i)$(a).appendChild(n);else if("around"===i){var r=$(a);r.parentNode.insertBefore(n,r),n.appendChild(r)}else"onClick"===i?n.addEventListener("click",a):"styles"===i?"object"===(void 0===a?"undefined":_typeof(a))&&Object.keys(a).map(function(t){n.style[t]=a[t]}):i in n?n[i]=a:n.setAttribute(i,a)}return n};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},INIT_CHART_UPDATE_TIMEOUT=700,CHART_POST_ANIMATE_TIMEOUT=400,AXIS_CHART_DEFAULT_TYPE="line",AXIS_DATASET_CHART_TYPES=["line","bar"],AXIS_LEGEND_BAR_SIZE=100,BAR_CHART_SPACE_RATIO=1,MIN_BAR_PERCENT_HEIGHT=.01,LINE_CHART_DOT_SIZE=4,DOT_OVERLAY_SIZE_INCR=4,PERCENTAGE_BAR_DEFAULT_HEIGHT=20,PERCENTAGE_BAR_DEFAULT_DEPTH=2,HEATMAP_DISTRIBUTION_SIZE=5,HEATMAP_SQUARE_SIZE=10,HEATMAP_GUTTER_SIZE=2,DEFAULT_CHAR_WIDTH=7,TOOLTIP_POINTER_TRIANGLE_HEIGHT=5,DEFAULT_CHART_COLORS=["light-blue","blue","violet","red","orange","yellow","green","light-green","purple","magenta","light-grey","dark-grey"],HEATMAP_COLORS_GREEN=["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],DEFAULT_COLORS={bar:DEFAULT_CHART_COLORS,line:DEFAULT_CHART_COLORS,pie:DEFAULT_CHART_COLORS,percentage:DEFAULT_CHART_COLORS,heatmap:HEATMAP_COLORS_GREEN},ANGLE_RATIO=Math.PI/180,FULL_ANGLE=360,_createClass$3=function(){function t(t,e){for(var n=0;n\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(){t.hideTip()})}},{key:"fill",value:function(){var t=this,e=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),e=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=e,this.dataPointList.innerHTML="",this.listValues.map(function(e,n){var i=t.colors[n]||"black",a=0===e.formatted||e.formatted?e.formatted:e.value,r=$.create("li",{styles:{"border-top":"3px solid "+i},innerHTML:''+(0===a||a?a:"")+"\n\t\t\t\t\t"+(e.title?e.title:"")});t.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-TOOLTIP_POINTER_TRIANGLE_HEIGHT,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,n=this.container.querySelector(".svg-pointer");if(this.left<0)n.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var i="calc(50% + "+(this.left-e)+"px)";n.style.left=i,this.left=e}else n.style.left="50%"}},{key:"setValues",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=n.name,this.titleValue=n.value,this.listValues=i,this.x=t,this.y=e,this.titleValueFirst=n.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),t}(),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"},getColor=function(t){return PRESET_COLOR_MAP[t]||t},_slicedToArray=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_typeof$2="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},AXIS_TICK_LENGTH=6,LABEL_MARGIN=4,FONT_SIZE=10,BASE_LINE_COLOR="#dadada",FONT_FILL="#555b51",makeOverlay={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var n=t.cloneNode();return n.style.fill="#000000",n.style.opacity="0.4",e&&n.setAttribute("transform",e),n},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var n=t.cloneNode(),i=t.getAttribute("r"),a=t.getAttribute("fill");return n.setAttribute("r",parseInt(i)+DOT_OVERLAY_SIZE_INCR),n.setAttribute("fill",a),n.style.opacity="0.6",e&&n.setAttribute("transform",e),n},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var n=t.cloneNode(),i=t.getAttribute("r"),a=t.getAttribute("fill");return n.setAttribute("r",parseInt(i)+DOT_OVERLAY_SIZE_INCR),n.setAttribute("fill",a),n.style.opacity="0.6",e&&n.setAttribute("transform",e),n}},updateOverlay={bar:function(t,e){var n=void 0;"rect"!==t.nodeName&&(n=t.getAttribute("transform"),t=t.childNodes[0]);var i=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return i.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),n&&e.setAttribute("transform",n)},dot:function(t,e){var n=void 0;"circle"!==t.nodeName&&(n=t.getAttribute("transform"),t=t.childNodes[0]);var i=["cx","cy"];Object.values(t.attributes).filter(function(t){return i.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),n&&e.setAttribute("transform",n)},heat_square:function(t,e){var n=void 0;"circle"!==t.nodeName&&(n=t.getAttribute("transform"),t=t.childNodes[0]);var i=["cx","cy"];Object.values(t.attributes).filter(function(t){return i.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),n&&e.setAttribute("transform",n)}},_slicedToArray$2=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),UNIT_ANIM_DUR=350,PATH_ANIM_DUR=350,MARKER_LINE_ANIM_DUR=UNIT_ANIM_DUR,REPLACE_ALL_NEW_DUR=250,STD_EASING="easein",_slicedToArray$1=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),EASING={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"},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}",_createClass$2=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];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=getElementContentWidth(this.parent),this.width=this.baseWidth-getExtraWidth(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=makeSVGContainer(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=makeSVGDefs(this.svg),this.title.length&&(this.titleEL=makeText("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=getTopOffset(t);this.drawArea=makeSVGGroup(this.type+"-chart chart-draw-area","translate("+getLeftOffset(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=makeSVGGroup("chart-legend","translate("+getLeftOffset(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(getLeftOffset(t),getTopOffset(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()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var i=[];e.forEach(function(t){i=i.concat(t.update(n))}),i.length>0?(runSMILAnimation(this.container,this.svg,i),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},CHART_POST_ANIMATE_TIMEOUT)):(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){isElementInViewport(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=prepareForExport(this.svg);downloadFile(this.title||"Chart",[t])}}]),t}(),_createClass$1=function(){function t(t,e){for(var n=0;n=0}),a=i;if(i.length>n){i.sort(function(t,e){return e[0]-t[0]}),a=i.slice(0,n-1);var r=0;i.slice(n-1).map(function(t){r+=t[0]}),a.push([r,"Rest"]),this.colors[n-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(t[0]),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var n=0,i=0;this.legendTotals.map(function(a,r){var o=Math.floor((t.width-getExtraWidth(t.measures))/110);n>o&&(n=0,i+=20);var s=legendDot(110*n+5,i,5,t.colors[r],e.labels[r]+": "+a);t.legendArea.appendChild(s),n++})}}]),e}(BaseChart),NO_OF_YEAR_MONTHS=12,NO_OF_DAYS_IN_WEEK=7,NO_OF_MILLIS=1e3,SEC_IN_DAY=86400,MONTH_NAMES=["January","February","March","April","May","June","July","August","September","October","November","December"],DAY_NAMES_SHORT=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],_slicedToArray$3=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_createClass$4=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),componentConfigs={pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,n){var i=makePath(e,"pie-path","none",t.colors[n]);return i.style.transition="transform .3s;",i})},animateElements:function(t){return this.store.map(function(e,n){return animatePathStr(e,t.sliceStrings[n])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(n,i){return percentageBar(n,0,t.widths[i],e.constants.barHeight,e.constants.barDepth,t.colors[i])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this;return t.positions.map(function(n,i){return yLine(n,t.labels[i],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,n=t.labels,i=this.oldData.positions,a=this.oldData.labels,r=equilizeNoOfElements(i,e),o=_slicedToArray$3(r,2);i=o[0],e=o[1];var s=equilizeNoOfElements(a,n),l=_slicedToArray$3(s,2);return a=l[0],n=l[1],this.render({positions:i,labels:n}),this.store.map(function(t,n){return translateHoriLine(t,e[n],i[n])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(n,i){return xLine(n,t.calcLabels[i],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,n=t.calcLabels,i=this.oldData.positions,a=this.oldData.calcLabels,r=equilizeNoOfElements(i,e),o=_slicedToArray$3(r,2);i=o[0],e=o[1];var s=equilizeNoOfElements(a,n),l=_slicedToArray$3(s,2);return a=l[0],n=l[1],this.render({positions:i,calcLabels:n}),this.store.map(function(t,n){return translateVertLine(t,e[n],i[n])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return yMarker(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=equilizeNoOfElements(this.oldData,t),n=_slicedToArray$3(e,2);this.oldData=n[0];var i=(t=n[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.position});return this.render(o.map(function(t,e){return{position:o[e],label:a[e],options:r[e]}})),this.store.map(function(t,e){return translateHoriLine(t,i[e],o[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return yRegion(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=equilizeNoOfElements(this.oldData,t),n=_slicedToArray$3(e,2);this.oldData=n[0];var i=(t=n[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),r=t.map(function(t){return t.startPos}),o=t.map(function(t){return t.options}),s=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(s.map(function(t,e){return{startPos:l[e],endPos:s[e],label:a[e],options:o[e]}}));var u=[];return this.store.map(function(t,e){u=u.concat(animateRegion(t,r[e],i[e],s[e]))}),u}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,n=this.constants,i=n.index,a=n.colWidth,r=n.rowHeight,o=n.squareSize,s=n.xTranslate,l=0;return this.serializedSubDomains=[],t.cols.map(function(t,n){1===n&&e.labels.push(makeText("domain-name",s,-12,getMonthName(i,!0).toUpperCase(),{fontSize:9})),t.map(function(t,n){if(t.fill){var i={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":n},a=heatSquare("day",s,l,o,t.fill,i);e.serializedSubDomains.push(a)}l+=r}),l=0,s+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(n,i){return datasetBar(t.xPositions[i],n,t.barWidth,e.color,t.labels[i],i,t.offsets[i],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.offsets,a=t.labels,r=this.oldData.xPositions,o=this.oldData.yPositions,s=this.oldData.offsets,l=this.oldData.labels,u=equilizeNoOfElements(r,e),c=_slicedToArray$3(u,2);r=c[0],e=c[1];var h=equilizeNoOfElements(o,n),d=_slicedToArray$3(h,2);o=d[0],n=d[1];var f=equilizeNoOfElements(s,i),p=_slicedToArray$3(f,2);s=p[0],i=p[1];var v=equilizeNoOfElements(l,a),y=_slicedToArray$3(v,2);l=y[0],a=y[1],this.render({xPositions:r,yPositions:o,offsets:s,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var g=[];return this.store.map(function(a,r){g=g.concat(animateBar(a,e[r],n[r],t.barWidth,i[r],{zeroLine:t.zeroLine}))}),g}},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=getPaths(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(n,i){return datasetDot(t.xPositions[i],n,t.radius,e.color,e.valuesOverPoints?t.values[i]:"",i)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.values,a=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.values,s=equilizeNoOfElements(a,e),l=_slicedToArray$3(s,2);a=l[0],e=l[1];var u=equilizeNoOfElements(r,n),c=_slicedToArray$3(u,2);r=c[0],n=c[1];var h=equilizeNoOfElements(o,i),d=_slicedToArray$3(h,2);o=d[0],i=d[1],this.render({xPositions:a,yPositions:r,values:i,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var f=[];return Object.keys(this.paths).length&&(f=f.concat(animatePath(this.paths,e,n,t.zeroLine))),this.units.length&&this.units.map(function(t,i){f=f.concat(animateDot(t,e[i],n[i]))}),f}}},_createClass=function(){function t(t,e){for(var n=0;n0?t.formattedLabels[r]:t.state.labels[r])+": ",h=e.sliceTotals[r]/e.grandTotal;t.tip.setValues(l,u,{name:c,value:(100*h).toFixed(1)+"%"}),t.tip.showTip()}})}}]),e}(AggregationChart),_createClass$5=function(){function t(t,e){for(var n=0;nthis.width?this.center.x:this.center.y;var i=this.radius,a=this.clockWise,r=n.slicesProperties||[];n.sliceStrings=[],n.slicesProperties=[];var o=180-this.config.startAngle;n.sliceTotals.map(function(e,s){var l=o,u=e/n.grandTotal*FULL_ANGLE,c=a?-u:u,h=o+=c,d=getPositionByAngle(l,i),f=getPositionByAngle(h,i),p=t.init&&r[s],v=void 0,y=void 0;t.init?(v=p?p.startPosition:d,y=p?p.endPosition:d):(v=d,y=f);var g=makeArcPathStr(v,y,t.center,t.radius,t.clockWise);n.sliceStrings.push(g),n.slicesProperties.push({startPosition:d,endPosition:f,value:e,total:n.grandTotal,startAngle:l,endAngle:h,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=getComponent.apply(void 0,_toConsumableArray$2(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=getPositionByAngle(t.startAngle+t.angle/2,e);return"translate3d("+i.x*n+"px,"+i.y*n+"px,0)"}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){transform(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.fill=lightenDarkenColor(a,50);var r=getOffset(this.svg),o=i.pageX-r.left+10,s=i.pageY-r.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",u=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,s,{name:l,value:u+"%"}),this.tip.showTip()}else transform(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=a}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,n=this.components.get("pieSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var r=n.indexOf(e);this.hoverSlice(a,i,!1),this.curActiveSlice=e,this.curActiveSliceIndex=r,this.hoverSlice(e,r,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),e}(AggregationChart),_slicedToArray$4=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_createClass$6=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(n){var i=new Date(n*NO_OF_MILLIS);e[getYyyyMmDd(i)]=t.dataPoints[n]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=clone(this.data.start),t.end=clone(this.data.end),t.firstWeekStart=clone(t.start),t.noOfWeeks=getWeeksBetween(t.start,t.end),t.distribution=calcDistribution(Object.values(this.data.dataPoints),HEATMAP_DISTRIBUTION_SIZE),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,n=this.discreteDomains?0:1,i=e.domainConfigs.map(function(i,a){return["heatDomain",{index:i.index,colWidth:COL_WIDTH,rowHeight:ROW_HEIGHT,squareSize:HEATMAP_SQUARE_SIZE,xTranslate:e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",n=[t.getMonth(),t.getFullYear()],i=n[0],a=n[1],r=setDayToSunday(t),o={index:i,cols:[]};addDays(e=clone(e)||getLastDateInMonth(i,a),1);for(var s=getWeeksBetween(r,e),l=[],u=void 0,c=0;c2&&void 0!==arguments[2]&&arguments[2],i=this.state,a=clone(t),r=[],o=0;o=i.start&&a<=i.end;n||a.getMonth()!==e||!l?s.yyyyMmDd=getYyyyMmDd(a):s=this.getSubDomainConfig(a),r.push(s)}return r}},{key:"getSubDomainConfig",value:function(t){var e=getYyyyMmDd(t),n=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:n||0,fill:this.colors[getMaxCheckpoint(n,this.state.distribution)]}}}]),e}(BaseChart),_createClass$7=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return zeroDataPrep(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,n){return floatTwo(t.xOffset+n*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=calcChartIntervals(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false"),n=this.height/getValueRange(e),i=getIntervalSize(e)*n,a=this.height-getZeroIndex(e)*i;this.state.yAxis={labels:e,positions:e.map(function(t){return a-t*n}),scaleMultiplier:n,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 scale(e,t.yAxis)})};t.datasets=this.data.datasets.map(function(t,n){var i=t.values,a=t.cumulativeYs||[];return{name:t.name,index:n,chartType:t.chartType,values:i,yPositions:e(i),cumulativeYs:a,cumulativeYPos:e(a)}})}},{key:"calcYExtremes",value:function(){var t=this.state;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,n){egetTopOffset(n)?t.mapTooltipXPosition(a):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var n=getClosestInArray(t,e.xAxis.positions,!0),i=this.dataByIndex[n];this.tip.setValues(i.xPos+this.tip.offset.x,i.yExtreme+this.tip.offset.y,{name:i.formattedLabel,value:""},i.values,n),this.tip.showTip()}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,n){var i=AXIS_LEGEND_BAR_SIZE,a=legendBar(i*n,"0",i,t.colors[n],e.name);t.legendArea.appendChild(a)}))}},{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 n=e.units[t.state.currentIndex];e.overlay=makeOverlay[e.type](n),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var n=e.getAttribute("data-point-index");t.setCurrentDataPoint(n)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var n=e.units[t.state.currentIndex];updateOverlay[e.type](n,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;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,fire(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;_get$3(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"addDataPoint",this).call(this,t,n,i),this.data.labels.splice(i,0,t),this.data.datasets.map(function(t,e){t.values.splice(i,0,n[e])}),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||(_get$3(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,n){t[n]&&(e.values=t[n])}),this.update(this.data)}}]),e}(BaseChart),chartTypes={bar:AxisChart,line:AxisChart,percentage:PercentageChart,heatmap:Heatmap,pie:PieChart},Chart=function t(e,n){return _classCallCheck(this,t),getChartByType(n.type,e,n)};exports.Chart=Chart,exports.PercentageChart=PercentageChart,exports.PieChart=PieChart,exports.Heatmap=Heatmap,exports.AxisChart=AxisChart; +'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)); + } +} + +Object.defineProperty(exports, '__esModule', { value: true }); + +__$styleInject(".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:1;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 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 _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; }; + +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 === "onClick") { + element.addEventListener('click', val); + } 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) + }; +} + +function isElementInViewport(el) { + // Although straightforward: https://stackoverflow.com/a/7557433/6495043 + var rect = el.getBoundingClientRect(); + + return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ + rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ + ; +} + +function getElementContentWidth(element) { + var styles = window.getComputedStyle(element); + var padding = parseFloat(styles.paddingLeft) + parseFloat(styles.paddingRight); + + return element.clientWidth - padding; +} + + + + + +function fire(target, type, properties) { + var evt = document.createEvent("HTMLEvents"); + + evt.initEvent(type, true, true); + + for (var j in properties) { + evt[j] = properties[j]; + } + + return target.dispatchEvent(evt); +} + +// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/ + +var BASE_MEASURES = { + margins: { + top: 10, + bottom: 10, + left: 20, + right: 20 + }, + paddings: { + top: 20, + bottom: 40, + left: 30, + right: 10 + }, + + baseHeight: 240, + + titleHeight: 20, + legendHeight: 30, + + titleFontSize: 12 +}; + +function getTopOffset(m) { + return m.titleHeight + m.margins.top + m.paddings.top; +} + +function getLeftOffset(m) { + return m.margins.left + m.paddings.left; +} + +function getExtraHeight(m) { + var totalExtraHeight = m.margins.top + m.margins.bottom + m.paddings.top + m.paddings.bottom + m.titleHeight + m.legendHeight; + return totalExtraHeight; +} + +function getExtraWidth(m) { + var totalExtraWidth = m.margins.left + m.margins.right + m.paddings.left + m.paddings.right; + + return totalExtraWidth; +} + +var INIT_CHART_UPDATE_TIMEOUT = 700; +var CHART_POST_ANIMATE_TIMEOUT = 400; + +var AXIS_CHART_DEFAULT_TYPE = 'line'; + + +var AXIS_DATASET_CHART_TYPES = ['line', 'bar']; + + + +var AXIS_LEGEND_BAR_SIZE = 100; + +var BAR_CHART_SPACE_RATIO = 1; +var MIN_BAR_PERCENT_HEIGHT = 0.01; + +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 +}; + +// Universal constants +var ANGLE_RATIO = Math.PI / 180; +var FULL_ANGLE = 360; + +var _createClass$3 = 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; }; }(); + +function _classCallCheck$4(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +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$4(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$3(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; +}(); + +/** + * Returns the value of a number upto 2 decimal places. + * @param {Number} d Any number + */ +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 + }; +} + +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]; +} + +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/8027444/6495043 + return (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(string) + ); +} + +var getColor = function getColor(color) { + return PRESET_COLOR_MAP[color] || color; +}; + +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 _typeof$2 = 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 AXIS_TICK_LENGTH = 6; +var LABEL_MARGIN = 4; +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$2(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'; + + return createSVG('path', { + className: className, + d: pathStr, + styles: { + stroke: stroke, + fill: fill + } + }); +} + +function makeArcPathStr(startPosition, endPosition, center, radius) { + var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + 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 0 ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY + ' z'; +} + +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) { + var fill = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'none'; + var data = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + + var args = { + className: className, + x: x, + y: y, + width: size, + height: size, + 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 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 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 = ''; + var className = 'line-horizontal ' + options.className + (options.lineType === "dashed" ? "dashed" : ""); + + var l = createSVG('line', { + className: className, + x1: x1, + x2: x2, + y1: 0, + y2: 0, + styles: { + stroke: options.stroke + } + }); + + var text = createSVG('text', { + x: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN, + y: 0, + dy: FONT_SIZE / 2 - 2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': x1 < x2 ? 'end' : 'start', + innerHTML: label + "" + }); + + var line = createSVG('g', { + transform: 'translate(0, ' + y + ')', + 'stroke-opacity': 1 + }); + + if (text === 0 || text === '0') { + line.style.stroke = "rgba(27, 31, 35, 0.6)"; + } + + line.appendChild(l); + line.appendChild(text); + + return line; +} + +function yLine(y, label, width) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + if (!options.pos) options.pos = 'left'; + if (!options.offset) options.offset = 0; + if (!options.mode) options.mode = 'span'; + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + if (!options.className) options.className = ''; + + var x1 = -1 * AXIS_TICK_LENGTH; + var x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; + + if (options.mode === 'tick' && options.pos === 'right') { + x1 = width + AXIS_TICK_LENGTH; + x2 = width; + } + + // let offset = options.pos === 'left' ? -1 * options.offset : options.offset; + + x1 += options.offset; + x2 += options.offset; + + return makeHoriLine(y, label, x1, x2, { + stroke: options.stroke, + className: options.className, + lineType: options.lineType + }); +} + +function xLine(x, label, height) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + 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; + } + + 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"); + 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 _slicedToArray$2 = 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 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$2(_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) { + var pathComponents = []; + + var pointsStr = newYList.map(function (y, i) { + return newXList[i] + ',' + y; + }); + var pathStr = pointsStr.join("L"); + + var animPath = [paths.path, { d: "M" + pathStr }, 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 + pathStr + regEndPt }, PATH_ANIM_DUR, STD_EASING]; + pathComponents.push(animRegion); + } + + return pathComponents; +} + +function animatePathStr(oldPath, pathStr) { + return [oldPath, { d: pathStr }, UNIT_ANIM_DUR, STD_EASING]; +} + +var _slicedToArray$1 = 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"); } }; }(); + +function _toConsumableArray$1(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); } } + +// 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$1(element)); + + var _animateSVGElement2 = _slicedToArray$1(_animateSVGElement, 2); + + animElement = _animateSVGElement2[0]; + newElement = _animateSVGElement2[1]; + + + newElements.push(newElement); + animElements.push([animElement, parent]); + + parent.replaceChild(animElement, unit); + }); + + var animSvg = svgContainer.cloneNode(true); + + animElements.map(function (animElement, i) { + animElement[1].replaceChild(newElements[i], animElement[0]); + elements[i][0] = newElements[i]; + }); + + return animSvg; +} + +function runSMILAnimation(parent, svgElement, elementsToAnimate) { + if (elementsToAnimate.length === 0) return; + + var animSvgElement = animateSVG(svgElement, elementsToAnimate); + if (svgElement.parentNode == parent) { + parent.removeChild(svgElement); + parent.appendChild(animSvgElement); + } + + // Replace the new svgElement (data has already been replaced) + setTimeout(function () { + if (animSvgElement.parentNode == parent) { + parent.removeChild(animSvgElement); + parent.appendChild(svgElement); + } + }, REPLACE_ALL_NEW_DUR); +} + +var CSSTEXT = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;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 _createClass$2 = 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; }; }(); + +function _classCallCheck$3(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var BOUND_DRAW_FN = void 0; + +var BaseChart = function () { + function BaseChart(parent, options) { + _classCallCheck$3(this, BaseChart); + + this.parent = typeof parent === 'string' ? document.querySelector(parent) : parent; + + if (!(this.parent instanceof HTMLElement)) { + throw new Error('No `parent` element to render on was provided.'); + } + + this.rawChartArgs = options; + + this.title = options.title || ''; + this.type = options.type || 'line'; + + 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: 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$2(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 height = this.argHeight; + this.baseHeight = height; + this.height = height - getExtraHeight(this.measures); + + // Bind window events + BOUND_DRAW_FN = this.boundDrawFn.bind(this); + window.addEventListener('resize', BOUND_DRAW_FN); + window.addEventListener('orientationchange', this.boundDrawFn.bind(this)); + } + }, { + key: 'boundDrawFn', + value: function boundDrawFn() { + this.draw(true); + } + }, { + key: 'unbindWindowEvents', + value: function unbindWindowEvents() { + window.removeEventListener('resize', BOUND_DRAW_FN); + window.removeEventListener('orientationchange', this.boundDrawFn.bind(this)); + } + + // 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.parent.style.overflow = 'auto'; + } + + 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 _this = this; + + var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + this.updateWidth(); + + this.calc(onlyWidthChange); + this.makeChartArea(); + this.setupComponents(); + + this.components.forEach(function (c) { + return c.setup(_this.drawArea); + }); + // this.components.forEach(c => c.make()); + this.render(this.components, false); + + if (init) { + this.data = this.realData; + setTimeout(function () { + _this.update(_this.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(); + } + }, { + key: 'render', + value: function render() { + var _this2 = 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(); + }); + _this2.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 _this3 = 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(_this3.container)) { + e = e || window.event; + if (_this3.keyActions[e.keyCode]) { + _this3.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 _createClass$1 = 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$1 = function get$$1(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$$1(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); } }; + +function _classCallCheck$2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn$1(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; } + +function _inherits$1(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 AggregationChart = function (_BaseChart) { + _inherits$1(AggregationChart, _BaseChart); + + function AggregationChart(parent, args) { + _classCallCheck$2(this, AggregationChart); + + return _possibleConstructorReturn$1(this, (AggregationChart.__proto__ || Object.getPrototypeOf(AggregationChart)).call(this, parent, args)); + } + + _createClass$1(AggregationChart, [{ + key: 'configure', + value: function configure(args) { + _get$1(AggregationChart.prototype.__proto__ || Object.getPrototypeOf(AggregationChart.prototype), 'configure', this).call(this, args); + + this.config.maxSlices = args.maxSlices || 20; + this.config.maxLegendPoints = args.maxLegendPoints || 20; + } + }, { + key: 'calc', + value: function calc() { + var _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(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 = 110; + var divisor = Math.floor((_this3.width - getExtraWidth(_this3.measures)) / barWidth); + if (count > divisor) { + count = 0; + y += 20; + } + var x = barWidth * count + 5; + var dot = legendDot(x, y, 5, _this3.colors[i], s.labels[i] + ': ' + d); + _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 _slicedToArray$3 = 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 _createClass$4 = 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; }; }(); + +function _classCallCheck$5(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +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$5(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$4(ChartComponent, [{ + key: 'refresh', + value: function refresh(data) { + this.data = data || this.getData(); + } + }, { + key: 'setup', + value: function setup(parent) { + this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent); + } + }, { + key: 'make', + value: function make() { + this.render(this.data); + this.oldData = this.data; + } + }, { + key: 'render', + value: function render(data) { + var _this = this; + + this.store = this.makeElements(data); + + this.layer.textContent = ''; + this.store.forEach(function (element) { + _this.layer.appendChild(element); + }); + this.labels.forEach(function (element) { + _this.layer.appendChild(element); + }); + } + }, { + key: 'update', + value: function update() { + var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.refresh(); + var animateElements = []; + if (animate) { + animateElements = this.animateElements(this.data) || []; + } + return animateElements; + } + }]); + + return ChartComponent; +}(); + +var componentConfigs = { + pieSlices: { + layerClass: 'pie-slices', + makeElements: function makeElements(data) { + return data.sliceStrings.map(function (s, i) { + var slice = makePath(s, 'pie-path', 'none', data.colors[i]); + slice.style.transition = 'transform .3s;'; + return slice; + }); + }, + animateElements: function animateElements(newData) { + return this.store.map(function (slice, i) { + return animatePathStr(slice, newData.sliceStrings[i]); + }); + } + }, + percentageBars: { + layerClass: 'percentage-bars', + makeElements: function makeElements(data) { + var _this2 = this; + + return data.xPositions.map(function (x, i) { + var y = 0; + var bar = percentageBar(x, y, data.widths[i], _this2.constants.barHeight, _this2.constants.barDepth, data.colors[i]); + return bar; + }); + }, + animateElements: function animateElements(newData) { + if (newData) return []; + } + }, + yAxis: { + layerClass: 'y axis', + makeElements: function makeElements(data) { + var _this3 = this; + + return data.positions.map(function (position, i) { + return yLine(position, data.labels[i], _this3.constants.width, { mode: _this3.constants.mode, pos: _this3.constants.pos }); + }); + }, + animateElements: function animateElements(newData) { + var newPos = newData.positions; + var newLabels = newData.labels; + var oldPos = this.oldData.positions; + var oldLabels = this.oldData.labels; + + var _equilizeNoOfElements = equilizeNoOfElements(oldPos, newPos); + + var _equilizeNoOfElements2 = _slicedToArray$3(_equilizeNoOfElements, 2); + + oldPos = _equilizeNoOfElements2[0]; + newPos = _equilizeNoOfElements2[1]; + + var _equilizeNoOfElements3 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements4 = _slicedToArray$3(_equilizeNoOfElements3, 2); + + oldLabels = _equilizeNoOfElements4[0]; + newLabels = _equilizeNoOfElements4[1]; + + + this.render({ + positions: oldPos, + labels: newLabels + }); + + return this.store.map(function (line, i) { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + } + }, + + xAxis: { + layerClass: 'x axis', + makeElements: function makeElements(data) { + var _this4 = this; + + return data.positions.map(function (position, i) { + return xLine(position, data.calcLabels[i], _this4.constants.height, { mode: _this4.constants.mode, pos: _this4.constants.pos }); + }); + }, + animateElements: function animateElements(newData) { + var newPos = newData.positions; + var newLabels = newData.calcLabels; + var oldPos = this.oldData.positions; + var oldLabels = this.oldData.calcLabels; + + var _equilizeNoOfElements5 = equilizeNoOfElements(oldPos, newPos); + + var _equilizeNoOfElements6 = _slicedToArray$3(_equilizeNoOfElements5, 2); + + oldPos = _equilizeNoOfElements6[0]; + newPos = _equilizeNoOfElements6[1]; + + var _equilizeNoOfElements7 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements8 = _slicedToArray$3(_equilizeNoOfElements7, 2); + + oldLabels = _equilizeNoOfElements8[0]; + newLabels = _equilizeNoOfElements8[1]; + + + this.render({ + positions: oldPos, + calcLabels: newLabels + }); + + return this.store.map(function (line, i) { + return translateVertLine(line, newPos[i], oldPos[i]); + }); + } + }, + + yMarkers: { + layerClass: 'y-markers', + makeElements: function makeElements(data) { + var _this5 = this; + + return data.map(function (m) { + return yMarker(m.position, m.label, _this5.constants.width, { labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed' }); + }); + }, + animateElements: function animateElements(newData) { + var _equilizeNoOfElements9 = equilizeNoOfElements(this.oldData, newData); + + var _equilizeNoOfElements10 = _slicedToArray$3(_equilizeNoOfElements9, 2); + + this.oldData = _equilizeNoOfElements10[0]; + newData = _equilizeNoOfElements10[1]; + + + var newPos = newData.map(function (d) { + return d.position; + }); + var newLabels = newData.map(function (d) { + return d.label; + }); + var newOptions = newData.map(function (d) { + return d.options; + }); + + var oldPos = this.oldData.map(function (d) { + return d.position; + }); + + this.render(oldPos.map(function (pos, i) { + return { + position: oldPos[i], + label: newLabels[i], + options: newOptions[i] + }; + })); + + return this.store.map(function (line, i) { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + } + }, + + yRegions: { + layerClass: 'y-regions', + makeElements: function makeElements(data) { + var _this6 = this; + + return data.map(function (r) { + return yRegion(r.startPos, r.endPos, _this6.constants.width, r.label, { labelPos: r.options.labelPos }); + }); + }, + animateElements: function animateElements(newData) { + var _equilizeNoOfElements11 = equilizeNoOfElements(this.oldData, newData); + + var _equilizeNoOfElements12 = _slicedToArray$3(_equilizeNoOfElements11, 2); + + this.oldData = _equilizeNoOfElements12[0]; + newData = _equilizeNoOfElements12[1]; + + + var newPos = newData.map(function (d) { + return d.endPos; + }); + var newLabels = newData.map(function (d) { + return d.label; + }); + var newStarts = newData.map(function (d) { + return d.startPos; + }); + var newOptions = newData.map(function (d) { + return d.options; + }); + + var oldPos = this.oldData.map(function (d) { + return d.endPos; + }); + var oldStarts = this.oldData.map(function (d) { + return d.startPos; + }); + + this.render(oldPos.map(function (pos, i) { + return { + startPos: oldStarts[i], + endPos: oldPos[i], + label: newLabels[i], + options: newOptions[i] + }; + })); + + var animateElements = []; + + this.store.map(function (rectGroup, i) { + animateElements = animateElements.concat(animateRegion(rectGroup, newStarts[i], newPos[i], oldPos[i])); + }); + + return animateElements; + } + }, + + heatDomain: { + layerClass: function layerClass() { + return 'heat-domain domain-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var _this7 = this; + + var _constants = this.constants, + index = _constants.index, + colWidth = _constants.colWidth, + rowHeight = _constants.rowHeight, + squareSize = _constants.squareSize, + xTranslate = _constants.xTranslate; + + var monthNameHeight = -12; + var x = xTranslate, + y = 0; + + this.serializedSubDomains = []; + + data.cols.map(function (week, weekNo) { + if (weekNo === 1) { + _this7.labels.push(makeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(), { + fontSize: 9 + })); + } + week.map(function (day, i) { + if (day.fill) { + var _data = { + 'data-date': day.yyyyMmDd, + 'data-value': day.dataValue, + 'data-day': i + }; + var square = heatSquare('day', x, y, squareSize, day.fill, _data); + _this7.serializedSubDomains.push(square); + } + y += rowHeight; + }); + y = 0; + x += colWidth; + }); + + return this.serializedSubDomains; + }, + animateElements: function animateElements(newData) { + if (newData) return []; + } + }, + + barGraph: { + layerClass: function layerClass() { + return 'dataset-units dataset-bars dataset-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var c = this.constants; + this.unitType = 'bar'; + this.units = data.yPositions.map(function (y, j) { + return datasetBar(data.xPositions[j], y, data.barWidth, c.color, data.labels[j], j, data.offsets[j], { + zeroLine: data.zeroLine, + barsWidth: data.barsWidth, + minHeight: c.minHeight + }); + }); + return this.units; + }, + animateElements: function animateElements(newData) { + var newXPos = newData.xPositions; + var newYPos = newData.yPositions; + var newOffsets = newData.offsets; + var newLabels = newData.labels; + + var oldXPos = this.oldData.xPositions; + var oldYPos = this.oldData.yPositions; + var oldOffsets = this.oldData.offsets; + var oldLabels = this.oldData.labels; + + var _equilizeNoOfElements13 = equilizeNoOfElements(oldXPos, newXPos); + + var _equilizeNoOfElements14 = _slicedToArray$3(_equilizeNoOfElements13, 2); + + oldXPos = _equilizeNoOfElements14[0]; + newXPos = _equilizeNoOfElements14[1]; + + var _equilizeNoOfElements15 = equilizeNoOfElements(oldYPos, newYPos); + + var _equilizeNoOfElements16 = _slicedToArray$3(_equilizeNoOfElements15, 2); + + oldYPos = _equilizeNoOfElements16[0]; + newYPos = _equilizeNoOfElements16[1]; + + var _equilizeNoOfElements17 = equilizeNoOfElements(oldOffsets, newOffsets); + + var _equilizeNoOfElements18 = _slicedToArray$3(_equilizeNoOfElements17, 2); + + oldOffsets = _equilizeNoOfElements18[0]; + newOffsets = _equilizeNoOfElements18[1]; + + var _equilizeNoOfElements19 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements20 = _slicedToArray$3(_equilizeNoOfElements19, 2); + + oldLabels = _equilizeNoOfElements20[0]; + newLabels = _equilizeNoOfElements20[1]; + + + this.render({ + xPositions: oldXPos, + yPositions: oldYPos, + offsets: oldOffsets, + labels: newLabels, + + zeroLine: this.oldData.zeroLine, + barsWidth: this.oldData.barsWidth, + barWidth: this.oldData.barWidth + }); + + var animateElements = []; + + this.store.map(function (bar, i) { + animateElements = animateElements.concat(animateBar(bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], { zeroLine: newData.zeroLine })); + }); + + return animateElements; + } + }, + + lineGraph: { + layerClass: function layerClass() { + return 'dataset-units dataset-line dataset-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var c = this.constants; + this.unitType = 'dot'; + this.paths = {}; + if (!c.hideLine) { + this.paths = getPaths(data.xPositions, data.yPositions, c.color, { + heatline: c.heatline, + regionFill: c.regionFill + }, { + svgDefs: c.svgDefs, + zeroLine: data.zeroLine + }); + } + + this.units = []; + if (!c.hideDots) { + this.units = data.yPositions.map(function (y, j) { + return datasetDot(data.xPositions[j], y, data.radius, c.color, c.valuesOverPoints ? data.values[j] : '', j); + }); + } + + return Object.values(this.paths).concat(this.units); + }, + animateElements: function animateElements(newData) { + var newXPos = newData.xPositions; + var newYPos = newData.yPositions; + var newValues = newData.values; + + var oldXPos = this.oldData.xPositions; + var oldYPos = this.oldData.yPositions; + var oldValues = this.oldData.values; + + var _equilizeNoOfElements21 = equilizeNoOfElements(oldXPos, newXPos); + + var _equilizeNoOfElements22 = _slicedToArray$3(_equilizeNoOfElements21, 2); + + oldXPos = _equilizeNoOfElements22[0]; + newXPos = _equilizeNoOfElements22[1]; + + var _equilizeNoOfElements23 = equilizeNoOfElements(oldYPos, newYPos); + + var _equilizeNoOfElements24 = _slicedToArray$3(_equilizeNoOfElements23, 2); + + oldYPos = _equilizeNoOfElements24[0]; + newYPos = _equilizeNoOfElements24[1]; + + var _equilizeNoOfElements25 = equilizeNoOfElements(oldValues, newValues); + + var _equilizeNoOfElements26 = _slicedToArray$3(_equilizeNoOfElements25, 2); + + oldValues = _equilizeNoOfElements26[0]; + newValues = _equilizeNoOfElements26[1]; + + + this.render({ + xPositions: oldXPos, + yPositions: oldYPos, + values: newValues, + + zeroLine: this.oldData.zeroLine, + radius: this.oldData.radius + }); + + var animateElements = []; + + if (Object.keys(this.paths).length) { + animateElements = animateElements.concat(animatePath(this.paths, newXPos, newYPos, newData.zeroLine)); + } + + 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 _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$$1(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$$1(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); } }; + +function _toConsumableArray(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 _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(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; } + +function _inherits(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 PercentageChart = function (_AggregationChart) { + _inherits(PercentageChart, _AggregationChart); + + function PercentageChart(parent, args) { + _classCallCheck$1(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 = 80; + 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 _createClass$5 = 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$2 = function get$$1(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$$1(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); } }; + +function _toConsumableArray$2(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 _classCallCheck$6(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn$2(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; } + +function _inherits$2(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 PieChart = function (_AggregationChart) { + _inherits$2(PieChart, _AggregationChart); + + function PieChart(parent, args) { + _classCallCheck$6(this, PieChart); + + var _this = _possibleConstructorReturn$2(this, (PieChart.__proto__ || Object.getPrototypeOf(PieChart)).call(this, parent, args)); + + _this.type = 'pie'; + _this.initTimeout = 0; + _this.init = 1; + + _this.setup(); + return _this; + } + + _createClass$5(PieChart, [{ + key: 'configure', + value: function configure(args) { + _get$2(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$2(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 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 = makeArcPathStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise); + + 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$2(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); + +var _slicedToArray$4 = 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"); } }; }(); + +function _toConsumableArray$4(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 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$4(_normalize, 2), + normalMaxValue = _normalize2[0], + exponent = _normalize2[1]; + + var normalMinValue = minValue ? minValue / Math.pow(10, exponent) : 0; + + // Allow only 7 significant digits + normalMaxValue = normalMaxValue.toFixed(6); + + var intervals = getChartRangeIntervals(normalMaxValue, normalMinValue); + intervals = intervals.map(function (value) { + return value * Math.pow(10, exponent); + }); + return intervals; +} + +function calcChartIntervals(values) { + var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + //*** Where the magic happens *** + + // Calculates best-fit y intervals from given values + // and returns the interval array + + var maxValue = Math.max.apply(Math, _toConsumableArray$4(values)); + var minValue = Math.min.apply(Math, _toConsumableArray$4(values)); + + // Exponent to be used for pretty print + var exponent = 0, + intervals = []; // eslint-disable-line no-unused-vars + + function getPositiveFirstIntervals(maxValue, absMinValue) { + var intervals = getChartIntervals(maxValue); + + var intervalSize = intervals[1] - intervals[0]; + + // Then unshift the negative values + var value = 0; + for (var i = 1; value < absMinValue; i++) { + value += intervalSize; + intervals.unshift(-1 * value); + } + return intervals; + } + + // CASE I: Both non-negative + + if (maxValue >= 0 && minValue >= 0) { + exponent = normalize(maxValue)[1]; + if (!withMinimum) { + intervals = getChartIntervals(maxValue); + } else { + intervals = getChartIntervals(maxValue, minValue); + } + } + + // CASE II: Only minValue negative + + else if (maxValue > 0 && minValue < 0) { + // `withMinimum` irrelevant in this case, + // We'll be handling both sides of zero separately + // (both starting from zero) + // Because ceil() and floor() behave differently + // in those two regions + + var absMinValue = Math.abs(minValue); + + if (maxValue >= absMinValue) { + exponent = normalize(maxValue)[1]; + intervals = getPositiveFirstIntervals(maxValue, absMinValue); + } else { + // Mirror: maxValue => absMinValue, then change sign + exponent = normalize(absMinValue)[1]; + var posIntervals = getPositiveFirstIntervals(absMinValue, maxValue); + intervals = posIntervals.map(function (d) { + return d * -1; + }); + } + } + + // CASE III: Both non-positive + + else if (maxValue <= 0 && minValue <= 0) { + // Mirrored Case I: + // Work with positives, then reverse the sign and array + + var pseudoMaxValue = Math.abs(minValue); + var pseudoMinValue = Math.abs(maxValue); + + exponent = normalize(pseudoMaxValue)[1]; + if (!withMinimum) { + intervals = getChartIntervals(pseudoMaxValue); + } else { + intervals = getChartIntervals(pseudoMaxValue, pseudoMinValue); + } + + intervals = intervals.reverse().map(function (d) { + return d * -1; + }); + } + + return intervals; +} + +function getZeroIndex(yPts) { + var zeroIndex = 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$4(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 _createClass$6 = 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; }; }(); + +function _toConsumableArray$3(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 _classCallCheck$7(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn$3(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; } + +function _inherits$3(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 COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE; +var ROW_HEIGHT = COL_WIDTH; +// const DAY_INCR = 1; + +var Heatmap = function (_BaseChart) { + _inherits$3(Heatmap, _BaseChart); + + function Heatmap(parent, options) { + _classCallCheck$7(this, Heatmap); + + var _this = _possibleConstructorReturn$3(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$6(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, + 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$3(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 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, 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 + }]; + } + + var overridingType = void 0; + if (AXIS_DATASET_CHART_TYPES.includes(type)) { + overridingType = type; + } + + datasets.map(function (d) { + // Set values + if (!d.values) { + d.values = zeroArray; + } else { + // Check for non values + var vals = d.values; + vals = vals.map(function (val) { + return !isNaN(val) ? val : 0; + }); + + // Trim or extend + if (vals.length > datasetLength) { + vals = vals.slice(0, datasetLength); + } else { + vals = fillArray(vals, datasetLength - vals.length, 0); + } + } + + // Set labels + + // Set type + if (overridingType) { + d.chartType = overridingType; + } else if (!d.chartType) { + d.chartType = AXIS_CHART_DEFAULT_TYPE; + } + }); + + // Markers + + // Regions + // data.yRegions = data.yRegions || []; + if (data.yRegions) { + data.yRegions.map(function (d) { + if (d.end < d.start) { + var _ref = [d.end, d.start]; + d.start = _ref[0]; + d.end = _ref[1]; + } + }); + } + + return data; +} + +function zeroDataPrep(realData) { + var datasetLength = realData.labels.length; + var zeroArray = new Array(datasetLength).fill(0); + + var zeroData = { + labels: realData.labels.slice(0, -1), + datasets: realData.datasets.map(function (d) { + return { + name: '', + values: zeroArray.slice(0, -1), + chartType: d.chartType + }; + }) + }; + + if (realData.yMarkers) { + zeroData.yMarkers = [{ + value: 0, + label: '' + }]; + } + + if (realData.yRegions) { + zeroData.yRegions = [{ + start: 0, + end: 0, + label: '' + }]; + } + + return zeroData; +} + +function getShortenedLabels(chartWidth) { + var labels = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var isSeries = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + var allowedSpace = chartWidth / labels.length; + if (allowedSpace <= 0) allowedSpace = 1; + var allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH; + + var 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 { + var multiple = Math.ceil(label.length / allowedLetters); + if (i % multiple !== 0) { + label = ""; + } + } + } + return label; + }); + + return calcLabels; +} + +var _createClass$7 = 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$3 = function get$$1(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$$1(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); } }; + +function _toConsumableArray$5(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 _classCallCheck$8(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn$4(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; } + +function _inherits$4(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 AxisChart = function (_BaseChart) { + _inherits$4(AxisChart, _BaseChart); + + function AxisChart(parent, args) { + _classCallCheck$8(this, AxisChart); + + var _this = _possibleConstructorReturn$4(this, (AxisChart.__proto__ || Object.getPrototypeOf(AxisChart)).call(this, parent, args)); + + _this.barOptions = args.barOptions || {}; + _this.lineOptions = args.lineOptions || {}; + + _this.init = 1; + + _this.setup(); + return _this; + } + + _createClass$7(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$3(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'configure', this).call(this, options); + + options.axisOptions = options.axisOptions || {}; + options.tooltipOptions = options.tooltipOptions || {}; + + this.config.xAxisMode = options.axisOptions.xAxisMode || 'span'; + this.config.yAxisMode = options.axisOptions.yAxisMode || 'span'; + this.config.xIsSeries = options.axisOptions.xIsSeries || 0; + + this.config.formatTooltipX = options.tooltipOptions.formatTooltipX; + this.config.formatTooltipY = options.tooltipOptions.formatTooltipY; + + this.config.valuesOverPoints = options.valuesOverPoints; + } + }, { + key: 'prepareData', + value: function prepareData() { + var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; + + return dataPrep(data, this.type); + } + }, { + key: 'prepareFirstData', + value: function prepareFirstData() { + var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; + + return zeroDataPrep(data); + } + }, { + key: 'calc', + value: function calc() { + var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + this.calcXPositions(); + if (!onlyWidthChange) { + this.calcYAxisParameters(this.getAllYValues(), this.type === 'line'); + } + this.makeDataByIndex(); + } + }, { + key: 'calcXPositions', + value: function calcXPositions() { + var s = this.state; + var labels = this.data.labels; + s.datasetLength = labels.length; + + s.unitWidth = this.width / s.datasetLength; + // Default, as per bar, and mixed. Only line will be a special case + s.xOffset = s.unitWidth / 2; + + // // For a pure Line Chart + // s.unitWidth = this.width/(s.datasetLength - 1); + // s.xOffset = 0; + + s.xAxis = { + labels: labels, + positions: labels.map(function (d, i) { + return floatTwo(s.xOffset + i * s.unitWidth); + }) + }; + } + }, { + key: 'calcYAxisParameters', + value: function calcYAxisParameters(dataValues) { + var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'false'; + + var yPts = calcChartIntervals(dataValues, withMinimum); + var scaleMultiplier = this.height / getValueRange(yPts); + var intervalHeight = getIntervalSize(yPts) * scaleMultiplier; + var zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; + + this.state.yAxis = { + labels: yPts, + positions: yPts.map(function (d) { + return zeroLine - d * scaleMultiplier; + }), + scaleMultiplier: scaleMultiplier, + zeroLine: zeroLine + }; + + // Dependent if above changes + this.calcDatasetPoints(); + this.calcYExtremes(); + this.calcYRegions(); + } + }, { + key: 'calcDatasetPoints', + value: function calcDatasetPoints() { + var s = this.state; + var scaleAll = function scaleAll(values) { + return values.map(function (val) { + return scale(val, s.yAxis); + }); + }; + + s.datasets = this.data.datasets.map(function (d, i) { + var values = d.values; + var cumulativeYs = d.cumulativeYs || []; + return { + name: d.name, + index: i, + chartType: d.chartType, + + values: values, + yPositions: scaleAll(values), + + cumulativeYs: cumulativeYs, + cumulativeYPos: scaleAll(cumulativeYs) + }; + }); + } + }, { + key: 'calcYExtremes', + value: function calcYExtremes() { + var s = this.state; + if (this.barOptions.stacked) { + s.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos; + return; + } + s.yExtremes = new Array(s.datasetLength).fill(9999); + s.datasets.map(function (d) { + d.yPositions.map(function (pos, j) { + if (pos < s.yExtremes[j]) { + s.yExtremes[j] = pos; + } + }); + }); + } + }, { + key: 'calcYRegions', + value: function calcYRegions() { + var s = this.state; + if (this.data.yMarkers) { + this.state.yMarkers = this.data.yMarkers.map(function (d) { + d.position = scale(d.value, s.yAxis); + if (!d.options) d.options = {}; + // if(!d.label.includes(':')) { + // d.label += ': ' + d.value; + // } + return d; + }); + } + if (this.data.yRegions) { + this.state.yRegions = this.data.yRegions.map(function (d) { + d.startPos = scale(d.start, s.yAxis); + d.endPos = scale(d.end, s.yAxis); + if (!d.options) d.options = {}; + return d; + }); + } + } + }, { + key: 'getAllYValues', + value: function getAllYValues() { + var _this2 = this, + _ref; + + var key = 'values'; + + if (this.barOptions.stacked) { + key = 'cumulativeYs'; + var cumulative = new Array(this.state.datasetLength).fill(0); + this.data.datasets.map(function (d, i) { + var values = _this2.data.datasets[i].values; + d[key] = cumulative = cumulative.map(function (c, i) { + return c + values[i]; + }); + }); + } + + var allValueLists = this.data.datasets.map(function (d) { + return d[key]; + }); + if (this.data.yMarkers) { + allValueLists.push(this.data.yMarkers.map(function (d) { + return d.value; + })); + } + if (this.data.yRegions) { + this.data.yRegions.map(function (d) { + allValueLists.push([d.end, d.start]); + }); + } + + return (_ref = []).concat.apply(_ref, _toConsumableArray$5(allValueLists)); + } + }, { + key: 'setupComponents', + value: function setupComponents() { + var _this3 = this; + + var componentConfigs = [['yAxis', { + mode: this.config.yAxisMode, + width: this.width + // pos: 'right' + }, function () { + return this.state.yAxis; + }.bind(this)], ['xAxis', { + mode: this.config.xAxisMode, + height: this.height + // pos: 'right' + }, function () { + var s = this.state; + s.xAxis.calcLabels = getShortenedLabels(this.width, s.xAxis.labels, this.config.xIsSeries); + + return s.xAxis; + }.bind(this)], ['yRegions', { + width: this.width, + pos: 'right' + }, function () { + return this.state.yRegions; + }.bind(this)]]; + + var barDatasets = this.state.datasets.filter(function (d) { + return d.chartType === 'bar'; + }); + var lineDatasets = this.state.datasets.filter(function (d) { + return d.chartType === 'line'; + }); + + var barsConfigs = barDatasets.map(function (d) { + var index = d.index; + return ['barGraph' + '-' + d.index, { + index: index, + color: _this3.colors[index], + stacked: _this3.barOptions.stacked, + + // same for all datasets + valuesOverPoints: _this3.config.valuesOverPoints, + minHeight: _this3.height * MIN_BAR_PERCENT_HEIGHT + }, function () { + var s = this.state; + var d = s.datasets[index]; + var stacked = this.barOptions.stacked; + + var spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO; + var barsWidth = s.unitWidth / 2 * (2 - spaceRatio); + var barWidth = barsWidth / (stacked ? 1 : barDatasets.length); + + var xPositions = s.xAxis.positions.map(function (x) { + return x - barsWidth / 2; + }); + if (!stacked) { + xPositions = xPositions.map(function (p) { + return p + barWidth * index; + }); + } + + var labels = new Array(s.datasetLength).fill(''); + if (this.config.valuesOverPoints) { + if (stacked && d.index === s.datasets.length - 1) { + labels = d.cumulativeYs; + } else { + labels = d.values; + } + } + + var offsets = new Array(s.datasetLength).fill(0); + if (stacked) { + offsets = d.yPositions.map(function (y, j) { + return y - d.cumulativeYPos[j]; + }); + } + + return { + xPositions: xPositions, + yPositions: d.yPositions, + offsets: offsets, + // values: d.values, + labels: labels, + + zeroLine: s.yAxis.zeroLine, + barsWidth: barsWidth, + barWidth: barWidth + }; + }.bind(_this3)]; + }); + + var lineConfigs = lineDatasets.map(function (d) { + var index = d.index; + return ['lineGraph' + '-' + d.index, { + index: index, + color: _this3.colors[index], + svgDefs: _this3.svgDefs, + heatline: _this3.lineOptions.heatline, + regionFill: _this3.lineOptions.regionFill, + hideDots: _this3.lineOptions.hideDots, + hideLine: _this3.lineOptions.hideLine, + + // same for all datasets + valuesOverPoints: _this3.config.valuesOverPoints + }, function () { + var s = this.state; + var d = s.datasets[index]; + var minLine = s.yAxis.positions[0] < s.yAxis.zeroLine ? s.yAxis.positions[0] : s.yAxis.zeroLine; + + return { + xPositions: s.xAxis.positions, + yPositions: d.yPositions, + + values: d.values, + + zeroLine: minLine, + radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE + }; + }.bind(_this3)]; + }); + + var markerConfigs = [['yMarkers', { + width: this.width, + pos: 'right' + }, function () { + return this.state.yMarkers; + }.bind(this)]]; + + componentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs); + + var optionals = ['yMarkers', 'yRegions']; + this.dataUnitComponents = []; + + this.components = new Map(componentConfigs.filter(function (args) { + return !optionals.includes(args[0]) || _this3.state[args[0]]; + }).map(function (args) { + var component = getComponent.apply(undefined, _toConsumableArray$5(args)); + if (args[0].includes('lineGraph') || args[0].includes('barGraph')) { + _this3.dataUnitComponents.push(component); + } + return [args[0], component]; + })); + } + }, { + key: 'makeDataByIndex', + value: function makeDataByIndex() { + var _this4 = this; + + this.dataByIndex = {}; + + var s = this.state; + var formatX = this.config.formatTooltipX; + var formatY = this.config.formatTooltipY; + var titles = s.xAxis.labels; + + titles.map(function (label, index) { + var values = _this4.state.datasets.map(function (set$$1, i) { + var value = set$$1.values[index]; + return { + title: set$$1.name, + value: value, + yPos: set$$1.yPositions[index], + color: _this4.colors[i], + formatted: formatY ? formatY(value) : value + }; + }); + + _this4.dataByIndex[index] = { + label: label, + formattedLabel: formatX ? formatX(label) : label, + xPos: s.xAxis.positions[index], + values: values, + yExtreme: s.yExtremes[index] + }; + }); + } + }, { + key: 'bindTooltip', + value: function bindTooltip() { + var _this5 = this; + + // NOTE: could be in tooltip itself, as it is a given functionality for its parent + this.container.addEventListener('mousemove', function (e) { + var m = _this5.measures; + var o = getOffset(_this5.container); + var relX = e.pageX - o.left - getLeftOffset(m); + var relY = e.pageY - o.top; + + if (relY < _this5.height + getTopOffset(m) && relY > getTopOffset(m)) { + _this5.mapTooltipXPosition(relX); + } else { + _this5.tip.hideTip(); + } + }); + } + }, { + key: 'mapTooltipXPosition', + value: function mapTooltipXPosition(relX) { + var s = this.state; + if (!s.yExtremes) return; + + var index = getClosestInArray(relX, s.xAxis.positions, true); + var dbi = this.dataByIndex[index]; + + this.tip.setValues(dbi.xPos + this.tip.offset.x, dbi.yExtreme + this.tip.offset.y, { name: dbi.formattedLabel, value: '' }, dbi.values, index); + + this.tip.showTip(); + } + }, { + key: 'renderLegend', + value: function renderLegend() { + var _this6 = this; + + var s = this.data; + if (s.datasets.length > 1) { + this.legendArea.textContent = ''; + s.datasets.map(function (d, i) { + var barWidth = AXIS_LEGEND_BAR_SIZE; + // let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right; + // let multiplier = s.datasets.length - i; + var rect = legendBar( + // rightEndPoint - multiplier * barWidth, // To right align + barWidth * i, '0', barWidth, _this6.colors[i], d.name); + _this6.legendArea.appendChild(rect); + }); + } + } + + // Overlay + + }, { + key: 'makeOverlay', + value: function makeOverlay$$1() { + var _this7 = this; + + if (this.init) { + this.init = 0; + return; + } + if (this.overlayGuides) { + this.overlayGuides.forEach(function (g) { + var o = g.overlay; + o.parentNode.removeChild(o); + }); + } + + this.overlayGuides = this.dataUnitComponents.map(function (c) { + return { + type: c.unitType, + overlay: undefined, + units: c.units + }; + }); + + if (this.state.currentIndex === undefined) { + this.state.currentIndex = this.state.datasetLength - 1; + } + + // Render overlays + this.overlayGuides.map(function (d) { + var currentUnit = d.units[_this7.state.currentIndex]; + + d.overlay = makeOverlay[d.type](currentUnit); + _this7.drawArea.appendChild(d.overlay); + }); + } + }, { + key: 'updateOverlayGuides', + value: function updateOverlayGuides() { + if (this.overlayGuides) { + this.overlayGuides.forEach(function (g) { + var o = g.overlay; + o.parentNode.removeChild(o); + }); + } + } + }, { + key: 'bindOverlay', + value: function bindOverlay() { + var _this8 = this; + + this.parent.addEventListener('data-select', function () { + _this8.updateOverlay(); + }); + } + }, { + key: 'bindUnits', + value: function bindUnits() { + var _this9 = this; + + this.dataUnitComponents.map(function (c) { + c.units.map(function (unit) { + unit.addEventListener('click', function () { + var index = unit.getAttribute('data-point-index'); + _this9.setCurrentDataPoint(index); + }); + }); + }); + + // Note: Doesn't work as tooltip is absolutely positioned + this.tip.container.addEventListener('click', function () { + var index = _this9.tip.container.getAttribute('data-point-index'); + _this9.setCurrentDataPoint(index); + }); + } + }, { + key: 'updateOverlay', + value: function updateOverlay$$1() { + var _this10 = this; + + this.overlayGuides.map(function (d) { + var currentUnit = d.units[_this10.state.currentIndex]; + updateOverlay[d.type](currentUnit, d.overlay); + }); + } + }, { + key: 'onLeftArrow', + value: function onLeftArrow() { + this.setCurrentDataPoint(this.state.currentIndex - 1); + } + }, { + key: 'onRightArrow', + value: function onRightArrow() { + this.setCurrentDataPoint(this.state.currentIndex + 1); + } + }, { + key: 'getDataPoint', + value: function getDataPoint() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentIndex; + + var s = this.state; + var data_point = { + index: index, + label: s.xAxis.labels[index], + values: s.datasets.map(function (d) { + return d.values[index]; + }) + }; + return data_point; + } + }, { + key: 'setCurrentDataPoint', + value: function setCurrentDataPoint(index) { + var s = this.state; + index = parseInt(index); + if (index < 0) index = 0; + if (index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1; + if (index === s.currentIndex) return; + s.currentIndex = index; + fire(this.parent, "data-select", this.getDataPoint()); + } + + // API + + }, { + key: 'addDataPoint', + value: function addDataPoint(label, datasetValues) { + var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.state.datasetLength; + + _get$3(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$3(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); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +// import MultiAxisChart from './charts/MultiAxisChart'; +var chartTypes = { + bar: AxisChart, + line: AxisChart, + // multiaxis: MultiAxisChart, + percentage: PercentageChart, + heatmap: Heatmap, + pie: PieChart +}; + +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); +}; + +exports.Chart = Chart; +exports.PercentageChart = PercentageChart; +exports.PieChart = PieChart; +exports.Heatmap = Heatmap; +exports.AxisChart = AxisChart; //# sourceMappingURL=frappe-charts.min.cjs.js.map diff --git a/dist/frappe-charts.min.cjs.js.map b/dist/frappe-charts.min.cjs.js.map index 6d53abe..44a126e 100644 --- a/dist/frappe-charts.min.cjs.js.map +++ b/dist/frappe-charts.min.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.cjs.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","../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"],"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 === \"onClick\" ) {\n\t\t\telement.addEventListener('click', val);\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\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, commonSelector, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`${commonSelector}.${activeClass}`);\n\n\tif (typeof $child === 'string') {\n\t\t$child = $parent.querySelector($child);\n\t}\n\n\tthis.forEachNode($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\nexport function insertAfter(newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\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\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 AXIS_CHART_DEFAULT_TYPE = 'line';\nexport const AXIS_CHART_MIXED_TYPE = 'axis-mixed';\nexport const AXIS_CHART_TYPES = ['line', 'bar', 'axis-mixed'];\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_CHART_OPTIONS = {\n\tbarOptions: {\n\t\tspaceRatio: 1,\n\t}\n}\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 1;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.01;\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};\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\nexport function toTitleCase(str) {\n return str.replace(/\\w*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});\n}\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","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/8027444/6495043\n\treturn /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(string);\n}\n\nexport const getColor = (color) => {\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr } from './draw-utils';\nimport { getStringWidth } 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;\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') {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 0 ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\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, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label) {\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label) {\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\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\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(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\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\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\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 } 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) {\n\tlet pathComponents = [];\n\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y));\n\tlet pathStr = pointsStr.join(\"L\");\n\n\tconst animPath = [paths.path, {d:\"M\"+pathStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pathStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } 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\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tlabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\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.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 { AXIS_CHART_DEFAULT_TYPE, AXIS_CHART_MIXED_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\tlet overridingType;\n\tif(AXIS_DATASET_CHART_TYPES.includes(type)) {\n\t\toverridingType = type;\n\t};\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t}\n\n\t\t// Set labels\n\n\t\t// Set type\n\t\tif(overridingType) {\n\t\t\td.chartType = overridingType;\n\t\t} else if(!d.chartType) {\n\t\t\td.chartType = AXIS_CHART_DEFAULT_TYPE;\n\t\t}\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 calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlet multiple = Math.ceil(label.length/allowedLetters);\n\t\t\t\tif(i % multiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","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';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","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 } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\n\nlet BOUND_DRAW_FN;\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || 'line';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tBOUND_DRAW_FN = this.boundDrawFn.bind(this);\n\t\twindow.addEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn.bind(this));\n\t}\n\n\tboundDrawFn() {\n\t\tthis.draw(true);\n\t}\n\n\tunbindWindowEvents() {\n\t\twindow.removeEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn.bind(this));\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t\tthis.parent.style.overflow = 'auto';\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { legendDot } from '../utils/draw';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(d[0]);\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 110;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${s.labels[i]}: ${d}`\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","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 = 80;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr } 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\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath = makeArcPathStr(curStart, curEnd, this.center, this.radius, this.clockWise);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","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\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","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.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth/2 * (2 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: s.yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\thideDots: this.lineOptions.hideDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tlet dbi = this.dataByIndex[index];\n\n\t\tthis.tip.setValues(\n\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\tdbi.values,\n\t\t\tindex\n\t\t);\n\n\t\tthis.tip.showTip();\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n"],"names":["$","expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isElementInViewport","el","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","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","slice","num","parseInt","b","g","toString","isValidColor","test","createSVG","tag","o","createElementNS","i","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","undefined","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","arcStartX","x","arcStartY","arcEndX","arcEndY","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","key","legendBar","label","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","l","LABEL_MARGIN","line","makeHoriLine","x1","x2","lineType","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","xList","yList","pointsStr","join","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","push","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","value","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","a","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","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","isNaN","mantissa","exponent","sig","isFinite","exp","floor","log10","pow","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","reverse","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","reduce","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","overridingType","AXIS_DATASET_CHART_TYPES","vals","chartType","AXIS_CHART_DEFAULT_TYPE","yRegions","end","zeroDataPrep","realData","zeroData","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","getChartByType","AxisChart","chartTypes","error","addEventListener","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","DOT_OVERLAY_SIZE_INCR","PERCENTAGE_BAR_DEFAULT_HEIGHT","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","HEATMAP_GUTTER_SIZE","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","HEATMAP_COLORS_GREEN","DEFAULT_COLORS","PI","FULL_ANGLE","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","title","dataPointList","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BOUND_DRAW_FN","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","bind","draw","removeEventListener","makeContainer","updateWidth","independentWidth","overflow","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","_this","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","animate","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this3","event","keyCode","chartSvg","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","divisor","NO_OF_YEAR_MONTHS","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","transition","newData","xPositions","widths","barHeight","barDepth","positions","position","newPos","newLabels","oldPos","oldLabels","calcLabels","_this4","_this5","newOptions","startPos","endPos","_this6","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","barWidth","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","COL_WIDTH","ROW_HEIGHT","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","noOfWeeks","setFullYear","dataPoints","points","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","moreText","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","xAxis","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","stacked","yExtremes","cumulativeYPos","cumulative","allValueLists","barDatasets","lineDatasets","barsConfigs","spaceRatio","p","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","Chart"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.cjs.js","sources":["../src/js/utils/dom.js","../src/js/utils/constants.js","../src/js/objects/SvgTip.js","../src/js/utils/helpers.js","../src/js/utils/draw-utils.js","../src/js/utils/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/chart.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 === \"onClick\" ) {\n\t\t\telement.addEventListener('click', val);\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\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, commonSelector, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`${commonSelector}.${activeClass}`);\n\n\tif (typeof $child === 'string') {\n\t\t$child = $parent.querySelector($child);\n\t}\n\n\tthis.forEachNode($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\nexport function insertAfter(newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\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\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 AXIS_CHART_DEFAULT_TYPE = 'line';\nexport const AXIS_CHART_MIXED_TYPE = 'axis-mixed';\nexport const AXIS_CHART_TYPES = ['line', 'bar', 'axis-mixed'];\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_CHART_OPTIONS = {\n\tbarOptions: {\n\t\tspaceRatio: 1,\n\t}\n}\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 1;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.01;\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};\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\nexport function toTitleCase(str) {\n return str.replace(/\\w*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});\n}\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","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/8027444/6495043\n\treturn /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(string);\n}\n\nexport const getColor = (color) => {\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr } from './draw-utils';\nimport { getStringWidth } 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;\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') {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 0 ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\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, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label) {\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label) {\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\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\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(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\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\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\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 } 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) {\n\tlet pathComponents = [];\n\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y));\n\tlet pathStr = pointsStr.join(\"L\");\n\n\tconst animPath = [paths.path, {d:\"M\"+pathStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pathStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","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 } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\n\nlet BOUND_DRAW_FN;\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || 'line';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tBOUND_DRAW_FN = this.boundDrawFn.bind(this);\n\t\twindow.addEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn.bind(this));\n\t}\n\n\tboundDrawFn() {\n\t\tthis.draw(true);\n\t}\n\n\tunbindWindowEvents() {\n\t\twindow.removeEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn.bind(this));\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t\tthis.parent.style.overflow = 'auto';\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { legendDot } from '../utils/draw';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(d[0]);\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 110;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${s.labels[i]}: ${d}`\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// 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\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tlabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\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 = 80;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr } 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\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath = makeArcPathStr(curStart, curEnd, this.center, this.radius, this.clockWise);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => value * Math.pow(10, exponent));\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t});\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { AXIS_CHART_DEFAULT_TYPE, AXIS_CHART_MIXED_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\tlet overridingType;\n\tif(AXIS_DATASET_CHART_TYPES.includes(type)) {\n\t\toverridingType = type;\n\t};\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t}\n\n\t\t// Set labels\n\n\t\t// Set type\n\t\tif(overridingType) {\n\t\t\td.chartType = overridingType;\n\t\t} else if(!d.chartType) {\n\t\t\td.chartType = AXIS_CHART_DEFAULT_TYPE;\n\t\t}\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 calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlet multiple = Math.ceil(label.length/allowedLetters);\n\t\t\t\tif(i % multiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","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.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth/2 * (2 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: s.yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\thideDots: this.lineOptions.hideDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tlet dbi = this.dataByIndex[index];\n\n\t\tthis.tip.setValues(\n\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\tdbi.values,\n\t\t\tindex\n\t\t);\n\n\t\tthis.tip.showTip();\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","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';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };"],"names":["$","expr","con","document","querySelector","create","tag","o","element","createElement","i","val","appendChild","ref","parentNode","insertBefore","addEventListener","keys","map","style","prop","setAttribute","getOffset","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isElementInViewport","el","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","AXIS_CHART_DEFAULT_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","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","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","slice","num","parseInt","b","g","toString","isValidColor","test","AXIS_TICK_LENGTH","LABEL_MARGIN","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","makeSVGContainer","className","makeSVGDefs","svgContainer","makeSVGGroup","transform","undefined","args","inside","makePath","pathStr","stroke","makeArcPathStr","startPosition","endPosition","center","clockWise","arcStartX","arcStartY","arcEndX","arcEndY","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","heatSquare","size","data","key","legendBar","label","text","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","l","line","makeHoriLine","x1","x2","lineType","yLine","pos","mode","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","meta","minHeight","datasetDot","dot","getPaths","xList","yList","pointsList","pointsStr","join","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","push","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","a","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","firstChild","BOUND_DRAW_FN","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","isNavigable","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","bind","draw","removeEventListener","makeContainer","updateWidth","independentWidth","overflow","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","error","animate","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","event","keyCode","chartSvg","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","reduce","textContent","legendTotals","barWidth","divisor","floor","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","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","positions","position","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","isNaN","mantissa","exponent","sig","isFinite","exp","log10","man","pow","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","reverse","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","points","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","overridingType","vals","chartType","yRegions","zeroDataPrep","zeroData","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","multiple","AxisChart","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","xAxis","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","stacked","yExtremes","cumulativeYPos","cumulative","allValueLists","barDatasets","lineDatasets","barsConfigs","spaceRatio","p","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","chartTypes","getChartByType","Chart"],"mappings":"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"} \ No newline at end of file diff --git a/dist/frappe-charts.min.esm.js b/dist/frappe-charts.min.esm.js index b79888d..4f423d9 100644 --- a/dist/frappe-charts.min.esm.js +++ b/dist/frappe-charts.min.esm.js @@ -1,2 +1,4324 @@ -function __$styleInject(t,e){void 0===e&&(e={});var n=e.insertAt;if(t&&"undefined"!=typeof document){var i=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===n&&i.firstChild?i.insertBefore(a,i.firstChild):i.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}function $(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function getOffset(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 isElementInViewport(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 getElementContentWidth(t){var e=window.getComputedStyle(t),n=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-n}function fire(t,e,n){var i=document.createEvent("HTMLEvents");i.initEvent(e,!0,!0);for(var a in n)i[a]=n[a];return t.dispatchEvent(i)}function getTopOffset(t){return t.titleHeight+t.margins.top+t.paddings.top}function getLeftOffset(t){return t.margins.left+t.paddings.left}function getExtraHeight(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function getExtraWidth(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function _classCallCheck$4(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function floatTwo(t){return parseFloat(t.toFixed(2))}function fillArray(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n||(n=i?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(n);return t=i?a.concat(t):t.concat(a)}function getStringWidth(t,e){return(t+"").length*e}function getPositionByAngle(t,e){return{x:Math.sin(t*ANGLE_RATIO)*e,y:Math.cos(t*ANGLE_RATIO)*e}}function getBarHeightAndYAttr(t,e){var n=void 0,i=void 0;return t<=e?(n=e-t,i=t):(n=t-e,i=e),[n,i]}function equilizeNoOfElements(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return n>0?t=fillArray(t,n):e=fillArray(e,n),[t,e]}function limitColor(t){return t>255?255:t<0?0:t}function lightenDarkenColor(t,e){var n=getColor(t),i=!1;"#"==n[0]&&(n=n.slice(1),i=!0);var a=parseInt(n,16),r=limitColor((a>>16)+e),o=limitColor((a>>8&255)+e),s=limitColor((255&a)+e);return(i?"#":"")+(s|o<<8|r<<16).toString(16)}function isValidColor(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)}function $$1(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function createSVG(t,e){var n=document.createElementNS("http://www.w3.org/2000/svg",t);for(var i in e){var a=e[i];if("inside"===i)$$1(a).appendChild(n);else if("around"===i){var r=$$1(a);r.parentNode.insertBefore(n,r),n.appendChild(r)}else"styles"===i?"object"===(void 0===a?"undefined":_typeof$2(a))&&Object.keys(a).map(function(t){n.style[t]=a[t]}):("className"===i&&(i="class"),"innerHTML"===i?n.textContent=a:n.setAttribute(i,a))}return n}function renderVerticalGradient(t,e){return createSVG("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function setGradientStop(t,e,n,i){return createSVG("stop",{inside:t,style:"stop-color: "+n,offset:e,"stop-opacity":i})}function makeSVGContainer(t,e,n,i){return createSVG("svg",{className:e,inside:t,width:n,height:i})}function makeSVGDefs(t){return createSVG("defs",{inside:t})}function makeSVGGroup(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,i={className:t,transform:e};return n&&(i.inside=n),createSVG("g",i)}function makePath(t){return createSVG("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"}})}function makeArcPathStr(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,r=n.x+t.x,o=n.y+t.y,s=n.x+e.x,l=n.y+e.y;return"M"+n.x+" "+n.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+i+" "+i+" 0 0 "+(a?1:0)+"\n\t\t"+s+" "+l+" z"}function makeGradient(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="path-fill-gradient-"+e+"-"+(n?"lighter":"default"),a=renderVerticalGradient(t,i),r=[1,.6,.2];return n&&(r=[.4,.2,0]),setGradientStop(a,"0%",e,r[0]),setGradientStop(a,"50%",e,r[1]),setGradientStop(a,"100%",e,r[2]),i}function percentageBar(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:PERCENTAGE_BAR_DEFAULT_DEPTH,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return createSVG("rect",{className:"percentage-bar",x:t,y:e,width:n,height:i,fill:r,styles:{stroke:lightenDarkenColor(r,-25),"stroke-dasharray":"0, "+(i+n)+", "+n+", "+i,"stroke-width":a}})}function heatSquare(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"none",r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o={className:t,x:e,y:n,width:i,height:i,fill:a};return Object.keys(r).map(function(t){o[t]=r[t]}),createSVG("rect",o)}function legendBar(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4],r={className:"legend-bar",x:0,y:0,width:n,height:"2px",fill:i},o=createSVG("text",{className:"legend-dataset-text",x:0,y:0,dy:2*FONT_SIZE+"px","font-size":1.2*FONT_SIZE+"px","text-anchor":"start",fill:FONT_FILL,innerHTML:a}),s=createSVG("g",{transform:"translate("+t+", "+e+")"});return s.appendChild(createSVG("rect",r)),s.appendChild(o),s}function legendDot(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4],r={className:"legend-dot",cx:0,cy:0,r:n,fill:i},o=createSVG("text",{className:"legend-dataset-text",x:0,y:0,dx:FONT_SIZE+"px",dy:FONT_SIZE/3+"px","font-size":1.2*FONT_SIZE+"px","text-anchor":"start",fill:FONT_FILL,innerHTML:a}),s=createSVG("g",{transform:"translate("+t+", "+e+")"});return s.appendChild(createSVG("circle",r)),s.appendChild(o),s}function makeText(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},r=a.fontSize||FONT_SIZE;return createSVG("text",{className:t,x:e,y:n,dy:(void 0!==a.dy?a.dy:r/2)+"px","font-size":r+"px",fill:a.fill||FONT_FILL,"text-anchor":a.textAnchor||"start",innerHTML:i})}function makeVertLine(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=BASE_LINE_COLOR);var r=createSVG("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:n,y2:i,styles:{stroke:a.stroke}}),o=createSVG("text",{x:0,y:n>i?n+LABEL_MARGIN:n-LABEL_MARGIN-FONT_SIZE,dy:FONT_SIZE+"px","font-size":FONT_SIZE+"px","text-anchor":"middle",innerHTML:e+""}),s=createSVG("g",{transform:"translate("+t+", 0)"});return s.appendChild(r),s.appendChild(o),s}function makeHoriLine(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=BASE_LINE_COLOR),a.lineType||(a.lineType="");var r=createSVG("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:n,x2:i,y1:0,y2:0,styles:{stroke:a.stroke}}),o=createSVG("text",{x:n3&&void 0!==arguments[3]?arguments[3]:{};i.pos||(i.pos="left"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke=BASE_LINE_COLOR),i.className||(i.className="");var a=-1*AXIS_TICK_LENGTH,r="span"===i.mode?n+AXIS_TICK_LENGTH:0;return"tick"===i.mode&&"right"===i.pos&&(a=n+AXIS_TICK_LENGTH,r=n),a+=i.offset,r+=i.offset,makeHoriLine(t,e,a,r,{stroke:i.stroke,className:i.className,lineType:i.lineType})}function xLine(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};i.pos||(i.pos="bottom"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke=BASE_LINE_COLOR),i.className||(i.className="");var a=n+AXIS_TICK_LENGTH,r="span"===i.mode?-1*AXIS_TICK_LENGTH:n;return"tick"===i.mode&&"top"===i.pos&&(a=-1*AXIS_TICK_LENGTH,r=0),makeVertLine(t,e,a,r,{stroke:i.stroke,className:i.className,lineType:i.lineType})}function yMarker(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};i.labelPos||(i.labelPos="right");var a=createSVG("text",{className:"chart-label",x:"left"===i.labelPos?LABEL_MARGIN:n-getStringWidth(e,5)-LABEL_MARGIN,y:0,dy:FONT_SIZE/-2+"px","font-size":FONT_SIZE+"px","text-anchor":"start",innerHTML:e+""}),r=makeHoriLine(t,"",0,n,{stroke:i.stroke||BASE_LINE_COLOR,className:i.className||"",lineType:i.lineType});return r.appendChild(a),r}function yRegion(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},r=t-e,o=createSVG("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:BASE_LINE_COLOR,"stroke-dasharray":n+", "+r},x:0,y:0,width:n,height:r});a.labelPos||(a.labelPos="right");var s=createSVG("text",{className:"chart-label",x:"left"===a.labelPos?LABEL_MARGIN:n-getStringWidth(i+"",4.5)-LABEL_MARGIN,y:0,dy:FONT_SIZE/-2+"px","font-size":FONT_SIZE+"px","text-anchor":"start",innerHTML:i+""}),l=createSVG("g",{transform:"translate(0, "+e+")"});return l.appendChild(o),l.appendChild(s),l}function datasetBar(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,o=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,s=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=getBarHeightAndYAttr(e,s.zeroLine),u=_slicedToArray(l,2),c=u[0],h=u[1];h-=o,0===c&&(c=s.minHeight,h-=s.minHeight);var d=createSVG("rect",{className:"bar mini",style:"fill: "+i,"data-point-index":r,x:t,y:h,width:n,height:c});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var f=createSVG("text",{className:"data-point-value",x:n/2,y:0,dy:FONT_SIZE/2*-1+"px","font-size":FONT_SIZE+"px","text-anchor":"middle",innerHTML:a}),p=createSVG("g",{"data-point-index":r,transform:"translate("+t+", "+h+")"});return p.appendChild(d),p.appendChild(f),p}return d}function datasetDot(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,o=createSVG("circle",{style:"fill: "+i,"data-point-index":r,cx:t,cy:e,r:n});if((a+="")||a.length){o.setAttribute("cy",0),o.setAttribute("cx",0);var s=createSVG("text",{className:"data-point-value",x:0,y:0,dy:FONT_SIZE/2*-1-n+"px","font-size":FONT_SIZE+"px","text-anchor":"middle",innerHTML:a}),l=createSVG("g",{"data-point-index":r,transform:"translate("+t+", "+e+")"});return l.appendChild(o),l.appendChild(s),l}return o}function getPaths(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},r=e.map(function(e,n){return t[n]+","+e}).join("L"),o=makePath("M"+r,"line-graph-path",n);if(i.heatline){var s=makeGradient(a.svgDefs,n);o.style.stroke="url(#"+s+")"}var l={path:o};if(i.regionFill){var u=makeGradient(a.svgDefs,n,!0),c="M"+t[0]+","+a.zeroLine+"L"+r+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=makePath(c,"region-fill","none","url(#"+u+")")}return l}function translate(t,e,n,i){var a="string"==typeof e?e:e.join(", ");return[t,{transform:n.join(", ")},i,STD_EASING,"translate",{transform:a}]}function translateVertLine(t,e,n){return translate(t,[n,0],[e,0],MARKER_LINE_ANIM_DUR)}function translateHoriLine(t,e,n){return translate(t,[0,n],[0,e],MARKER_LINE_ANIM_DUR)}function animateRegion(t,e,n,i){var a=e-n,r=t.childNodes[0];return[[r,{height:a,"stroke-dasharray":r.getAttribute("width")+", "+a},MARKER_LINE_ANIM_DUR,STD_EASING],translate(t,[0,i],[0,n],MARKER_LINE_ANIM_DUR)]}function animateBar(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,r=getBarHeightAndYAttr(n,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),o=_slicedToArray$2(r,2),s=o[0],l=o[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:i,height:s},UNIT_ANIM_DUR,STD_EASING],translate(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],MARKER_LINE_ANIM_DUR)]:[[t,{width:i,height:s,x:e,y:l},UNIT_ANIM_DUR,STD_EASING]]}function animateDot(t,e,n){return"circle"!==t.nodeName?[translate(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,n],MARKER_LINE_ANIM_DUR)]:[[t,{cx:e,cy:n},UNIT_ANIM_DUR,STD_EASING]]}function animatePath(t,e,n,i){var a=[],r=n.map(function(t,n){return e[n]+","+t}).join("L"),o=[t.path,{d:"M"+r},PATH_ANIM_DUR,STD_EASING];if(a.push(o),t.region){var s=e[0]+","+i+"L",l="L"+e.slice(-1)[0]+", "+i,u=[t.region,{d:"M"+s+r+l},PATH_ANIM_DUR,STD_EASING];a.push(u)}return a}function animatePathStr(t,e){return[t,{d:e},UNIT_ANIM_DUR,STD_EASING]}function _toConsumableArray$1(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},o=t.cloneNode(!0),s=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 c=r[l]||t.getAttribute(l),h=e[l],d={attributeName:l,from:c,to:h,begin:"0s",dur:n/1e3+"s",values:c+";"+h,keySplines:EASING[i],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var f in d)u.setAttribute(f,d[f]);o.appendChild(u),a?s.setAttribute(l,"translate("+h+")"):s.setAttribute(l,h)}return[o,s]}function transform(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function animateSVG(t,e){var n=[],i=[];e.map(function(t){var e=t[0],a=e.parentNode,r=void 0,o=void 0;t[0]=e;var s=animateSVGElement.apply(void 0,_toConsumableArray$1(t)),l=_slicedToArray$1(s,2);r=l[0],o=l[1],n.push(o),i.push([r,a]),a.replaceChild(r,e)});var a=t.cloneNode(!0);return i.map(function(t,i){t[1].replaceChild(n[i],t[0]),e[i][0]=n[i]}),a}function runSMILAnimation(t,e,n){if(0!==n.length){var i=animateSVG(e,n);e.parentNode==t&&(t.removeChild(e),t.appendChild(i)),setTimeout(function(){i.parentNode==t&&(t.removeChild(i),t.appendChild(e))},REPLACE_ALL_NEW_DUR)}}function downloadFile(t,e){var n=document.createElement("a");n.style="display: none";var i=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(i);n.href=a,n.download=t,document.body.appendChild(n),n.click(),setTimeout(function(){document.body.removeChild(n),window.URL.revokeObjectURL(a)},300)}function prepareForExport(t){var e=t.cloneNode(!0);e.classList.add("chart-container"),e.setAttribute("xmlns","http://www.w3.org/2000/svg"),e.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=$.create("style",{innerHTML:CSSTEXT});e.insertBefore(n,e.firstChild);var i=$.create("div");return i.appendChild(e),i.innerHTML}function _classCallCheck$3(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck$2(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn$1(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits$1(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function treatAsUtc(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function getYyyyMmDd(t){var e=t.getDate(),n=t.getMonth()+1;return[t.getFullYear(),(n>9?"":"0")+n,(e>9?"":"0")+e].join("-")}function clone(t){return new Date(t.getTime())}function getWeeksBetween(t,e){var n=setDayToSunday(t);return Math.ceil(getDaysBetween(n,e)/NO_OF_DAYS_IN_WEEK)}function getDaysBetween(t,e){var n=SEC_IN_DAY*NO_OF_MILLIS;return(treatAsUtc(e)-treatAsUtc(t))/n}function areInSameMonth(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function getMonthName(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=MONTH_NAMES[t];return e?n.slice(0,3):n}function getLastDateInMonth(t,e){return new Date(e,t+1,0)}function setDayToSunday(t){var e=clone(t),n=e.getDay();return 0!==n&&addDays(e,-1*n),e}function addDays(t,e){t.setDate(t.getDate()+e)}function _classCallCheck$5(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function getComponent(t,e,n){var i=Object.keys(componentConfigs).filter(function(e){return t.includes(e)}),a=componentConfigs[i[0]];return Object.assign(a,{constants:e,getData:n}),new ChartComponent(a)}function _toConsumableArray(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var n=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,n)),n]}function getChartRangeIntervals(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Math.ceil(t),i=Math.floor(e),a=n-i,r=a,o=1;a>5&&(a%2!=0&&(a=++n-i),r=a/2,o=2),a<=2&&(o=a/(r=4)),0===a&&(r=5,o=1);for(var s=[],l=0;l<=r;l++)s.push(i+o*l);return s}function getChartIntervals(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=normalize(t),i=_slicedToArray$4(n,2),a=i[0],r=i[1],o=e?e/Math.pow(10,r):0,s=getChartRangeIntervals(a=a.toFixed(6),o);return s=s.map(function(t){return t*Math.pow(10,r)})}function calcChartIntervals(t){function e(t,e){for(var n=getChartIntervals(t),i=n[1]-n[0],a=0,r=1;a1&&void 0!==arguments[1]&&arguments[1],i=Math.max.apply(Math,_toConsumableArray$4(t)),a=Math.min.apply(Math,_toConsumableArray$4(t)),r=[];if(i>=0&&a>=0)normalize(i)[1],r=n?getChartIntervals(i,a):getChartIntervals(i);else if(i>0&&a<0){var o=Math.abs(a);i>=o?(normalize(i)[1],r=e(i,o)):(normalize(o)[1],r=e(o,i).map(function(t){return-1*t}))}else if(i<=0&&a<=0){var s=Math.abs(a),l=Math.abs(i);normalize(s)[1],r=(r=n?getChartIntervals(s,l):getChartIntervals(s)).reverse().map(function(t){return-1*t})}return r}function getZeroIndex(t){var e=getIntervalSize(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 getIntervalSize(t){return t[1]-t[0]}function getValueRange(t){return t[t.length-1]-t[0]}function scale(t,e){return floatTwo(e.zeroLine-t*e.scaleMultiplier)}function getClosestInArray(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=e.reduce(function(e,n){return Math.abs(n-t)n?e.slice(0,n):fillArray(e,n-e.length,0)}else t.values=a;r?t.chartType=r:t.chartType||(t.chartType=AXIS_CHART_DEFAULT_TYPE)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=t/e.length;i<=0&&(i=1);var a=i/DEFAULT_CHAR_WIDTH;return e.map(function(t,e){return(t+="").length>a&&(n?e%Math.ceil(t.length/a)!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function _toConsumableArray$5(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],n=arguments[2];return"axis-mixed"===t?(n.type="line",new AxisChart(e,n)):chartTypes[t]?new chartTypes[t](e,n):void console.error("Undefined chart type: "+t)}__$styleInject('.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:1;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 asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,a){var s={key:t,arg:e,resolve:n,reject:a,next:null};o?o=o.next=s:(r=o=s,i(t,e))})}function i(n,r){try{var o=e[n](r),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){i("next",t)},function(t){i("throw",t)}):a(o.done?"return":"normal",o.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":r.resolve({value:e,done:!0});break;case"throw":r.reject(e);break;default:r.resolve({value:e,done:!1})}(r=r.next)?i(r.key,r.arg):o=null}var r,o;this._invoke=n,"function"!=typeof e.return&&(this.return=void 0)}return"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)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),_typeof="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};$.create=function(t,e){var n=document.createElement(t);for(var i in e){var a=e[i];if("inside"===i)$(a).appendChild(n);else if("around"===i){var r=$(a);r.parentNode.insertBefore(n,r),n.appendChild(r)}else"onClick"===i?n.addEventListener("click",a):"styles"===i?"object"===(void 0===a?"undefined":_typeof(a))&&Object.keys(a).map(function(t){n.style[t]=a[t]}):i in n?n[i]=a:n.setAttribute(i,a)}return n};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},INIT_CHART_UPDATE_TIMEOUT=700,CHART_POST_ANIMATE_TIMEOUT=400,AXIS_CHART_DEFAULT_TYPE="line",AXIS_DATASET_CHART_TYPES=["line","bar"],AXIS_LEGEND_BAR_SIZE=100,BAR_CHART_SPACE_RATIO=1,MIN_BAR_PERCENT_HEIGHT=.01,LINE_CHART_DOT_SIZE=4,DOT_OVERLAY_SIZE_INCR=4,PERCENTAGE_BAR_DEFAULT_HEIGHT=20,PERCENTAGE_BAR_DEFAULT_DEPTH=2,HEATMAP_DISTRIBUTION_SIZE=5,HEATMAP_SQUARE_SIZE=10,HEATMAP_GUTTER_SIZE=2,DEFAULT_CHAR_WIDTH=7,TOOLTIP_POINTER_TRIANGLE_HEIGHT=5,DEFAULT_CHART_COLORS=["light-blue","blue","violet","red","orange","yellow","green","light-green","purple","magenta","light-grey","dark-grey"],HEATMAP_COLORS_GREEN=["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],DEFAULT_COLORS={bar:DEFAULT_CHART_COLORS,line:DEFAULT_CHART_COLORS,pie:DEFAULT_CHART_COLORS,percentage:DEFAULT_CHART_COLORS,heatmap:HEATMAP_COLORS_GREEN},ANGLE_RATIO=Math.PI/180,FULL_ANGLE=360,_createClass$3=function(){function t(t,e){for(var n=0;n\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(){t.hideTip()})}},{key:"fill",value:function(){var t=this,e=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),e=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=e,this.dataPointList.innerHTML="",this.listValues.map(function(e,n){var i=t.colors[n]||"black",a=0===e.formatted||e.formatted?e.formatted:e.value,r=$.create("li",{styles:{"border-top":"3px solid "+i},innerHTML:''+(0===a||a?a:"")+"\n\t\t\t\t\t"+(e.title?e.title:"")});t.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-TOOLTIP_POINTER_TRIANGLE_HEIGHT,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,n=this.container.querySelector(".svg-pointer");if(this.left<0)n.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var i="calc(50% + "+(this.left-e)+"px)";n.style.left=i,this.left=e}else n.style.left="50%"}},{key:"setValues",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=n.name,this.titleValue=n.value,this.listValues=i,this.x=t,this.y=e,this.titleValueFirst=n.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),t}(),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"},getColor=function(t){return PRESET_COLOR_MAP[t]||t},_slicedToArray=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_typeof$2="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},AXIS_TICK_LENGTH=6,LABEL_MARGIN=4,FONT_SIZE=10,BASE_LINE_COLOR="#dadada",FONT_FILL="#555b51",makeOverlay={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var n=t.cloneNode();return n.style.fill="#000000",n.style.opacity="0.4",e&&n.setAttribute("transform",e),n},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var n=t.cloneNode(),i=t.getAttribute("r"),a=t.getAttribute("fill");return n.setAttribute("r",parseInt(i)+DOT_OVERLAY_SIZE_INCR),n.setAttribute("fill",a),n.style.opacity="0.6",e&&n.setAttribute("transform",e),n},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var n=t.cloneNode(),i=t.getAttribute("r"),a=t.getAttribute("fill");return n.setAttribute("r",parseInt(i)+DOT_OVERLAY_SIZE_INCR),n.setAttribute("fill",a),n.style.opacity="0.6",e&&n.setAttribute("transform",e),n}},updateOverlay={bar:function(t,e){var n=void 0;"rect"!==t.nodeName&&(n=t.getAttribute("transform"),t=t.childNodes[0]);var i=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return i.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),n&&e.setAttribute("transform",n)},dot:function(t,e){var n=void 0;"circle"!==t.nodeName&&(n=t.getAttribute("transform"),t=t.childNodes[0]);var i=["cx","cy"];Object.values(t.attributes).filter(function(t){return i.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),n&&e.setAttribute("transform",n)},heat_square:function(t,e){var n=void 0;"circle"!==t.nodeName&&(n=t.getAttribute("transform"),t=t.childNodes[0]);var i=["cx","cy"];Object.values(t.attributes).filter(function(t){return i.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),n&&e.setAttribute("transform",n)}},_slicedToArray$2=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),UNIT_ANIM_DUR=350,PATH_ANIM_DUR=350,MARKER_LINE_ANIM_DUR=UNIT_ANIM_DUR,REPLACE_ALL_NEW_DUR=250,STD_EASING="easein",_slicedToArray$1=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),EASING={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"},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}",_createClass$2=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];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=getElementContentWidth(this.parent),this.width=this.baseWidth-getExtraWidth(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=makeSVGContainer(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=makeSVGDefs(this.svg),this.title.length&&(this.titleEL=makeText("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=getTopOffset(t);this.drawArea=makeSVGGroup(this.type+"-chart chart-draw-area","translate("+getLeftOffset(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=makeSVGGroup("chart-legend","translate("+getLeftOffset(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(getLeftOffset(t),getTopOffset(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()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var i=[];e.forEach(function(t){i=i.concat(t.update(n))}),i.length>0?(runSMILAnimation(this.container,this.svg,i),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},CHART_POST_ANIMATE_TIMEOUT)):(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){isElementInViewport(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=prepareForExport(this.svg);downloadFile(this.title||"Chart",[t])}}]),t}(),_createClass$1=function(){function t(t,e){for(var n=0;n=0}),a=i;if(i.length>n){i.sort(function(t,e){return e[0]-t[0]}),a=i.slice(0,n-1);var r=0;i.slice(n-1).map(function(t){r+=t[0]}),a.push([r,"Rest"]),this.colors[n-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(t[0]),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var n=0,i=0;this.legendTotals.map(function(a,r){var o=Math.floor((t.width-getExtraWidth(t.measures))/110);n>o&&(n=0,i+=20);var s=legendDot(110*n+5,i,5,t.colors[r],e.labels[r]+": "+a);t.legendArea.appendChild(s),n++})}}]),e}(BaseChart),NO_OF_YEAR_MONTHS=12,NO_OF_DAYS_IN_WEEK=7,NO_OF_MILLIS=1e3,SEC_IN_DAY=86400,MONTH_NAMES=["January","February","March","April","May","June","July","August","September","October","November","December"],DAY_NAMES_SHORT=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],_slicedToArray$3=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_createClass$4=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),componentConfigs={pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,n){var i=makePath(e,"pie-path","none",t.colors[n]);return i.style.transition="transform .3s;",i})},animateElements:function(t){return this.store.map(function(e,n){return animatePathStr(e,t.sliceStrings[n])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(n,i){return percentageBar(n,0,t.widths[i],e.constants.barHeight,e.constants.barDepth,t.colors[i])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this;return t.positions.map(function(n,i){return yLine(n,t.labels[i],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,n=t.labels,i=this.oldData.positions,a=this.oldData.labels,r=equilizeNoOfElements(i,e),o=_slicedToArray$3(r,2);i=o[0],e=o[1];var s=equilizeNoOfElements(a,n),l=_slicedToArray$3(s,2);return a=l[0],n=l[1],this.render({positions:i,labels:n}),this.store.map(function(t,n){return translateHoriLine(t,e[n],i[n])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(n,i){return xLine(n,t.calcLabels[i],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,n=t.calcLabels,i=this.oldData.positions,a=this.oldData.calcLabels,r=equilizeNoOfElements(i,e),o=_slicedToArray$3(r,2);i=o[0],e=o[1];var s=equilizeNoOfElements(a,n),l=_slicedToArray$3(s,2);return a=l[0],n=l[1],this.render({positions:i,calcLabels:n}),this.store.map(function(t,n){return translateVertLine(t,e[n],i[n])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return yMarker(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=equilizeNoOfElements(this.oldData,t),n=_slicedToArray$3(e,2);this.oldData=n[0];var i=(t=n[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.position});return this.render(o.map(function(t,e){return{position:o[e],label:a[e],options:r[e]}})),this.store.map(function(t,e){return translateHoriLine(t,i[e],o[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return yRegion(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=equilizeNoOfElements(this.oldData,t),n=_slicedToArray$3(e,2);this.oldData=n[0];var i=(t=n[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),r=t.map(function(t){return t.startPos}),o=t.map(function(t){return t.options}),s=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(s.map(function(t,e){return{startPos:l[e],endPos:s[e],label:a[e],options:o[e]}}));var u=[];return this.store.map(function(t,e){u=u.concat(animateRegion(t,r[e],i[e],s[e]))}),u}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,n=this.constants,i=n.index,a=n.colWidth,r=n.rowHeight,o=n.squareSize,s=n.xTranslate,l=0;return this.serializedSubDomains=[],t.cols.map(function(t,n){1===n&&e.labels.push(makeText("domain-name",s,-12,getMonthName(i,!0).toUpperCase(),{fontSize:9})),t.map(function(t,n){if(t.fill){var i={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":n},a=heatSquare("day",s,l,o,t.fill,i);e.serializedSubDomains.push(a)}l+=r}),l=0,s+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(n,i){return datasetBar(t.xPositions[i],n,t.barWidth,e.color,t.labels[i],i,t.offsets[i],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.offsets,a=t.labels,r=this.oldData.xPositions,o=this.oldData.yPositions,s=this.oldData.offsets,l=this.oldData.labels,u=equilizeNoOfElements(r,e),c=_slicedToArray$3(u,2);r=c[0],e=c[1];var h=equilizeNoOfElements(o,n),d=_slicedToArray$3(h,2);o=d[0],n=d[1];var f=equilizeNoOfElements(s,i),p=_slicedToArray$3(f,2);s=p[0],i=p[1];var v=equilizeNoOfElements(l,a),y=_slicedToArray$3(v,2);l=y[0],a=y[1],this.render({xPositions:r,yPositions:o,offsets:s,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var g=[];return this.store.map(function(a,r){g=g.concat(animateBar(a,e[r],n[r],t.barWidth,i[r],{zeroLine:t.zeroLine}))}),g}},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=getPaths(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(n,i){return datasetDot(t.xPositions[i],n,t.radius,e.color,e.valuesOverPoints?t.values[i]:"",i)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.values,a=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.values,s=equilizeNoOfElements(a,e),l=_slicedToArray$3(s,2);a=l[0],e=l[1];var u=equilizeNoOfElements(r,n),c=_slicedToArray$3(u,2);r=c[0],n=c[1];var h=equilizeNoOfElements(o,i),d=_slicedToArray$3(h,2);o=d[0],i=d[1],this.render({xPositions:a,yPositions:r,values:i,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var f=[];return Object.keys(this.paths).length&&(f=f.concat(animatePath(this.paths,e,n,t.zeroLine))),this.units.length&&this.units.map(function(t,i){f=f.concat(animateDot(t,e[i],n[i]))}),f}}},_createClass=function(){function t(t,e){for(var n=0;n0?t.formattedLabels[r]:t.state.labels[r])+": ",h=e.sliceTotals[r]/e.grandTotal;t.tip.setValues(l,u,{name:c,value:(100*h).toFixed(1)+"%"}),t.tip.showTip()}})}}]),e}(AggregationChart),_createClass$5=function(){function t(t,e){for(var n=0;nthis.width?this.center.x:this.center.y;var i=this.radius,a=this.clockWise,r=n.slicesProperties||[];n.sliceStrings=[],n.slicesProperties=[];var o=180-this.config.startAngle;n.sliceTotals.map(function(e,s){var l=o,u=e/n.grandTotal*FULL_ANGLE,c=a?-u:u,h=o+=c,d=getPositionByAngle(l,i),f=getPositionByAngle(h,i),p=t.init&&r[s],v=void 0,y=void 0;t.init?(v=p?p.startPosition:d,y=p?p.endPosition:d):(v=d,y=f);var g=makeArcPathStr(v,y,t.center,t.radius,t.clockWise);n.sliceStrings.push(g),n.slicesProperties.push({startPosition:d,endPosition:f,value:e,total:n.grandTotal,startAngle:l,endAngle:h,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=getComponent.apply(void 0,_toConsumableArray$2(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=getPositionByAngle(t.startAngle+t.angle/2,e);return"translate3d("+i.x*n+"px,"+i.y*n+"px,0)"}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){transform(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.fill=lightenDarkenColor(a,50);var r=getOffset(this.svg),o=i.pageX-r.left+10,s=i.pageY-r.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",u=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,s,{name:l,value:u+"%"}),this.tip.showTip()}else transform(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=a}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,n=this.components.get("pieSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var r=n.indexOf(e);this.hoverSlice(a,i,!1),this.curActiveSlice=e,this.curActiveSliceIndex=r,this.hoverSlice(e,r,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),e}(AggregationChart),_slicedToArray$4=function(){function t(t,e){var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=t[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);i=!0);}catch(t){a=!0,r=t}finally{try{!i&&s.return&&s.return()}finally{if(a)throw r}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),_createClass$6=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(n){var i=new Date(n*NO_OF_MILLIS);e[getYyyyMmDd(i)]=t.dataPoints[n]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=clone(this.data.start),t.end=clone(this.data.end),t.firstWeekStart=clone(t.start),t.noOfWeeks=getWeeksBetween(t.start,t.end),t.distribution=calcDistribution(Object.values(this.data.dataPoints),HEATMAP_DISTRIBUTION_SIZE),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,n=this.discreteDomains?0:1,i=e.domainConfigs.map(function(i,a){return["heatDomain",{index:i.index,colWidth:COL_WIDTH,rowHeight:ROW_HEIGHT,squareSize:HEATMAP_SQUARE_SIZE,xTranslate:e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",n=[t.getMonth(),t.getFullYear()],i=n[0],a=n[1],r=setDayToSunday(t),o={index:i,cols:[]};addDays(e=clone(e)||getLastDateInMonth(i,a),1);for(var s=getWeeksBetween(r,e),l=[],u=void 0,c=0;c2&&void 0!==arguments[2]&&arguments[2],i=this.state,a=clone(t),r=[],o=0;o=i.start&&a<=i.end;n||a.getMonth()!==e||!l?s.yyyyMmDd=getYyyyMmDd(a):s=this.getSubDomainConfig(a),r.push(s)}return r}},{key:"getSubDomainConfig",value:function(t){var e=getYyyyMmDd(t),n=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:n||0,fill:this.colors[getMaxCheckpoint(n,this.state.distribution)]}}}]),e}(BaseChart),_createClass$7=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return zeroDataPrep(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,n){return floatTwo(t.xOffset+n*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=calcChartIntervals(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false"),n=this.height/getValueRange(e),i=getIntervalSize(e)*n,a=this.height-getZeroIndex(e)*i;this.state.yAxis={labels:e,positions:e.map(function(t){return a-t*n}),scaleMultiplier:n,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 scale(e,t.yAxis)})};t.datasets=this.data.datasets.map(function(t,n){var i=t.values,a=t.cumulativeYs||[];return{name:t.name,index:n,chartType:t.chartType,values:i,yPositions:e(i),cumulativeYs:a,cumulativeYPos:e(a)}})}},{key:"calcYExtremes",value:function(){var t=this.state;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,n){egetTopOffset(n)?t.mapTooltipXPosition(a):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var n=getClosestInArray(t,e.xAxis.positions,!0),i=this.dataByIndex[n];this.tip.setValues(i.xPos+this.tip.offset.x,i.yExtreme+this.tip.offset.y,{name:i.formattedLabel,value:""},i.values,n),this.tip.showTip()}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,n){var i=AXIS_LEGEND_BAR_SIZE,a=legendBar(i*n,"0",i,t.colors[n],e.name);t.legendArea.appendChild(a)}))}},{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 n=e.units[t.state.currentIndex];e.overlay=makeOverlay[e.type](n),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var n=e.getAttribute("data-point-index");t.setCurrentDataPoint(n)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var n=e.units[t.state.currentIndex];updateOverlay[e.type](n,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;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,fire(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;_get$3(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"addDataPoint",this).call(this,t,n,i),this.data.labels.splice(i,0,t),this.data.datasets.map(function(t,e){t.values.splice(i,0,n[e])}),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||(_get$3(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,n){t[n]&&(e.values=t[n])}),this.update(this.data)}}]),e}(BaseChart),chartTypes={bar:AxisChart,line:AxisChart,percentage:PercentageChart,heatmap:Heatmap,pie:PieChart},Chart=function t(e,n){return _classCallCheck(this,t),getChartByType(n.type,e,n)};export{Chart,PercentageChart,PieChart,Heatmap,AxisChart}; +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)); + } +} + +__$styleInject(".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:1;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 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 _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; }; + +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 === "onClick") { + element.addEventListener('click', val); + } 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) + }; +} + +function isElementInViewport(el) { + // Although straightforward: https://stackoverflow.com/a/7557433/6495043 + var rect = el.getBoundingClientRect(); + + return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ + rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ + ; +} + +function getElementContentWidth(element) { + var styles = window.getComputedStyle(element); + var padding = parseFloat(styles.paddingLeft) + parseFloat(styles.paddingRight); + + return element.clientWidth - padding; +} + + + + + +function fire(target, type, properties) { + var evt = document.createEvent("HTMLEvents"); + + evt.initEvent(type, true, true); + + for (var j in properties) { + evt[j] = properties[j]; + } + + return target.dispatchEvent(evt); +} + +// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/ + +var BASE_MEASURES = { + margins: { + top: 10, + bottom: 10, + left: 20, + right: 20 + }, + paddings: { + top: 20, + bottom: 40, + left: 30, + right: 10 + }, + + baseHeight: 240, + + titleHeight: 20, + legendHeight: 30, + + titleFontSize: 12 +}; + +function getTopOffset(m) { + return m.titleHeight + m.margins.top + m.paddings.top; +} + +function getLeftOffset(m) { + return m.margins.left + m.paddings.left; +} + +function getExtraHeight(m) { + var totalExtraHeight = m.margins.top + m.margins.bottom + m.paddings.top + m.paddings.bottom + m.titleHeight + m.legendHeight; + return totalExtraHeight; +} + +function getExtraWidth(m) { + var totalExtraWidth = m.margins.left + m.margins.right + m.paddings.left + m.paddings.right; + + return totalExtraWidth; +} + +var INIT_CHART_UPDATE_TIMEOUT = 700; +var CHART_POST_ANIMATE_TIMEOUT = 400; + +var AXIS_CHART_DEFAULT_TYPE = 'line'; + + +var AXIS_DATASET_CHART_TYPES = ['line', 'bar']; + + + +var AXIS_LEGEND_BAR_SIZE = 100; + +var BAR_CHART_SPACE_RATIO = 1; +var MIN_BAR_PERCENT_HEIGHT = 0.01; + +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 +}; + +// Universal constants +var ANGLE_RATIO = Math.PI / 180; +var FULL_ANGLE = 360; + +var _createClass$3 = 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; }; }(); + +function _classCallCheck$4(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +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$4(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$3(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; +}(); + +/** + * Returns the value of a number upto 2 decimal places. + * @param {Number} d Any number + */ +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 + }; +} + +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]; +} + +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/8027444/6495043 + return (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(string) + ); +} + +var getColor = function getColor(color) { + return PRESET_COLOR_MAP[color] || color; +}; + +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 _typeof$2 = 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 AXIS_TICK_LENGTH = 6; +var LABEL_MARGIN = 4; +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$2(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'; + + return createSVG('path', { + className: className, + d: pathStr, + styles: { + stroke: stroke, + fill: fill + } + }); +} + +function makeArcPathStr(startPosition, endPosition, center, radius) { + var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + 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 0 ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY + ' z'; +} + +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) { + var fill = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'none'; + var data = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + + var args = { + className: className, + x: x, + y: y, + width: size, + height: size, + 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 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 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 = ''; + var className = 'line-horizontal ' + options.className + (options.lineType === "dashed" ? "dashed" : ""); + + var l = createSVG('line', { + className: className, + x1: x1, + x2: x2, + y1: 0, + y2: 0, + styles: { + stroke: options.stroke + } + }); + + var text = createSVG('text', { + x: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN, + y: 0, + dy: FONT_SIZE / 2 - 2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': x1 < x2 ? 'end' : 'start', + innerHTML: label + "" + }); + + var line = createSVG('g', { + transform: 'translate(0, ' + y + ')', + 'stroke-opacity': 1 + }); + + if (text === 0 || text === '0') { + line.style.stroke = "rgba(27, 31, 35, 0.6)"; + } + + line.appendChild(l); + line.appendChild(text); + + return line; +} + +function yLine(y, label, width) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + if (!options.pos) options.pos = 'left'; + if (!options.offset) options.offset = 0; + if (!options.mode) options.mode = 'span'; + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + if (!options.className) options.className = ''; + + var x1 = -1 * AXIS_TICK_LENGTH; + var x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; + + if (options.mode === 'tick' && options.pos === 'right') { + x1 = width + AXIS_TICK_LENGTH; + x2 = width; + } + + // let offset = options.pos === 'left' ? -1 * options.offset : options.offset; + + x1 += options.offset; + x2 += options.offset; + + return makeHoriLine(y, label, x1, x2, { + stroke: options.stroke, + className: options.className, + lineType: options.lineType + }); +} + +function xLine(x, label, height) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + 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; + } + + 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"); + 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 _slicedToArray$2 = 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 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$2(_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) { + var pathComponents = []; + + var pointsStr = newYList.map(function (y, i) { + return newXList[i] + ',' + y; + }); + var pathStr = pointsStr.join("L"); + + var animPath = [paths.path, { d: "M" + pathStr }, 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 + pathStr + regEndPt }, PATH_ANIM_DUR, STD_EASING]; + pathComponents.push(animRegion); + } + + return pathComponents; +} + +function animatePathStr(oldPath, pathStr) { + return [oldPath, { d: pathStr }, UNIT_ANIM_DUR, STD_EASING]; +} + +var _slicedToArray$1 = 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"); } }; }(); + +function _toConsumableArray$1(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); } } + +// 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$1(element)); + + var _animateSVGElement2 = _slicedToArray$1(_animateSVGElement, 2); + + animElement = _animateSVGElement2[0]; + newElement = _animateSVGElement2[1]; + + + newElements.push(newElement); + animElements.push([animElement, parent]); + + parent.replaceChild(animElement, unit); + }); + + var animSvg = svgContainer.cloneNode(true); + + animElements.map(function (animElement, i) { + animElement[1].replaceChild(newElements[i], animElement[0]); + elements[i][0] = newElements[i]; + }); + + return animSvg; +} + +function runSMILAnimation(parent, svgElement, elementsToAnimate) { + if (elementsToAnimate.length === 0) return; + + var animSvgElement = animateSVG(svgElement, elementsToAnimate); + if (svgElement.parentNode == parent) { + parent.removeChild(svgElement); + parent.appendChild(animSvgElement); + } + + // Replace the new svgElement (data has already been replaced) + setTimeout(function () { + if (animSvgElement.parentNode == parent) { + parent.removeChild(animSvgElement); + parent.appendChild(svgElement); + } + }, REPLACE_ALL_NEW_DUR); +} + +var CSSTEXT = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;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 _createClass$2 = 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; }; }(); + +function _classCallCheck$3(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var BOUND_DRAW_FN = void 0; + +var BaseChart = function () { + function BaseChart(parent, options) { + _classCallCheck$3(this, BaseChart); + + this.parent = typeof parent === 'string' ? document.querySelector(parent) : parent; + + if (!(this.parent instanceof HTMLElement)) { + throw new Error('No `parent` element to render on was provided.'); + } + + this.rawChartArgs = options; + + this.title = options.title || ''; + this.type = options.type || 'line'; + + 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: 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$2(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 height = this.argHeight; + this.baseHeight = height; + this.height = height - getExtraHeight(this.measures); + + // Bind window events + BOUND_DRAW_FN = this.boundDrawFn.bind(this); + window.addEventListener('resize', BOUND_DRAW_FN); + window.addEventListener('orientationchange', this.boundDrawFn.bind(this)); + } + }, { + key: 'boundDrawFn', + value: function boundDrawFn() { + this.draw(true); + } + }, { + key: 'unbindWindowEvents', + value: function unbindWindowEvents() { + window.removeEventListener('resize', BOUND_DRAW_FN); + window.removeEventListener('orientationchange', this.boundDrawFn.bind(this)); + } + + // 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.parent.style.overflow = 'auto'; + } + + 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 _this = this; + + var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + this.updateWidth(); + + this.calc(onlyWidthChange); + this.makeChartArea(); + this.setupComponents(); + + this.components.forEach(function (c) { + return c.setup(_this.drawArea); + }); + // this.components.forEach(c => c.make()); + this.render(this.components, false); + + if (init) { + this.data = this.realData; + setTimeout(function () { + _this.update(_this.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(); + } + }, { + key: 'render', + value: function render() { + var _this2 = 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(); + }); + _this2.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 _this3 = 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(_this3.container)) { + e = e || window.event; + if (_this3.keyActions[e.keyCode]) { + _this3.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 _createClass$1 = 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$1 = function get$$1(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$$1(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); } }; + +function _classCallCheck$2(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn$1(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; } + +function _inherits$1(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 AggregationChart = function (_BaseChart) { + _inherits$1(AggregationChart, _BaseChart); + + function AggregationChart(parent, args) { + _classCallCheck$2(this, AggregationChart); + + return _possibleConstructorReturn$1(this, (AggregationChart.__proto__ || Object.getPrototypeOf(AggregationChart)).call(this, parent, args)); + } + + _createClass$1(AggregationChart, [{ + key: 'configure', + value: function configure(args) { + _get$1(AggregationChart.prototype.__proto__ || Object.getPrototypeOf(AggregationChart.prototype), 'configure', this).call(this, args); + + this.config.maxSlices = args.maxSlices || 20; + this.config.maxLegendPoints = args.maxLegendPoints || 20; + } + }, { + key: 'calc', + value: function calc() { + var _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(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 = 110; + var divisor = Math.floor((_this3.width - getExtraWidth(_this3.measures)) / barWidth); + if (count > divisor) { + count = 0; + y += 20; + } + var x = barWidth * count + 5; + var dot = legendDot(x, y, 5, _this3.colors[i], s.labels[i] + ': ' + d); + _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 _slicedToArray$3 = 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 _createClass$4 = 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; }; }(); + +function _classCallCheck$5(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +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$5(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$4(ChartComponent, [{ + key: 'refresh', + value: function refresh(data) { + this.data = data || this.getData(); + } + }, { + key: 'setup', + value: function setup(parent) { + this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent); + } + }, { + key: 'make', + value: function make() { + this.render(this.data); + this.oldData = this.data; + } + }, { + key: 'render', + value: function render(data) { + var _this = this; + + this.store = this.makeElements(data); + + this.layer.textContent = ''; + this.store.forEach(function (element) { + _this.layer.appendChild(element); + }); + this.labels.forEach(function (element) { + _this.layer.appendChild(element); + }); + } + }, { + key: 'update', + value: function update() { + var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.refresh(); + var animateElements = []; + if (animate) { + animateElements = this.animateElements(this.data) || []; + } + return animateElements; + } + }]); + + return ChartComponent; +}(); + +var componentConfigs = { + pieSlices: { + layerClass: 'pie-slices', + makeElements: function makeElements(data) { + return data.sliceStrings.map(function (s, i) { + var slice = makePath(s, 'pie-path', 'none', data.colors[i]); + slice.style.transition = 'transform .3s;'; + return slice; + }); + }, + animateElements: function animateElements(newData) { + return this.store.map(function (slice, i) { + return animatePathStr(slice, newData.sliceStrings[i]); + }); + } + }, + percentageBars: { + layerClass: 'percentage-bars', + makeElements: function makeElements(data) { + var _this2 = this; + + return data.xPositions.map(function (x, i) { + var y = 0; + var bar = percentageBar(x, y, data.widths[i], _this2.constants.barHeight, _this2.constants.barDepth, data.colors[i]); + return bar; + }); + }, + animateElements: function animateElements(newData) { + if (newData) return []; + } + }, + yAxis: { + layerClass: 'y axis', + makeElements: function makeElements(data) { + var _this3 = this; + + return data.positions.map(function (position, i) { + return yLine(position, data.labels[i], _this3.constants.width, { mode: _this3.constants.mode, pos: _this3.constants.pos }); + }); + }, + animateElements: function animateElements(newData) { + var newPos = newData.positions; + var newLabels = newData.labels; + var oldPos = this.oldData.positions; + var oldLabels = this.oldData.labels; + + var _equilizeNoOfElements = equilizeNoOfElements(oldPos, newPos); + + var _equilizeNoOfElements2 = _slicedToArray$3(_equilizeNoOfElements, 2); + + oldPos = _equilizeNoOfElements2[0]; + newPos = _equilizeNoOfElements2[1]; + + var _equilizeNoOfElements3 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements4 = _slicedToArray$3(_equilizeNoOfElements3, 2); + + oldLabels = _equilizeNoOfElements4[0]; + newLabels = _equilizeNoOfElements4[1]; + + + this.render({ + positions: oldPos, + labels: newLabels + }); + + return this.store.map(function (line, i) { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + } + }, + + xAxis: { + layerClass: 'x axis', + makeElements: function makeElements(data) { + var _this4 = this; + + return data.positions.map(function (position, i) { + return xLine(position, data.calcLabels[i], _this4.constants.height, { mode: _this4.constants.mode, pos: _this4.constants.pos }); + }); + }, + animateElements: function animateElements(newData) { + var newPos = newData.positions; + var newLabels = newData.calcLabels; + var oldPos = this.oldData.positions; + var oldLabels = this.oldData.calcLabels; + + var _equilizeNoOfElements5 = equilizeNoOfElements(oldPos, newPos); + + var _equilizeNoOfElements6 = _slicedToArray$3(_equilizeNoOfElements5, 2); + + oldPos = _equilizeNoOfElements6[0]; + newPos = _equilizeNoOfElements6[1]; + + var _equilizeNoOfElements7 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements8 = _slicedToArray$3(_equilizeNoOfElements7, 2); + + oldLabels = _equilizeNoOfElements8[0]; + newLabels = _equilizeNoOfElements8[1]; + + + this.render({ + positions: oldPos, + calcLabels: newLabels + }); + + return this.store.map(function (line, i) { + return translateVertLine(line, newPos[i], oldPos[i]); + }); + } + }, + + yMarkers: { + layerClass: 'y-markers', + makeElements: function makeElements(data) { + var _this5 = this; + + return data.map(function (m) { + return yMarker(m.position, m.label, _this5.constants.width, { labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed' }); + }); + }, + animateElements: function animateElements(newData) { + var _equilizeNoOfElements9 = equilizeNoOfElements(this.oldData, newData); + + var _equilizeNoOfElements10 = _slicedToArray$3(_equilizeNoOfElements9, 2); + + this.oldData = _equilizeNoOfElements10[0]; + newData = _equilizeNoOfElements10[1]; + + + var newPos = newData.map(function (d) { + return d.position; + }); + var newLabels = newData.map(function (d) { + return d.label; + }); + var newOptions = newData.map(function (d) { + return d.options; + }); + + var oldPos = this.oldData.map(function (d) { + return d.position; + }); + + this.render(oldPos.map(function (pos, i) { + return { + position: oldPos[i], + label: newLabels[i], + options: newOptions[i] + }; + })); + + return this.store.map(function (line, i) { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + } + }, + + yRegions: { + layerClass: 'y-regions', + makeElements: function makeElements(data) { + var _this6 = this; + + return data.map(function (r) { + return yRegion(r.startPos, r.endPos, _this6.constants.width, r.label, { labelPos: r.options.labelPos }); + }); + }, + animateElements: function animateElements(newData) { + var _equilizeNoOfElements11 = equilizeNoOfElements(this.oldData, newData); + + var _equilizeNoOfElements12 = _slicedToArray$3(_equilizeNoOfElements11, 2); + + this.oldData = _equilizeNoOfElements12[0]; + newData = _equilizeNoOfElements12[1]; + + + var newPos = newData.map(function (d) { + return d.endPos; + }); + var newLabels = newData.map(function (d) { + return d.label; + }); + var newStarts = newData.map(function (d) { + return d.startPos; + }); + var newOptions = newData.map(function (d) { + return d.options; + }); + + var oldPos = this.oldData.map(function (d) { + return d.endPos; + }); + var oldStarts = this.oldData.map(function (d) { + return d.startPos; + }); + + this.render(oldPos.map(function (pos, i) { + return { + startPos: oldStarts[i], + endPos: oldPos[i], + label: newLabels[i], + options: newOptions[i] + }; + })); + + var animateElements = []; + + this.store.map(function (rectGroup, i) { + animateElements = animateElements.concat(animateRegion(rectGroup, newStarts[i], newPos[i], oldPos[i])); + }); + + return animateElements; + } + }, + + heatDomain: { + layerClass: function layerClass() { + return 'heat-domain domain-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var _this7 = this; + + var _constants = this.constants, + index = _constants.index, + colWidth = _constants.colWidth, + rowHeight = _constants.rowHeight, + squareSize = _constants.squareSize, + xTranslate = _constants.xTranslate; + + var monthNameHeight = -12; + var x = xTranslate, + y = 0; + + this.serializedSubDomains = []; + + data.cols.map(function (week, weekNo) { + if (weekNo === 1) { + _this7.labels.push(makeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(), { + fontSize: 9 + })); + } + week.map(function (day, i) { + if (day.fill) { + var _data = { + 'data-date': day.yyyyMmDd, + 'data-value': day.dataValue, + 'data-day': i + }; + var square = heatSquare('day', x, y, squareSize, day.fill, _data); + _this7.serializedSubDomains.push(square); + } + y += rowHeight; + }); + y = 0; + x += colWidth; + }); + + return this.serializedSubDomains; + }, + animateElements: function animateElements(newData) { + if (newData) return []; + } + }, + + barGraph: { + layerClass: function layerClass() { + return 'dataset-units dataset-bars dataset-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var c = this.constants; + this.unitType = 'bar'; + this.units = data.yPositions.map(function (y, j) { + return datasetBar(data.xPositions[j], y, data.barWidth, c.color, data.labels[j], j, data.offsets[j], { + zeroLine: data.zeroLine, + barsWidth: data.barsWidth, + minHeight: c.minHeight + }); + }); + return this.units; + }, + animateElements: function animateElements(newData) { + var newXPos = newData.xPositions; + var newYPos = newData.yPositions; + var newOffsets = newData.offsets; + var newLabels = newData.labels; + + var oldXPos = this.oldData.xPositions; + var oldYPos = this.oldData.yPositions; + var oldOffsets = this.oldData.offsets; + var oldLabels = this.oldData.labels; + + var _equilizeNoOfElements13 = equilizeNoOfElements(oldXPos, newXPos); + + var _equilizeNoOfElements14 = _slicedToArray$3(_equilizeNoOfElements13, 2); + + oldXPos = _equilizeNoOfElements14[0]; + newXPos = _equilizeNoOfElements14[1]; + + var _equilizeNoOfElements15 = equilizeNoOfElements(oldYPos, newYPos); + + var _equilizeNoOfElements16 = _slicedToArray$3(_equilizeNoOfElements15, 2); + + oldYPos = _equilizeNoOfElements16[0]; + newYPos = _equilizeNoOfElements16[1]; + + var _equilizeNoOfElements17 = equilizeNoOfElements(oldOffsets, newOffsets); + + var _equilizeNoOfElements18 = _slicedToArray$3(_equilizeNoOfElements17, 2); + + oldOffsets = _equilizeNoOfElements18[0]; + newOffsets = _equilizeNoOfElements18[1]; + + var _equilizeNoOfElements19 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements20 = _slicedToArray$3(_equilizeNoOfElements19, 2); + + oldLabels = _equilizeNoOfElements20[0]; + newLabels = _equilizeNoOfElements20[1]; + + + this.render({ + xPositions: oldXPos, + yPositions: oldYPos, + offsets: oldOffsets, + labels: newLabels, + + zeroLine: this.oldData.zeroLine, + barsWidth: this.oldData.barsWidth, + barWidth: this.oldData.barWidth + }); + + var animateElements = []; + + this.store.map(function (bar, i) { + animateElements = animateElements.concat(animateBar(bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], { zeroLine: newData.zeroLine })); + }); + + return animateElements; + } + }, + + lineGraph: { + layerClass: function layerClass() { + return 'dataset-units dataset-line dataset-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var c = this.constants; + this.unitType = 'dot'; + this.paths = {}; + if (!c.hideLine) { + this.paths = getPaths(data.xPositions, data.yPositions, c.color, { + heatline: c.heatline, + regionFill: c.regionFill + }, { + svgDefs: c.svgDefs, + zeroLine: data.zeroLine + }); + } + + this.units = []; + if (!c.hideDots) { + this.units = data.yPositions.map(function (y, j) { + return datasetDot(data.xPositions[j], y, data.radius, c.color, c.valuesOverPoints ? data.values[j] : '', j); + }); + } + + return Object.values(this.paths).concat(this.units); + }, + animateElements: function animateElements(newData) { + var newXPos = newData.xPositions; + var newYPos = newData.yPositions; + var newValues = newData.values; + + var oldXPos = this.oldData.xPositions; + var oldYPos = this.oldData.yPositions; + var oldValues = this.oldData.values; + + var _equilizeNoOfElements21 = equilizeNoOfElements(oldXPos, newXPos); + + var _equilizeNoOfElements22 = _slicedToArray$3(_equilizeNoOfElements21, 2); + + oldXPos = _equilizeNoOfElements22[0]; + newXPos = _equilizeNoOfElements22[1]; + + var _equilizeNoOfElements23 = equilizeNoOfElements(oldYPos, newYPos); + + var _equilizeNoOfElements24 = _slicedToArray$3(_equilizeNoOfElements23, 2); + + oldYPos = _equilizeNoOfElements24[0]; + newYPos = _equilizeNoOfElements24[1]; + + var _equilizeNoOfElements25 = equilizeNoOfElements(oldValues, newValues); + + var _equilizeNoOfElements26 = _slicedToArray$3(_equilizeNoOfElements25, 2); + + oldValues = _equilizeNoOfElements26[0]; + newValues = _equilizeNoOfElements26[1]; + + + this.render({ + xPositions: oldXPos, + yPositions: oldYPos, + values: newValues, + + zeroLine: this.oldData.zeroLine, + radius: this.oldData.radius + }); + + var animateElements = []; + + if (Object.keys(this.paths).length) { + animateElements = animateElements.concat(animatePath(this.paths, newXPos, newYPos, newData.zeroLine)); + } + + 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 _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$$1(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$$1(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); } }; + +function _toConsumableArray(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 _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(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; } + +function _inherits(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 PercentageChart = function (_AggregationChart) { + _inherits(PercentageChart, _AggregationChart); + + function PercentageChart(parent, args) { + _classCallCheck$1(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 = 80; + 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 _createClass$5 = 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$2 = function get$$1(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$$1(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); } }; + +function _toConsumableArray$2(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 _classCallCheck$6(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn$2(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; } + +function _inherits$2(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 PieChart = function (_AggregationChart) { + _inherits$2(PieChart, _AggregationChart); + + function PieChart(parent, args) { + _classCallCheck$6(this, PieChart); + + var _this = _possibleConstructorReturn$2(this, (PieChart.__proto__ || Object.getPrototypeOf(PieChart)).call(this, parent, args)); + + _this.type = 'pie'; + _this.initTimeout = 0; + _this.init = 1; + + _this.setup(); + return _this; + } + + _createClass$5(PieChart, [{ + key: 'configure', + value: function configure(args) { + _get$2(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$2(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 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 = makeArcPathStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise); + + 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$2(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); + +var _slicedToArray$4 = 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"); } }; }(); + +function _toConsumableArray$4(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 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$4(_normalize, 2), + normalMaxValue = _normalize2[0], + exponent = _normalize2[1]; + + var normalMinValue = minValue ? minValue / Math.pow(10, exponent) : 0; + + // Allow only 7 significant digits + normalMaxValue = normalMaxValue.toFixed(6); + + var intervals = getChartRangeIntervals(normalMaxValue, normalMinValue); + intervals = intervals.map(function (value) { + return value * Math.pow(10, exponent); + }); + return intervals; +} + +function calcChartIntervals(values) { + var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + //*** Where the magic happens *** + + // Calculates best-fit y intervals from given values + // and returns the interval array + + var maxValue = Math.max.apply(Math, _toConsumableArray$4(values)); + var minValue = Math.min.apply(Math, _toConsumableArray$4(values)); + + // Exponent to be used for pretty print + var exponent = 0, + intervals = []; // eslint-disable-line no-unused-vars + + function getPositiveFirstIntervals(maxValue, absMinValue) { + var intervals = getChartIntervals(maxValue); + + var intervalSize = intervals[1] - intervals[0]; + + // Then unshift the negative values + var value = 0; + for (var i = 1; value < absMinValue; i++) { + value += intervalSize; + intervals.unshift(-1 * value); + } + return intervals; + } + + // CASE I: Both non-negative + + if (maxValue >= 0 && minValue >= 0) { + exponent = normalize(maxValue)[1]; + if (!withMinimum) { + intervals = getChartIntervals(maxValue); + } else { + intervals = getChartIntervals(maxValue, minValue); + } + } + + // CASE II: Only minValue negative + + else if (maxValue > 0 && minValue < 0) { + // `withMinimum` irrelevant in this case, + // We'll be handling both sides of zero separately + // (both starting from zero) + // Because ceil() and floor() behave differently + // in those two regions + + var absMinValue = Math.abs(minValue); + + if (maxValue >= absMinValue) { + exponent = normalize(maxValue)[1]; + intervals = getPositiveFirstIntervals(maxValue, absMinValue); + } else { + // Mirror: maxValue => absMinValue, then change sign + exponent = normalize(absMinValue)[1]; + var posIntervals = getPositiveFirstIntervals(absMinValue, maxValue); + intervals = posIntervals.map(function (d) { + return d * -1; + }); + } + } + + // CASE III: Both non-positive + + else if (maxValue <= 0 && minValue <= 0) { + // Mirrored Case I: + // Work with positives, then reverse the sign and array + + var pseudoMaxValue = Math.abs(minValue); + var pseudoMinValue = Math.abs(maxValue); + + exponent = normalize(pseudoMaxValue)[1]; + if (!withMinimum) { + intervals = getChartIntervals(pseudoMaxValue); + } else { + intervals = getChartIntervals(pseudoMaxValue, pseudoMinValue); + } + + intervals = intervals.reverse().map(function (d) { + return d * -1; + }); + } + + return intervals; +} + +function getZeroIndex(yPts) { + var zeroIndex = 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$4(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 _createClass$6 = 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; }; }(); + +function _toConsumableArray$3(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 _classCallCheck$7(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn$3(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; } + +function _inherits$3(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 COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE; +var ROW_HEIGHT = COL_WIDTH; +// const DAY_INCR = 1; + +var Heatmap = function (_BaseChart) { + _inherits$3(Heatmap, _BaseChart); + + function Heatmap(parent, options) { + _classCallCheck$7(this, Heatmap); + + var _this = _possibleConstructorReturn$3(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$6(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, + 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$3(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 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, 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 + }]; + } + + var overridingType = void 0; + if (AXIS_DATASET_CHART_TYPES.includes(type)) { + overridingType = type; + } + + datasets.map(function (d) { + // Set values + if (!d.values) { + d.values = zeroArray; + } else { + // Check for non values + var vals = d.values; + vals = vals.map(function (val) { + return !isNaN(val) ? val : 0; + }); + + // Trim or extend + if (vals.length > datasetLength) { + vals = vals.slice(0, datasetLength); + } else { + vals = fillArray(vals, datasetLength - vals.length, 0); + } + } + + // Set labels + + // Set type + if (overridingType) { + d.chartType = overridingType; + } else if (!d.chartType) { + d.chartType = AXIS_CHART_DEFAULT_TYPE; + } + }); + + // Markers + + // Regions + // data.yRegions = data.yRegions || []; + if (data.yRegions) { + data.yRegions.map(function (d) { + if (d.end < d.start) { + var _ref = [d.end, d.start]; + d.start = _ref[0]; + d.end = _ref[1]; + } + }); + } + + return data; +} + +function zeroDataPrep(realData) { + var datasetLength = realData.labels.length; + var zeroArray = new Array(datasetLength).fill(0); + + var zeroData = { + labels: realData.labels.slice(0, -1), + datasets: realData.datasets.map(function (d) { + return { + name: '', + values: zeroArray.slice(0, -1), + chartType: d.chartType + }; + }) + }; + + if (realData.yMarkers) { + zeroData.yMarkers = [{ + value: 0, + label: '' + }]; + } + + if (realData.yRegions) { + zeroData.yRegions = [{ + start: 0, + end: 0, + label: '' + }]; + } + + return zeroData; +} + +function getShortenedLabels(chartWidth) { + var labels = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var isSeries = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + var allowedSpace = chartWidth / labels.length; + if (allowedSpace <= 0) allowedSpace = 1; + var allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH; + + var 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 { + var multiple = Math.ceil(label.length / allowedLetters); + if (i % multiple !== 0) { + label = ""; + } + } + } + return label; + }); + + return calcLabels; +} + +var _createClass$7 = 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$3 = function get$$1(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$$1(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); } }; + +function _toConsumableArray$5(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 _classCallCheck$8(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn$4(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; } + +function _inherits$4(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 AxisChart = function (_BaseChart) { + _inherits$4(AxisChart, _BaseChart); + + function AxisChart(parent, args) { + _classCallCheck$8(this, AxisChart); + + var _this = _possibleConstructorReturn$4(this, (AxisChart.__proto__ || Object.getPrototypeOf(AxisChart)).call(this, parent, args)); + + _this.barOptions = args.barOptions || {}; + _this.lineOptions = args.lineOptions || {}; + + _this.init = 1; + + _this.setup(); + return _this; + } + + _createClass$7(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$3(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'configure', this).call(this, options); + + options.axisOptions = options.axisOptions || {}; + options.tooltipOptions = options.tooltipOptions || {}; + + this.config.xAxisMode = options.axisOptions.xAxisMode || 'span'; + this.config.yAxisMode = options.axisOptions.yAxisMode || 'span'; + this.config.xIsSeries = options.axisOptions.xIsSeries || 0; + + this.config.formatTooltipX = options.tooltipOptions.formatTooltipX; + this.config.formatTooltipY = options.tooltipOptions.formatTooltipY; + + this.config.valuesOverPoints = options.valuesOverPoints; + } + }, { + key: 'prepareData', + value: function prepareData() { + var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; + + return dataPrep(data, this.type); + } + }, { + key: 'prepareFirstData', + value: function prepareFirstData() { + var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; + + return zeroDataPrep(data); + } + }, { + key: 'calc', + value: function calc() { + var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + this.calcXPositions(); + if (!onlyWidthChange) { + this.calcYAxisParameters(this.getAllYValues(), this.type === 'line'); + } + this.makeDataByIndex(); + } + }, { + key: 'calcXPositions', + value: function calcXPositions() { + var s = this.state; + var labels = this.data.labels; + s.datasetLength = labels.length; + + s.unitWidth = this.width / s.datasetLength; + // Default, as per bar, and mixed. Only line will be a special case + s.xOffset = s.unitWidth / 2; + + // // For a pure Line Chart + // s.unitWidth = this.width/(s.datasetLength - 1); + // s.xOffset = 0; + + s.xAxis = { + labels: labels, + positions: labels.map(function (d, i) { + return floatTwo(s.xOffset + i * s.unitWidth); + }) + }; + } + }, { + key: 'calcYAxisParameters', + value: function calcYAxisParameters(dataValues) { + var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'false'; + + var yPts = calcChartIntervals(dataValues, withMinimum); + var scaleMultiplier = this.height / getValueRange(yPts); + var intervalHeight = getIntervalSize(yPts) * scaleMultiplier; + var zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; + + this.state.yAxis = { + labels: yPts, + positions: yPts.map(function (d) { + return zeroLine - d * scaleMultiplier; + }), + scaleMultiplier: scaleMultiplier, + zeroLine: zeroLine + }; + + // Dependent if above changes + this.calcDatasetPoints(); + this.calcYExtremes(); + this.calcYRegions(); + } + }, { + key: 'calcDatasetPoints', + value: function calcDatasetPoints() { + var s = this.state; + var scaleAll = function scaleAll(values) { + return values.map(function (val) { + return scale(val, s.yAxis); + }); + }; + + s.datasets = this.data.datasets.map(function (d, i) { + var values = d.values; + var cumulativeYs = d.cumulativeYs || []; + return { + name: d.name, + index: i, + chartType: d.chartType, + + values: values, + yPositions: scaleAll(values), + + cumulativeYs: cumulativeYs, + cumulativeYPos: scaleAll(cumulativeYs) + }; + }); + } + }, { + key: 'calcYExtremes', + value: function calcYExtremes() { + var s = this.state; + if (this.barOptions.stacked) { + s.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos; + return; + } + s.yExtremes = new Array(s.datasetLength).fill(9999); + s.datasets.map(function (d) { + d.yPositions.map(function (pos, j) { + if (pos < s.yExtremes[j]) { + s.yExtremes[j] = pos; + } + }); + }); + } + }, { + key: 'calcYRegions', + value: function calcYRegions() { + var s = this.state; + if (this.data.yMarkers) { + this.state.yMarkers = this.data.yMarkers.map(function (d) { + d.position = scale(d.value, s.yAxis); + if (!d.options) d.options = {}; + // if(!d.label.includes(':')) { + // d.label += ': ' + d.value; + // } + return d; + }); + } + if (this.data.yRegions) { + this.state.yRegions = this.data.yRegions.map(function (d) { + d.startPos = scale(d.start, s.yAxis); + d.endPos = scale(d.end, s.yAxis); + if (!d.options) d.options = {}; + return d; + }); + } + } + }, { + key: 'getAllYValues', + value: function getAllYValues() { + var _this2 = this, + _ref; + + var key = 'values'; + + if (this.barOptions.stacked) { + key = 'cumulativeYs'; + var cumulative = new Array(this.state.datasetLength).fill(0); + this.data.datasets.map(function (d, i) { + var values = _this2.data.datasets[i].values; + d[key] = cumulative = cumulative.map(function (c, i) { + return c + values[i]; + }); + }); + } + + var allValueLists = this.data.datasets.map(function (d) { + return d[key]; + }); + if (this.data.yMarkers) { + allValueLists.push(this.data.yMarkers.map(function (d) { + return d.value; + })); + } + if (this.data.yRegions) { + this.data.yRegions.map(function (d) { + allValueLists.push([d.end, d.start]); + }); + } + + return (_ref = []).concat.apply(_ref, _toConsumableArray$5(allValueLists)); + } + }, { + key: 'setupComponents', + value: function setupComponents() { + var _this3 = this; + + var componentConfigs = [['yAxis', { + mode: this.config.yAxisMode, + width: this.width + // pos: 'right' + }, function () { + return this.state.yAxis; + }.bind(this)], ['xAxis', { + mode: this.config.xAxisMode, + height: this.height + // pos: 'right' + }, function () { + var s = this.state; + s.xAxis.calcLabels = getShortenedLabels(this.width, s.xAxis.labels, this.config.xIsSeries); + + return s.xAxis; + }.bind(this)], ['yRegions', { + width: this.width, + pos: 'right' + }, function () { + return this.state.yRegions; + }.bind(this)]]; + + var barDatasets = this.state.datasets.filter(function (d) { + return d.chartType === 'bar'; + }); + var lineDatasets = this.state.datasets.filter(function (d) { + return d.chartType === 'line'; + }); + + var barsConfigs = barDatasets.map(function (d) { + var index = d.index; + return ['barGraph' + '-' + d.index, { + index: index, + color: _this3.colors[index], + stacked: _this3.barOptions.stacked, + + // same for all datasets + valuesOverPoints: _this3.config.valuesOverPoints, + minHeight: _this3.height * MIN_BAR_PERCENT_HEIGHT + }, function () { + var s = this.state; + var d = s.datasets[index]; + var stacked = this.barOptions.stacked; + + var spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO; + var barsWidth = s.unitWidth / 2 * (2 - spaceRatio); + var barWidth = barsWidth / (stacked ? 1 : barDatasets.length); + + var xPositions = s.xAxis.positions.map(function (x) { + return x - barsWidth / 2; + }); + if (!stacked) { + xPositions = xPositions.map(function (p) { + return p + barWidth * index; + }); + } + + var labels = new Array(s.datasetLength).fill(''); + if (this.config.valuesOverPoints) { + if (stacked && d.index === s.datasets.length - 1) { + labels = d.cumulativeYs; + } else { + labels = d.values; + } + } + + var offsets = new Array(s.datasetLength).fill(0); + if (stacked) { + offsets = d.yPositions.map(function (y, j) { + return y - d.cumulativeYPos[j]; + }); + } + + return { + xPositions: xPositions, + yPositions: d.yPositions, + offsets: offsets, + // values: d.values, + labels: labels, + + zeroLine: s.yAxis.zeroLine, + barsWidth: barsWidth, + barWidth: barWidth + }; + }.bind(_this3)]; + }); + + var lineConfigs = lineDatasets.map(function (d) { + var index = d.index; + return ['lineGraph' + '-' + d.index, { + index: index, + color: _this3.colors[index], + svgDefs: _this3.svgDefs, + heatline: _this3.lineOptions.heatline, + regionFill: _this3.lineOptions.regionFill, + hideDots: _this3.lineOptions.hideDots, + hideLine: _this3.lineOptions.hideLine, + + // same for all datasets + valuesOverPoints: _this3.config.valuesOverPoints + }, function () { + var s = this.state; + var d = s.datasets[index]; + var minLine = s.yAxis.positions[0] < s.yAxis.zeroLine ? s.yAxis.positions[0] : s.yAxis.zeroLine; + + return { + xPositions: s.xAxis.positions, + yPositions: d.yPositions, + + values: d.values, + + zeroLine: minLine, + radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE + }; + }.bind(_this3)]; + }); + + var markerConfigs = [['yMarkers', { + width: this.width, + pos: 'right' + }, function () { + return this.state.yMarkers; + }.bind(this)]]; + + componentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs); + + var optionals = ['yMarkers', 'yRegions']; + this.dataUnitComponents = []; + + this.components = new Map(componentConfigs.filter(function (args) { + return !optionals.includes(args[0]) || _this3.state[args[0]]; + }).map(function (args) { + var component = getComponent.apply(undefined, _toConsumableArray$5(args)); + if (args[0].includes('lineGraph') || args[0].includes('barGraph')) { + _this3.dataUnitComponents.push(component); + } + return [args[0], component]; + })); + } + }, { + key: 'makeDataByIndex', + value: function makeDataByIndex() { + var _this4 = this; + + this.dataByIndex = {}; + + var s = this.state; + var formatX = this.config.formatTooltipX; + var formatY = this.config.formatTooltipY; + var titles = s.xAxis.labels; + + titles.map(function (label, index) { + var values = _this4.state.datasets.map(function (set$$1, i) { + var value = set$$1.values[index]; + return { + title: set$$1.name, + value: value, + yPos: set$$1.yPositions[index], + color: _this4.colors[i], + formatted: formatY ? formatY(value) : value + }; + }); + + _this4.dataByIndex[index] = { + label: label, + formattedLabel: formatX ? formatX(label) : label, + xPos: s.xAxis.positions[index], + values: values, + yExtreme: s.yExtremes[index] + }; + }); + } + }, { + key: 'bindTooltip', + value: function bindTooltip() { + var _this5 = this; + + // NOTE: could be in tooltip itself, as it is a given functionality for its parent + this.container.addEventListener('mousemove', function (e) { + var m = _this5.measures; + var o = getOffset(_this5.container); + var relX = e.pageX - o.left - getLeftOffset(m); + var relY = e.pageY - o.top; + + if (relY < _this5.height + getTopOffset(m) && relY > getTopOffset(m)) { + _this5.mapTooltipXPosition(relX); + } else { + _this5.tip.hideTip(); + } + }); + } + }, { + key: 'mapTooltipXPosition', + value: function mapTooltipXPosition(relX) { + var s = this.state; + if (!s.yExtremes) return; + + var index = getClosestInArray(relX, s.xAxis.positions, true); + var dbi = this.dataByIndex[index]; + + this.tip.setValues(dbi.xPos + this.tip.offset.x, dbi.yExtreme + this.tip.offset.y, { name: dbi.formattedLabel, value: '' }, dbi.values, index); + + this.tip.showTip(); + } + }, { + key: 'renderLegend', + value: function renderLegend() { + var _this6 = this; + + var s = this.data; + if (s.datasets.length > 1) { + this.legendArea.textContent = ''; + s.datasets.map(function (d, i) { + var barWidth = AXIS_LEGEND_BAR_SIZE; + // let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right; + // let multiplier = s.datasets.length - i; + var rect = legendBar( + // rightEndPoint - multiplier * barWidth, // To right align + barWidth * i, '0', barWidth, _this6.colors[i], d.name); + _this6.legendArea.appendChild(rect); + }); + } + } + + // Overlay + + }, { + key: 'makeOverlay', + value: function makeOverlay$$1() { + var _this7 = this; + + if (this.init) { + this.init = 0; + return; + } + if (this.overlayGuides) { + this.overlayGuides.forEach(function (g) { + var o = g.overlay; + o.parentNode.removeChild(o); + }); + } + + this.overlayGuides = this.dataUnitComponents.map(function (c) { + return { + type: c.unitType, + overlay: undefined, + units: c.units + }; + }); + + if (this.state.currentIndex === undefined) { + this.state.currentIndex = this.state.datasetLength - 1; + } + + // Render overlays + this.overlayGuides.map(function (d) { + var currentUnit = d.units[_this7.state.currentIndex]; + + d.overlay = makeOverlay[d.type](currentUnit); + _this7.drawArea.appendChild(d.overlay); + }); + } + }, { + key: 'updateOverlayGuides', + value: function updateOverlayGuides() { + if (this.overlayGuides) { + this.overlayGuides.forEach(function (g) { + var o = g.overlay; + o.parentNode.removeChild(o); + }); + } + } + }, { + key: 'bindOverlay', + value: function bindOverlay() { + var _this8 = this; + + this.parent.addEventListener('data-select', function () { + _this8.updateOverlay(); + }); + } + }, { + key: 'bindUnits', + value: function bindUnits() { + var _this9 = this; + + this.dataUnitComponents.map(function (c) { + c.units.map(function (unit) { + unit.addEventListener('click', function () { + var index = unit.getAttribute('data-point-index'); + _this9.setCurrentDataPoint(index); + }); + }); + }); + + // Note: Doesn't work as tooltip is absolutely positioned + this.tip.container.addEventListener('click', function () { + var index = _this9.tip.container.getAttribute('data-point-index'); + _this9.setCurrentDataPoint(index); + }); + } + }, { + key: 'updateOverlay', + value: function updateOverlay$$1() { + var _this10 = this; + + this.overlayGuides.map(function (d) { + var currentUnit = d.units[_this10.state.currentIndex]; + updateOverlay[d.type](currentUnit, d.overlay); + }); + } + }, { + key: 'onLeftArrow', + value: function onLeftArrow() { + this.setCurrentDataPoint(this.state.currentIndex - 1); + } + }, { + key: 'onRightArrow', + value: function onRightArrow() { + this.setCurrentDataPoint(this.state.currentIndex + 1); + } + }, { + key: 'getDataPoint', + value: function getDataPoint() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentIndex; + + var s = this.state; + var data_point = { + index: index, + label: s.xAxis.labels[index], + values: s.datasets.map(function (d) { + return d.values[index]; + }) + }; + return data_point; + } + }, { + key: 'setCurrentDataPoint', + value: function setCurrentDataPoint(index) { + var s = this.state; + index = parseInt(index); + if (index < 0) index = 0; + if (index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1; + if (index === s.currentIndex) return; + s.currentIndex = index; + fire(this.parent, "data-select", this.getDataPoint()); + } + + // API + + }, { + key: 'addDataPoint', + value: function addDataPoint(label, datasetValues) { + var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.state.datasetLength; + + _get$3(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$3(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); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +// import MultiAxisChart from './charts/MultiAxisChart'; +var chartTypes = { + bar: AxisChart, + line: AxisChart, + // multiaxis: MultiAxisChart, + percentage: PercentageChart, + heatmap: Heatmap, + pie: PieChart +}; + +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); +}; + +export { Chart, PercentageChart, PieChart, Heatmap, AxisChart }; //# sourceMappingURL=frappe-charts.min.esm.js.map diff --git a/dist/frappe-charts.min.esm.js.map b/dist/frappe-charts.min.esm.js.map index 4f6cc82..7194012 100644 --- a/dist/frappe-charts.min.esm.js.map +++ b/dist/frappe-charts.min.esm.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.esm.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","../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"],"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 === \"onClick\" ) {\n\t\t\telement.addEventListener('click', val);\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\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, commonSelector, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`${commonSelector}.${activeClass}`);\n\n\tif (typeof $child === 'string') {\n\t\t$child = $parent.querySelector($child);\n\t}\n\n\tthis.forEachNode($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\nexport function insertAfter(newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\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\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 AXIS_CHART_DEFAULT_TYPE = 'line';\nexport const AXIS_CHART_MIXED_TYPE = 'axis-mixed';\nexport const AXIS_CHART_TYPES = ['line', 'bar', 'axis-mixed'];\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_CHART_OPTIONS = {\n\tbarOptions: {\n\t\tspaceRatio: 1,\n\t}\n}\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 1;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.01;\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};\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\nexport function toTitleCase(str) {\n return str.replace(/\\w*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});\n}\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","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/8027444/6495043\n\treturn /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(string);\n}\n\nexport const getColor = (color) => {\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr } from './draw-utils';\nimport { getStringWidth } 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;\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') {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 0 ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\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, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label) {\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label) {\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\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\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(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\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\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\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 } 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) {\n\tlet pathComponents = [];\n\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y));\n\tlet pathStr = pointsStr.join(\"L\");\n\n\tconst animPath = [paths.path, {d:\"M\"+pathStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pathStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } 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\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tlabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\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.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 { AXIS_CHART_DEFAULT_TYPE, AXIS_CHART_MIXED_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\tlet overridingType;\n\tif(AXIS_DATASET_CHART_TYPES.includes(type)) {\n\t\toverridingType = type;\n\t};\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t}\n\n\t\t// Set labels\n\n\t\t// Set type\n\t\tif(overridingType) {\n\t\t\td.chartType = overridingType;\n\t\t} else if(!d.chartType) {\n\t\t\td.chartType = AXIS_CHART_DEFAULT_TYPE;\n\t\t}\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 calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlet multiple = Math.ceil(label.length/allowedLetters);\n\t\t\t\tif(i % multiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","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';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","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 } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\n\nlet BOUND_DRAW_FN;\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || 'line';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tBOUND_DRAW_FN = this.boundDrawFn.bind(this);\n\t\twindow.addEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn.bind(this));\n\t}\n\n\tboundDrawFn() {\n\t\tthis.draw(true);\n\t}\n\n\tunbindWindowEvents() {\n\t\twindow.removeEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn.bind(this));\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t\tthis.parent.style.overflow = 'auto';\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { legendDot } from '../utils/draw';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(d[0]);\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 110;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${s.labels[i]}: ${d}`\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","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 = 80;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr } 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\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath = makeArcPathStr(curStart, curEnd, this.center, this.radius, this.clockWise);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","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\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","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.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth/2 * (2 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: s.yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\thideDots: this.lineOptions.hideDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tlet dbi = this.dataByIndex[index];\n\n\t\tthis.tip.setValues(\n\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\tdbi.values,\n\t\t\tindex\n\t\t);\n\n\t\tthis.tip.showTip();\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n"],"names":["$","expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isElementInViewport","el","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","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","slice","num","parseInt","b","g","toString","isValidColor","test","createSVG","tag","o","createElementNS","i","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","undefined","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","arcStartX","x","arcStartY","arcEndX","arcEndY","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","key","legendBar","label","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","l","LABEL_MARGIN","line","makeHoriLine","x1","x2","lineType","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","xList","yList","pointsStr","join","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","push","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","value","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","a","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","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","isNaN","mantissa","exponent","sig","isFinite","exp","floor","log10","pow","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","reverse","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","reduce","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","overridingType","AXIS_DATASET_CHART_TYPES","vals","chartType","AXIS_CHART_DEFAULT_TYPE","yRegions","end","zeroDataPrep","realData","zeroData","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","getChartByType","AxisChart","chartTypes","error","addEventListener","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","DOT_OVERLAY_SIZE_INCR","PERCENTAGE_BAR_DEFAULT_HEIGHT","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","HEATMAP_GUTTER_SIZE","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","HEATMAP_COLORS_GREEN","DEFAULT_COLORS","PI","FULL_ANGLE","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","title","dataPointList","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BOUND_DRAW_FN","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","bind","draw","removeEventListener","makeContainer","updateWidth","independentWidth","overflow","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","_this","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","animate","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this3","event","keyCode","chartSvg","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","divisor","NO_OF_YEAR_MONTHS","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","transition","newData","xPositions","widths","barHeight","barDepth","positions","position","newPos","newLabels","oldPos","oldLabels","calcLabels","_this4","_this5","newOptions","startPos","endPos","_this6","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","barWidth","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","COL_WIDTH","ROW_HEIGHT","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","noOfWeeks","setFullYear","dataPoints","points","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","moreText","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","xAxis","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","stacked","yExtremes","cumulativeYPos","cumulative","allValueLists","barDatasets","lineDatasets","barsConfigs","spaceRatio","p","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","Chart"],"mappings":"8WAAA,QAAgBA,GAAEC,EAAMC,SACA,gBAATD,IAAoBC,GAAOC,UAAUC,cAAcH,GAAQA,GAAQ,KA+ClF,QAAgBI,WAAUC,MACrBC,GAAOD,EAAQE,mCAKbD,EAAKE,KAAON,SAASO,gBAAgBC,WAAaR,SAASS,KAAKD,gBAC/DJ,EAAKM,MAAQV,SAASO,gBAAgBI,YAAcX,SAASS,KAAKE,aAI1E,QAAgBC,qBAAoBC,MAE/BT,GAAOS,EAAGR,8BAGbD,GAAKE,KAAO,GACNF,EAAKM,MAAQ,GACbN,EAAKU,SAAWC,OAAOC,aAAehB,SAASO,gBAAgBU,iBAC1DC,QAAUH,OAAOI,YAAcnB,SAASO,gBAAgBa,aAIrE,QAAgBC,wBAAuBlB,MAClCmB,GAASP,OAAOQ,iBAAiBpB,GACjCqB,EAAUC,WAAWH,EAAOI,aAC/BD,WAAWH,EAAOK,oBAEZxB,GAAQiB,YAAcI,EA2B9B,QAAgBI,MAAKC,EAAQC,EAAMC,MAC9BC,GAAMhC,SAASiC,YAAY,gBAE3BC,UAAUJ,GAAM,GAAM,OAErB,GAAIK,KAAKJ,KACTI,GAAKJ,EAAWI,SAGdN,GAAOO,cAAcJ,GCxE7B,QAAgBK,cAAaC,SACrBA,GAAEC,YAAcD,EAAEE,QAAQlC,IAAMgC,EAAEG,SAASnC,IAGnD,QAAgBoC,eAAcJ,SACtBA,GAAEE,QAAQ9B,KAAO4B,EAAEG,SAAS/B,KAGpC,QAAgBiC,gBAAeL,SACPA,GAAEE,QAAQlC,IAAMgC,EAAEE,QAAQ1B,OAC9CwB,EAAEG,SAASnC,IAAMgC,EAAEG,SAAS3B,OAC5BwB,EAAEC,YAAcD,EAAEM,aAItB,QAAgBC,eAAcP,SACPA,GAAEE,QAAQ9B,KAAO4B,EAAEE,QAAQtB,MAC9CoB,EAAEG,SAAS/B,KAAO4B,EAAEG,SAASvB,oHCnD1B,QAAS4B,UAASC,SACjBtB,YAAWsB,EAAEC,QAAQ,IAyC7B,QAAgBC,WAAUC,EAAOC,EAAOhD,MAASiD,0DAC5CjD,OACOiD,EAAQF,EAAM,GAAKA,EAAMA,EAAMG,OAAS,OAE/CC,GAAc,GAAIC,OAAMC,KAAKC,IAAIN,IAAQO,KAAKvD,YAC1CiD,EAAQE,EAAYK,OAAOT,GAASA,EAAMS,OAAOL,GAS1D,QAAgBM,gBAAeC,EAAQC,UAC9BD,EAAO,IAAIR,OAASS,EAyB7B,QAAgBC,oBAAmBC,EAAOC,YAErCT,KAAKU,IAAIF,EAAQG,aAAeF,IAChCT,KAAKY,IAAIJ,EAAQG,aAAeF,GCzF9B,QAASI,sBAAqBC,EAAMC,MACtCC,UAAQC,eACRH,IAAQC,KACFA,EAAWD,IAChBA,MAEKA,EAAOC,IACZA,IAGGC,EAAQC,GAGjB,QAAgBC,sBAAqBC,EAAQC,MAC5CC,0DAAaD,EAAOvB,OAASsB,EAAOtB,aAGjCwB,GAAa,IACN5B,UAAU0B,EAAQE,KAElB5B,UAAU2B,EAAQC,IAEpBF,EAAQC,GCPjB,QAASE,YAAWC,SACfA,GAAI,IAAY,IACXA,EAAI,EAAU,EAChBA,EAGR,QAAgBC,oBAAmBC,EAAOC,MACrCC,GAAMC,SAASH,GACfI,GAAW,CACD,MAAVF,EAAI,OACDA,EAAIG,MAAM,MACL,MAERC,GAAMC,SAASL,EAAI,IACnBJ,EAAID,YAAYS,GAAO,IAAML,GAC7BO,EAAIX,YAAaS,GAAO,EAAK,KAAUL,GACvCQ,EAAIZ,YAAkB,IAANS,GAAkBL,UAC9BG,EAAS,IAAI,KAAOK,EAAKD,GAAK,EAAMV,GAAK,IAAKY,SAAS,IAGhE,QAAgBC,cAAa/B,8CAEgBgC,KAAKhC,GC5BlD,QAAShE,KAAEC,EAAMC,SACO,gBAATD,IAAoBC,GAAOC,UAAUC,cAAcH,GAAQA,GAAQ,KAGlF,QAAgBgG,WAAUC,EAAKC,MAC1B7F,GAAUH,SAASiG,gBAAgB,6BAA8BF,OAEhE,GAAIG,KAAKF,GAAG,IACZG,GAAMH,EAAEE,MAEF,WAANA,MACDC,GAAKC,YAAYjG,OAEf,IAAU,WAAN+F,EAAgB,IACpBG,GAAMxG,IAAEsG,KACRG,WAAWC,aAAapG,EAASkG,KAC7BD,YAAYC,OAEJ,WAANH,EACQ,qBAARC,wBAAAA,YACFK,KAAKL,GAAKM,IAAI,cACZC,MAAMC,GAAQR,EAAIQ,MAInB,cAANT,MAAyB,SACnB,cAANA,IACF,YAAyBC,IAEjBS,aAAaV,EAAGC,UAKpBhG,GAGR,QAAS0G,wBAAuBC,EAAYC,SACpCjB,WAAU,yBACRgB,KACJC,KACA,KACA,KACA,KACA,IAIN,QAASC,iBAAgBC,EAAUC,EAAQjC,EAAOkC,SAC1CrB,WAAU,eACNmB,uBACchC,SACdiC,iBACMC,IAIlB,QAAgBC,kBAAiBC,EAAQC,EAAWC,EAAO/C,SACnDsB,WAAU,iBACLwB,SACHD,QACDE,SACC/C,IAIV,QAAgBgD,aAAYC,SACpB3B,WAAU,eACR2B,IAIV,QAAgBC,cAAaJ,MAAWK,0DAAU,GAAIN,6DAAOO,GACxDC,aACQP,YACAK,SAETN,KAAQQ,EAAKC,OAAST,GAClBvB,UAAU,IAAK+B,GAWvB,QAAgBE,UAASC,SACjBlC,WAAU,yEAD0B,KAGvCkC,wEAHkD,mEAAa,UAWpE,QAAgBC,gBAAeC,EAAeC,EAAaC,EAAQnE,MAAQoE,0DAAU,EAC/EC,EAAyBF,EAAOG,EAAIL,EAAcK,EAAvCC,EAA0CJ,EAAO3D,EAAIyD,EAAczD,EAC9EgE,EAAqBL,EAAOG,EAAIJ,EAAYI,EAAnCG,EAAsCN,EAAO3D,EAAI0D,EAAY1D,YAEhE2D,EAAOG,MAAKH,EAAO3D,YAC1B6D,MAAaE,aACZvE,MAAUA,WAAcoE,EAAY,EAAI,YAC1CI,MAAWC,OAGf,QAAgBC,cAAa7B,EAAY7B,MAAO2D,2DAC3C7B,EAAY,sBAA6B9B,EAAQ,KAAM2D,EAAU,UAAY,WAC7EC,EAAchC,uBAAuBC,EAAYC,GACjD+B,GAAa,EAAG,GAAK,UACtBF,QACW,GAAK,GAAK,oBAGRC,EAAa,KAAM5D,EAAO6D,EAAU,oBACpCD,EAAa,MAAO5D,EAAO6D,EAAU,oBACrCD,EAAa,OAAQ5D,EAAO6D,EAAU,IAE/C/B,EAGR,QAAgBgC,eAAcR,EAAG9D,EAAG8C,EAAO/C,MAC1CwE,0DAAMC,6BAA8BvF,yDAAK,aAkBlCoC,WAAU,kBAfL,mBACRyC,IACA9D,QACI8C,SACC/C,OACFd,iBAEKsB,mBAAmBtB,GAAO,8BAGVc,EAAS+C,QAAUA,OAAU/C,iBACvCwE,KAOnB,QAAgBE,YAAW5B,EAAWiB,EAAG9D,EAAG0E,MAAMzF,0DAAK,OAAQ0F,4DAC1DvB,aACQP,IACRiB,IACA9D,QACI0E,SACCA,OACFzF,iBAGA8C,KAAK4C,GAAM3C,IAAI,cAChB4C,GAAOD,EAAKC,KAGXvD,UAAU,OAAQ+B,GAG1B,QAAgByB,WAAUf,EAAG9D,EAAG0E,MAAMzF,0DAAK,OAAQ6F,eAC9C1B,aACQ,eACR,IACA,QACIsB,SACC,WACFzF,GAEH8F,EAAO1D,UAAU,kBACT,wBACR,IACA,KACc,EAAZ2D,UAAiB,iBACI,IAAZA,UAAmB,mBAClB,aACTC,oBACKH,IAGRI,EAAQ7D,UAAU,4BACGyC,OAAM9D,iBAEzB2B,YAAYN,UAAU,OAAQ+B,MAC9BzB,YAAYoD,GAEXG,EAGR,QAAgBC,WAAUrB,EAAG9D,EAAG0E,MAAMzF,0DAAK,OAAQ6F,eAC9C1B,aACQ,gBACP,KACA,IACDsB,OACGzF,GAEH8F,EAAO1D,UAAU,kBACT,wBACR,IACA,KACE2D,UAAa,QACbA,UAAU,EAAK,iBACM,IAAZA,UAAmB,mBAClB,aACTC,oBACKH,IAGRI,EAAQ7D,UAAU,4BACGyC,OAAM9D,iBAEzB2B,YAAYN,UAAU,SAAU+B,MAChCzB,YAAYoD,GAEXG,EAGR,QAAgBE,UAASvC,EAAWiB,EAAG9D,EAAGqF,MAASC,6DAC9CC,EAAWD,EAAQC,UAAYP,gBAI5B3D,WAAU,kBACLwB,IACRiB,IACA9D,UANoBmD,KAAfmC,EAAQE,GAAmBF,EAAQE,GAAMD,EAAW,GAOnD,iBACIA,EAAW,UAPdD,EAAQrG,MAAQgG,wBACVK,EAAQG,YAAc,kBAS3BJ,IAIb,QAASK,cAAa5B,EAAGgB,EAAOa,EAAIC,MAAIN,4DACnCA,GAAQO,SAAQP,EAAQO,OAASC,oBACjCC,GAAI1E,UAAU,kBACN,iBAAmBiE,EAAQzC,aAClC,KACA,KACA8C,KACAC,iBAEKN,EAAQO,UAIdd,EAAO1D,UAAU,UACjB,IACAsE,EAAKC,EAAKD,EAAKK,aAAeL,EAAKK,aAAehB,aACjDA,UAAY,iBACHA,UAAY,mBACV,mBACJF,EAAQ,KAGhBmB,EAAO5E,UAAU,4BACKyC,oBAGrBnC,YAAYoE,KACZpE,YAAYoD,GAEVkB,EAGR,QAASC,cAAalG,EAAG8E,EAAOqB,EAAIC,MAAId,4DACnCA,GAAQO,SAAQP,EAAQO,OAASC,iBACjCR,EAAQe,WAAUf,EAAQe,SAAW,OAIrCN,GAAI1E,UAAU,kBAHF,mBAAqBiE,EAAQzC,WACtB,WAArByC,EAAQe,SAAwB,SAAU,OAIvCF,KACAC,KACA,KACA,iBAEKd,EAAQO,UAIdd,EAAO1D,UAAU,UACjB8E,EAAKC,EAAKD,EAAKH,aAAeG,EAAKH,eACnC,KACEhB,UAAY,EAAI,EAAK,iBACbA,UAAY,mBACVmB,EAAKC,EAAK,MAAQ,kBACtBtB,EAAM,KAGdmB,EAAO5E,UAAU,+BACOrB,uBACT,UAGP,KAAT+E,GAAuB,MAATA,MACX9C,MAAM4D,OAAS,2BAGhBlE,YAAYoE,KACZpE,YAAYoD,GAEVkB,EAGR,QAAgBK,OAAMtG,EAAG8E,EAAOhC,MAAOwC,4DAClCA,GAAQiB,MAAKjB,EAAQiB,IAAM,QAC3BjB,EAAQ7C,SAAQ6C,EAAQ7C,OAAS,GACjC6C,EAAQkB,OAAMlB,EAAQkB,KAAO,QAC7BlB,EAAQO,SAAQP,EAAQO,OAASC,iBACjCR,EAAQzC,YAAWyC,EAAQzC,UAAY,OAEvCsD,IAAM,EAAIM,iBACVL,EAAsB,SAAjBd,EAAQkB,KAAkB1D,EAAQ2D,iBAAmB,QAE1C,SAAjBnB,EAAQkB,MAAmC,UAAhBlB,EAAQiB,QAChCzD,EAAQ2D,mBACR3D,MAKAwC,EAAQ7C,UACR6C,EAAQ7C,OAEPyD,aAAalG,EAAG8E,EAAOqB,EAAIC,UACzBd,EAAQO,iBACLP,EAAQzC,mBACTyC,EAAQe,WAIpB,QAAgBK,OAAM5C,EAAGgB,EAAO/E,MAAQuF,4DACnCA,GAAQiB,MAAKjB,EAAQiB,IAAM,UAC3BjB,EAAQ7C,SAAQ6C,EAAQ7C,OAAS,GACjC6C,EAAQkB,OAAMlB,EAAQkB,KAAO,QAC7BlB,EAAQO,SAAQP,EAAQO,OAASC,iBACjCR,EAAQzC,YAAWyC,EAAQzC,UAAY,OAavC8C,GAAK5F,EAAS0G,iBACdb,EAAsB,SAAjBN,EAAQkB,MAAmB,EAAIC,iBAAmB1G,QAEvC,SAAjBuF,EAAQkB,MAAmC,QAAhBlB,EAAQiB,SAE/B,EAAIE,mBACL,GAGCf,aAAa5B,EAAGgB,EAAOa,EAAIC,UACzBN,EAAQO,iBACLP,EAAQzC,mBACTyC,EAAQe,WAIpB,QAAgBM,SAAQ3G,EAAG8E,EAAOhC,MAAOwC,4DACpCA,GAAQsB,WAAUtB,EAAQsB,SAAW,YAIrCC,GAAWxF,UAAU,kBACb,gBAJiB,SAArBiE,EAAQsB,SAAsBZ,aACnClD,EAAQ3D,eAAe2F,EAAO,GAAKkB,eAKlC,KACEhB,WAAa,EAAK,iBACVA,UAAY,mBACV,kBACJF,EAAM,KAGdmB,EAAOC,aAAalG,EAAG,GAAI,EAAG8C,UACzBwC,EAAQO,QAAUC,0BACfR,EAAQzC,WAAa,YACtByC,EAAQe,oBAGd1E,YAAYkF,GAEVZ,EAGR,QAAgBa,SAAQnB,EAAIC,EAAI9C,EAAOgC,MAAOQ,6DAEzCvF,EAAS4F,EAAKC,EAEdjK,EAAO0F,UAAU,6EAIXyE,mCACehD,OAAU/C,KAG/B,IACA,QACI+C,SACC/C,GAGLuF,GAAQsB,WAAUtB,EAAQsB,SAAW,YAIrCC,GAAWxF,UAAU,kBACb,gBAJiB,SAArBiE,EAAQsB,SAAsBZ,aACnClD,EAAQ3D,eAAe2F,EAAM,GAAI,KAAOkB,eAKvC,KACEhB,WAAa,EAAK,iBACVA,UAAY,mBACV,kBACJF,EAAM,KAGdiC,EAAS1F,UAAU,+BACKuE,iBAGrBjE,YAAYhG,KACZgG,YAAYkF,GAEZE,EAGR,QAAgBC,YAAWlD,EAAGjE,EAAMiD,EAAOtC,MAAOsE,0DAAM,GAAImC,yDAAM,EAAGxE,yDAAO,EAAGyE,8DAC5DtH,qBAAqBC,EAAMqH,EAAKpH,gCAA7CC,OAAQC,UACRyC,EAES,IAAX1C,MACOmH,EAAKC,aACTD,EAAKC,cAGPxL,GAAO0F,UAAU,4CAEJb,qBACIyG,IACjBnD,IACA9D,QACI8C,SACC/C,WAGA,KAEK+E,EAAMlG,OAEb,GACDuD,aAAa,IAAK,KAClBA,aAAa,IAAK,MACnB4C,GAAO1D,UAAU,kBACT,qBACRyB,EAAM,IACN,KACEkC,UAAY,GAAK,EAAK,iBACdA,UAAY,mBACV,mBACJF,IAGRI,EAAQ7D,UAAU,wBACD4F,yBACInD,OAAM9D,iBAEzB2B,YAAYhG,KACZgG,YAAYoD,GAEXG,QArBAvJ,GAyBT,QAAgByL,YAAWtD,EAAG9D,EAAGR,EAAQgB,MAAOsE,0DAAM,GAAImC,yDAAM,EAC3DI,EAAMhG,UAAU,yBACHb,qBACIyG,KAChBnD,KACA9D,IACDR,WAGK,KAEKsF,EAAMlG,OAEb,GACFuD,aAAa,KAAM,KACnBA,aAAa,KAAM,MAEnB4C,GAAO1D,UAAU,kBACT,qBACR,IACA,KACE2D,UAAY,GAAK,EAAIxF,EAAU,iBACvBwF,UAAY,mBACV,mBACJF,IAGRI,EAAQ7D,UAAU,wBACD4F,yBACInD,OAAM9D,iBAEzB2B,YAAY0F,KACZ1F,YAAYoD,GAEXG,QAtBAmC,GA0BT,QAAgBC,UAASC,EAAOC,EAAOhH,MAAO8E,6DAAY4B,4DAErDO,EADaD,EAAMxF,IAAI,SAAChC,EAAGyB,SAAO8F,GAAM9F,GAAK,IAAMzB,IAC5B0H,KAAK,KAC5BC,EAAOrE,SAAS,IAAImE,EAAW,kBAAmBjH,MAGnD8E,EAAQsC,SAAU,IAChBC,GAAc3D,aAAagD,EAAKY,QAAStH,KACxCyB,MAAM4D,eAAiBgC,SAGzBE,SACGJ,MAIJrC,EAAQ0C,WAAY,IAClBC,GAAqB/D,aAAagD,EAAKY,QAAStH,GAAO,GAEvD+C,EAAU,IAASgE,EAAM,OAAML,EAAKpH,aAAc2H,MAAgBF,EAAM1G,OAAO,GAAG,OAAMqG,EAAKpH,WAC3FiH,OAASzD,SAASC,gBAAwB,eAAgB0E,aAG1DF,GCviBR,QAAgBG,WAAUC,EAAMC,EAAUC,EAAUC,MAC/CC,GAA0B,gBAAbH,GAAwBA,EAAWA,EAASV,KAAK,aAEjES,GACCjF,UAAWmF,EAASX,KAAK,OAC1BY,EACAE,WACA,aACCtF,UAAWqF,IAId,QAAgBE,mBAAkB/B,EAAOgC,EAAMC,SACvCT,WAAUxB,GAAQiC,EAAM,IAAKD,EAAM,GAAIE,sBAG/C,QAAgBC,mBAAkBvC,EAAOwC,EAAMC,SACvCb,WAAU5B,GAAQ,EAAGyC,IAAQ,EAAGD,GAAOF,sBAG/C,QAAgBI,eAAcC,EAAWC,EAAOC,EAAOC,MAClDC,GAAYH,EAAQC,EACpBxN,EAAOsN,EAAUK,WAAW,WAG/B3N,GACEoE,OAAQsJ,EAAWE,mBAHV5N,EAAK6N,aAAa,cAGyBH,GACtDT,qBACAJ,YAGeN,UAAUe,GAAY,EAAGG,IAAS,EAAGD,GAAQP,uBAI9D,QAAgBa,YAAWC,EAAK5F,EAAGjE,EAAMiD,MAAOL,0DAAO,IACpC7C,qBAAqBC,8DAAWC,kCAA7CC,OAAQC,iBACRyC,EACe,SAAjBiH,EAAIC,WACKD,EAAIJ,WAAW,IAGxBxG,MAAOA,EAAO/C,OAAQA,GACvB6J,cACApB,YAIeN,UAAUwB,EADRA,EAAIF,aAAa,aAAaK,MAAM,KAAK,GAAGhJ,MAAM,GAAI,IAC3BiD,EAAG9D,GAAI4I,yBAG3Cc,GAAM5G,MAAOA,EAAO/C,OAAQA,EAAQ+D,EAAGA,EAAG9D,EAAGA,GAAI4J,cAAepB,aAK3E,QAAgBsB,YAAWzC,EAAKvD,EAAG9D,SACd,WAAjBqH,EAAIsC,UAEUzB,UAAUb,EADRA,EAAImC,aAAa,aAAaK,MAAM,KAAK,GAAGhJ,MAAM,GAAI,IAC3BiD,EAAG9D,GAAI4I,yBAG3CvB,GAAM0C,GAAIjG,EAAGkG,GAAIhK,GAAI4J,cAAepB,aAK/C,QAAgByB,aAAYlC,EAAOmC,EAAUC,EAAUrK,MAClDsK,MAGA7G,EADY4G,EAASnI,IAAI,SAAChC,EAAGyB,SAAOyI,GAASzI,GAAK,IAAMzB,IACpC0H,KAAK,KAEvB2C,GAAYtC,EAAMJ,MAAOrJ,EAAE,IAAIiF,GAAU+G,cAAe9B,iBAC/C+B,KAAKF,GAEjBtC,EAAMhB,OAAQ,IACZyD,GAAgBN,EAAS,OAAMpK,MAC/B2K,MAAeP,EAASrJ,OAAO,GAAG,QAAOf,EAEvC4K,GACL3C,EAAMhB,QACLzI,EAAE,IAAMkM,EAAajH,EAAUkH,GAChCH,cACA9B,cAEc+B,KAAKG,SAGdN,GAGR,QAAgBO,gBAAeC,EAASrH,UAC/BqH,GAAUtM,EAAGiF,GAAUqG,cAAepB,uJCzF/C,QAASqC,mBAAkBnP,EAASoP,EAAOC,MAAKC,0DAAW,SAAU3N,6DAAK8F,GAAW8H,4DAEhFC,EAAcxP,EAAQyP,WAAU,GAChCC,EAAa1P,EAAQyP,WAAU,OAE/B,GAAIE,KAAiBP,GAAO,IAC3BQ,YACiB,cAAlBD,EACe9P,SAASiG,gBAAgB,6BAA8B,oBAEvDjG,SAASiG,gBAAgB,6BAA8B,cAErE+J,GAAeN,EAAUI,IAAkB3P,EAAQ8N,aAAa6B,GAChEG,EAAQV,EAAMO,GAEdI,iBACYJ,OACTE,KACFC,QACG,SACFT,EAAI,IAAO,WACRQ,EAAe,IAAMC,aACjBE,OAAOV,YACT,eACA,cACJ,SAGJ3N,OACF,KAAmBA,OAGf,GAAIoE,KAAKgK,KACEtJ,aAAaV,EAAGgK,EAAShK,MAG7BE,YAAY2J,GAErBjO,IACS8E,aAAakJ,eAA4BG,SAEzCrJ,aAAakJ,EAAeG,UAIjCN,EAAaE,GAGtB,QAAgBlI,WAAUxH,EAASuG,KAC1BA,MAAMiB,UAAYjB,IAClBA,MAAM0J,gBAAkB1J,IACxBA,MAAM2J,YAAc3J,IACpBA,MAAM4J,aAAe5J,IACrBA,MAAM6J,WAAa7J,EAG5B,QAAS8J,YAAW/I,EAAcgJ,MAC7BC,MACAC,OAEKlK,IAAI,eACRmG,GAAOzM,EAAQ,GACfkH,EAASuF,EAAKtG,WAEdqJ,SAAaE,WAET,GAAKjD,QACe0C,oDAAqBnP,4CAErC6O,KAAKa,KACJb,MAAMW,EAAatI,MAEzBuJ,aAAajB,EAAa/C,QAG9BiE,GAAUpJ,EAAamI,WAAU,YAExBnJ,IAAI,SAACkJ,EAAazJ,KAClB,GAAG0K,aAAaF,EAAYxK,GAAIyJ,EAAY,MAC/CzJ,GAAG,GAAKwK,EAAYxK,KAGvB2K,EAGR,QAAgBC,kBAAiBzJ,EAAQ0J,EAAYC,MACpB,IAA7BA,EAAkB3N,WAEjB4N,GAAiBT,WAAWO,EAAYC,EACzCD,GAAWzK,YAAce,MACpB6J,YAAYH,KACZ3K,YAAY6K,eAKT,WACPA,EAAe3K,YAAce,MACxB6J,YAAYD,KACZ7K,YAAY2K,KAElBI,sBC/GG,QAASC,cAAaC,EAAUjI,MAClCkI,GAAItR,SAASuR,cAAc,OAC7B7K,MAAQ,mBACN8K,GAAO,GAAIC,MAAKrI,GAAOtH,KAAM,iCAC7B4P,EAAM3Q,OAAO4Q,IAAIC,gBAAgBJ,KACnCK,KAAOH,IACPI,SAAWT,WACJ5Q,KAAK2F,YAAYkL,KACxBS,mBACS,oBACDtR,KAAKyQ,YAAYI,UACnBK,IAAIK,gBAAgBN,IACzB,KAGJ,QAAgBO,kBAAiBC,MAC5BC,GAAQD,EAAItC,WAAU,KACpBwC,UAAUC,IAAI,qBACdzL,aAAa,QAAS,gCACtBA,aAAa,cAAe,mCAC9B0L,GAAUzS,EAAE0S,OAAO,mBACTC,YAERjM,aAAa+L,EAASH,EAAMM,eAE9BC,GAAY7S,EAAE0S,OAAO,gBACfnM,YAAY+L,GAEfO,EAAUC,yuBCblB,QAASC,YAAWC,MACfC,GAAS,GAAIC,MAAKF,YACfG,WAAWF,EAAOG,aAAeH,EAAOI,qBACxCJ,EAGR,QAAgBK,aAAYN,MACvBO,GAAKP,EAAKQ,UACVC,EAAKT,EAAKU,WAAa,SAE1BV,EAAKW,eACJF,EAAG,EAAI,GAAK,KAAOA,GACnBF,EAAG,EAAI,GAAK,KAAOA,GACnBjH,KAAK,KAGR,QAAgBgG,OAAMU,SACd,IAAIE,MAAKF,EAAKY,WAiBtB,QAAgBC,iBAAgBC,EAAWC,MACtCC,GAAgBC,eAAeH,SAC5BnQ,MAAKuQ,KAAKC,eAAeH,EAAeD,GAAWK,oBAG3D,QAAgBD,gBAAeL,EAAWC,MACrCM,GAAqBC,WAAaC,oBAC9BxB,WAAWgB,GAAWhB,WAAWe,IAAcO,EAGxD,QAAgBG,gBAAeV,EAAWC,SAClCD,GAAUJ,aAAeK,EAAQL,YACpCI,EAAUH,gBAAkBI,EAAQJ,cAGzC,QAAgBc,cAAapO,MAAGqO,2DAC3BC,EAAYC,YAAYvO,SACrBqO,GAAQC,EAAUlP,MAAM,EAAG,GAAKkP,EAGxC,QAAgBE,oBAAoBC,EAAOC,SACnC,IAAI7B,MAAK6B,EAAMD,EAAQ,EAAG,GAIlC,QAAgBb,gBAAejB,MAC1BgC,GAAU1C,MAAMU,GACdiC,EAAMD,EAAQE,eACT,KAARD,WACMD,GAAW,EAAKC,GAElBD,EAIR,QAAgBG,SAAQnC,EAAMoC,KACxBC,QAAQrC,EAAKQ,UAAY4B,iHC8U/B,QAAgBE,cAAaC,EAAMC,EAAWC,MACzC9O,GAAO+O,OAAO/O,KAAKgP,kBAAkBC,OAAO,kBAAKL,GAAKM,SAASC,KAC/DC,EAASJ,iBAAiBhP,EAAK,kBAC5BqP,OAAOD,aACFP,UACFC,IAEH,GAAIQ,gBAAeF,goDC7a3B,QAESG,WAAUxN,MAKX,IAAJA,SACM,EAAG,MAETyN,MAAMzN,UACA0N,UAAW,iBAAkBC,SAAU,QAE5CC,GAAM5N,EAAI,EAAI,GAAK,MACnB6N,SAAS7N,UACJ0N,SAAgB,iBAANE,EAAwBD,SAAU,OAGjD1S,KAAKC,IAAI8E,MACT8N,GAAM7S,KAAK8S,MAAM9S,KAAK+S,MAAMhO,WAGxB4N,GAFE5N,EAAE/E,KAAKgT,IAAI,GAAIH,IAENA,GAGpB,QAASI,wBAAuBC,MAAKC,0DAAI,EACpCC,EAAapT,KAAKuQ,KAAK2C,GACvBG,EAAarT,KAAK8S,MAAMK,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,MACI/Q,EAAI,EAAGA,GAAK6Q,EAAW7Q,MACpB8I,KAAK6H,EAAaG,EAAW9Q,SAEjC+Q,GAGR,QAASC,mBAAkBC,MAAUC,0DAAS,IACZrB,UAAUoB,2BAAtCE,OAAgBnB,OACjBoB,EAAiBF,EAAWA,EAAS5T,KAAKgT,IAAI,GAAIN,GAAW,EAK7De,EAAYR,yBAFCY,EAAerU,QAAQ,GAEesU,YAC3CL,EAAUxQ,IAAI,kBAASwJ,GAAQzM,KAAKgT,IAAI,GAAIN,KAIzD,QAAgBqB,oBAAmBC,WAYzBC,GAA0BN,EAAUO,OAOxC,GANAT,GAAYC,kBAAkBC,GAE9BQ,EAAeV,EAAU,GAAKA,EAAU,GAGxChH,EAAQ,EACJ/J,EAAI,EAAG+J,EAAQyH,EAAaxR,OAC1ByR,IACCC,SAAU,EAAK3H,SAEnBgH,MAvBkCY,2DAMtCV,EAAW3T,KAAKkT,oCAAOc,IACvBJ,EAAW5T,KAAKmT,oCAAOa,IAGTP,QAkBfE,GAAY,GAAKC,GAAY,EACpBrB,UAAUoB,GAAU,KAC3BU,EAGSX,kBAAkBC,EAAUC,GAF5BF,kBAAkBC,OAQ3B,IAAGA,EAAW,GAAKC,EAAW,EAAG,IAOjCM,GAAclU,KAAKC,IAAI2T,EAExBD,IAAYO,GACH3B,UAAUoB,GAAU,KACnBM,EAA0BN,EAAUO,KAGrC3B,UAAU2B,GAAa,KACfD,EAA0BC,EAAaP,GACjC1Q,IAAI,mBAAW,EAAN1D,SAO/B,IAAGoU,GAAY,GAAKC,GAAY,EAAG,IAInCU,GAAiBtU,KAAKC,IAAI2T,GAC1BW,EAAiBvU,KAAKC,IAAI0T,EAEnBpB,WAAU+B,GAAgB,QACjCD,EAGSX,kBAAkBY,EAAgBC,GAFlCb,kBAAkBY,IAKTE,UAAUvR,IAAI,mBAAW,EAAN1D,UAGnCkU,GAGR,QAAgBgB,cAAaC,MAExBC,GAAWC,gBAAgBF,SAC5BA,GAAKG,QAAQ,IAAM,EAGTH,EAAKG,QAAQ,GAChBH,EAAK,GAAK,GAIL,EADJA,EAAK,GACUC,GAKX,EADJD,EAAKA,EAAK7U,OAAS,GACJ8U,GAAYD,EAAK7U,OAAS,GAiBrD,QAAgB+U,iBAAgBE,SACxBA,GAAa,GAAKA,EAAa,GAGvC,QAAgBC,eAAcD,SACtBA,GAAaA,EAAajV,OAAO,GAAKiV,EAAa,GAG3D,QAAgBE,OAAMrS,EAAKsS,SACnB3V,UAAS2V,EAAMlU,SAAW4B,EAAMsS,EAAMC,iBAY9C,QAAgBC,mBAAkBC,EAAMC,MAAKnN,2DACxCoN,EAAUD,EAAIE,OAAO,SAASC,EAAMC,SAC/BzV,MAAKC,IAAIwV,EAAOL,GAAQpV,KAAKC,IAAIuV,EAAOJ,GAAQK,EAAOD,UAGzDtN,GAAQmN,EAAIR,QAAQS,GAAWA,EAGvC,QAAgBI,kBAAiB1B,EAAQ2B,OASpC,GALAC,GAAe5V,KAAKkT,oCAAOc,IAE3B6B,EAAmB,GAAKF,EAAmB,GAC3CG,KAEIpT,EAAI,EAAGA,EAAIiT,EAAkBjT,IAAK,IACrCqT,GAAaH,GAAgBC,EAAmBnT,KACvC8I,KAAKuK,SAGZD,GAGR,QAAgBE,kBAAiBvJ,EAAOqJ,SAChCA,GAAa7D,OAAO,kBAAK1S,GAAIkN,IAAO5M,mwBC1OrC,QAASoW,UAASrQ,EAAMtH,KACzB4X,OAAStQ,EAAKsQ,cAEfC,GAAgBvQ,EAAKsQ,OAAOrW,OAG5BuW,EAAWxQ,EAAKwQ,SAChBC,EAAY,GAAItW,OAAMoW,GAAejW,KAAK,EAC1CkW,gBAGMC,QAINC,gBACDC,0BAAyBrE,SAAS5T,OACnBA,KAGT2E,IAAI,eAER1D,EAAEyU,OAEC,IAEFwC,GAAOjX,EAAEyU,YACNwC,EAAKvT,IAAI,kBAASuP,OAAM7P,GAAa,EAANA,KAG9B9C,OAASsW,EACTK,EAAK1U,MAAM,EAAGqU,GAEd1W,UAAU+W,EAAML,EAAgBK,EAAK3W,OAAQ,UAVnDmU,OAASqC,CAiBTC,KACAG,UAAYH,EACJ/W,EAAEkX,cACVA,UAAYC,2BAQb9Q,EAAK+Q,YACFA,SAAS1T,IAAI,eACd1D,EAAEqX,IAAMrX,EAAEK,MAAO,QACCL,EAAEqX,IAAKrX,EAAEK,SAA1BA,aAASgX,YAKRhR,EAGR,QAAgBiR,cAAaC,MACxBX,GAAgBW,EAASZ,OAAOrW,OAChCwW,EAAY,GAAItW,OAAMoW,GAAejW,KAAK,GAE1C6W,UACKD,EAASZ,OAAOpU,MAAM,GAAI,YACxBgV,EAASV,SAASnT,IAAI,wBAExB,UACEoT,EAAUvU,MAAM,GAAI,aACjBvC,EAAEkX,oBAKbK,GAASE,aACFA,iBAEA,QACA,MAKPF,EAASH,aACFA,iBAEA,MACF,QACE,MAKHI,EAGR,QAAgBE,oBAAmBC,MAAYhB,6DAAWiB,6DACrDC,EAAeF,EAAahB,EAAOrW,MACpCuX,IAAgB,IAAGA,EAAe,MACjCC,GAAiBD,EAAeE,yBAEnBpB,GAAOjT,IAAI,SAAC8C,EAAOrD,aAC1B,IACA7C,OAASwX,IAEbF,EAQAzU,EADY1C,KAAKuQ,KAAKxK,EAAMlG,OAAOwX,IAClB,MACX,MARNA,EAAe,EAAI,EACbtR,EAAMjE,MAAM,EAAGuV,EAAe,GAAK,OAEnCtR,EAAMjE,MAAM,EAAGuV,GAAkB,MASrCtR,42BC3GT,QAASwR,qBAAed,0DAAY,OAAQ5S,eAAQ0C,qBACjC,eAAdkQ,KACKnY,KAAO,OACR,GAAIkZ,WAAU3T,EAAQ0C,IAGzBkR,WAAWhB,GAKT,GAAIgB,YAAWhB,GAAW5S,EAAQ0C,gBAJhCmR,MAAM,yBAA2BjB,6+FbV3Cpa,GAAE0S,OAAS,SAACxM,EAAKC,MACZ7F,GAAUH,SAASuR,cAAcxL,OAEhC,GAAIG,KAAKF,GAAG,IACZG,GAAMH,EAAEE,MAEF,WAANA,IACDC,GAAKC,YAAYjG,OAEf,IAAU,WAAN+F,EAAgB,IACpBG,GAAMxG,EAAEsG,KACRG,WAAWC,aAAapG,EAASkG,KAC7BD,YAAYC,OAEJ,YAANH,IACFiV,iBAAiB,QAAShV,GAElB,WAAND,EACQ,qBAARC,sBAAAA,YACFK,KAAKL,GAAKM,IAAI,cACZC,MAAMC,GAAQR,EAAIQ,KAGlBT,IAAK/F,KACP+F,GAAKC,IAGLS,aAAaV,EAAGC,SAInBhG,GC3BD,IAAMib,6BAEN,UACG,QACF,SACC,kBAGF,UACG,QACF,SACC,eAGI,gBAEC,gBACC,iBAEC,IAyBHC,0BAA4B,IAC5BC,2BAA6B,IAE7BpB,wBAA0B,OAG1BH,0BAA4B,OAAQ,OAQpCwB,qBAAuB,IAEvBC,sBAAwB,EACxBC,uBAAyB,IAEzBC,oBAAsB,EACtBC,sBAAwB,EAExBC,8BAAgC,GAChC3S,6BAA+B,EAI/B4S,0BAA4B,EAE5BC,oBAAsB,GACtBC,oBAAsB,EAEtBjB,mBAAqB,EAErBkB,gCAAkC,EAEzCC,sBAAwB,aAAc,OAAQ,SAAU,MAAO,SACpE,SAAU,QAAS,cAAe,SAAU,UAAW,aAAc,aAChEC,sBAAwB,UAAW,UAAW,UAAW,UAAW,WAI7DC,oBACPF,0BACCA,yBACDA,gCACOA,6BACHC,sBAIG/X,YAAcX,KAAK4Y,GAAK,IACxBC,WAAa,sQa/GLC,wCAEnBjV,OAAAA,aAAS,WACTkV,OAAAA,iDAEKlV,OAASA,OACTkV,OAASA,OACTC,UAAY,QACZC,WAAa,QACbC,mBACAC,gBAAkB,OAElBpU,EAAI,OACJ9D,EAAI,OAEJnE,IAAM,OACNI,KAAO,OAEPkc,oEAIAC,qDAIAnZ,YACAoZ,qEAIApK,UAAY7S,EAAE0S,OAAO,cACjBwK,KAAK1V,iBACF,8JAKP2V,eAEAC,MAAQF,KAAKrK,UAAUzS,cAAc,eACrCid,cAAgBH,KAAKrK,UAAUzS,cAAc,yBAE7CoH,OAAO8T,iBAAiB,aAAc,aACrC6B,sDAKFC,QACDF,MAAKrR,YACFgH,UAAU9L,aAAa,mBAAoBmW,KAAKrR,SAEnDqR,KAAKJ,2BACYI,KAAKN,uBAAsBM,KAAKP,UAExCO,KAAKP,qBAAoBO,KAAKN,4BAErCQ,MAAMtK,UAAYsK,OAClBC,cAAcvK,UAAY,QAE1B+J,WAAWjW,IAAI,SAAC0W,EAAKjX,MACnBjB,GAAQmY,EAAKb,OAAOrW,IAAM,QAC5B+J,EAA0B,IAAlBkN,EAAIE,WAAmBF,EAAIE,UAAYF,EAAIE,UAAYF,EAAIlN,MAEnEqN,EAAKzd,EAAE0S,OAAO,wCAEWtN,iDAE6B,IAAVgL,GAAeA,EAAQA,EAAQ,6BAC3EkN,EAAIF,MAAQE,EAAIF,MAAQ,QAGvBC,cAAc9W,YAAYkX,+CAK5B/V,GAAQwV,KAAKrK,UAAU6K,iBAEtBjd,IAAMyc,KAAKtY,EAAIsY,KAAKrK,UAAU8K,aAChCxB,qCACEtb,KAAOqc,KAAKxU,EAAIhB,EAAM,KACvBkW,GAAUV,KAAK1V,OAAOkW,YAAchW,EAEpCmW,EAAUX,KAAKrK,UAAUzS,cAAc,mBAExC8c,KAAKrc,KAAO,IACNgG,MAAMhG,oBAAsB,EAAIqc,KAAKrc,gBACxCA,KAAO,MACN,IAAGqc,KAAKrc,KAAO+c,EAAS,IAE1BE,kBADQZ,KAAKrc,KAAO+c,WAEhB/W,MAAMhG,KAAOid,OAEhBjd,KAAO+c,SAEJ/W,MAAMhG,6CAIN6H,EAAG9D,MAAGwY,6DAAYP,4DAAiBhR,0DAAS,OAChD8Q,UAAYS,EAAM7H,UAClBqH,WAAaQ,EAAMhN,WACnByM,WAAaA,OACbnU,EAAIA,OACJ9D,EAAIA,OACJkY,gBAAkBM,EAAMW,YAAc,OACtClS,MAAQA,OACRmS,iDAIAnL,UAAUhM,MAAMpG,IAAM,WACtBoS,UAAUhM,MAAMhG,KAAO,WACvBgS,UAAUhM,MAAMS,QAAU,2CAI1BuL,UAAUhM,MAAMpG,IAAMyc,KAAKzc,IAAM,UACjCoS,UAAUhM,MAAMhG,KAAOqc,KAAKrc,KAAO,UACnCgS,UAAUhM,MAAMS,QAAU,aV5H3B2W,+BACS,eACN,iBACE,cACH,iBACG,iBACA,gBACD,wBACM,iBACL,kBACC,gBACF,eACD,uBACM,sBACD,WA4BD1Y,SAAW,SAACH,SACjB6Y,kBAAiB7Y,IAAUA,0oBCtCtBiG,iBAAmB,EAC1BT,aAAe,EACRhB,UAAY,GACnBc,gBAAkB,UAClBb,UAAY,UA0iBPqU,iBACH,SAACnR,MACHoR,SACiB,UAAlBpR,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkQ,GAAUrR,EAAKgD,qBACXlJ,MAAMhD,KAAO,YACbgD,MAAMS,QAAU,MAErB6W,KACMpX,aAAa,YAAaoX,GAE5BC,OAGD,SAACrR,MACHoR,SACiB,YAAlBpR,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkQ,GAAUrR,EAAKgD,YACf3L,EAAS2I,EAAKqB,aAAa,KAC3BvK,EAAOkJ,EAAKqB,aAAa,iBACrBrH,aAAa,IAAKpB,SAASvB,GAAU0X,yBACrC/U,aAAa,OAAQlD,KACrBgD,MAAMS,QAAU,MAErB6W,KACMpX,aAAa,YAAaoX,GAE5BC,eAGO,SAACrR,MACXoR,SACiB,YAAlBpR,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkQ,GAAUrR,EAAKgD,YACf3L,EAAS2I,EAAKqB,aAAa,KAC3BvK,EAAOkJ,EAAKqB,aAAa,iBACrBrH,aAAa,IAAKpB,SAASvB,GAAU0X,yBACrC/U,aAAa,OAAQlD,KACrBgD,MAAMS,QAAU,MAErB6W,KACMpX,aAAa,YAAaoX,GAE5BC,IAIEC,mBACH,SAACtR,EAAMqR,MACTD,SACiB,UAAlBpR,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoQ,IAAc,IAAK,IAAK,QAAS,iBAC9B3G,OAAO5K,EAAKuR,YACjB1I,OAAO,kBAAQ0I,GAAWzI,SAAS0I,EAAKhJ,OAASgJ,EAAKC,YACtD5X,IAAI,cACIG,aAAawX,EAAKhJ,KAAMgJ,EAAKE,aAGpCN,KACMpX,aAAa,YAAaoX,QAI7B,SAACpR,EAAMqR,MACTD,SACiB,YAAlBpR,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoQ,IAAc,KAAM,aACjB3G,OAAO5K,EAAKuR,YACjB1I,OAAO,kBAAQ0I,GAAWzI,SAAS0I,EAAKhJ,OAASgJ,EAAKC,YACtD5X,IAAI,cACIG,aAAawX,EAAKhJ,KAAMgJ,EAAKE,aAGpCN,KACMpX,aAAa,YAAaoX,gBAIrB,SAACpR,EAAMqR,MACjBD,SACiB,YAAlBpR,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoQ,IAAc,KAAM,aACjB3G,OAAO5K,EAAKuR,YACjB1I,OAAO,kBAAQ0I,GAAWzI,SAAS0I,EAAKhJ,OAASgJ,EAAKC,YACtD5X,IAAI,cACIG,aAAawX,EAAKhJ,KAAMgJ,EAAKE,aAGpCN,KACMpX,aAAa,YAAaoX,0bC5pBxB3P,cAAgB,IAChBU,cAAgB,IAChB1B,qBAAuBgB,cACvB8C,oBAAsB,IAEtBlE,WAAa,8bCHpBkD,aACC,yBACE,iBAEA,wBACC,uBACE,iBQVCqC,QAAU,48DCSnB+L,qBAEiBC,gCACRnX,EAAQ0C,qCAEd1C,OAA2B,gBAAXA,GAClBrH,SAASC,cAAcoH,GACvBA,IAEG0V,KAAK1V,iBAAkBoX,mBACtB,IAAIC,OAAM,uDAGZC,aAAe5U,OAEfkT,MAAQlT,EAAQkT,OAAS,QACzBnb,KAAOiI,EAAQjI,MAAQ,YAEvBwY,SAAWyC,KAAK6B,YAAY7U,EAAQX,WACpCA,KAAO2T,KAAK8B,iBAAiB9B,KAAKzC,eAElCiC,OAASQ,KAAK+B,eAAe/U,EAAQwS,OAAQQ,KAAKjb,WAElD8T,oBACS,aACD,cACC7L,EAAQgV,aAAe,UAC3B,QAGLC,SAAWC,KAAKC,MAAMD,KAAKE,UAAU/D,mBACtC9Y,GAAIya,KAAKiC,cACRI,YAAYrV,GACbgT,KAAKE,MAAM5Z,WAAYd,YAAc,GACrCwa,KAAKnH,OAAOyJ,aAAY/c,EAAEM,aAAe,QACxC0c,UAAYvV,EAAQvF,QAAUlC,EAAEid,gBAEhCC,cACAzV,gBAEA0V,YAAcpE,0BAEhB0B,KAAKnH,OAAOmJ,mBACTW,kBAGDC,UAAU5V,8DAGJX,SACJA,4CAGSA,SACTA,0CAGOmT,EAAQza,MAChB8d,gBACIrD,OAAc5Y,OAAOwY,eAAera,KACvC+d,QAAQ,SAAChc,MACToB,GAAQG,SAASvB,EACnB+B,cAAaX,KAGJ+J,KAAK/J,WAFT6a,KAAK,IAAMjc,EAAS,6BAKvB+b,gFASHpb,GAASuY,KAAKuC,eACbC,WAAa/a,OACbA,OAASA,EAAS7B,eAAeoa,KAAKiC,wBAG3BjC,KAAKgD,YAAYC,KAAKjD,aAC/B5B,iBAAiB,SAAUoD,sBAC3BpD,iBAAiB,oBAAqB4B,KAAKgD,YAAYC,KAAKjD,kDAI9DkD,MAAK,uDAIHC,oBAAoB,SAAU3B,sBAC9B2B,oBAAoB,oBAAqBnD,KAAKgD,YAAYC,KAAKjD,4CAKjEoD,qBACAC,mBACAvD,mBAEAoD,MAAK,GAAO,gDAKZ5Y,OAAOsL,UAAY,MAEpB9K,WACKkV,KAAK1V,iBACF,kBAGT0V,MAAKsD,qBACF/e,QAAWiG,MAAOwV,KAAKsD,iBAAmB,WAC1ChZ,OAAOX,MAAM4Z,SAAW,aAGzB5N,UAAY7S,EAAE0S,OAAO,MAAO1K,8CAI5B0Y,IAAM,GAAIjE,gBACNS,KAAKrK,iBACLqK,KAAKR,cAETiE,+FAKDC,0DAAuBC,+DACtBN,mBAEAO,KAAKF,QACLG,qBACAC,uBAEAC,WAAWjB,QAAQ,kBAAKkB,GAAEnE,MAAMoE,EAAKC,iBAErCC,OAAOnE,KAAK+D,YAAY,GAE1BJ,SACGtX,KAAO2T,KAAKzC,oBACN,aAAY6G,OAAOH,EAAK5X,OAAS2T,KAAK0C,mBAG7C2B,oBAEAC,gBAAgBX,8EAMhBY,UAAYjgB,uBAAuB0b,KAAK1V,aACxCE,MAAQwV,KAAKuE,UAAYze,cAAcka,KAAKiC,kDAI9CjC,KAAK7K,UACFQ,UAAUxB,YAAY6L,KAAK7K,QAE7B5P,GAAIya,KAAKiC,cAER9M,IAAM9K,iBACV2V,KAAKrK,UACL,qBACAqK,KAAKuE,UACLvE,KAAKwC,iBAEDhT,QAAU/E,YAAYuV,KAAK7K,KAE7B6K,KAAKE,MAAM5Z,cACRke,QAAU1X,SACd,QACAvH,EAAEE,QAAQ9B,KACV4B,EAAEE,QAAQlC,IACVyc,KAAKE,gBAEM3a,EAAEkf,mBACN,aACFlf,EAAEkf,oBAKLlhB,GAAM+B,aAAaC,QAClB2e,SAAWvZ,aACfqV,KAAKjb,KAAO,sCACCY,cAAcJ,QAAOhC,OAGhCyc,KAAKnH,OAAOyJ,gBACPtC,KAAKvY,OAASlC,EAAEG,SAAS3B,YAC3B2gB,WAAa/Z,aACjB,4BACahF,cAAcJ,QAAOhC,QAIjCyc,KAAKE,MAAM5Z,aAAe6O,IAAI9L,YAAY2W,KAAKwE,cAC7CrP,IAAI9L,YAAY2W,KAAKkE,UACvBlE,KAAKnH,OAAOyJ,iBAAmBnN,IAAI9L,YAAY2W,KAAK0E,iBAElDC,gBAAgBhf,cAAcJ,GAAID,aAAaC,4CAGrCiG,EAAG9D,QACb8b,IAAIrZ,UACLqB,IACA9D,kDAIoBqc,WAAa,GAAIa,oCAEnCvY,GACFA,WACK8R,MAAM,2BAEV9R,KAAO2T,KAAK6B,YAAYxV,QACxBuX,YACAO,qDAGCJ,yDAAW/D,KAAK+D,WAAYc,4DAC/B7E,MAAKnH,OAAOmJ,kBAETW,SAASjZ,IAAI,kBAAKT,GAAEM,WAAW4K,YAAYlL,QAG7CgL,QAEO6O,QAAQ,cACE7O,EAAkBrN,OAAOod,EAAEI,OAAOS,MAEpD5Q,EAAkB3N,OAAS,oBACZ0Z,KAAKrK,UAAWqK,KAAK7K,IAAKlB,cAChC,aACC6O,QAAQ,kBAAKkB,GAAEc,WACrBC,aACHxG,gCAEQuE,QAAQ,kBAAKkB,GAAEc,cACrBC,iDAKH/E,KAAKnH,OAAOmJ,mBACThB,mBACAgE,0GAMSrB,yDACX3D,MAAKnH,OAAOmJ,aAEb2B,SACGsB,mBAEAC,eACElF,KAAKmF,WAAWlC,KAAKjD,SACrBA,KAAKoF,YAAYnC,KAAKjD,SACtBA,KAAKqF,UAAUpC,KAAKjD,SACpBA,KAAKsF,aAAarC,KAAKjD,SACvBA,KAAKuF,YAAYtC,KAAKjD,gBAGpB5B,iBAAiB,UAAW,SAACoH,GAClC3hB,oBAAoB4hB,EAAK9P,eACvB6P,GAAKxhB,OAAO0hB,MACbD,EAAKP,WAAWM,EAAEG,YACfT,WAAWM,EAAEG,mmBA2BlBC,GAAW1Q,iBAAiB8K,KAAK7K,kBACxB6K,KAAKE,OAAS,SAAU0F,4gBCtTlBC,wCACRvb,EAAQQ,wHACbR,EAAQQ,8EAGLA,gGACOA,QAEX+N,OAAOiN,UAAYhb,EAAKgb,WAAa,QACrCjN,OAAOkN,gBAAkBjb,EAAKib,iBAAmB,6CAIlDC,EAAIhG,KAAKyC,MACTqD,EAAY9F,KAAKnH,OAAOiN,YAC1BG,kBAEEC,GAAYlG,KAAK3T,KAAKsQ,OAAOjT,IAAI,SAAC8C,EAAOrD,MACxCgd,GAAQ,WACP9Z,KAAKwQ,SAASnT,IAAI,eACb8b,EAAE/K,OAAOtR,MAEXgd,EAAO3Z,KACbkM,OAAO,kBAAc1S,GAAE,IAAM,IAE5BogB,EAASF,KACVA,EAAU5f,OAASwf,EAAW,GAEtBO,KAAK,SAAC9R,EAAG7L,SAAeA,GAAE,GAAK6L,EAAE,OAElC2R,EAAU3d,MAAM,EAAGud,EAAU,MAGlCQ,GAAiB,CAFLJ,GAAU3d,MAAMud,EAAU,GAGhCpc,IAAI,eAAwB1D,EAAE,OACjCiM,MAAMqU,EAAgB,cACxB9G,OAAOsG,EAAU,GAAK,SAG1BnJ,YACKjT,IAAI,cACRuc,YAAYhU,KAAKjM,EAAE,MACnB2W,OAAO1K,KAAKjM,EAAE,QAGfugB,WAAaP,EAAEC,YAAYjK,OAAO,SAACzH,EAAG7L,SAAM6L,GAAI7L,GAAG,QAEhD2C,UACD2U,KAAKxV,MAAQ,IACbwV,KAAKvY,OAAS,qDAKdue,EAAIhG,KAAKyC,WACRiC,WAAW8B,YAAc,QACzBC,aAAeT,EAAEC,YAAY1d,MAAM,EAAGyX,KAAKnH,OAAOkN,oBAEnD3f,GAAQ,EACRsB,EAAI,OACH+e,aAAa/c,IAAI,SAAC1D,EAAGmD,MAErBud,GAAUjgB,KAAK8S,OACjBkM,EAAKjb,MAAQ1E,cAAc2f,EAAKxD,WAFnB,IAIZ7b,GAAQsgB,MACF,KACH,OAGF3X,GAAMlC,UATK,IAQIzG,EAAQ,EAG1BsB,EACA,EACA+d,EAAKjG,OAAOrW,GACT6c,EAAErJ,OAAOxT,QAAOnD,KAEf0e,WAAWrb,YAAY0F,gBA7Ee0S,WRFjCkF,kBAAoB,GACpBzP,mBAAqB,EAErBG,aAAe,IACfD,WAAa,MAEbM,aAAe,UAAW,WAAY,QAAS,QAAS,MACpE,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAIlDkP,iBAAmB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,8rBCNpE7N,gDAEJ8N,WAAAA,aAAa,SACbC,eAAAA,aAAiB,KACjBxO,IAAAA,UAEAC,IAAAA,QACAwO,IAAAA,aACAC,IAAAA,+CAEKF,eAAiBA,OACjBxO,UAAYA,OAEZyO,aAAeA,OACfxO,QAAUA,OAEVyO,gBAAkBA,OAElBC,cACAtK,eAEAkK,WAAaA,OACbA,WAAyC,kBAArB7G,MAAK6G,WAC3B7G,KAAK6G,aAAe7G,KAAK6G,gBAEvB/F,iEAGEzU,QACFA,KAAOA,GAAQ2T,KAAKzH,wCAGpBjO,QACA4c,MAAQvc,aAAaqV,KAAK6G,WAAY7G,KAAK8G,eAAgBxc,uCAI3D6Z,OAAOnE,KAAK3T,WACZ8a,QAAUnH,KAAK3T,oCAGdA,mBACD4a,MAAQjH,KAAK+G,aAAa1a,QAE1B6a,MAAMV,YAAc,QACpBS,MAAMnE,QAAQ,cACboE,MAAM7d,YAAYjG,UAEnBuZ,OAAOmG,QAAQ,cACdoE,MAAM7d,YAAYjG,yCAIlByhB,mEACD/D,aACDkG,YACDnC,OACgB7E,KAAKgH,gBAAgBhH,KAAK3T,WAEtC2a,WAILvO,wCAEU,mCACCpM,SACLA,GAAK+a,aAAa1d,IAAI,SAACsc,EAAG7c,MAC5BZ,GAAQyC,SAASgb,EAAG,WAAY,OAAQ3Z,EAAKmT,OAAOrW,aAClDQ,MAAM0d,WAAa,iBAClB9e,8BAIO+e,SACRtH,MAAKiH,MAAMvd,IAAI,SAACnB,EAAOY,SAC7BkJ,gBAAe9J,EAAO+e,EAAQF,aAAaje,mCAKjC,wCACCkD,oBACLA,GAAKkb,WAAW7d,IAAI,SAAC8B,EAAGrC,SAEpB6C,eAAcR,EADhB,EACsBa,EAAKmb,OAAOre,GACzCkX,EAAK/H,UAAUmP,UAAWpH,EAAK/H,UAAUoP,SAAUrb,EAAKmT,OAAOrW,gCAKlDme,MACZA,EAAS,6BAID,+BACCjb,oBACLA,GAAKsb,UAAUje,IAAI,SAACke,EAAUze,SACpC6E,OAAM4Z,EAAUvb,EAAKsQ,OAAOxT,GAAIsc,EAAKnN,UAAU9N,OAC7C0D,KAAMuX,EAAKnN,UAAUpK,KAAMD,IAAKwX,EAAKnN,UAAUrK,kCAInCqZ,MACXO,GAASP,EAAQK,UACjBG,EAAYR,EAAQ3K,OACpBoL,EAAS/H,KAAKmH,QAAQQ,UACtBK,EAAYhI,KAAKmH,QAAQxK,SAEVhV,qBAAqBogB,EAAQF,+CACvBlgB,qBAAqBqgB,EAAWF,qDAEpD3D,kBACO4D,SACHD,IAGF9H,KAAKiH,MAAMvd,IAAI,SAACiE,EAAMxE,SACrBoH,mBACN5C,EAAMka,EAAO1e,GAAI4e,EAAO5e,0BAOf,+BACCkD,oBACLA,GAAKsb,UAAUje,IAAI,SAACke,EAAUze,SACpCiF,OAAMwZ,EAAUvb,EAAK4b,WAAW9e,GAAI+e,EAAK5P,UAAU7Q,QACjDyG,KAAMga,EAAK5P,UAAUpK,KAAMD,IAAKia,EAAK5P,UAAUrK,kCAInCqZ,MACXO,GAASP,EAAQK,UACjBG,EAAYR,EAAQW,WACpBF,EAAS/H,KAAKmH,QAAQQ,UACtBK,EAAYhI,KAAKmH,QAAQc,aAEVtgB,qBAAqBogB,EAAQF,+CACvBlgB,qBAAqBqgB,EAAWF,qDAEpD3D,kBACO4D,aACCD,IAGN9H,KAAKiH,MAAMvd,IAAI,SAACiE,EAAMxE,SACrBgH,mBACNxC,EAAMka,EAAO1e,GAAI4e,EAAO5e,6BAOf,kCACCkD,oBACLA,GAAK3C,IAAI,kBACf2E,SAAQ9I,EAAEqiB,SAAUriB,EAAEiH,MAAO2b,EAAK7P,UAAU9N,OAC1C8D,SAAU/I,EAAEyH,QAAQsB,SAAUJ,KAAM,OAAQH,SAAU,uCAG1CuZ,SACW3f,qBAAqBqY,KAAKmH,QAASG,gCAAvDH,gBAEFU,YAAiBne,IAAI,kBAAK1D,GAAE4hB,WAC5BE,EAAYR,EAAQ5d,IAAI,kBAAK1D,GAAEwG,QAC/B4b,EAAad,EAAQ5d,IAAI,kBAAK1D,GAAEgH,UAEhC+a,EAAS/H,KAAKmH,QAAQzd,IAAI,kBAAK1D,GAAE4hB,uBAEhCzD,OAAO4D,EAAOre,IAAI,SAACuE,EAAK9E,mBAEjB4e,EAAO5e,SACV2e,EAAU3e,WACRif,EAAWjf,OAIf6W,KAAKiH,MAAMvd,IAAI,SAACiE,EAAMxE,SACrBoH,mBACN5C,EAAMka,EAAO1e,GAAI4e,EAAO5e,6BAOf,kCACCkD,oBACLA,GAAK3C,IAAI,kBACf8E,SAAQxG,EAAEqgB,SAAUrgB,EAAEsgB,OAAQC,EAAKjQ,UAAU9N,MAC5CxC,EAAEwE,OAAQ8B,SAAUtG,EAAEgF,QAAQsB,uCAGjBgZ,SACW3f,qBAAqBqY,KAAKmH,QAASG,gCAAvDH,gBAEFU,YAAiBne,IAAI,kBAAK1D,GAAEsiB,SAC5BR,EAAYR,EAAQ5d,IAAI,kBAAK1D,GAAEwG,QAC/Bgc,EAAYlB,EAAQ5d,IAAI,kBAAK1D,GAAEqiB,WAC/BD,EAAad,EAAQ5d,IAAI,kBAAK1D,GAAEgH,UAEhC+a,EAAS/H,KAAKmH,QAAQzd,IAAI,kBAAK1D,GAAEsiB,SACjCG,EAAYzI,KAAKmH,QAAQzd,IAAI,kBAAK1D,GAAEqiB,gBAEnClE,OAAO4D,EAAOre,IAAI,SAACuE,EAAK9E,mBAEjBsf,EAAUtf,UACZ4e,EAAO5e,SACR2e,EAAU3e,WACRif,EAAWjf,UAIlB6d,kBAECC,MAAMvd,IAAI,SAACiH,EAAWxH,KACR6d,EAAgBpgB,OAAO8J,cACxCC,EAAW6X,EAAUrf,GAAI0e,EAAO1e,GAAI4e,EAAO5e,OAItC6d,2BAKI,iBAAoB,sBAAwBhH,KAAK1H,UAAU3J,6BAC1DtC,gBAC+C2T,KAAK1H,UAA3D3J,IAAAA,MAAO+Z,IAAAA,SAAUC,IAAAA,UAAWC,IAAAA,WAE7Bpd,IAFyCqd,WAEzBnhB,EAAI,cAEnBohB,0BAEAC,KAAKrf,IAAI,SAACsf,EAAMC,GACN,IAAXA,KACGtM,OAAO1K,KACXnF,SAAS,cAAetB,GARL,GAQyB+L,aAAa5I,GAAO,GAAMua,wBAE1D,OAKTxf,IAAI,SAACqO,EAAK5O,MACX4O,EAAIpR,KAAM,IACR0F,gBACU0L,EAAIoR,sBACHpR,EAAIqR,qBACNjgB,GAETkgB,EAASld,WAAW,MAAOX,EAAG9D,EAAGkhB,EAAY7Q,EAAIpR,KAAM0F,KACtDyc,qBAAqB7W,KAAKoX,MAE3BV,MAEF,KACCD,IAGC1I,KAAK8I,+CAGGxB,MACZA,EAAS,gCAKD,iBAAoB,sCAAwCtH,KAAK1H,UAAU3J,6BAC1EtC,MACR2X,GAAIhE,KAAK1H,sBACRgR,SAAW,WACXC,MAAQld,EAAKmd,WAAW9f,IAAI,SAAChC,EAAGtC,SAC7BsJ,YACNrC,EAAKkb,WAAWniB,GAChBsC,EACA2E,EAAKod,SACLzF,EAAE9b,MACFmE,EAAKsQ,OAAOvX,GACZA,EACAiH,EAAKqd,QAAQtkB,aAEFiH,EAAK7E,mBACJ6E,EAAKsd,oBACL3F,EAAEnV,cAITmR,KAAKuJ,gCAEGjC,MACXsC,GAAUtC,EAAQC,WAClBsC,EAAUvC,EAAQkC,WAClBM,EAAaxC,EAAQoC,QACrB5B,EAAYR,EAAQ3K,OAEpBoN,EAAU/J,KAAKmH,QAAQI,WACvByC,EAAUhK,KAAKmH,QAAQqC,WACvBS,EAAajK,KAAKmH,QAAQuC,QAC1B1B,EAAYhI,KAAKmH,QAAQxK,SAERhV,qBAAqBoiB,EAASH,+CAC9BjiB,qBAAqBqiB,EAASH,+CACxBliB,qBAAqBsiB,EAAYH,+CACnCniB,qBAAqBqgB,EAAWF,8CAEpD3D,mBACQ4F,aACAC,UACHC,SACDnC,WAEE9H,KAAKmH,QAAQ3f,mBACZwY,KAAKmH,QAAQwC,mBACd3J,KAAKmH,QAAQsC,cAGpBzC,kBAECC,MAAMvd,IAAI,SAAC0H,EAAKjI,KACF6d,EAAgBpgB,OAAOuK,WACxCC,EAAKwY,EAAQzgB,GAAI0gB,EAAQ1gB,GAAIme,EAAQmC,SAAUK,EAAW3gB,IACzD3B,SAAU8f,EAAQ9f,cAIdwf,0BAKI,iBAAoB,sCAAwChH,KAAK1H,UAAU3J,6BAC1EtC,MACR2X,GAAIhE,KAAK1H,sBACRgR,SAAW,WACX7Z,SACDuU,EAAEkG,gBACAza,MAAQT,SACZ3C,EAAKkb,WACLlb,EAAKmd,WACLxF,EAAE9b,gBAES8b,EAAE1U,oBACA0U,EAAEtU,qBAGLsU,EAAExU,iBACDnD,EAAK7E,iBAKb+hB,SACDvF,EAAEmG,gBACAZ,MAAQld,EAAKmd,WAAW9f,IAAI,SAAChC,EAAGtC,SAC7B0J,YACNzC,EAAKkb,WAAWniB,GAChBsC,EACA2E,EAAKnF,OACL8c,EAAE9b,MACD8b,EAAEoG,iBAAmB/d,EAAKoO,OAAOrV,GAAK,GACvCA,MAKIoT,OAAOiC,OAAOuF,KAAKvQ,OAAO7I,OAAOoZ,KAAKuJ,iCAE9BjC,MACXsC,GAAUtC,EAAQC,WAClBsC,EAAUvC,EAAQkC,WAClBa,EAAY/C,EAAQ7M,OAEpBsP,EAAU/J,KAAKmH,QAAQI,WACvByC,EAAUhK,KAAKmH,QAAQqC,WACvB7W,EAAYqN,KAAKmH,QAAQ1M,SAER9S,qBAAqBoiB,EAASH,+CAC9BjiB,qBAAqBqiB,EAASH,+CAC1BliB,qBAAqBgL,EAAW0X,8CAEpDlG,mBACQ4F,aACAC,SACJK,WAEErK,KAAKmH,QAAQ3f,gBACfwY,KAAKmH,QAAQjgB,YAGlB8f,YAEDxO,QAAO/O,KAAKuW,KAAKvQ,OAAOnJ,WACR0gB,EAAgBpgB,OAAO+K,YACxCqO,KAAKvQ,MAAOma,EAASC,EAASvC,EAAQ9f,YAGrCwY,KAAKuJ,MAAMjjB,aACRijB,MAAM7f,IAAI,SAACqF,EAAK5F,KACF6d,EAAgBpgB,OAAO4K,WACxCzC,EAAK6a,EAAQzgB,GAAI0gB,EAAQ1gB,OAIrB6d,ggBQ5ZWsD,uCACRhgB,EAAQQ,qHACbR,EAAQQ,aACT/F,KAAO,eACP8a,kFAGM7S,MACPzH,GAAIya,KAAKiC,cACRsI,WAAavd,EAAQud,kBAEtB7hB,GAAIsX,KAAKuK,aACX9iB,OAASiB,EAAEjB,QAAUoX,gCACrB5S,MAAQvD,EAAEuD,OAASC,+BAEnBxG,SAASvB,MAAQ,KACjB0B,aAAe,KACf2c,WAA0C,GAA5B9Z,EAAEjB,OAAmB,GAAViB,EAAEuD,oDAIzB+Z,GAAIhG,KAAKyC,MAEThK,IAEF,4BAEYuH,KAAKuK,WAAW9iB,gBACjBuY,KAAKuK,WAAWte,OAE3B,6BAEc+Z,EAAEuB,kBACNvB,EAAEwB,cACFxH,KAAKR,SAEbyD,KAAKjD,aAIJ+D,WAAa,GAAIa,KAAInM,EACxB/O,IAAI,eACA8gB,GAAYpS,6CAAgBtN,WACxBA,EAAK,GAAI0f,0IAMfxE,GAAIhG,KAAKyC,QAEX8E,gBACAC,aAEEiD,GAAO,IACTxE,YAAYvc,IAAI,SAACwJ,MACd1I,GAAQ6V,EAAK7V,MAAQ0I,EAAQ8S,EAAEO,aACjCiB,OAAOvV,KAAKzH,KACZ+c,WAAWtV,KAAKwY,MACVjgB,gGAOLwb,EAAIhG,KAAKyC,WACR9M,UAAUyI,iBAAiB,YAAa,SAACoH,MACzCkF,GAAOjF,EAAK1B,WAAW4G,IAAI,kBAAkB1D,MAC7C7V,EAAMoU,EAAE1gB,UACT4lB,EAAK/R,SAASvH,GAAM,IAElBjI,GAAIuhB,EAAKpP,QAAQlK,GACjBwZ,EAAOznB,UAAUsiB,EAAK9P,WAAYkV,EAAO1nB,UAAUiO,GAEnD5F,EAAIqf,EAAKlnB,KAAOinB,EAAKjnB,KAAO8E,SAAS2I,EAAIF,aAAa,UAAU,EAChExJ,EAAImjB,EAAKtnB,IAAMqnB,EAAKrnB,IACpB2c,GAASuF,EAAKqF,iBAAmBrF,EAAKqF,gBAAgBxkB,OAAO,EAC9Dmf,EAAKqF,gBAAgB3hB,GAAKsc,EAAKhD,MAAM9F,OAAOxT,IAAM,KACjD4hB,EAAW/E,EAAEC,YAAY9c,GAAG6c,EAAEO,aAE7B/C,IAAIwH,UAAUxf,EAAG9D,GAAI2Q,KAAM6H,EAAOhN,OAAiB,IAAT6X,GAAc9kB,QAAQ,GAAK,QACrEud,IAAIyH,oBAlFgCpF,ihBCIxBqF,gCACR5gB,EAAQQ,uHACbR,EAAQQ,aACT/F,KAAO,QACP2d,YAAc,IACdiB,KAAO,IAEP9D,oFAGI/U,gGACOA,QACXqgB,UAAYnL,KAAKmL,UAAUlI,KAAKjD,WAChCoL,WAAapL,KAAKoL,WAAWnI,KAAKjD,WAElCqL,WAAavgB,EAAKugB,YAAc,QAChCxS,OAAOyS,WAAaxgB,EAAKwgB,YAAc,OAEvChgB,UAAYR,EAAKQ,YAAa,wIAK/B0a,GAAIhG,KAAKyC,WACRvb,OAAU8Y,KAAKvY,OAASuY,KAAKxV,MAAQwV,KAAK3U,OAAOG,EAAIwU,KAAK3U,OAAO3D,KAE9DR,GAAsB8Y,KAAtB9Y,OAAQoE,EAAc0U,KAAd1U,UAEVigB,EAAuBvF,EAAEwF,uBAC7BpE,kBACAoE,uBACEC,GAAW,IAAMzL,KAAKnH,OAAOyS,aAE/BrF,YAAYvc,IAAI,SAACyc,EAAOhd,MACnBmiB,GAAaG,EACbC,EAAmBvF,EAAQH,EAAEO,WAAcjH,WAC3CqM,EAAYrgB,GAAaogB,EAAkBA,EAC3CE,EAAWH,GAAsBE,EACjCxgB,EAAgBnE,mBAAmBskB,EAAYpkB,GAC/CkE,EAAcpE,mBAAmB4kB,EAAU1kB,GAE3C2kB,EAAexL,EAAKsD,MAAQ4H,EAAqBpiB,GAEnD2iB,SAASC,QACV1L,GAAKsD,QACIkI,EAAeA,EAAa1gB,cAAgBA,IAC9C0gB,EAAeA,EAAazgB,YAAcD,MAExCA,IACFC,MAEJ4gB,GAAU9gB,eAAe4gB,EAAUC,EAAQ1L,EAAKhV,OAAQgV,EAAKnZ,OAAQmZ,EAAK/U,aAE9E8b,aAAanV,KAAK+Z,KAClBR,iBAAiBvZ,0CAGXkU,QACAH,EAAEO,yCAGFoF,WAIJhI,KAAO,+CAIRqC,GAAIhG,KAAKyC,MAEThK,IAEF,eAEA,+BAEgBuN,EAAEoB,oBACRpH,KAAKR,SAEbyD,KAAKjD,aAIJ+D,WAAa,GAAIa,KAAInM,EACxB/O,IAAI,eACA8gB,GAAYpS,+CAAgBtN,WACxBA,EAAK,GAAI0f,kDAIAyB,MACb/kB,GAAqB8Y,KAArB9Y,OAAOmkB,EAAcrL,KAAdqL,WACPzD,EAAW5gB,mBAAmBilB,EAASX,WAAYW,EAAShlB,MAAQ,EAAGC,wBACtD0gB,EAASpc,EAAK6f,QAAiBzD,EAASlgB,EAAK2jB,6CAG1Dhc,EAAKlG,EAAE+iB,EAAK1G,MAClBnW,MACEnH,GAAQ8X,KAAKR,OAAOrW,MACvB+iB,EAAM,WACE7c,EAAM2Q,KAAKmM,oBAAoBnM,KAAKyC,MAAM+I,iBAAiBriB,OAChEQ,MAAMhD,KAAOsB,mBAAmBC,EAAO,OACxCkkB,GAAQjpB,UAAU6c,KAAK7K,KACvB3J,EAAIga,EAAE6G,MAAQD,EAAMzoB,KAAO,GAC3B+D,EAAI8d,EAAE8G,MAAQF,EAAM7oB,IAAM,GAC1B2c,GAASF,KAAKuM,kBAAoBvM,KAAKuM,iBAAiBjmB,OAAS,EAClE0Z,KAAKuM,iBAAiBpjB,GAAK6W,KAAKyC,MAAM9F,OAAOxT,IAAM,KAClDqjB,GAAuC,IAA5BxM,KAAKyC,MAAMwD,YAAY9c,GAAW6W,KAAKyC,MAAM8D,YAAYtgB,QAAQ,QAC3Eud,IAAIwH,UAAUxf,EAAG9D,GAAI2Q,KAAM6H,EAAOhN,MAAOsZ,EAAU,WACnDhJ,IAAIyH,yBAEC5b,EAAK,2BACVmU,IAAIvD,YACJtW,MAAMhD,KAAOuB,8CAKdyN,UAAUyI,iBAAiB,YAAa4B,KAAKmL,gBAC7CxV,UAAUyI,iBAAiB,aAAc4B,KAAKoL,8CAG1C5F,MACH1gB,GAAS0gB,EAAE1gB,OACb2nB,EAASzM,KAAK+D,WAAW4G,IAAI,aAAa1D,MAC1CyF,EAAY1M,KAAK2M,oBACjBC,EAAa5M,KAAK6M,kBACnBJ,EAAO9T,SAAS7T,GAAS,IACvBqE,GAAIsjB,EAAOnR,QAAQxW,QAClBgoB,WAAWF,EAAYF,GAAU,QACjCG,eAAiB/nB,OACjB6nB,oBAAsBxjB,OACtB2jB,WAAWhoB,EAAQqE,GAAG,EAAMqc,aAE5B4F,uDAKD0B,WAAW9M,KAAK6M,eAAe7M,KAAK2M,qBAAoB,UA5IzB9G,ysBCAhCkH,UAAYhO,oBAAsBC,oBAClCgO,WAAaD,UAGEE,+BACR3iB,EAAQ0C,uHACb1C,EAAQ0C,MACTjI,KAAO,YAEPmoB,WAAalgB,EAAQkgB,YAAc,MAEpCC,IAAe,SAAU,UACzBC,EAAiBD,EAAYxU,SAAS3L,EAAQogB,gBAC/CpgB,EAAQogB,eAAiB,kBACvBC,oBAAsBF,EAAY7R,QAAQ8R,KAE1CvN,sFAGM7S,MACPzH,GAAIya,KAAKiC,cACRqL,gBAA8C,IAA5BtgB,EAAQsgB,gBAAwB,EAAI,IAEzD5nB,SAASnC,IAAmB,EAAbypB,aACftnB,SAAS3B,OAAS,IAClB8B,aAA4B,EAAbmnB,aACfxK,WAAawK,WAAa9V,mBACzBtR,eAAeL,MAEdS,GAAIga,KAAK3T,KACTkhB,EAAUvN,KAAKsN,gBAAkB3G,kBAAoB,OACpDrD,kBAAoB3M,gBAAgB3Q,EAAEK,MAAOL,EAAEqX,KACjDkQ,GAAWR,UAAYjnB,cAAcP,4CAIpCgoB,GAAUvN,KAAKsN,gBAAkB3G,kBAAoB,EACrD6G,EAAYxN,KAAKyC,MAAM+K,UAAYxN,KAAKyC,MAAM+K,UAAY,QACzDjJ,WAAaiJ,EAAYD,GAAWR,UACtCjnB,cAAcka,KAAKiC,mDAGX5V,0DAAK2T,KAAK3T,QAClBA,EAAKhG,OAASgG,EAAKgR,KAAOhR,EAAKhG,MAAQgG,EAAKgR,SACxC,IAAIsE,OAAM,kDAGbtV,EAAKhG,UACHA,MAAQ,GAAI2P,QACZ3P,MAAMonB,YAAaphB,EAAKhG,MAAMoQ,cAAgB,IAEhDpK,EAAKgR,QAAYA,IAAM,GAAIrH,SAC1B0X,WAAarhB,EAAKqhB,eAEpBjlB,SAAS+P,OAAO/O,KAAK4C,EAAKqhB,YAAY,IAAM,IAAQ,IAClDC,aACGlkB,KAAK4C,EAAKqhB,YAAY5K,QAAQ,eAChChN,GAAO,GAAIE,MAAK4X,EAAevW,gBAC5BjB,YAAYN,IAASzJ,EAAKqhB,WAAWE,OAExCF,WAAaC,QAGZthB,qCAIH2Z,GAAIhG,KAAKyC,QAEXpc,MAAQ+O,MAAM4K,KAAK3T,KAAKhG,SACxBgX,IAAMjI,MAAM4K,KAAK3T,KAAKgR,OAEtBwQ,eAAiBzY,MAAM4Q,EAAE3f,SACzBmnB,UAAY7W,gBAAgBqP,EAAE3f,MAAO2f,EAAE3I,OACvCd,aAAeJ,iBAChB3D,OAAOiC,OAAOuF,KAAK3T,KAAKqhB,YAAa5O,6BAEpCgP,cAAgB9N,KAAK+N,kEAInB/H,EAAIhG,KAAKyC,MACTuL,EAAUhO,KAAKsN,gBAAkB,EAAI,EAErC7U,EAAmBuN,EAAE8H,cAAcpkB,IAAI,SAACmP,EAAQ1P,UACnD,oBAEQ0P,EAAOlK,eACJoe,oBACCC,sBACCjO,+BACAiH,EAAE8H,cACZpV,OAAO,SAACG,EAAQzT,SAAMA,GAAI+D,IAC1BO,IAAI,kBAAUmP,GAAOkQ,KAAKziB,OAAS0nB,IACnChS,OAAO,SAACzH,EAAG7L,SAAM6L,GAAI7L,GAAG,GACvBqkB,WAEJ,iBACQ/G,GAAE8H,cAAc3kB,IACtB8Z,gBAIEc,WAAa,GAAIa,KAAInM,EACxB/O,IAAI,SAACoB,EAAM3B,MACPqhB,GAAYpS,+CAAgBtN,WACxBA,EAAK,GAAK,IAAM3B,EAAGqhB,SAIzB9iB,GAAI,kBACQob,QAAQ,SAACmL,EAAS9kB,OAC7B,EAAG,EAAG,GAAGwP,SAASxP,GAAI,IACrB+kB,GAAUphB,SAAS,kBAAmBigB,UAAU,EAAGrlB,EAAGumB,YAE9ClP,uBACN,aACQ,UAGTmF,SAAS7a,YAAY6kB,MAEtBlB,4CAIA3gB,GACFA,WACK8R,MAAM,2BAGV9R,KAAO2T,KAAK6B,YAAYxV,QACxB6W,YACAO,oEAIA9N,UAAUyI,iBAAiB,YAAa,SAACoH,KACxCzB,WAAWjB,QAAQ,eACnBqL,GAAaC,EAAKnH,MAClBoH,EAAY7I,EAAE1gB,UACfqpB,EAAWxV,SAAS0V,GAAY,IAE9BjoB,GAAQioB,EAAUnd,aAAa,cAC/Bod,EAAYD,EAAUnd,aAAa,aAAaK,MAAM,KAEtDqG,EAAQL,aAAa9O,SAAS6lB,EAAU,IAAI,GAAG,GAE/C1D,EAAOnF,EAAK9P,UAAUrS,wBAAyBunB,EAAOwD,EAAU/qB,wBAEhEkH,EAAQ/B,SAAS+c,EAAE1gB,OAAOoM,aAAa,UACvC1F,EAAIqf,EAAKlnB,KAAOinB,EAAKjnB,KAAO6G,EAAM,EAClC9C,EAAImjB,EAAKtnB,IAAMqnB,EAAKrnB,IACpB2P,EAAQ9M,EAAQ,IAAMqf,EAAKyH,WAC3B7U,EAAO,OAAST,EAAQ,IAAM0W,EAAU,GAAK,KAAOA,EAAU,KAE7D9K,IAAIwH,UAAUxf,EAAG9D,GAAI2Q,KAAMA,EAAMnF,MAAOA,EAAO2N,WAAY,SAC3D2C,IAAIyH,sEAOPvG,WAAW8B,YAAc,MAC1Bhb,GAAI,EACJ9D,EAAIslB,WAEJuB,EAAWzhB,SAAS,iBAAkBtB,EAAG9D,EAAG,iBAEpCqX,oBAAsB,KAC5B,MAGW,EAAZgO,UAAiBA,UAAU,OAC3BrI,WAAWrb,YAAYklB,QAEvB/O,OAAOjX,MAAM,EAAGuW,2BAA2BpV,IAAI,SAACxB,EAAOiB,MACrDkgB,GAASld,WAAW,sBAAuBX,GAAKuhB,UAAY,GAAK5jB,EACtEzB,EAAGqX,oBAAqB7W,KACpBwc,WAAWrb,YAAYggB,QAIzBmF,GAAW1hB,SAAS,iBADRtB,EAAIsT,2BAA6BiO,UAAY,GAAKA,UAAU,EACvBrlB,EAAG,iBAE5CqX,oBAAsB,KAC5B,SAGD2F,WAAWrb,YAAYmlB,4CAaxB,GATAxI,GAAIhG,KAAKyC,SACoBuD,EAAE3f,MAAMmQ,WAAYwP,EAAE3f,MAAMoQ,eAAtDgY,OAAYC,UACU1I,EAAE3I,IAAI7G,WAAYwP,EAAE3I,IAAI5G,eAE/CkY,OAAyBF,EAAa,EAA6B,SAAbC,GAExDZ,KAEAc,EAAexZ,MAAM4Q,EAAE3f,OACnB8C,EAAI,EAAGA,EAAIwlB,EAAYxlB,IAAK,IAC/B0N,GAAUmP,EAAE3I,QACZ/F,eAAesX,EAAc5I,EAAE3I,KAAM,QACnBuR,EAAapY,WAAYoY,EAAanY,iBACjDkB,gCAEG1F,KAAK+N,KAAK6O,gBAAgBD,EAAc/X,YAE9CA,EAAS,KACFA,QAGTiX,2CAGQlX,MAAWC,0DAAQ,MACbD,EAAUJ,WAAYI,EAAUH,eAAhDmB,OAAOC,OACRiX,EAAc/X,eAAeH,GAG7BmY,SACInX,qBAHExC,MAAMyB,IAAYc,mBAAmBC,EAAOC,GAOrC,OAIb,GAHAmX,GAAiBrY,gBAAgBmY,EAAajY,GAE9CkS,KAAW3gB,SACPe,EAAI,EAAGA,EAAI6lB,EAAgB7lB,MAC5B6W,KAAKiP,OAAOH,EAAalX,KAC1B3F,KAAK7J,aAEI,GAAI4N,MAAK5N,EAAI8O,mBAAqB,GAAGiS,UAC9B,cAGuBte,KAA1CzC,EAAI8O,mBAAqB,GAAGkS,oBACtB0F,EAAa,KAChB7c,KAAK+N,KAAKiP,OAAOH,EAAalX,GAAO,OAG9BmR,KAAOA,EAEbgG,iCAGDnY,EAAWgB,OAOb,GAPoBsX,2DACpBlJ,EAAIhG,KAAKyC,MAGT0M,EAAc/Z,MAAMwB,GACpBxO,KAEIe,EAAI,EAAGA,EAAI+N,mBAAoB/N,IAAK8O,QAAQkX,EAAa,GAAI,IAChEtW,MAGAuW,EAAwBD,GAAenJ,EAAE3f,OAAS8oB,GAAenJ,EAAE3I,GAEpE6R,IAASC,EAAY3Y,aAAeoB,IAAUwX,IACzCjG,SAAW/S,YAAY+Y,KAErBnP,KAAKqP,mBAAmBF,KAE9Bld,KAAK4G,SAGHzQ,8CAGW0N,MACdqT,GAAW/S,YAAYN,GACvBsT,EAAYpJ,KAAK3T,KAAKqhB,WAAWvE,mBAE1BA,YACCC,GAAa,OAClBpJ,KAAKR,OAAO/C,iBAAiB2M,EAAWpJ,KAAKyC,MAAMlG,uBApRvBkF,0gBCFhBxD,iCACR3T,EAAQQ,uHACbR,EAAQQ,aAETyf,WAAazf,EAAKyf,iBAClB+E,YAAcxkB,EAAKwkB,kBAEnB3L,KAAO,IAEP9D,wFAIFG,KAAK3T,KAAKwQ,SAASvW,QAAU,SAC1BuS,OAAOyJ,WAAa,OACpBL,SAASvc,SAAS3B,OAAS,sCAIxBiJ,gGACOA,KAERuiB,YAAcviB,EAAQuiB,kBACtBC,eAAiBxiB,EAAQwiB,wBAE5B3W,OAAO4W,UAAYziB,EAAQuiB,YAAYE,WAAa,YACpD5W,OAAO6W,UAAY1iB,EAAQuiB,YAAYG,WAAa,YACpD7W,OAAO8W,UAAY3iB,EAAQuiB,YAAYI,WAAa,OAEpD9W,OAAO+W,eAAiB5iB,EAAQwiB,eAAeI,oBAC/C/W,OAAOgX,eAAiB7iB,EAAQwiB,eAAeK,oBAE/ChX,OAAOuR,iBAAmBpd,EAAQod,6DAIhC1N,iEADSsD,KAAK3T,KACC2T,KAAKjb,uDAIpBuY,qEADc0C,KAAK3T,wCAItBqX,gEACCoM,iBACDpM,QACEqM,oBAAoB/P,KAAKgQ,gBAA+B,SAAdhQ,KAAKjb,WAEhDkrB,8DAIDjK,GAAIhG,KAAKyC,MACT9F,EAASqD,KAAK3T,KAAKsQ,SACrBC,cAAgBD,EAAOrW,SAEvB4pB,UAAYlQ,KAAKxV,MAAOwb,EAAEpJ,gBAE1BuT,QAAUnK,EAAEkK,UAAU,IAMtBE,cACOzT,YACGA,EAAOjT,IAAI,SAAC1D,EAAGmD,SACzBpD,UAASigB,EAAEmK,QAAUhnB,EAAI6c,EAAEkK,0DAKVG,MACblV,GAAOX,mBAAmB6V,yDADa,SAEvC1U,EAAkBqE,KAAKvY,OAAS+T,cAAcL,GAC9CmV,EAAiBjV,gBAAgBF,GAAQQ,EACzCnU,EAAWwY,KAAKvY,OAAUyT,aAAaC,GAAQmV,OAEhD7N,MAAM/G,cACFP,YACGA,EAAKzR,IAAI,kBAAKlC,GAAWxB,EAAI2V,oBACvBA,WACPnU,QAIN+oB,yBACAC,qBACAC,8DAIDzK,GAAIhG,KAAKyC,MACTiO,EAAW,kBAAUjW,GAAO/Q,IAAI,kBAAO+R,OAAMrS,EAAK4c,EAAEtK,YAEtDmB,SAAWmD,KAAK3T,KAAKwQ,SAASnT,IAAI,SAAC1D,EAAGmD,MACnCsR,GAASzU,EAAEyU,OACXkW,EAAe3qB,EAAE2qB,6BAEd3qB,EAAEqS,WACDlP,YACInD,EAAEkX,iBAELzC,aACIiW,EAASjW,gBAEPkW,iBACED,EAASC,iDAMvB3K,GAAIhG,KAAKyC,SACVzC,KAAKuK,WAAWqG,sBAChBC,UAAY7K,EAAEnJ,SAASmJ,EAAEnJ,SAASvW,OAAS,GAAGwqB,kBAG/CD,UAAY,GAAIrqB,OAAMwf,EAAEpJ,eAAejW,KAAK,QAC5CkW,SAASnT,IAAI,cACZ8f,WAAW9f,IAAI,SAACuE,EAAK7I,GACnB6I,EAAM+X,EAAE6K,UAAUzrB,OAClByrB,UAAUzrB,GAAK6I,iDAOhB+X,GAAIhG,KAAKyC,KACVzC,MAAK3T,KAAKoR,gBACPgF,MAAMhF,SAAWuC,KAAK3T,KAAKoR,SAAS/T,IAAI,qBAC1Cke,SAAWnM,MAAMzV,EAAEkN,MAAO8S,EAAEtK,OAC1B1V,EAAEgH,UAAShH,EAAEgH,YAIVhH,KAGNga,KAAK3T,KAAK+Q,gBACPqF,MAAMrF,SAAW4C,KAAK3T,KAAK+Q,SAAS1T,IAAI,qBAC1C2e,SAAW5M,MAAMzV,EAAEK,MAAO2f,EAAEtK,SAC5B4M,OAAS7M,MAAMzV,EAAEqX,IAAK2I,EAAEtK,OACtB1V,EAAEgH,UAAShH,EAAEgH,YACVhH,0DAMLsG,EAAM,YAEP0T,KAAKuK,WAAWqG,QAAS,GACrB,kBACFG,GAAa,GAAIvqB,OAAMwZ,KAAKyC,MAAM7F,eAAejW,KAAK,QACrD0F,KAAKwQ,SAASnT,IAAI,SAAC1D,EAAGmD,MACtBsR,GAAS4F,EAAKhU,KAAKwQ,SAAS1T,GAAGsR,SACjCnO,GAAOykB,EAAaA,EAAWrnB,IAAI,SAACsa,EAAG7a,SAAM6a,GAAIvJ,EAAOtR,UAIxD6nB,GAAgBhR,KAAK3T,KAAKwQ,SAASnT,IAAI,kBAAK1D,GAAEsG,WAC/C0T,MAAK3T,KAAKoR,YACExL,KAAK+N,KAAK3T,KAAKoR,SAAS/T,IAAI,kBAAK1D,GAAEkN,SAE/C8M,KAAK3T,KAAK+Q,eACP/Q,KAAK+Q,SAAS1T,IAAI,cACRuI,MAAMjM,EAAEqX,IAAKrX,EAAEK,iBAIrBO,oCAAUoqB,yDAIhBvY,IAEF,cAEOuH,KAAKnH,OAAO6W,gBACX1P,KAAKxV,OAGb,iBACQwV,MAAKyC,MAAM/G,OACjBuH,KAAKjD,QAIP,cAEOA,KAAKnH,OAAO4W,iBACVzP,KAAKvY,QAGd,cACKue,GAAIhG,KAAKyC,eACX2N,MAAMnI,WAAavK,mBAAmBsC,KAAKxV,MAC5Cwb,EAAEoK,MAAMzT,OAAQqD,KAAKnH,OAAO8W,WAEtB3J,EAAEoK,OACRnN,KAAKjD,QAIP,kBAEQA,KAAKxV,UACP,SAEN,iBACQwV,MAAKyC,MAAMrF,UACjB6F,KAAKjD,QAILiR,EAAcjR,KAAKyC,MAAM5F,SAASnE,OAAO,kBAAqB,QAAhB1S,EAAEkX,YAChDgU,EAAelR,KAAKyC,MAAM5F,SAASnE,OAAO,kBAAqB,SAAhB1S,EAAEkX,YAEjDiU,EAAcF,EAAYvnB,IAAI,eAC7BiF,GAAQ3I,EAAE2I,aAEb,YAAmB3I,EAAE2I,aAEbA,QACA8W,EAAKjG,OAAO7Q,WACV8W,EAAK8E,WAAWqG,yBAGPnL,EAAK5M,OAAOuR,2BACnB3E,EAAKhe,OAASiX,wBAE1B,cACKsH,GAAIhG,KAAKyC,MACTzc,EAAIggB,EAAEnJ,SAASlO,GACfiiB,EAAU5Q,KAAKuK,WAAWqG,QAE1BQ,EAAapR,KAAKuK,WAAW6G,YAAc3S,sBAC3CkL,EAAY3D,EAAEkK,UAAU,GAAK,EAAIkB,GACjC3H,EAAWE,GAAWiH,EAAU,EAAIK,EAAY3qB,QAEhDihB,EAAavB,EAAEoK,MAAMzI,UAAUje,IAAI,kBAAK8B,GAAIme,EAAU,GACtDiH,OACUrJ,EAAW7d,IAAI,kBAAK2nB,GAAI5H,EAAW9a,QAG7CgO,GAAS,GAAInW,OAAMwf,EAAEpJ,eAAejW,KAAK,GAC1CqZ,MAAKnH,OAAOuR,qBACXwG,GAAW5qB,EAAE2I,QAAUqX,EAAEnJ,SAASvW,OAAS,EACpCN,EAAE2qB,aAEF3qB,EAAEyU,WAITiP,GAAU,GAAIljB,OAAMwf,EAAEpJ,eAAejW,KAAK,SAC3CiqB,OACQ5qB,EAAEwjB,WAAW9f,IAAI,SAAChC,EAAGtC,SAAMsC,GAAI1B,EAAE8qB,eAAe1rB,kBAI9CmiB,aACAvhB,EAAEwjB,mBACLE,SAED/M,WAEEqJ,EAAEtK,MAAMlU,mBACPmiB,WACDF,IAEVxG,WAIAqO,EAAcJ,EAAaxnB,IAAI,eAC9BiF,GAAQ3I,EAAE2I,aAEb,aAAoB3I,EAAE2I,aAEdA,QACA8W,EAAKjG,OAAO7Q,WACV8W,EAAKjW,iBACJiW,EAAK6J,YAAYhgB,oBACfmW,EAAK6J,YAAY5f,oBACnB+V,EAAK6J,YAAYnF,kBACjB1E,EAAK6J,YAAYpF,0BAGTzE,EAAK5M,OAAOuR,kBAE/B,cACKpE,GAAIhG,KAAKyC,MACTzc,EAAIggB,EAAEnJ,SAASlO,GACf4iB,EAAUvL,EAAEtK,MAAMiM,UAAU,GAAK3B,EAAEtK,MAAMlU,SAC1Cwe,EAAEtK,MAAMiM,UAAU,GAAK3B,EAAEtK,MAAMlU,2BAGrBwe,EAAEoK,MAAMzI,qBACR3hB,EAAEwjB,kBAENxjB,EAAEyU,gBAEA8W,SACFvR,KAAKsP,YAAYkC,SAAW7S,sBAEpCsE,WAIAwO,IAEF,kBAEQzR,KAAKxV,UACP,SAEN,iBACQwV,MAAKyC,MAAMhF,UACjBwF,KAAKjD,UAIUvH,EAAiB7R,OAAOuqB,EAAaG,EAAaG,MAEjEC,IAAa,WAAY,iBACxBC,2BAEA5N,WAAa,GAAIa,KAAInM,EACxBC,OAAO,mBAASgZ,EAAU/Y,SAAS7N,EAAK,KAAO2a,EAAKhD,MAAM3X,EAAK,MAC/DpB,IAAI,eACA8gB,GAAYpS,+CAAgBtN,WAC7BA,EAAK,GAAG6N,SAAS,cAAgB7N,EAAK,GAAG6N,SAAS,gBAC/CgZ,mBAAmB1f,KAAKuY,IAEtB1f,EAAK,GAAI0f,gEAKdoH,kBAED5L,GAAIhG,KAAKyC,MACToP,EAAU7R,KAAKnH,OAAO+W,eACtBkC,EAAU9R,KAAKnH,OAAOgX,cACb7J,GAAEoK,MAAMzT,OAEdjT,IAAI,SAAC8C,EAAOmC,MACd8L,GAASyN,EAAKzF,MAAM5F,SAASnT,IAAI,SAAC0W,EAAKjX,MACtC+J,GAAQkN,EAAI3F,OAAO9L,gBAEfyR,EAAI/H,WACJnF,OACDkN,EAAIoJ,WAAW7a,SACduZ,EAAK1I,OAAOrW,aACR2oB,EAAUA,EAAQ5e,GAASA,OAInC0e,YAAYjjB,UACTnC,iBACSqlB,EAAUA,EAAQrlB,GAASA,OACrCwZ,EAAEoK,MAAMzI,UAAUhZ,UAChB8L,WACEuL,EAAE6K,UAAUliB,4DAOnBgH,UAAUyI,iBAAiB,YAAa,SAACoH,MACzCjgB,GAAI4iB,EAAKlG,SACThZ,EAAI9F,UAAUglB,EAAKxS,WACnBoc,EAAOvM,EAAE6G,MAAQpjB,EAAEtF,KAAOgC,cAAcJ,GACxCysB,EAAOxM,EAAE8G,MAAQrjB,EAAE1F,GAEpByuB,GAAO7J,EAAK1gB,OAASnC,aAAaC,IACjCysB,EAAQ1sB,aAAaC,KACnB0sB,oBAAoBF,KAEpBvO,IAAIvD,wDAKQ8R,MACf/L,GAAIhG,KAAKyC,SACTuD,EAAE6K,cAEFliB,GAAQiN,kBAAkBmW,EAAM/L,EAAEoK,MAAMzI,WAAW,GACnDuK,EAAMlS,KAAK4R,YAAYjjB,QAEtB6U,IAAIwH,UACRkH,EAAIzH,KAAOzK,KAAKwD,IAAIrZ,OAAOqB,EAC3B0mB,EAAIC,SAAWnS,KAAKwD,IAAIrZ,OAAOzC,GAC9B2Q,KAAM6Z,EAAIE,eAAgBlf,MAAO,IAClCgf,EAAIzX,OACJ9L,QAGI6U,IAAIyH,6DAILjF,EAAIhG,KAAK3T,IACV2Z,GAAEnJ,SAASvW,OAAS,SACjBoe,WAAW8B,YAAc,KAC5B3J,SAASnT,IAAI,SAAC1D,EAAGmD,MACdsgB,GAAWjL,qBAGXnb,EAAOkJ,YAECpD,EACX,IACAsgB,EACAlB,EAAK/I,OAAOrW,GACZnD,EAAEqS,QACEqM,WAAWrb,YAAYhG,0DAS3B2c,KAAK2D,sBACFA,KAAO,EAGV3D,MAAKqS,oBACFA,cAAcvP,QAAQ,eACtB7Z,GAAIN,EAAEuY,UACR3X,WAAW4K,YAAYlL,UAItBopB,cAAgBrS,KAAK2R,mBAAmBjoB,IAAI,wBAEzCsa,EAAEsF,qBACCze,SACFmZ,EAAEuF,aAIoB1e,KAA5BmV,KAAKyC,MAAM6P,oBACR7P,MAAM6P,aAAetS,KAAKyC,MAAM7F,cAAgB,QAIjDyV,cAAc3oB,IAAI,eAClB6oB,GAAcvsB,EAAEujB,MAAMiJ,EAAK/P,MAAM6P,gBAEnCpR,QAAUF,YAAYhb,EAAEjB,MAAMwtB,KAC3BrO,SAAS7a,YAAYrD,EAAEkb,yDAK1BlB,KAAKqS,oBACFA,cAAcvP,QAAQ,eACtB7Z,GAAIN,EAAEuY,UACR3X,WAAW4K,YAAYlL,2DAMtBqB,OAAO8T,iBAAiB,cAAe,aACtC+C,sEAKDwQ,mBAAmBjoB,IAAI,cACzB6f,MAAM7f,IAAI,cACN0U,iBAAiB,QAAS,cAC1BzP,GAAQkB,EAAKqB,aAAa,sBACzBuhB,oBAAoB9jB,cAMvB6U,IAAI7N,UAAUyI,iBAAiB,QAAS,cACxCzP,GAAQ+jB,EAAKlP,IAAI7N,UAAUzE,aAAa,sBACvCuhB,oBAAoB9jB,6DAKrB0jB,cAAc3oB,IAAI,eAClB6oB,GAAcvsB,EAAEujB,MAAMoJ,EAAKlQ,MAAM6P,4BACvBtsB,EAAEjB,MAAMwtB,EAAavsB,EAAEkb,sDAKjCuR,oBAAoBzS,KAAKyC,MAAM6P,aAAe,+CAI9CG,oBAAoBzS,KAAKyC,MAAM6P,aAAe,6CAGvC3jB,0DAAMqR,KAAKyC,MAAM6P,aACzBtM,EAAIhG,KAAKyC,mBAEL9T,QACAqX,EAAEoK,MAAMzT,OAAOhO,UACdqX,EAAEnJ,SAASnT,IAAI,kBAAK1D,GAAEyU,OAAO9L,kDAKnBA,MACfqX,GAAIhG,KAAKyC,SACLha,SAASkG,IACN,IAAGA,EAAQ,GACnBA,GAASqX,EAAEoK,MAAMzT,OAAOrW,SAAQqI,EAAQqX,EAAEoK,MAAMzT,OAAOrW,OAAS,GAChEqI,IAAUqX,EAAEsM,iBACbA,aAAe3jB,OACZqR,KAAK1V,OAAQ,cAAe0V,KAAK4S,sDAM1BpmB,EAAOqmB,MAAelkB,0DAAMqR,KAAKyC,MAAM7F,8GAChCpQ,EAAOqmB,EAAelkB,QACpCtC,KAAKsQ,OAAOmW,OAAOnkB,EAAO,EAAGnC,QAC7BH,KAAKwQ,SAASnT,IAAI,SAAC1D,EAAGmD,KACxBsR,OAAOqY,OAAOnkB,EAAO,EAAGkkB,EAAc1pB,WAEpCib,OAAOpE,KAAK3T,mDAGFsC,0DAAQqR,KAAKyC,MAAM7F,cAAc,CAC5CoD,MAAK3T,KAAKsQ,OAAOrW,QAAU,uGAGTqI,QACjBtC,KAAKsQ,OAAOmW,OAAOnkB,EAAO,QAC1BtC,KAAKwQ,SAASnT,IAAI,cACpB+Q,OAAOqY,OAAOnkB,EAAO,UAEnByV,OAAOpE,KAAK3T,6CAGJwmB,MAAelkB,0DAAM,OAC7BtC,KAAKwQ,SAASlO,GAAO8L,OAASoY,OAC9BzO,OAAOpE,KAAK3T,6CAKHwQ,QACTxQ,KAAKwQ,SAASnT,IAAI,SAAC1D,EAAGmD,GACvB0T,EAAS1T,OACTsR,OAASoC,EAAS1T,WAGjBib,OAAOpE,KAAK3T,aArjBoBoV,WRHjCvD,gBACAD,eACCA,qBAEMqM,wBACH2C,YACJ/B,UAiBA6H,MACL,WAAYzoB,EAAQ0C,kCACZgR,eAAehR,EAAQjI,KAAMuF,EAAQ0C"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.esm.js","sources":["../src/js/utils/dom.js","../src/js/utils/constants.js","../src/js/objects/SvgTip.js","../src/js/utils/helpers.js","../src/js/utils/draw-utils.js","../src/js/utils/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/chart.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 === \"onClick\" ) {\n\t\t\telement.addEventListener('click', val);\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\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, commonSelector, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`${commonSelector}.${activeClass}`);\n\n\tif (typeof $child === 'string') {\n\t\t$child = $parent.querySelector($child);\n\t}\n\n\tthis.forEachNode($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\nexport function insertAfter(newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\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\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 AXIS_CHART_DEFAULT_TYPE = 'line';\nexport const AXIS_CHART_MIXED_TYPE = 'axis-mixed';\nexport const AXIS_CHART_TYPES = ['line', 'bar', 'axis-mixed'];\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_CHART_OPTIONS = {\n\tbarOptions: {\n\t\tspaceRatio: 1,\n\t}\n}\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 1;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.01;\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};\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\nexport function toTitleCase(str) {\n return str.replace(/\\w*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});\n}\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","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/8027444/6495043\n\treturn /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(string);\n}\n\nexport const getColor = (color) => {\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr } from './draw-utils';\nimport { getStringWidth } 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;\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') {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 0 ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\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, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label) {\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label) {\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\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\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(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\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\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\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 } 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) {\n\tlet pathComponents = [];\n\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y));\n\tlet pathStr = pointsStr.join(\"L\");\n\n\tconst animPath = [paths.path, {d:\"M\"+pathStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pathStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","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 } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\n\nlet BOUND_DRAW_FN;\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || 'line';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tBOUND_DRAW_FN = this.boundDrawFn.bind(this);\n\t\twindow.addEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn.bind(this));\n\t}\n\n\tboundDrawFn() {\n\t\tthis.draw(true);\n\t}\n\n\tunbindWindowEvents() {\n\t\twindow.removeEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn.bind(this));\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t\tthis.parent.style.overflow = 'auto';\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { legendDot } from '../utils/draw';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(d[0]);\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 110;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${s.labels[i]}: ${d}`\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// 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\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tlabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\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 = 80;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr } 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\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath = makeArcPathStr(curStart, curEnd, this.center, this.radius, this.clockWise);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => value * Math.pow(10, exponent));\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t});\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { AXIS_CHART_DEFAULT_TYPE, AXIS_CHART_MIXED_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\tlet overridingType;\n\tif(AXIS_DATASET_CHART_TYPES.includes(type)) {\n\t\toverridingType = type;\n\t};\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t}\n\n\t\t// Set labels\n\n\t\t// Set type\n\t\tif(overridingType) {\n\t\t\td.chartType = overridingType;\n\t\t} else if(!d.chartType) {\n\t\t\td.chartType = AXIS_CHART_DEFAULT_TYPE;\n\t\t}\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 calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlet multiple = Math.ceil(label.length/allowedLetters);\n\t\t\t\tif(i % multiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","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.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth/2 * (2 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: s.yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\thideDots: this.lineOptions.hideDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tlet dbi = this.dataByIndex[index];\n\n\t\tthis.tip.setValues(\n\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\tdbi.values,\n\t\t\tindex\n\t\t);\n\n\t\tthis.tip.showTip();\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","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';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };"],"names":["$","expr","con","document","querySelector","create","tag","o","element","createElement","i","val","appendChild","ref","parentNode","insertBefore","addEventListener","keys","map","style","prop","setAttribute","getOffset","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isElementInViewport","el","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","AXIS_CHART_DEFAULT_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","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","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","slice","num","parseInt","b","g","toString","isValidColor","test","AXIS_TICK_LENGTH","LABEL_MARGIN","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","makeSVGContainer","className","makeSVGDefs","svgContainer","makeSVGGroup","transform","undefined","args","inside","makePath","pathStr","stroke","makeArcPathStr","startPosition","endPosition","center","clockWise","arcStartX","arcStartY","arcEndX","arcEndY","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","heatSquare","size","data","key","legendBar","label","text","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","l","line","makeHoriLine","x1","x2","lineType","yLine","pos","mode","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","meta","minHeight","datasetDot","dot","getPaths","xList","yList","pointsList","pointsStr","join","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","push","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","a","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","firstChild","BOUND_DRAW_FN","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","isNavigable","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","bind","draw","removeEventListener","makeContainer","updateWidth","independentWidth","overflow","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","error","animate","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","event","keyCode","chartSvg","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","reduce","textContent","legendTotals","barWidth","divisor","floor","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","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","positions","position","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","isNaN","mantissa","exponent","sig","isFinite","exp","log10","man","pow","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","reverse","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","points","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","overridingType","vals","chartType","yRegions","zeroDataPrep","zeroData","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","multiple","AxisChart","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","xAxis","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","stacked","yExtremes","cumulativeYPos","cumulative","allValueLists","barDatasets","lineDatasets","barsConfigs","spaceRatio","p","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","chartTypes","getChartByType","Chart"],"mappings":"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"} \ No newline at end of file diff --git a/docs/assets/js/docsBuilder.js b/docs/assets/js/docsBuilder.js index 8f6035e..27c0a98 100644 --- a/docs/assets/js/docsBuilder.js +++ b/docs/assets/js/docsBuilder.js @@ -7,6 +7,7 @@ export class docsBuilder { } makeSection(parent, sys) { + console.log('parent here?', parent); return new docSection(this.LIB_OBJ, parent, sys); } } @@ -25,13 +26,15 @@ class docSection { make() { // const section = document.querySelector(this.parent); let s = this.sys; - if(s.title) { - $.create('h6', { inside: this.parent, innerHTML: s.title }); - } + // if(s.title) { + // $.create('h6', { inside: this.parent, innerHTML: s.title }); + // } - s.contentBlocks.forEach((blockConf, index) => { - this.blockMap[index] = this.getBlock(blockConf); - }); + // s.contentBlocks.forEach((blockConf, index) => { + // this.blockMap[index] = this.getBlock(blockConf); + // }); + + this.blockMap['test'] = this.getDemo(s); } getBlock(blockConf) { @@ -106,6 +109,13 @@ class docSection { args[o.path[0]] = {}; } + const inputGroup = $.create('input', { + inside: btnGroup, + // className: `form-control`, + // innerHTML: `` + }); + Object.keys(o.states).forEach(key => { let state = o.states[key]; let activeClass = key === o.activeState ? 'active' : ''; diff --git a/docs/assets/js/index.js b/docs/assets/js/index.js index a413cd6..18cba04 100755 --- a/docs/assets/js/index.js +++ b/docs/assets/js/index.js @@ -7,9 +7,9 @@ import { docsBuilder } from './docsBuilder'; let Chart = frappe.Chart; // eslint-disable-line no-undef let dbd = new docsBuilder(Chart); let currentElement = document.querySelector('header'); -let sections; +let sections = []; -if(window.location.pathname.split("/").pop().includes('index')) { +if(document.querySelectorAll('#line-composite-1').length) { let lineCompositeChart = new Chart("#line-composite-1", lineComposite.config); let barCompositeChart = new Chart("#bar-composite-1", barComposite.config); @@ -21,10 +21,12 @@ if(window.location.pathname.split("/").pop().includes('index')) { }); sections = demoSections; -} else { - sections = docSections; } +// else { +// sections = docSections; +// } + sections.forEach(sectionConf => { let sectionEl = $.create('section', { className: sectionConf.name || sectionConf.title }); insertAfter(sectionEl, currentElement); diff --git a/docs/assets/js/index.min.js b/docs/assets/js/index.min.js index f4802cf..8e86170 100644 --- a/docs/assets/js/index.min.js +++ b/docs/assets/js/index.min.js @@ -214,7 +214,6 @@ var MONTH_NAMES_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", -// https://stackoverflow.com/a/11252167/6495043 function clone(date) { @@ -273,6 +272,12 @@ var HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001 // Universal constants +/** + * Returns the value of a number upto 2 decimal places. + * @param {Number} d Any number + */ + + /** * Returns whether or not two given arrays are equal. * @param {Array} arr1 First array @@ -335,6 +340,8 @@ function toTitleCase(str) { }); } +// Composite Chart +// ================================================================================ var reportCountList = [152, 222, 199, 287, 534, 709, 1179, 1256, 1632, 1856, 1850]; var lineCompositeData = { @@ -548,25 +555,6 @@ var heatmapData = { end: end }; -var sampleData = { - 0: { - labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], - datasets: [{ values: [18, 40, 30, 35, 8, 52, 17, -4] }] - }, - 1: { - labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], - datasets: [{ name: "Dataset 1", values: [18, 40, 30, 35, 8, 52, 17, -4] }, { name: "Dataset 2", values: [30, 50, -10, 15, 18, 32, 27, 14] }] - }, - 2: { - labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"], - datasets: [{ values: [300, 250, 720, 560, 370, 610, 690, 410, 370, 480, 620, 260, 170, 510, 630, 710] }] - }, - 3: { - labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - datasets: [{ values: [300, 250, 720, 560, 370, 610, 690, 410, 370, 480, 620, 260, 170, 510, 630, 710, 560, 370, 610, 260, 170] }] - } -}; - var lineComposite = { config: { title: "Fireball/Bolide Events - Yearly (reported)", @@ -803,209 +791,6 @@ var demoSections = [{ }] }]; -var docSections = [{ - name: "start", - contentBlocks: [ - // Intro - { - type: "text", - content: "A chart is generally a 2D rendition of data. For example,\n\t\t\t\t\tfor a set of values across items, the data could look like:" - }, { - type: "code", - content: " data = {\n labels: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n datasets: [\n\t { values: [18, 40, 30, 35, 8, 52, 17, -4] }\n ]\n }" - }, - - // type: 'bar' - { - type: "text", - content: "Plug that in with a type bar, a color and height:" - }, { - type: "code", - content: " new frappe.Chart( \"#chart\", {\n data: data,\n type: 'bar',\n height: 140,\n colors: ['red']\n });" - }, { - type: "demo", - config: { - data: sampleData[0], - type: 'bar', - height: 140, - colors: ['red'] - } - }, - - // type: 'line' - { - type: "text", - content: "And similarly, a line chart:" - }, { - type: "code", - content: " ...\n type: 'line',\n ..." - }, { - type: "demo", - config: { - data: sampleData[0], - type: 'line', - height: 140, - colors: ['red'] - } - }, - - // Axes lines: - { - type: "text", - content: "Axes lines are configurable. By default they are long\n\t\t\t\t\tspanning lines, but can also be short ticks:" - }, { - type: "code", - content: " ...\n axisOptions: {\n xAxisMode: 'tick' // default: 'span'\n },\n ..." - }, { - type: "demo", - config: { - data: sampleData[2], - type: 'bar', - height: 140, - colors: ['blue'], - axisOptions: { - xAxisMode: "tick" - } - } - }, - - // Bar width: - { - type: "text", - content: "The bar width can be set by defining the ratio of the space\n\t\t\t\t\tbetween bars to the bar width." - }, { - type: "code", - content: " ...\n barOptions: {\n spaceRatio: 0.2 // default: 1\n },\n ..." - }, { - type: "demo", - config: { - data: sampleData[3], - type: 'bar', - height: 140, - colors: ['orange'], - axisOptions: { - xAxisMode: "tick" - }, - barOptions: { - spaceRatio: 0.2 - } - }, - options: [{ - name: "barOptions", - path: ["barOptions"], - type: "map", - mapKeys: ['spaceRatio'], - states: { - "0.2": [0.2], - "0.5": [0.5], - "1": [1], - "1.5": [1.5] - }, - activeState: "0.2" - }] - }, - - // Dot radius: - { - type: "text", - content: 'So can the dot size on a line graph, with the `dotSize` property in `lineOptions`.' - }, { - type: "code", - content: " ...\n lineOptions: {\n dotRadius: 8 // default: 4\n },\n ..." - }, { - type: "demo", - config: { - data: sampleData[2], - type: 'line', - height: 140, - colors: ['orange'], - axisOptions: { - xAxisMode: "tick" - }, - lineOptions: { - dotSize: 8 - } - }, - options: [{ - name: "lineOptions", - path: ["lineOptions"], - type: "map", - mapKeys: ['dotSize'], - states: { - "3": [3], - "4": [4], - "8": [8], - "10": [10] - }, - activeState: "8" - }] - }] -}, { - title: "Trends and region charts", - name: "trends-and-region", - contentBlocks: [{ - type: "text", - content: 'lineOptions` have a bunch of other properties too. Region charts are' - }, { - type: "code", - content: " ...\n data: {\n labels: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n datasets: [\n { name: \"Dataset 1\", values: [18, 40, 30, 35, 8, 52, 17, -4] },\n { name: \"Dataset 2\", values: [30, 50, -10, 15, 18, 32, 27, 14] }\n ]\n },\n ..." - }, { - type: "demo", - config: { - data: trendsData, - type: 'line', - height: 180, - colors: ['violet'], - axisOptions: { - xAxisMode: 'tick', - yAxisMode: 'span', - xIsSeries: 1 - } - }, - options: [{ - name: "lineOptions", - path: ["lineOptions"], - type: "map", - mapKeys: ['hideLine', 'hideDots', 'heatline', 'regionFill'], - states: { - "Line": [0, 1, 0, 0], - "Dots": [1, 0, 0, 0], - "HeatLine": [0, 1, 1, 0], - "Region": [0, 1, 0, 1] - }, - activeState: "HeatLine" - }] - }] -}, { - title: "Adding more datasets", - name: "multi-dataset", - contentBlocks: [{ - type: "text", - content: "A chart can have multiple datasets. In an axis chart, every dataset is represented individually." - }, { - type: "code", - content: " ...\n data: {\n labels: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n datasets: [\n { name: \"Dataset 1\", values: [18, 40, 30, 35, 8, 52, 17, -4] },\n { name: \"Dataset 2\", values: [30, 50, -10, 15, 18, 32, 27, 14] }\n ]\n },\n ..." - }, { - type: "demo", - config: { - data: sampleData[1], - type: 'line', - height: 200, - colors: ['green', 'light-green'] - }, - options: [{ - name: "type", - path: ["type"], - type: "string", - states: { - "Line": 'line', - "Bar": 'bar' - }, - activeState: "Mixed" - }] - }] -}]; - 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; }; }(); function _toConsumableArray(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); } } @@ -1022,6 +807,7 @@ var docsBuilder = function () { _createClass(docsBuilder, [{ key: 'makeSection', value: function makeSection(parent, sys) { + console.log('parent here?', parent); return new docSection(this.LIB_OBJ, parent, sys); } }]); @@ -1045,17 +831,17 @@ var docSection = function () { _createClass(docSection, [{ key: 'make', value: function make() { - var _this = this; - // const section = document.querySelector(this.parent); var s = this.sys; - if (s.title) { - $.create('h6', { inside: this.parent, innerHTML: s.title }); - } + // if(s.title) { + // $.create('h6', { inside: this.parent, innerHTML: s.title }); + // } - s.contentBlocks.forEach(function (blockConf, index) { - _this.blockMap[index] = _this.getBlock(blockConf); - }); + // s.contentBlocks.forEach((blockConf, index) => { + // this.blockMap[index] = this.getBlock(blockConf); + // }); + + this.blockMap['test'] = this.getDemo(s); } }, { key: 'getBlock', @@ -1127,14 +913,14 @@ var docSection = function () { value: function getDemoOptions(demoIndex) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - var _this2 = this; + var _this = this; var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var figure = arguments[3]; options.forEach(function (o) { var btnGroup = $.create('div', { - inside: _this2.parent, + inside: _this.parent, className: 'btn-group ' + o.name }); var mapKeys = o.mapKeys; @@ -1143,6 +929,13 @@ var docSection = function () { args[o.path[0]] = {}; } + var inputGroup = $.create('input', { + inside: btnGroup + // className: `form-control`, + // innerHTML: `` + }); + Object.keys(o.states).forEach(function (key) { var state = o.states[key]; var activeClass = key === o.activeState ? 'active' : ''; @@ -1161,7 +954,7 @@ var docSection = function () { // boolean, string, number, object args[o.path[0]] = state; } - _this2.demos[demoIndex] = new _this2.LIB_OBJ(figure, args); + _this.demos[demoIndex] = new _this.LIB_OBJ(figure, args); } }); @@ -1174,19 +967,19 @@ var docSection = function () { }, { key: 'getDemoActions', value: function getDemoActions(demoIndex) { - var _this3 = this; + var _this2 = this; var actions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; actions.forEach(function (o) { var args = o.args || []; $.create('button', { - inside: _this3.parent, + inside: _this2.parent, className: 'btn btn-action btn-sm btn-secondary', innerHTML: o.name, onClick: function onClick() { var _demos$demoIndex; - (_demos$demoIndex = _this3.demos[demoIndex])[o.fn].apply(_demos$demoIndex, _toConsumableArray(args)); + (_demos$demoIndex = _this2.demos[demoIndex])[o.fn].apply(_demos$demoIndex, _toConsumableArray(args)); } }); }); @@ -1199,9 +992,9 @@ var docSection = function () { var Chart = frappe.Chart; // eslint-disable-line no-undef var dbd = new docsBuilder(Chart); var currentElement = document.querySelector('header'); -var sections = void 0; +var sections = []; -if (window.location.pathname.split("/").pop().includes('index')) { +if (document.querySelectorAll('#line-composite-1').length) { var lineCompositeChart = new Chart("#line-composite-1", lineComposite.config); var barCompositeChart = new Chart("#bar-composite-1", barComposite.config); @@ -1211,10 +1004,12 @@ if (window.location.pathname.split("/").pop().includes('index')) { }); sections = demoSections; -} else { - sections = docSections; } +// else { +// sections = docSections; +// } + sections.forEach(function (sectionConf) { var sectionEl = $.create('section', { className: sectionConf.name || sectionConf.title }); insertAfter(sectionEl, currentElement); diff --git a/docs/docs.html b/docs/docs.html deleted file mode 100644 index b15dc6d..0000000 --- a/docs/docs.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Frappe Charts - - - - - - - - - - - - - - - - - - - -
                  -

                  Documentation

                  -

                  Because it is beautiful.

                  -
                  - - - - - - - - - - - - diff --git a/docs/docsify/.nojekyll b/docs/docsify/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/docsify/README.md b/docs/docsify/README.md new file mode 100644 index 0000000..b45679a --- /dev/null +++ b/docs/docsify/README.md @@ -0,0 +1,138 @@ +
                  + + +

                  Frappe Charts

                  +
                  +

                  +

                  GitHub-inspired modern, intuitive and responsive charts with zero dependencies

                  + + Explore Demos » + + + Edit at CodePen » + +

                  +
                  + +
                  + +

                  + + + + + + + + + +

                  + +

                  + + + +

                  + +### Contents +* [Installation](#installation) +* [Usage](#usage) +* [Updates](#updates) +* [License](#license) + +#### Installation +* Install via [`npm`](https://www.npmjs.com/get-npm): + + ```console + $ npm install frappe-charts + ``` + + and include in your project: + ```js + import { Chart } from "frappe-charts" + ``` + +* ...or include within your HTML + + ```html + + + + ``` + +#### Usage +```js +const data = { + labels: ["12am-3am", "3am-6pm", "6am-9am", "9am-12am", + "12pm-3pm", "3pm-6pm", "6pm-9pm", "9am-12am" + ], + datasets: [ + { + name: "Some Data", type: "bar", + values: [25, 40, 30, 35, 8, 52, 17, -4] + }, + { + name: "Another Set", type: "line", + values: [25, 50, -10, 15, 18, 32, 27, 14] + } + ] +} + +const chart = new frappe.Chart("#chart", { // or a DOM element, + // new Chart() in case of ES6 module with above usage + title: "My Awesome Chart", + data: data, + type: 'axis-mixed', // or 'bar', 'line', 'scatter', 'pie', 'percentage' + height: 250, + colors: ['#7cd6fd', '#743ee2'] +}) +``` + +If you want to contribute: + +1. Clone this repo. +2. `cd` into project directory +3. `npm install` +4. `npm run dev` + +#### Updates + +##### v1.0.0 +- Major rewrite out. Some new features include: + - Mixed type axis datasets + - Stacked bar charts + - Value over data points + - Y Markers and regions + - Dot size, Bar space size, and other options + - Legend for axis charts +- We would be looking to incorporate existing PRs and issues in the meantime. + +##### Please read [#93](https://github.com/frappe/charts/issues/93) for v0.1.0 updates on rework and development. + +##### v0.0.7 +- [Custom color values](https://github.com/frappe/charts/pull/71) for charts as hex codes. The API now takes an array of colors for all charts instead of a color for each dataset. +- [@iamkdev's](https://github.com/iamkdev) blog on [usage with Angular](https://medium.com/@iamkdev/frappé-charts-with-angular-c9c5dd075d9f). + +##### v0.0.5 +- More [flexible Y values](https://github.com/frappe/charts/commit/3de049c451194dcd8e61ff91ceeb998ce131c709): independent from exponent, minimum Y axis point for line graphs. +- Customisable [Heatmap colors](https://github.com/frappe/charts/pull/53); check out the Halloween demo on the [website](https://frappe.github.io/charts) :D +- Tooltip values can be [formatted](https://github.com/frappe/charts/commit/e3d9ed0eae14b65044dca0542cdd4d12af3f2b44). + +##### v0.0.4 +- Build update: [Shipped](https://github.com/frappe/charts/pull/35) an ES6 module, along with the browser friendly IIFE. + +##### v0.0.2 +- We have an animated [Pie Chart](https://github.com/frappe/charts/issues/29)! Thanks [@sheweichun](https://github.com/sheweichun). +- [@tobiaslins](https://github.com/tobiaslins) contributed tweaks for his quest to make these easy to use with React. Check out his [repo](https://github.com/tobiaslins/frappe-charts-react-example) and updates at [#24](https://github.com/frappe/charts/issues/24) to learn more :) +- A new logo. + +##### v0.0.1 +- The very first version out, with animatable bars and lines, a percentage chart and a heatmap. GitHub-style. + +#### License +This repository has been released under the [MIT License](LICENSE) + +------------------ +Project maintained by [Frappe](https://frappe.io). +Used in [ERPNext](https://erpnext.com). Read the [blog post](https://medium.com/@pratu16x7/so-we-decided-to-create-our-own-charts-a95cb5032c97). + diff --git a/docs/docsify/_sidebar.md b/docs/docsify/_sidebar.md new file mode 100644 index 0000000..8635369 --- /dev/null +++ b/docs/docsify/_sidebar.md @@ -0,0 +1,10 @@ +* Getting started + + * [Quick start](chap1/test1.md) + +* Customization + + * [Configuration](test2.md) + + +* [Changelog](test.md) diff --git a/docs/docsify/assets/css/bootstrap.min.css b/docs/docsify/assets/css/bootstrap.min.css new file mode 100644 index 0000000..06cf582 --- /dev/null +++ b/docs/docsify/assets/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0-alpha.5 (https://getbootstrap.com) + * Copyright 2011-2016 The Bootstrap Authors + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v4.2.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}@media print{*,::after,::before,::first-letter,blockquote::first-line,div::first-line,li::first-line,p::first-line{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.tag{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}html{font-size:16px;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;line-height:1.5;color:#373a3c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #818a91}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse;background-color:transparent}caption{padding-top:.75rem;padding-bottom:.75rem;color:#818a91;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,select,textarea{line-height:inherit}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{-webkit-appearance:listbox}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{-webkit-appearance:none}output{display:inline-block}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300}.display-2{font-size:5.5rem;font-weight:300}.display-3{font-size:4.5rem;font-weight:300}.display-4{font-size:3.5rem;font-weight:300}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;color:#818a91}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}dl.row>dd+dt{clear:left}.carousel-inner>.carousel-item>a>img,.carousel-inner>.carousel-item>img,.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#818a91}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f7f7f9;border-radius:.25rem}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#333;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#373a3c}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.container::after{content:"";display:table;clear:both}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}.container-fluid::after{content:"";display:table;clear:both}.row{margin-right:-15px;margin-left:-15px}.row::after{content:"";display:table;clear:both}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{padding-right:15px;padding-left:15px}}.col-xs-1{float:left;width:8.333333%}.col-xs-2{float:left;width:16.666667%}.col-xs-3{float:left;width:25%}.col-xs-4{float:left;width:33.333333%}.col-xs-5{float:left;width:41.666667%}.col-xs-6{float:left;width:50%}.col-xs-7{float:left;width:58.333333%}.col-xs-8{float:left;width:66.666667%}.col-xs-9{float:left;width:75%}.col-xs-10{float:left;width:83.333333%}.col-xs-11{float:left;width:91.666667%}.col-xs-12{float:left;width:100%}.pull-xs-0{right:auto}.pull-xs-1{right:8.333333%}.pull-xs-2{right:16.666667%}.pull-xs-3{right:25%}.pull-xs-4{right:33.333333%}.pull-xs-5{right:41.666667%}.pull-xs-6{right:50%}.pull-xs-7{right:58.333333%}.pull-xs-8{right:66.666667%}.pull-xs-9{right:75%}.pull-xs-10{right:83.333333%}.pull-xs-11{right:91.666667%}.pull-xs-12{right:100%}.push-xs-0{left:auto}.push-xs-1{left:8.333333%}.push-xs-2{left:16.666667%}.push-xs-3{left:25%}.push-xs-4{left:33.333333%}.push-xs-5{left:41.666667%}.push-xs-6{left:50%}.push-xs-7{left:58.333333%}.push-xs-8{left:66.666667%}.push-xs-9{left:75%}.push-xs-10{left:83.333333%}.push-xs-11{left:91.666667%}.push-xs-12{left:100%}.offset-xs-1{margin-left:8.333333%}.offset-xs-2{margin-left:16.666667%}.offset-xs-3{margin-left:25%}.offset-xs-4{margin-left:33.333333%}.offset-xs-5{margin-left:41.666667%}.offset-xs-6{margin-left:50%}.offset-xs-7{margin-left:58.333333%}.offset-xs-8{margin-left:66.666667%}.offset-xs-9{margin-left:75%}.offset-xs-10{margin-left:83.333333%}.offset-xs-11{margin-left:91.666667%}@media (min-width:576px){.col-sm-1{float:left;width:8.333333%}.col-sm-2{float:left;width:16.666667%}.col-sm-3{float:left;width:25%}.col-sm-4{float:left;width:33.333333%}.col-sm-5{float:left;width:41.666667%}.col-sm-6{float:left;width:50%}.col-sm-7{float:left;width:58.333333%}.col-sm-8{float:left;width:66.666667%}.col-sm-9{float:left;width:75%}.col-sm-10{float:left;width:83.333333%}.col-sm-11{float:left;width:91.666667%}.col-sm-12{float:left;width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0%}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md-1{float:left;width:8.333333%}.col-md-2{float:left;width:16.666667%}.col-md-3{float:left;width:25%}.col-md-4{float:left;width:33.333333%}.col-md-5{float:left;width:41.666667%}.col-md-6{float:left;width:50%}.col-md-7{float:left;width:58.333333%}.col-md-8{float:left;width:66.666667%}.col-md-9{float:left;width:75%}.col-md-10{float:left;width:83.333333%}.col-md-11{float:left;width:91.666667%}.col-md-12{float:left;width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0%}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg-1{float:left;width:8.333333%}.col-lg-2{float:left;width:16.666667%}.col-lg-3{float:left;width:25%}.col-lg-4{float:left;width:33.333333%}.col-lg-5{float:left;width:41.666667%}.col-lg-6{float:left;width:50%}.col-lg-7{float:left;width:58.333333%}.col-lg-8{float:left;width:66.666667%}.col-lg-9{float:left;width:75%}.col-lg-10{float:left;width:83.333333%}.col-lg-11{float:left;width:91.666667%}.col-lg-12{float:left;width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0%}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl-1{float:left;width:8.333333%}.col-xl-2{float:left;width:16.666667%}.col-xl-3{float:left;width:25%}.col-xl-4{float:left;width:33.333333%}.col-xl-5{float:left;width:41.666667%}.col-xl-6{float:left;width:50%}.col-xl-7{float:left;width:58.333333%}.col-xl-8{float:left;width:66.666667%}.col-xl-9{float:left;width:75%}.col-xl-10{float:left;width:83.333333%}.col-xl-11{float:left;width:91.666667%}.col-xl-12{float:left;width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0%}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #eceeef}.table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody{border-top:2px solid #eceeef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered td,.table-bordered th{border:1px solid #eceeef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table-success,.table-success>td,.table-success>th{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>td,.table-info>th{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>td,.table-warning>th{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>td,.table-danger>th{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.thead-inverse th{color:#fff;background-color:#373a3c}.thead-default th{color:#55595c;background-color:#eceeef}.table-inverse{color:#eceeef;background-color:#373a3c}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#55595c}.table-inverse.table-bordered{border:0}.table-responsive{display:block;width:100%;min-height:0%;overflow-x:auto}.table-reflow thead{float:left}.table-reflow tbody{display:block;white-space:nowrap}.table-reflow td,.table-reflow th{border-top:1px solid #eceeef;border-left:1px solid #eceeef}.table-reflow td:last-child,.table-reflow th:last-child{border-right:1px solid #eceeef}.table-reflow tbody:last-child tr:last-child td,.table-reflow tbody:last-child tr:last-child th,.table-reflow tfoot:last-child tr:last-child td,.table-reflow tfoot:last-child tr:last-child th,.table-reflow thead:last-child tr:last-child td,.table-reflow thead:last-child tr:last-child th{border-bottom:1px solid #eceeef}.table-reflow tr{float:left}.table-reflow tr td,.table-reflow tr th{display:block!important;border:1px solid #eceeef}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#55595c;background-color:#fff;background-image:none;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#55595c;background-color:#fff;border-color:#66afe9;outline:0}.form-control::-webkit-input-placeholder{color:#999;opacity:1}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999;opacity:1}.form-control::placeholder{color:#999;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eceeef;opacity:1}.form-control:disabled{cursor:not-allowed}select.form-control:not([size]):not([multiple]){height:calc(2.5rem - 2px)}select.form-control:focus::-ms-value{color:#55595c;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0}.col-form-label-lg{padding-top:.75rem;padding-bottom:.75rem;font-size:1.25rem}.col-form-label-sm{padding-top:.25rem;padding-bottom:.25rem;font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-static{padding-top:.5rem;padding-bottom:.5rem;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-static.form-control-lg,.form-control-static.form-control-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:1.8125rem}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:3.166667rem}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-check{position:relative;display:block;margin-bottom:.75rem}.form-check+.form-check{margin-top:-.25rem}.form-check.disabled .form-check-label{color:#818a91;cursor:not-allowed}.form-check-label{padding-left:1.25rem;margin-bottom:0;cursor:pointer}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{position:relative;display:inline-block;padding-left:1.25rem;margin-bottom:0;vertical-align:middle;cursor:pointer}.form-check-inline+.form-check-inline{margin-left:.75rem}.form-check-inline.disabled{color:#818a91;cursor:not-allowed}.form-control-feedback{margin-top:.25rem}.form-control-danger,.form-control-success,.form-control-warning{padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .625rem;-webkit-background-size:1.25rem 1.25rem;background-size:1.25rem 1.25rem}.has-success .custom-control,.has-success .form-check-inline,.has-success .form-check-label,.has-success .form-control-feedback,.has-success .form-control-label{color:#5cb85c}.has-success .form-control{border-color:#5cb85c}.has-success .form-control:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #a3d7a3;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #a3d7a3}.has-success .input-group-addon{color:#5cb85c;border-color:#5cb85c;background-color:#eaf6ea}.has-success .form-control-success{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#5cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E")}.has-warning .custom-control,.has-warning .form-check-inline,.has-warning .form-check-label,.has-warning .form-control-feedback,.has-warning .form-control-label{color:#f0ad4e}.has-warning .form-control{border-color:#f0ad4e}.has-warning .form-control:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f8d9ac;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f8d9ac}.has-warning .input-group-addon{color:#f0ad4e;border-color:#f0ad4e;background-color:#fff}.has-warning .form-control-warning{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E")}.has-danger .custom-control,.has-danger .form-check-inline,.has-danger .form-check-label,.has-danger .form-control-feedback,.has-danger .form-control-label{color:#d9534f}.has-danger .form-control{border-color:#d9534f}.has-danger .form-control:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #eba5a3;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #eba5a3}.has-danger .input-group-addon{color:#d9534f;border-color:#d9534f;background-color:#fdf7f7}.has-danger .form-control-danger{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E")}@media (min-width:576px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;width:auto;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;border-radius:.25rem}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{text-decoration:none}.btn.focus{text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0}.btn.disabled,.btn:disabled{cursor:not-allowed;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#025aa5;border-color:#01549b;background-image:none}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#014682;border-color:#01315a}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary:disabled.focus,.btn-primary:disabled:focus{background-color:#0275d8;border-color:#0275d8}.btn-primary.disabled:hover,.btn-primary:disabled:hover{background-color:#0275d8;border-color:#0275d8}.btn-secondary{color:#373a3c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary.focus,.btn-secondary:focus{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary.active,.btn-secondary:active,.open>.btn-secondary.dropdown-toggle{color:#373a3c;background-color:#e6e6e6;border-color:#adadad;background-image:none}.btn-secondary.active.focus,.btn-secondary.active:focus,.btn-secondary.active:hover,.btn-secondary:active.focus,.btn-secondary:active:focus,.btn-secondary:active:hover,.open>.btn-secondary.dropdown-toggle.focus,.open>.btn-secondary.dropdown-toggle:focus,.open>.btn-secondary.dropdown-toggle:hover{color:#373a3c;background-color:#d4d4d4;border-color:#8c8c8c}.btn-secondary.disabled.focus,.btn-secondary.disabled:focus,.btn-secondary:disabled.focus,.btn-secondary:disabled:focus{background-color:#fff;border-color:#ccc}.btn-secondary.disabled:hover,.btn-secondary:disabled:hover{background-color:#fff;border-color:#ccc}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#2aabd2;background-image:none}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info:disabled.focus,.btn-info:disabled:focus{background-color:#5bc0de;border-color:#5bc0de}.btn-info.disabled:hover,.btn-info:disabled:hover{background-color:#5bc0de;border-color:#5bc0de}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#419641}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#419641;background-image:none}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#398439;border-color:#2d672d}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success:disabled.focus,.btn-success:disabled:focus{background-color:#5cb85c;border-color:#5cb85c}.btn-success.disabled:hover,.btn-success:disabled:hover{background-color:#5cb85c;border-color:#5cb85c}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#eb9316;background-image:none}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning:disabled.focus,.btn-warning:disabled:focus{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.disabled:hover,.btn-warning:disabled:hover{background-color:#f0ad4e;border-color:#f0ad4e}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#c12e2a;background-image:none}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#ac2925;border-color:#8b211e}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger:disabled.focus,.btn-danger:disabled:focus{background-color:#d9534f;border-color:#d9534f}.btn-danger.disabled:hover,.btn-danger:disabled:hover{background-color:#d9534f;border-color:#d9534f}.btn-outline-primary{color:#0275d8;background-image:none;background-color:transparent;border-color:#0275d8}.btn-outline-primary:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-primary.focus,.btn-outline-primary:focus{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-primary.active,.btn-outline-primary:active,.open>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-primary.active.focus,.btn-outline-primary.active:focus,.btn-outline-primary.active:hover,.btn-outline-primary:active.focus,.btn-outline-primary:active:focus,.btn-outline-primary:active:hover,.open>.btn-outline-primary.dropdown-toggle.focus,.open>.btn-outline-primary.dropdown-toggle:focus,.open>.btn-outline-primary.dropdown-toggle:hover{color:#fff;background-color:#014682;border-color:#01315a}.btn-outline-primary.disabled.focus,.btn-outline-primary.disabled:focus,.btn-outline-primary:disabled.focus,.btn-outline-primary:disabled:focus{border-color:#43a7fd}.btn-outline-primary.disabled:hover,.btn-outline-primary:disabled:hover{border-color:#43a7fd}.btn-outline-secondary{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.btn-outline-secondary:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary.focus,.btn-outline-secondary:focus{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary.active,.btn-outline-secondary:active,.open>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-outline-secondary.active.focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.active:hover,.btn-outline-secondary:active.focus,.btn-outline-secondary:active:focus,.btn-outline-secondary:active:hover,.open>.btn-outline-secondary.dropdown-toggle.focus,.open>.btn-outline-secondary.dropdown-toggle:focus,.open>.btn-outline-secondary.dropdown-toggle:hover{color:#fff;background-color:#a1a1a1;border-color:#8c8c8c}.btn-outline-secondary.disabled.focus,.btn-outline-secondary.disabled:focus,.btn-outline-secondary:disabled.focus,.btn-outline-secondary:disabled:focus{border-color:#fff}.btn-outline-secondary.disabled:hover,.btn-outline-secondary:disabled:hover{border-color:#fff}.btn-outline-info{color:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info.focus,.btn-outline-info:focus{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info.active,.btn-outline-info:active,.open>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info.active.focus,.btn-outline-info.active:focus,.btn-outline-info.active:hover,.btn-outline-info:active.focus,.btn-outline-info:active:focus,.btn-outline-info:active:hover,.open>.btn-outline-info.dropdown-toggle.focus,.open>.btn-outline-info.dropdown-toggle:focus,.open>.btn-outline-info.dropdown-toggle:hover{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-outline-info.disabled.focus,.btn-outline-info.disabled:focus,.btn-outline-info:disabled.focus,.btn-outline-info:disabled:focus{border-color:#b0e1ef}.btn-outline-info.disabled:hover,.btn-outline-info:disabled:hover{border-color:#b0e1ef}.btn-outline-success{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success.focus,.btn-outline-success:focus{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success.active,.btn-outline-success:active,.open>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success.active.focus,.btn-outline-success.active:focus,.btn-outline-success.active:hover,.btn-outline-success:active.focus,.btn-outline-success:active:focus,.btn-outline-success:active:hover,.open>.btn-outline-success.dropdown-toggle.focus,.open>.btn-outline-success.dropdown-toggle:focus,.open>.btn-outline-success.dropdown-toggle:hover{color:#fff;background-color:#398439;border-color:#2d672d}.btn-outline-success.disabled.focus,.btn-outline-success.disabled:focus,.btn-outline-success:disabled.focus,.btn-outline-success:disabled:focus{border-color:#a3d7a3}.btn-outline-success.disabled:hover,.btn-outline-success:disabled:hover{border-color:#a3d7a3}.btn-outline-warning{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning.focus,.btn-outline-warning:focus{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning.active,.btn-outline-warning:active,.open>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning.active.focus,.btn-outline-warning.active:focus,.btn-outline-warning.active:hover,.btn-outline-warning:active.focus,.btn-outline-warning:active:focus,.btn-outline-warning:active:hover,.open>.btn-outline-warning.dropdown-toggle.focus,.open>.btn-outline-warning.dropdown-toggle:focus,.open>.btn-outline-warning.dropdown-toggle:hover{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-outline-warning.disabled.focus,.btn-outline-warning.disabled:focus,.btn-outline-warning:disabled.focus,.btn-outline-warning:disabled:focus{border-color:#f8d9ac}.btn-outline-warning.disabled:hover,.btn-outline-warning:disabled:hover{border-color:#f8d9ac}.btn-outline-danger{color:#d9534f;background-image:none;background-color:transparent;border-color:#d9534f}.btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger.focus,.btn-outline-danger:focus{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger.active,.btn-outline-danger:active,.open>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger.active.focus,.btn-outline-danger.active:focus,.btn-outline-danger.active:hover,.btn-outline-danger:active.focus,.btn-outline-danger:active:focus,.btn-outline-danger:active:hover,.open>.btn-outline-danger.dropdown-toggle.focus,.open>.btn-outline-danger.dropdown-toggle:focus,.open>.btn-outline-danger.dropdown-toggle:hover{color:#fff;background-color:#ac2925;border-color:#8b211e}.btn-outline-danger.disabled.focus,.btn-outline-danger.disabled:focus,.btn-outline-danger:disabled.focus,.btn-outline-danger:disabled:focus{border-color:#eba5a3}.btn-outline-danger.disabled:hover,.btn-outline-danger:disabled:hover{border-color:#eba5a3}.btn-link{font-weight:400;color:#0275d8;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled:focus,.btn-link:disabled:hover{color:#818a91;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height;-o-transition-property:height;transition-property:height}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.3em;vertical-align:middle;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:focus{outline:0}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:1px;margin:.5rem 0;overflow:hidden;background-color:#e5e5e5}.dropdown-item{display:block;width:100%;padding:3px 1.5rem;clear:both;font-weight:400;color:#373a3c;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#2b2d2f;text-decoration:none;background-color:#f5f5f5}.dropdown-item.active,.dropdown-item.active:focus,.dropdown-item.active:hover{color:#fff;text-decoration:none;background-color:#0275d8;outline:0}.dropdown-item.disabled,.dropdown-item.disabled:focus,.dropdown-item.disabled:hover{color:#818a91}.dropdown-item.disabled:focus,.dropdown-item.disabled:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:"progid:DXImageTransform.Microsoft.gradient(enabled = false)"}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#818a91;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:.3em solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:.125rem}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left;margin-bottom:0}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-.5rem}.btn-toolbar::after{content:"";display:table;clear:both}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:.5rem}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.btn .caret{margin-left:0}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:.3em .3em 0;border-bottom-width:0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 .3em .3em}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group::after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;width:100%;display:table;border-collapse:separate}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#55595c;text-align:center;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.75rem 1.5rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:inline-block;padding-left:1.5rem;cursor:pointer}.custom-control+.custom-control{margin-left:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#0074d9}.custom-control-input:focus~.custom-control-indicator{-webkit-box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #0074d9;box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #0074d9}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#84c6ff}.custom-control-input:disabled~.custom-control-indicator{cursor:not-allowed;background-color:#eee}.custom-control-input:disabled~.custom-control-description{color:#767676;cursor:not-allowed}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;-webkit-background-size:50% 50%;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0074d9;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#fff'/%3E%3C/svg%3E")}.custom-controls-stacked .custom-control{float:left;clear:left}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.5rem - 2px);padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem\9;color:#55595c;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-image:none\9;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-moz-appearance:none;-webkit-appearance:none}.custom-select:focus{border-color:#51a7e8;outline:0}.custom-select:focus::-ms-value{color:#55595c;background-color:#fff}.custom-select:disabled{color:#818a91;cursor:not-allowed;background-color:#eceeef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;cursor:pointer}.custom-file-input{min-width:14rem;max-width:100%;margin:0;filter:alpha(opacity=0);opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#555;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid #ddd;border-radius:.25rem}.custom-file-control:lang(en)::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#555;background-color:#eee;border:1px solid #ddd;border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:inline-block}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#818a91}.nav-link.disabled,.nav-link.disabled:focus,.nav-link.disabled:hover{color:#818a91;cursor:not-allowed;background-color:transparent}.nav-inline .nav-item{display:inline-block}.nav-inline .nav-item+.nav-item,.nav-inline .nav-link+.nav-link{margin-left:1rem}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs::after{content:"";display:table;clear:both}.nav-tabs .nav-item{float:left;margin-bottom:-1px}.nav-tabs .nav-item+.nav-item{margin-left:.2rem}.nav-tabs .nav-link{display:block;padding:.5em 1em;border:1px solid transparent;border-top-right-radius:.25rem;border-top-left-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#eceeef #eceeef #ddd}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link.disabled:focus,.nav-tabs .nav-link.disabled:hover{color:#818a91;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link:hover,.nav-tabs .nav-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover{color:#55595c;background-color:#fff;border-color:#ddd #ddd transparent}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.nav-pills::after{content:"";display:table;clear:both}.nav-pills .nav-item{float:left}.nav-pills .nav-item+.nav-item{margin-left:.2rem}.nav-pills .nav-link{display:block;padding:.5em 1em;border-radius:.25rem}.nav-pills .nav-item.open .nav-link,.nav-pills .nav-item.open .nav-link:focus,.nav-pills .nav-item.open .nav-link:hover,.nav-pills .nav-link.active,.nav-pills .nav-link.active:focus,.nav-pills .nav-link.active:hover{color:#fff;cursor:default;background-color:#0275d8}.nav-stacked .nav-item{display:block;float:none}.nav-stacked .nav-item+.nav-item{margin-top:.2rem;margin-left:0}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar::after{content:"";display:table;clear:both}@media (min-width:576px){.navbar{border-radius:.25rem}}.navbar-full{z-index:1000}@media (min-width:576px){.navbar-full{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:576px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0}.navbar-sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1030;width:100%}@media (min-width:576px){.navbar-sticky-top{border-radius:0}}.navbar-brand{float:left;padding-top:.25rem;padding-bottom:.25rem;margin-right:1rem;font-size:1.25rem;line-height:inherit}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-divider{float:left;width:1px;padding-top:.425rem;padding-bottom:.425rem;margin-right:1rem;margin-left:1rem;overflow:hidden}.navbar-divider::before{content:"\00a0"}.navbar-text{display:inline-block;padding-top:.425rem;padding-bottom:.425rem}.navbar-toggler{width:2.5em;height:2em;padding:.5rem .75rem;font-size:1.25rem;line-height:1;background:transparent no-repeat center center;-webkit-background-size:24px 24px;background-size:24px 24px;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggleable-xs::after{content:"";display:table;clear:both}@media (max-width:575px){.navbar-toggleable-xs .navbar-brand{display:block;float:none;margin-top:.5rem;margin-right:0}.navbar-toggleable-xs .navbar-nav{margin-top:.5rem;margin-bottom:.5rem}.navbar-toggleable-xs .navbar-nav .dropdown-menu{position:static;float:none}}@media (min-width:576px){.navbar-toggleable-xs{display:block}}.navbar-toggleable-sm::after{content:"";display:table;clear:both}@media (max-width:767px){.navbar-toggleable-sm .navbar-brand{display:block;float:none;margin-top:.5rem;margin-right:0}.navbar-toggleable-sm .navbar-nav{margin-top:.5rem;margin-bottom:.5rem}.navbar-toggleable-sm .navbar-nav .dropdown-menu{position:static;float:none}}@media (min-width:768px){.navbar-toggleable-sm{display:block}}.navbar-toggleable-md::after{content:"";display:table;clear:both}@media (max-width:991px){.navbar-toggleable-md .navbar-brand{display:block;float:none;margin-top:.5rem;margin-right:0}.navbar-toggleable-md .navbar-nav{margin-top:.5rem;margin-bottom:.5rem}.navbar-toggleable-md .navbar-nav .dropdown-menu{position:static;float:none}}@media (min-width:992px){.navbar-toggleable-md{display:block}}.navbar-toggleable-lg::after{content:"";display:table;clear:both}@media (max-width:1199px){.navbar-toggleable-lg .navbar-brand{display:block;float:none;margin-top:.5rem;margin-right:0}.navbar-toggleable-lg .navbar-nav{margin-top:.5rem;margin-bottom:.5rem}.navbar-toggleable-lg .navbar-nav .dropdown-menu{position:static;float:none}}@media (min-width:1200px){.navbar-toggleable-lg{display:block}}.navbar-toggleable-xl{display:block}.navbar-toggleable-xl::after{content:"";display:table;clear:both}.navbar-toggleable-xl .navbar-brand{display:block;float:none;margin-top:.5rem;margin-right:0}.navbar-toggleable-xl .navbar-nav{margin-top:.5rem;margin-bottom:.5rem}.navbar-toggleable-xl .navbar-nav .dropdown-menu{position:static;float:none}.navbar-nav .nav-item{float:left}.navbar-nav .nav-link{display:block;padding-top:.425rem;padding-bottom:.425rem}.navbar-nav .nav-link+.nav-link{margin-left:1rem}.navbar-nav .nav-item+.nav-item{margin-left:1rem}.navbar-light .navbar-brand,.navbar-light .navbar-toggler{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover,.navbar-light .navbar-toggler:focus,.navbar-light .navbar-toggler:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .active>.nav-link:focus,.navbar-light .navbar-nav .active>.nav-link:hover,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.active:focus,.navbar-light .navbar-nav .nav-link.active:hover,.navbar-light .navbar-nav .nav-link.open,.navbar-light .navbar-nav .nav-link.open:focus,.navbar-light .navbar-nav .nav-link.open:hover,.navbar-light .navbar-nav .open>.nav-link,.navbar-light .navbar-nav .open>.nav-link:focus,.navbar-light .navbar-nav .open>.nav-link:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E");border-color:rgba(0,0,0,.1)}.navbar-light .navbar-divider{background-color:rgba(0,0,0,.075)}.navbar-dark .navbar-brand,.navbar-dark .navbar-toggler{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-toggler:focus,.navbar-dark .navbar-toggler:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .active>.nav-link:focus,.navbar-dark .navbar-nav .active>.nav-link:hover,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.active:focus,.navbar-dark .navbar-nav .nav-link.active:hover,.navbar-dark .navbar-nav .nav-link.open,.navbar-dark .navbar-nav .nav-link.open:focus,.navbar-dark .navbar-nav .nav-link.open:hover,.navbar-dark .navbar-nav .open>.nav-link,.navbar-dark .navbar-nav .open>.nav-link:focus,.navbar-dark .navbar-nav .open>.nav-link:hover{color:#fff}.navbar-dark .navbar-toggler{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E");border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-divider{background-color:rgba(255,255,255,.075)}.navbar-toggleable-xs::after{content:"";display:table;clear:both}@media (max-width:575px){.navbar-toggleable-xs .navbar-nav .nav-item{float:none;margin-left:0}}@media (min-width:576px){.navbar-toggleable-xs{display:block!important}}.navbar-toggleable-sm::after{content:"";display:table;clear:both}@media (max-width:767px){.navbar-toggleable-sm .navbar-nav .nav-item{float:none;margin-left:0}}@media (min-width:768px){.navbar-toggleable-sm{display:block!important}}.navbar-toggleable-md::after{content:"";display:table;clear:both}@media (max-width:991px){.navbar-toggleable-md .navbar-nav .nav-item{float:none;margin-left:0}}@media (min-width:992px){.navbar-toggleable-md{display:block!important}}.card{position:relative;display:block;margin-bottom:.75rem;background-color:#fff;border-radius:.25rem;border:1px solid rgba(0,0,0,.125)}.card-block{padding:1.25rem}.card-block::after{content:"";display:table;clear:both}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f5f5f5;border-bottom:1px solid rgba(0,0,0,.125)}.card-header::after{content:"";display:table;clear:both}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f5f5f5;border-top:1px solid rgba(0,0,0,.125)}.card-footer::after{content:"";display:table;clear:both}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-primary{background-color:#0275d8;border-color:#0275d8}.card-primary .card-footer,.card-primary .card-header{background-color:transparent}.card-success{background-color:#5cb85c;border-color:#5cb85c}.card-success .card-footer,.card-success .card-header{background-color:transparent}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-info .card-footer,.card-info .card-header{background-color:transparent}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-warning .card-footer,.card-warning .card-header{background-color:transparent}.card-danger{background-color:#d9534f;border-color:#d9534f}.card-danger .card-footer,.card-danger .card-header{background-color:transparent}.card-outline-primary{background-color:transparent;border-color:#0275d8}.card-outline-secondary{background-color:transparent;border-color:#ccc}.card-outline-info{background-color:transparent;border-color:#5bc0de}.card-outline-success{background-color:transparent;border-color:#5cb85c}.card-outline-warning{background-color:transparent;border-color:#f0ad4e}.card-outline-danger{background-color:transparent;border-color:#d9534f}.card-inverse .card-footer,.card-inverse .card-header{border-color:rgba(255,255,255,.2)}.card-inverse .card-blockquote,.card-inverse .card-footer,.card-inverse .card-header,.card-inverse .card-title{color:#fff}.card-inverse .card-blockquote .blockquote-footer,.card-inverse .card-link,.card-inverse .card-subtitle,.card-inverse .card-text{color:rgba(255,255,255,.65)}.card-inverse .card-link:focus,.card-inverse .card-link:hover{color:#fff}.card-blockquote{padding:0;margin-bottom:0;border-left:0}.card-img{border-radius:calc(.25rem - 1px)}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img-top{border-top-right-radius:calc(.25rem - 1px);border-top-left-radius:calc(.25rem - 1px)}.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:table;width:100%;margin-bottom:.75rem;table-layout:fixed;border-spacing:1.25rem 0}.card-deck .card{display:table-cell;margin-bottom:0;vertical-align:top}.card-deck-wrapper{margin-right:-1.25rem;margin-left:-1.25rem}}@media (min-width:576px){.card-group{display:table;width:100%;table-layout:fixed}.card-group .card{display:table-cell;vertical-align:top}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eceeef;border-radius:.25rem}.breadcrumb::after{content:"";display:table;clear:both}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#818a91;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#818a91}.pagination{display:inline-block;padding-left:0;margin-top:1rem;margin-bottom:1rem;border-radius:.25rem}.page-item{display:inline}.page-item:first-child .page-link{margin-left:0;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link,.page-item.active .page-link:focus,.page-item.active .page-link:hover{z-index:2;color:#fff;cursor:default;background-color:#0275d8;border-color:#0275d8}.page-item.disabled .page-link,.page-item.disabled .page-link:focus,.page-item.disabled .page-link:hover{color:#818a91;pointer-events:none;cursor:not-allowed;background-color:#fff;border-color:#ddd}.page-link{position:relative;float:left;padding:.5rem .75rem;margin-left:-1px;color:#0275d8;text-decoration:none;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#014c8c;background-color:#eceeef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.pagination-sm .page-link{padding:.275rem .75rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.tag{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.tag:empty{display:none}.btn .tag{position:relative;top:-1px}a.tag:focus,a.tag:hover{color:#fff;text-decoration:none;cursor:pointer}.tag-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.tag-default{background-color:#818a91}.tag-default[href]:focus,.tag-default[href]:hover{background-color:#687077}.tag-primary{background-color:#0275d8}.tag-primary[href]:focus,.tag-primary[href]:hover{background-color:#025aa5}.tag-success{background-color:#5cb85c}.tag-success[href]:focus,.tag-success[href]:hover{background-color:#449d44}.tag-info{background-color:#5bc0de}.tag-info[href]:focus,.tag-info[href]:hover{background-color:#31b0d5}.tag-warning{background-color:#f0ad4e}.tag-warning[href]:focus,.tag-warning[href]:hover{background-color:#ec971f}.tag-danger{background-color:#d9534f}.tag-danger[href]:focus,.tag-danger[href]:hover{background-color:#c9302c}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eceeef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-hr{border-top-color:#d0d5d8}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:2.5rem}.alert-dismissible .close{position:relative;top:-.125rem;right:-1.25rem;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d0e9c6;color:#3c763d}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bcdff1;color:#31708f}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faf2cc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebcccc;color:#a94442}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:block;width:100%;height:1rem;margin-bottom:1rem}.progress[value]{background-color:#eee;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem}.progress[value]::-ms-fill{background-color:#0074d9;border:0}.progress[value]::-moz-progress-bar{background-color:#0074d9;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.progress[value]::-webkit-progress-value{background-color:#0074d9;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.progress[value="100"]::-moz-progress-bar{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.progress[value="100"]::-webkit-progress-value{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.progress[value]::-webkit-progress-bar{background-color:#eee;border-radius:.25rem}.progress[value],base::-moz-progress-bar{background-color:#eee;border-radius:.25rem}@media screen and (min-width:0\0){.progress{background-color:#eee;border-radius:.25rem}.progress-bar{display:inline-block;height:1rem;text-indent:-999rem;background-color:#0074d9;border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.progress[width="100%"]{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}}.progress-striped[value]::-webkit-progress-value{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}.progress-striped[value]::-moz-progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-striped[value]::-ms-fill{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}@media screen and (min-width:0\0){.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}}.progress-animated[value]::-webkit-progress-value{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-animated[value]::-moz-progress-bar{animation:progress-bar-stripes 2s linear infinite}@media screen and (min-width:0\0){.progress-animated .progress-bar-striped{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}}.progress-success[value]::-webkit-progress-value{background-color:#5cb85c}.progress-success[value]::-moz-progress-bar{background-color:#5cb85c}.progress-success[value]::-ms-fill{background-color:#5cb85c}@media screen and (min-width:0\0){.progress-success .progress-bar{background-color:#5cb85c}}.progress-info[value]::-webkit-progress-value{background-color:#5bc0de}.progress-info[value]::-moz-progress-bar{background-color:#5bc0de}.progress-info[value]::-ms-fill{background-color:#5bc0de}@media screen and (min-width:0\0){.progress-info .progress-bar{background-color:#5bc0de}}.progress-warning[value]::-webkit-progress-value{background-color:#f0ad4e}.progress-warning[value]::-moz-progress-bar{background-color:#f0ad4e}.progress-warning[value]::-ms-fill{background-color:#f0ad4e}@media screen and (min-width:0\0){.progress-warning .progress-bar{background-color:#f0ad4e}}.progress-danger[value]::-webkit-progress-value{background-color:#d9534f}.progress-danger[value]::-moz-progress-bar{background-color:#d9534f}.progress-danger[value]::-ms-fill{background-color:#d9534f}@media screen and (min-width:0\0){.progress-danger .progress-bar{background-color:#d9534f}}.media,.media-body{overflow:hidden}.media-body{width:10000px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right{padding-left:10px}.media-left{padding-right:10px}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:0}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#818a91;cursor:not-allowed;background-color:#eceeef}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#818a91}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;text-decoration:none;background-color:#0275d8;border-color:#0275d8}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#a8d6fe}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-item-action{width:100%;color:#555;text-align:inherit}.list-group-item-action .list-group-item-heading{color:#333}.list-group-item-action:focus,.list-group-item-action:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9{padding-bottom:42.857143%}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.embed-responsive-1by1{padding-bottom:100%}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header::after{content:"";display:table;clear:both}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer::after{content:"";display:table;clear:both}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:600px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.in{opacity:.9}.tooltip.bs-tether-element-attached-bottom,.tooltip.tooltip-top{padding:5px 0;margin-top:-3px}.tooltip.bs-tether-element-attached-bottom .tooltip-inner::before,.tooltip.tooltip-top .tooltip-inner::before{bottom:0;left:50%;margin-left:-5px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tether-element-attached-left,.tooltip.tooltip-right{padding:0 5px;margin-left:3px}.tooltip.bs-tether-element-attached-left .tooltip-inner::before,.tooltip.tooltip-right .tooltip-inner::before{top:50%;left:0;margin-top:-5px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tether-element-attached-top,.tooltip.tooltip-bottom{padding:5px 0;margin-top:3px}.tooltip.bs-tether-element-attached-top .tooltip-inner::before,.tooltip.tooltip-bottom .tooltip-inner::before{top:0;left:50%;margin-left:-5px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tether-element-attached-right,.tooltip.tooltip-left{padding:0 5px;margin-left:-3px}.tooltip.bs-tether-element-attached-right .tooltip-inner::before,.tooltip.tooltip-left .tooltip-inner::before{top:50%;right:0;margin-top:-5px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.tooltip-inner::before{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;font-size:.875rem;word-wrap:break-word;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.bs-tether-element-attached-bottom,.popover.popover-top{margin-top:-10px}.popover.bs-tether-element-attached-bottom::after,.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::after,.popover.popover-top::before{left:50%;border-bottom-width:0}.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::before{bottom:-11px;margin-left:-11px;border-top-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-bottom::after,.popover.popover-top::after{bottom:-10px;margin-left:-10px;border-top-color:#fff}.popover.bs-tether-element-attached-left,.popover.popover-right{margin-left:10px}.popover.bs-tether-element-attached-left::after,.popover.bs-tether-element-attached-left::before,.popover.popover-right::after,.popover.popover-right::before{top:50%;border-left-width:0}.popover.bs-tether-element-attached-left::before,.popover.popover-right::before{left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-left::after,.popover.popover-right::after{left:-10px;margin-top:-10px;border-right-color:#fff}.popover.bs-tether-element-attached-top,.popover.popover-bottom{margin-top:10px}.popover.bs-tether-element-attached-top::after,.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::after,.popover.popover-bottom::before{left:50%;border-top-width:0}.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::before{top:-11px;margin-left:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-top::after,.popover.popover-bottom::after{top:-10px;margin-left:-10px;border-bottom-color:#f7f7f7}.popover.bs-tether-element-attached-top .popover-title::before,.popover.popover-bottom .popover-title::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-tether-element-attached-right,.popover.popover-left{margin-left:-10px}.popover.bs-tether-element-attached-right::after,.popover.bs-tether-element-attached-right::before,.popover.popover-left::after,.popover.popover-left::before{top:50%;border-right-width:0}.popover.bs-tether-element-attached-right::before,.popover.popover-left::before{right:-11px;margin-top:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-right::after,.popover.popover-left::after{right:-10px;margin-top:-10px;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:.2375rem .2375rem 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover::after,.popover::before{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover::before{content:"";border-width:11px}.popover::after{content:"";border-width:10px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.carousel-item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.carousel-item>a>img,.carousel-inner>.carousel-item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.carousel-item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.carousel-item.active.right,.carousel-inner>.carousel-item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.carousel-item.active.left,.carousel-inner>.carousel-item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.carousel-item.active,.carousel-inner>.carousel-item.next.left,.carousel-inner>.carousel-item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5}.carousel-control.left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-prev::before{content:"\2039"}.carousel-control .icon-next::before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:transparent;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media (min-width:576px){.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .icon-prev{margin-left:-15px}.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-faded{background-color:#f7f7f9}.bg-primary{background-color:#0275d8!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#025aa5!important}.bg-success{background-color:#5cb85c!important}a.bg-success:focus,a.bg-success:hover{background-color:#449d44!important}.bg-info{background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5!important}.bg-warning{background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f!important}.bg-danger{background-color:#d9534f!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#c9302c!important}.bg-inverse{background-color:#373a3c!important}a.bg-inverse:focus,a.bg-inverse:hover{background-color:#1f2021!important}.rounded{border-radius:.25rem}.rounded-top{border-top-right-radius:.25rem;border-top-left-radius:.25rem}.rounded-right{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.rounded-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-left{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.rounded-circle{border-radius:50%}.clearfix::after{content:"";display:table;clear:both}.d-block{display:block!important}.d-inline-block{display:inline-block!important}.d-inline{display:inline!important}.float-xs-left{float:left!important}.float-xs-right{float:right!important}.float-xs-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.w-100{width:100%!important}.h-100{height:100%!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.m-0{margin:0 0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:1rem 1rem!important}.mt-1{margin-top:1rem!important}.mr-1{margin-right:1rem!important}.mb-1{margin-bottom:1rem!important}.ml-1{margin-left:1rem!important}.mx-1{margin-right:1rem!important;margin-left:1rem!important}.my-1{margin-top:1rem!important;margin-bottom:1rem!important}.m-2{margin:1.5rem 1.5rem!important}.mt-2{margin-top:1.5rem!important}.mr-2{margin-right:1.5rem!important}.mb-2{margin-bottom:1.5rem!important}.ml-2{margin-left:1.5rem!important}.mx-2{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-2{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-3{margin:3rem 3rem!important}.mt-3{margin-top:3rem!important}.mr-3{margin-right:3rem!important}.mb-3{margin-bottom:3rem!important}.ml-3{margin-left:3rem!important}.mx-3{margin-right:3rem!important;margin-left:3rem!important}.my-3{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0 0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:1rem 1rem!important}.pt-1{padding-top:1rem!important}.pr-1{padding-right:1rem!important}.pb-1{padding-bottom:1rem!important}.pl-1{padding-left:1rem!important}.px-1{padding-right:1rem!important;padding-left:1rem!important}.py-1{padding-top:1rem!important;padding-bottom:1rem!important}.p-2{padding:1.5rem 1.5rem!important}.pt-2{padding-top:1.5rem!important}.pr-2{padding-right:1.5rem!important}.pb-2{padding-bottom:1.5rem!important}.pl-2{padding-left:1.5rem!important}.px-2{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-2{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-3{padding:3rem 3rem!important}.pt-3{padding-top:3rem!important}.pr-3{padding-right:3rem!important}.pb-3{padding-bottom:3rem!important}.pl-3{padding-left:3rem!important}.px-3{padding-right:3rem!important;padding-left:3rem!important}.py-3{padding-top:3rem!important;padding-bottom:3rem!important}.pos-f-t{position:fixed;top:0;right:0;left:0;z-index:1030}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-xs-left{text-align:left!important}.text-xs-right{text-align:right!important}.text-xs-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-muted{color:#818a91!important}a.text-muted:focus,a.text-muted:hover{color:#687077!important}.text-primary{color:#0275d8!important}a.text-primary:focus,a.text-primary:hover{color:#025aa5!important}.text-success{color:#5cb85c!important}a.text-success:focus,a.text-success:hover{color:#449d44!important}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5!important}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f!important}.text-danger{color:#d9534f!important}a.text-danger:focus,a.text-danger:hover{color:#c9302c!important}.text-gray-dark{color:#373a3c!important}a.text-gray-dark:focus,a.text-gray-dark:hover{color:#1f2021!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.invisible{visibility:hidden!important}.hidden-xs-up{display:none!important}@media (max-width:575px){.hidden-xs-down{display:none!important}}@media (min-width:576px){.hidden-sm-up{display:none!important}}@media (max-width:767px){.hidden-sm-down{display:none!important}}@media (min-width:768px){.hidden-md-up{display:none!important}}@media (max-width:991px){.hidden-md-down{display:none!important}}@media (min-width:992px){.hidden-lg-up{display:none!important}}@media (max-width:1199px){.hidden-lg-down{display:none!important}}@media (min-width:1200px){.hidden-xl-up{display:none!important}}.hidden-xl-down{display:none!important}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/docs/docsify/assets/css/hljs.css b/docs/docsify/assets/css/hljs.css new file mode 100755 index 0000000..94c1aa7 --- /dev/null +++ b/docs/docsify/assets/css/hljs.css @@ -0,0 +1,99 @@ +/* + github.com style (c) Vasily Polovnyov +*/ + +.hljs { + display: block; + color: #36414c; + overflow-x: auto; + padding: 0.5em; + background: #F8F8F9; + border-radius: 3px; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, + +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/docs/docsify/assets/css/index.css b/docs/docsify/assets/css/index.css new file mode 100755 index 0000000..fab9fa0 --- /dev/null +++ b/docs/docsify/assets/css/index.css @@ -0,0 +1,121 @@ +body { + /* container styles */ + /* max-width: 720px; + margin: auto; */ + + font-family: "proxima-nova", sans-serif; + font-size: 15px; + color: #6c7680; + text-rendering: optimizeLegibility !important; + line-height: 1.5em; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +h1, +h2, +h3, +h4, +h5, +h6, +.lead, +.page-sidebar, +.breadcrumb, +.label, +.h6, +.sans, +blockquote { + font-family: "proxima-nova", sans-serif; + color: #36414C; +} + +header { + margin: 4rem 0; /* SAME 1 */ + font-size: 1.6em; + font-weight: 300; + text-align: center; +} +header .lead-text { + line-height: 3rem; + margin: 2rem 0; +} +.demo-tip { + margin-top: 1rem; /* SAME 2 */ + font-size: 1rem; +} +section { + margin: 4em 0; /* SAME 1 */ +} +section figure { + border: 1px solid #ddd; /* SAME 3 */ + border-radius: 3px; +} +.btn, .btn-group { + margin-bottom: 1rem; +} +.btn-group, .btn-action { + margin-right: 0.5rem; +} +h1 { + font-size: 3.5rem; + margin-bottom: 1.5rem; +} +h1, h6 { + font-weight: 700; +} +p.new-context { + margin-top: 2rem; +} +.btn { + outline: none !important; +} +.blue.button { + color: #fff; + background: #7575ff; + border: 0px; + border-bottom: 3px solid rgba(0, 0, 0, 0.2); +} +.blue.button:hover { + background: #5b5be5; +} +.large.button { + font-size: 1.33em; + padding: 12px 24px 10px; + border-bottom: 3px solid rgba(0, 0, 0, 0.2); +} +a { + color: #5E64FF; +} +a, a:focus, a:hover { + transition: color 0.3s, border 0.3s, background-color 0.3s; +} + + +/* BaseCSS */ +.mt1 { + margin-top: 1rem; /* SAME 2 */ +} +.mv1 { + margin: 2em 0 1em 0; +} +.border { + border: 1px solid #ddd; /* SAME 3 */ + border-radius: 3px; +} +.text-center { + text-align: center; +} + + +/* Moon images */ +.image-container { + padding: 3px; +} +.image-container img{ + display: block; + width: 100%; +} +.content-data p { + margin-bottom: 5px; + font-size: 12px; +} diff --git a/docs/docsify/assets/css/reset.css b/docs/docsify/assets/css/reset.css new file mode 100755 index 0000000..aa7cd92 --- /dev/null +++ b/docs/docsify/assets/css/reset.css @@ -0,0 +1,353 @@ +/*! + *this reset is a copy of bootstrap's reboot.css which is inturn a fork of normalise* + * Bootstrap Reboot v4.0.0-beta.3 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) + */ + + *, + *::before, + *::after { + box-sizing: border-box; + } + + html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: transparent; + --line-height: 3; + line-height: calc(((var(--line-height) * var(--capital-height)) - var(--valign)) * 1px); + } + + @-ms-viewport { + width: device-width; + } + + article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; + } + + body { + margin: 0; + font-size: 1em; + font-weight: 400; + /* line-height: 1.5; */ + text-align: left; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, Noto, Oxygen-Sans, "Noto Sans", Ubuntu,Cantarell, sans-serif, "Apple Color Emoji", "Noto Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + color: #36414c; + font-weight:normal; + -webkit-text-size-adjust: 100%; + -webkit-font-feature-settings: "kern" 1; + -moz-font-feature-settings: "kern" 1; + -o-font-feature-settings: "kern" 1; + font-feature-settings: "kern" 1; + font-kerning: normal; + text-rendering: optimizeLegibility; + } + + [tabindex="-1"]:focus { + outline: 0 !important; + } + + hr { + box-sizing: content-box; + height: 0; + overflow: visible; + } + + h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 1.6rem; + } + + p { + margin-top: 0; + margin-bottom: 1rem; + } + + abbr[title], + abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + } + + address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; + } + + ol, + ul, + dl { + margin-top: 0; + margin-bottom: 1rem; + } + + ol ol, + ul ul, + ol ul, + ul ol { + margin-bottom: 0; + } + + dt { + font-weight: 700; + } + + dd { + margin-bottom: .5rem; + margin-left: 0; + } + + blockquote { + margin: 0 0 1rem; + } + + dfn { + font-style: italic; + } + + b, + strong { + font-weight: bolder; + } + + small { + font-size: 80%; + } + + sub, + sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; + } + + sub { + bottom: -.25em; + } + + sup { + top: -.5em; + } + + a { + color: #007bff; + text-decoration: none; + background-color: transparent; + -webkit-text-decoration-skip: objects; + } + + a:hover { + color: #0056b3; + text-decoration: underline; + } + + a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; + } + + a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover { + color: inherit; + text-decoration: none; + } + + a:not([href]):not([tabindex]):focus { + outline: 0; + } + + pre, + code, + kbd, + samp { + font-family: monospace, monospace; + font-size: 1em; + } + + pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + -ms-overflow-style: scrollbar; + } + + figure { + margin: 0 0 1rem; + } + + img { + vertical-align: middle; + border-style: none; + } + + svg:not(:root) { + overflow: hidden; + } + + a, + area, + button, + [role="button"], + input:not([type="range"]), + label, + select, + summary, + textarea { + -ms-touch-action: manipulation; + touch-action: manipulation; + } + + table { + border-collapse: collapse; + } + + caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; + } + + th { + text-align: inherit; + } + + label { + display: inline-block; + margin-bottom: .5rem; + } + + button { + border-radius: 0; + } + + button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; + } + + input, + button, + select, + optgroup, + textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; + } + + button, + input { + overflow: visible; + } + + button, + select { + text-transform: none; + } + + button, + html [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; + } + + input[type="radio"], + input[type="checkbox"] { + box-sizing: border-box; + padding: 0; + } + + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + -webkit-appearance: listbox; + } + + textarea { + overflow: auto; + resize: vertical; + } + + fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; + } + + legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; + } + + progress { + vertical-align: baseline; + } + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + [type="search"] { + outline-offset: -2px; + -webkit-appearance: none; + } + + [type="search"]::-webkit-search-cancel-button, + [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + ::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; + } + + output { + display: inline-block; + } + + summary { + display: list-item; + cursor: pointer; + } + + template { + display: none; + } + + [hidden] { + display: none !important; + } + /*# sourceMappingURL=bootstrap-reboot.css.map */ diff --git a/docs/docsify/chap1/test1.md b/docs/docsify/chap1/test1.md new file mode 100644 index 0000000..b0851ca --- /dev/null +++ b/docs/docsify/chap1/test1.md @@ -0,0 +1,47 @@ +#### Installation +* Install via [`npm`](https://www.npmjs.com/get-npm): + + ```console + $ npm install frappe-charts + ``` + + and include in your project: + ```js + import { Chart } from "frappe-charts" + ``` + +* ...or include within your HTML + + ```html + + + + ``` + +#### Usage +```js +const data = { + labels: ["12am-3am", "3am-6pm", "6am-9am", "9am-12am", + "12pm-3pm", "3pm-6pm", "6pm-9pm", "9am-12am" + ], + datasets: [ + { + name: "Some Data", type: "bar", + values: [25, 40, 30, 35, 8, 52, 17, -4] + }, + { + name: "Another Set", type: "line", + values: [25, 50, -10, 15, 18, 32, 27, 14] + } + ] +} + +const chart = new frappe.Chart("#chart", { // or a DOM element, + // new Chart() in case of ES6 module with above usage + title: "My Awesome Chart", + data: data, + type: 'axis-mixed', // or 'bar', 'line', 'scatter', 'pie', 'percentage' + height: 250, + colors: ['#7cd6fd', '#743ee2'] +}) +``` diff --git a/docs/docsify/demoRegistry.js b/docs/docsify/demoRegistry.js new file mode 100644 index 0000000..2dc29e4 --- /dev/null +++ b/docs/docsify/demoRegistry.js @@ -0,0 +1,44 @@ +import { sampleData, trendsData } from '../assets/js/data'; + +export const demoRegistry = { + demo1: { + type: "demo", + config: { + data: sampleData[0], + type: 'bar', + height: 140, + colors: ['red'], + }, + }, + + demo2: { + type: "demo", + config: { + data: sampleData[3], + type: 'bar', + height: 140, + colors: ['orange'], + axisOptions: { + xAxisMode: "tick" + }, + barOptions: { + spaceRatio: 0.2 + }, + }, + options: [ + { + name: "barOptions", + path: ["barOptions"], + type: "map", + mapKeys: ['spaceRatio'], + states: { + "0.2": [0.2], + "0.5": [0.5], + "1": [1], + "1.5": [1.5] + }, + activeState: "0.2" + } + ] + }, +}; \ No newline at end of file diff --git a/docs/docsify/index.html b/docs/docsify/index.html new file mode 100644 index 0000000..36d58cb --- /dev/null +++ b/docs/docsify/index.html @@ -0,0 +1,24 @@ + + + + + frappe-charts - https://frappe.github.io/charts + + + + + + + + + + + + +
                  + + + + + + diff --git a/docs/docsify/indexShadow.js b/docs/docsify/indexShadow.js new file mode 100644 index 0000000..b476f41 --- /dev/null +++ b/docs/docsify/indexShadow.js @@ -0,0 +1,20 @@ +import { docsBuilder } from '../assets/js/docsBuilder'; +import { Chart } from "../../dist/frappe-charts.min.esm"; +import { demoRegistry } from './demoRegistry'; + +window.$docsify = { + name: 'frappe-charts', + // repo: 'https://github.com/frappe/charts', + loadSidebar: true, + executeScript: true, + plugins: [ + function(hook, vm) { + hook.doneEach(function() { + let dbd = new docsBuilder(Chart); + + console.log("inside hook", document.querySelector('.demo')); + dbd.makeSection(document.querySelector('.demo'), demoRegistry.demo2); + }); + } + ] +} diff --git a/docs/docsify/indexShadow.min.js b/docs/docsify/indexShadow.min.js new file mode 100644 index 0000000..20d544c --- /dev/null +++ b/docs/docsify/indexShadow.min.js @@ -0,0 +1,5296 @@ +(function () { +'use strict'; + +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 _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; }; + +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 === "onClick") { + element.addEventListener('click', val); + } 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; +}; + + + + + + + + + + + + + +// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/ + +// Fixed 5-color theme, +// More colors are difficult to parse visually + + + + + + + + + + + + + + +// Universal constants + +/** + * Returns the value of a number upto 2 decimal places. + * @param {Number} d Any number + */ + + +/** + * 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? + */ + + +/** + * Returns pixel width of string. + * @param {String} string + * @param {Number} charWidth Width of single char in pixels + */ + + + + +// https://stackoverflow.com/a/29325222 + + + + +function toTitleCase(str) { + return str.replace(/\w*/g, function (txt) { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); +} + +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; }; }(); + +function _toConsumableArray(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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var docsBuilder = function () { + function docsBuilder(LIB_OBJ) { + _classCallCheck(this, docsBuilder); + + this.LIB_OBJ = LIB_OBJ; + } + + _createClass(docsBuilder, [{ + key: 'makeSection', + value: function makeSection(parent, sys) { + console.log('parent here?', parent); + return new docSection(this.LIB_OBJ, parent, sys); + } + }]); + + return docsBuilder; +}(); + +var docSection = function () { + function docSection(LIB_OBJ, parent, sys) { + _classCallCheck(this, docSection); + + this.LIB_OBJ = LIB_OBJ; + this.parent = parent; // should be preferably a section + this.sys = sys; + this.blockMap = {}; + this.demos = []; + + this.make(); + } + + _createClass(docSection, [{ + key: 'make', + value: function make() { + // const section = document.querySelector(this.parent); + var s = this.sys; + // if(s.title) { + // $.create('h6', { inside: this.parent, innerHTML: s.title }); + // } + + // s.contentBlocks.forEach((blockConf, index) => { + // this.blockMap[index] = this.getBlock(blockConf); + // }); + + this.blockMap['test'] = this.getDemo(s); + } + }, { + key: 'getBlock', + value: function getBlock(blockConf) { + var fnName = 'get' + toTitleCase(blockConf.type); + if (this[fnName]) { + return this[fnName](blockConf); + } else { + throw new Error('Unknown section block type \'' + blockConf.type + '\'.'); + } + } + }, { + key: 'getText', + value: function getText(blockConf) { + return $.create('p', { + inside: this.parent, + className: 'new-context', + innerHTML: blockConf.content + }); + } + }, { + key: 'getCode', + value: function getCode(blockConf) { + var pre = $.create('pre', { inside: this.parent }); + var lang = blockConf.lang || 'javascript'; + var code = $.create('code', { + inside: pre, + className: 'hljs ' + lang, + innerHTML: blockConf.content + }); + } + }, { + key: 'getCustom', + value: function getCustom(blockConf) { + this.parent.innerHTML += blockConf.html; + } + }, { + key: 'getDemo', + value: function getDemo(blockConf) { + var bc = blockConf; + var args = bc.config; + var figure = void 0, + row = void 0; + if (!bc.sideContent) { + figure = $.create('figure', { inside: this.parent }); + } else { + row = $.create('div', { + inside: this.parent, + className: "row", + innerHTML: '
                  \n\t\t\t\t\t
                  ' + }); + figure = $.create('figure', { inside: row.querySelector('.col-sm-8') }); + row.querySelector('.col-sm-4').innerHTML += bc.sideContent; + } + + var libObj = new this.LIB_OBJ(figure, args); + var demoIndex = this.demos.length; + this.demos.push(libObj); + + if (bc.postSetup) { + bc.postSetup(this.demos[demoIndex], figure, row); + } + + this.getDemoOptions(demoIndex, bc.options, args, figure); + this.getDemoActions(demoIndex, bc.actions, args); + } + }, { + key: 'getDemoOptions', + value: function getDemoOptions(demoIndex) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + + var _this = this; + + var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var figure = arguments[3]; + + options.forEach(function (o) { + var btnGroup = $.create('div', { + inside: _this.parent, + className: 'btn-group ' + o.name + }); + var mapKeys = o.mapKeys; + + if (o.type === "map") { + args[o.path[0]] = {}; + } + + var inputGroup = $.create('input', { + inside: btnGroup + // className: `form-control`, + // innerHTML: `` + }); + + Object.keys(o.states).forEach(function (key) { + var state = o.states[key]; + var activeClass = key === o.activeState ? 'active' : ''; + + var button = $.create('button', { + inside: btnGroup, + className: 'btn btn-sm btn-secondary ' + activeClass, + innerHTML: key, + onClick: function onClick(e) { + // map + if (o.type === "map") { + mapKeys.forEach(function (attr, i) { + args[o.path[0]][attr] = state[i]; + }); + } else { + // boolean, string, number, object + args[o.path[0]] = state; + } + _this.demos[demoIndex] = new _this.LIB_OBJ(figure, args); + } + }); + + if (activeClass) { + button.click(); + } + }); + }); + } + }, { + key: 'getDemoActions', + value: function getDemoActions(demoIndex) { + var _this2 = this; + + var actions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + actions.forEach(function (o) { + var args = o.args || []; + $.create('button', { + inside: _this2.parent, + className: 'btn btn-action btn-sm btn-secondary', + innerHTML: o.name, + onClick: function onClick() { + var _demos$demoIndex; + + (_demos$demoIndex = _this2.demos[demoIndex])[o.fn].apply(_demos$demoIndex, _toConsumableArray(args)); + } + }); + }); + } + }]); + + return docSection; +}(); + +var _typeof2 = 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; }; + +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)); + } +} + +__$styleInject(".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:1;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 asyncGenerator$1 = 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 wrap(fn) { + return function () { + return new AsyncGenerator(fn.apply(this, arguments)); + }; + }, + await: function _await(value) { + return new AwaitValue(value); + } + }; +}(); + +var _typeof$2 = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { + return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); +}; + +function $$1(expr, con) { + return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null; +} + +$$1.create = function (tag, o) { + var element = document.createElement(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 === "onClick") { + element.addEventListener('click', val); + } else if (i === "styles") { + if ((typeof val === "undefined" ? "undefined" : _typeof$2(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$1(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) + }; +} + +function isElementInViewport$1(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$1(element) { + var styles = window.getComputedStyle(element); + var padding = parseFloat(styles.paddingLeft) + parseFloat(styles.paddingRight); + + return element.clientWidth - padding; +} + +function fire$1(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$1 = { + 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$1(m) { + return m.titleHeight + m.margins.top + m.paddings.top; +} + +function getLeftOffset$1(m) { + return m.margins.left + m.paddings.left; +} + +function getExtraHeight$1(m) { + var totalExtraHeight = m.margins.top + m.margins.bottom + m.paddings.top + m.paddings.bottom + m.titleHeight + m.legendHeight; + return totalExtraHeight; +} + +function getExtraWidth$1(m) { + var totalExtraWidth = m.margins.left + m.margins.right + m.paddings.left + m.paddings.right; + + return totalExtraWidth; +} + +var INIT_CHART_UPDATE_TIMEOUT$1 = 700; +var CHART_POST_ANIMATE_TIMEOUT$1 = 400; + +var AXIS_CHART_DEFAULT_TYPE$1 = 'line'; + +var AXIS_DATASET_CHART_TYPES$1 = ['line', 'bar']; + +var AXIS_LEGEND_BAR_SIZE$1 = 100; + +var BAR_CHART_SPACE_RATIO$1 = 1; +var MIN_BAR_PERCENT_HEIGHT$1 = 0.01; + +var LINE_CHART_DOT_SIZE$1 = 4; +var DOT_OVERLAY_SIZE_INCR$1 = 4; + +var PERCENTAGE_BAR_DEFAULT_HEIGHT$1 = 20; +var PERCENTAGE_BAR_DEFAULT_DEPTH$1 = 2; + +// Fixed 5-color theme, +// More colors are difficult to parse visually +var HEATMAP_DISTRIBUTION_SIZE$1 = 5; + +var HEATMAP_SQUARE_SIZE$1 = 10; +var HEATMAP_GUTTER_SIZE$1 = 2; + +var DEFAULT_CHAR_WIDTH$1 = 7; + +var TOOLTIP_POINTER_TRIANGLE_HEIGHT$1 = 5; + +var DEFAULT_CHART_COLORS$1 = ['light-blue', 'blue', 'violet', 'red', 'orange', 'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey']; +var HEATMAP_COLORS_GREEN$1 = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127']; + +var DEFAULT_COLORS$1 = { + bar: DEFAULT_CHART_COLORS$1, + line: DEFAULT_CHART_COLORS$1, + pie: DEFAULT_CHART_COLORS$1, + percentage: DEFAULT_CHART_COLORS$1, + heatmap: HEATMAP_COLORS_GREEN$1 +}; + +// Universal constants +var ANGLE_RATIO$1 = Math.PI / 180; +var FULL_ANGLE$1 = 360; + +var _createClass$3 = 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; + }; +}(); + +function _classCallCheck$4(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +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$4(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$3(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 = $$1.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 = $$1.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$1; + 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; +}(); + +/** + * Returns the value of a number upto 2 decimal places. + * @param {Number} d Any number + */ +function floatTwo$1(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$1(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$1(string, charWidth) { + return (string + "").length * charWidth; +} + +// https://stackoverflow.com/a/29325222 + + +function getPositionByAngle$1(angle, radius) { + return { + x: Math.sin(angle * ANGLE_RATIO$1) * radius, + y: Math.cos(angle * ANGLE_RATIO$1) * radius + }; +} + +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$1(array1, extraCount); + } else { + array2 = fillArray$1(array2, extraCount); + } + return [array1, array2]; +} + +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/8027444/6495043 + return (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(string) + ); +} + +var getColor = function getColor(color) { + return PRESET_COLOR_MAP[color] || color; +}; + +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 _typeof$2$1 = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { + return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); +}; + +var AXIS_TICK_LENGTH = 6; +var LABEL_MARGIN = 4; +var FONT_SIZE = 10; +var BASE_LINE_COLOR = '#dadada'; +var FONT_FILL = '#555b51'; + +function $$1$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$1(val).appendChild(element); + } else if (i === "around") { + var ref = $$1$1(val); + ref.parentNode.insertBefore(element, ref); + element.appendChild(ref); + } else if (i === "styles") { + if ((typeof val === 'undefined' ? 'undefined' : _typeof$2$1(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'; + + return createSVG('path', { + className: className, + d: pathStr, + styles: { + stroke: stroke, + fill: fill + } + }); +} + +function makeArcPathStr(startPosition, endPosition, center, radius) { + var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + 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 0 ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY + ' z'; +} + +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$1; + 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) { + var fill = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'none'; + var data = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + + var args = { + className: className, + x: x, + y: y, + width: size, + height: size, + 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 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 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 = ''; + var className = 'line-horizontal ' + options.className + (options.lineType === "dashed" ? "dashed" : ""); + + var l = createSVG('line', { + className: className, + x1: x1, + x2: x2, + y1: 0, + y2: 0, + styles: { + stroke: options.stroke + } + }); + + var text = createSVG('text', { + x: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN, + y: 0, + dy: FONT_SIZE / 2 - 2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': x1 < x2 ? 'end' : 'start', + innerHTML: label + "" + }); + + var line = createSVG('g', { + transform: 'translate(0, ' + y + ')', + 'stroke-opacity': 1 + }); + + if (text === 0 || text === '0') { + line.style.stroke = "rgba(27, 31, 35, 0.6)"; + } + + line.appendChild(l); + line.appendChild(text); + + return line; +} + +function yLine(y, label, width) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + if (!options.pos) options.pos = 'left'; + if (!options.offset) options.offset = 0; + if (!options.mode) options.mode = 'span'; + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + if (!options.className) options.className = ''; + + var x1 = -1 * AXIS_TICK_LENGTH; + var x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; + + if (options.mode === 'tick' && options.pos === 'right') { + x1 = width + AXIS_TICK_LENGTH; + x2 = width; + } + + // let offset = options.pos === 'left' ? -1 * options.offset : options.offset; + + x1 += options.offset; + x2 += options.offset; + + return makeHoriLine(y, label, x1, x2, { + stroke: options.stroke, + className: options.className, + lineType: options.lineType + }); +} + +function xLine(x, label, height) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + 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$1(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$1(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; + } + + 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"); + 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$1); + 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$1); + 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 _slicedToArray$2 = 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 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$2(_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) { + var pathComponents = []; + + var pointsStr = newYList.map(function (y, i) { + return newXList[i] + ',' + y; + }); + var pathStr = pointsStr.join("L"); + + var animPath = [paths.path, { d: "M" + pathStr }, 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 + pathStr + regEndPt }, PATH_ANIM_DUR, STD_EASING]; + pathComponents.push(animRegion); + } + + return pathComponents; +} + +function animatePathStr(oldPath, pathStr) { + return [oldPath, { d: pathStr }, UNIT_ANIM_DUR, STD_EASING]; +} + +var _slicedToArray$1 = 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"); + } + }; +}(); + +function _toConsumableArray$1(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); + } +} + +// 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$1(element)); + + var _animateSVGElement2 = _slicedToArray$1(_animateSVGElement, 2); + + animElement = _animateSVGElement2[0]; + newElement = _animateSVGElement2[1]; + + newElements.push(newElement); + animElements.push([animElement, parent]); + + parent.replaceChild(animElement, unit); + }); + + var animSvg = svgContainer.cloneNode(true); + + animElements.map(function (animElement, i) { + animElement[1].replaceChild(newElements[i], animElement[0]); + elements[i][0] = newElements[i]; + }); + + return animSvg; +} + +function runSMILAnimation(parent, svgElement, elementsToAnimate) { + if (elementsToAnimate.length === 0) return; + + var animSvgElement = animateSVG(svgElement, elementsToAnimate); + if (svgElement.parentNode == parent) { + parent.removeChild(svgElement); + parent.appendChild(animSvgElement); + } + + // Replace the new svgElement (data has already been replaced) + setTimeout(function () { + if (animSvgElement.parentNode == parent) { + parent.removeChild(animSvgElement); + parent.appendChild(svgElement); + } + }, REPLACE_ALL_NEW_DUR); +} + +var CSSTEXT = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;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 = $$1.create('style', { + 'innerHTML': CSSTEXT + }); + clone.insertBefore(styleEl, clone.firstChild); + + var container = $$1.create('div'); + container.appendChild(clone); + + return container.innerHTML; +} + +var _createClass$2 = 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; + }; +}(); + +function _classCallCheck$3(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +var BOUND_DRAW_FN = void 0; + +var BaseChart = function () { + function BaseChart(parent, options) { + _classCallCheck$3(this, BaseChart); + + this.parent = typeof parent === 'string' ? document.querySelector(parent) : parent; + + if (!(this.parent instanceof HTMLElement)) { + throw new Error('No `parent` element to render on was provided.'); + } + + this.rawChartArgs = options; + + this.title = options.title || ''; + this.type = options.type || 'line'; + + 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: 1 + }; + + this.measures = JSON.parse(JSON.stringify(BASE_MEASURES$1)); + 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$1; + + if (this.config.isNavigable) { + this.overlays = []; + } + + this.configure(options); + } + + _createClass$2(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$1[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 height = this.argHeight; + this.baseHeight = height; + this.height = height - getExtraHeight$1(this.measures); + + // Bind window events + BOUND_DRAW_FN = this.boundDrawFn.bind(this); + window.addEventListener('resize', BOUND_DRAW_FN); + window.addEventListener('orientationchange', this.boundDrawFn.bind(this)); + } + }, { + key: 'boundDrawFn', + value: function boundDrawFn() { + this.draw(true); + } + }, { + key: 'unbindWindowEvents', + value: function unbindWindowEvents() { + window.removeEventListener('resize', BOUND_DRAW_FN); + window.removeEventListener('orientationchange', this.boundDrawFn.bind(this)); + } + + // 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.parent.style.overflow = 'auto'; + } + + this.container = $$1.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 _this = this; + + var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + this.updateWidth(); + + this.calc(onlyWidthChange); + this.makeChartArea(); + this.setupComponents(); + + this.components.forEach(function (c) { + return c.setup(_this.drawArea); + }); + // this.components.forEach(c => c.make()); + this.render(this.components, false); + + if (init) { + this.data = this.realData; + setTimeout(function () { + _this.update(_this.data); + }, this.initTimeout); + } + + this.renderLegend(); + + this.setupNavigation(init); + } + }, { + key: 'calc', + value: function calc() {} // builds state + + }, { + key: 'updateWidth', + value: function updateWidth() { + this.baseWidth = getElementContentWidth$1(this.parent); + this.width = this.baseWidth - getExtraWidth$1(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$1(m); + this.drawArea = makeSVGGroup(this.type + '-chart chart-draw-area', 'translate(' + getLeftOffset$1(m) + ', ' + top + ')'); + + if (this.config.showLegend) { + top += this.height + m.paddings.bottom; + this.legendArea = makeSVGGroup('chart-legend', 'translate(' + getLeftOffset$1(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$1(m), getTopOffset$1(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(); + } + }, { + key: 'render', + value: function render() { + var _this2 = 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(); + }); + _this2.updateNav(); + }, CHART_POST_ANIMATE_TIMEOUT$1); + } 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 _this3 = 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$1(_this3.container)) { + e = e || window.event; + if (_this3.keyActions[e.keyCode]) { + _this3.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 _createClass$1 = 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$1 = function get$$1(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$$1(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); + } +}; + +function _classCallCheck$2(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _possibleConstructorReturn$1(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; +} + +function _inherits$1(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(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 AggregationChart = function (_BaseChart) { + _inherits$1(AggregationChart, _BaseChart); + + function AggregationChart(parent, args) { + _classCallCheck$2(this, AggregationChart); + + return _possibleConstructorReturn$1(this, (AggregationChart.__proto__ || Object.getPrototypeOf(AggregationChart)).call(this, parent, args)); + } + + _createClass$1(AggregationChart, [{ + key: 'configure', + value: function configure(args) { + _get$1(AggregationChart.prototype.__proto__ || Object.getPrototypeOf(AggregationChart.prototype), 'configure', this).call(this, args); + + this.config.maxSlices = args.maxSlices || 20; + this.config.maxLegendPoints = args.maxLegendPoints || 20; + } + }, { + key: 'calc', + value: function calc() { + var _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(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 = 110; + var divisor = Math.floor((_this3.width - getExtraWidth$1(_this3.measures)) / barWidth); + if (count > divisor) { + count = 0; + y += 20; + } + var x = barWidth * count + 5; + var dot = legendDot(x, y, 5, _this3.colors[i], s.labels[i] + ': ' + d); + _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 _slicedToArray$3 = 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 _createClass$4 = 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; + }; +}(); + +function _classCallCheck$5(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +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$5(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$4(ChartComponent, [{ + key: 'refresh', + value: function refresh(data) { + this.data = data || this.getData(); + } + }, { + key: 'setup', + value: function setup(parent) { + this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent); + } + }, { + key: 'make', + value: function make() { + this.render(this.data); + this.oldData = this.data; + } + }, { + key: 'render', + value: function render(data) { + var _this = this; + + this.store = this.makeElements(data); + + this.layer.textContent = ''; + this.store.forEach(function (element) { + _this.layer.appendChild(element); + }); + this.labels.forEach(function (element) { + _this.layer.appendChild(element); + }); + } + }, { + key: 'update', + value: function update() { + var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.refresh(); + var animateElements = []; + if (animate) { + animateElements = this.animateElements(this.data) || []; + } + return animateElements; + } + }]); + + return ChartComponent; +}(); + +var componentConfigs = { + pieSlices: { + layerClass: 'pie-slices', + makeElements: function makeElements(data) { + return data.sliceStrings.map(function (s, i) { + var slice = makePath(s, 'pie-path', 'none', data.colors[i]); + slice.style.transition = 'transform .3s;'; + return slice; + }); + }, + animateElements: function animateElements(newData) { + return this.store.map(function (slice, i) { + return animatePathStr(slice, newData.sliceStrings[i]); + }); + } + }, + percentageBars: { + layerClass: 'percentage-bars', + makeElements: function makeElements(data) { + var _this2 = this; + + return data.xPositions.map(function (x, i) { + var y = 0; + var bar = percentageBar(x, y, data.widths[i], _this2.constants.barHeight, _this2.constants.barDepth, data.colors[i]); + return bar; + }); + }, + animateElements: function animateElements(newData) { + if (newData) return []; + } + }, + yAxis: { + layerClass: 'y axis', + makeElements: function makeElements(data) { + var _this3 = this; + + return data.positions.map(function (position, i) { + return yLine(position, data.labels[i], _this3.constants.width, { mode: _this3.constants.mode, pos: _this3.constants.pos }); + }); + }, + animateElements: function animateElements(newData) { + var newPos = newData.positions; + var newLabels = newData.labels; + var oldPos = this.oldData.positions; + var oldLabels = this.oldData.labels; + + var _equilizeNoOfElements = equilizeNoOfElements(oldPos, newPos); + + var _equilizeNoOfElements2 = _slicedToArray$3(_equilizeNoOfElements, 2); + + oldPos = _equilizeNoOfElements2[0]; + newPos = _equilizeNoOfElements2[1]; + + var _equilizeNoOfElements3 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements4 = _slicedToArray$3(_equilizeNoOfElements3, 2); + + oldLabels = _equilizeNoOfElements4[0]; + newLabels = _equilizeNoOfElements4[1]; + + this.render({ + positions: oldPos, + labels: newLabels + }); + + return this.store.map(function (line, i) { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + } + }, + + xAxis: { + layerClass: 'x axis', + makeElements: function makeElements(data) { + var _this4 = this; + + return data.positions.map(function (position, i) { + return xLine(position, data.calcLabels[i], _this4.constants.height, { mode: _this4.constants.mode, pos: _this4.constants.pos }); + }); + }, + animateElements: function animateElements(newData) { + var newPos = newData.positions; + var newLabels = newData.calcLabels; + var oldPos = this.oldData.positions; + var oldLabels = this.oldData.calcLabels; + + var _equilizeNoOfElements5 = equilizeNoOfElements(oldPos, newPos); + + var _equilizeNoOfElements6 = _slicedToArray$3(_equilizeNoOfElements5, 2); + + oldPos = _equilizeNoOfElements6[0]; + newPos = _equilizeNoOfElements6[1]; + + var _equilizeNoOfElements7 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements8 = _slicedToArray$3(_equilizeNoOfElements7, 2); + + oldLabels = _equilizeNoOfElements8[0]; + newLabels = _equilizeNoOfElements8[1]; + + this.render({ + positions: oldPos, + calcLabels: newLabels + }); + + return this.store.map(function (line, i) { + return translateVertLine(line, newPos[i], oldPos[i]); + }); + } + }, + + yMarkers: { + layerClass: 'y-markers', + makeElements: function makeElements(data) { + var _this5 = this; + + return data.map(function (m) { + return yMarker(m.position, m.label, _this5.constants.width, { labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed' }); + }); + }, + animateElements: function animateElements(newData) { + var _equilizeNoOfElements9 = equilizeNoOfElements(this.oldData, newData); + + var _equilizeNoOfElements10 = _slicedToArray$3(_equilizeNoOfElements9, 2); + + this.oldData = _equilizeNoOfElements10[0]; + newData = _equilizeNoOfElements10[1]; + + var newPos = newData.map(function (d) { + return d.position; + }); + var newLabels = newData.map(function (d) { + return d.label; + }); + var newOptions = newData.map(function (d) { + return d.options; + }); + + var oldPos = this.oldData.map(function (d) { + return d.position; + }); + + this.render(oldPos.map(function (pos, i) { + return { + position: oldPos[i], + label: newLabels[i], + options: newOptions[i] + }; + })); + + return this.store.map(function (line, i) { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + } + }, + + yRegions: { + layerClass: 'y-regions', + makeElements: function makeElements(data) { + var _this6 = this; + + return data.map(function (r) { + return yRegion(r.startPos, r.endPos, _this6.constants.width, r.label, { labelPos: r.options.labelPos }); + }); + }, + animateElements: function animateElements(newData) { + var _equilizeNoOfElements11 = equilizeNoOfElements(this.oldData, newData); + + var _equilizeNoOfElements12 = _slicedToArray$3(_equilizeNoOfElements11, 2); + + this.oldData = _equilizeNoOfElements12[0]; + newData = _equilizeNoOfElements12[1]; + + var newPos = newData.map(function (d) { + return d.endPos; + }); + var newLabels = newData.map(function (d) { + return d.label; + }); + var newStarts = newData.map(function (d) { + return d.startPos; + }); + var newOptions = newData.map(function (d) { + return d.options; + }); + + var oldPos = this.oldData.map(function (d) { + return d.endPos; + }); + var oldStarts = this.oldData.map(function (d) { + return d.startPos; + }); + + this.render(oldPos.map(function (pos, i) { + return { + startPos: oldStarts[i], + endPos: oldPos[i], + label: newLabels[i], + options: newOptions[i] + }; + })); + + var animateElements = []; + + this.store.map(function (rectGroup, i) { + animateElements = animateElements.concat(animateRegion(rectGroup, newStarts[i], newPos[i], oldPos[i])); + }); + + return animateElements; + } + }, + + heatDomain: { + layerClass: function layerClass() { + return 'heat-domain domain-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var _this7 = this; + + var _constants = this.constants, + index = _constants.index, + colWidth = _constants.colWidth, + rowHeight = _constants.rowHeight, + squareSize = _constants.squareSize, + xTranslate = _constants.xTranslate; + + var monthNameHeight = -12; + var x = xTranslate, + y = 0; + + this.serializedSubDomains = []; + + data.cols.map(function (week, weekNo) { + if (weekNo === 1) { + _this7.labels.push(makeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(), { + fontSize: 9 + })); + } + week.map(function (day, i) { + if (day.fill) { + var _data = { + 'data-date': day.yyyyMmDd, + 'data-value': day.dataValue, + 'data-day': i + }; + var square = heatSquare('day', x, y, squareSize, day.fill, _data); + _this7.serializedSubDomains.push(square); + } + y += rowHeight; + }); + y = 0; + x += colWidth; + }); + + return this.serializedSubDomains; + }, + animateElements: function animateElements(newData) { + if (newData) return []; + } + }, + + barGraph: { + layerClass: function layerClass() { + return 'dataset-units dataset-bars dataset-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var c = this.constants; + this.unitType = 'bar'; + this.units = data.yPositions.map(function (y, j) { + return datasetBar(data.xPositions[j], y, data.barWidth, c.color, data.labels[j], j, data.offsets[j], { + zeroLine: data.zeroLine, + barsWidth: data.barsWidth, + minHeight: c.minHeight + }); + }); + return this.units; + }, + animateElements: function animateElements(newData) { + var newXPos = newData.xPositions; + var newYPos = newData.yPositions; + var newOffsets = newData.offsets; + var newLabels = newData.labels; + + var oldXPos = this.oldData.xPositions; + var oldYPos = this.oldData.yPositions; + var oldOffsets = this.oldData.offsets; + var oldLabels = this.oldData.labels; + + var _equilizeNoOfElements13 = equilizeNoOfElements(oldXPos, newXPos); + + var _equilizeNoOfElements14 = _slicedToArray$3(_equilizeNoOfElements13, 2); + + oldXPos = _equilizeNoOfElements14[0]; + newXPos = _equilizeNoOfElements14[1]; + + var _equilizeNoOfElements15 = equilizeNoOfElements(oldYPos, newYPos); + + var _equilizeNoOfElements16 = _slicedToArray$3(_equilizeNoOfElements15, 2); + + oldYPos = _equilizeNoOfElements16[0]; + newYPos = _equilizeNoOfElements16[1]; + + var _equilizeNoOfElements17 = equilizeNoOfElements(oldOffsets, newOffsets); + + var _equilizeNoOfElements18 = _slicedToArray$3(_equilizeNoOfElements17, 2); + + oldOffsets = _equilizeNoOfElements18[0]; + newOffsets = _equilizeNoOfElements18[1]; + + var _equilizeNoOfElements19 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements20 = _slicedToArray$3(_equilizeNoOfElements19, 2); + + oldLabels = _equilizeNoOfElements20[0]; + newLabels = _equilizeNoOfElements20[1]; + + this.render({ + xPositions: oldXPos, + yPositions: oldYPos, + offsets: oldOffsets, + labels: newLabels, + + zeroLine: this.oldData.zeroLine, + barsWidth: this.oldData.barsWidth, + barWidth: this.oldData.barWidth + }); + + var animateElements = []; + + this.store.map(function (bar, i) { + animateElements = animateElements.concat(animateBar(bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], { zeroLine: newData.zeroLine })); + }); + + return animateElements; + } + }, + + lineGraph: { + layerClass: function layerClass() { + return 'dataset-units dataset-line dataset-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var c = this.constants; + this.unitType = 'dot'; + this.paths = {}; + if (!c.hideLine) { + this.paths = getPaths(data.xPositions, data.yPositions, c.color, { + heatline: c.heatline, + regionFill: c.regionFill + }, { + svgDefs: c.svgDefs, + zeroLine: data.zeroLine + }); + } + + this.units = []; + if (!c.hideDots) { + this.units = data.yPositions.map(function (y, j) { + return datasetDot(data.xPositions[j], y, data.radius, c.color, c.valuesOverPoints ? data.values[j] : '', j); + }); + } + + return Object.values(this.paths).concat(this.units); + }, + animateElements: function animateElements(newData) { + var newXPos = newData.xPositions; + var newYPos = newData.yPositions; + var newValues = newData.values; + + var oldXPos = this.oldData.xPositions; + var oldYPos = this.oldData.yPositions; + var oldValues = this.oldData.values; + + var _equilizeNoOfElements21 = equilizeNoOfElements(oldXPos, newXPos); + + var _equilizeNoOfElements22 = _slicedToArray$3(_equilizeNoOfElements21, 2); + + oldXPos = _equilizeNoOfElements22[0]; + newXPos = _equilizeNoOfElements22[1]; + + var _equilizeNoOfElements23 = equilizeNoOfElements(oldYPos, newYPos); + + var _equilizeNoOfElements24 = _slicedToArray$3(_equilizeNoOfElements23, 2); + + oldYPos = _equilizeNoOfElements24[0]; + newYPos = _equilizeNoOfElements24[1]; + + var _equilizeNoOfElements25 = equilizeNoOfElements(oldValues, newValues); + + var _equilizeNoOfElements26 = _slicedToArray$3(_equilizeNoOfElements25, 2); + + oldValues = _equilizeNoOfElements26[0]; + newValues = _equilizeNoOfElements26[1]; + + this.render({ + xPositions: oldXPos, + yPositions: oldYPos, + values: newValues, + + zeroLine: this.oldData.zeroLine, + radius: this.oldData.radius + }); + + var animateElements = []; + + if (Object.keys(this.paths).length) { + animateElements = animateElements.concat(animatePath(this.paths, newXPos, newYPos, newData.zeroLine)); + } + + 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 _createClass$1$1 = 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$$1(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$$1(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); + } +}; + +function _toConsumableArray$1$1(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 _classCallCheck$1(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(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 PercentageChart = function (_AggregationChart) { + _inherits(PercentageChart, _AggregationChart); + + function PercentageChart(parent, args) { + _classCallCheck$1(this, PercentageChart); + + var _this = _possibleConstructorReturn(this, (PercentageChart.__proto__ || Object.getPrototypeOf(PercentageChart)).call(this, parent, args)); + + _this.type = 'percentage'; + _this.setup(); + return _this; + } + + _createClass$1$1(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$1; + b.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH$1; + + m.paddings.right = 30; + m.legendHeight = 80; + 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$1$1(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$1(_this3.container), + pOff = getOffset$1(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 _createClass$5 = 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$2 = function get$$1(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$$1(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); + } +}; + +function _toConsumableArray$2(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 _classCallCheck$6(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _possibleConstructorReturn$2(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; +} + +function _inherits$2(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(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 PieChart = function (_AggregationChart) { + _inherits$2(PieChart, _AggregationChart); + + function PieChart(parent, args) { + _classCallCheck$6(this, PieChart); + + var _this = _possibleConstructorReturn$2(this, (PieChart.__proto__ || Object.getPrototypeOf(PieChart)).call(this, parent, args)); + + _this.type = 'pie'; + _this.initTimeout = 0; + _this.init = 1; + + _this.setup(); + return _this; + } + + _createClass$5(PieChart, [{ + key: 'configure', + value: function configure(args) { + _get$2(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$2(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$1; + var diffAngle = clockWise ? -originDiffAngle : originDiffAngle; + var endAngle = curAngle = curAngle + diffAngle; + var startPosition = getPositionByAngle$1(startAngle, radius); + var endPosition = getPositionByAngle$1(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 = makeArcPathStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise); + + 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$2(args)); + return [args[0], component]; + })); + } + }, { + key: 'calTranslateByAngle', + value: function calTranslateByAngle(property) { + var radius = this.radius, + hoverRadio = this.hoverRadio; + + var position = getPositionByAngle$1(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$1(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); + +var _slicedToArray$4 = 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"); + } + }; +}(); + +function _toConsumableArray$4(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 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$4(_normalize, 2), + normalMaxValue = _normalize2[0], + exponent = _normalize2[1]; + + var normalMinValue = minValue ? minValue / Math.pow(10, exponent) : 0; + + // Allow only 7 significant digits + normalMaxValue = normalMaxValue.toFixed(6); + + var intervals = getChartRangeIntervals(normalMaxValue, normalMinValue); + intervals = intervals.map(function (value) { + return value * Math.pow(10, exponent); + }); + return intervals; +} + +function calcChartIntervals(values) { + var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + //*** Where the magic happens *** + + // Calculates best-fit y intervals from given values + // and returns the interval array + + var maxValue = Math.max.apply(Math, _toConsumableArray$4(values)); + var minValue = Math.min.apply(Math, _toConsumableArray$4(values)); + + // Exponent to be used for pretty print + var exponent = 0, + intervals = []; // eslint-disable-line no-unused-vars + + function getPositiveFirstIntervals(maxValue, absMinValue) { + var intervals = getChartIntervals(maxValue); + + var intervalSize = intervals[1] - intervals[0]; + + // Then unshift the negative values + var value = 0; + for (var i = 1; value < absMinValue; i++) { + value += intervalSize; + intervals.unshift(-1 * value); + } + return intervals; + } + + // CASE I: Both non-negative + + if (maxValue >= 0 && minValue >= 0) { + exponent = normalize(maxValue)[1]; + if (!withMinimum) { + intervals = getChartIntervals(maxValue); + } else { + intervals = getChartIntervals(maxValue, minValue); + } + } + + // CASE II: Only minValue negative + + else if (maxValue > 0 && minValue < 0) { + // `withMinimum` irrelevant in this case, + // We'll be handling both sides of zero separately + // (both starting from zero) + // Because ceil() and floor() behave differently + // in those two regions + + var absMinValue = Math.abs(minValue); + + if (maxValue >= absMinValue) { + exponent = normalize(maxValue)[1]; + intervals = getPositiveFirstIntervals(maxValue, absMinValue); + } else { + // Mirror: maxValue => absMinValue, then change sign + exponent = normalize(absMinValue)[1]; + var posIntervals = getPositiveFirstIntervals(absMinValue, maxValue); + intervals = posIntervals.map(function (d) { + return d * -1; + }); + } + } + + // CASE III: Both non-positive + + else if (maxValue <= 0 && minValue <= 0) { + // Mirrored Case I: + // Work with positives, then reverse the sign and array + + var pseudoMaxValue = Math.abs(minValue); + var pseudoMinValue = Math.abs(maxValue); + + exponent = normalize(pseudoMaxValue)[1]; + if (!withMinimum) { + intervals = getChartIntervals(pseudoMaxValue); + } else { + intervals = getChartIntervals(pseudoMaxValue, pseudoMinValue); + } + + intervals = intervals.reverse().map(function (d) { + return d * -1; + }); + } + + return intervals; +} + +function getZeroIndex(yPts) { + var zeroIndex = 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$1(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$4(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 _createClass$6 = 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; + }; +}(); + +function _toConsumableArray$3(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 _classCallCheck$7(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _possibleConstructorReturn$3(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; +} + +function _inherits$3(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(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 COL_WIDTH = HEATMAP_SQUARE_SIZE$1 + HEATMAP_GUTTER_SIZE$1; +var ROW_HEIGHT = COL_WIDTH; +// const DAY_INCR = 1; + +var Heatmap = function (_BaseChart) { + _inherits$3(Heatmap, _BaseChart); + + function Heatmap(parent, options) { + _classCallCheck$7(this, Heatmap); + + var _this = _possibleConstructorReturn$3(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$6(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$1(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$1(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$1(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$1); + + 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$1, + 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$3(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$1, + 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 lessText = makeText('subdomain-name', x, y, 'Less', { + fontSize: HEATMAP_SQUARE_SIZE$1 + 1, + dy: 9 + }); + x = COL_WIDTH * 2 + COL_WIDTH / 2; + this.legendArea.appendChild(lessText); + + this.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE$1).map(function (color, i) { + var square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i, y, HEATMAP_SQUARE_SIZE$1, color); + _this4.legendArea.appendChild(square); + }); + + var moreTextX = x + HEATMAP_DISTRIBUTION_SIZE$1 * (COL_WIDTH + 3) + COL_WIDTH / 4; + var moreText = makeText('subdomain-name', moreTextX, y, 'More', { + fontSize: HEATMAP_SQUARE_SIZE$1 + 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 + }]; + } + + var overridingType = void 0; + if (AXIS_DATASET_CHART_TYPES$1.includes(type)) { + overridingType = type; + } + + 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$1(vals, datasetLength - vals.length, 0); + } + } + + // Set labels + + // Set type + if (overridingType) { + d.chartType = overridingType; + } else if (!d.chartType) { + d.chartType = AXIS_CHART_DEFAULT_TYPE$1; + } + }); + + // Markers + + // Regions + // data.yRegions = data.yRegions || []; + if (data.yRegions) { + data.yRegions.map(function (d) { + if (d.end < d.start) { + var _ref = [d.end, d.start]; + d.start = _ref[0]; + d.end = _ref[1]; + } + }); + } + + return data; +} + +function zeroDataPrep(realData) { + var datasetLength = realData.labels.length; + var zeroArray = new Array(datasetLength).fill(0); + + var zeroData = { + labels: realData.labels.slice(0, -1), + datasets: realData.datasets.map(function (d) { + return { + name: '', + values: zeroArray.slice(0, -1), + chartType: d.chartType + }; + }) + }; + + if (realData.yMarkers) { + zeroData.yMarkers = [{ + value: 0, + label: '' + }]; + } + + if (realData.yRegions) { + zeroData.yRegions = [{ + start: 0, + end: 0, + label: '' + }]; + } + + return zeroData; +} + +function getShortenedLabels(chartWidth) { + var labels = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var isSeries = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + var allowedSpace = chartWidth / labels.length; + if (allowedSpace <= 0) allowedSpace = 1; + var allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH$1; + + 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 { + var multiple = Math.ceil(label.length / allowedLetters); + if (i % multiple !== 0) { + label = ""; + } + } + } + return label; + }); + + return calcLabels; +} + +var _createClass$7 = 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$3 = function get$$1(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$$1(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); + } +}; + +function _toConsumableArray$5(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 _classCallCheck$8(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _possibleConstructorReturn$4(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; +} + +function _inherits$4(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(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 AxisChart = function (_BaseChart) { + _inherits$4(AxisChart, _BaseChart); + + function AxisChart(parent, args) { + _classCallCheck$8(this, AxisChart); + + var _this = _possibleConstructorReturn$4(this, (AxisChart.__proto__ || Object.getPrototypeOf(AxisChart)).call(this, parent, args)); + + _this.barOptions = args.barOptions || {}; + _this.lineOptions = args.lineOptions || {}; + + _this.init = 1; + + _this.setup(); + return _this; + } + + _createClass$7(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$3(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'configure', this).call(this, options); + + options.axisOptions = options.axisOptions || {}; + options.tooltipOptions = options.tooltipOptions || {}; + + this.config.xAxisMode = options.axisOptions.xAxisMode || 'span'; + this.config.yAxisMode = options.axisOptions.yAxisMode || 'span'; + this.config.xIsSeries = options.axisOptions.xIsSeries || 0; + + this.config.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$1(s.xOffset + i * s.unitWidth); + }) + }; + } + }, { + key: 'calcYAxisParameters', + value: function calcYAxisParameters(dataValues) { + var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'false'; + + var yPts = calcChartIntervals(dataValues, withMinimum); + var scaleMultiplier = this.height / getValueRange(yPts); + var intervalHeight = getIntervalSize(yPts) * scaleMultiplier; + var zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; + + this.state.yAxis = { + labels: yPts, + positions: yPts.map(function (d) { + return zeroLine - d * scaleMultiplier; + }), + scaleMultiplier: scaleMultiplier, + zeroLine: zeroLine + }; + + // Dependent if above changes + this.calcDatasetPoints(); + this.calcYExtremes(); + this.calcYRegions(); + } + }, { + key: 'calcDatasetPoints', + value: function calcDatasetPoints() { + var s = this.state; + var scaleAll = function scaleAll(values) { + return values.map(function (val) { + return scale(val, s.yAxis); + }); + }; + + s.datasets = this.data.datasets.map(function (d, i) { + var values = d.values; + var cumulativeYs = d.cumulativeYs || []; + return { + name: d.name, + index: i, + chartType: d.chartType, + + values: values, + yPositions: scaleAll(values), + + cumulativeYs: cumulativeYs, + cumulativeYPos: scaleAll(cumulativeYs) + }; + }); + } + }, { + key: 'calcYExtremes', + value: function calcYExtremes() { + var s = this.state; + if (this.barOptions.stacked) { + s.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos; + return; + } + s.yExtremes = new Array(s.datasetLength).fill(9999); + s.datasets.map(function (d) { + d.yPositions.map(function (pos, j) { + if (pos < s.yExtremes[j]) { + s.yExtremes[j] = pos; + } + }); + }); + } + }, { + key: 'calcYRegions', + value: function calcYRegions() { + var s = this.state; + if (this.data.yMarkers) { + this.state.yMarkers = this.data.yMarkers.map(function (d) { + d.position = scale(d.value, s.yAxis); + if (!d.options) d.options = {}; + // if(!d.label.includes(':')) { + // d.label += ': ' + d.value; + // } + return d; + }); + } + if (this.data.yRegions) { + this.state.yRegions = this.data.yRegions.map(function (d) { + d.startPos = scale(d.start, s.yAxis); + d.endPos = scale(d.end, s.yAxis); + if (!d.options) d.options = {}; + return d; + }); + } + } + }, { + key: 'getAllYValues', + value: function getAllYValues() { + var _this2 = this, + _ref; + + var key = 'values'; + + if (this.barOptions.stacked) { + key = 'cumulativeYs'; + var cumulative = new Array(this.state.datasetLength).fill(0); + this.data.datasets.map(function (d, i) { + var values = _this2.data.datasets[i].values; + d[key] = cumulative = cumulative.map(function (c, i) { + return c + values[i]; + }); + }); + } + + var allValueLists = this.data.datasets.map(function (d) { + return d[key]; + }); + if (this.data.yMarkers) { + allValueLists.push(this.data.yMarkers.map(function (d) { + return d.value; + })); + } + if (this.data.yRegions) { + this.data.yRegions.map(function (d) { + allValueLists.push([d.end, d.start]); + }); + } + + return (_ref = []).concat.apply(_ref, _toConsumableArray$5(allValueLists)); + } + }, { + key: 'setupComponents', + value: function setupComponents() { + var _this3 = this; + + var componentConfigs = [['yAxis', { + mode: this.config.yAxisMode, + width: this.width + // pos: 'right' + }, function () { + return this.state.yAxis; + }.bind(this)], ['xAxis', { + mode: this.config.xAxisMode, + height: this.height + // pos: 'right' + }, function () { + var s = this.state; + s.xAxis.calcLabels = getShortenedLabels(this.width, s.xAxis.labels, this.config.xIsSeries); + + return s.xAxis; + }.bind(this)], ['yRegions', { + width: this.width, + pos: 'right' + }, function () { + return this.state.yRegions; + }.bind(this)]]; + + var barDatasets = this.state.datasets.filter(function (d) { + return d.chartType === 'bar'; + }); + var lineDatasets = this.state.datasets.filter(function (d) { + return d.chartType === 'line'; + }); + + var barsConfigs = barDatasets.map(function (d) { + var index = d.index; + return ['barGraph' + '-' + d.index, { + index: index, + color: _this3.colors[index], + stacked: _this3.barOptions.stacked, + + // same for all datasets + valuesOverPoints: _this3.config.valuesOverPoints, + minHeight: _this3.height * MIN_BAR_PERCENT_HEIGHT$1 + }, function () { + var s = this.state; + var d = s.datasets[index]; + var stacked = this.barOptions.stacked; + + var spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO$1; + var barsWidth = s.unitWidth / 2 * (2 - spaceRatio); + var barWidth = barsWidth / (stacked ? 1 : barDatasets.length); + + var xPositions = s.xAxis.positions.map(function (x) { + return x - barsWidth / 2; + }); + if (!stacked) { + xPositions = xPositions.map(function (p) { + return p + barWidth * index; + }); + } + + var labels = new Array(s.datasetLength).fill(''); + if (this.config.valuesOverPoints) { + if (stacked && d.index === s.datasets.length - 1) { + labels = d.cumulativeYs; + } else { + labels = d.values; + } + } + + var offsets = new Array(s.datasetLength).fill(0); + if (stacked) { + offsets = d.yPositions.map(function (y, j) { + return y - d.cumulativeYPos[j]; + }); + } + + return { + xPositions: xPositions, + yPositions: d.yPositions, + offsets: offsets, + // values: d.values, + labels: labels, + + zeroLine: s.yAxis.zeroLine, + barsWidth: barsWidth, + barWidth: barWidth + }; + }.bind(_this3)]; + }); + + var lineConfigs = lineDatasets.map(function (d) { + var index = d.index; + return ['lineGraph' + '-' + d.index, { + index: index, + color: _this3.colors[index], + svgDefs: _this3.svgDefs, + heatline: _this3.lineOptions.heatline, + regionFill: _this3.lineOptions.regionFill, + hideDots: _this3.lineOptions.hideDots, + hideLine: _this3.lineOptions.hideLine, + + // same for all datasets + valuesOverPoints: _this3.config.valuesOverPoints + }, function () { + var s = this.state; + var d = s.datasets[index]; + var minLine = s.yAxis.positions[0] < s.yAxis.zeroLine ? s.yAxis.positions[0] : s.yAxis.zeroLine; + + return { + xPositions: s.xAxis.positions, + yPositions: d.yPositions, + + values: d.values, + + zeroLine: minLine, + radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE$1 + }; + }.bind(_this3)]; + }); + + var markerConfigs = [['yMarkers', { + width: this.width, + pos: 'right' + }, function () { + return this.state.yMarkers; + }.bind(this)]]; + + componentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs); + + var optionals = ['yMarkers', 'yRegions']; + this.dataUnitComponents = []; + + this.components = new Map(componentConfigs.filter(function (args) { + return !optionals.includes(args[0]) || _this3.state[args[0]]; + }).map(function (args) { + var component = getComponent.apply(undefined, _toConsumableArray$5(args)); + if (args[0].includes('lineGraph') || args[0].includes('barGraph')) { + _this3.dataUnitComponents.push(component); + } + return [args[0], component]; + })); + } + }, { + key: 'makeDataByIndex', + value: function makeDataByIndex() { + var _this4 = this; + + this.dataByIndex = {}; + + var s = this.state; + var formatX = this.config.formatTooltipX; + var formatY = this.config.formatTooltipY; + var titles = s.xAxis.labels; + + titles.map(function (label, index) { + var values = _this4.state.datasets.map(function (set$$1, i) { + var value = set$$1.values[index]; + return { + title: set$$1.name, + value: value, + yPos: set$$1.yPositions[index], + color: _this4.colors[i], + formatted: formatY ? formatY(value) : value + }; + }); + + _this4.dataByIndex[index] = { + label: label, + formattedLabel: formatX ? formatX(label) : label, + xPos: s.xAxis.positions[index], + values: values, + yExtreme: s.yExtremes[index] + }; + }); + } + }, { + key: 'bindTooltip', + value: function bindTooltip() { + var _this5 = this; + + // NOTE: could be in tooltip itself, as it is a given functionality for its parent + this.container.addEventListener('mousemove', function (e) { + var m = _this5.measures; + var o = getOffset$1(_this5.container); + var relX = e.pageX - o.left - getLeftOffset$1(m); + var relY = e.pageY - o.top; + + if (relY < _this5.height + getTopOffset$1(m) && relY > getTopOffset$1(m)) { + _this5.mapTooltipXPosition(relX); + } else { + _this5.tip.hideTip(); + } + }); + } + }, { + key: 'mapTooltipXPosition', + value: function mapTooltipXPosition(relX) { + var s = this.state; + if (!s.yExtremes) return; + + var index = getClosestInArray(relX, s.xAxis.positions, true); + var dbi = this.dataByIndex[index]; + + this.tip.setValues(dbi.xPos + this.tip.offset.x, dbi.yExtreme + this.tip.offset.y, { name: dbi.formattedLabel, value: '' }, dbi.values, index); + + this.tip.showTip(); + } + }, { + key: 'renderLegend', + value: function renderLegend() { + var _this6 = this; + + var s = this.data; + if (s.datasets.length > 1) { + this.legendArea.textContent = ''; + s.datasets.map(function (d, i) { + var barWidth = AXIS_LEGEND_BAR_SIZE$1; + // let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right; + // let multiplier = s.datasets.length - i; + var rect = legendBar( + // rightEndPoint - multiplier * barWidth, // To right align + barWidth * i, '0', barWidth, _this6.colors[i], d.name); + _this6.legendArea.appendChild(rect); + }); + } + } + + // Overlay + + }, { + key: 'makeOverlay', + value: function makeOverlay$$1() { + var _this7 = this; + + if (this.init) { + this.init = 0; + return; + } + if (this.overlayGuides) { + this.overlayGuides.forEach(function (g) { + var o = g.overlay; + o.parentNode.removeChild(o); + }); + } + + this.overlayGuides = this.dataUnitComponents.map(function (c) { + return { + type: c.unitType, + overlay: undefined, + units: c.units + }; + }); + + if (this.state.currentIndex === undefined) { + this.state.currentIndex = this.state.datasetLength - 1; + } + + // Render overlays + this.overlayGuides.map(function (d) { + var currentUnit = d.units[_this7.state.currentIndex]; + + d.overlay = makeOverlay[d.type](currentUnit); + _this7.drawArea.appendChild(d.overlay); + }); + } + }, { + key: 'updateOverlayGuides', + value: function updateOverlayGuides() { + if (this.overlayGuides) { + this.overlayGuides.forEach(function (g) { + var o = g.overlay; + o.parentNode.removeChild(o); + }); + } + } + }, { + key: 'bindOverlay', + value: function bindOverlay() { + var _this8 = this; + + this.parent.addEventListener('data-select', function () { + _this8.updateOverlay(); + }); + } + }, { + key: 'bindUnits', + value: function bindUnits() { + var _this9 = this; + + this.dataUnitComponents.map(function (c) { + c.units.map(function (unit) { + unit.addEventListener('click', function () { + var index = unit.getAttribute('data-point-index'); + _this9.setCurrentDataPoint(index); + }); + }); + }); + + // Note: Doesn't work as tooltip is absolutely positioned + this.tip.container.addEventListener('click', function () { + var index = _this9.tip.container.getAttribute('data-point-index'); + _this9.setCurrentDataPoint(index); + }); + } + }, { + key: 'updateOverlay', + value: function updateOverlay$$1() { + var _this10 = this; + + this.overlayGuides.map(function (d) { + var currentUnit = d.units[_this10.state.currentIndex]; + updateOverlay[d.type](currentUnit, d.overlay); + }); + } + }, { + key: 'onLeftArrow', + value: function onLeftArrow() { + this.setCurrentDataPoint(this.state.currentIndex - 1); + } + }, { + key: 'onRightArrow', + value: function onRightArrow() { + this.setCurrentDataPoint(this.state.currentIndex + 1); + } + }, { + key: 'getDataPoint', + value: function getDataPoint() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentIndex; + + var s = this.state; + var data_point = { + index: index, + label: s.xAxis.labels[index], + values: s.datasets.map(function (d) { + return d.values[index]; + }) + }; + return data_point; + } + }, { + key: 'setCurrentDataPoint', + value: function setCurrentDataPoint(index) { + var s = this.state; + index = parseInt(index); + if (index < 0) index = 0; + if (index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1; + if (index === s.currentIndex) return; + s.currentIndex = index; + fire$1(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$3(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$3(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); + +function _classCallCheck$1$1(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +// import MultiAxisChart from './charts/MultiAxisChart'; +var chartTypes = { + bar: AxisChart, + line: AxisChart, + // multiaxis: MultiAxisChart, + percentage: PercentageChart, + heatmap: Heatmap, + pie: PieChart +}; + +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$1$1(this, Chart); + + return getChartByType(options.type, parent, options); +}; + +// Playing around with dates + + + + +var NO_OF_MILLIS$1 = 1000; +var SEC_IN_DAY$1 = 86400; + + + + + + + + + +function clone$1(date) { + return new Date(date.getTime()); +} + +function timestampSec(date) { + return date.getTime() / NO_OF_MILLIS$1; +} + +function timestampToMidnight(timestamp) { + var roundAhead = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var midnightTs = Math.floor(timestamp - timestamp % SEC_IN_DAY$1); + if (roundAhead) { + return midnightTs + SEC_IN_DAY$1; + } + return midnightTs; +} + +// export function getMonthsBetween(startDate, endDate) {} + + + + + + + + + + + +// mutates + + +// mutates +function addDays$1(date, numberOfDays) { + date.setDate(date.getDate() + numberOfDays); +} + +// Demo Chart multitype Chart +// ================================================================================ + + +var updateDataAllLabels = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"]; + +// We're gonna be shuffling this +var updateDataAllIndices = updateDataAllLabels.map(function (d, i) { + return i; +}); + + + + + + + +var moonData = { + names: ["Ganymede", "Callisto", "Io", "Europa"], + masses: [14819000, 10759000, 8931900, 4800000], + distances: [1070.412, 1882.709, 421.700, 671.034], + diameters: [5262.4, 4820.6, 3637.4, 3121.6] +}; + +var eventsData = { + labels: ["Ganymede", "Callisto", "Io", "Europa"], + datasets: [{ + "values": moonData.distances, + "formatted": moonData.distances.map(function (d) { + return d * 1000 + " km"; + }) + }] +}; + +// const jupiterMoons = { +// 'Ganymede': { +// mass: '14819000 x 10^16 kg', +// 'semi-major-axis': '1070412 km', +// 'diameter': '5262.4 km' +// }, +// 'Callisto': { +// mass: '10759000 x 10^16 kg', +// 'semi-major-axis': '1882709 km', +// 'diameter': '4820.6 km' +// }, +// 'Io': { +// mass: '8931900 x 10^16 kg', +// 'semi-major-axis': '421700 km', +// 'diameter': '3637.4 km' +// }, +// 'Europa': { +// mass: '4800000 x 10^16 kg', +// 'semi-major-axis': '671034 km', +// 'diameter': '3121.6 km' +// }, +// }; + +// ================================================================================ + +var today = new Date(); +var start = clone$1(today); +addDays$1(start, 4); +var end = clone$1(start); +start.setFullYear(start.getFullYear() - 2); +end.setFullYear(end.getFullYear() - 1); + +var startTs = timestampSec(start); +var endTs = timestampSec(end); + +startTs = timestampToMidnight(startTs); +endTs = timestampToMidnight(endTs, true); + +while (startTs < endTs) { + startTs += SEC_IN_DAY$1; +} + + + +var sampleData = { + 0: { + labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + datasets: [{ values: [18, 40, 30, 35, 8, 52, 17, -4] }] + }, + 1: { + labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + datasets: [{ name: "Dataset 1", values: [18, 40, 30, 35, 8, 52, 17, -4] }, { name: "Dataset 2", values: [30, 50, -10, 15, 18, 32, 27, 14] }] + }, + 2: { + labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon"], + datasets: [{ values: [300, 250, 720, 560, 370, 610, 690, 410, 370, 480, 620, 260, 170, 510, 630, 710] }] + }, + 3: { + labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + datasets: [{ values: [300, 250, 720, 560, 370, 610, 690, 410, 370, 480, 620, 260, 170, 510, 630, 710, 560, 370, 610, 260, 170] }] + } +}; + +var demoRegistry = { + demo1: { + type: "demo", + config: { + data: sampleData[0], + type: 'bar', + height: 140, + colors: ['red'] + } + }, + + demo2: { + type: "demo", + config: { + data: sampleData[3], + type: 'bar', + height: 140, + colors: ['orange'], + axisOptions: { + xAxisMode: "tick" + }, + barOptions: { + spaceRatio: 0.2 + } + }, + options: [{ + name: "barOptions", + path: ["barOptions"], + type: "map", + mapKeys: ['spaceRatio'], + states: { + "0.2": [0.2], + "0.5": [0.5], + "1": [1], + "1.5": [1.5] + }, + activeState: "0.2" + }] + } +}; + +window.$docsify = { + name: 'frappe-charts', + // repo: 'https://github.com/frappe/charts', + loadSidebar: true, + executeScript: true, + plugins: [function (hook, vm) { + hook.doneEach(function () { + var dbd = new docsBuilder(Chart); + + console.log("inside hook", document.querySelector('.demo')); + dbd.makeSection(document.querySelector('.demo'), demoRegistry.demo2); + }); + }] +}; + +}()); diff --git a/docs/docsify/style.css b/docs/docsify/style.css new file mode 100644 index 0000000..fdf8e40 --- /dev/null +++ b/docs/docsify/style.css @@ -0,0 +1,3 @@ +a { + color: red; +} \ No newline at end of file diff --git a/docs/docsify/test.md b/docs/docsify/test.md new file mode 100644 index 0000000..4d4c833 --- /dev/null +++ b/docs/docsify/test.md @@ -0,0 +1 @@ +* Change \ No newline at end of file diff --git a/docs/docsify/vuestyle.css b/docs/docsify/vuestyle.css new file mode 100644 index 0000000..88733b7 --- /dev/null +++ b/docs/docsify/vuestyle.css @@ -0,0 +1,952 @@ +@import url("https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,400,600"); +* { + -webkit-font-smoothing: antialiased; + -webkit-overflow-scrolling: touch; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-text-size-adjust: none; + -webkit-touch-callout: none; + box-sizing: border-box +} + +body:not(.ready) { + overflow: hidden +} + +body:not(.ready) .app-nav, +body:not(.ready)>nav, +body:not(.ready) [data-cloak] { + display: none +} + +div#app { + font-size: 30px; + font-weight: lighter; + margin: 40vh auto; + text-align: center +} + +div#app:empty:before { + content: "Loading..." +} + +.emoji { + height: 1.2rem; + vertical-align: middle +} + +.progress { + background-color: var(--theme-color, #42b983); + height: 2px; + left: 0; + position: fixed; + right: 0; + top: 0; + transition: width .2s, opacity .4s; + width: 0; + z-index: 5 +} + +.search .search-keyword, +.search a:hover { + color: var(--theme-color, #42b983) +} + +.search .search-keyword { + font-style: normal; + font-weight: 700 +} + +body, +html { + height: 100% +} + +body { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + color: #34495e; + font-family: Source Sans Pro, Helvetica Neue, Arial, sans-serif; + font-size: 15px; + letter-spacing: 0; + margin: 0; + overflow-x: hidden +} + +img { + max-width: 100% +} + +a[disabled] { + cursor: not-allowed; + opacity: .6 +} + +kbd { + border: 1px solid #ccc; + border-radius: 3px; + display: inline-block; + font-size: 12px !important; + line-height: 12px; + margin-bottom: 3px; + padding: 3px 5px; + vertical-align: middle +} + +.task-list-item { + list-style-type: none +} + +li input[type=checkbox] { + margin: 0 .2em .25em -1.6em; + vertical-align: middle +} + +.app-nav { + margin: 25px 60px 0 0; + position: absolute; + right: 0; + text-align: right; + z-index: 2 +} + +.app-nav.no-badge { + margin-right: 25px +} + +.app-nav p { + margin: 0 +} + +.app-nav>a { + margin: 0 1rem; + padding: 5px 0 +} + +.app-nav li, +.app-nav ul { + display: inline-block; + list-style: none; + margin: 0 +} + +.app-nav a { + color: inherit; + font-size: 16px; + text-decoration: none; + transition: color .3s +} + +.app-nav a.active, +.app-nav a:hover { + color: var(--theme-color, #42b983) +} + +.app-nav a.active { + border-bottom: 2px solid var(--theme-color, #42b983) +} + +.app-nav li { + display: inline-block; + margin: 0 1rem; + padding: 5px 0; + position: relative +} + +.app-nav li ul { + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: #ccc; + border-radius: 4px; + box-sizing: border-box; + display: none; + max-height: calc(100vh - 61px); + overflow-y: auto; + padding: 10px 0; + position: absolute; + right: -15px; + text-align: left; + top: 100%; + white-space: nowrap +} + +.app-nav li ul li { + display: block; + font-size: 14px; + line-height: 1rem; + margin: 0; + margin: 8px 14px; + white-space: nowrap +} + +.app-nav li ul a { + display: block; + font-size: inherit; + margin: 0; + padding: 0 +} + +.app-nav li ul a.active { + border-bottom: 0 +} + +.app-nav li:hover ul { + display: block +} + +.github-corner { + border-bottom: 0; + position: fixed; + right: 0; + text-decoration: none; + top: 0; + z-index: 1 +} + +.github-corner:hover .octo-arm { + animation: a .56s ease-in-out +} + +.github-corner svg { + color: #fff; + fill: var(--theme-color, #42b983); + height: 80px; + width: 80px +} + +main { + display: block; + position: relative; + width: 100vw; + height: 100%; + z-index: 0 +} + +main.hidden { + display: none +} + +.anchor { + display: inline-block; + text-decoration: none; + transition: all .3s +} + +.anchor span { + color: #34495e +} + +.anchor:hover { + text-decoration: underline +} + +.sidebar { + border-right: 1px solid rgba(0, 0, 0, .07); + overflow-y: auto; + padding: 40px 0 0; + position: absolute; + top: 0; + bottom: 0; + left: 0; + transition: transform .25s ease-out; + width: 300px; + z-index: 3 +} + +.sidebar>h1 { + margin: 0 auto 1rem; + font-size: 1.5rem; + font-weight: 300; + text-align: center +} + +.sidebar>h1 a { + color: inherit; + text-decoration: none +} + +.sidebar>h1 .app-nav { + display: block; + position: static +} + +.sidebar .sidebar-nav { + line-height: 2em; + padding-bottom: 40px +} + +.sidebar li.collapse .app-sub-sidebar { + display: none +} + +.sidebar ul { + margin: 0; + padding: 0 +} + +.sidebar li>p { + font-weight: 700; + margin: 0 +} + +.sidebar ul, +.sidebar ul li { + list-style: none +} + +.sidebar ul li a { + border-bottom: none; + display: block +} + +.sidebar ul li ul { + padding-left: 20px +} + +.sidebar::-webkit-scrollbar { + width: 4px +} + +.sidebar::-webkit-scrollbar-thumb { + background: transparent; + border-radius: 4px +} + +.sidebar:hover::-webkit-scrollbar-thumb { + background: hsla(0, 0%, 53%, .4) +} + +.sidebar:hover::-webkit-scrollbar-track { + background: hsla(0, 0%, 53%, .1) +} + +.sidebar-toggle { + background-color: transparent; + background-color: hsla(0, 0%, 100%, .8); + border: 0; + outline: none; + padding: 10px; + position: absolute; + bottom: 0; + left: 0; + text-align: center; + transition: opacity .3s; + width: 284px; + z-index: 4 +} + +.sidebar-toggle .sidebar-toggle-button:hover { + opacity: .4 +} + +.sidebar-toggle span { + background-color: var(--theme-color, #42b983); + display: block; + margin-bottom: 4px; + width: 16px; + height: 2px +} + +body.sticky .sidebar, +body.sticky .sidebar-toggle { + position: fixed +} + +.content { + padding-top: 60px; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 300px; + transition: left .25s ease +} + +.markdown-section { + margin: 0 auto; + max-width: 800px; + padding: 30px 15px 40px; + position: relative +} + +.markdown-section>* { + box-sizing: border-box; + font-size: inherit +} + +.markdown-section>:first-child { + margin-top: 0 !important +} + +.markdown-section hr { + border: none; + border-bottom: 1px solid #eee; + margin: 2em 0 +} + +.markdown-section iframe { + border: 1px solid #eee +} + +.markdown-section table { + border-collapse: collapse; + border-spacing: 0; + display: block; + margin-bottom: 1rem; + overflow: auto; + width: 100% +} + +.markdown-section th { + font-weight: 700 +} + +.markdown-section td, +.markdown-section th { + border: 1px solid #ddd; + padding: 6px 13px +} + +.markdown-section tr { + border-top: 1px solid #ccc +} + +.markdown-section p.tip, +.markdown-section tr:nth-child(2n) { + background-color: #f8f8f8 +} + +.markdown-section p.tip { + border-bottom-right-radius: 2px; + border-left: 4px solid #f66; + border-top-right-radius: 2px; + margin: 2em 0; + padding: 12px 24px 12px 30px; + position: relative +} + +.markdown-section p.tip:before { + background-color: #f66; + border-radius: 100%; + color: #fff; + content: "!"; + font-family: Dosis, Source Sans Pro, Helvetica Neue, Arial, sans-serif; + font-size: 14px; + font-weight: 700; + left: -12px; + line-height: 20px; + position: absolute; + height: 20px; + width: 20px; + text-align: center; + top: 14px +} + +.markdown-section p.tip code { + background-color: #efefef +} + +.markdown-section p.tip em { + color: #34495e +} + +.markdown-section p.warn { + background: rgba(66, 185, 131, .1); + border-radius: 2px; + padding: 1rem +} + +body.close .sidebar { + transform: translateX(-300px) +} + +body.close .sidebar-toggle { + width: auto +} + +body.close .content { + left: 0 +} + +@media print { + .app-nav, + .github-corner, + .sidebar, + .sidebar-toggle { + display: none + } +} + +@media screen and (max-width:768px) { + .github-corner, + .sidebar, + .sidebar-toggle { + position: fixed + } + .app-nav { + margin-top: 16px + } + .app-nav li ul { + top: 30px + } + main { + height: auto; + overflow-x: hidden + } + .sidebar { + left: -300px; + transition: transform .25s ease-out + } + .content { + left: 0; + max-width: 100vw; + position: static; + padding-top: 20px; + transition: transform .25s ease + } + .app-nav, + .github-corner { + transition: transform .25s ease-out + } + .sidebar-toggle { + background-color: transparent; + width: auto; + padding: 30px 30px 10px 10px + } + body.close .sidebar { + transform: translateX(300px) + } + body.close .sidebar-toggle { + background-color: hsla(0, 0%, 100%, .8); + transition: background-color 1s; + width: 284px; + padding: 10px + } + body.close .content { + transform: translateX(300px) + } + body.close .app-nav, + body.close .github-corner { + display: none + } + .github-corner:hover .octo-arm { + animation: none + } + .github-corner .octo-arm { + animation: a .56s ease-in-out + } +} + +@keyframes a { + 0%, + to { + transform: rotate(0) + } + 20%, + 60% { + transform: rotate(-25deg) + } + 40%, + 80% { + transform: rotate(10deg) + } +} + +section.cover { + -ms-flex-align: center; + align-items: center; + background-position: 50%; + background-repeat: no-repeat; + background-size: cover; + height: 100vh; + display: none +} + +section.cover.show { + display: -ms-flexbox; + display: flex +} + +section.cover.has-mask .mask { + background-color: #fff; + opacity: .8; + position: absolute; + top: 0; + height: 100%; + width: 100% +} + +section.cover .cover-main { + -ms-flex: 1; + flex: 1; + margin: -20px 16px 0; + text-align: center; + z-index: 1 +} + +section.cover a { + color: inherit +} + +section.cover a, +section.cover a:hover { + text-decoration: none +} + +section.cover p { + line-height: 1.5rem; + margin: 1em 0 +} + +section.cover h1 { + color: inherit; + font-size: 2.5rem; + font-weight: 300; + margin: .625rem 0 2.5rem; + position: relative; + text-align: center +} + +section.cover h1 a { + display: block +} + +section.cover h1 small { + bottom: -.4375rem; + font-size: 1rem; + position: absolute +} + +section.cover blockquote { + font-size: 1.5rem; + text-align: center +} + +section.cover ul { + line-height: 1.8; + list-style-type: none; + margin: 1em auto; + max-width: 500px; + padding: 0 +} + +section.cover .cover-main>p:last-child a { + border: 1px solid var(--theme-color, #42b983); + border-radius: 2rem; + box-sizing: border-box; + color: var(--theme-color, #42b983); + display: inline-block; + font-size: 1.05rem; + letter-spacing: .1rem; + margin: .5rem 1rem; + padding: .75em 2rem; + text-decoration: none; + transition: all .15s ease +} + +section.cover .cover-main>p:last-child a:last-child { + background-color: var(--theme-color, #42b983); + color: #fff +} + +section.cover .cover-main>p:last-child a:last-child:hover { + color: inherit; + opacity: .8 +} + +section.cover .cover-main>p:last-child a:hover { + color: inherit +} + +section.cover blockquote>p>a { + border-bottom: 2px solid var(--theme-color, #42b983); + transition: color .3s +} + +section.cover blockquote>p>a:hover { + color: var(--theme-color, #42b983) +} + +.sidebar, +body { + background-color: #fff +} + +.sidebar { + color: #364149 +} + +.sidebar li { + margin: 6px 0 6px 15px +} + +.sidebar ul li a { + color: #505d6b; + font-size: 14px; + font-weight: 400; + overflow: hidden; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap +} + +.sidebar ul li a:hover { + text-decoration: underline +} + +.sidebar ul li ul { + padding: 0 +} + +.sidebar ul li.active>a { + border-right: 2px solid; + color: var(--theme-color, #42b983); + font-weight: 600 +} + +.app-sub-sidebar li:before { + content: "-"; + padding-right: 4px; + float: left +} + +.markdown-section h1, +.markdown-section h2, +.markdown-section h3, +.markdown-section h4, +.markdown-section strong { + color: #2c3e50; + font-weight: 600 +} + +.markdown-section a { + color: var(--theme-color, #42b983); + font-weight: 600 +} + +.markdown-section h1 { + font-size: 2rem; + margin: 0 0 1rem +} + +.markdown-section h2 { + font-size: 1.75rem; + margin: 45px 0 .8rem +} + +.markdown-section h3 { + font-size: 1.5rem; + margin: 40px 0 .6rem +} + +.markdown-section h4 { + font-size: 1.25rem +} + +.markdown-section h5 { + font-size: 1rem +} + +.markdown-section h6 { + color: #777; + font-size: 1rem +} + +.markdown-section figure, +.markdown-section p { + margin: 1.2em 0 +} + +.markdown-section ol, +.markdown-section p, +.markdown-section ul { + line-height: 1.6rem; + word-spacing: .05rem +} + +.markdown-section ol, +.markdown-section ul { + padding-left: 1.5rem +} + +.markdown-section blockquote { + border-left: 4px solid var(--theme-color, #42b983); + color: #858585; + margin: 2em 0; + padding-left: 20px +} + +.markdown-section blockquote p { + font-weight: 600; + margin-left: 0 +} + +.markdown-section iframe { + margin: 1em 0 +} + +.markdown-section em { + color: #7f8c8d +} + +.markdown-section code { + border-radius: 2px; + color: #e96900; + font-size: .8rem; + margin: 0 2px; + padding: 3px 5px; + white-space: pre-wrap +} + +.markdown-section code, +.markdown-section pre { + background-color: #f8f8f8; + font-family: Roboto Mono, Monaco, courier, monospace +} + +.markdown-section pre { + -moz-osx-font-smoothing: initial; + -webkit-font-smoothing: initial; + line-height: 1.5rem; + margin: 1.2em 0; + overflow: auto; + padding: 0 1.4rem; + position: relative; + word-wrap: normal +} + +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #8e908c +} + +.token.namespace { + opacity: .7 +} + +.token.boolean, +.token.number { + color: #c76b29 +} + +.token.punctuation { + color: #525252 +} + +.token.property { + color: #c08b30 +} + +.token.tag { + color: #2973b7 +} + +.token.string { + color: var(--theme-color, #42b983) +} + +.token.selector { + color: #6679cc +} + +.token.attr-name { + color: #2973b7 +} + +.language-css .token.string, +.style .token.string, +.token.entity, +.token.url { + color: #22a2c9 +} + +.token.attr-value, +.token.control, +.token.directive, +.token.unit { + color: var(--theme-color, #42b983) +} + +.token.keyword { + color: #e96900 +} + +.token.atrule, +.token.regex, +.token.statement { + color: #22a2c9 +} + +.token.placeholder, +.token.variable { + color: #3d8fd1 +} + +.token.deleted { + text-decoration: line-through +} + +.token.inserted { + border-bottom: 1px dotted #202746; + text-decoration: none +} + +.token.italic { + font-style: italic +} + +.token.bold, +.token.important { + font-weight: 700 +} + +.token.important { + color: #c94922 +} + +.token.entity { + cursor: help +} + +.markdown-section pre>code { + -moz-osx-font-smoothing: initial; + -webkit-font-smoothing: initial; + background-color: #f8f8f8; + border-radius: 2px; + color: #525252; + display: block; + font-family: Roboto Mono, Monaco, courier, monospace; + font-size: .8rem; + line-height: inherit; + margin: 0 2px; + max-width: inherit; + overflow: inherit; + padding: 2.2em 5px; + white-space: inherit +} + +.markdown-section code:after, +.markdown-section code:before { + letter-spacing: .05rem +} + +code .token { + -moz-osx-font-smoothing: initial; + -webkit-font-smoothing: initial; + min-height: 1.5rem +} + +pre:after { + color: #ccc; + content: attr(data-lang); + font-size: .6rem; + font-weight: 600; + height: 15px; + line-height: 15px; + padding: 5px 10px 0; + position: absolute; + right: 0; + text-align: right; + top: 0 +} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index b7292a0..1abb422 100644 --- a/docs/index.html +++ b/docs/index.html @@ -37,7 +37,7 @@

                    - Documentation + Documentation GitHub

                    Star

                    diff --git a/rollup.config.js b/rollup.config.js index fabf05e..4eb5afb 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -150,13 +150,24 @@ export default [ babel({ exclude: 'node_modules/**', }), - replace({ - exclude: 'node_modules/**', - ENV: JSON.stringify(process.env.NODE_ENV || 'development'), - }), - uglify() + // TODO: + // uglify() ], }, + { + input: 'docs/docsify/indexShadow.js', + output: [ + { + file: 'docs/docsify/indexShadow.min.js', + format: 'iife', + } + ], + plugins: [ + babel({ + exclude: 'node_modules/**' + }) + ] + }, { input: 'src/js/chart.js', output: [ @@ -179,15 +190,6 @@ export default [ cssnano() ] }), - eslint({ - exclude: [ - 'src/css/**', - ] - }), - replace({ - exclude: 'node_modules/**', - ENV: JSON.stringify(process.env.NODE_ENV || 'development'), - }) ], } ];