@esfaenza/es-charts 13.1.3 → 13.1.4

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.
@@ -797,6 +797,11 @@ class BaseChartComponent {
797
797
  * Evento lanciato al termine del caricamento di una nuova pagina del grafico
798
798
  */
799
799
  this.onLoadEnd = new EventEmitter();
800
+ /**
801
+ * Evento lanciato al termine della creazione del grafico referenziando l'istanza nativa del grafico creato in modo da poter effettuare modifiche
802
+ * post inizializzazione lato applicativo
803
+ */
804
+ this.chartLoaded = new EventEmitter();
800
805
  /**
801
806
  * Serve a decidere se sarà presente l'interfaccia di paginazione
802
807
  */
@@ -884,7 +889,7 @@ class BaseChartComponent {
884
889
  this.Chart = this.ChartService.ChartInstance;
885
890
  if (!this.Chart)
886
891
  this.log("Chart " + this.name + ": Could not create graph");
887
- return this.Charter.applyLocale(this.Chart, this.Locale).then(() => this.initDone = true);
892
+ return this.Charter.applyLocale(this.Chart, this.Locale).then(() => { this.initDone = true; this.chartLoaded.emit(this); });
888
893
  })
889
894
  ]);
890
895
  }
@@ -979,6 +984,13 @@ class BaseChartComponent {
979
984
  this.Chart.dispose(); this.Dispatcher.deregisterGraph(this.name); });
980
985
  this.Dispatcher.register(this.name, () => { return this.loadChart(); });
981
986
  }
987
+ /**
988
+ * Permette di aggiungere un blocco di dati in maniera "live" ad un grafico
989
+ */
990
+ addData(chartData) {
991
+ this.ChartService.refreshData(chartData);
992
+ }
993
+ ;
982
994
  /**
983
995
  * Funzione che si occupa di caricare i temi necessari per il grafico in oggetto. Prima applica il tema, poi, se serve, applica le animazioni
984
996
  */
@@ -1008,7 +1020,7 @@ class BaseChartComponent {
1008
1020
  }
1009
1021
  }
1010
1022
  BaseChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseChartComponent, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
1011
- BaseChartComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: BaseChartComponent, inputs: { XTitle: "XTitle", YTitle: "YTitle", Settings: "Settings", Legend: "Legend", LegendPosition: "LegendPosition", Timeline: "Timeline", name: "name", Animations: "Animations", Theme: "Theme", Locale: "Locale", HideSeriesOnLabelClick: "HideSeriesOnLabelClick", MinGridDistance: "MinGridDistance", AdaptLabelSizeAndOrientation: "AdaptLabelSizeAndOrientation", LegendPadding: "LegendPadding", DataDtos: "DataDtos", DataDtoStartIndex: "DataDtoStartIndex", DataRetrieve: "DataRetrieve", BrowseDelayMs: "BrowseDelayMs" }, outputs: { onSelectionChanged: "onSelectionChanged", onSeriesClicked: "onSeriesClicked", onLoadStart: "onLoadStart", onLoadEnd: "onLoadEnd" }, queries: [{ propertyName: "header_tr", first: true, predicate: ["header"], descendants: true }, { propertyName: "loading_template", first: true, predicate: ["loading"], descendants: true }], usesOnChanges: true, ngImport: i0 });
1023
+ BaseChartComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: BaseChartComponent, inputs: { XTitle: "XTitle", YTitle: "YTitle", Settings: "Settings", Legend: "Legend", LegendPosition: "LegendPosition", Timeline: "Timeline", name: "name", Animations: "Animations", Theme: "Theme", Locale: "Locale", HideSeriesOnLabelClick: "HideSeriesOnLabelClick", MinGridDistance: "MinGridDistance", AdaptLabelSizeAndOrientation: "AdaptLabelSizeAndOrientation", LegendPadding: "LegendPadding", DataDtos: "DataDtos", DataDtoStartIndex: "DataDtoStartIndex", DataRetrieve: "DataRetrieve", BrowseDelayMs: "BrowseDelayMs" }, outputs: { onSelectionChanged: "onSelectionChanged", onSeriesClicked: "onSeriesClicked", onLoadStart: "onLoadStart", onLoadEnd: "onLoadEnd", chartLoaded: "chartLoaded" }, queries: [{ propertyName: "header_tr", first: true, predicate: ["header"], descendants: true }, { propertyName: "loading_template", first: true, predicate: ["loading"], descendants: true }], usesOnChanges: true, ngImport: i0 });
1012
1024
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseChartComponent, decorators: [{
1013
1025
  type: Directive
1014
1026
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: Object }, { type: i0.NgZone }, { type: ChartLoader }, { type: ChartDispatcher }, { type: undefined }, { type: undefined }, { type: undefined }, { type: undefined }]; }, propDecorators: { XTitle: [{
@@ -1061,6 +1073,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
1061
1073
  type: Output
1062
1074
  }], onLoadEnd: [{
1063
1075
  type: Output
1076
+ }], chartLoaded: [{
1077
+ type: Output
1064
1078
  }] } });
