@esfaenza/es-charts 11.2.15 → 11.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/esfaenza-es-charts.umd.js +80 -33
- package/bundles/esfaenza-es-charts.umd.js.map +1 -1
- package/bundles/esfaenza-es-charts.umd.min.js +1 -1
- package/bundles/esfaenza-es-charts.umd.min.js.map +1 -1
- package/esfaenza-es-charts.metadata.json +1 -1
- package/esm2015/lib/components/base/base-chart.component.js +16 -3
- package/esm2015/lib/services/classes/LineChartService.js +66 -32
- package/fesm2015/esfaenza-es-charts.js +80 -33
- package/fesm2015/esfaenza-es-charts.js.map +1 -1
- package/lib/components/base/base-chart.component.d.ts +9 -0
- package/lib/services/classes/LineChartService.d.ts +4 -0
- package/package.json +3 -3
|
@@ -705,6 +705,11 @@ class BaseChartComponent {
|
|
|
705
705
|
* Evento lanciato al termine del caricamento di una nuova pagina del grafico
|
|
706
706
|
*/
|
|
707
707
|
this.onLoadEnd = new EventEmitter();
|
|
708
|
+
/**
|
|
709
|
+
* Evento lanciato al termine della creazione del grafico referenziando l'istanza nativa del grafico creato in modo da poter effettuare modifiche
|
|
710
|
+
* post inizializzazione lato applicativo
|
|
711
|
+
*/
|
|
712
|
+
this.chartLoaded = new EventEmitter();
|
|
708
713
|
/**
|
|
709
714
|
* Serve a decidere se sarà presente l'interfaccia di paginazione
|
|
710
715
|
*/
|
|
@@ -793,7 +798,7 @@ class BaseChartComponent {
|
|
|
793
798
|
this.Chart = this.ChartService.ChartInstance;
|
|
794
799
|
if (!this.Chart)
|
|
795
800
|
this.log("Chart " + this.name + ": Could not create graph");
|
|
796
|
-
return this.Charter.applyLocale(this.Chart, this.Locale).then(() => this.initDone = true);
|
|
801
|
+
return this.Charter.applyLocale(this.Chart, this.Locale).then(() => { this.initDone = true; this.chartLoaded.emit(this.Chart); });
|
|
797
802
|
})
|
|
798
803
|
]);
|
|
799
804
|
}
|
|
@@ -889,6 +894,13 @@ class BaseChartComponent {
|
|
|
889
894
|
this.Chart.dispose(); this.Dispatcher.deregisterGraph(this.name); });
|
|
890
895
|
this.Dispatcher.register(this.name, () => { return this.loadChart(); });
|
|
891
896
|
}
|
|
897
|
+
/**
|
|
898
|
+
* Permette di aggiungere un blocco di dati in maniera "live" ad un grafico
|
|
899
|
+
*/
|
|
900
|
+
addData(chartData) {
|
|
901
|
+
this.ChartService.refreshData(chartData);
|
|
902
|
+
}
|
|
903
|
+
;
|
|
892
904
|
/**
|
|
893
905
|
* Funzione che si occupa di caricare i temi necessari per il grafico in oggetto. Prima applica il tema, poi, se serve, applica le animazioni
|
|
894
906
|
*/
|
|
@@ -955,7 +967,8 @@ BaseChartComponent.propDecorators = {
|
|
|
955
967
|
onSelectionChanged: [{ type: Output }],
|
|
956
968
|
onSeriesClicked: [{ type: Output }],
|
|
957
969
|
onLoadStart: [{ type: Output }],
|
|
958
|
-
onLoadEnd: [{ type: Output }]
|
|
970
|
+
onLoadEnd: [{ type: Output }],
|
|
971
|
+
chartLoaded: [{ type: Output }]
|
|
959
972
|
};
|
|
960
973
|
|
|
961
974
|
/**
|
|
@@ -970,6 +983,8 @@ class LineChartService {
|
|
|
970
983
|
this.DataGroupBucketSize = 1500;
|
|
971
984
|
/** @ignore */
|
|
972
985
|
this.OpacityOnSelected = 0.3;
|
|
986
|
+
/** @ignore */
|
|
987
|
+
this.singleDataSet = false;
|
|
973
988
|
//******************** Funzione di throttling per non spammare richieste in caso di animazioni attivate
|
|
974
989
|
//TODO: spostarla in un metodo di utilità (esfaenza/extensions)
|
|
975
990
|
/** @ignore */
|
|
@@ -982,7 +997,7 @@ class LineChartService {
|
|
|
982
997
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
983
998
|
let dataConverted = this.Adapter ? this.Adapter.adaptDataForLineChart(data) : data;
|
|
984
999
|
let threshold = (_a = settings.DataGroupingThreshold) !== null && _a !== void 0 ? _a : 3000;
|
|
985
|
-
|
|
1000
|
+
this.singleDataSet = (_b = settings.MergeDatasets) !== null && _b !== void 0 ? _b : false;
|
|
986
1001
|
let showTicks = settings.ShowTicks == null ? true : settings === null || settings === void 0 ? void 0 : settings.ShowTicks;
|
|
987
1002
|
let dataShouldBeGrouped = Math.max(...dataConverted.series.map(t => t.values.length)) > threshold;
|
|
988
1003
|
let showTimeline = settings.Timeline || dataShouldBeGrouped;
|
|
@@ -1011,6 +1026,7 @@ class LineChartService {
|
|
|
1011
1026
|
range.label.text = dataConverted.limit.upperLabel;
|
|
1012
1027
|
range.label.fill = range.grid.stroke;
|
|
1013
1028
|
range.label.verticalCenter = "bottom";
|
|
1029
|
+
range.label.stroke = am4core.color(dataConverted.limit.upperColor || "#F92200");
|
|
1014
1030
|
range.grid.stroke = am4core.color(dataConverted.limit.upperColor || "#F92200");
|
|
1015
1031
|
range.grid.strokeWidth = 2;
|
|
1016
1032
|
range.grid.strokeOpacity = 1;
|
|
@@ -1022,6 +1038,7 @@ class LineChartService {
|
|
|
1022
1038
|
range.label.text = dataConverted.limit.lowerLabel;
|
|
1023
1039
|
range.label.fill = range.grid.stroke;
|
|
1024
1040
|
range.label.verticalCenter = "bottom";
|
|
1041
|
+
range.label.stroke = am4core.color(dataConverted.limit.lowerColor || "#F92200");
|
|
1025
1042
|
range.grid.stroke = am4core.color(dataConverted.limit.lowerColor || "#F92200");
|
|
1026
1043
|
range.grid.strokeWidth = 2;
|
|
1027
1044
|
range.grid.strokeOpacity = 1;
|
|
@@ -1059,31 +1076,9 @@ class LineChartService {
|
|
|
1059
1076
|
let seriesColors = [];
|
|
1060
1077
|
let defaultIndex = 0;
|
|
1061
1078
|
//-- Generazione di un unico dataset invece che N, per poter gestire un unico tooltip
|
|
1062
|
-
if (singleDataSet) {
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
for (let i = 0; i < vs.values.length; i++) {
|
|
1066
|
-
var dataitem = vs.values[i];
|
|
1067
|
-
var indexer = new Date(dataitem.d).valueOf();
|
|
1068
|
-
if (!dto[indexer])
|
|
1069
|
-
dto[indexer] = {};
|
|
1070
|
-
dto[indexer]['v' + index] = dataitem.v;
|
|
1071
|
-
}
|
|
1072
|
-
});
|
|
1073
|
-
var dates = Object.keys(dto);
|
|
1074
|
-
let singleDS = [];
|
|
1075
|
-
for (let i = 0; i < dates.length; i++) {
|
|
1076
|
-
let values = dto[dates[i]];
|
|
1077
|
-
let item = { d: new Date(parseInt(dates[i])) };
|
|
1078
|
-
var vals = Object.keys(values);
|
|
1079
|
-
for (let ii = 0; ii < vals.length; ii++) {
|
|
1080
|
-
let series = vals[ii];
|
|
1081
|
-
let singleVal = values[series];
|
|
1082
|
-
item[series] = singleVal;
|
|
1083
|
-
}
|
|
1084
|
-
singleDS.push(item);
|
|
1085
|
-
}
|
|
1086
|
-
this.ChartInstance.data = singleDS;
|
|
1079
|
+
if (this.singleDataSet) {
|
|
1080
|
+
this.ChartInstance.data = this.generateSingleDataset(dataConverted);
|
|
1081
|
+
;
|
|
1087
1082
|
dateAxis.cursorTooltipEnabled = false;
|
|
1088
1083
|
}
|
|
1089
1084
|
//-- Fine generazione
|
|
@@ -1107,14 +1102,14 @@ class LineChartService {
|
|
|
1107
1102
|
s.values.sort((d1, d2) => d1.d.getTime() - d2.d.getTime());
|
|
1108
1103
|
let fill = s.fill != null && s.fill != undefined ? s.fill : ((_a = settings === null || settings === void 0 ? void 0 : settings.Fill) !== null && _a !== void 0 ? _a : false);
|
|
1109
1104
|
let series = (settings === null || settings === void 0 ? void 0 : settings.Step) ? new am4charts.StepLineSeries() : new am4charts.LineSeries();
|
|
1110
|
-
series.dataFields.valueY = "v" + (singleDataSet ? index : "");
|
|
1105
|
+
series.dataFields.valueY = "v" + (this.singleDataSet ? index : "");
|
|
1111
1106
|
series.dataFields.dateX = "d";
|
|
1112
1107
|
series.dataFields.measureUnit = s.uom;
|
|
1113
1108
|
series.name = s.name;
|
|
1114
1109
|
series.strokeWidth = (_b = settings === null || settings === void 0 ? void 0 : settings.StrokeSize) !== null && _b !== void 0 ? _b : 1;
|
|
1115
1110
|
series.connect = !gapsAllowed;
|
|
1116
1111
|
series.minBulletDistance = 10;
|
|
1117
|
-
series.tooltipText = singleDataSet ? "" : "{name}: [bold]{valueY}[/]";
|
|
1112
|
+
series.tooltipText = this.singleDataSet ? "" : "{name}: [bold]{valueY}[/]";
|
|
1118
1113
|
series.tooltip.pointerOrientation = "vertical";
|
|
1119
1114
|
series.tooltip.background.fillOpacity = 0.5;
|
|
1120
1115
|
series.tooltip.label.padding(12, 12, 12, 12);
|
|
@@ -1122,7 +1117,7 @@ class LineChartService {
|
|
|
1122
1117
|
series.stacked = fill;
|
|
1123
1118
|
//Dataset singolo, i dati sono registrati a livello di chart, creo il tooltip che permette di vederli tutti insieme
|
|
1124
1119
|
//altrimenti assegno i dati della serie direttamente alla serie
|
|
1125
|
-
if (singleDataSet) {
|
|
1120
|
+
if (this.singleDataSet) {
|
|
1126
1121
|
series.tooltip.getFillFromObject = false;
|
|
1127
1122
|
series.tooltip.background.fill = am4core.color("#eee");
|
|
1128
1123
|
series.tooltip.label.fill = am4core.color("#00");
|
|
@@ -1212,7 +1207,7 @@ class LineChartService {
|
|
|
1212
1207
|
//******************************************************************************************************************************
|
|
1213
1208
|
this.ChartInstance.cursor.xAxis = dateAxis;
|
|
1214
1209
|
this.ChartInstance.cursor.yAxis = yAxis;
|
|
1215
|
-
if (singleDataSet)
|
|
1210
|
+
if (this.singleDataSet)
|
|
1216
1211
|
this.ChartInstance.cursor.maxTooltipDistance = -1;
|
|
1217
1212
|
//TODO: Cercare di capire perché è figlio di puttana......
|
|
1218
1213
|
dateAxis.events.on("startchanged", t => this.emitSelectionChanged(t, settings));
|
|
@@ -1221,7 +1216,59 @@ class LineChartService {
|
|
|
1221
1216
|
}
|
|
1222
1217
|
/** @ignore */
|
|
1223
1218
|
refreshData(data) {
|
|
1224
|
-
|
|
1219
|
+
let dataConverted = this.Adapter ? this.Adapter.adaptDataForLineChart(data) : data;
|
|
1220
|
+
if (this.singleDataSet) {
|
|
1221
|
+
var data = this.generateSingleDataset(dataConverted);
|
|
1222
|
+
this.ChartInstance.addData(data);
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
this.ChartInstance.series.each(s => {
|
|
1226
|
+
var relativeSerie = dataConverted.series.find(t => t.name == s.name);
|
|
1227
|
+
// Una serie del grafico è stata ggiornata, ordino i datapoint e li aggiungo
|
|
1228
|
+
var correctOrder = true;
|
|
1229
|
+
var prevDate = null;
|
|
1230
|
+
for (let v = 0; v < relativeSerie.values.length; v++) {
|
|
1231
|
+
if (!prevDate)
|
|
1232
|
+
prevDate = relativeSerie.values[v].d;
|
|
1233
|
+
else if (relativeSerie.values[v].d < prevDate) {
|
|
1234
|
+
correctOrder = false;
|
|
1235
|
+
break;
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
if (!correctOrder)
|
|
1239
|
+
relativeSerie.values.sort((d1, d2) => d1.d.getTime() - d2.d.getTime());
|
|
1240
|
+
for (let v = 0; v < relativeSerie.values.length; v++) {
|
|
1241
|
+
let obj = relativeSerie.values[v];
|
|
1242
|
+
s.addData({ date: obj.d, value: obj.v });
|
|
1243
|
+
}
|
|
1244
|
+
});
|
|
1245
|
+
}
|
|
1246
|
+
/** Partendo da dati divisi per seriue genera un dataset unito con la data come chiave e i vari valori dopo */
|
|
1247
|
+
generateSingleDataset(data) {
|
|
1248
|
+
let dto = {};
|
|
1249
|
+
data.series.forEach((vs, index) => {
|
|
1250
|
+
for (let i = 0; i < vs.values.length; i++) {
|
|
1251
|
+
var dataitem = vs.values[i];
|
|
1252
|
+
var indexer = new Date(dataitem.d).valueOf();
|
|
1253
|
+
if (!dto[indexer])
|
|
1254
|
+
dto[indexer] = {};
|
|
1255
|
+
dto[indexer]['v' + index] = dataitem.v;
|
|
1256
|
+
}
|
|
1257
|
+
});
|
|
1258
|
+
var dates = Object.keys(dto);
|
|
1259
|
+
var ret = [];
|
|
1260
|
+
for (let i = 0; i < dates.length; i++) {
|
|
1261
|
+
let values = dto[dates[i]];
|
|
1262
|
+
let item = { d: new Date(parseInt(dates[i])) };
|
|
1263
|
+
var vals = Object.keys(values);
|
|
1264
|
+
for (let ii = 0; ii < vals.length; ii++) {
|
|
1265
|
+
let series = vals[ii];
|
|
1266
|
+
let singleVal = values[series];
|
|
1267
|
+
item[series] = singleVal;
|
|
1268
|
+
}
|
|
1269
|
+
ret.push(item);
|
|
1270
|
+
}
|
|
1271
|
+
return ret;
|
|
1225
1272
|
}
|
|
1226
1273
|
/** @ignore */
|
|
1227
1274
|
emitSelectionChanged(ev, settings) {
|