ng2-charts
Advanced tools
Comparing version 2.0.4 to 2.1.0
@@ -21,2 +21,14 @@ (function (global, factory) { | ||
***************************************************************************** */ | ||
var __assign = function () { | ||
__assign = Object.assign || function __assign(t) { | ||
for (var s, i = 1, n = arguments.length; i < n; i++) { | ||
s = arguments[i]; | ||
for (var p in s) | ||
if (Object.prototype.hasOwnProperty.call(s, p)) | ||
t[p] = s[p]; | ||
} | ||
return t; | ||
}; | ||
return __assign.apply(this, arguments); | ||
}; | ||
function __read(o, n) { | ||
@@ -289,3 +301,14 @@ var m = typeof Symbol === "function" && o[Symbol.iterator]; | ||
this.chartHover = new i0.EventEmitter(); | ||
this.initFlag = false; | ||
this.old = { | ||
dataExists: false, | ||
dataLength: 0, | ||
datasetsExists: false, | ||
datasetsLength: 0, | ||
datasetsDataObjects: [], | ||
datasetsDataLengths: [], | ||
colorsExists: false, | ||
colors: [], | ||
labelsExist: false, | ||
labels: [], | ||
}; | ||
this.subs = []; | ||
@@ -329,6 +352,3 @@ } | ||
this.ctx = this.element.nativeElement.getContext('2d'); | ||
this.initFlag = true; | ||
if (this.data || this.datasets) { | ||
this.refresh(); | ||
} | ||
this.refresh(); | ||
this.subs.push(this.themeService.colorschemesOptions.subscribe(( /** | ||
@@ -353,2 +373,229 @@ * @param {?} r | ||
/** | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.ngDoCheck = /** | ||
* @return {?} | ||
*/ | ||
function () { | ||
var _this = this; | ||
if (!this.chart) { | ||
return; | ||
} | ||
/** @type {?} */ | ||
var updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
var wantUpdate = ( /** | ||
* @param {?} x | ||
* @return {?} | ||
*/function (x) { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
if (!!this.data !== this.old.dataExists) { | ||
this.propagateDataToDatasets(this.data); | ||
this.old.dataExists = !!this.data; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.data && this.data.length !== this.old.dataLength) { | ||
this.old.dataLength = this.data && this.data.length || 0; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.datasets !== this.old.datasetsExists) { | ||
this.old.datasetsExists = !!this.datasets; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.length !== this.old.datasetsLength) { | ||
this.old.datasetsLength = this.datasets && this.datasets.length || 0; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.filter(( /** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/function (x, i) { return x.data !== _this.old.datasetsDataObjects[i]; })).length) { | ||
this.old.datasetsDataObjects = this.datasets.map(( /** | ||
* @param {?} x | ||
* @return {?} | ||
*/function (x) { return x.data; })); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.filter(( /** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/function (x, i) { return x.data.length !== _this.old.datasetsDataLengths[i]; })).length) { | ||
this.old.datasetsDataLengths = this.datasets.map(( /** | ||
* @param {?} x | ||
* @return {?} | ||
*/function (x) { return x.data.length; })); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.colors !== this.old.colorsExists) { | ||
this.old.colorsExists = !!this.colors; | ||
this.updateColors(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
// This smells of inefficiency, might need to revisit this | ||
if (this.colors && this.colors.filter(( /** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/function (x, i) { return !_this.colorsEqual(x, _this.old.colors[i]); })).length) { | ||
this.old.colors = this.colors.map(( /** | ||
* @param {?} x | ||
* @return {?} | ||
*/function (x) { return _this.copyColor(x); })); | ||
this.updateColors(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.labels !== this.old.labelsExist) { | ||
this.old.labelsExist = !!this.labels; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.labels && this.labels.filter(( /** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/function (x, i) { return !_this.labelsEqual(x, _this.old.labels[i]); })).length) { | ||
this.old.labels = this.labels.map(( /** | ||
* @param {?} x | ||
* @return {?} | ||
*/function (x) { return _this.copyLabel(x); })); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
switch (( /** @type {?} */(updateRequired))) { | ||
case UpdateType.Default: | ||
break; | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
this.refresh(); | ||
break; | ||
} | ||
}; | ||
/** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.copyLabel = /** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
function (a) { | ||
if (Array.isArray(a)) { | ||
return __spread(a); | ||
} | ||
return a; | ||
}; | ||
/** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.labelsEqual = /** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
function (a, b) { | ||
return Array.isArray(a) === Array.isArray(b) | ||
&& (Array.isArray(a) || a === b) | ||
&& (!Array.isArray(a) || a.length === b.length) | ||
&& (!Array.isArray(a) || a.filter(( /** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/function (x, i) { return x !== b[i]; })).length === 0); | ||
}; | ||
/** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.copyColor = /** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
function (a) { | ||
/** @type {?} */ | ||
var rc = { | ||
backgroundColor: a.backgroundColor, | ||
borderWidth: a.borderWidth, | ||
borderColor: a.borderColor, | ||
borderCapStyle: a.borderCapStyle, | ||
borderDash: a.borderDash, | ||
borderDashOffset: a.borderDashOffset, | ||
borderJoinStyle: a.borderJoinStyle, | ||
pointBorderColor: a.pointBorderColor, | ||
pointBackgroundColor: a.pointBackgroundColor, | ||
pointBorderWidth: a.pointBorderWidth, | ||
pointRadius: a.pointRadius, | ||
pointHoverRadius: a.pointHoverRadius, | ||
pointHitRadius: a.pointHitRadius, | ||
pointHoverBackgroundColor: a.pointHoverBackgroundColor, | ||
pointHoverBorderColor: a.pointHoverBorderColor, | ||
pointHoverBorderWidth: a.pointHoverBorderWidth, | ||
pointStyle: a.pointStyle, | ||
hoverBackgroundColor: a.hoverBackgroundColor, | ||
hoverBorderColor: a.hoverBorderColor, | ||
hoverBorderWidth: a.hoverBorderWidth, | ||
}; | ||
return rc; | ||
}; | ||
/** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.colorsEqual = /** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
function (a, b) { | ||
if (!a !== !b) { | ||
return false; | ||
} | ||
return !a || a.backgroundColor === b.backgroundColor | ||
&& (a.borderWidth === b.borderWidth) | ||
&& (a.borderColor === b.borderColor) | ||
&& (a.borderCapStyle === b.borderCapStyle) | ||
&& (a.borderDash === b.borderDash) | ||
&& (a.borderDashOffset === b.borderDashOffset) | ||
&& (a.borderJoinStyle === b.borderJoinStyle) | ||
&& (a.pointBorderColor === b.pointBorderColor) | ||
&& (a.pointBackgroundColor === b.pointBackgroundColor) | ||
&& (a.pointBorderWidth === b.pointBorderWidth) | ||
&& (a.pointRadius === b.pointRadius) | ||
&& (a.pointHoverRadius === b.pointHoverRadius) | ||
&& (a.pointHitRadius === b.pointHitRadius) | ||
&& (a.pointHoverBackgroundColor === b.pointHoverBackgroundColor) | ||
&& (a.pointHoverBorderColor === b.pointHoverBorderColor) | ||
&& (a.pointHoverBorderWidth === b.pointHoverBorderWidth) | ||
&& (a.pointStyle === b.pointStyle) | ||
&& (a.hoverBackgroundColor === b.hoverBackgroundColor) | ||
&& (a.hoverBorderColor === b.hoverBorderColor) | ||
&& (a.hoverBorderWidth === b.hoverBorderWidth); | ||
}; | ||
/** | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.updateColors = /** | ||
* @return {?} | ||
*/ | ||
function () { | ||
var _this = this; | ||
this.datasets.forEach(( /** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/function (elm, index) { | ||
if (_this.colors && _this.colors[index]) { | ||
Object.assign(elm, _this.colors[index]); | ||
} | ||
else { | ||
Object.assign(elm, getColors(_this.chartType, index, elm.data.length), __assign({}, elm)); | ||
} | ||
})); | ||
}; | ||
/** | ||
* @param {?} changes | ||
@@ -362,44 +609,45 @@ * @return {?} | ||
function (changes) { | ||
if (this.initFlag) { | ||
/** @type {?} */ | ||
var updateRequired_1 = UpdateType.Default; | ||
/** @type {?} */ | ||
var wantUpdate = ( /** | ||
* @param {?} x | ||
* @return {?} | ||
*/function (x) { | ||
updateRequired_1 = x > updateRequired_1 ? x : updateRequired_1; | ||
}); | ||
// Check if the changes are in the data or datasets or labels or legend | ||
if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) { | ||
if (changes.data) { | ||
this.updateChartData(changes.data.currentValue); | ||
} | ||
else { | ||
this.updateChartData(changes.datasets.currentValue); | ||
} | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('labels')) { | ||
/** @type {?} */ | ||
var updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
var wantUpdate = ( /** | ||
* @param {?} x | ||
* @return {?} | ||
*/function (x) { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
// Check if the changes are in the data or datasets or labels or legend | ||
if (changes.hasOwnProperty('data') && changes.data.currentValue) { | ||
this.propagateDataToDatasets(changes.data.currentValue); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('datasets') && changes.datasets.currentValue) { | ||
this.propagateDatasetsToData(changes.datasets.currentValue); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('labels')) { | ||
if (this.chart) { | ||
this.chart.data.labels = changes.labels.currentValue; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('legend')) { | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('legend')) { | ||
if (this.chart) { | ||
this.chart.config.options.legend.display = changes.legend.currentValue; | ||
this.chart.generateLegend(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('options')) { | ||
wantUpdate(UpdateType.Refresh); | ||
} | ||
switch (( /** @type {?} */(updateRequired_1))) { | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
case UpdateType.Default: | ||
this.refresh(); | ||
break; | ||
} | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('options')) { | ||
wantUpdate(UpdateType.Refresh); | ||
} | ||
switch (( /** @type {?} */(updateRequired))) { | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
case UpdateType.Default: | ||
this.refresh(); | ||
break; | ||
} | ||
}; | ||
@@ -433,3 +681,5 @@ /** | ||
function (duration, lazy) { | ||
return this.chart.update(duration, lazy); | ||
if (this.chart) { | ||
return this.chart.update(duration, lazy); | ||
} | ||
}; | ||
@@ -471,10 +721,8 @@ /** | ||
/** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.getChartBuilder = /** | ||
* @param {?} ctx | ||
BaseChartDirective.prototype.getChartConfiguration = /** | ||
* @return {?} | ||
*/ | ||
function (ctx /*, data:any[], options:any*/) { | ||
function () { | ||
var _this = this; | ||
@@ -517,3 +765,3 @@ /** @type {?} */ | ||
data: { | ||
labels: this.labels, | ||
labels: this.labels || [], | ||
datasets: datasets | ||
@@ -524,2 +772,15 @@ }, | ||
}; | ||
return chartConfig; | ||
}; | ||
/** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.getChartBuilder = /** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
function (ctx /*, data:any[], options:any*/) { | ||
/** @type {?} */ | ||
var chartConfig = this.getChartConfiguration(); | ||
return new chartJs.Chart(ctx, chartConfig); | ||
@@ -581,17 +842,2 @@ }; | ||
* @private | ||
* @param {?} v | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.isChartDataSetsArray = /** | ||
* @private | ||
* @param {?} v | ||
* @return {?} | ||
*/ | ||
function (v) { | ||
/** @type {?} */ | ||
var elm = v[0]; | ||
return (typeof (elm) === 'object') && 'data' in elm; | ||
}; | ||
/** | ||
* @private | ||
* @param {?} label | ||
@@ -631,6 +877,26 @@ * @return {?} | ||
* @private | ||
* @param {?} datasets | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.propagateDatasetsToData = /** | ||
* @private | ||
* @param {?} datasets | ||
* @return {?} | ||
*/ | ||
function (datasets) { | ||
this.data = this.datasets.map(( /** | ||
* @param {?} r | ||
* @return {?} | ||
*/function (r) { return r.data; })); | ||
if (this.chart) { | ||
this.chart.data.datasets = datasets; | ||
} | ||
this.updateColors(); | ||
}; | ||
/** | ||
* @private | ||
* @param {?} newDataValues | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.updateChartData = /** | ||
BaseChartDirective.prototype.propagateDataToDatasets = /** | ||
* @private | ||
@@ -642,5 +908,5 @@ * @param {?} newDataValues | ||
var _this = this; | ||
if (this.isChartDataSetsArray(newDataValues)) { | ||
if (newDataValues.length === this.chart.data.datasets.length) { | ||
this.chart.data.datasets.forEach(( /** | ||
if (this.isMultiDataSet(newDataValues)) { | ||
if (this.datasets && newDataValues.length === this.datasets.length) { | ||
this.datasets.forEach(( /** | ||
* @param {?} dataset | ||
@@ -650,19 +916,2 @@ * @param {?} i | ||
*/function (dataset, i) { | ||
dataset.data = newDataValues[i].data; | ||
if (newDataValues[i].label) { | ||
dataset.label = newDataValues[i].label; | ||
} | ||
})); | ||
} | ||
else { | ||
this.chart.data.datasets = __spread(newDataValues); | ||
} | ||
} | ||
else if (!this.isSingleDataSet(newDataValues)) { | ||
if (newDataValues.length === this.chart.data.datasets.length) { | ||
this.chart.data.datasets.forEach(( /** | ||
* @param {?} dataset | ||
* @param {?} i | ||
* @return {?} | ||
*/function (dataset, i) { | ||
dataset.data = newDataValues[i]; | ||
@@ -672,3 +921,3 @@ })); | ||
else { | ||
this.chart.data.datasets = newDataValues.map(( /** | ||
this.datasets = newDataValues.map(( /** | ||
* @param {?} data | ||
@@ -680,19 +929,20 @@ * @param {?} index | ||
})); | ||
if (this.chart) { | ||
this.chart.data.datasets = this.datasets; | ||
} | ||
} | ||
} | ||
else { | ||
this.chart.data.datasets[0].data = newDataValues; | ||
} | ||
this.chart.data.datasets.forEach(( /** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/function (elm, index) { | ||
if (_this.colors && _this.colors[index]) { | ||
Object.assign(elm, _this.colors[index]); | ||
if (!this.datasets) { | ||
this.datasets = [{ data: newDataValues }]; | ||
if (this.chart) { | ||
this.chart.data.datasets = this.datasets; | ||
} | ||
} | ||
else { | ||
Object.assign(elm, getColors(_this.chartType, index, elm.data.length)); | ||
this.datasets[0].data = newDataValues; | ||
this.datasets.splice(1); // Remove all elements but the first | ||
} | ||
})); | ||
} | ||
this.updateColors(); | ||
}; | ||
@@ -704,3 +954,3 @@ /** | ||
*/ | ||
BaseChartDirective.prototype.isSingleDataSet = /** | ||
BaseChartDirective.prototype.isMultiDataSet = /** | ||
* @private | ||
@@ -711,3 +961,3 @@ * @param {?} data | ||
function (data) { | ||
return !Array.isArray(data[0]); | ||
return Array.isArray(data[0]); | ||
}; | ||
@@ -723,43 +973,14 @@ /** | ||
function () { | ||
var _this = this; | ||
/** @type {?} */ | ||
var datasets = void 0; | ||
// in case if datasets is not provided, but data is present | ||
if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) { | ||
if (!this.isSingleDataSet(this.data)) { | ||
datasets = this.data.map(( /** | ||
* @param {?} data | ||
* @param {?} index | ||
* @return {?} | ||
*/function (data, index) { | ||
return { data: data, label: _this.joinLabel(_this.labels[index]) || "Label " + index }; | ||
})); | ||
} | ||
else { | ||
datasets = [{ data: this.data, label: "Label 0" }]; | ||
} | ||
if (!this.datasets && !this.data) { | ||
throw new Error("ng-charts configuration error, data or datasets field are required to render chart " + this.chartType); | ||
} | ||
if (this.datasets && this.datasets.length || | ||
(datasets && datasets.length)) { | ||
datasets = (this.datasets || datasets) | ||
.map(( /** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/function (elm, index) { | ||
/** @type {?} */ | ||
var newElm = Object.assign({}, elm); | ||
if (_this.colors && _this.colors.length) { | ||
Object.assign(newElm, _this.colors[index]); | ||
} | ||
else { | ||
Object.assign(newElm, getColors(_this.chartType, index, newElm.data.length)); | ||
} | ||
return newElm; | ||
})); | ||
// If `datasets` is defined, use it over the `data` property. | ||
if (this.datasets) { | ||
this.propagateDatasetsToData(this.datasets); | ||
return this.datasets; | ||
} | ||
if (!datasets) { | ||
throw new Error("ng-charts configuration error,\n data or datasets field are required to render chart " + this.chartType); | ||
if (this.data) { | ||
this.propagateDataToDatasets(this.data); | ||
return this.datasets; | ||
} | ||
return datasets; | ||
}; | ||
@@ -783,3 +1004,5 @@ /** | ||
} | ||
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/); | ||
if (this.ctx) { | ||
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/); | ||
} | ||
}; | ||
@@ -786,0 +1009,0 @@ BaseChartDirective.decorators = [ |
@@ -1,2 +0,2 @@ | ||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("chart.js"),require("@angular/core"),require("rxjs"),require("lodash")):"function"==typeof define&&define.amd?define("ng2-charts",["exports","chart.js","@angular/core","rxjs","lodash"],e):e(t["ng2-charts"]={},t.chart_js,t.ng.core,t.rxjs,t._)}(this,function(t,i,r,e,s){"use strict";function o(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var a,n,o=r.call(t),i=[];try{for(;(void 0===e||0<e--)&&!(a=o.next()).done;)i.push(a.value)}catch(s){n={error:s}}finally{try{a&&!a.done&&(r=o["return"])&&r.call(o)}finally{if(n)throw n.error}}return i}var a=[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]];function c(t,e,r){if("pie"===t||"doughnut"===t)return u(d(r));if("polarArea"===t)return function a(t){return{backgroundColor:t.map(function(t){return h(t,.6)}),borderColor:t.map(function(t){return h(t,1)}),hoverBackgroundColor:t.map(function(t){return h(t,.8)}),hoverBorderColor:t.map(function(t){return h(t,1)})}}(d(r));if("line"===t||"radar"===t)return function n(t){return{backgroundColor:h(t,.4),borderColor:h(t,1),pointBackgroundColor:h(t,1),pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:h(t,.8)}}(p(e));if("bar"===t||"horizontalBar"===t)return function o(t){return{backgroundColor:h(t,.6),borderColor:h(t,1),hoverBackgroundColor:h(t,.8),hoverBorderColor:h(t,1)}}(p(e));if("bubble"===t)return u(d(r));if("scatter"===t)return u(d(r));throw new Error("getColors - Unsupported chart type "+t)}function h(t,e){return"rgba("+t.concat(e).join(",")+")"}function n(t,e){return Math.floor(Math.random()*(e-t+1))+t}function u(t){return{backgroundColor:t.map(function(t){return h(t,.6)}),borderColor:t.map(function(){return"#fff"}),pointBackgroundColor:t.map(function(t){return h(t,1)}),pointBorderColor:t.map(function(){return"#fff"}),pointHoverBackgroundColor:t.map(function(t){return h(t,1)}),pointHoverBorderColor:t.map(function(t){return h(t,1)})}}function l(){return[n(0,255),n(0,255),n(0,255)]}function p(t){return a[t]||l()}function d(t){for(var e=new Array(t),r=0;r<t;r++)e[r]=a[r]||l();return e}var f=function(){function t(){this.pColorschemesOptions={},this.colorschemesOptions=new e.BehaviorSubject({})}return t.prototype.setColorschemesOptions=function(t){this.pColorschemesOptions=t,this.colorschemesOptions.next(t)},t.prototype.getColorschemesOptions=function(){return this.pColorschemesOptions},t.decorators=[{type:r.Injectable,args:[{providedIn:"root"}]}],t.ctorParameters=function(){return[]},t.ngInjectableDef=r.defineInjectable({factory:function(){return new t},token:t,providedIn:"root"}),t}(),g={Default:0,Update:1,Refresh:2};g[g.Default]="Default",g[g.Update]="Update",g[g.Refresh]="Refresh";var y=function(){function t(t,e){this.element=t,this.themeService=e,this.options={},this.chartClick=new r.EventEmitter,this.chartHover=new r.EventEmitter,this.initFlag=!1,this.subs=[]}return t.registerPlugin=function(t){i.Chart.plugins.register(t)},t.unregisterPlugin=function(t){i.Chart.plugins.unregister(t)},t.prototype.ngOnInit=function(){var e=this;this.ctx=this.element.nativeElement.getContext("2d"),this.initFlag=!0,(this.data||this.datasets)&&this.refresh(),this.subs.push(this.themeService.colorschemesOptions.subscribe(function(t){return e.themeChanged(t)}))},t.prototype.themeChanged=function(t){this.refresh()},t.prototype.ngOnChanges=function(t){if(this.initFlag){var e=g.Default,r=function(t){e=e<t?t:e};switch((t.hasOwnProperty("data")||t.hasOwnProperty("datasets"))&&(t.data?this.updateChartData(t.data.currentValue):this.updateChartData(t.datasets.currentValue),r(g.Update)),t.hasOwnProperty("labels")&&(this.chart.data.labels=t.labels.currentValue,r(g.Update)),t.hasOwnProperty("legend")&&(this.chart.config.options.legend.display=t.legend.currentValue,this.chart.generateLegend(),r(g.Update)),t.hasOwnProperty("options")&&r(g.Refresh),e){case g.Update:this.update();break;case g.Refresh:case g.Default:this.refresh()}}},t.prototype.ngOnDestroy=function(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.subs.forEach(function(t){return t.unsubscribe()})},t.prototype.update=function(t,e){return this.chart.update(t,e)},t.prototype.hideDataset=function(t,e){this.chart.getDatasetMeta(t).hidden=e,this.chart.update()},t.prototype.isDatasetHidden=function(t){return this.chart.getDatasetMeta(t).hidden},t.prototype.toBase64Image=function(){return this.chart.toBase64Image()},t.prototype.getChartBuilder=function(t){var r=this,e=this.getDatasets(),a=Object.assign({},this.options);!1===this.legend&&(a.legend={display:!1}),a.hover=a.hover||{},a.hover.onHover||(a.hover.onHover=function(t,e){e&&!e.length||r.chartHover.emit({event:t,active:e})}),a.onClick||(a.onClick=function(t,e){r.chartClick.emit({event:t,active:e})});var n=this.smartMerge(a,this.themeService.getColorschemesOptions()),o={type:this.chartType,data:{labels:this.labels,datasets:e},plugins:this.plugins,options:n};return new i.Chart(t,o)},t.prototype.smartMerge=function(r,a,n){var o=this;if(void 0===n&&(n=0),0===n&&(r=s.cloneDeep(r)),Object.keys(a).forEach(function(e){if(Array.isArray(a[e])){var t=r[e];t&&t.forEach(function(t){o.smartMerge(t,a[e][0],n+1)})}else"object"==typeof a[e]?(e in r||(r[e]={}),o.smartMerge(r[e],a[e],n+1)):r[e]=a[e]}),0===n)return r},t.prototype.isChartDataSetsArray=function(t){var e=t[0];return"object"==typeof e&&"data"in e},t.prototype.isMultiLineLabel=function(t){return Array.isArray(t)},t.prototype.joinLabel=function(t){return t?this.isMultiLineLabel(t)?t.join(" "):t:null},t.prototype.updateChartData=function(r){var a=this;this.isChartDataSetsArray(r)?r.length===this.chart.data.datasets.length?this.chart.data.datasets.forEach(function(t,e){t.data=r[e].data,r[e].label&&(t.label=r[e].label)}):this.chart.data.datasets=function n(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(o(arguments[e]));return t}(r):this.isSingleDataSet(r)?this.chart.data.datasets[0].data=r:r.length===this.chart.data.datasets.length?this.chart.data.datasets.forEach(function(t,e){t.data=r[e]}):this.chart.data.datasets=r.map(function(t,e){return{data:t,label:a.joinLabel(a.labels[e])||"Label "+e}}),this.chart.data.datasets.forEach(function(t,e){a.colors&&a.colors[e]?Object.assign(t,a.colors[e]):Object.assign(t,c(a.chartType,e,t.data.length))})},t.prototype.isSingleDataSet=function(t){return!Array.isArray(t[0])},t.prototype.getDatasets=function(){var a=this,t=void 0;if((!this.datasets||!this.datasets.length&&this.data&&this.data.length)&&(t=this.isSingleDataSet(this.data)?[{data:this.data,label:"Label 0"}]:this.data.map(function(t,e){return{data:t,label:a.joinLabel(a.labels[e])||"Label "+e}})),(this.datasets&&this.datasets.length||t&&t.length)&&(t=(this.datasets||t).map(function(t,e){var r=Object.assign({},t);return a.colors&&a.colors.length?Object.assign(r,a.colors[e]):Object.assign(r,c(a.chartType,e,r.data.length)),r})),!t)throw new Error("ng-charts configuration error,\n data or datasets field are required to render chart "+this.chartType);return t},t.prototype.refresh=function(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.chart=this.getChartBuilder(this.ctx)},t.decorators=[{type:r.Directive,args:[{selector:"canvas[baseChart]",exportAs:"base-chart"}]}],t.ctorParameters=function(){return[{type:r.ElementRef},{type:f}]},t.propDecorators={data:[{type:r.Input}],datasets:[{type:r.Input}],labels:[{type:r.Input}],options:[{type:r.Input}],chartType:[{type:r.Input}],colors:[{type:r.Input}],legend:[{type:r.Input}],plugins:[{type:r.Input}],chartClick:[{type:r.Output}],chartHover:[{type:r.Output}]},t}(),b=function(){function t(){}return t.decorators=[{type:r.NgModule,args:[{declarations:[y],imports:[],exports:[y]}]}],t}();t.ChartsModule=b,t.BaseChartDirective=y,t.defaultColors=a,t.ThemeService=f,Object.defineProperty(t,"__esModule",{value:!0})}); | ||
!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("chart.js"),require("@angular/core"),require("rxjs"),require("lodash")):"function"==typeof define&&define.amd?define("ng2-charts",["exports","chart.js","@angular/core","rxjs","lodash"],r):r(t["ng2-charts"]={},t.chart_js,t.ng.core,t.rxjs,t._)}(this,function(t,e,o,r,n){"use strict";var a=function(){return(a=Object.assign||function(t){for(var r,e=1,o=arguments.length;e<o;e++)for(var a in r=arguments[e])Object.prototype.hasOwnProperty.call(r,a)&&(t[a]=r[a]);return t}).apply(this,arguments)};function s(t,r){var e="function"==typeof Symbol&&t[Symbol.iterator];if(!e)return t;var o,a,s=e.call(t),n=[];try{for(;(void 0===r||0<r--)&&!(o=s.next()).done;)n.push(o.value)}catch(i){a={error:i}}finally{try{o&&!o.done&&(e=s["return"])&&e.call(s)}finally{if(a)throw a.error}}return n}var i=[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]];function h(t,r,e){if("pie"===t||"doughnut"===t)return l(f(e));if("polarArea"===t)return function o(t){return{backgroundColor:t.map(function(t){return d(t,.6)}),borderColor:t.map(function(t){return d(t,1)}),hoverBackgroundColor:t.map(function(t){return d(t,.8)}),hoverBorderColor:t.map(function(t){return d(t,1)})}}(f(e));if("line"===t||"radar"===t)return function a(t){return{backgroundColor:d(t,.4),borderColor:d(t,1),pointBackgroundColor:d(t,1),pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:d(t,.8)}}(p(r));if("bar"===t||"horizontalBar"===t)return function s(t){return{backgroundColor:d(t,.6),borderColor:d(t,1),hoverBackgroundColor:d(t,.8),hoverBorderColor:d(t,1)}}(p(r));if("bubble"===t)return l(f(e));if("scatter"===t)return l(f(e));throw new Error("getColors - Unsupported chart type "+t)}function d(t,r){return"rgba("+t.concat(r).join(",")+")"}function u(t,r){return Math.floor(Math.random()*(r-t+1))+t}function l(t){return{backgroundColor:t.map(function(t){return d(t,.6)}),borderColor:t.map(function(){return"#fff"}),pointBackgroundColor:t.map(function(t){return d(t,1)}),pointBorderColor:t.map(function(){return"#fff"}),pointHoverBackgroundColor:t.map(function(t){return d(t,1)}),pointHoverBorderColor:t.map(function(t){return d(t,1)})}}function c(){return[u(0,255),u(0,255),u(0,255)]}function p(t){return i[t]||c()}function f(t){for(var r=new Array(t),e=0;e<t;e++)r[e]=i[e]||c();return r}var g=function(){function t(){this.pColorschemesOptions={},this.colorschemesOptions=new r.BehaviorSubject({})}return t.prototype.setColorschemesOptions=function(t){this.pColorschemesOptions=t,this.colorschemesOptions.next(t)},t.prototype.getColorschemesOptions=function(){return this.pColorschemesOptions},t.decorators=[{type:o.Injectable,args:[{providedIn:"root"}]}],t.ctorParameters=function(){return[]},t.ngInjectableDef=o.defineInjectable({factory:function(){return new t},token:t,providedIn:"root"}),t}(),y={Default:0,Update:1,Refresh:2};y[y.Default]="Default",y[y.Update]="Update",y[y.Refresh]="Refresh";var b=function(){function t(t,r){this.element=t,this.themeService=r,this.options={},this.chartClick=new o.EventEmitter,this.chartHover=new o.EventEmitter,this.old={dataExists:!1,dataLength:0,datasetsExists:!1,datasetsLength:0,datasetsDataObjects:[],datasetsDataLengths:[],colorsExists:!1,colors:[],labelsExist:!1,labels:[]},this.subs=[]}return t.registerPlugin=function(t){e.Chart.plugins.register(t)},t.unregisterPlugin=function(t){e.Chart.plugins.unregister(t)},t.prototype.ngOnInit=function(){var r=this;this.ctx=this.element.nativeElement.getContext("2d"),this.refresh(),this.subs.push(this.themeService.colorschemesOptions.subscribe(function(t){return r.themeChanged(t)}))},t.prototype.themeChanged=function(t){this.refresh()},t.prototype.ngDoCheck=function(){var e=this;if(this.chart){var r=y.Default,t=function(t){r=r<t?t:r};switch(!!this.data!==this.old.dataExists&&(this.propagateDataToDatasets(this.data),this.old.dataExists=!!this.data,t(y.Update)),this.data&&this.data.length!==this.old.dataLength&&(this.old.dataLength=this.data&&this.data.length||0,t(y.Update)),!!this.datasets!==this.old.datasetsExists&&(this.old.datasetsExists=!!this.datasets,t(y.Update)),this.datasets&&this.datasets.length!==this.old.datasetsLength&&(this.old.datasetsLength=this.datasets&&this.datasets.length||0,t(y.Update)),this.datasets&&this.datasets.filter(function(t,r){return t.data!==e.old.datasetsDataObjects[r]}).length&&(this.old.datasetsDataObjects=this.datasets.map(function(t){return t.data}),t(y.Update)),this.datasets&&this.datasets.filter(function(t,r){return t.data.length!==e.old.datasetsDataLengths[r]}).length&&(this.old.datasetsDataLengths=this.datasets.map(function(t){return t.data.length}),t(y.Update)),!!this.colors!==this.old.colorsExists&&(this.old.colorsExists=!!this.colors,this.updateColors(),t(y.Update)),this.colors&&this.colors.filter(function(t,r){return!e.colorsEqual(t,e.old.colors[r])}).length&&(this.old.colors=this.colors.map(function(t){return e.copyColor(t)}),this.updateColors(),t(y.Update)),!!this.labels!==this.old.labelsExist&&(this.old.labelsExist=!!this.labels,t(y.Update)),this.labels&&this.labels.filter(function(t,r){return!e.labelsEqual(t,e.old.labels[r])}).length&&(this.old.labels=this.labels.map(function(t){return e.copyLabel(t)}),t(y.Update)),r){case y.Default:break;case y.Update:this.update();break;case y.Refresh:this.refresh()}}},t.prototype.copyLabel=function(t){return Array.isArray(t)?function e(){for(var t=[],r=0;r<arguments.length;r++)t=t.concat(s(arguments[r]));return t}(t):t},t.prototype.labelsEqual=function(t,e){return Array.isArray(t)===Array.isArray(e)&&(Array.isArray(t)||t===e)&&(!Array.isArray(t)||t.length===e.length)&&(!Array.isArray(t)||0===t.filter(function(t,r){return t!==e[r]}).length)},t.prototype.copyColor=function(t){return{backgroundColor:t.backgroundColor,borderWidth:t.borderWidth,borderColor:t.borderColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,pointBorderColor:t.pointBorderColor,pointBackgroundColor:t.pointBackgroundColor,pointBorderWidth:t.pointBorderWidth,pointRadius:t.pointRadius,pointHoverRadius:t.pointHoverRadius,pointHitRadius:t.pointHitRadius,pointHoverBackgroundColor:t.pointHoverBackgroundColor,pointHoverBorderColor:t.pointHoverBorderColor,pointHoverBorderWidth:t.pointHoverBorderWidth,pointStyle:t.pointStyle,hoverBackgroundColor:t.hoverBackgroundColor,hoverBorderColor:t.hoverBorderColor,hoverBorderWidth:t.hoverBorderWidth}},t.prototype.colorsEqual=function(t,r){return!t==!r&&(!t||t.backgroundColor===r.backgroundColor&&t.borderWidth===r.borderWidth&&t.borderColor===r.borderColor&&t.borderCapStyle===r.borderCapStyle&&t.borderDash===r.borderDash&&t.borderDashOffset===r.borderDashOffset&&t.borderJoinStyle===r.borderJoinStyle&&t.pointBorderColor===r.pointBorderColor&&t.pointBackgroundColor===r.pointBackgroundColor&&t.pointBorderWidth===r.pointBorderWidth&&t.pointRadius===r.pointRadius&&t.pointHoverRadius===r.pointHoverRadius&&t.pointHitRadius===r.pointHitRadius&&t.pointHoverBackgroundColor===r.pointHoverBackgroundColor&&t.pointHoverBorderColor===r.pointHoverBorderColor&&t.pointHoverBorderWidth===r.pointHoverBorderWidth&&t.pointStyle===r.pointStyle&&t.hoverBackgroundColor===r.hoverBackgroundColor&&t.hoverBorderColor===r.hoverBorderColor&&t.hoverBorderWidth===r.hoverBorderWidth)},t.prototype.updateColors=function(){var e=this;this.datasets.forEach(function(t,r){e.colors&&e.colors[r]?Object.assign(t,e.colors[r]):Object.assign(t,h(e.chartType,r,t.data.length),a({},t))})},t.prototype.ngOnChanges=function(t){var r=y.Default,e=function(t){r=r<t?t:r};switch(t.hasOwnProperty("data")&&t.data.currentValue&&(this.propagateDataToDatasets(t.data.currentValue),e(y.Update)),t.hasOwnProperty("datasets")&&t.datasets.currentValue&&(this.propagateDatasetsToData(t.datasets.currentValue),e(y.Update)),t.hasOwnProperty("labels")&&(this.chart&&(this.chart.data.labels=t.labels.currentValue),e(y.Update)),t.hasOwnProperty("legend")&&(this.chart&&(this.chart.config.options.legend.display=t.legend.currentValue,this.chart.generateLegend()),e(y.Update)),t.hasOwnProperty("options")&&e(y.Refresh),r){case y.Update:this.update();break;case y.Refresh:case y.Default:this.refresh()}},t.prototype.ngOnDestroy=function(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.subs.forEach(function(t){return t.unsubscribe()})},t.prototype.update=function(t,r){if(this.chart)return this.chart.update(t,r)},t.prototype.hideDataset=function(t,r){this.chart.getDatasetMeta(t).hidden=r,this.chart.update()},t.prototype.isDatasetHidden=function(t){return this.chart.getDatasetMeta(t).hidden},t.prototype.toBase64Image=function(){return this.chart.toBase64Image()},t.prototype.getChartConfiguration=function(){var e=this,t=this.getDatasets(),r=Object.assign({},this.options);!1===this.legend&&(r.legend={display:!1}),r.hover=r.hover||{},r.hover.onHover||(r.hover.onHover=function(t,r){r&&!r.length||e.chartHover.emit({event:t,active:r})}),r.onClick||(r.onClick=function(t,r){e.chartClick.emit({event:t,active:r})});var o=this.smartMerge(r,this.themeService.getColorschemesOptions());return{type:this.chartType,data:{labels:this.labels||[],datasets:t},plugins:this.plugins,options:o}},t.prototype.getChartBuilder=function(t){var r=this.getChartConfiguration();return new e.Chart(t,r)},t.prototype.smartMerge=function(e,o,a){var s=this;if(void 0===a&&(a=0),0===a&&(e=n.cloneDeep(e)),Object.keys(o).forEach(function(r){if(Array.isArray(o[r])){var t=e[r];t&&t.forEach(function(t){s.smartMerge(t,o[r][0],a+1)})}else"object"==typeof o[r]?(r in e||(e[r]={}),s.smartMerge(e[r],o[r],a+1)):e[r]=o[r]}),0===a)return e},t.prototype.isMultiLineLabel=function(t){return Array.isArray(t)},t.prototype.joinLabel=function(t){return t?this.isMultiLineLabel(t)?t.join(" "):t:null},t.prototype.propagateDatasetsToData=function(t){this.data=this.datasets.map(function(t){return t.data}),this.chart&&(this.chart.data.datasets=t),this.updateColors()},t.prototype.propagateDataToDatasets=function(e){var o=this;this.isMultiDataSet(e)?this.datasets&&e.length===this.datasets.length?this.datasets.forEach(function(t,r){t.data=e[r]}):(this.datasets=e.map(function(t,r){return{data:t,label:o.joinLabel(o.labels[r])||"Label "+r}}),this.chart&&(this.chart.data.datasets=this.datasets)):this.datasets?(this.datasets[0].data=e,this.datasets.splice(1)):(this.datasets=[{data:e}],this.chart&&(this.chart.data.datasets=this.datasets)),this.updateColors()},t.prototype.isMultiDataSet=function(t){return Array.isArray(t[0])},t.prototype.getDatasets=function(){if(!this.datasets&&!this.data)throw new Error("ng-charts configuration error, data or datasets field are required to render chart "+this.chartType);return this.datasets?(this.propagateDatasetsToData(this.datasets),this.datasets):this.data?(this.propagateDataToDatasets(this.data),this.datasets):void 0},t.prototype.refresh=function(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.ctx&&(this.chart=this.getChartBuilder(this.ctx))},t.decorators=[{type:o.Directive,args:[{selector:"canvas[baseChart]",exportAs:"base-chart"}]}],t.ctorParameters=function(){return[{type:o.ElementRef},{type:g}]},t.propDecorators={data:[{type:o.Input}],datasets:[{type:o.Input}],labels:[{type:o.Input}],options:[{type:o.Input}],chartType:[{type:o.Input}],colors:[{type:o.Input}],legend:[{type:o.Input}],plugins:[{type:o.Input}],chartClick:[{type:o.Output}],chartHover:[{type:o.Output}]},t}(),C=function(){function t(){}return t.decorators=[{type:o.NgModule,args:[{declarations:[b],imports:[],exports:[b]}]}],t}();t.ChartsModule=C,t.BaseChartDirective=b,t.defaultColors=i,t.ThemeService=g,Object.defineProperty(t,"__esModule",{value:!0})}); | ||
//# sourceMappingURL=ng2-charts.umd.min.js.map |
@@ -10,2 +10,28 @@ /** | ||
import * as _ from 'lodash'; | ||
/** | ||
* @record | ||
*/ | ||
function OldState() { } | ||
if (false) { | ||
/** @type {?} */ | ||
OldState.prototype.dataExists; | ||
/** @type {?} */ | ||
OldState.prototype.dataLength; | ||
/** @type {?} */ | ||
OldState.prototype.datasetsExists; | ||
/** @type {?} */ | ||
OldState.prototype.datasetsLength; | ||
/** @type {?} */ | ||
OldState.prototype.datasetsDataObjects; | ||
/** @type {?} */ | ||
OldState.prototype.datasetsDataLengths; | ||
/** @type {?} */ | ||
OldState.prototype.colorsExists; | ||
/** @type {?} */ | ||
OldState.prototype.colors; | ||
/** @type {?} */ | ||
OldState.prototype.labelsExist; | ||
/** @type {?} */ | ||
OldState.prototype.labels; | ||
} | ||
/** @enum {number} */ | ||
@@ -31,3 +57,14 @@ const UpdateType = { | ||
this.chartHover = new EventEmitter(); | ||
this.initFlag = false; | ||
this.old = { | ||
dataExists: false, | ||
dataLength: 0, | ||
datasetsExists: false, | ||
datasetsLength: 0, | ||
datasetsDataObjects: [], | ||
datasetsDataLengths: [], | ||
colorsExists: false, | ||
colors: [], | ||
labelsExist: false, | ||
labels: [], | ||
}; | ||
this.subs = []; | ||
@@ -55,6 +92,3 @@ } | ||
this.ctx = this.element.nativeElement.getContext('2d'); | ||
this.initFlag = true; | ||
if (this.data || this.datasets) { | ||
this.refresh(); | ||
} | ||
this.refresh(); | ||
this.subs.push(this.themeService.colorschemesOptions.subscribe((/** | ||
@@ -75,49 +109,264 @@ * @param {?} r | ||
/** | ||
* @param {?} changes | ||
* @return {?} | ||
*/ | ||
ngOnChanges(changes) { | ||
if (this.initFlag) { | ||
/** @type {?} */ | ||
let updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
const wantUpdate = (/** | ||
ngDoCheck() { | ||
if (!this.chart) { | ||
return; | ||
} | ||
/** @type {?} */ | ||
let updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
const wantUpdate = (/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
(x) => { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
if (!!this.data !== this.old.dataExists) { | ||
this.propagateDataToDatasets(this.data); | ||
this.old.dataExists = !!this.data; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.data && this.data.length !== this.old.dataLength) { | ||
this.old.dataLength = this.data && this.data.length || 0; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.datasets !== this.old.datasetsExists) { | ||
this.old.datasetsExists = !!this.datasets; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.length !== this.old.datasetsLength) { | ||
this.old.datasetsLength = this.datasets && this.datasets.length || 0; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => x.data !== this.old.datasetsDataObjects[i])).length) { | ||
this.old.datasetsDataObjects = this.datasets.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
(x) => { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
// Check if the changes are in the data or datasets or labels or legend | ||
if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) { | ||
if (changes.data) { | ||
this.updateChartData(changes.data.currentValue); | ||
} | ||
else { | ||
this.updateChartData(changes.datasets.currentValue); | ||
} | ||
wantUpdate(UpdateType.Update); | ||
x => x.data)); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => x.data.length !== this.old.datasetsDataLengths[i])).length) { | ||
this.old.datasetsDataLengths = this.datasets.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
x => x.data.length)); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.colors !== this.old.colorsExists) { | ||
this.old.colorsExists = !!this.colors; | ||
this.updateColors(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
// This smells of inefficiency, might need to revisit this | ||
if (this.colors && this.colors.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => !this.colorsEqual(x, this.old.colors[i]))).length) { | ||
this.old.colors = this.colors.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
x => this.copyColor(x))); | ||
this.updateColors(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.labels !== this.old.labelsExist) { | ||
this.old.labelsExist = !!this.labels; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.labels && this.labels.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => !this.labelsEqual(x, this.old.labels[i]))).length) { | ||
this.old.labels = this.labels.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
x => this.copyLabel(x))); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
switch ((/** @type {?} */ (updateRequired))) { | ||
case UpdateType.Default: | ||
break; | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
this.refresh(); | ||
break; | ||
} | ||
} | ||
/** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
copyLabel(a) { | ||
if (Array.isArray(a)) { | ||
return [...a]; | ||
} | ||
return a; | ||
} | ||
/** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
labelsEqual(a, b) { | ||
return true | ||
&& Array.isArray(a) === Array.isArray(b) | ||
&& (Array.isArray(a) || a === b) | ||
&& (!Array.isArray(a) || a.length === b.length) | ||
&& (!Array.isArray(a) || a.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => x !== b[i])).length === 0); | ||
} | ||
/** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
copyColor(a) { | ||
/** @type {?} */ | ||
const rc = { | ||
backgroundColor: a.backgroundColor, | ||
borderWidth: a.borderWidth, | ||
borderColor: a.borderColor, | ||
borderCapStyle: a.borderCapStyle, | ||
borderDash: a.borderDash, | ||
borderDashOffset: a.borderDashOffset, | ||
borderJoinStyle: a.borderJoinStyle, | ||
pointBorderColor: a.pointBorderColor, | ||
pointBackgroundColor: a.pointBackgroundColor, | ||
pointBorderWidth: a.pointBorderWidth, | ||
pointRadius: a.pointRadius, | ||
pointHoverRadius: a.pointHoverRadius, | ||
pointHitRadius: a.pointHitRadius, | ||
pointHoverBackgroundColor: a.pointHoverBackgroundColor, | ||
pointHoverBorderColor: a.pointHoverBorderColor, | ||
pointHoverBorderWidth: a.pointHoverBorderWidth, | ||
pointStyle: a.pointStyle, | ||
hoverBackgroundColor: a.hoverBackgroundColor, | ||
hoverBorderColor: a.hoverBorderColor, | ||
hoverBorderWidth: a.hoverBorderWidth, | ||
}; | ||
return rc; | ||
} | ||
/** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
colorsEqual(a, b) { | ||
if (!a !== !b) { | ||
return false; | ||
} | ||
return !a || true | ||
&& (a.backgroundColor === b.backgroundColor) | ||
&& (a.borderWidth === b.borderWidth) | ||
&& (a.borderColor === b.borderColor) | ||
&& (a.borderCapStyle === b.borderCapStyle) | ||
&& (a.borderDash === b.borderDash) | ||
&& (a.borderDashOffset === b.borderDashOffset) | ||
&& (a.borderJoinStyle === b.borderJoinStyle) | ||
&& (a.pointBorderColor === b.pointBorderColor) | ||
&& (a.pointBackgroundColor === b.pointBackgroundColor) | ||
&& (a.pointBorderWidth === b.pointBorderWidth) | ||
&& (a.pointRadius === b.pointRadius) | ||
&& (a.pointHoverRadius === b.pointHoverRadius) | ||
&& (a.pointHitRadius === b.pointHitRadius) | ||
&& (a.pointHoverBackgroundColor === b.pointHoverBackgroundColor) | ||
&& (a.pointHoverBorderColor === b.pointHoverBorderColor) | ||
&& (a.pointHoverBorderWidth === b.pointHoverBorderWidth) | ||
&& (a.pointStyle === b.pointStyle) | ||
&& (a.hoverBackgroundColor === b.hoverBackgroundColor) | ||
&& (a.hoverBorderColor === b.hoverBorderColor) | ||
&& (a.hoverBorderWidth === b.hoverBorderWidth); | ||
} | ||
/** | ||
* @return {?} | ||
*/ | ||
updateColors() { | ||
this.datasets.forEach((/** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
(elm, index) => { | ||
if (this.colors && this.colors[index]) { | ||
Object.assign(elm, this.colors[index]); | ||
} | ||
if (changes.hasOwnProperty('labels')) { | ||
else { | ||
Object.assign(elm, getColors(this.chartType, index, elm.data.length), Object.assign({}, elm)); | ||
} | ||
})); | ||
} | ||
/** | ||
* @param {?} changes | ||
* @return {?} | ||
*/ | ||
ngOnChanges(changes) { | ||
/** @type {?} */ | ||
let updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
const wantUpdate = (/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
(x) => { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
// Check if the changes are in the data or datasets or labels or legend | ||
if (changes.hasOwnProperty('data') && changes.data.currentValue) { | ||
this.propagateDataToDatasets(changes.data.currentValue); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('datasets') && changes.datasets.currentValue) { | ||
this.propagateDatasetsToData(changes.datasets.currentValue); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('labels')) { | ||
if (this.chart) { | ||
this.chart.data.labels = changes.labels.currentValue; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('legend')) { | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('legend')) { | ||
if (this.chart) { | ||
this.chart.config.options.legend.display = changes.legend.currentValue; | ||
this.chart.generateLegend(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('options')) { | ||
wantUpdate(UpdateType.Refresh); | ||
} | ||
switch ((/** @type {?} */ (updateRequired))) { | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
case UpdateType.Default: | ||
this.refresh(); | ||
break; | ||
} | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('options')) { | ||
wantUpdate(UpdateType.Refresh); | ||
} | ||
switch ((/** @type {?} */ (updateRequired))) { | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
case UpdateType.Default: | ||
this.refresh(); | ||
break; | ||
} | ||
} | ||
@@ -144,3 +393,5 @@ /** | ||
update(duration, lazy) { | ||
return this.chart.update(duration, lazy); | ||
if (this.chart) { | ||
return this.chart.update(duration, lazy); | ||
} | ||
} | ||
@@ -170,6 +421,5 @@ /** | ||
/** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
getChartBuilder(ctx /*, data:any[], options:any*/) { | ||
getChartConfiguration() { | ||
/** @type {?} */ | ||
@@ -213,3 +463,3 @@ const datasets = this.getDatasets(); | ||
data: { | ||
labels: this.labels, | ||
labels: this.labels || [], | ||
datasets | ||
@@ -220,2 +470,11 @@ }, | ||
}; | ||
return chartConfig; | ||
} | ||
/** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
getChartBuilder(ctx /*, data:any[], options:any*/) { | ||
/** @type {?} */ | ||
const chartConfig = this.getChartConfiguration(); | ||
return new chartJs.Chart(ctx, chartConfig); | ||
@@ -269,12 +528,2 @@ } | ||
* @private | ||
* @param {?} v | ||
* @return {?} | ||
*/ | ||
isChartDataSetsArray(v) { | ||
/** @type {?} */ | ||
const elm = v[0]; | ||
return (typeof (elm) === 'object') && 'data' in elm; | ||
} | ||
/** | ||
* @private | ||
* @param {?} label | ||
@@ -304,9 +553,25 @@ * @return {?} | ||
* @private | ||
* @param {?} datasets | ||
* @return {?} | ||
*/ | ||
propagateDatasetsToData(datasets) { | ||
this.data = this.datasets.map((/** | ||
* @param {?} r | ||
* @return {?} | ||
*/ | ||
r => r.data)); | ||
if (this.chart) { | ||
this.chart.data.datasets = datasets; | ||
} | ||
this.updateColors(); | ||
} | ||
/** | ||
* @private | ||
* @param {?} newDataValues | ||
* @return {?} | ||
*/ | ||
updateChartData(newDataValues) { | ||
if (this.isChartDataSetsArray(newDataValues)) { | ||
if (newDataValues.length === this.chart.data.datasets.length) { | ||
this.chart.data.datasets.forEach((/** | ||
propagateDataToDatasets(newDataValues) { | ||
if (this.isMultiDataSet(newDataValues)) { | ||
if (this.datasets && newDataValues.length === this.datasets.length) { | ||
this.datasets.forEach((/** | ||
* @param {?} dataset | ||
@@ -317,20 +582,2 @@ * @param {?} i | ||
(dataset, i) => { | ||
dataset.data = newDataValues[i].data; | ||
if (newDataValues[i].label) { | ||
dataset.label = newDataValues[i].label; | ||
} | ||
})); | ||
} | ||
else { | ||
this.chart.data.datasets = [...newDataValues]; | ||
} | ||
} | ||
else if (!this.isSingleDataSet(newDataValues)) { | ||
if (newDataValues.length === this.chart.data.datasets.length) { | ||
this.chart.data.datasets.forEach((/** | ||
* @param {?} dataset | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(dataset, i) => { | ||
dataset.data = newDataValues[i]; | ||
@@ -340,3 +587,3 @@ })); | ||
else { | ||
this.chart.data.datasets = newDataValues.map((/** | ||
this.datasets = newDataValues.map((/** | ||
* @param {?} data | ||
@@ -349,20 +596,20 @@ * @param {?} index | ||
})); | ||
if (this.chart) { | ||
this.chart.data.datasets = this.datasets; | ||
} | ||
} | ||
} | ||
else { | ||
this.chart.data.datasets[0].data = newDataValues; | ||
} | ||
this.chart.data.datasets.forEach((/** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
(elm, index) => { | ||
if (this.colors && this.colors[index]) { | ||
Object.assign(elm, this.colors[index]); | ||
if (!this.datasets) { | ||
this.datasets = [{ data: newDataValues }]; | ||
if (this.chart) { | ||
this.chart.data.datasets = this.datasets; | ||
} | ||
} | ||
else { | ||
Object.assign(elm, getColors(this.chartType, index, elm.data.length)); | ||
this.datasets[0].data = newDataValues; | ||
this.datasets.splice(1); // Remove all elements but the first | ||
} | ||
})); | ||
} | ||
this.updateColors(); | ||
} | ||
@@ -374,4 +621,4 @@ /** | ||
*/ | ||
isSingleDataSet(data) { | ||
return !Array.isArray(data[0]); | ||
isMultiDataSet(data) { | ||
return Array.isArray(data[0]); | ||
} | ||
@@ -383,45 +630,14 @@ /** | ||
getDatasets() { | ||
/** @type {?} */ | ||
let datasets = void 0; | ||
// in case if datasets is not provided, but data is present | ||
if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) { | ||
if (!this.isSingleDataSet(this.data)) { | ||
datasets = this.data.map((/** | ||
* @param {?} data | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
(data, index) => { | ||
return { data, label: this.joinLabel(this.labels[index]) || `Label ${index}` }; | ||
})); | ||
} | ||
else { | ||
datasets = [{ data: this.data, label: `Label 0` }]; | ||
} | ||
if (!this.datasets && !this.data) { | ||
throw new Error(`ng-charts configuration error, data or datasets field are required to render chart ${this.chartType}`); | ||
} | ||
if (this.datasets && this.datasets.length || | ||
(datasets && datasets.length)) { | ||
datasets = (this.datasets || datasets) | ||
.map((/** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
(elm, index) => { | ||
/** @type {?} */ | ||
const newElm = Object.assign({}, elm); | ||
if (this.colors && this.colors.length) { | ||
Object.assign(newElm, this.colors[index]); | ||
} | ||
else { | ||
Object.assign(newElm, getColors(this.chartType, index, newElm.data.length)); | ||
} | ||
return newElm; | ||
})); | ||
// If `datasets` is defined, use it over the `data` property. | ||
if (this.datasets) { | ||
this.propagateDatasetsToData(this.datasets); | ||
return this.datasets; | ||
} | ||
if (!datasets) { | ||
throw new Error(`ng-charts configuration error, | ||
data or datasets field are required to render chart ${this.chartType}`); | ||
if (this.data) { | ||
this.propagateDataToDatasets(this.data); | ||
return this.datasets; | ||
} | ||
return datasets; | ||
} | ||
@@ -441,3 +657,5 @@ /** | ||
} | ||
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/); | ||
if (this.ctx) { | ||
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/); | ||
} | ||
} | ||
@@ -498,3 +716,3 @@ } | ||
*/ | ||
BaseChartDirective.prototype.initFlag; | ||
BaseChartDirective.prototype.old; | ||
/** | ||
@@ -516,2 +734,2 @@ * @type {?} | ||
} | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jaGFydC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZzItY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL2Jhc2UtY2hhcnQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUlULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsR0FFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7O0lBWTFCLFVBQU87SUFDUCxTQUFNO0lBQ04sVUFBTzs7Ozs7QUFRVCxNQUFNLE9BQU8sa0JBQWtCOzs7OztJQThCN0IsWUFDVSxPQUFtQixFQUNuQixZQUEwQjtRQUQxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBNUJwQixZQUFPLEdBQXlCLEVBQUUsQ0FBQztRQU1sQyxlQUFVLEdBQXdELElBQUksWUFBWSxFQUFFLENBQUM7UUFDckYsZUFBVSxHQUFzRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSTVGLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsU0FBSSxHQUFtQixFQUFFLENBQUM7SUFnQjlCLENBQUM7Ozs7OztJQVhFLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBaUQ7UUFDNUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7O0lBRU0sTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQWlEO1FBQzlFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FB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QyxHQUFHLENBQUEsd0JBQXdCLENBQUMsQ0FBQztJQUN0RSxDQUFDOzs7WUF4U0YsU0FBUyxTQUFDOztnQkFFVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRLEVBQUUsWUFBWTthQUN2Qjs7OztZQTdCQyxVQUFVO1lBTUgsWUFBWTs7O21CQXlCbEIsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7c0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3FCQUNMLEtBQUs7cUJBQ0wsS0FBSztzQkFDTCxLQUFLO3lCQUVMLE1BQU07eUJBQ04sTUFBTTs7OztJQVZQLGtDQUEyQzs7SUFDM0Msc0NBQWtEOztJQUNsRCxvQ0FBZ0M7O0lBQ2hDLHFDQUFtRDs7SUFDbkQsdUNBQTZDOztJQUM3QyxvQ0FBZ0M7O0lBQ2hDLG9DQUFnQzs7SUFDaEMscUNBQXFFOztJQUVyRSx3Q0FBc0c7O0lBQ3RHLHdDQUFvRzs7SUFFcEcsaUNBQW1COztJQUNuQixtQ0FBb0I7Ozs7O0lBQ3BCLHNDQUF5Qjs7Ozs7SUFFekIsa0NBQWtDOzs7OztJQWNoQyxxQ0FBMkI7Ozs7O0lBQzNCLDBDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgRWxlbWVudFJlZixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBjaGFydEpzIGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgZ2V0Q29sb3JzIH0gZnJvbSAnLi9nZXQtY29sb3JzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuL2NvbG9yJztcclxuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi90aGVtZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuXHJcbmV4cG9ydCB0eXBlIFNpbmdsZURhdGFTZXQgPSAobnVtYmVyW10gfCBjaGFydEpzLkNoYXJ0UG9pbnRbXSk7XHJcbmV4cG9ydCB0eXBlIE11bHRpRGF0YVNldCA9IChudW1iZXJbXSB8IGNoYXJ0SnMuQ2hhcnRQb2ludFtdKVtdO1xyXG5leHBvcnQgdHlwZSBTaW5nbGVPck11bHRpRGF0YVNldCA9IFNpbmdsZURhdGFTZXQgfCBNdWx0aURhdGFTZXQ7XHJcblxyXG5leHBvcnQgdHlwZSBQbHVnaW5TZXJ2aWNlR2xvYmFsUmVnaXN0cmF0aW9uQW5kT3B0aW9ucyA9IGNoYXJ0SnMuUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbiAmIGNoYXJ0SnMuUGx1Z2luU2VydmljZVJlZ2lzdHJhdGlvbk9wdGlvbnM7XHJcbmV4cG9ydCB0eXBlIFNpbmdsZUxpbmVMYWJlbCA9IHN0cmluZztcclxuZXhwb3J0IHR5cGUgTXVsdGlMaW5lTGFiZWwgPSBzdHJpbmdbXTtcclxuZXhwb3J0IHR5cGUgTGFiZWwgPSBTaW5nbGVMaW5lTGFiZWwgfCBNdWx0aUxpbmVMYWJlbDtcclxuXHJcbmVudW0gVXBkYXRlVHlwZSB7XHJcbiAgRGVmYXVsdCxcclxuICBVcGRhdGUsXHJcbiAgUmVmcmVzaFxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdjYW52YXNbYmFzZUNoYXJ0XScsXHJcbiAgZXhwb3J0QXM6ICdiYXNlLWNoYXJ0J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFzZUNoYXJ0RGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBwdWJsaWMgZGF0YTogU2luZ2xlT3JNdWx0aURhdGFTZXQ7XHJcbiAgQElucHV0KCkgcHVibGljIGRhdGFzZXRzOiBjaGFydEpzLkNoYXJ0RGF0YVNldHNbXTtcclxuICBASW5wdXQoKSBwdWJsaWMgbGFiZWxzOiBMYWJlbFtdO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zOiBjaGFydEpzLkNoYXJ0T3B0aW9ucyA9IHt9O1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjaGFydFR5cGU6IGNoYXJ0SnMuQ2hhcnRUeXBlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xvcnM6IENvbG9yW107XHJcbiAgQElucHV0KCkgcHVibGljIGxlZ2VuZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBwdWJsaWMgcGx1Z2luczogUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbkFuZE9wdGlvbnNbXTtcclxuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFydENsaWNrOiBFdmVudEVtaXR0ZXI8eyBldmVudD86IE1vdXNlRXZlbnQsIGFjdGl2ZT86IHt9W10gfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFydEhvdmVyOiBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudCwgYWN0aXZlOiB7fVtdIH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBwdWJsaWMgY3R4OiBzdHJpbmc7XHJcbiAgcHVibGljIGNoYXJ0OiBDaGFydDtcclxuICBwcml2YXRlIGluaXRGbGFnID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgYSBwbHVnaW4uXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyByZWdpc3RlclBsdWdpbihwbHVnaW46IFBsdWdpblNlcnZpY2VHbG9iYWxSZWdpc3RyYXRpb25BbmRPcHRpb25zKSB7XHJcbiAgICBjaGFydEpzLkNoYXJ0LnBsdWdpbnMucmVnaXN0ZXIocGx1Z2luKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlclBsdWdpbihwbHVnaW46IFBsdWdpblNlcnZpY2VHbG9iYWxSZWdpc3RyYXRpb25BbmRPcHRpb25zKSB7XHJcbiAgICBjaGFydEpzLkNoYXJ0LnBsdWdpbnMudW5yZWdpc3RlcihwbHVnaW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZSxcclxuICApIHsgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmN0eCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldENvbnRleHQoJzJkJyk7XHJcbiAgICB0aGlzLmluaXRGbGFnID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmRhdGEgfHwgdGhpcy5kYXRhc2V0cykge1xyXG4gICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3Vicy5wdXNoKHRoaXMudGhlbWVTZXJ2aWNlLmNvbG9yc2NoZW1lc09wdGlvbnMuc3Vic2NyaWJlKHIgPT4gdGhpcy50aGVtZUNoYW5nZWQocikpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGhlbWVDaGFuZ2VkKG9wdGlvbnM6IHt9KSB7XHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAodGhpcy5pbml0RmxhZykge1xyXG4gICAgICBsZXQgdXBkYXRlUmVxdWlyZWQgPSBVcGRhdGVUeXBlLkRlZmF1bHQ7XHJcbiAgICAgIGNvbnN0IHdhbnRVcGRhdGUgPSAoeDogVXBkYXRlVHlwZSkgPT4ge1xyXG4gICAgICAgIHVwZGF0ZVJlcXVpcmVkID0geCA+IHVwZGF0ZVJlcXVpcmVkID8geCA6IHVwZGF0ZVJlcXVpcmVkO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNoYW5nZXMgYXJlIGluIHRoZSBkYXRhIG9yIGRhdGFzZXRzIG9yIGxhYmVscyBvciBsZWdlbmRcclxuXHJcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdkYXRhJykgfHwgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnZGF0YXNldHMnKSkge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLmRhdGEpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnREYXRhKGNoYW5nZXMuZGF0YS5jdXJyZW50VmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0RGF0YShjaGFuZ2VzLmRhdGFzZXRzLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3YW50VXBkYXRlKFVwZGF0ZVR5cGUuVXBkYXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2xhYmVscycpKSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5kYXRhLmxhYmVscyA9IGNoYW5nZXMubGFiZWxzLmN1cnJlbnRWYWx1ZTtcclxuXHJcbiAgICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdsZWdlbmQnKSkge1xyXG4gICAgICAgIHRoaXMuY2hhcnQuY29uZmlnLm9wdGlvbnMubGVnZW5kLmRpc3BsYXkgPSBjaGFuZ2VzLmxlZ2VuZC5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgdGhpcy5jaGFydC5nZW5lcmF0ZUxlZ2VuZCgpO1xyXG5cclxuICAgICAgICB3YW50VXBkYXRlKFVwZGF0ZVR5cGUuVXBkYXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ29wdGlvbnMnKSkge1xyXG4gICAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5SZWZyZXNoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3dpdGNoICh1cGRhdGVSZXF1aXJlZCBhcyBVcGRhdGVUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBVcGRhdGVUeXBlLlVwZGF0ZTpcclxuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFVwZGF0ZVR5cGUuUmVmcmVzaDpcclxuICAgICAgICBjYXNlIFVwZGF0ZVR5cGUuRGVmYXVsdDpcclxuICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgIHRoaXMuY2hhcnQuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLmNoYXJ0ID0gdm9pZCAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdWJzLmZvckVhY2goeCA9PiB4LnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZShkdXJhdGlvbj86IGFueSwgbGF6eT86IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhcnQudXBkYXRlKGR1cmF0aW9uLCBsYXp5KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlRGF0YXNldChpbmRleDogbnVtYmVyLCBoaWRkZW46IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaW5kZXgpLmhpZGRlbiA9IGhpZGRlbjtcclxuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEYXRhc2V0SGlkZGVuKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKGluZGV4KS5oaWRkZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9CYXNlNjRJbWFnZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhcnQudG9CYXNlNjRJbWFnZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoYXJ0QnVpbGRlcihjdHg6IHN0cmluZy8qLCBkYXRhOmFueVtdLCBvcHRpb25zOmFueSovKTogQ2hhcnQge1xyXG4gICAgY29uc3QgZGF0YXNldHMgPSB0aGlzLmdldERhdGFzZXRzKCk7XHJcblxyXG4gICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucyk7XHJcbiAgICBpZiAodGhpcy5sZWdlbmQgPT09IGZhbHNlKSB7XHJcbiAgICAgIG9wdGlvbnMubGVnZW5kID0geyBkaXNwbGF5OiBmYWxzZSB9O1xyXG4gICAgfVxyXG4gICAgLy8gaG9vayBmb3Igb25Ib3ZlciBhbmQgb25DbGljayBldmVudHNcclxuICAgIG9wdGlvbnMuaG92ZXIgPSBvcHRpb25zLmhvdmVyIHx8IHt9O1xyXG4gICAgaWYgKCFvcHRpb25zLmhvdmVyLm9uSG92ZXIpIHtcclxuICAgICAgb3B0aW9ucy5ob3Zlci5vbkhvdmVyID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBhY3RpdmU6IHt9W10pID0+IHtcclxuICAgICAgICBpZiAoYWN0aXZlICYmICFhY3RpdmUubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hhcnRIb3Zlci5lbWl0KHsgZXZlbnQsIGFjdGl2ZSB9KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW9wdGlvbnMub25DbGljaykge1xyXG4gICAgICBvcHRpb25zLm9uQ2xpY2sgPSAoZXZlbnQ/OiBNb3VzZUV2ZW50LCBhY3RpdmU/OiB7fVtdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGFydENsaWNrLmVtaXQoeyBldmVudCwgYWN0aXZlIH0pO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB0aGlzLnNtYXJ0TWVyZ2Uob3B0aW9ucywgdGhpcy50aGVtZVNlcnZpY2UuZ2V0Q29sb3JzY2hlbWVzT3B0aW9ucygpKTtcclxuXHJcbiAgICBjb25zdCBjaGFydENvbmZpZzogY2hhcnRKcy5DaGFydENvbmZpZ3VyYXRpb24gPSB7XHJcbiAgICAgIHR5cGU6IHRoaXMuY2hhcnRUeXBlLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgbGFiZWxzOiB0aGlzLmxhYmVscyxcclxuICAgICAgICBkYXRhc2V0c1xyXG4gICAgICB9LFxyXG4gICAgICBwbHVnaW5zOiB0aGlzLnBsdWdpbnMsXHJcbiAgICAgIG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgY2hhcnRKcy5DaGFydChjdHgsIGNoYXJ0Q29uZmlnKTtcclxuICB9XHJcblxyXG4gIHNtYXJ0TWVyZ2Uob3B0aW9uczogYW55LCBvdmVycmlkZXM6IGFueSwgbGV2ZWw6IG51bWJlciA9IDApOiBhbnkge1xyXG4gICAgaWYgKGxldmVsID09PSAwKSB7XHJcbiAgICAgIG9wdGlvbnMgPSBfLmNsb25lRGVlcChvcHRpb25zKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGtleXNUb1VwZGF0ZSA9IE9iamVjdC5rZXlzKG92ZXJyaWRlcyk7XHJcbiAgICBrZXlzVG9VcGRhdGUuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvdmVycmlkZXNba2V5XSkpIHtcclxuICAgICAgICBjb25zdCBhcnJheUVsZW1lbnRzID0gb3B0aW9uc1trZXldO1xyXG4gICAgICAgIGlmIChhcnJheUVsZW1lbnRzKSB7XHJcbiAgICAgICAgICBhcnJheUVsZW1lbnRzLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc21hcnRNZXJnZShyLCBvdmVycmlkZXNba2V5XVswXSwgbGV2ZWwgKyAxKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKG92ZXJyaWRlc1trZXldKSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBpZiAoIShrZXkgaW4gb3B0aW9ucykpIHtcclxuICAgICAgICAgIG9wdGlvbnNba2V5XSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNtYXJ0TWVyZ2Uob3B0aW9uc1trZXldLCBvdmVycmlkZXNba2V5XSwgbGV2ZWwgKyAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHRpb25zW2tleV0gPSBvdmVycmlkZXNba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAobGV2ZWwgPT09IDApIHtcclxuICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzQ2hhcnREYXRhU2V0c0FycmF5KHY6IFNpbmdsZU9yTXVsdGlEYXRhU2V0IHwgY2hhcnRKcy5DaGFydERhdGFTZXRzW10pOiB2IGlzIGNoYXJ0SnMuQ2hhcnREYXRhU2V0c1tdIHtcclxuICAgIGNvbnN0IGVsbSA9IHZbMF07XHJcbiAgICByZXR1cm4gKHR5cGVvZiAoZWxtKSA9PT0gJ29iamVjdCcpICYmICdkYXRhJyBpbiBlbG07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzTXVsdGlMaW5lTGFiZWwobGFiZWw6IExhYmVsKTogbGFiZWwgaXMgTXVsdGlMaW5lTGFiZWwge1xyXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBqb2luTGFiZWwobGFiZWw6IExhYmVsKTogc3RyaW5nIHtcclxuICAgIGlmICghbGFiZWwpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc011bHRpTGluZUxhYmVsKGxhYmVsKSkge1xyXG4gICAgICByZXR1cm4gbGFiZWwuam9pbignICcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDaGFydERhdGEobmV3RGF0YVZhbHVlczogU2luZ2xlT3JNdWx0aURhdGFTZXQgfCBjaGFydEpzLkNoYXJ0RGF0YVNldHNbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNDaGFydERhdGFTZXRzQXJyYXkobmV3RGF0YVZhbHVlcykpIHtcclxuICAgICAgaWYgKG5ld0RhdGFWYWx1ZXMubGVuZ3RoID09PSB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQsIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgZGF0YXNldC5kYXRhID0gbmV3RGF0YVZhbHVlc1tpXS5kYXRhO1xyXG4gICAgICAgICAgaWYgKG5ld0RhdGFWYWx1ZXNbaV0ubGFiZWwpIHtcclxuICAgICAgICAgICAgZGF0YXNldC5sYWJlbCA9IG5ld0RhdGFWYWx1ZXNbaV0ubGFiZWw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzID0gWy4uLm5ld0RhdGFWYWx1ZXNdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2luZ2xlRGF0YVNldChuZXdEYXRhVmFsdWVzKSkge1xyXG4gICAgICBpZiAobmV3RGF0YVZhbHVlcy5sZW5ndGggPT09IHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBkYXRhc2V0LmRhdGEgPSBuZXdEYXRhVmFsdWVzW2ldO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cyA9IG5ld0RhdGFWYWx1ZXMubWFwKChkYXRhOiBudW1iZXJbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHsgZGF0YSwgbGFiZWw6IHRoaXMuam9pbkxhYmVsKHRoaXMubGFiZWxzW2luZGV4XSkgfHwgYExhYmVsICR7aW5kZXh9YCB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbMF0uZGF0YSA9IG5ld0RhdGFWYWx1ZXM7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZWxtLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jb2xvcnMgJiYgdGhpcy5jb2xvcnNbaW5kZXhdKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbG0sIHRoaXMuY29sb3JzW2luZGV4XSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbG0sIGdldENvbG9ycyh0aGlzLmNoYXJ0VHlwZSwgaW5kZXgsIGVsbS5kYXRhLmxlbmd0aCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTaW5nbGVEYXRhU2V0KGRhdGE6IFNpbmdsZU9yTXVsdGlEYXRhU2V0KTogZGF0YSBpcyBTaW5nbGVEYXRhU2V0IHtcclxuICAgIHJldHVybiAhQXJyYXkuaXNBcnJheShkYXRhWzBdKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGF0YXNldHMoKSB7XHJcbiAgICBsZXQgZGF0YXNldHM6IGNoYXJ0SnMuQ2hhcnREYXRhU2V0c1tdID0gdm9pZCAwO1xyXG4gICAgLy8gaW4gY2FzZSBpZiBkYXRhc2V0cyBpcyBub3QgcHJvdmlkZWQsIGJ1dCBkYXRhIGlzIHByZXNlbnRcclxuICAgIGlmICghdGhpcy5kYXRhc2V0cyB8fCAhdGhpcy5kYXRhc2V0cy5sZW5ndGggJiYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoKSkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNTaW5nbGVEYXRhU2V0KHRoaXMuZGF0YSkpIHtcclxuICAgICAgICBkYXRhc2V0cyA9IHRoaXMuZGF0YS5tYXAoKGRhdGE6IG51bWJlcltdLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyBkYXRhLCBsYWJlbDogdGhpcy5qb2luTGFiZWwodGhpcy5sYWJlbHNbaW5kZXhdKSB8fCBgTGFiZWwgJHtpbmRleH1gIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YXNldHMgPSBbeyBkYXRhOiB0aGlzLmRhdGEsIGxhYmVsOiBgTGFiZWwgMGAgfV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhc2V0cyAmJiB0aGlzLmRhdGFzZXRzLmxlbmd0aCB8fFxyXG4gICAgICAoZGF0YXNldHMgJiYgZGF0YXNldHMubGVuZ3RoKSkge1xyXG4gICAgICBkYXRhc2V0cyA9ICh0aGlzLmRhdGFzZXRzIHx8IGRhdGFzZXRzKVxyXG4gICAgICAgIC5tYXAoKGVsbTogY2hhcnRKcy5DaGFydERhdGFTZXRzLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuZXdFbG06IGNoYXJ0SnMuQ2hhcnREYXRhU2V0cyA9IE9iamVjdC5hc3NpZ24oe30sIGVsbSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb2xvcnMgJiYgdGhpcy5jb2xvcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxtLCB0aGlzLmNvbG9yc1tpbmRleF0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihuZXdFbG0sIGdldENvbG9ycyh0aGlzLmNoYXJ0VHlwZSwgaW5kZXgsIG5ld0VsbS5kYXRhLmxlbmd0aCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG5ld0VsbTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWRhdGFzZXRzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbmctY2hhcnRzIGNvbmZpZ3VyYXRpb24gZXJyb3IsXHJcbiAgICAgIGRhdGEgb3IgZGF0YXNldHMgZmllbGQgYXJlIHJlcXVpcmVkIHRvIHJlbmRlciBjaGFydCAke3RoaXMuY2hhcnRUeXBlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhc2V0cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaCgpIHtcclxuICAgIC8vIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlc3BvbnNpdmUpIHtcclxuICAgIC8vICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlZnJlc2goKSwgNTApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHRvZG86IHJlbW92ZSB0aGlzIGxpbmUsIGl0IGlzIHByb2R1Y2luZyBmbGlja2VyaW5nXHJcbiAgICBpZiAodGhpcy5jaGFydCkge1xyXG4gICAgICB0aGlzLmNoYXJ0LmRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5jaGFydCA9IHZvaWQgMDtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhcnQgPSB0aGlzLmdldENoYXJ0QnVpbGRlcih0aGlzLmN0eC8qLCBkYXRhLCB0aGlzLm9wdGlvbnMqLyk7XHJcbiAgfVxyXG59XHJcbiJdfQ== | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jaGFydC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZzItY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL2Jhc2UtY2hhcnQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUlULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsR0FHWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7OztBQVc1Qix1QkFXQzs7O0lBVkMsOEJBQW9COztJQUNwQiw4QkFBbUI7O0lBQ25CLGtDQUF3Qjs7SUFDeEIsa0NBQXVCOztJQUN2Qix1Q0FBMkI7O0lBQzNCLHVDQUE4Qjs7SUFDOUIsZ0NBQXNCOztJQUN0QiwwQkFBZ0I7O0lBQ2hCLCtCQUFxQjs7SUFDckIsMEJBQWdCOzs7O0lBSWhCLFVBQU87SUFDUCxTQUFNO0lBQ04sVUFBTzs7Ozs7QUFRVCxNQUFNLE9BQU8sa0JBQWtCOzs7OztJQTBDN0IsWUFDVSxPQUFtQixFQUNuQixZQUEwQjtRQUQxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBeENwQixZQUFPLEdBQXlCLEVBQUUsQ0FBQztRQU1sQyxlQUFVLEdBQXdELElBQUksWUFBWSxFQUFFLENBQUM7UUFDckYsZUFBVSxHQUFzRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSzVGLFFBQUcsR0FBYTtZQUN0QixVQUFVLEVBQUUsS0FBSztZQUNqQixVQUFVLEVBQUUsQ0FBQztZQUNiLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLG1CQUFtQixF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VSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07Ozs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDdEcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUc7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUMsQ0FBQztZQUU5RCxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQy9CO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTs7Ozs7UUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDN0csSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUc7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFDLENBQUM7WUFFckUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUU7WUFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFFdEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXBCLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0I7UUFFRCwwREFBMEQ7UUFDMUQsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTs7Ozs7UUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE1BQU0sRUFBRTtZQUNoRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUUxRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFcEIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7WUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFFckMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07Ozs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDaEcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFB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QUMsR0FBRyxDQUFBLHdCQUF3QixDQUFDLENBQUM7U0FDckU7SUFDSCxDQUFDOzs7WUFsZEYsU0FBUyxTQUFDOztnQkFFVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRLEVBQUUsWUFBWTthQUN2Qjs7OztZQTNDQyxVQUFVO1lBT0gsWUFBWTs7O21CQXNDbEIsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7c0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3FCQUNMLEtBQUs7cUJBQ0wsS0FBSztzQkFDTCxLQUFLO3lCQUVMLE1BQU07eUJBQ04sTUFBTTs7OztJQVZQLGtDQUEyQzs7SUFDM0Msc0NBQWtEOztJQUNsRCxvQ0FBZ0M7O0lBQ2hDLHFDQUFtRDs7SUFDbkQsdUNBQTZDOztJQUM3QyxvQ0FBZ0M7O0lBQ2hDLG9DQUFnQzs7SUFDaEMscUNBQXFFOztJQUVyRSx3Q0FBc0c7O0lBQ3RHLHdDQUFvRzs7SUFFcEcsaUNBQW1COztJQUNuQixtQ0FBb0I7Ozs7O0lBRXBCLGlDQVdFOzs7OztJQUVGLGtDQUFrQzs7Ozs7SUFjaEMscUNBQTJCOzs7OztJQUMzQiwwQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBEb0NoZWNrLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBjaGFydEpzIGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgZ2V0Q29sb3JzIH0gZnJvbSAnLi9nZXQtY29sb3JzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuL2NvbG9yJztcclxuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi90aGVtZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuXHJcbmV4cG9ydCB0eXBlIFNpbmdsZURhdGFTZXQgPSAobnVtYmVyW10gfCBjaGFydEpzLkNoYXJ0UG9pbnRbXSk7XHJcbmV4cG9ydCB0eXBlIE11bHRpRGF0YVNldCA9IChudW1iZXJbXSB8IGNoYXJ0SnMuQ2hhcnRQb2ludFtdKVtdO1xyXG5leHBvcnQgdHlwZSBTaW5nbGVPck11bHRpRGF0YVNldCA9IFNpbmdsZURhdGFTZXQgfCBNdWx0aURhdGFTZXQ7XHJcblxyXG5leHBvcnQgdHlwZSBQbHVnaW5TZXJ2aWNlR2xvYmFsUmVnaXN0cmF0aW9uQW5kT3B0aW9ucyA9IGNoYXJ0SnMuUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbiAmIGNoYXJ0SnMuUGx1Z2luU2VydmljZVJlZ2lzdHJhdGlvbk9wdGlvbnM7XHJcbmV4cG9ydCB0eXBlIFNpbmdsZUxpbmVMYWJlbCA9IHN0cmluZztcclxuZXhwb3J0IHR5cGUgTXVsdGlMaW5lTGFiZWwgPSBzdHJpbmdbXTtcclxuZXhwb3J0IHR5cGUgTGFiZWwgPSBTaW5nbGVMaW5lTGFiZWwgfCBNdWx0aUxpbmVMYWJlbDtcclxuXHJcbmludGVyZmFjZSBPbGRTdGF0ZSB7XHJcbiAgZGF0YUV4aXN0czogYm9vbGVhbjtcclxuICBkYXRhTGVuZ3RoOiBudW1iZXI7XHJcbiAgZGF0YXNldHNFeGlzdHM6IGJvb2xlYW47XHJcbiAgZGF0YXNldHNMZW5ndGg6IG51bWJlcjtcclxuICBkYXRhc2V0c0RhdGFPYmplY3RzOiBhbnlbXTtcclxuICBkYXRhc2V0c0RhdGFMZW5ndGhzOiBudW1iZXJbXTtcclxuICBjb2xvcnNFeGlzdHM6IGJvb2xlYW47XHJcbiAgY29sb3JzOiBDb2xvcltdO1xyXG4gIGxhYmVsc0V4aXN0OiBib29sZWFuO1xyXG4gIGxhYmVsczogTGFiZWxbXTtcclxufVxyXG5cclxuZW51bSBVcGRhdGVUeXBlIHtcclxuICBEZWZhdWx0LFxyXG4gIFVwZGF0ZSxcclxuICBSZWZyZXNoXHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2NhbnZhc1tiYXNlQ2hhcnRdJyxcclxuICBleHBvcnRBczogJ2Jhc2UtY2hhcnQnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlQ2hhcnREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3ksIERvQ2hlY2sge1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBkYXRhOiBTaW5nbGVPck11bHRpRGF0YVNldDtcclxuICBASW5wdXQoKSBwdWJsaWMgZGF0YXNldHM6IGNoYXJ0SnMuQ2hhcnREYXRhU2V0c1tdO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBsYWJlbHM6IExhYmVsW107XHJcbiAgQElucHV0KCkgcHVibGljIG9wdGlvbnM6IGNoYXJ0SnMuQ2hhcnRPcHRpb25zID0ge307XHJcbiAgQElucHV0KCkgcHVibGljIGNoYXJ0VHlwZTogY2hhcnRKcy5DaGFydFR5cGU7XHJcbiAgQElucHV0KCkgcHVibGljIGNvbG9yczogQ29sb3JbXTtcclxuICBASW5wdXQoKSBwdWJsaWMgbGVnZW5kOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwbHVnaW5zOiBQbHVnaW5TZXJ2aWNlR2xvYmFsUmVnaXN0cmF0aW9uQW5kT3B0aW9uc1tdO1xyXG5cclxuICBAT3V0cHV0KCkgcHVibGljIGNoYXJ0Q2xpY2s6IEV2ZW50RW1pdHRlcjx7IGV2ZW50PzogTW91c2VFdmVudCwgYWN0aXZlPzoge31bXSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgcHVibGljIGNoYXJ0SG92ZXI6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50LCBhY3RpdmU6IHt9W10gfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHB1YmxpYyBjdHg6IHN0cmluZztcclxuICBwdWJsaWMgY2hhcnQ6IENoYXJ0O1xyXG5cclxuICBwcml2YXRlIG9sZDogT2xkU3RhdGUgPSB7XHJcbiAgICBkYXRhRXhpc3RzOiBmYWxzZSxcclxuICAgIGRhdGFMZW5ndGg6IDAsXHJcbiAgICBkYXRhc2V0c0V4aXN0czogZmFsc2UsXHJcbiAgICBkYXRhc2V0c0xlbmd0aDogMCxcclxuICAgIGRhdGFzZXRzRGF0YU9iamVjdHM6IFtdLFxyXG4gICAgZGF0YXNldHNEYXRhTGVuZ3RoczogW10sXHJcbiAgICBjb2xvcnNFeGlzdHM6IGZhbHNlLFxyXG4gICAgY29sb3JzOiBbXSxcclxuICAgIGxhYmVsc0V4aXN0OiBmYWxzZSxcclxuICAgIGxhYmVsczogW10sXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBzdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBhIHBsdWdpbi5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyUGx1Z2luKHBsdWdpbjogUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbkFuZE9wdGlvbnMpIHtcclxuICAgIGNoYXJ0SnMuQ2hhcnQucGx1Z2lucy5yZWdpc3RlcihwbHVnaW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB1bnJlZ2lzdGVyUGx1Z2luKHBsdWdpbjogUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbkFuZE9wdGlvbnMpIHtcclxuICAgIGNoYXJ0SnMuQ2hhcnQucGx1Z2lucy51bnJlZ2lzdGVyKHBsdWdpbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY3R4ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgdGhpcy5zdWJzLnB1c2godGhpcy50aGVtZVNlcnZpY2UuY29sb3JzY2hlbWVzT3B0aW9ucy5zdWJzY3JpYmUociA9PiB0aGlzLnRoZW1lQ2hhbmdlZChyKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0aGVtZUNoYW5nZWQob3B0aW9uczoge30pIHtcclxuICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNoYXJ0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCB1cGRhdGVSZXF1aXJlZCA9IFVwZGF0ZVR5cGUuRGVmYXVsdDtcclxuICAgIGNvbnN0IHdhbnRVcGRhdGUgPSAoeDogVXBkYXRlVHlwZSkgPT4ge1xyXG4gICAgICB1cGRhdGVSZXF1aXJlZCA9IHggPiB1cGRhdGVSZXF1aXJlZCA/IHggOiB1cGRhdGVSZXF1aXJlZDtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKCEhdGhpcy5kYXRhICE9PSB0aGlzLm9sZC5kYXRhRXhpc3RzKSB7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlRGF0YVRvRGF0YXNldHModGhpcy5kYXRhKTtcclxuXHJcbiAgICAgIHRoaXMub2xkLmRhdGFFeGlzdHMgPSAhIXRoaXMuZGF0YTtcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmxlbmd0aCAhPT0gdGhpcy5vbGQuZGF0YUxlbmd0aCkge1xyXG4gICAgICB0aGlzLm9sZC5kYXRhTGVuZ3RoID0gdGhpcy5kYXRhICYmIHRoaXMuZGF0YS5sZW5ndGggfHwgMDtcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghIXRoaXMuZGF0YXNldHMgIT09IHRoaXMub2xkLmRhdGFzZXRzRXhpc3RzKSB7XHJcbiAgICAgIHRoaXMub2xkLmRhdGFzZXRzRXhpc3RzID0gISF0aGlzLmRhdGFzZXRzO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YXNldHMgJiYgdGhpcy5kYXRhc2V0cy5sZW5ndGggIT09IHRoaXMub2xkLmRhdGFzZXRzTGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMub2xkLmRhdGFzZXRzTGVuZ3RoID0gdGhpcy5kYXRhc2V0cyAmJiB0aGlzLmRhdGFzZXRzLmxlbmd0aCB8fCAwO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YXNldHMgJiYgdGhpcy5kYXRhc2V0cy5maWx0ZXIoKHgsIGkpID0+IHguZGF0YSAhPT0gdGhpcy5vbGQuZGF0YXNldHNEYXRhT2JqZWN0c1tpXSkubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMub2xkLmRhdGFzZXRzRGF0YU9iamVjdHMgPSB0aGlzLmRhdGFzZXRzLm1hcCh4ID0+IHguZGF0YSk7XHJcblxyXG4gICAgICB3YW50VXBkYXRlKFVwZGF0ZVR5cGUuVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhc2V0cyAmJiB0aGlzLmRhdGFzZXRzLmZpbHRlcigoeCwgaSkgPT4geC5kYXRhLmxlbmd0aCAhPT0gdGhpcy5vbGQuZGF0YXNldHNEYXRhTGVuZ3Roc1tpXSkubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMub2xkLmRhdGFzZXRzRGF0YUxlbmd0aHMgPSB0aGlzLmRhdGFzZXRzLm1hcCh4ID0+IHguZGF0YS5sZW5ndGgpO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhdGhpcy5jb2xvcnMgIT09IHRoaXMub2xkLmNvbG9yc0V4aXN0cykge1xyXG4gICAgICB0aGlzLm9sZC5jb2xvcnNFeGlzdHMgPSAhIXRoaXMuY29sb3JzO1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVDb2xvcnMoKTtcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgc21lbGxzIG9mIGluZWZmaWNpZW5jeSwgbWlnaHQgbmVlZCB0byByZXZpc2l0IHRoaXNcclxuICAgIGlmICh0aGlzLmNvbG9ycyAmJiB0aGlzLmNvbG9ycy5maWx0ZXIoKHgsIGkpID0+ICF0aGlzLmNvbG9yc0VxdWFsKHgsIHRoaXMub2xkLmNvbG9yc1tpXSkpLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLm9sZC5jb2xvcnMgPSB0aGlzLmNvbG9ycy5tYXAoeCA9PiB0aGlzLmNvcHlDb2xvcih4KSk7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZUNvbG9ycygpO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhdGhpcy5sYWJlbHMgIT09IHRoaXMub2xkLmxhYmVsc0V4aXN0KSB7XHJcbiAgICAgIHRoaXMub2xkLmxhYmVsc0V4aXN0ID0gISF0aGlzLmxhYmVscztcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmxhYmVscyAmJiB0aGlzLmxhYmVscy5maWx0ZXIoKHgsIGkpID0+ICF0aGlzLmxhYmVsc0VxdWFsKHgsIHRoaXMub2xkLmxhYmVsc1tpXSkpLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLm9sZC5sYWJlbHMgPSB0aGlzLmxhYmVscy5tYXAoeCA9PiB0aGlzLmNvcHlMYWJlbCh4KSk7XHJcblxyXG4gICAgICB3YW50VXBkYXRlKFVwZGF0ZVR5cGUuVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHVwZGF0ZVJlcXVpcmVkIGFzIFVwZGF0ZVR5cGUpIHtcclxuICAgICAgY2FzZSBVcGRhdGVUeXBlLkRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgVXBkYXRlVHlwZS5VcGRhdGU6XHJcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBVcGRhdGVUeXBlLlJlZnJlc2g6XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5TGFiZWwoYTogTGFiZWwpOiBMYWJlbCB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xyXG4gICAgICByZXR1cm4gWy4uLmFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGE7XHJcbiAgfVxyXG5cclxuICBsYWJlbHNFcXVhbChhOiBMYWJlbCwgYjogTGFiZWwpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgICAgICYmIEFycmF5LmlzQXJyYXkoYSkgPT09IEFycmF5LmlzQXJyYXkoYilcclxuICAgICAgJiYgKEFycmF5LmlzQXJyYXkoYSkgfHwgYSA9PT0gYilcclxuICAgICAgJiYgKCFBcnJheS5pc0FycmF5KGEpIHx8IGEubGVuZ3RoID09PSBiLmxlbmd0aClcclxuICAgICAgJiYgKCFBcnJheS5pc0FycmF5KGEpIHx8IGEuZmlsdGVyKCh4LCBpKSA9PiB4ICE9PSBiW2ldKS5sZW5ndGggPT09IDApXHJcbiAgICAgIDtcclxuICB9XHJcblxyXG4gIGNvcHlDb2xvcihhOiBDb2xvcik6IENvbG9yIHtcclxuICAgIGNvbnN0IHJjOiBDb2xvciA9IHtcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBhLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgYm9yZGVyV2lkdGg6IGEuYm9yZGVyV2lkdGgsXHJcbiAgICAgIGJvcmRlckNvbG9yOiBhLmJvcmRlckNvbG9yLFxyXG4gICAgICBib3JkZXJDYXBTdHlsZTogYS5ib3JkZXJDYXBTdHlsZSxcclxuICAgICAgYm9yZGVyRGFzaDogYS5ib3JkZXJEYXNoLFxyXG4gICAgICBib3JkZXJEYXNoT2Zmc2V0OiBhLmJvcmRlckRhc2hPZmZzZXQsXHJcbiAgICAgIGJvcmRlckpvaW5TdHlsZTogYS5ib3JkZXJKb2luU3R5bGUsXHJcbiAgICAgIHBvaW50Qm9yZGVyQ29sb3I6IGEucG9pbnRCb3JkZXJDb2xvcixcclxuICAgICAgcG9pbnRCYWNrZ3JvdW5kQ29sb3I6IGEucG9pbnRCYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgIHBvaW50Qm9yZGVyV2lkdGg6IGEucG9pbnRCb3JkZXJXaWR0aCxcclxuICAgICAgcG9pbnRSYWRpdXM6IGEucG9pbnRSYWRpdXMsXHJcbiAgICAgIHBvaW50SG92ZXJSYWRpdXM6IGEucG9pbnRIb3ZlclJhZGl1cyxcclxuICAgICAgcG9pbnRIaXRSYWRpdXM6IGEucG9pbnRIaXRSYWRpdXMsXHJcbiAgICAgIHBvaW50SG92ZXJCYWNrZ3JvdW5kQ29sb3I6IGEucG9pbnRIb3ZlckJhY2tncm91bmRDb2xvcixcclxuICAgICAgcG9pbnRIb3ZlckJvcmRlckNvbG9yOiBhLnBvaW50SG92ZXJCb3JkZXJDb2xvcixcclxuICAgICAgcG9pbnRIb3ZlckJvcmRlcldpZHRoOiBhLnBvaW50SG92ZXJCb3JkZXJXaWR0aCxcclxuICAgICAgcG9pbnRTdHlsZTogYS5wb2ludFN0eWxlLFxyXG4gICAgICBob3ZlckJhY2tncm91bmRDb2xvcjogYS5ob3ZlckJhY2tncm91bmRDb2xvcixcclxuICAgICAgaG92ZXJCb3JkZXJDb2xvcjogYS5ob3ZlckJvcmRlckNvbG9yLFxyXG4gICAgICBob3ZlckJvcmRlcldpZHRoOiBhLmhvdmVyQm9yZGVyV2lkdGgsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiByYztcclxuICB9XHJcblxyXG4gIGNvbG9yc0VxdWFsKGE6IENvbG9yLCBiOiBDb2xvcikge1xyXG4gICAgaWYgKCFhICE9PSAhYikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIWEgfHwgdHJ1ZVxyXG4gICAgICAmJiAoYS5iYWNrZ3JvdW5kQ29sb3IgPT09IGIuYmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAmJiAoYS5ib3JkZXJXaWR0aCA9PT0gYi5ib3JkZXJXaWR0aClcclxuICAgICAgJiYgKGEuYm9yZGVyQ29sb3IgPT09IGIuYm9yZGVyQ29sb3IpXHJcbiAgICAgICYmIChhLmJvcmRlckNhcFN0eWxlID09PSBiLmJvcmRlckNhcFN0eWxlKVxyXG4gICAgICAmJiAoYS5ib3JkZXJEYXNoID09PSBiLmJvcmRlckRhc2gpXHJcbiAgICAgICYmIChhLmJvcmRlckRhc2hPZmZzZXQgPT09IGIuYm9yZGVyRGFzaE9mZnNldClcclxuICAgICAgJiYgKGEuYm9yZGVySm9pblN0eWxlID09PSBiLmJvcmRlckpvaW5TdHlsZSlcclxuICAgICAgJiYgKGEucG9pbnRCb3JkZXJDb2xvciA9PT0gYi5wb2ludEJvcmRlckNvbG9yKVxyXG4gICAgICAmJiAoYS5wb2ludEJhY2tncm91bmRDb2xvciA9PT0gYi5wb2ludEJhY2tncm91bmRDb2xvcilcclxuICAgICAgJiYgKGEucG9pbnRCb3JkZXJXaWR0aCA9PT0gYi5wb2ludEJvcmRlcldpZHRoKVxyXG4gICAgICAmJiAoYS5wb2ludFJhZGl1cyA9PT0gYi5wb2ludFJhZGl1cylcclxuICAgICAgJiYgKGEucG9pbnRIb3ZlclJhZGl1cyA9PT0gYi5wb2ludEhvdmVyUmFkaXVzKVxyXG4gICAgICAmJiAoYS5wb2ludEhpdFJhZGl1cyA9PT0gYi5wb2ludEhpdFJhZGl1cylcclxuICAgICAgJiYgKGEucG9pbnRIb3ZlckJhY2tncm91bmRDb2xvciA9PT0gYi5wb2ludEhvdmVyQmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAmJiAoYS5wb2ludEhvdmVyQm9yZGVyQ29sb3IgPT09IGIucG9pbnRIb3ZlckJvcmRlckNvbG9yKVxyXG4gICAgICAmJiAoYS5wb2ludEhvdmVyQm9yZGVyV2lkdGggPT09IGIucG9pbnRIb3ZlckJvcmRlcldpZHRoKVxyXG4gICAgICAmJiAoYS5wb2ludFN0eWxlID09PSBiLnBvaW50U3R5bGUpXHJcbiAgICAgICYmIChhLmhvdmVyQmFja2dyb3VuZENvbG9yID09PSBiLmhvdmVyQmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAmJiAoYS5ob3ZlckJvcmRlckNvbG9yID09PSBiLmhvdmVyQm9yZGVyQ29sb3IpXHJcbiAgICAgICYmIChhLmhvdmVyQm9yZGVyV2lkdGggPT09IGIuaG92ZXJCb3JkZXJXaWR0aClcclxuICAgICAgO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ29sb3JzKCkge1xyXG4gICAgdGhpcy5kYXRhc2V0cy5mb3JFYWNoKChlbG0sIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmNvbG9ycyAmJiB0aGlzLmNvbG9yc1tpbmRleF0pIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGVsbSwgdGhpcy5jb2xvcnNbaW5kZXhdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGVsbSwgZ2V0Q29sb3JzKHRoaXMuY2hhcnRUeXBlLCBpbmRleCwgZWxtLmRhdGEubGVuZ3RoKSwgeyAuLi5lbG0gfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGxldCB1cGRhdGVSZXF1aXJlZCA9IFVwZGF0ZVR5cGUuRGVmYXVsdDtcclxuICAgIGNvbnN0IHdhbnRVcGRhdGUgPSAoeDogVXBkYXRlVHlwZSkgPT4ge1xyXG4gICAgICB1cGRhdGVSZXF1aXJlZCA9IHggPiB1cGRhdGVSZXF1aXJlZCA/IHggOiB1cGRhdGVSZXF1aXJlZDtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNoYW5nZXMgYXJlIGluIHRoZSBkYXRhIG9yIGRhdGFzZXRzIG9yIGxhYmVscyBvciBsZWdlbmRcclxuXHJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnZGF0YScpICYmIGNoYW5nZXMuZGF0YS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5wcm9wYWdhdGVEYXRhVG9EYXRhc2V0cyhjaGFuZ2VzLmRhdGEuY3VycmVudFZhbHVlKTtcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdkYXRhc2V0cycpICYmIGNoYW5nZXMuZGF0YXNldHMuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlRGF0YXNldHNUb0RhdGEoY2hhbmdlcy5kYXRhc2V0cy5jdXJyZW50VmFsdWUpO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2xhYmVscycpKSB7XHJcbiAgICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5kYXRhLmxhYmVscyA9IGNoYW5nZXMubGFiZWxzLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2xlZ2VuZCcpKSB7XHJcbiAgICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5jb25maWcub3B0aW9ucy5sZWdlbmQuZGlzcGxheSA9IGNoYW5nZXMubGVnZW5kLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICB0aGlzLmNoYXJ0LmdlbmVyYXRlTGVnZW5kKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpIHtcclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlJlZnJlc2gpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodXBkYXRlUmVxdWlyZWQgYXMgVXBkYXRlVHlwZSkge1xyXG4gICAgICBjYXNlIFVwZGF0ZVR5cGUuVXBkYXRlOlxyXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgVXBkYXRlVHlwZS5SZWZyZXNoOlxyXG4gICAgICBjYXNlIFVwZGF0ZVR5cGUuRGVmYXVsdDpcclxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgIHRoaXMuY2hhcnQuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLmNoYXJ0ID0gdm9pZCAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdWJzLmZvckVhY2goeCA9PiB4LnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZShkdXJhdGlvbj86IGFueSwgbGF6eT86IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hhcnQudXBkYXRlKGR1cmF0aW9uLCBsYXp5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlRGF0YXNldChpbmRleDogbnVtYmVyLCBoaWRkZW46IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaW5kZXgpLmhpZGRlbiA9IGhpZGRlbjtcclxuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEYXRhc2V0SGlkZGVuKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKGluZGV4KS5oaWRkZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9CYXNlNjRJbWFnZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhcnQudG9CYXNlNjRJbWFnZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoYXJ0Q29uZmlndXJhdGlvbigpOiBjaGFydEpzLkNoYXJ0Q29uZmlndXJhdGlvbiB7XHJcbiAgICBjb25zdCBkYXRhc2V0cyA9IHRoaXMuZ2V0RGF0YXNldHMoKTtcclxuXHJcbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcclxuICAgIGlmICh0aGlzLmxlZ2VuZCA9PT0gZmFsc2UpIHtcclxuICAgICAgb3B0aW9ucy5sZWdlbmQgPSB7IGRpc3BsYXk6IGZhbHNlIH07XHJcbiAgICB9XHJcbiAgICAvLyBob29rIGZvciBvbkhvdmVyIGFuZCBvbkNsaWNrIGV2ZW50c1xyXG4gICAgb3B0aW9ucy5ob3ZlciA9IG9wdGlvbnMuaG92ZXIgfHwge307XHJcbiAgICBpZiAoIW9wdGlvbnMuaG92ZXIub25Ib3Zlcikge1xyXG4gICAgICBvcHRpb25zLmhvdmVyLm9uSG92ZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGFjdGl2ZToge31bXSkgPT4ge1xyXG4gICAgICAgIGlmIChhY3RpdmUgJiYgIWFjdGl2ZS5sZW5ndGgpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGFydEhvdmVyLmVtaXQoeyBldmVudCwgYWN0aXZlIH0pO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghb3B0aW9ucy5vbkNsaWNrKSB7XHJcbiAgICAgIG9wdGlvbnMub25DbGljayA9IChldmVudD86IE1vdXNlRXZlbnQsIGFjdGl2ZT86IHt9W10pID0+IHtcclxuICAgICAgICB0aGlzLmNoYXJ0Q2xpY2suZW1pdCh7IGV2ZW50LCBhY3RpdmUgfSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHRoaXMuc21hcnRNZXJnZShvcHRpb25zLCB0aGlzLnRoZW1lU2VydmljZS5nZXRDb2xvcnNjaGVtZXNPcHRpb25zKCkpO1xyXG5cclxuICAgIGNvbnN0IGNoYXJ0Q29uZmlnOiBjaGFydEpzLkNoYXJ0Q29uZmlndXJhdGlvbiA9IHtcclxuICAgICAgdHlwZTogdGhpcy5jaGFydFR5cGUsXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBsYWJlbHM6IHRoaXMubGFiZWxzIHx8IFtdLFxyXG4gICAgICAgIGRhdGFzZXRzXHJcbiAgICAgIH0sXHJcbiAgICAgIHBsdWdpbnM6IHRoaXMucGx1Z2lucyxcclxuICAgICAgb3B0aW9uczogbWVyZ2VkT3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIGNoYXJ0Q29uZmlnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoYXJ0QnVpbGRlcihjdHg6IHN0cmluZy8qLCBkYXRhOmFueVtdLCBvcHRpb25zOmFueSovKTogQ2hhcnQge1xyXG4gICAgY29uc3QgY2hhcnRDb25maWcgPSB0aGlzLmdldENoYXJ0Q29uZmlndXJhdGlvbigpO1xyXG4gICAgcmV0dXJuIG5ldyBjaGFydEpzLkNoYXJ0KGN0eCwgY2hhcnRDb25maWcpO1xyXG4gIH1cclxuXHJcbiAgc21hcnRNZXJnZShvcHRpb25zOiBhbnksIG92ZXJyaWRlczogYW55LCBsZXZlbDogbnVtYmVyID0gMCk6IGFueSB7XHJcbiAgICBpZiAobGV2ZWwgPT09IDApIHtcclxuICAgICAgb3B0aW9ucyA9IF8uY2xvbmVEZWVwKG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qga2V5c1RvVXBkYXRlID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKTtcclxuICAgIGtleXNUb1VwZGF0ZS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG92ZXJyaWRlc1trZXldKSkge1xyXG4gICAgICAgIGNvbnN0IGFycmF5RWxlbWVudHMgPSBvcHRpb25zW2tleV07XHJcbiAgICAgICAgaWYgKGFycmF5RWxlbWVudHMpIHtcclxuICAgICAgICAgIGFycmF5RWxlbWVudHMuZm9yRWFjaChyID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zbWFydE1lcmdlKHIsIG92ZXJyaWRlc1trZXldWzBdLCBsZXZlbCArIDEpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiAob3ZlcnJpZGVzW2tleV0pID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIGlmICghKGtleSBpbiBvcHRpb25zKSkge1xyXG4gICAgICAgICAgb3B0aW9uc1trZXldID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc21hcnRNZXJnZShvcHRpb25zW2tleV0sIG92ZXJyaWRlc1trZXldLCBsZXZlbCArIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9wdGlvbnNba2V5XSA9IG92ZXJyaWRlc1trZXldO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChsZXZlbCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNNdWx0aUxpbmVMYWJlbChsYWJlbDogTGFiZWwpOiBsYWJlbCBpcyBNdWx0aUxpbmVMYWJlbCB7XHJcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShsYWJlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGpvaW5MYWJlbChsYWJlbDogTGFiZWwpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFsYWJlbCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzTXVsdGlMaW5lTGFiZWwobGFiZWwpKSB7XHJcbiAgICAgIHJldHVybiBsYWJlbC5qb2luKCcgJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByb3BhZ2F0ZURhdGFzZXRzVG9EYXRhKGRhdGFzZXRzOiBjaGFydEpzLkNoYXJ0RGF0YVNldHNbXSkge1xyXG4gICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhc2V0cy5tYXAociA9PiByLmRhdGEpO1xyXG4gICAgaWYgKHRoaXMuY2hhcnQpIHtcclxuICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzID0gZGF0YXNldHM7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUNvbG9ycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcm9wYWdhdGVEYXRhVG9EYXRhc2V0cyhuZXdEYXRhVmFsdWVzOiBTaW5nbGVPck11bHRpRGF0YVNldCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNNdWx0aURhdGFTZXQobmV3RGF0YVZhbHVlcykpIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YXNldHMgJiYgbmV3RGF0YVZhbHVlcy5sZW5ndGggPT09IHRoaXMuZGF0YXNldHMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGRhdGFzZXQuZGF0YSA9IG5ld0RhdGFWYWx1ZXNbaV07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9IG5ld0RhdGFWYWx1ZXMubWFwKChkYXRhOiBudW1iZXJbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHsgZGF0YSwgbGFiZWw6IHRoaXMuam9pbkxhYmVsKHRoaXMubGFiZWxzW2luZGV4XSkgfHwgYExhYmVsICR7aW5kZXh9YCB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMgPSB0aGlzLmRhdGFzZXRzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLmRhdGFzZXRzKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9IFt7IGRhdGE6IG5ld0RhdGFWYWx1ZXMgfV07XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhcnQpIHtcclxuICAgICAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cyA9IHRoaXMuZGF0YXNldHM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGF0YXNldHNbMF0uZGF0YSA9IG5ld0RhdGFWYWx1ZXM7XHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cy5zcGxpY2UoMSk7IC8vIFJlbW92ZSBhbGwgZWxlbWVudHMgYnV0IHRoZSBmaXJzdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUNvbG9ycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc011bHRpRGF0YVNldChkYXRhOiBTaW5nbGVPck11bHRpRGF0YVNldCk6IGRhdGEgaXMgTXVsdGlEYXRhU2V0IHtcclxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGFbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhc2V0cygpIHtcclxuICAgIGlmICghdGhpcy5kYXRhc2V0cyAmJiAhdGhpcy5kYXRhKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbmctY2hhcnRzIGNvbmZpZ3VyYXRpb24gZXJyb3IsIGRhdGEgb3IgZGF0YXNldHMgZmllbGQgYXJlIHJlcXVpcmVkIHRvIHJlbmRlciBjaGFydCAke3RoaXMuY2hhcnRUeXBlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIGBkYXRhc2V0c2AgaXMgZGVmaW5lZCwgdXNlIGl0IG92ZXIgdGhlIGBkYXRhYCBwcm9wZXJ0eS5cclxuICAgIGlmICh0aGlzLmRhdGFzZXRzKSB7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlRGF0YXNldHNUb0RhdGEodGhpcy5kYXRhc2V0cyk7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGFzZXRzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGEpIHtcclxuICAgICAgdGhpcy5wcm9wYWdhdGVEYXRhVG9EYXRhc2V0cyh0aGlzLmRhdGEpO1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRhc2V0cztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaCgpIHtcclxuICAgIC8vIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlc3BvbnNpdmUpIHtcclxuICAgIC8vICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlZnJlc2goKSwgNTApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHRvZG86IHJlbW92ZSB0aGlzIGxpbmUsIGl0IGlzIHByb2R1Y2luZyBmbGlja2VyaW5nXHJcbiAgICBpZiAodGhpcy5jaGFydCkge1xyXG4gICAgICB0aGlzLmNoYXJ0LmRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5jaGFydCA9IHZvaWQgMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmN0eCkge1xyXG4gICAgICB0aGlzLmNoYXJ0ID0gdGhpcy5nZXRDaGFydEJ1aWxkZXIodGhpcy5jdHgvKiwgZGF0YSwgdGhpcy5vcHRpb25zKi8pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0= |
@@ -249,3 +249,14 @@ import { Chart } from 'chart.js'; | ||
this.chartHover = new EventEmitter(); | ||
this.initFlag = false; | ||
this.old = { | ||
dataExists: false, | ||
dataLength: 0, | ||
datasetsExists: false, | ||
datasetsLength: 0, | ||
datasetsDataObjects: [], | ||
datasetsDataLengths: [], | ||
colorsExists: false, | ||
colors: [], | ||
labelsExist: false, | ||
labels: [], | ||
}; | ||
this.subs = []; | ||
@@ -273,6 +284,3 @@ } | ||
this.ctx = this.element.nativeElement.getContext('2d'); | ||
this.initFlag = true; | ||
if (this.data || this.datasets) { | ||
this.refresh(); | ||
} | ||
this.refresh(); | ||
this.subs.push(this.themeService.colorschemesOptions.subscribe((/** | ||
@@ -293,49 +301,262 @@ * @param {?} r | ||
/** | ||
* @param {?} changes | ||
* @return {?} | ||
*/ | ||
ngOnChanges(changes) { | ||
if (this.initFlag) { | ||
/** @type {?} */ | ||
let updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
const wantUpdate = (/** | ||
ngDoCheck() { | ||
if (!this.chart) { | ||
return; | ||
} | ||
/** @type {?} */ | ||
let updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
const wantUpdate = (/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
(x) => { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
if (!!this.data !== this.old.dataExists) { | ||
this.propagateDataToDatasets(this.data); | ||
this.old.dataExists = !!this.data; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.data && this.data.length !== this.old.dataLength) { | ||
this.old.dataLength = this.data && this.data.length || 0; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.datasets !== this.old.datasetsExists) { | ||
this.old.datasetsExists = !!this.datasets; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.length !== this.old.datasetsLength) { | ||
this.old.datasetsLength = this.datasets && this.datasets.length || 0; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => x.data !== this.old.datasetsDataObjects[i])).length) { | ||
this.old.datasetsDataObjects = this.datasets.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
(x) => { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
// Check if the changes are in the data or datasets or labels or legend | ||
if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) { | ||
if (changes.data) { | ||
this.updateChartData(changes.data.currentValue); | ||
} | ||
else { | ||
this.updateChartData(changes.datasets.currentValue); | ||
} | ||
wantUpdate(UpdateType.Update); | ||
x => x.data)); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => x.data.length !== this.old.datasetsDataLengths[i])).length) { | ||
this.old.datasetsDataLengths = this.datasets.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
x => x.data.length)); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.colors !== this.old.colorsExists) { | ||
this.old.colorsExists = !!this.colors; | ||
this.updateColors(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
// This smells of inefficiency, might need to revisit this | ||
if (this.colors && this.colors.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => !this.colorsEqual(x, this.old.colors[i]))).length) { | ||
this.old.colors = this.colors.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
x => this.copyColor(x))); | ||
this.updateColors(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.labels !== this.old.labelsExist) { | ||
this.old.labelsExist = !!this.labels; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.labels && this.labels.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => !this.labelsEqual(x, this.old.labels[i]))).length) { | ||
this.old.labels = this.labels.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
x => this.copyLabel(x))); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
switch ((/** @type {?} */ (updateRequired))) { | ||
case UpdateType.Default: | ||
break; | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
this.refresh(); | ||
break; | ||
} | ||
} | ||
/** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
copyLabel(a) { | ||
if (Array.isArray(a)) { | ||
return [...a]; | ||
} | ||
return a; | ||
} | ||
/** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
labelsEqual(a, b) { | ||
return Array.isArray(a) === Array.isArray(b) | ||
&& (Array.isArray(a) || a === b) | ||
&& (!Array.isArray(a) || a.length === b.length) | ||
&& (!Array.isArray(a) || a.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(x, i) => x !== b[i])).length === 0); | ||
} | ||
/** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
copyColor(a) { | ||
/** @type {?} */ | ||
const rc = { | ||
backgroundColor: a.backgroundColor, | ||
borderWidth: a.borderWidth, | ||
borderColor: a.borderColor, | ||
borderCapStyle: a.borderCapStyle, | ||
borderDash: a.borderDash, | ||
borderDashOffset: a.borderDashOffset, | ||
borderJoinStyle: a.borderJoinStyle, | ||
pointBorderColor: a.pointBorderColor, | ||
pointBackgroundColor: a.pointBackgroundColor, | ||
pointBorderWidth: a.pointBorderWidth, | ||
pointRadius: a.pointRadius, | ||
pointHoverRadius: a.pointHoverRadius, | ||
pointHitRadius: a.pointHitRadius, | ||
pointHoverBackgroundColor: a.pointHoverBackgroundColor, | ||
pointHoverBorderColor: a.pointHoverBorderColor, | ||
pointHoverBorderWidth: a.pointHoverBorderWidth, | ||
pointStyle: a.pointStyle, | ||
hoverBackgroundColor: a.hoverBackgroundColor, | ||
hoverBorderColor: a.hoverBorderColor, | ||
hoverBorderWidth: a.hoverBorderWidth, | ||
}; | ||
return rc; | ||
} | ||
/** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
colorsEqual(a, b) { | ||
if (!a !== !b) { | ||
return false; | ||
} | ||
return !a || a.backgroundColor === b.backgroundColor | ||
&& (a.borderWidth === b.borderWidth) | ||
&& (a.borderColor === b.borderColor) | ||
&& (a.borderCapStyle === b.borderCapStyle) | ||
&& (a.borderDash === b.borderDash) | ||
&& (a.borderDashOffset === b.borderDashOffset) | ||
&& (a.borderJoinStyle === b.borderJoinStyle) | ||
&& (a.pointBorderColor === b.pointBorderColor) | ||
&& (a.pointBackgroundColor === b.pointBackgroundColor) | ||
&& (a.pointBorderWidth === b.pointBorderWidth) | ||
&& (a.pointRadius === b.pointRadius) | ||
&& (a.pointHoverRadius === b.pointHoverRadius) | ||
&& (a.pointHitRadius === b.pointHitRadius) | ||
&& (a.pointHoverBackgroundColor === b.pointHoverBackgroundColor) | ||
&& (a.pointHoverBorderColor === b.pointHoverBorderColor) | ||
&& (a.pointHoverBorderWidth === b.pointHoverBorderWidth) | ||
&& (a.pointStyle === b.pointStyle) | ||
&& (a.hoverBackgroundColor === b.hoverBackgroundColor) | ||
&& (a.hoverBorderColor === b.hoverBorderColor) | ||
&& (a.hoverBorderWidth === b.hoverBorderWidth); | ||
} | ||
/** | ||
* @return {?} | ||
*/ | ||
updateColors() { | ||
this.datasets.forEach((/** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
(elm, index) => { | ||
if (this.colors && this.colors[index]) { | ||
Object.assign(elm, this.colors[index]); | ||
} | ||
if (changes.hasOwnProperty('labels')) { | ||
else { | ||
Object.assign(elm, getColors(this.chartType, index, elm.data.length), Object.assign({}, elm)); | ||
} | ||
})); | ||
} | ||
/** | ||
* @param {?} changes | ||
* @return {?} | ||
*/ | ||
ngOnChanges(changes) { | ||
/** @type {?} */ | ||
let updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
const wantUpdate = (/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
(x) => { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
// Check if the changes are in the data or datasets or labels or legend | ||
if (changes.hasOwnProperty('data') && changes.data.currentValue) { | ||
this.propagateDataToDatasets(changes.data.currentValue); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('datasets') && changes.datasets.currentValue) { | ||
this.propagateDatasetsToData(changes.datasets.currentValue); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('labels')) { | ||
if (this.chart) { | ||
this.chart.data.labels = changes.labels.currentValue; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('legend')) { | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('legend')) { | ||
if (this.chart) { | ||
this.chart.config.options.legend.display = changes.legend.currentValue; | ||
this.chart.generateLegend(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('options')) { | ||
wantUpdate(UpdateType.Refresh); | ||
} | ||
switch ((/** @type {?} */ (updateRequired))) { | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
case UpdateType.Default: | ||
this.refresh(); | ||
break; | ||
} | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('options')) { | ||
wantUpdate(UpdateType.Refresh); | ||
} | ||
switch ((/** @type {?} */ (updateRequired))) { | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
case UpdateType.Default: | ||
this.refresh(); | ||
break; | ||
} | ||
} | ||
@@ -362,3 +583,5 @@ /** | ||
update(duration, lazy) { | ||
return this.chart.update(duration, lazy); | ||
if (this.chart) { | ||
return this.chart.update(duration, lazy); | ||
} | ||
} | ||
@@ -388,6 +611,5 @@ /** | ||
/** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
getChartBuilder(ctx /*, data:any[], options:any*/) { | ||
getChartConfiguration() { | ||
/** @type {?} */ | ||
@@ -431,3 +653,3 @@ const datasets = this.getDatasets(); | ||
data: { | ||
labels: this.labels, | ||
labels: this.labels || [], | ||
datasets | ||
@@ -438,2 +660,11 @@ }, | ||
}; | ||
return chartConfig; | ||
} | ||
/** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
getChartBuilder(ctx /*, data:any[], options:any*/) { | ||
/** @type {?} */ | ||
const chartConfig = this.getChartConfiguration(); | ||
return new Chart(ctx, chartConfig); | ||
@@ -487,12 +718,2 @@ } | ||
* @private | ||
* @param {?} v | ||
* @return {?} | ||
*/ | ||
isChartDataSetsArray(v) { | ||
/** @type {?} */ | ||
const elm = v[0]; | ||
return (typeof (elm) === 'object') && 'data' in elm; | ||
} | ||
/** | ||
* @private | ||
* @param {?} label | ||
@@ -522,9 +743,25 @@ * @return {?} | ||
* @private | ||
* @param {?} datasets | ||
* @return {?} | ||
*/ | ||
propagateDatasetsToData(datasets) { | ||
this.data = this.datasets.map((/** | ||
* @param {?} r | ||
* @return {?} | ||
*/ | ||
r => r.data)); | ||
if (this.chart) { | ||
this.chart.data.datasets = datasets; | ||
} | ||
this.updateColors(); | ||
} | ||
/** | ||
* @private | ||
* @param {?} newDataValues | ||
* @return {?} | ||
*/ | ||
updateChartData(newDataValues) { | ||
if (this.isChartDataSetsArray(newDataValues)) { | ||
if (newDataValues.length === this.chart.data.datasets.length) { | ||
this.chart.data.datasets.forEach((/** | ||
propagateDataToDatasets(newDataValues) { | ||
if (this.isMultiDataSet(newDataValues)) { | ||
if (this.datasets && newDataValues.length === this.datasets.length) { | ||
this.datasets.forEach((/** | ||
* @param {?} dataset | ||
@@ -535,20 +772,2 @@ * @param {?} i | ||
(dataset, i) => { | ||
dataset.data = newDataValues[i].data; | ||
if (newDataValues[i].label) { | ||
dataset.label = newDataValues[i].label; | ||
} | ||
})); | ||
} | ||
else { | ||
this.chart.data.datasets = [...newDataValues]; | ||
} | ||
} | ||
else if (!this.isSingleDataSet(newDataValues)) { | ||
if (newDataValues.length === this.chart.data.datasets.length) { | ||
this.chart.data.datasets.forEach((/** | ||
* @param {?} dataset | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
(dataset, i) => { | ||
dataset.data = newDataValues[i]; | ||
@@ -558,3 +777,3 @@ })); | ||
else { | ||
this.chart.data.datasets = newDataValues.map((/** | ||
this.datasets = newDataValues.map((/** | ||
* @param {?} data | ||
@@ -567,20 +786,20 @@ * @param {?} index | ||
})); | ||
if (this.chart) { | ||
this.chart.data.datasets = this.datasets; | ||
} | ||
} | ||
} | ||
else { | ||
this.chart.data.datasets[0].data = newDataValues; | ||
} | ||
this.chart.data.datasets.forEach((/** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
(elm, index) => { | ||
if (this.colors && this.colors[index]) { | ||
Object.assign(elm, this.colors[index]); | ||
if (!this.datasets) { | ||
this.datasets = [{ data: newDataValues }]; | ||
if (this.chart) { | ||
this.chart.data.datasets = this.datasets; | ||
} | ||
} | ||
else { | ||
Object.assign(elm, getColors(this.chartType, index, elm.data.length)); | ||
this.datasets[0].data = newDataValues; | ||
this.datasets.splice(1); // Remove all elements but the first | ||
} | ||
})); | ||
} | ||
this.updateColors(); | ||
} | ||
@@ -592,4 +811,4 @@ /** | ||
*/ | ||
isSingleDataSet(data) { | ||
return !Array.isArray(data[0]); | ||
isMultiDataSet(data) { | ||
return Array.isArray(data[0]); | ||
} | ||
@@ -601,45 +820,14 @@ /** | ||
getDatasets() { | ||
/** @type {?} */ | ||
let datasets = void 0; | ||
// in case if datasets is not provided, but data is present | ||
if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) { | ||
if (!this.isSingleDataSet(this.data)) { | ||
datasets = this.data.map((/** | ||
* @param {?} data | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
(data, index) => { | ||
return { data, label: this.joinLabel(this.labels[index]) || `Label ${index}` }; | ||
})); | ||
} | ||
else { | ||
datasets = [{ data: this.data, label: `Label 0` }]; | ||
} | ||
if (!this.datasets && !this.data) { | ||
throw new Error(`ng-charts configuration error, data or datasets field are required to render chart ${this.chartType}`); | ||
} | ||
if (this.datasets && this.datasets.length || | ||
(datasets && datasets.length)) { | ||
datasets = (this.datasets || datasets) | ||
.map((/** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
(elm, index) => { | ||
/** @type {?} */ | ||
const newElm = Object.assign({}, elm); | ||
if (this.colors && this.colors.length) { | ||
Object.assign(newElm, this.colors[index]); | ||
} | ||
else { | ||
Object.assign(newElm, getColors(this.chartType, index, newElm.data.length)); | ||
} | ||
return newElm; | ||
})); | ||
// If `datasets` is defined, use it over the `data` property. | ||
if (this.datasets) { | ||
this.propagateDatasetsToData(this.datasets); | ||
return this.datasets; | ||
} | ||
if (!datasets) { | ||
throw new Error(`ng-charts configuration error, | ||
data or datasets field are required to render chart ${this.chartType}`); | ||
if (this.data) { | ||
this.propagateDataToDatasets(this.data); | ||
return this.datasets; | ||
} | ||
return datasets; | ||
} | ||
@@ -659,3 +847,5 @@ /** | ||
} | ||
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/); | ||
if (this.ctx) { | ||
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/); | ||
} | ||
} | ||
@@ -662,0 +852,0 @@ } |
@@ -1,4 +0,4 @@ | ||
import { __spread } from 'tslib'; | ||
import { __spread, __assign } from 'tslib'; | ||
import { Chart } from 'chart.js'; | ||
import { Injectable, NgModule, EventEmitter, Directive, ElementRef, Input, Output, defineInjectable } from '@angular/core'; | ||
import { Injectable, NgModule, defineInjectable, EventEmitter, Directive, ElementRef, Input, Output } from '@angular/core'; | ||
import { BehaviorSubject } from 'rxjs'; | ||
@@ -254,3 +254,14 @@ import { cloneDeep } from 'lodash'; | ||
this.chartHover = new EventEmitter(); | ||
this.initFlag = false; | ||
this.old = { | ||
dataExists: false, | ||
dataLength: 0, | ||
datasetsExists: false, | ||
datasetsLength: 0, | ||
datasetsDataObjects: [], | ||
datasetsDataLengths: [], | ||
colorsExists: false, | ||
colors: [], | ||
labelsExist: false, | ||
labels: [], | ||
}; | ||
this.subs = []; | ||
@@ -294,6 +305,3 @@ } | ||
this.ctx = this.element.nativeElement.getContext('2d'); | ||
this.initFlag = true; | ||
if (this.data || this.datasets) { | ||
this.refresh(); | ||
} | ||
this.refresh(); | ||
this.subs.push(this.themeService.colorschemesOptions.subscribe((/** | ||
@@ -319,2 +327,240 @@ * @param {?} r | ||
/** | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.ngDoCheck = /** | ||
* @return {?} | ||
*/ | ||
function () { | ||
var _this = this; | ||
if (!this.chart) { | ||
return; | ||
} | ||
/** @type {?} */ | ||
var updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
var wantUpdate = (/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
function (x) { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
if (!!this.data !== this.old.dataExists) { | ||
this.propagateDataToDatasets(this.data); | ||
this.old.dataExists = !!this.data; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.data && this.data.length !== this.old.dataLength) { | ||
this.old.dataLength = this.data && this.data.length || 0; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.datasets !== this.old.datasetsExists) { | ||
this.old.datasetsExists = !!this.datasets; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.length !== this.old.datasetsLength) { | ||
this.old.datasetsLength = this.datasets && this.datasets.length || 0; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
function (x, i) { return x.data !== _this.old.datasetsDataObjects[i]; })).length) { | ||
this.old.datasetsDataObjects = this.datasets.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
function (x) { return x.data; })); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.datasets && this.datasets.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
function (x, i) { return x.data.length !== _this.old.datasetsDataLengths[i]; })).length) { | ||
this.old.datasetsDataLengths = this.datasets.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
function (x) { return x.data.length; })); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.colors !== this.old.colorsExists) { | ||
this.old.colorsExists = !!this.colors; | ||
this.updateColors(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
// This smells of inefficiency, might need to revisit this | ||
if (this.colors && this.colors.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
function (x, i) { return !_this.colorsEqual(x, _this.old.colors[i]); })).length) { | ||
this.old.colors = this.colors.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
function (x) { return _this.copyColor(x); })); | ||
this.updateColors(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (!!this.labels !== this.old.labelsExist) { | ||
this.old.labelsExist = !!this.labels; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (this.labels && this.labels.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
function (x, i) { return !_this.labelsEqual(x, _this.old.labels[i]); })).length) { | ||
this.old.labels = this.labels.map((/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
function (x) { return _this.copyLabel(x); })); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
switch ((/** @type {?} */ (updateRequired))) { | ||
case UpdateType.Default: | ||
break; | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
this.refresh(); | ||
break; | ||
} | ||
}; | ||
/** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.copyLabel = /** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
function (a) { | ||
if (Array.isArray(a)) { | ||
return __spread(a); | ||
} | ||
return a; | ||
}; | ||
/** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.labelsEqual = /** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
function (a, b) { | ||
return Array.isArray(a) === Array.isArray(b) | ||
&& (Array.isArray(a) || a === b) | ||
&& (!Array.isArray(a) || a.length === b.length) | ||
&& (!Array.isArray(a) || a.filter((/** | ||
* @param {?} x | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
function (x, i) { return x !== b[i]; })).length === 0); | ||
}; | ||
/** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.copyColor = /** | ||
* @param {?} a | ||
* @return {?} | ||
*/ | ||
function (a) { | ||
/** @type {?} */ | ||
var rc = { | ||
backgroundColor: a.backgroundColor, | ||
borderWidth: a.borderWidth, | ||
borderColor: a.borderColor, | ||
borderCapStyle: a.borderCapStyle, | ||
borderDash: a.borderDash, | ||
borderDashOffset: a.borderDashOffset, | ||
borderJoinStyle: a.borderJoinStyle, | ||
pointBorderColor: a.pointBorderColor, | ||
pointBackgroundColor: a.pointBackgroundColor, | ||
pointBorderWidth: a.pointBorderWidth, | ||
pointRadius: a.pointRadius, | ||
pointHoverRadius: a.pointHoverRadius, | ||
pointHitRadius: a.pointHitRadius, | ||
pointHoverBackgroundColor: a.pointHoverBackgroundColor, | ||
pointHoverBorderColor: a.pointHoverBorderColor, | ||
pointHoverBorderWidth: a.pointHoverBorderWidth, | ||
pointStyle: a.pointStyle, | ||
hoverBackgroundColor: a.hoverBackgroundColor, | ||
hoverBorderColor: a.hoverBorderColor, | ||
hoverBorderWidth: a.hoverBorderWidth, | ||
}; | ||
return rc; | ||
}; | ||
/** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.colorsEqual = /** | ||
* @param {?} a | ||
* @param {?} b | ||
* @return {?} | ||
*/ | ||
function (a, b) { | ||
if (!a !== !b) { | ||
return false; | ||
} | ||
return !a || a.backgroundColor === b.backgroundColor | ||
&& (a.borderWidth === b.borderWidth) | ||
&& (a.borderColor === b.borderColor) | ||
&& (a.borderCapStyle === b.borderCapStyle) | ||
&& (a.borderDash === b.borderDash) | ||
&& (a.borderDashOffset === b.borderDashOffset) | ||
&& (a.borderJoinStyle === b.borderJoinStyle) | ||
&& (a.pointBorderColor === b.pointBorderColor) | ||
&& (a.pointBackgroundColor === b.pointBackgroundColor) | ||
&& (a.pointBorderWidth === b.pointBorderWidth) | ||
&& (a.pointRadius === b.pointRadius) | ||
&& (a.pointHoverRadius === b.pointHoverRadius) | ||
&& (a.pointHitRadius === b.pointHitRadius) | ||
&& (a.pointHoverBackgroundColor === b.pointHoverBackgroundColor) | ||
&& (a.pointHoverBorderColor === b.pointHoverBorderColor) | ||
&& (a.pointHoverBorderWidth === b.pointHoverBorderWidth) | ||
&& (a.pointStyle === b.pointStyle) | ||
&& (a.hoverBackgroundColor === b.hoverBackgroundColor) | ||
&& (a.hoverBorderColor === b.hoverBorderColor) | ||
&& (a.hoverBorderWidth === b.hoverBorderWidth); | ||
}; | ||
/** | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.updateColors = /** | ||
* @return {?} | ||
*/ | ||
function () { | ||
var _this = this; | ||
this.datasets.forEach((/** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
function (elm, index) { | ||
if (_this.colors && _this.colors[index]) { | ||
Object.assign(elm, _this.colors[index]); | ||
} | ||
else { | ||
Object.assign(elm, getColors(_this.chartType, index, elm.data.length), __assign({}, elm)); | ||
} | ||
})); | ||
}; | ||
/** | ||
* @param {?} changes | ||
@@ -328,45 +574,46 @@ * @return {?} | ||
function (changes) { | ||
if (this.initFlag) { | ||
/** @type {?} */ | ||
var updateRequired_1 = UpdateType.Default; | ||
/** @type {?} */ | ||
var wantUpdate = (/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
function (x) { | ||
updateRequired_1 = x > updateRequired_1 ? x : updateRequired_1; | ||
}); | ||
// Check if the changes are in the data or datasets or labels or legend | ||
if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) { | ||
if (changes.data) { | ||
this.updateChartData(changes.data.currentValue); | ||
} | ||
else { | ||
this.updateChartData(changes.datasets.currentValue); | ||
} | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('labels')) { | ||
/** @type {?} */ | ||
var updateRequired = UpdateType.Default; | ||
/** @type {?} */ | ||
var wantUpdate = (/** | ||
* @param {?} x | ||
* @return {?} | ||
*/ | ||
function (x) { | ||
updateRequired = x > updateRequired ? x : updateRequired; | ||
}); | ||
// Check if the changes are in the data or datasets or labels or legend | ||
if (changes.hasOwnProperty('data') && changes.data.currentValue) { | ||
this.propagateDataToDatasets(changes.data.currentValue); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('datasets') && changes.datasets.currentValue) { | ||
this.propagateDatasetsToData(changes.datasets.currentValue); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('labels')) { | ||
if (this.chart) { | ||
this.chart.data.labels = changes.labels.currentValue; | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('legend')) { | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('legend')) { | ||
if (this.chart) { | ||
this.chart.config.options.legend.display = changes.legend.currentValue; | ||
this.chart.generateLegend(); | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('options')) { | ||
wantUpdate(UpdateType.Refresh); | ||
} | ||
switch ((/** @type {?} */ (updateRequired_1))) { | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
case UpdateType.Default: | ||
this.refresh(); | ||
break; | ||
} | ||
wantUpdate(UpdateType.Update); | ||
} | ||
if (changes.hasOwnProperty('options')) { | ||
wantUpdate(UpdateType.Refresh); | ||
} | ||
switch ((/** @type {?} */ (updateRequired))) { | ||
case UpdateType.Update: | ||
this.update(); | ||
break; | ||
case UpdateType.Refresh: | ||
case UpdateType.Default: | ||
this.refresh(); | ||
break; | ||
} | ||
}; | ||
@@ -401,3 +648,5 @@ /** | ||
function (duration, lazy) { | ||
return this.chart.update(duration, lazy); | ||
if (this.chart) { | ||
return this.chart.update(duration, lazy); | ||
} | ||
}; | ||
@@ -439,10 +688,8 @@ /** | ||
/** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.getChartBuilder = /** | ||
* @param {?} ctx | ||
BaseChartDirective.prototype.getChartConfiguration = /** | ||
* @return {?} | ||
*/ | ||
function (ctx /*, data:any[], options:any*/) { | ||
function () { | ||
var _this = this; | ||
@@ -487,3 +734,3 @@ /** @type {?} */ | ||
data: { | ||
labels: this.labels, | ||
labels: this.labels || [], | ||
datasets: datasets | ||
@@ -494,2 +741,15 @@ }, | ||
}; | ||
return chartConfig; | ||
}; | ||
/** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.getChartBuilder = /** | ||
* @param {?} ctx | ||
* @return {?} | ||
*/ | ||
function (ctx /*, data:any[], options:any*/) { | ||
/** @type {?} */ | ||
var chartConfig = this.getChartConfiguration(); | ||
return new Chart(ctx, chartConfig); | ||
@@ -551,17 +811,2 @@ }; | ||
* @private | ||
* @param {?} v | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.isChartDataSetsArray = /** | ||
* @private | ||
* @param {?} v | ||
* @return {?} | ||
*/ | ||
function (v) { | ||
/** @type {?} */ | ||
var elm = v[0]; | ||
return (typeof (elm) === 'object') && 'data' in elm; | ||
}; | ||
/** | ||
* @private | ||
* @param {?} label | ||
@@ -601,6 +846,27 @@ * @return {?} | ||
* @private | ||
* @param {?} datasets | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.propagateDatasetsToData = /** | ||
* @private | ||
* @param {?} datasets | ||
* @return {?} | ||
*/ | ||
function (datasets) { | ||
this.data = this.datasets.map((/** | ||
* @param {?} r | ||
* @return {?} | ||
*/ | ||
function (r) { return r.data; })); | ||
if (this.chart) { | ||
this.chart.data.datasets = datasets; | ||
} | ||
this.updateColors(); | ||
}; | ||
/** | ||
* @private | ||
* @param {?} newDataValues | ||
* @return {?} | ||
*/ | ||
BaseChartDirective.prototype.updateChartData = /** | ||
BaseChartDirective.prototype.propagateDataToDatasets = /** | ||
* @private | ||
@@ -612,5 +878,5 @@ * @param {?} newDataValues | ||
var _this = this; | ||
if (this.isChartDataSetsArray(newDataValues)) { | ||
if (newDataValues.length === this.chart.data.datasets.length) { | ||
this.chart.data.datasets.forEach((/** | ||
if (this.isMultiDataSet(newDataValues)) { | ||
if (this.datasets && newDataValues.length === this.datasets.length) { | ||
this.datasets.forEach((/** | ||
* @param {?} dataset | ||
@@ -621,20 +887,2 @@ * @param {?} i | ||
function (dataset, i) { | ||
dataset.data = newDataValues[i].data; | ||
if (newDataValues[i].label) { | ||
dataset.label = newDataValues[i].label; | ||
} | ||
})); | ||
} | ||
else { | ||
this.chart.data.datasets = __spread(newDataValues); | ||
} | ||
} | ||
else if (!this.isSingleDataSet(newDataValues)) { | ||
if (newDataValues.length === this.chart.data.datasets.length) { | ||
this.chart.data.datasets.forEach((/** | ||
* @param {?} dataset | ||
* @param {?} i | ||
* @return {?} | ||
*/ | ||
function (dataset, i) { | ||
dataset.data = newDataValues[i]; | ||
@@ -644,3 +892,3 @@ })); | ||
else { | ||
this.chart.data.datasets = newDataValues.map((/** | ||
this.datasets = newDataValues.map((/** | ||
* @param {?} data | ||
@@ -653,20 +901,20 @@ * @param {?} index | ||
})); | ||
if (this.chart) { | ||
this.chart.data.datasets = this.datasets; | ||
} | ||
} | ||
} | ||
else { | ||
this.chart.data.datasets[0].data = newDataValues; | ||
} | ||
this.chart.data.datasets.forEach((/** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
function (elm, index) { | ||
if (_this.colors && _this.colors[index]) { | ||
Object.assign(elm, _this.colors[index]); | ||
if (!this.datasets) { | ||
this.datasets = [{ data: newDataValues }]; | ||
if (this.chart) { | ||
this.chart.data.datasets = this.datasets; | ||
} | ||
} | ||
else { | ||
Object.assign(elm, getColors(_this.chartType, index, elm.data.length)); | ||
this.datasets[0].data = newDataValues; | ||
this.datasets.splice(1); // Remove all elements but the first | ||
} | ||
})); | ||
} | ||
this.updateColors(); | ||
}; | ||
@@ -678,3 +926,3 @@ /** | ||
*/ | ||
BaseChartDirective.prototype.isSingleDataSet = /** | ||
BaseChartDirective.prototype.isMultiDataSet = /** | ||
* @private | ||
@@ -685,3 +933,3 @@ * @param {?} data | ||
function (data) { | ||
return !Array.isArray(data[0]); | ||
return Array.isArray(data[0]); | ||
}; | ||
@@ -697,45 +945,14 @@ /** | ||
function () { | ||
var _this = this; | ||
/** @type {?} */ | ||
var datasets = void 0; | ||
// in case if datasets is not provided, but data is present | ||
if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) { | ||
if (!this.isSingleDataSet(this.data)) { | ||
datasets = this.data.map((/** | ||
* @param {?} data | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
function (data, index) { | ||
return { data: data, label: _this.joinLabel(_this.labels[index]) || "Label " + index }; | ||
})); | ||
} | ||
else { | ||
datasets = [{ data: this.data, label: "Label 0" }]; | ||
} | ||
if (!this.datasets && !this.data) { | ||
throw new Error("ng-charts configuration error, data or datasets field are required to render chart " + this.chartType); | ||
} | ||
if (this.datasets && this.datasets.length || | ||
(datasets && datasets.length)) { | ||
datasets = (this.datasets || datasets) | ||
.map((/** | ||
* @param {?} elm | ||
* @param {?} index | ||
* @return {?} | ||
*/ | ||
function (elm, index) { | ||
/** @type {?} */ | ||
var newElm = Object.assign({}, elm); | ||
if (_this.colors && _this.colors.length) { | ||
Object.assign(newElm, _this.colors[index]); | ||
} | ||
else { | ||
Object.assign(newElm, getColors(_this.chartType, index, newElm.data.length)); | ||
} | ||
return newElm; | ||
})); | ||
// If `datasets` is defined, use it over the `data` property. | ||
if (this.datasets) { | ||
this.propagateDatasetsToData(this.datasets); | ||
return this.datasets; | ||
} | ||
if (!datasets) { | ||
throw new Error("ng-charts configuration error,\n data or datasets field are required to render chart " + this.chartType); | ||
if (this.data) { | ||
this.propagateDataToDatasets(this.data); | ||
return this.datasets; | ||
} | ||
return datasets; | ||
}; | ||
@@ -759,3 +976,5 @@ /** | ||
} | ||
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/); | ||
if (this.ctx) { | ||
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/); | ||
} | ||
}; | ||
@@ -762,0 +981,0 @@ BaseChartDirective.decorators = [ |
@@ -1,2 +0,2 @@ | ||
import { OnDestroy, OnChanges, OnInit, EventEmitter, ElementRef, SimpleChanges } from '@angular/core'; | ||
import { OnDestroy, OnChanges, OnInit, EventEmitter, ElementRef, SimpleChanges, DoCheck } from '@angular/core'; | ||
import * as chartJs from 'chart.js'; | ||
@@ -12,3 +12,3 @@ import { Color } from './color'; | ||
export declare type Label = SingleLineLabel | MultiLineLabel; | ||
export declare class BaseChartDirective implements OnDestroy, OnChanges, OnInit, OnDestroy { | ||
export declare class BaseChartDirective implements OnDestroy, OnChanges, OnInit, OnDestroy, DoCheck { | ||
private element; | ||
@@ -34,3 +34,3 @@ private themeService; | ||
chart: Chart; | ||
private initFlag; | ||
private old; | ||
private subs; | ||
@@ -45,2 +45,8 @@ /** | ||
private themeChanged; | ||
ngDoCheck(): void; | ||
copyLabel(a: Label): Label; | ||
labelsEqual(a: Label, b: Label): boolean; | ||
copyColor(a: Color): Color; | ||
colorsEqual(a: Color, b: Color): boolean; | ||
updateColors(): void; | ||
ngOnChanges(changes: SimpleChanges): void; | ||
@@ -52,11 +58,12 @@ ngOnDestroy(): void; | ||
toBase64Image(): string; | ||
getChartConfiguration(): chartJs.ChartConfiguration; | ||
getChartBuilder(ctx: string): Chart; | ||
smartMerge(options: any, overrides: any, level?: number): any; | ||
private isChartDataSetsArray; | ||
private isMultiLineLabel; | ||
private joinLabel; | ||
private updateChartData; | ||
private isSingleDataSet; | ||
private propagateDatasetsToData; | ||
private propagateDataToDatasets; | ||
private isMultiDataSet; | ||
private getDatasets; | ||
private refresh; | ||
} |
@@ -1,1 +0,1 @@ | ||
{"__symbolic":"module","version":4,"metadata":{"ChartsModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":3,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"BaseChartDirective"}],"imports":[],"exports":[{"__symbolic":"reference","name":"BaseChartDirective"}]}]}],"members":{}},"SingleDataSet":{"__symbolic":"interface"},"MultiDataSet":{"__symbolic":"interface"},"SingleOrMultiDataSet":{"__symbolic":"interface"},"PluginServiceGlobalRegistrationAndOptions":{"__symbolic":"interface"},"SingleLineLabel":{"__symbolic":"interface"},"MultiLineLabel":{"__symbolic":"interface"},"Label":{"__symbolic":"interface"},"BaseChartDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":33,"character":1},"arguments":[{"selector":"canvas[baseChart]","exportAs":"base-chart"}]}],"members":{"data":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":39,"character":3}}]}],"datasets":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":40,"character":3}}]}],"labels":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":41,"character":3}}]}],"options":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":42,"character":3}}]}],"chartType":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":43,"character":3}}]}],"colors":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":44,"character":3}}]}],"legend":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":45,"character":3}}]}],"plugins":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":46,"character":3}}]}],"chartClick":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":48,"character":3}}]}],"chartHover":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":49,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":69,"character":21},{"__symbolic":"reference","name":"ThemeService"}]}],"ngOnInit":[{"__symbolic":"method"}],"themeChanged":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"update":[{"__symbolic":"method"}],"hideDataset":[{"__symbolic":"method"}],"isDatasetHidden":[{"__symbolic":"method"}],"toBase64Image":[{"__symbolic":"method"}],"getChartBuilder":[{"__symbolic":"method"}],"smartMerge":[{"__symbolic":"method"}],"isChartDataSetsArray":[{"__symbolic":"method"}],"isMultiLineLabel":[{"__symbolic":"method"}],"joinLabel":[{"__symbolic":"method"}],"updateChartData":[{"__symbolic":"method"}],"isSingleDataSet":[{"__symbolic":"method"}],"getDatasets":[{"__symbolic":"method"}],"refresh":[{"__symbolic":"method"}]}},"Color":{"__symbolic":"interface"},"Colors":{"__symbolic":"interface"},"defaultColors":[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]],"ThemeService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":4,"character":1},"arguments":[{"providedIn":"root"}]}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"setColorschemesOptions":[{"__symbolic":"method"}],"getColorschemesOptions":[{"__symbolic":"method"}]},"statics":{"ngInjectableDef":{}}}},"origins":{"ChartsModule":"./lib/charts.module","SingleDataSet":"./lib/base-chart.directive","MultiDataSet":"./lib/base-chart.directive","SingleOrMultiDataSet":"./lib/base-chart.directive","PluginServiceGlobalRegistrationAndOptions":"./lib/base-chart.directive","SingleLineLabel":"./lib/base-chart.directive","MultiLineLabel":"./lib/base-chart.directive","Label":"./lib/base-chart.directive","BaseChartDirective":"./lib/base-chart.directive","Color":"./lib/color","Colors":"./lib/colors","defaultColors":"./lib/default-colors","ThemeService":"./lib/theme.service"},"importAs":"ng2-charts"} | ||
{"__symbolic":"module","version":4,"metadata":{"ChartsModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":3,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"BaseChartDirective"}],"imports":[],"exports":[{"__symbolic":"reference","name":"BaseChartDirective"}]}]}],"members":{}},"SingleDataSet":{"__symbolic":"interface"},"MultiDataSet":{"__symbolic":"interface"},"SingleOrMultiDataSet":{"__symbolic":"interface"},"PluginServiceGlobalRegistrationAndOptions":{"__symbolic":"interface"},"SingleLineLabel":{"__symbolic":"interface"},"MultiLineLabel":{"__symbolic":"interface"},"Label":{"__symbolic":"interface"},"BaseChartDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":47,"character":1},"arguments":[{"selector":"canvas[baseChart]","exportAs":"base-chart"}]}],"members":{"data":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":53,"character":3}}]}],"datasets":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":54,"character":3}}]}],"labels":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":55,"character":3}}]}],"options":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":56,"character":3}}]}],"chartType":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3}}]}],"colors":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":58,"character":3}}]}],"legend":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":59,"character":3}}]}],"plugins":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3}}]}],"chartClick":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":62,"character":3}}]}],"chartHover":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":63,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":95,"character":21},{"__symbolic":"reference","name":"ThemeService"}]}],"ngOnInit":[{"__symbolic":"method"}],"themeChanged":[{"__symbolic":"method"}],"ngDoCheck":[{"__symbolic":"method"}],"copyLabel":[{"__symbolic":"method"}],"labelsEqual":[{"__symbolic":"method"}],"copyColor":[{"__symbolic":"method"}],"colorsEqual":[{"__symbolic":"method"}],"updateColors":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"update":[{"__symbolic":"method"}],"hideDataset":[{"__symbolic":"method"}],"isDatasetHidden":[{"__symbolic":"method"}],"toBase64Image":[{"__symbolic":"method"}],"getChartConfiguration":[{"__symbolic":"method"}],"getChartBuilder":[{"__symbolic":"method"}],"smartMerge":[{"__symbolic":"method"}],"isMultiLineLabel":[{"__symbolic":"method"}],"joinLabel":[{"__symbolic":"method"}],"propagateDatasetsToData":[{"__symbolic":"method"}],"propagateDataToDatasets":[{"__symbolic":"method"}],"isMultiDataSet":[{"__symbolic":"method"}],"getDatasets":[{"__symbolic":"method"}],"refresh":[{"__symbolic":"method"}]}},"Color":{"__symbolic":"interface"},"Colors":{"__symbolic":"interface"},"defaultColors":[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]],"ThemeService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":4,"character":1},"arguments":[{"providedIn":"root"}]}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"setColorschemesOptions":[{"__symbolic":"method"}],"getColorschemesOptions":[{"__symbolic":"method"}]},"statics":{"ngInjectableDef":{}}}},"origins":{"ChartsModule":"./lib/charts.module","SingleDataSet":"./lib/base-chart.directive","MultiDataSet":"./lib/base-chart.directive","SingleOrMultiDataSet":"./lib/base-chart.directive","PluginServiceGlobalRegistrationAndOptions":"./lib/base-chart.directive","SingleLineLabel":"./lib/base-chart.directive","MultiLineLabel":"./lib/base-chart.directive","Label":"./lib/base-chart.directive","BaseChartDirective":"./lib/base-chart.directive","Color":"./lib/color","Colors":"./lib/colors","defaultColors":"./lib/default-colors","ThemeService":"./lib/theme.service"},"importAs":"ng2-charts"} |
{ | ||
"name": "ng2-charts", | ||
"version": "2.0.4", | ||
"version": "2.1.0", | ||
"peerDependencies": { | ||
@@ -5,0 +5,0 @@ "@angular/common": "^7.2.0", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
484111
5352