1065
1079
 
1066
1080
  /**
@@ -1075,6 +1089,8 @@ class LineChartService {
1075
1089
  this.DataGroupBucketSize = 1500;
1076
1090
  /** @ignore */
1077
1091
  this.OpacityOnSelected = 0.3;
1092
+ /** @ignore */
1093
+ this.singleDataSet = false;
1078
1094
  //******************** Funzione di throttling per non spammare richieste in caso di animazioni attivate
1079
1095
  //TODO: spostarla in un metodo di utilità (esfaenza/extensions)
1080
1096
  /** @ignore */
@@ -1086,7 +1102,7 @@ class LineChartService {
1086
1102
  graphicate(data, settings) {
1087
1103
  let dataConverted = this.Adapter ? this.Adapter.adaptDataForLineChart(data) : data;
1088
1104
  let threshold = settings.DataGroupingThreshold ?? 3000;
1089
- let singleDataSet = settings.MergeDatasets ?? false;
1105
+ this.singleDataSet = settings.MergeDatasets ?? false;
1090
1106
  let showTicks = settings.ShowTicks == null ? true : settings?.ShowTicks;
1091
1107
  let dataShouldBeGrouped = Math.max(...dataConverted.series.map(t => t.values.length)) > threshold;
1092
1108
  let showTimeline = settings.Timeline || dataShouldBeGrouped;
@@ -1165,31 +1181,9 @@ class LineChartService {
1165
1181
  let seriesColors = [];
1166
1182
  let defaultIndex = 0;
1167
1183
  //-- Generazione di un unico dataset invece che N, per poter gestire un unico tooltip
1168
- if (singleDataSet) {
1169
- let dto = {};
1170
- dataConverted.series.forEach((vs, index) => {
1171
- for (let i = 0; i < vs.values.length; i++) {
1172
- var dataitem = vs.values[i];
1173
- var indexer = new Date(dataitem.d).valueOf();
1174
- if (!dto[indexer])
1175
- dto[indexer] = {};
1176
- dto[indexer]['v' + index] = dataitem.v;
1177
- }
1178
- });
1179
- var dates = Object.keys(dto);
1180
- let singleDS = [];
1181
- for (let i = 0; i < dates.length; i++) {
1182
- let values = dto[dates[i]];
1183
- let item = { d: new Date(parseInt(dates[i])) };
1184
- var vals = Object.keys(values);
1185
- for (let ii = 0; ii < vals.length; ii++) {
1186
- let series = vals[ii];
1187
- let singleVal = values[series];
1188
- item[series] = singleVal;
1189
- }
1190
- singleDS.push(item);
1191
- }
1192
- this.ChartInstance.data = singleDS;
1184
+ if (this.singleDataSet) {
1185
+ this.ChartInstance.data = this.generateSingleDataset(dataConverted);
1186
+ ;
1193
1187
  dateAxis.cursorTooltipEnabled = false;
1194
1188
  }
1195
1189
  //-- Fine generazione
@@ -1212,14 +1206,14 @@ class LineChartService {
1212
1206
  s.values.sort((d1, d2) => d1.d.getTime() - d2.d.getTime());
1213
1207
  let fill = s.fill != null && s.fill != undefined ? s.fill : (settings?.Fill ?? false);
1214
1208
  let series = settings?.Step ? new am4charts.StepLineSeries() : new am4charts.LineSeries();
1215
- series.dataFields.valueY = "v" + (singleDataSet ? index : "");
1209
+ series.dataFields.valueY = "v" + (this.singleDataSet ? index : "");
1216
1210
  series.dataFields.dateX = "d";
1217
1211
  series.dataFields.measureUnit = s.uom;
1218
1212
  series.name = s.name;
1219
1213
  series.strokeWidth = settings?.StrokeSize ?? 1;
1220
1214
  series.connect = !gapsAllowed;
1221
1215
  series.minBulletDistance = 10;
1222
- series.tooltipText = singleDataSet ? "" : "{name}: [bold]{valueY}[/]";
1216
+ series.tooltipText = this.singleDataSet ? "" : "{name}: [bold]{valueY}[/]";
1223
1217
  series.tooltip.pointerOrientation = "vertical";
1224
1218
  series.tooltip.background.fillOpacity = 0.5;
1225
1219
  series.tooltip.label.padding(12, 12, 12, 12);
@@ -1227,7 +1221,7 @@ class LineChartService {
1227
1221
  series.stacked = fill;
1228
1222
  //Dataset singolo, i dati sono registrati a livello di chart, creo il tooltip che permette di vederli tutti insieme
1229
1223
  //altrimenti assegno i dati della serie direttamente alla serie
1230
- if (singleDataSet) {
1224
+ if (this.singleDataSet) {
1231
1225
  series.tooltip.getFillFromObject = false;
1232
1226
  series.tooltip.background.fill = am4core.color("#eee");
1233
1227
  series.tooltip.label.fill = am4core.color("#00");
@@ -1317,7 +1311,7 @@ class LineChartService {
1317
1311
  //******************************************************************************************************************************
1318
1312
  this.ChartInstance.cursor.xAxis = dateAxis;
1319
1313
  this.ChartInstance.cursor.yAxis = yAxis;
1320
- if (singleDataSet)
1314
+ if (this.singleDataSet)
1321
1315
  this.ChartInstance.cursor.maxTooltipDistance = -1;
1322
1316
  //TODO: Cercare di capire perché è figlio di puttana......
1323
1317
  dateAxis.events.on("startchanged", t => this.emitSelectionChanged(t, settings));
@@ -1326,7 +1320,59 @@ class LineChartService {
1326
1320
  }
1327
1321
  /** @ignore */
1328
1322
  refreshData(data) {
1329
- //TODO:IMPL
1323
+ let dataConverted = this.Adapter ? this.Adapter.adaptDataForLineChart(data) : data;
1324
+ if (this.singleDataSet) {
1325
+ var data = this.generateSingleDataset(dataConverted);
1326
+ this.ChartInstance.addData(data);
1327
+ return;
1328
+ }
1329
+ this.ChartInstance.series.each(s => {
1330
+ var relativeSerie = dataConverted.series.find(t => t.name == s.name);
1331
+ // Una serie del grafico è stata ggiornata, ordino i datapoint e li aggiungo
1332
+ var correctOrder = true;
1333
+ var prevDate = null;
1334
+ for (let v = 0; v < relativeSerie.values.length; v++) {
1335
+ if (!prevDate)
1336
+ prevDate = relativeSerie.values[v].d;
1337
+ else if (relativeSerie.values[v].d < prevDate) {
1338
+ correctOrder = false;
1339
+ break;
1340
+ }
1341
+ }
1342
+ if (!correctOrder)
1343
+ relativeSerie.values.sort((d1, d2) => d1.d.getTime() - d2.d.getTime());
1344
+ for (let v = 0; v < relativeSerie.values.length; v++) {
1345
+ let obj = relativeSerie.values[v];
1346
+ s.addData({ date: obj.d, value: obj.v });
1347
+ }
1348
+ });
1349
+ }
1350
+ /** Partendo da dati divisi per seriue genera un dataset unito con la data come chiave e i vari valori dopo */
1351
+ generateSingleDataset(data) {
1352
+ let dto = {};
1353
+ data.series.forEach((vs, index) => {
1354
+ for (let i = 0; i < vs.values.length; i++) {
1355
+ var dataitem = vs.values[i];
1356
+ var indexer = new Date(dataitem.d).valueOf();
1357
+ if (!dto[indexer])
1358
+ dto[indexer] = {};
1359
+ dto[indexer]['v' + index] = dataitem.v;
1360
+ }
1361
+ });
1362
+ var dates = Object.keys(dto);
1363
+ var ret = [];
1364
+ for (let i = 0; i < dates.length; i++) {
1365
+ let values = dto[dates[i]];
1366
+ let item = { d: new Date(parseInt(dates[i])) };
1367
+ var vals = Object.keys(values);
1368
+ for (let ii = 0; ii < vals.length; ii++) {
1369
+ let series = vals[ii];
1370
+ let singleVal = values[series];
1371
+ item[series] = singleVal;
1372
+ }
1373
+ ret.push(item);
1374
+ }
1375
+ return ret;
1330
1376
  }
1331
1377
  /** @ignore */
1332
1378
  emitSelectionChanged(ev, settings) {
@@ -2697,5 +2743,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
2697
2743
  * Generated bundle index. Do not edit.
2698
2744
  */
2699
2745
 
2700
- export { AreaChartData, AreaChartSettings, BaseAdapter, BaseInterval, BaseSettings, ChartThemes, DateValue, EsAreaChartComponent, EsChartComponent, EsChartsModule, EsLineChartComponent, EsPieChartComponent, EsVertical2DChartComponent, EsVerticalChartComponent, EsVerticalStackedChartComponent, KeyValue, KeyValueColor, LegendPad, Limit, LineChartData, LineChartSettings, LineSerie, PageChartSelector, PagedChartData, PieChartData, PieChartSettings, Vertical2DChartData, Vertical2DChartSettings, VerticalChartData, VerticalChartSettings, VerticalStackedChartData, VerticalStackedChartSettings };
2746
+ export { AreaChartData, AreaChartSettings, BaseAdapter, BaseChartComponent, BaseInterval, BaseSettings, ChartThemes, DateValue, EsAreaChartComponent, EsChartComponent, EsChartsModule, EsLineChartComponent, EsPieChartComponent, EsVertical2DChartComponent, EsVerticalChartComponent, EsVerticalStackedChartComponent, KeyValue, KeyValueColor, LegendPad, Limit, LineChartData, LineChartSettings, LineSerie, PageChartSelector, PagedChartData, PieChartData, PieChartSettings, Vertical2DChartData, Vertical2DChartSettings, VerticalChartData, VerticalChartSettings, VerticalStackedChartData, VerticalStackedChartSettings };
2701
2747
  //# sourceMappingURL=esfaenza-es-charts.mjs.map