diff --git a/dist/components/grid.d.ts b/dist/components/grid.d.ts new file mode 100644 index 0000000..7700d9a --- /dev/null +++ b/dist/components/grid.d.ts @@ -0,0 +1,14 @@ +import { GridOptions, SvgElParams } from '../types'; +import * as d3 from 'd3'; +export declare class Grid { + private _d3; + private _svgEl; + private _svgElParams; + protected gridOptions: GridOptions; + constructor(_d3: typeof d3, _svgEl: d3.Selection, _svgElParams: SvgElParams, _gridOptions: GridOptions); + protected setOptionDefaults(gridOptions: GridOptions): GridOptions; + render(): void; + renderGridLinesX(): void; + renderGridLinesY(): void; + updateStylesOfTicks(): void; +} diff --git a/dist/index.d.ts b/dist/index.d.ts index 2d9c955..a0e44a8 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,6 +1,7 @@ /// import VueChartwerkPodMixin from './VueChartwerkPodMixin'; import { PodState } from './state'; +import { Grid } from './components/grid'; import { Margin, TimeSerie, Options, TickOrientation, TimeFormat, BrushOrientation, AxisFormat, CrosshairOrientation, SvgElementAttributes, KeyEvent, PanOrientation, yAxisOrientation, ScrollPanOrientation, AxisOption } from './types'; import { palette } from './colors'; import * as d3 from 'd3'; @@ -13,7 +14,7 @@ declare abstract class ChartwerkPod { protected brush?: d3.BrushBehavior; protected zoom?: any; protected svg?: d3.Selection; - protected state?: PodState; + protected state?: PodState; protected clipPath?: any; protected isPanning: boolean; protected isBrushing: boolean; @@ -31,9 +32,7 @@ declare abstract class ChartwerkPod { protected readonly d3: typeof d3; protected deltaYTransform: number; protected debouncedRender: import("lodash").DebouncedFunc; - private _xScale; - private _yScale; - private _y1Scale; + protected grid: Grid; constructor(_d3: typeof d3, el: HTMLElement, _series: T[], _options: O); protected addEventListeners(): void; protected removeEventListeners(): void; @@ -51,7 +50,8 @@ declare abstract class ChartwerkPod { }): void; abstract hideSharedCrosshair(): void; protected initPodState(): void; - protected renderSvg(): void; + protected initComponents(): void; + protected createSvg(): void; protected renderGrid(): void; protected renderAxes(): void; protected renderXAxis(): void; @@ -83,13 +83,6 @@ declare abstract class ChartwerkPod { get xScale(): d3.ScaleLinear; get yScale(): d3.ScaleLinear; protected get y1Scale(): d3.ScaleLinear; - filterSerieByYAxisOrientation(serie: T, orientation: yAxisOrientation): boolean; - get minValue(): number; - get maxValue(): number; - get y1MinValue(): number; - get y1MaxValue(): number; - get minValueX(): number; - get maxValueX(): number; getd3TimeRangeEvery(count: number): d3.TimeInterval; get serieTimestampRange(): number | undefined; getAxisTicksFormatter(axisOptions: AxisOption): (d: any, i: number) => any; @@ -100,9 +93,8 @@ declare abstract class ChartwerkPod { get height(): number; get legendRowPositionY(): number; get margin(): Margin; - get isSeriesUnavailable(): boolean; - formatedBound(alias: string, target: string): string; - protected clearScaleCache(shouldClearState?: boolean): void; + formattedBound(alias: string, target: string): string; + protected clearState(): void; protected getSerieColor(idx: number): string; protected get seriesTargetsWithBounds(): any[]; protected get visibleSeries(): any[]; diff --git a/dist/index.js b/dist/index.js index 09d0bcf..72b953a 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1 +1 @@ -!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n=e();for(var r in n)("object"==typeof exports?exports:t)[r]=n[r]}}(window,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=214)}([function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(94),i=n(55);t.exports=function(t,e){return null!=t&&i(t,e,r)}},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(57),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();t.exports=o},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e,n){var r=n(29),i=n(86),o=n(14);t.exports=function(t){return t&&t.length?r(t,o,i):void 0}},function(t,e,n){var r=n(7),i=n(4);t.exports=function(t){return"symbol"==typeof t||i(t)&&"[object Symbol]"==r(t)}},function(t,e,n){var r=n(12),i=n(96),o=n(97),s=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":s&&s in Object(t)?i(t):o(t)}},function(t,e,n){var r=n(104),i=n(107);t.exports=function(t,e){var n=i(t,e);return r(n)?n:void 0}},function(t,e,n){var r=n(34),i=n(38);t.exports=function(t){return null!=t&&i(t.length)&&!r(t)}},function(t,e,n){var r=n(123);t.exports=function(t){return r(t,5)}},function(t,e,n){var r=n(29),i=n(81),o=n(14);t.exports=function(t){return t&&t.length?r(t,o,i):void 0}},function(t,e,n){var r=n(3).Symbol;t.exports=r},function(t,e,n){var r=n(63),i=n(134),o=n(9);t.exports=function(t){return o(t)?r(t):i(t)}},function(t,e){t.exports=function(t){return t}},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,n){var r=n(61),i=n(40);t.exports=function(t,e,n,o){var s=!n;n||(n={});for(var a=-1,c=e.length;++a-1&&t%1==0&&t-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){var r=n(56),i=n(24);t.exports=function(t,e){for(var n=0,o=(e=r(e,t)).length;null!=t&&n1&&s(t,e[0],e[1])?e=[]:n>2&&s(e[0],e[1],e[2])&&(e=[e[0]]),i(t,r(e,1),[])}));t.exports=a},function(t,e,n){var r=n(56),i=n(23),o=n(0),s=n(37),a=n(38),c=n(24);t.exports=function(t,e,n){for(var u=-1,f=(e=r(e,t)).length,l=!1;++uf))return!1;var h=c.get(t),p=c.get(e);if(h&&p)return h==e&&p==t;var v=-1,d=!0,y=2&n?new r:void 0;for(c.set(t,e),c.set(e,t);++ve}},function(t,e,n){var r=n(157),i=n(158);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[t.i,i,""]]);var o,s=0,a={injectType:"lazyStyleTag",insert:"head",singleton:!1},c={};c.locals=i.locals||{},c.use=function(){return s++||(o=r(i,a)),c},c.unuse=function(){s>0&&!--s&&(o(),o=null)},t.exports=c},function(t,e,n){var r=n(172),i=n(9),o=n(176),s=n(177),a=n(179),c=Math.max;t.exports=function(t,e,n,u){t=i(t)?t:a(t),n=n&&!u?s(n):0;var f=t.length;return n<0&&(n=c(f+n,0)),o(t)?n<=f&&t.indexOf(e,n)>-1:!!f&&r(t,e,n)>-1}},function(t,e,n){t.exports=n(181)},function(t,e){t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},function(t,e,n){var r=n(201)((function(t,e){return t+e}),0);t.exports=r},function(t,e,n){var r=n(59);t.exports=function(){var t=arguments,e=r(t[0]);return t.length<3?e:e.replace(t[1],t[2])}},function(t,e,n){var r=n(2),i=n(213),o=n(80),s=Math.max,a=Math.min;t.exports=function(t,e,n){var c,u,f,l,h,p,v=0,d=!1,y=!1,b=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function x(e){var n=c,r=u;return c=u=void 0,v=e,l=t.apply(r,n)}function g(t){return v=t,h=setTimeout(O,e),d?x(t):l}function m(t){var n=t-p;return void 0===p||n>=e||n<0||y&&t-v>=f}function O(){var t=i();if(m(t))return j(t);h=setTimeout(O,function(t){var n=e-(t-p);return y?a(n,f-(t-v)):n}(t))}function j(t){return h=void 0,b&&c?x(t):(c=u=void 0,l)}function A(){var t=i(),n=m(t);if(c=arguments,u=this,p=t,n){if(void 0===h)return g(p);if(y)return clearTimeout(h),h=setTimeout(O,e),x(p)}return void 0===h&&(h=setTimeout(O,e)),l}return e=o(e)||0,r(n)&&(d=!!n.leading,f=(y="maxWait"in n)?s(o(n.maxWait)||0,e):f,b="trailing"in n?!!n.trailing:b),A.cancel=function(){void 0!==h&&clearTimeout(h),v=0,c=p=u=h=void 0},A.flush=function(){return void 0===h?l:j(i())},A}},function(t,e){var n=Object.prototype.hasOwnProperty;t.exports=function(t,e){return null!=t&&n.call(t,e)}},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){var r=n(12),i=Object.prototype,o=i.hasOwnProperty,s=i.toString,a=r?r.toStringTag:void 0;t.exports=function(t){var e=o.call(t,a),n=t[a];try{t[a]=void 0;var r=!0}catch(t){}var i=s.call(t);return r&&(e?t[a]=n:delete t[a]),i}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var r=n(99),i=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g,s=r((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(i,(function(t,n,r,i){e.push(r?i.replace(o,"$1"):n||t)})),e}));t.exports=s},function(t,e,n){var r=n(100);t.exports=function(t){var e=r(t,(function(t){return 500===n.size&&n.clear(),t})),n=e.cache;return e}},function(t,e,n){var r=n(33);function i(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var s=t.apply(this,r);return n.cache=o.set(i,s)||o,s};return n.cache=new(i.Cache||r),n}i.Cache=r,t.exports=i},function(t,e,n){var r=n(102),i=n(20),o=n(35);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||i),string:new r}}},function(t,e,n){var r=n(103),i=n(108),o=n(109),s=n(110),a=n(111);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1}},function(t,e,n){var r=n(21);t.exports=function(t,e){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this}},function(t,e,n){var r=n(22);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},function(t,e,n){var r=n(22);t.exports=function(t){return r(this,t).get(t)}},function(t,e,n){var r=n(22);t.exports=function(t){return r(this,t).has(t)}},function(t,e,n){var r=n(22);t.exports=function(t,e){var n=r(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this}},function(t,e,n){var r=n(7),i=n(4);t.exports=function(t){return i(t)&&"[object Arguments]"==r(t)}},function(t,e,n){var r=n(25),i=n(129),o=n(61),s=n(130),a=n(136),c=n(65),u=n(66),f=n(139),l=n(141),h=n(69),p=n(142),v=n(28),d=n(147),y=n(148),b=n(73),x=n(0),g=n(26),m=n(153),O=n(2),j=n(155),A=n(13),_=n(17),C={};C["[object Arguments]"]=C["[object Array]"]=C["[object ArrayBuffer]"]=C["[object DataView]"]=C["[object Boolean]"]=C["[object Date]"]=C["[object Float32Array]"]=C["[object Float64Array]"]=C["[object Int8Array]"]=C["[object Int16Array]"]=C["[object Int32Array]"]=C["[object Map]"]=C["[object Number]"]=C["[object Object]"]=C["[object RegExp]"]=C["[object Set]"]=C["[object String]"]=C["[object Symbol]"]=C["[object Uint8Array]"]=C["[object Uint8ClampedArray]"]=C["[object Uint16Array]"]=C["[object Uint32Array]"]=!0,C["[object Error]"]=C["[object Function]"]=C["[object WeakMap]"]=!1,t.exports=function t(e,n,S,E,k,w){var T,R=1&n,F=2&n,M=4&n;if(S&&(T=k?S(e,E,k,w):S(e)),void 0!==T)return T;if(!O(e))return e;var I=x(e);if(I){if(T=d(e),!R)return u(e,T)}else{var P=v(e),z="[object Function]"==P||"[object GeneratorFunction]"==P;if(g(e))return c(e,R);if("[object Object]"==P||"[object Arguments]"==P||z&&!k){if(T=F||z?{}:b(e),!R)return F?l(e,a(T,e)):f(e,s(T,e))}else{if(!C[P])return k?e:{};T=y(e,P,R)}}w||(w=new r);var V=w.get(e);if(V)return V;w.set(e,T),j(e)?e.forEach((function(r){T.add(t(r,n,S,r,e,w))})):m(e)&&e.forEach((function(r,i){T.set(i,t(r,n,S,i,e,w))}));var L=I?void 0:(M?F?p:h:F?_:A)(e);return i(L||e,(function(r,i){L&&(r=e[i=r]),o(T,i,t(r,n,S,i,e,w))})),T}},function(t,e,n){var r=n(20);t.exports=function(){this.__data__=new r,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(20),i=n(35),o=n(33);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var s=n.__data__;if(!i||s.length<199)return s.push([t,e]),this.size=++n.size,this;n=this.__data__=new o(s)}return n.set(t,e),this.size=n.size,this}},function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var r=n(75),i=n(2);t.exports=function t(e,n,o,s,a,c){return i(e)&&i(n)&&(c.set(n,e),r(e,n,void 0,t,c),c.delete(n)),e}},function(t,e){t.exports=function(t){return function(e,n,r){for(var i=-1,o=Object(e),s=r(e),a=s.length;a--;){var c=s[t?a:++i];if(!1===n(o[c],c,o))break}return e}}},function(t,e,n){var r=n(76),i=n(65),o=n(72),s=n(66),a=n(73),c=n(23),u=n(0),f=n(168),l=n(26),h=n(34),p=n(2),v=n(169),d=n(42),y=n(78),b=n(170);t.exports=function(t,e,n,x,g,m,O){var j=y(t,n),A=y(e,n),_=O.get(A);if(_)r(t,n,_);else{var C=m?m(j,A,n+"",t,e,O):void 0,S=void 0===C;if(S){var E=u(A),k=!E&&l(A),w=!E&&!k&&d(A);C=A,E||k||w?u(j)?C=j:f(j)?C=s(j):k?(S=!1,C=i(A,!0)):w?(S=!1,C=o(A,!0)):C=[]:v(A)||c(A)?(C=j,c(j)?C=b(j):p(j)&&!h(j)||(C=a(A))):S=!1}S&&(O.set(A,C),g(C,A,x,m,O),O.delete(A)),r(t,n,C)}}},function(t,e,n){var r=n(9),i=n(4);t.exports=function(t){return i(t)&&r(t)}},function(t,e,n){var r=n(7),i=n(47),o=n(4),s=Function.prototype,a=Object.prototype,c=s.toString,u=a.hasOwnProperty,f=c.call(Object);t.exports=function(t){if(!o(t)||"[object Object]"!=r(t))return!1;var e=i(t);if(null===e)return!0;var n=u.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&c.call(n)==f}},function(t,e,n){var r=n(16),i=n(17);t.exports=function(t){return r(t,i(t))}},function(t,e,n){var r=n(49),i=n(79);t.exports=function(t){return r((function(e,n){var r=-1,o=n.length,s=o>1?n[o-1]:void 0,a=o>2?n[2]:void 0;for(s=t.length>3&&"function"==typeof s?(o--,s):void 0,a&&i(n[0],n[1],a)&&(s=o<3?void 0:s,o=1),e=Object(e);++r0&&o(f)?n>1?t(f,n-1,o,s,a):r(a,f):s||(a[a.length]=f)}return a}},function(t,e,n){var r=n(12),i=n(23),o=n(0),s=r?r.isConcatSpreadable:void 0;t.exports=function(t){return o(t)||i(t)||!!(s&&t&&t[s])}},function(t,e,n){var r=n(36),i=n(39),o=n(50),s=n(206),a=n(210),c=n(27),u=n(211),f=n(14),l=n(0);t.exports=function(t,e,n){e=e.length?r(e,(function(t){return l(t)?function(e){return i(e,1===t.length?t[0]:t)}:t})):[f];var h=-1;e=r(e,c(o));var p=s(t,(function(t,n,i){return{criteria:r(e,(function(e){return e(t)})),index:++h,value:t}}));return a(p,(function(t,e){return u(t,e,n)}))}},function(t,e,n){var r=n(207),i=n(9);t.exports=function(t,e){var n=-1,o=i(t)?Array(t.length):[];return r(t,(function(t,r,i){o[++n]=e(t,r,i)})),o}},function(t,e,n){var r=n(208),i=n(209)(r);t.exports=i},function(t,e,n){var r=n(77),i=n(13);t.exports=function(t,e){return t&&r(t,e,i)}},function(t,e,n){var r=n(9);t.exports=function(t,e){return function(n,i){if(null==n)return n;if(!r(n))return t(n,i);for(var o=n.length,s=e?o:-1,a=Object(n);(e?s--:++s=c?u:u*("desc"==n[i]?-1:1)}return t.index-e.index}},function(t,e,n){var r=n(6);t.exports=function(t,e){if(t!==e){var n=void 0!==t,i=null===t,o=t==t,s=r(t),a=void 0!==e,c=null===e,u=e==e,f=r(e);if(!c&&!f&&!s&&t>e||s&&a&&u&&!c&&!f||i&&a&&u||!n&&u||!o)return 1;if(!i&&!s&&!f&&t0)for(var e=this.chartContainer.append("g").attr("class","legend-row"),n=function(n){if(k()(r.seriesTargetsWithBounds,r.series[n].target))return"continue";var i=0;null!==e.selectAll("text").node()&&(i=e.node().getBBox().width+25);var o=!1!==r.series[n].visible;e.append("foreignObject").attr("x",i).attr("y",r.legendRowPositionY-12).attr("width",13).attr("height",15).html("
").on("click",(function(){void 0!==t.options.eventsCallbacks&&void 0!==t.options.eventsCallbacks.onLegendClick&&t.options.eventsCallbacks.onLegendClick(n)})),e.append("text").attr("x",i+20).attr("y",r.legendRowPositionY).attr("class","metric-legend-"+n).style("font-size","12px").style("fill",r.getSerieColor(n)).text(r.series[n].target).on("click",(function(){void 0!==t.options.eventsCallbacks&&void 0!==t.options.eventsCallbacks.onLegendLabelClick&&t.options.eventsCallbacks.onLegendLabelClick(n)}))},r=this,i=0;i.9*this.height)return;this.state.yValueRange=[l[0]-f*h,l[1]-f*h];var p=this.state.transform.y+f*u;this.state.transform={y:p};break;default:throw new Error("Unknown type of scroll pan orientation: "+r)}},t.prototype.onPanningEnd=function(){this.isPanning=!1,this.deltaYTransform=0,this.onMouseOut(),void 0!==this.options.eventsCallbacks&&void 0!==this.options.eventsCallbacks.panningEnd?this.options.eventsCallbacks.panningEnd([this.state.xValueRange,this.state.yValueRange,this.state.y1ValueRange]):console.log("on panning end, but there is no callback")},t.prototype.onBrush=function(){var t=this.d3.event.selection;if(this.options.zoomEvents.mouse.zoom.orientation===o.SQUARE&&null!==t){var e=this.getSelectionAttrs(t);void 0!==e&&this.chartContainer.select(".selection").attr("x",e.x).attr("y",e.y).attr("width",e.width).attr("height",e.height)}},t.prototype.getSelectionAttrs=function(t){if(null!==this.brushStartSelection&&null!=t){var e=this.brushStartSelection[0],n=this.brushStartSelection[1],r=t[0][0],i=t[1][0],o=t[0][1],s=i-r,a=t[1][1]-o,c=Math.min(s,a);return{x:r===e?e:e-c,y:o===n?n:n-c,width:c,height:c}}},t.prototype.onBrushStart=function(){this.isBrushing;var t=this.d3.event.selection;null!==t&&t.length>0&&(this.brushStartSelection=this.d3.event.selection[0]),this.onMouseOut()},t.prototype.onBrushEnd=function(){var t=this.d3.event.selection;if(this.isBrushing,!(null==t||t.length<2)){var e,n;switch(this.chartContainer.call(this.brush.move,null),this.options.zoomEvents.mouse.zoom.orientation){case o.HORIZONTAL:var r=this.xScale.invert(t[0]),i=this.xScale.invert(t[1]);if(Math.abs(i-r)0&&this.series[0].datapoints.length>1?this.series[0].datapoints[1][0]-this.series[0].datapoints[0][0]:void 0!==this.options.timeInterval&&void 0!==this.options.timeInterval.count?6e4*this.options.timeInterval.count:6e4},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"xTickTransform",{get:function(){if(void 0===this.options.tickFormat||void 0===this.options.tickFormat.xTickOrientation)return"";switch(this.options.tickFormat.xTickOrientation){case r.VERTICAL:return"translate(-10px, 50px) rotate(-90deg)";case r.HORIZONTAL:return"";case r.DIAGONAL:return"translate(-30px, 30px) rotate(-45deg)";default:return""}},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"extraMargin",{get:function(){var t={top:0,right:0,bottom:0,left:0};if(void 0!==this.options.tickFormat&&void 0!==this.options.tickFormat.xTickOrientation)switch(this.options.tickFormat.xTickOrientation){case r.VERTICAL:t.bottom+=80;break;case r.HORIZONTAL:break;case r.DIAGONAL:t.left+=15,t.bottom+=50,t.right+=10}return void 0!==this.options.labelFormat&&(void 0!==this.options.labelFormat.xAxis&&this.options.labelFormat.xAxis.length>0&&(t.bottom+=20),void 0!==this.options.labelFormat.yAxis&&this.options.labelFormat.yAxis.length>0&&(t.left+=20)),this.series.length>0&&(t.bottom+=25),t},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"width",{get:function(){return this.d3Node.node().clientWidth-this.margin.left-this.margin.right},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"height",{get:function(){return this.d3Node.node().clientHeight-this.margin.top-this.margin.bottom},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"legendRowPositionY",{get:function(){return this.height+this.margin.bottom-5},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"margin",{get:function(){return void 0!==this.options.margin?this.options.margin:I()({},J,this.extraMargin,$.a)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"isSeriesUnavailable",{get:function(){return void 0===this.series||0===this.series.length||0===N()(this.series.map((function(t){return t.datapoints.length})))},enumerable:!1,configurable:!0}),t.prototype.formatedBound=function(t,e){return X()(t,"$__metric_name",e)},t.prototype.clearScaleCache=function(t){void 0===t&&(t=!0),this._xScale=null,this._yScale=null,this._y1Scale=null,t&&(this.state.xValueRange=void 0,this.state.yValueRange=void 0,this.state.y1ValueRange=void 0,this.state.transform={x:0,y:0,k:1})},t.prototype.getSerieColor=function(t){if(void 0===this.series[t])throw new Error("Can't get color for unexisting serie: "+t+", there are only "+this.series.length+" series");var e=this.series[t].color;return void 0===e&&(e=_[t%_.length]),e},Object.defineProperty(t.prototype,"seriesTargetsWithBounds",{get:function(){var t=this;if(void 0===this.options.bounds||void 0===this.options.bounds.upper||void 0===this.options.bounds.lower)return[];var e=[];return this.series.forEach((function(n){e.push(t.formatedBound(t.options.bounds.upper,n.target)),e.push(t.formatedBound(t.options.bounds.lower,n.target))})),e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"visibleSeries",{get:function(){return this.series.filter((function(t){return!1!==t.visible}))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"rectClipId",{get:function(){return 0===this._clipPathUID.length&&(this._clipPathUID=Math.random().toString(36).substr(2,12)),this._clipPathUID},enumerable:!1,configurable:!0}),t.prototype.isOutOfChart=function(){var t=this.d3.mouse(this.chartContainer.node()),e=t[0],n=t[1];return n>this.height+1||n<-1||e>this.width||e<0},t}()}])})); \ No newline at end of file +!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var n=e();for(var r in n)("object"==typeof exports?exports:t)[r]=n[r]}}(window,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=214)}([function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(93),i=n(54);t.exports=function(t,e){return null!=t&&i(t,e,r)}},function(t,e){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},function(t,e,n){var r=n(56),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();t.exports=o},function(t,e){t.exports=function(t){return null!=t&&"object"==typeof t}},function(t,e,n){var r=n(29),i=n(78),o=n(14);t.exports=function(t){return t&&t.length?r(t,o,i):void 0}},function(t,e,n){var r=n(7),i=n(4);t.exports=function(t){return"symbol"==typeof t||i(t)&&"[object Symbol]"==r(t)}},function(t,e,n){var r=n(12),i=n(95),o=n(96),s=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":s&&s in Object(t)?i(t):o(t)}},function(t,e,n){var r=n(103),i=n(106);t.exports=function(t,e){var n=i(t,e);return r(n)?n:void 0}},function(t,e,n){var r=n(34),i=n(38);t.exports=function(t){return null!=t&&i(t.length)&&!r(t)}},function(t,e,n){var r=n(122);t.exports=function(t){return r(t,5)}},function(t,e,n){var r=n(29),i=n(73),o=n(14);t.exports=function(t){return t&&t.length?r(t,o,i):void 0}},function(t,e,n){var r=n(3).Symbol;t.exports=r},function(t,e,n){var r=n(62),i=n(133),o=n(9);t.exports=function(t){return o(t)?r(t):i(t)}},function(t,e){t.exports=function(t){return t}},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,n){var r=n(60),i=n(39);t.exports=function(t,e,n,o){var s=!n;n||(n={});for(var a=-1,c=e.length;++a-1&&t%1==0&&t-1&&t%1==0&&t<=9007199254740991}},function(t,e,n){var r=n(61);t.exports=function(t,e,n){"__proto__"==e&&r?r(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){var r=n(132),i=n(27),o=n(42),s=o&&o.isTypedArray,a=s?i(s):r;t.exports=a},function(t,e,n){(function(t){var r=n(56),i=e&&!e.nodeType&&e,o=i&&"object"==typeof t&&t&&!t.nodeType&&t,s=o&&o.exports===i&&r.process,a=function(){try{var t=o&&o.require&&o.require("util").types;return t||s&&s.binding&&s.binding("util")}catch(t){}}();t.exports=a}).call(this,n(40)(t))},function(t,e){var n=Object.prototype;t.exports=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||n)}},function(t,e,n){var r=n(139),i=n(66),o=Object.prototype.propertyIsEnumerable,s=Object.getOwnPropertySymbols,a=s?function(t){return null==t?[]:(t=Object(t),r(s(t),(function(e){return o.call(t,e)})))}:i;t.exports=a},function(t,e){t.exports=function(t,e){for(var n=-1,r=e.length,i=t.length;++n1&&s(t,e[0],e[1])?e=[]:n>2&&s(e[0],e[1],e[2])&&(e=[e[0]]),i(t,r(e,1),[])}));t.exports=a},function(t,e){var n=Array.prototype.reverse;t.exports=function(t){return null==t?t:n.call(t)}},function(t,e,n){var r=n(55),i=n(23),o=n(0),s=n(37),a=n(38),c=n(24);t.exports=function(t,e,n){for(var u=-1,f=(e=r(e,t)).length,l=!1;++uf))return!1;var h=c.get(t),p=c.get(e);if(h&&p)return h==e&&p==t;var v=-1,d=!0,y=2&n?new r:void 0;for(c.set(t,e),c.set(e,t);++ve}},function(t,e,n){var r=n(182)();t.exports=r},function(t,e){t.exports=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}},function(t,e,n){var r=n(15),i=n(9),o=n(37),s=n(2);t.exports=function(t,e,n){if(!s(n))return!1;var a=typeof e;return!!("number"==a?i(n)&&o(e,n.length):"string"==a&&e in n)&&r(n[e],t)}},function(t,e,n){var r=n(25),i=n(83),o=n(79),s=n(193),a=n(2),c=n(17),u=n(84);t.exports=function t(e,n,f,l,h){e!==n&&o(n,(function(o,c){if(h||(h=new r),a(o))s(e,n,c,f,t,l,h);else{var p=l?l(u(e,c),o,c+"",e,n,h):void 0;void 0===p&&(p=o),i(e,c,p)}}),c)}},function(t,e,n){var r=n(39),i=n(15);t.exports=function(t,e,n){(void 0!==n&&!i(t[e],n)||void 0===n&&!(e in t))&&r(t,e,n)}},function(t,e){t.exports=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]}},function(t,e,n){var r=n(2),i=n(6),o=/^\s+|\s+$/g,s=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,c=/^0o[0-7]+$/i,u=parseInt;t.exports=function(t){if("number"==typeof t)return t;if(i(t))return NaN;if(r(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=r(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(o,"");var n=a.test(t);return n||c.test(t)?u(t.slice(2),n?2:8):s.test(t)?NaN:+t}},function(t,e,n){var r=n(198),i=n(199);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[t.i,i,""]]);var o,s=0,a={injectType:"lazyStyleTag",insert:"head",singleton:!1},c={};c.locals=i.locals||{},c.use=function(){return s++||(o=r(i,a)),c},c.unuse=function(){s>0&&!--s&&(o(),o=null)},t.exports=c},function(t,e,n){var r=n(201),i=n(9),o=n(205),s=n(206),a=n(208),c=Math.max;t.exports=function(t,e,n,u){t=i(t)?t:a(t),n=n&&!u?s(n):0;var f=t.length;return n<0&&(n=c(f+n,0)),o(t)?n<=f&&t.indexOf(e,n)>-1:!!f&&r(t,e,n)>-1}},function(t,e,n){t.exports=n(210)},function(t,e){t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},function(t,e,n){var r=n(211)((function(t,e){return t+e}),0);t.exports=r},function(t,e,n){var r=n(58);t.exports=function(){var t=arguments,e=r(t[0]);return t.length<3?e:e.replace(t[1],t[2])}},function(t,e,n){var r=n(2),i=n(213),o=n(85),s=Math.max,a=Math.min;t.exports=function(t,e,n){var c,u,f,l,h,p,v=0,d=!1,y=!1,b=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function x(e){var n=c,r=u;return c=u=void 0,v=e,l=t.apply(r,n)}function g(t){return v=t,h=setTimeout(O,e),d?x(t):l}function m(t){var n=t-p;return void 0===p||n>=e||n<0||y&&t-v>=f}function O(){var t=i();if(m(t))return j(t);h=setTimeout(O,function(t){var n=e-(t-p);return y?a(n,f-(t-v)):n}(t))}function j(t){return h=void 0,b&&c?x(t):(c=u=void 0,l)}function A(){var t=i(),n=m(t);if(c=arguments,u=this,p=t,n){if(void 0===h)return g(p);if(y)return clearTimeout(h),h=setTimeout(O,e),x(p)}return void 0===h&&(h=setTimeout(O,e)),l}return e=o(e)||0,r(n)&&(d=!!n.leading,f=(y="maxWait"in n)?s(o(n.maxWait)||0,e):f,b="trailing"in n?!!n.trailing:b),A.cancel=function(){void 0!==h&&clearTimeout(h),v=0,c=p=u=h=void 0},A.flush=function(){return void 0===h?l:j(i())},A}},function(t,e){var n=Object.prototype.hasOwnProperty;t.exports=function(t,e){return null!=t&&n.call(t,e)}},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){var r=n(12),i=Object.prototype,o=i.hasOwnProperty,s=i.toString,a=r?r.toStringTag:void 0;t.exports=function(t){var e=o.call(t,a),n=t[a];try{t[a]=void 0;var r=!0}catch(t){}var i=s.call(t);return r&&(e?t[a]=n:delete t[a]),i}},function(t,e){var n=Object.prototype.toString;t.exports=function(t){return n.call(t)}},function(t,e,n){var r=n(98),i=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g,s=r((function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(i,(function(t,n,r,i){e.push(r?i.replace(o,"$1"):n||t)})),e}));t.exports=s},function(t,e,n){var r=n(99);t.exports=function(t){var e=r(t,(function(t){return 500===n.size&&n.clear(),t})),n=e.cache;return e}},function(t,e,n){var r=n(33);function i(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var s=t.apply(this,r);return n.cache=o.set(i,s)||o,s};return n.cache=new(i.Cache||r),n}i.Cache=r,t.exports=i},function(t,e,n){var r=n(101),i=n(20),o=n(35);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||i),string:new r}}},function(t,e,n){var r=n(102),i=n(107),o=n(108),s=n(109),a=n(110);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1}},function(t,e,n){var r=n(21);t.exports=function(t,e){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this}},function(t,e,n){var r=n(22);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},function(t,e,n){var r=n(22);t.exports=function(t){return r(this,t).get(t)}},function(t,e,n){var r=n(22);t.exports=function(t){return r(this,t).has(t)}},function(t,e,n){var r=n(22);t.exports=function(t,e){var n=r(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this}},function(t,e,n){var r=n(7),i=n(4);t.exports=function(t){return i(t)&&"[object Arguments]"==r(t)}},function(t,e,n){var r=n(25),i=n(128),o=n(60),s=n(129),a=n(135),c=n(64),u=n(65),f=n(138),l=n(140),h=n(68),p=n(141),v=n(28),d=n(146),y=n(147),b=n(72),x=n(0),g=n(26),m=n(152),O=n(2),j=n(154),A=n(13),_=n(17),S={};S["[object Arguments]"]=S["[object Array]"]=S["[object ArrayBuffer]"]=S["[object DataView]"]=S["[object Boolean]"]=S["[object Date]"]=S["[object Float32Array]"]=S["[object Float64Array]"]=S["[object Int8Array]"]=S["[object Int16Array]"]=S["[object Int32Array]"]=S["[object Map]"]=S["[object Number]"]=S["[object Object]"]=S["[object RegExp]"]=S["[object Set]"]=S["[object String]"]=S["[object Symbol]"]=S["[object Uint8Array]"]=S["[object Uint8ClampedArray]"]=S["[object Uint16Array]"]=S["[object Uint32Array]"]=!0,S["[object Error]"]=S["[object Function]"]=S["[object WeakMap]"]=!1,t.exports=function t(e,n,E,C,k,w){var T,M=1&n,R=2&n,F=4&n;if(E&&(T=k?E(e,C,k,w):E(e)),void 0!==T)return T;if(!O(e))return e;var P=x(e);if(P){if(T=d(e),!M)return u(e,T)}else{var I=v(e),z="[object Function]"==I||"[object GeneratorFunction]"==I;if(g(e))return c(e,M);if("[object Object]"==I||"[object Arguments]"==I||z&&!k){if(T=R||z?{}:b(e),!M)return R?l(e,a(T,e)):f(e,s(T,e))}else{if(!S[I])return k?e:{};T=y(e,I,M)}}w||(w=new r);var L=w.get(e);if(L)return L;w.set(e,T),j(e)?e.forEach((function(r){T.add(t(r,n,E,r,e,w))})):m(e)&&e.forEach((function(r,i){T.set(i,t(r,n,E,i,e,w))}));var V=P?void 0:(F?R?p:h:R?_:A)(e);return i(V||e,(function(r,i){V&&(r=e[i=r]),o(T,i,t(r,n,E,i,e,w))})),T}},function(t,e,n){var r=n(20);t.exports=function(){this.__data__=new r,this.size=0}},function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},function(t,e){t.exports=function(t){return this.__data__.get(t)}},function(t,e){t.exports=function(t){return this.__data__.has(t)}},function(t,e,n){var r=n(20),i=n(35),o=n(33);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var s=n.__data__;if(!i||s.length<199)return s.push([t,e]),this.size=++n.size,this;n=this.__data__=new o(s)}return n.set(t,e),this.size=n.size,this}},function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n0&&o(f)?n>1?t(f,n-1,o,s,a):r(a,f):s||(a[a.length]=f)}return a}},function(t,e,n){var r=n(12),i=n(23),o=n(0),s=r?r.isConcatSpreadable:void 0;t.exports=function(t){return o(t)||i(t)||!!(s&&t&&t[s])}},function(t,e,n){var r=n(36),i=n(49),o=n(48),s=n(179),a=n(184),c=n(27),u=n(185),f=n(14),l=n(0);t.exports=function(t,e,n){e=e.length?r(e,(function(t){return l(t)?function(e){return i(e,1===t.length?t[0]:t)}:t})):[f];var h=-1;e=r(e,c(o));var p=s(t,(function(t,n,i){return{criteria:r(e,(function(e){return e(t)})),index:++h,value:t}}));return a(p,(function(t,e){return u(t,e,n)}))}},function(t,e,n){var r=n(180),i=n(9);t.exports=function(t,e){var n=-1,o=i(t)?Array(t.length):[];return r(t,(function(t,r,i){o[++n]=e(t,r,i)})),o}},function(t,e,n){var r=n(181),i=n(183)(r);t.exports=i},function(t,e,n){var r=n(79),i=n(13);t.exports=function(t,e){return t&&r(t,e,i)}},function(t,e){t.exports=function(t){return function(e,n,r){for(var i=-1,o=Object(e),s=r(e),a=s.length;a--;){var c=s[t?a:++i];if(!1===n(o[c],c,o))break}return e}}},function(t,e,n){var r=n(9);t.exports=function(t,e){return function(n,i){if(null==n)return n;if(!r(n))return t(n,i);for(var o=n.length,s=e?o:-1,a=Object(n);(e?s--:++s=c?u:u*("desc"==n[i]?-1:1)}return t.index-e.index}},function(t,e,n){var r=n(6);t.exports=function(t,e){if(t!==e){var n=void 0!==t,i=null===t,o=t==t,s=r(t),a=void 0!==e,c=null===e,u=e==e,f=r(e);if(!c&&!f&&!s&&t>e||s&&a&&u&&!c&&!f||i&&a&&u||!n&&u||!o)return 1;if(!i&&!s&&!f&&t0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},function(t,e,n){var r=n(82),i=n(2);t.exports=function t(e,n,o,s,a,c){return i(e)&&i(n)&&(c.set(n,e),r(e,n,void 0,t,c),c.delete(n)),e}},function(t,e,n){var r=n(83),i=n(64),o=n(71),s=n(65),a=n(72),c=n(23),u=n(0),f=n(194),l=n(26),h=n(34),p=n(2),v=n(195),d=n(41),y=n(84),b=n(196);t.exports=function(t,e,n,x,g,m,O){var j=y(t,n),A=y(e,n),_=O.get(A);if(_)r(t,n,_);else{var S=m?m(j,A,n+"",t,e,O):void 0,E=void 0===S;if(E){var C=u(A),k=!C&&l(A),w=!C&&!k&&d(A);S=A,C||k||w?u(j)?S=j:f(j)?S=s(j):k?(E=!1,S=i(A,!0)):w?(E=!1,S=o(A,!0)):S=[]:v(A)||c(A)?(S=j,c(j)?S=b(j):p(j)&&!h(j)||(S=a(A))):E=!1}E&&(O.set(A,S),g(S,A,x,m,O),O.delete(A)),r(t,n,S)}}},function(t,e,n){var r=n(9),i=n(4);t.exports=function(t){return i(t)&&r(t)}},function(t,e,n){var r=n(7),i=n(46),o=n(4),s=Function.prototype,a=Object.prototype,c=s.toString,u=a.hasOwnProperty,f=c.call(Object);t.exports=function(t){if(!o(t)||"[object Object]"!=r(t))return!1;var e=i(t);if(null===e)return!0;var n=u.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&c.call(n)==f}},function(t,e,n){var r=n(16),i=n(17);t.exports=function(t){return r(t,i(t))}},function(t,e,n){var r=n(50),i=n(81);t.exports=function(t){return r((function(e,n){var r=-1,o=n.length,s=o>1?n[o-1]:void 0,a=o>2?n[2]:void 0;for(s=t.length>3&&"function"==typeof s?(o--,s):void 0,a&&i(n[0],n[1],a)&&(s=o<3?void 0:s,o=1),e=Object(e);++r0)for(var e=this.chartContainer.append("g").attr("class","legend-row"),n=function(n){if(Y()(r.seriesTargetsWithBounds,r.series[n].target))return"continue";var i=0;null!==e.selectAll("text").node()&&(i=e.node().getBBox().width+25);var o=!1!==r.series[n].visible;e.append("foreignObject").attr("x",i).attr("y",r.legendRowPositionY-12).attr("width",13).attr("height",15).html("
").on("click",(function(){void 0!==t.options.eventsCallbacks&&void 0!==t.options.eventsCallbacks.onLegendClick&&t.options.eventsCallbacks.onLegendClick(n)})),e.append("text").attr("x",i+20).attr("y",r.legendRowPositionY).attr("class","metric-legend-"+n).style("font-size","12px").style("fill",r.getSerieColor(n)).text(r.series[n].target).on("click",(function(){void 0!==t.options.eventsCallbacks&&void 0!==t.options.eventsCallbacks.onLegendLabelClick&&t.options.eventsCallbacks.onLegendLabelClick(n)}))},r=this,i=0;i.9*this.height)return;this.state.yValueRange=[l[0]-f*h,l[1]-f*h];var p=this.state.transform.y+f*u;this.state.transform={y:p};break;default:throw new Error("Unknown type of scroll pan orientation: "+r)}},t.prototype.onPanningEnd=function(){this.isPanning=!1,this.deltaYTransform=0,this.onMouseOut(),void 0!==this.options.eventsCallbacks&&void 0!==this.options.eventsCallbacks.panningEnd?this.options.eventsCallbacks.panningEnd([this.state.xValueRange,this.state.yValueRange,this.state.y1ValueRange]):console.log("on panning end, but there is no callback")},t.prototype.onBrush=function(){var t=this.d3.event.selection;if(this.options.zoomEvents.mouse.zoom.orientation===o.SQUARE&&null!==t){var e=this.getSelectionAttrs(t);void 0!==e&&this.chartContainer.select(".selection").attr("x",e.x).attr("y",e.y).attr("width",e.width).attr("height",e.height)}},t.prototype.getSelectionAttrs=function(t){if(null!==this.brushStartSelection&&null!=t){var e=this.brushStartSelection[0],n=this.brushStartSelection[1],r=t[0][0],i=t[1][0],o=t[0][1],s=i-r,a=t[1][1]-o,c=Math.min(s,a);return{x:r===e?e:e-c,y:o===n?n:n-c,width:c,height:c}}},t.prototype.onBrushStart=function(){this.isBrushing;var t=this.d3.event.selection;null!==t&&t.length>0&&(this.brushStartSelection=this.d3.event.selection[0]),this.onMouseOut()},t.prototype.onBrushEnd=function(){var t=this.d3.event.selection;if(this.isBrushing,!(null==t||t.length<2)){var e,n;switch(this.chartContainer.call(this.brush.move,null),this.options.zoomEvents.mouse.zoom.orientation){case o.HORIZONTAL:var r=this.xScale.invert(t[0]),i=this.xScale.invert(t[1]);if(Math.abs(i-r)0&&this.series[0].datapoints.length>1?this.series[0].datapoints[1][0]-this.series[0].datapoints[0][0]:void 0!==this.options.timeInterval&&void 0!==this.options.timeInterval.count?6e4*this.options.timeInterval.count:6e4},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"xTickTransform",{get:function(){if(void 0===this.options.tickFormat||void 0===this.options.tickFormat.xTickOrientation)return"";switch(this.options.tickFormat.xTickOrientation){case r.VERTICAL:return"translate(-10px, 50px) rotate(-90deg)";case r.HORIZONTAL:return"";case r.DIAGONAL:return"translate(-30px, 30px) rotate(-45deg)";default:return""}},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"extraMargin",{get:function(){var t={top:0,right:0,bottom:0,left:0};if(void 0!==this.options.tickFormat&&void 0!==this.options.tickFormat.xTickOrientation)switch(this.options.tickFormat.xTickOrientation){case r.VERTICAL:t.bottom+=80;break;case r.HORIZONTAL:break;case r.DIAGONAL:t.left+=15,t.bottom+=50,t.right+=10}return void 0!==this.options.labelFormat&&(void 0!==this.options.labelFormat.xAxis&&this.options.labelFormat.xAxis.length>0&&(t.bottom+=20),void 0!==this.options.labelFormat.yAxis&&this.options.labelFormat.yAxis.length>0&&(t.left+=20)),this.series.length>0&&(t.bottom+=25),t},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"width",{get:function(){return this.d3Node.node().clientWidth-this.margin.left-this.margin.right},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"height",{get:function(){return this.d3Node.node().clientHeight-this.margin.top-this.margin.bottom},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"legendRowPositionY",{get:function(){return this.height+this.margin.bottom-5},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"margin",{get:function(){return void 0!==this.options.margin?this.options.margin:G()({},tt,this.extraMargin,q.a)},enumerable:!1,configurable:!0}),t.prototype.formattedBound=function(t,e){return W()(t,"$__metric_name",e)},t.prototype.clearState=function(){this.state.clearState()},t.prototype.getSerieColor=function(t){if(void 0===this.series[t])throw new Error("Can't get color for unexisting serie: "+t+", there are only "+this.series.length+" series");var e=this.series[t].color;return void 0===e&&(e=B[t%B.length]),e},Object.defineProperty(t.prototype,"seriesTargetsWithBounds",{get:function(){var t=this;if(void 0===this.options.bounds||void 0===this.options.bounds.upper||void 0===this.options.bounds.lower)return[];var e=[];return this.series.forEach((function(n){e.push(t.formattedBound(t.options.bounds.upper,n.target)),e.push(t.formattedBound(t.options.bounds.lower,n.target))})),e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"visibleSeries",{get:function(){return this.series.filter((function(t){return!1!==t.visible}))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"rectClipId",{get:function(){return 0===this._clipPathUID.length&&(this._clipPathUID=Math.random().toString(36).substr(2,12)),this._clipPathUID},enumerable:!1,configurable:!0}),t.prototype.isOutOfChart=function(){var t=this.d3.mouse(this.chartContainer.node()),e=t[0],n=t[1];return n>this.height+1||n<-1||e>this.width||e<0},t}()}])})); \ No newline at end of file diff --git a/dist/state.d.ts b/dist/state.d.ts index 2a3be0c..5461bd4 100644 --- a/dist/state.d.ts +++ b/dist/state.d.ts @@ -1,10 +1,33 @@ -import { Options } from './types'; -export declare class PodState { +import { TimeSerie, Options, yAxisOrientation } from './types'; +import * as d3 from 'd3'; +export declare class PodState { + protected _d3: typeof d3; + protected boxParams: { + height: number; + width: number; + }; + protected series: T[]; + protected options: O; private _xValueRange; private _yValueRange; private _y1ValueRange; private _transform; - constructor(options: Options); + private _xScale; + private _yScale; + private _y1Scale; + constructor(_d3: typeof d3, boxParams: { + height: number; + width: number; + }, series: T[], options: O); + protected setInitialRanges(): void; + protected initScales(): void; + protected setYScale(): void; + protected setXScale(): void; + protected setY1Scale(): void; + clearState(): void; + get yScale(): d3.ScaleLinear; + get xScale(): d3.ScaleLinear; + get y1Scale(): d3.ScaleLinear; get xValueRange(): [number, number] | undefined; get yValueRange(): [number, number] | undefined; get y1ValueRange(): [number, number] | undefined; @@ -21,4 +44,12 @@ export declare class PodState { y?: number; k?: number; }); + getMinValueY(): number; + getMaxValueY(): number; + getMinValueX(): number; + getMaxValueX(): number; + getMinValueY1(): number; + getMaxValueY1(): number; + get isSeriesUnavailable(): boolean; + protected filterSerieByYAxisOrientation(serie: T, orientation: yAxisOrientation): boolean; } diff --git a/dist/types.d.ts b/dist/types.d.ts index 10159cc..ac040b6 100644 --- a/dist/types.d.ts +++ b/dist/types.d.ts @@ -40,16 +40,7 @@ export declare type Options = { y?: AxisOption; y1?: AxisOption; }; - grid?: { - x?: { - isActive?: boolean; - ticksCount?: number; - }; - y?: { - isActive?: boolean; - ticksCount?: number; - }; - }; + grid?: GridOptions; crosshair?: { orientation?: CrosshairOrientation; color?: string; @@ -103,6 +94,16 @@ export declare type Options = { renderTicksfromTimestamps?: boolean; renderLegend?: boolean; }; +export declare type GridOptions = { + x?: { + enabled?: boolean; + ticksCount?: number; + }; + y?: { + enabled?: boolean; + ticksCount?: number; + }; +}; export declare type AxisOption = { isActive?: boolean; ticksCount?: number; @@ -173,3 +174,9 @@ export declare enum yAxisOrientation { RIGHT = "right", BOTH = "both" } +export declare type SvgElParams = { + height: number; + width: number; + xScale: d3.ScaleLinear; + yScale: d3.ScaleLinear; +}; diff --git a/package-lock.json b/package-lock.json index 1e66a10..6aa9a44 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@chartwerk/core", - "version": "0.1.1", + "version": "0.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/index.ts b/src/index.ts index fbcfa5e..331cec9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -32,14 +32,8 @@ import includes from 'lodash/includes'; import first from 'lodash/first'; import last from 'lodash/last'; import mergeWith from 'lodash/mergeWith'; -import min from 'lodash/min'; -import minBy from 'lodash/minBy'; -import max from 'lodash/max'; -import maxBy from 'lodash/maxBy'; import add from 'lodash/add'; import replace from 'lodash/replace'; -import reverse from 'lodash/reverse'; -import sortBy from 'lodash/sortBy'; import cloneDeep from 'lodash/cloneDeep'; import debounce from 'lodash/debounce'; import has from 'lodash/has'; @@ -119,7 +113,7 @@ abstract class ChartwerkPod { protected brush?: d3.BrushBehavior; protected zoom?: any; protected svg?: d3.Selection; - protected state?: PodState; + protected state?: PodState; protected clipPath?: any; protected isPanning = false; protected isBrushing = false; @@ -141,11 +135,6 @@ abstract class ChartwerkPod { // components protected grid: Grid; - // TODO: test variables instead of functions with cache - private _xScale: d3.ScaleLinear | null = null; - private _yScale: d3.ScaleLinear | null = null; - private _y1Scale: d3.ScaleLinear | null = null; - constructor( // maybe it's not the best idea _d3: typeof d3, @@ -162,13 +151,11 @@ abstract class ChartwerkPod { this.series = cloneDeep(_series); this.d3 = _d3; - // TODO: mb move it to render(); - this.initPodState(); - this.d3Node = this.d3.select(this.el); this.addEventListeners(); this.createSvg(); + this.initPodState(); this.initComponents(); } @@ -181,8 +168,6 @@ abstract class ChartwerkPod { } public render(): void { - this.clearScaleCache(); - this.renderAxes(); this.renderGrid(); @@ -235,16 +220,21 @@ abstract class ChartwerkPod { public abstract hideSharedCrosshair(): void; protected initPodState(): void { - this.state = new PodState(this.options); + const boxPararms = { + height: this.height, + width: this.width, + } + this.state = new PodState(this.d3, boxPararms, this.series, this.options); } protected initComponents(): void { // TODO: make chartContainer a separate class with SvgElParams inside to avoid duplication + // TODO: bad connection between State and Grid const svgElParams = { height: this.height, width: this.width, - xScale: this.xScale, - yScale: this.yScale, + xScale: this.state.xScale, + yScale: this.state.yScale, } this.grid = new Grid(this.d3, this.chartContainer, svgElParams, this.options.grid); @@ -605,8 +595,7 @@ abstract class ChartwerkPod { this.onPanningRescale(event); - const shouldClearState = false; - this.clearScaleCache(shouldClearState); + // TODO: check clear state for necessity this.renderYAxis(); this.renderXAxis(); @@ -673,9 +662,6 @@ abstract class ChartwerkPod { const signX = Math.sign(event.transform.x); const transformX = this.absXScale.invert(Math.abs(transformStep)); let rangeX = this.state.xValueRange; - if(this.state.xValueRange === undefined) { - rangeX = [this.maxValueX, this.minValueX]; - } this.state.xValueRange = [rangeX[0] + signX * transformX, rangeX[1] + signX * transformX]; const translateX = this.state.transform.x + signX * transformStep; this.state.transform = { x: translateX }; @@ -687,7 +673,7 @@ abstract class ChartwerkPod { if(this.options.axis.y.invert === true) { signY = -signY; } - let rangeY = this.state.yValueRange || [this.maxValue, this.minValue]; + let rangeY = this.state.yValueRange; const transformY = this.absYScale.invert(deltaY); this.deltaYTransform = this.deltaYTransform + deltaY; // TODO: not hardcoded bounds @@ -839,173 +825,31 @@ abstract class ChartwerkPod { } } + // TODO: move to State get absXScale(): d3.ScaleLinear { - const domain = [0, Math.abs(this.maxValueX - this.minValueX)]; + const domain = [0, Math.abs(this.state.getMaxValueX() - this.state.getMinValueX())]; return this.d3.scaleLinear() .domain(domain) .range([0, this.width]); } get absYScale(): d3.ScaleLinear { - const domain = [0, Math.abs(this.maxValue - this.minValue)]; + const domain = [0, Math.abs(this.state.getMaxValueY() - this.state.getMinValueY())]; return this.d3.scaleLinear() .domain(domain) .range([0, this.height]); } get xScale(): d3.ScaleLinear { - if(this._xScale === null) { - const domain = this.state.xValueRange || [this.minValueX, this.maxValueX]; - this._xScale = this.d3.scaleLinear() - .domain(domain) - .range([0, this.width]); - } - return this._xScale; + return this.state.xScale; } get yScale(): d3.ScaleLinear { - if(this._yScale === null) { - let domain = this.state.yValueRange || [this.maxValue, this.minValue]; - domain = sortBy(domain) as [number, number]; - if(this.options.axis.y.invert === true) { - domain = reverse(domain); - } - this._yScale = this.d3.scaleLinear() - .domain(domain) - .range([this.height, 0]); // inversed, because d3 y-axis goes from top to bottom - } - return this._yScale; + return this.state.yScale; } protected get y1Scale(): d3.ScaleLinear { - if(this.isSeriesUnavailable || this.options.axis.y1 === undefined || this.options.axis.y1.isActive === false) { - return null; - } - // scale for y1 axis(right y axis) - if(this._y1Scale === null) { - let domain = this.state.y1ValueRange || [this.y1MaxValue, this.y1MinValue]; - domain = sortBy(domain) as [number, number]; - if(this.options.axis.y1.invert === true) { - domain = reverse(domain); - } - this._y1Scale = this.d3.scaleLinear() - .domain(domain) - .range([this.height, 0]); // inversed, because d3 y-axis goes from top to bottom - } - return this._y1Scale; - } - - filterSerieByYAxisOrientation(serie: T, orientation: yAxisOrientation): boolean { - if(serie.yOrientation === undefined || serie.yOrientation === yAxisOrientation.BOTH) { - return true; - } - return serie.yOrientation === orientation; - } - - get minValue(): number { - // y min value - if(this.isSeriesUnavailable) { - return DEFAULT_AXIS_RANGE[0]; - } - if(this.options.axis.y !== undefined && this.options.axis.y.range !== undefined) { - return min(this.options.axis.y.range); - } - const minValue = min( - this.series - .filter(serie => serie.visible !== false && this.filterSerieByYAxisOrientation(serie, yAxisOrientation.LEFT)) - .map( - serie => minBy(serie.datapoints, dp => dp[1])[1] - ) - ); - return minValue; - } - - get maxValue(): number { - // y max value - if(this.isSeriesUnavailable) { - return DEFAULT_AXIS_RANGE[1]; - } - if(this.options.axis.y !== undefined && this.options.axis.y.range !== undefined) { - return max(this.options.axis.y.range); - } - const maxValue = max( - this.series - .filter(serie => serie.visible !== false && this.filterSerieByYAxisOrientation(serie, yAxisOrientation.LEFT)) - .map( - serie => maxBy(serie.datapoints, dp => dp[1])[1] - ) - ); - return maxValue; - } - - get y1MinValue(): number { - // TODO: remove duplicates - if(this.isSeriesUnavailable || this.options.axis.y1 === undefined || this.options.axis.y1.isActive === false) { - return DEFAULT_AXIS_RANGE[0]; - } - if(this.options.axis.y1.range !== undefined) { - return min(this.options.axis.y1.range); - } - const minValue = min( - this.series - .filter(serie => serie.visible !== false && this.filterSerieByYAxisOrientation(serie, yAxisOrientation.RIGHT)) - .map( - serie => minBy(serie.datapoints, dp => dp[1])[1] - ) - ); - return minValue; - } - - get y1MaxValue(): number { - if(this.isSeriesUnavailable || this.options.axis.y1 === undefined || this.options.axis.y1.isActive === false) { - return DEFAULT_AXIS_RANGE[1]; - } - if(this.options.axis.y1 !== undefined && this.options.axis.y1.range !== undefined) { - return max(this.options.axis.y1.range); - } - const maxValue = max( - this.series - .filter(serie => serie.visible !== false && this.filterSerieByYAxisOrientation(serie, yAxisOrientation.RIGHT)) - .map( - serie => maxBy(serie.datapoints, dp => dp[1])[1] - ) - ); - return maxValue; - } - - get minValueX(): number { - if(this.isSeriesUnavailable) { - return DEFAULT_AXIS_RANGE[0]; - } - - if(this.options.axis.x !== undefined && this.options.axis.x.range !== undefined) { - return min(this.options.axis.x.range) - } - const minValue = min( - this.series - .filter(serie => serie.visible !== false) - .map( - serie => minBy(serie.datapoints, dp => dp[0])[0] - ) - ); - return minValue; - } - - get maxValueX(): number { - if(this.isSeriesUnavailable) { - return DEFAULT_AXIS_RANGE[1]; - } - if(this.options.axis.x !== undefined && this.options.axis.x.range !== undefined) { - return max(this.options.axis.x.range) - } - const maxValue = max( - this.series - .filter(serie => serie.visible !== false) - .map( - serie => maxBy(serie.datapoints, dp => dp[0])[0] - ) - ); - return maxValue; + return this.state.y1Scale; } getd3TimeRangeEvery(count: number): d3.TimeInterval { @@ -1146,27 +990,13 @@ abstract class ChartwerkPod { return mergeWith({}, DEFAULT_MARGIN, this.extraMargin, add); } - get isSeriesUnavailable(): boolean { - // TODO: Use one && throw error - return this.series === undefined || this.series.length === 0 || - max(this.series.map(serie => serie.datapoints.length)) === 0; - } - - formatedBound(alias: string, target: string): string { + formattedBound(alias: string, target: string): string { const confidenceMetric = replace(alias, '$__metric_name', target); return confidenceMetric; } - protected clearScaleCache(shouldClearState = true): void { - this._xScale = null; - this._yScale = null; - this._y1Scale = null; - if(shouldClearState) { - this.state.xValueRange = undefined; - this.state.yValueRange = undefined; - this.state.y1ValueRange = undefined; - this.state.transform = { x: 0, y: 0, k: 1 }; - } + protected clearState(): void { + this.state.clearState(); } protected getSerieColor(idx: number): string { @@ -1192,8 +1022,8 @@ abstract class ChartwerkPod { } let series = []; this.series.forEach(serie => { - series.push(this.formatedBound(this.options.bounds.upper, serie.target)); - series.push(this.formatedBound(this.options.bounds.lower, serie.target)); + series.push(this.formattedBound(this.options.bounds.upper, serie.target)); + series.push(this.formattedBound(this.options.bounds.lower, serie.target)); }); return series; } diff --git a/src/state.ts b/src/state.ts index 6364ac7..d5afd72 100755 --- a/src/state.ts +++ b/src/state.ts @@ -1,27 +1,103 @@ -import { Options, TimeFormat, TickOrientation, AxisFormat } from './types'; +import { TimeSerie, Options, yAxisOrientation } from './types'; + +// we import only d3 types here +import * as d3 from 'd3'; -import lodashGet from 'lodash/get'; import cloneDeep from 'lodash/cloneDeep'; +import min from 'lodash/min'; +import minBy from 'lodash/minBy'; +import max from 'lodash/max'; +import maxBy from 'lodash/maxBy'; +import sortBy from 'lodash/sortBy'; +import reverse from 'lodash/reverse'; +const DEFAULT_AXIS_RANGE = [0, 1]; const DEFAULT_TRANSFORM = { x: 0, y: 0, k: 1 } -export class PodState { - private _xValueRange: [number, number] | undefined = undefined; - private _yValueRange: [number, number] | undefined = undefined; - private _y1ValueRange: [number, number] | undefined = undefined; +// TODO: replace all getters with fields. Because getters will be recalculated on each call. Use scales as example. +// TODO: remove duplicates in max/min values. +// TODO: PodState can be divided in two classes, but it is hard now. +export class PodState { + private _xValueRange: [number, number]; + private _yValueRange: [number, number]; + private _y1ValueRange: [number, number]; private _transform: { x: number, y: number, k: number } = cloneDeep(DEFAULT_TRANSFORM); + private _xScale: d3.ScaleLinear; + private _yScale: d3.ScaleLinear; + private _y1Scale: d3.ScaleLinear; constructor( - options: Options + protected _d3: typeof d3, + protected boxParams: { height: number, width: number }, + protected series: T[], + protected options: O, ) { - this._xValueRange = lodashGet(options, 'axis.x.range'); - this._yValueRange = lodashGet(options, 'axis.y.range'); - this._y1ValueRange = lodashGet(options, 'axis.y1.range'); + this.setInitialRanges(); + this.initScales(); + } + + protected setInitialRanges(): void { + this._xValueRange = [this.getMinValueX(), this.getMaxValueX()]; + this._yValueRange = [this.getMinValueY(), this.getMaxValueY()]; + this._y1ValueRange = [this.getMinValueY1(), this.getMaxValueY1()]; + } + + protected initScales(): void { + this.setXScale(); + this.setYScale(); + this.setY1Scale(); + } + + protected setYScale(): void { + let domain = this._yValueRange; + domain = sortBy(domain) as [number, number]; + if(this.options.axis.y.invert === true) { + domain = reverse(domain); + } + this._yScale = this._d3.scaleLinear() + .domain(domain) + .range([this.boxParams.height, 0]); // inversed, because d3 y-axis goes from top to bottom; + } + + protected setXScale(): void { + const domain = this._xValueRange; + this._xScale = this._d3.scaleLinear() + .domain(domain) + .range([0, this.boxParams.width]); + } + + protected setY1Scale(): void { + let domain = this._y1ValueRange; + domain = sortBy(domain) as [number, number]; + if(this.options.axis.y1.invert === true) { + domain = reverse(domain); + } + this._y1Scale = this._d3.scaleLinear() + .domain(domain) + .range([this.boxParams.height, 0]); // inversed, because d3 y-axis goes from top to bottom + } + + public clearState(): void { + this.setInitialRanges(); + this.initScales(); + this._transform = { x: 0, y: 0, k: 1 }; + } + + get yScale(): d3.ScaleLinear { + return this._yScale; + } + + get xScale(): d3.ScaleLinear { + return this._xScale; + } + + get y1Scale(): d3.ScaleLinear { + return this._y1Scale; } get xValueRange(): [number, number] | undefined { @@ -42,14 +118,17 @@ export class PodState { set xValueRange(range: [number, number]) { this._xValueRange = range; + this.setXScale(); } set yValueRange(range: [number, number]) { this._yValueRange = range; + this.setYScale(); } set y1ValueRange(range: [number, number]) { this._y1ValueRange = range; + this.setY1Scale(); } set transform(transform: { x?: number, y?: number, k?: number }) { @@ -57,4 +136,119 @@ export class PodState { this._transform.y = transform.y !== undefined ? transform.y : this._transform.y; this._transform.k = transform.k !== undefined ? transform.k : this._transform.k; } + + public getMinValueY(): number { + if(this.isSeriesUnavailable) { + return DEFAULT_AXIS_RANGE[0]; + } + if(this.options.axis.y !== undefined && this.options.axis.y.range !== undefined) { + return min(this.options.axis.y.range); + } + const minValue = min( + this.series + .filter(serie => serie.visible !== false && this.filterSerieByYAxisOrientation(serie, yAxisOrientation.LEFT)) + .map( + serie => minBy(serie.datapoints, dp => dp[1])[1] + ) + ); + return minValue; + } + + public getMaxValueY(): number { + if(this.isSeriesUnavailable) { + return DEFAULT_AXIS_RANGE[1]; + } + if(this.options.axis.y !== undefined && this.options.axis.y.range !== undefined) { + return max(this.options.axis.y.range); + } + const maxValue = max( + this.series + .filter(serie => serie.visible !== false && this.filterSerieByYAxisOrientation(serie, yAxisOrientation.LEFT)) + .map( + serie => maxBy(serie.datapoints, dp => dp[1])[1] + ) + ); + return maxValue; + } + + public getMinValueX(): number { + if(this.isSeriesUnavailable) { + return DEFAULT_AXIS_RANGE[0]; + } + + if(this.options.axis.x !== undefined && this.options.axis.x.range !== undefined) { + return min(this.options.axis.x.range); + } + const minValue = min( + this.series + .filter(serie => serie.visible !== false) + .map( + serie => minBy(serie.datapoints, dp => dp[0])[0] + ) + ); + return minValue; + } + + public getMaxValueX(): number { + if(this.isSeriesUnavailable) { + return DEFAULT_AXIS_RANGE[1]; + } + if(this.options.axis.x !== undefined && this.options.axis.x.range !== undefined) { + return max(this.options.axis.x.range) + } + const maxValue = max( + this.series + .filter(serie => serie.visible !== false) + .map( + serie => maxBy(serie.datapoints, dp => dp[0])[0] + ) + ); + return maxValue; + } + + public getMinValueY1(): number { + if(this.isSeriesUnavailable || this.options.axis.y1 === undefined || this.options.axis.y1.isActive === false) { + return DEFAULT_AXIS_RANGE[0]; + } + if(this.options.axis.y1.range !== undefined) { + return min(this.options.axis.y1.range); + } + const minValue = min( + this.series + .filter(serie => serie.visible !== false && this.filterSerieByYAxisOrientation(serie, yAxisOrientation.RIGHT)) + .map( + serie => minBy(serie.datapoints, dp => dp[1])[1] + ) + ); + return minValue; + } + + public getMaxValueY1(): number { + if(this.isSeriesUnavailable || this.options.axis.y1 === undefined || this.options.axis.y1.isActive === false) { + return DEFAULT_AXIS_RANGE[1]; + } + if(this.options.axis.y1 !== undefined && this.options.axis.y1.range !== undefined) { + return max(this.options.axis.y1.range); + } + const maxValue = max( + this.series + .filter(serie => serie.visible !== false && this.filterSerieByYAxisOrientation(serie, yAxisOrientation.RIGHT)) + .map( + serie => maxBy(serie.datapoints, dp => dp[1])[1] + ) + ); + return maxValue; + } + + get isSeriesUnavailable(): boolean { + return this.series === undefined || this.series.length === 0 || + max(this.series.map(serie => serie.datapoints.length)) === 0; + } + + protected filterSerieByYAxisOrientation(serie: T, orientation: yAxisOrientation): boolean { + if(serie.yOrientation === undefined || serie.yOrientation === yAxisOrientation.BOTH) { + return true; + } + return serie.yOrientation === orientation; + } }