chartjs-plugin-largedatasets
Version:
Chart.js plugin for large datasets.
10 lines • 4.06 kB
JavaScript
/*
* @license
* chartjs-plugin-largedatasets
* Version: 0.1.0
*
* Copyright 2020 Christopher Beine
* Released under the MIT license
* https://github.com/dudelkuchen/chartjs-plugin-largedatasets/blob/master/LICENSE
*/
!function(t,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("chart.js")):"function"==typeof define&&define.amd?define(["chart.js"],a):t.ChartLargeDatasets=a(t.Chart)}(this,(function(t){"use strict";var a=(t=t&&t.hasOwnProperty("default")?t.default:t).helpers,i={groupSize:1,caculateForCanvasSize:!1,recalculationMode:"none"};class e{constructor(t,a){this.area=t,this.pixelSize=a}groupData(t){var a=new n,i=this.getMinMaxXFromData(t),e=this.getMinMaxYFromData(t);for(let n=t.length-1;n>=0;n--){var s=this.getPixelPositionWidth(t[n].x,i.min,i.max),r=this.getPixelPositionHeight(t[n].y,e.min,e.max);a.add(s,r,t[n],n)}return a.getDictionaryValues()}getPointPercentage(t,a,i){return(t-a)/(i-a)}getPixelPositionWidth(t,a,i){return Math.floor(this.getPointPercentage(t,a,i)*this.area.width/this.pixelSize)}getPixelPositionHeight(t,a,i){return Math.floor(this.getPointPercentage(t,a,i)*this.area.height/this.pixelSize)}getMinMaxXFromData(t){var a={min:t[0].x,max:t[0].x};for(let i=1;i<t.length;i++)a.min>t[i].x?a.min=t[i].x:a.max<t[i].x&&(a.max=t[i].x);return a}getMinMaxYFromData(t){var a={min:t[0].y,max:t[0].y};for(let i=1;i<t.length;i++)a.min>t[i].y?a.min=t[i].y:a.max<t[i].y&&(a.max=t[i].y);return a}}class n{constructor(){this._innerDictionary={}}add(t,a,i,e){this._innerDictionary.hasOwnProperty(t)||(this._innerDictionary[t]={}),this._innerDictionary[t][a]={data:i,index:e}}getDictionaryValues(){var t=[];for(var a in this._innerDictionary)for(var i in this._innerDictionary[a])t.push(this._innerDictionary[a][i]);return t.sort((t,a)=>t.index>a.index?1:-1).map(t=>t.data)}}var s={id:"largeDatasets",_calculated:!1,_canvasSizeTracker:new class{constructor(){this._lastCanvasSize={width:0,height:0},this._currentCanvasSize={width:0,height:0},this._deviation=.05}update(t){this._lastCanvasSize=this._currentCanvasSize,this._currentCanvasSize={width:t.canvas.width,height:t.canvas.height}}hasSizeChanged(t){var a=this._currentCanvasSize.width*this._currentCanvasSize.height,i=this._lastCanvasSize.width*this._lastCanvasSize.height;return a>i*(1+this._deviation)?1:a<i*(1-this._deviation)?-1:0}},_dataCache:[],afterInit:function(t){this._canvasSizeTracker.update(t),this._updateFunction(t)},beforeUpdate:function(t){if(!this._calculated){var a=this._getCalculationRange(t),i=t.data.datasets;if(this._shouldUseCachedData)for(let t=0;t<this._dataCache.length;t++)i[t].data=this._dataCache[t].data;i.forEach(function(i){if(0!==i.data.length){var n=this._getOption(t,"groupSize"),s=new e({width:a.width,height:a.height},n).groupData(i.data);i.data=s}}.bind(this)),this._calculated=!0}},resize:function(t){if(this._canvasSizeTracker.update(t),!this._getOption(t,"caculateForCanvasSize")){var a=this._canvasSizeTracker.hasSizeChanged(t);switch(this._getOption(t,"recalculationMode")){case"resize":this._calculated=0==a;break;case"increase":this._calculated=1!=a;break;case"decrease":this._calculated=-1!=a}}},destroy:function(t){this._calculated=!1},_getCalculationRange:function(t){var a={width:t.canvas.width,height:t.canvas.height},i=this._getOption(t,"caculateForCanvasSize");return i&&(a.width=i.width,a.height=i.height),a},_getOption:function(t,e){return a.getValueOrDefault(t.options.plugins.largeDatasets[e]?t.options.plugins.largeDatasets[e]:void 0,i[e])},_updateFunction:function(t){(this._getOption(t,"saveFullData")||"resize"==this._getOption(t,"recalculationMode")||"increase"==this._getOption(t,"recalculationMode"))&&t.data.datasets.forEach(function(t){this._dataCache.push({data:JSON.parse(JSON.stringify(t.data))})}.bind(this)),this._calculated=!1},_shouldUseCachedData:function(t){return("resize"==this._getOption(t,"recalculationMode")||"increase"==this._getOption(t,"recalculationMode"))&&1==this._canvasSizeTracker.hasSizeChanged(t)&&null!=this._dataCache}};return t.plugins.register(s),s}));