@esfaenza/es-charts 11.2.18 → 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 +70 -31
- 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 +8 -1
- package/esm2015/lib/services/classes/LineChartService.js +64 -32
- package/fesm2015/esfaenza-es-charts.js +70 -31
- package/fesm2015/esfaenza-es-charts.js.map +1 -1
- package/lib/components/base/base-chart.component.d.ts +4 -0
- package/lib/services/classes/LineChartService.d.ts +4 -0
- package/package.json +1 -1
|
@@ -894,6 +894,13 @@ class BaseChartComponent {
|
|
|
894
894
|
this.Chart.dispose(); this.Dispatcher.deregisterGraph(this.name); });
|
|
895
895
|
this.Dispatcher.register(this.name, () => { return this.loadChart(); });
|
|
896
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
|
+
;
|
|
897
904
|
/**
|
|
898
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
|
|
899
906
|
*/
|
|
@@ -976,6 +983,8 @@ class LineChartService {
|
|
|
976
983
|
this.DataGroupBucketSize = 1500;
|
|
977
984
|
/** @ignore */
|
|
978
985
|
this.OpacityOnSelected = 0.3;
|
|
986
|
+
/** @ignore */
|
|
987
|
+
this.singleDataSet = false;
|
|
979
988
|
//******************** Funzione di throttling per non spammare richieste in caso di animazioni attivate
|
|
980
989
|
//TODO: spostarla in un metodo di utilità (esfaenza/extensions)
|
|
981
990
|
/** @ignore */
|
|
@@ -988,7 +997,7 @@ class LineChartService {
|
|
|
988
997
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
989
998
|
let dataConverted = this.Adapter ? this.Adapter.adaptDataForLineChart(data) : data;
|
|
990
999
|
let threshold = (_a = settings.DataGroupingThreshold) !== null && _a !== void 0 ? _a : 3000;
|
|
991
|
-
|
|
1000
|
+
this.singleDataSet = (_b = settings.MergeDatasets) !== null && _b !== void 0 ? _b : false;
|
|
992
1001
|
let showTicks = settings.ShowTicks == null ? true : settings === null || settings === void 0 ? void 0 : settings.ShowTicks;
|
|
993
1002
|
let dataShouldBeGrouped = Math.max(...dataConverted.series.map(t => t.values.length)) > threshold;
|
|
994
1003
|
let showTimeline = settings.Timeline || dataShouldBeGrouped;
|
|
@@ -1067,31 +1076,9 @@ class LineChartService {
|
|
|
1067
1076
|
let seriesColors = [];
|
|
1068
1077
|
let defaultIndex = 0;
|
|
1069
1078
|
//-- Generazione di un unico dataset invece che N, per poter gestire un unico tooltip
|
|
1070
|
-
if (singleDataSet) {
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
for (let i = 0; i < vs.values.length; i++) {
|
|
1074
|
-
var dataitem = vs.values[i];
|
|
1075
|
-
var indexer = new Date(dataitem.d).valueOf();
|
|
1076
|
-
if (!dto[indexer])
|
|
1077
|
-
dto[indexer] = {};
|
|
1078
|
-
dto[indexer]['v' + index] = dataitem.v;
|
|
1079
|
-
}
|
|
1080
|
-
});
|
|
1081
|
-
var dates = Object.keys(dto);
|
|
1082
|
-
let singleDS = [];
|
|
1083
|
-
for (let i = 0; i < dates.length; i++) {
|
|
1084
|
-
let values = dto[dates[i]];
|
|
1085
|
-
let item = { d: new Date(parseInt(dates[i])) };
|
|
1086
|
-
var vals = Object.keys(values);
|
|
1087
|
-
for (let ii = 0; ii < vals.length; ii++) {
|
|
1088
|
-
let series = vals[ii];
|
|
1089
|
-
let singleVal = values[series];
|
|
1090
|
-
item[series] = singleVal;
|
|
1091
|
-
}
|
|
1092
|
-
singleDS.push(item);
|
|
1093
|
-
}
|
|
1094
|
-
this.ChartInstance.data = singleDS;
|
|
1079
|
+
if (this.singleDataSet) {
|
|
1080
|
+
this.ChartInstance.data = this.generateSingleDataset(dataConverted);
|
|
1081
|
+
;
|
|
1095
1082
|
dateAxis.cursorTooltipEnabled = false;
|
|
1096
1083
|
}
|
|
1097
1084
|
//-- Fine generazione
|
|
@@ -1115,14 +1102,14 @@ class LineChartService {
|
|
|
1115
1102
|
s.values.sort((d1, d2) => d1.d.getTime() - d2.d.getTime());
|
|
1116
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);
|
|
1117
1104
|
let series = (settings === null || settings === void 0 ? void 0 : settings.Step) ? new am4charts.StepLineSeries() : new am4charts.LineSeries();
|
|
1118
|
-
series.dataFields.valueY = "v" + (singleDataSet ? index : "");
|
|
1105
|
+
series.dataFields.valueY = "v" + (this.singleDataSet ? index : "");
|
|
1119
1106
|
series.dataFields.dateX = "d";
|
|
1120
1107
|
series.dataFields.measureUnit = s.uom;
|
|
1121
1108
|
series.name = s.name;
|
|
1122
1109
|
series.strokeWidth = (_b = settings === null || settings === void 0 ? void 0 : settings.StrokeSize) !== null && _b !== void 0 ? _b : 1;
|
|
1123
1110
|
series.connect = !gapsAllowed;
|
|
1124
1111
|
series.minBulletDistance = 10;
|
|
1125
|
-
series.tooltipText = singleDataSet ? "" : "{name}: [bold]{valueY}[/]";
|
|
1112
|
+
series.tooltipText = this.singleDataSet ? "" : "{name}: [bold]{valueY}[/]";
|
|
1126
1113
|
series.tooltip.pointerOrientation = "vertical";
|
|
1127
1114
|
series.tooltip.background.fillOpacity = 0.5;
|
|
1128
1115
|
series.tooltip.label.padding(12, 12, 12, 12);
|
|
@@ -1130,7 +1117,7 @@ class LineChartService {
|
|
|
1130
1117
|
series.stacked = fill;
|
|
1131
1118
|
//Dataset singolo, i dati sono registrati a livello di chart, creo il tooltip che permette di vederli tutti insieme
|
|
1132
1119
|
//altrimenti assegno i dati della serie direttamente alla serie
|
|
1133
|
-
if (singleDataSet) {
|
|
1120
|
+
if (this.singleDataSet) {
|
|
1134
1121
|
series.tooltip.getFillFromObject = false;
|
|
1135
1122
|
series.tooltip.background.fill = am4core.color("#eee");
|
|
1136
1123
|
series.tooltip.label.fill = am4core.color("#00");
|
|
@@ -1220,7 +1207,7 @@ class LineChartService {
|
|
|
1220
1207
|
//******************************************************************************************************************************
|
|
1221
1208
|
this.ChartInstance.cursor.xAxis = dateAxis;
|
|
1222
1209
|
this.ChartInstance.cursor.yAxis = yAxis;
|
|
1223
|
-
if (singleDataSet)
|
|
1210
|
+
if (this.singleDataSet)
|
|
1224
1211
|
this.ChartInstance.cursor.maxTooltipDistance = -1;
|
|
1225
1212
|
//TODO: Cercare di capire perché è figlio di puttana......
|
|
1226
1213
|
dateAxis.events.on("startchanged", t => this.emitSelectionChanged(t, settings));
|
|
@@ -1229,7 +1216,59 @@ class LineChartService {
|
|
|
1229
1216
|
}
|
|
1230
1217
|
/** @ignore */
|
|
1231
1218
|
refreshData(data) {
|
|
1232
|
-
|
|
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;
|
|
1233
1272
|
}
|
|
1234
1273
|
/** @ignore */
|
|
1235
1274
|
emitSelectionChanged(ev, settings) {
|