@c8y/ngx-components 1022.16.2 → 1022.21.3

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.
Files changed (76) hide show
  1. package/core/asset-property/asset-property.model.d.ts +0 -8
  2. package/core/asset-property/asset-property.model.d.ts.map +1 -1
  3. package/core/authentication/new-password.component.d.ts +3 -2
  4. package/core/authentication/new-password.component.d.ts.map +1 -1
  5. package/core/modal/modal.service.d.ts +1 -0
  6. package/core/modal/modal.service.d.ts.map +1 -1
  7. package/core/user/user-edit-modal.component.d.ts +1 -0
  8. package/core/user/user-edit-modal.component.d.ts.map +1 -1
  9. package/core/user/user-edit.component.d.ts +4 -1
  10. package/core/user/user-edit.component.d.ts.map +1 -1
  11. package/datapoint-explorer/datapoint-explorer.module.d.ts +2 -0
  12. package/datapoint-explorer/datapoint-explorer.module.d.ts.map +1 -1
  13. package/datapoint-explorer/devicemanagement/c8y-ngx-components-datapoint-explorer-devicemanagement.d.ts.map +1 -0
  14. package/datapoint-explorer/devicemanagement/index.d.ts +2 -0
  15. package/datapoint-explorer/devicemanagement/index.d.ts.map +1 -0
  16. package/datapoint-explorer/view/datapoint-explorer.component.d.ts +6 -3
  17. package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -1
  18. package/datapoint-explorer/view/datapoint-explorer.model.d.ts +8 -0
  19. package/datapoint-explorer/view/datapoint-explorer.model.d.ts.map +1 -0
  20. package/datapoint-explorer/view/index.d.ts +1 -0
  21. package/datapoint-explorer/view/index.d.ts.map +1 -1
  22. package/echart/services/chart-realtime.service.d.ts +2 -0
  23. package/echart/services/chart-realtime.service.d.ts.map +1 -1
  24. package/echart/services/echarts-options.service.d.ts +4 -4
  25. package/echart/services/echarts-options.service.d.ts.map +1 -1
  26. package/fesm2022/c8y-ngx-components-datapoint-explorer-devicemanagement.mjs +38 -0
  27. package/fesm2022/c8y-ngx-components-datapoint-explorer-devicemanagement.mjs.map +1 -0
  28. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +143 -142
  29. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  30. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +1 -1
  31. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -1
  32. package/fesm2022/c8y-ngx-components-echart.mjs +53 -17
  33. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  34. package/fesm2022/c8y-ngx-components-time-context.mjs +12 -5
  35. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
  36. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +2 -2
  37. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  38. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +4 -4
  39. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  40. package/fesm2022/c8y-ngx-components.mjs +1152 -1128
  41. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  42. package/locales/de.po +25 -24
  43. package/locales/es.po +6 -3
  44. package/locales/fr.po +36 -33
  45. package/locales/ja_JP.po +75 -70
  46. package/locales/ko.po +6 -3
  47. package/locales/locales.pot +6 -15
  48. package/locales/nl.po +6 -3
  49. package/locales/pl.po +6 -3
  50. package/locales/pt_BR.po +6 -3
  51. package/locales/zh_CN.po +6 -3
  52. package/locales/zh_TW.po +6 -3
  53. package/package.json +1 -1
  54. package/time-context/index.d.ts +1 -0
  55. package/time-context/index.d.ts.map +1 -1
  56. package/time-context/time-context.component.d.ts +6 -3
  57. package/time-context/time-context.component.d.ts.map +1 -1
  58. package/time-context/time-context.model.d.ts +10 -0
  59. package/time-context/time-context.model.d.ts.map +1 -0
  60. package/time-context/time-context.service.d.ts +2 -6
  61. package/time-context/time-context.service.d.ts.map +1 -1
  62. package/device-parameters/c8y-ngx-components-device-parameters.d.ts.map +0 -1
  63. package/device-parameters/device-parameter-details.component.d.ts +0 -22
  64. package/device-parameters/device-parameter-details.component.d.ts.map +0 -1
  65. package/device-parameters/device-parameter-value.component.d.ts +0 -12
  66. package/device-parameters/device-parameter-value.component.d.ts.map +0 -1
  67. package/device-parameters/device-parameters-list.component.d.ts +0 -23
  68. package/device-parameters/device-parameters-list.component.d.ts.map +0 -1
  69. package/device-parameters/device-parameters-tab.guard.d.ts +0 -11
  70. package/device-parameters/device-parameters-tab.guard.d.ts.map +0 -1
  71. package/device-parameters/index.d.ts +0 -7
  72. package/device-parameters/index.d.ts.map +0 -1
  73. package/device-parameters/parameter-type-cell-renderer.components.d.ts +0 -8
  74. package/device-parameters/parameter-type-cell-renderer.components.d.ts.map +0 -1
  75. package/fesm2022/c8y-ngx-components-device-parameters.mjs +0 -215
  76. package/fesm2022/c8y-ngx-components-device-parameters.mjs.map +0 -1
@@ -368,7 +368,7 @@ const ICONS_MAP = {
368
368
  /* eslint-disable @typescript-eslint/no-explicit-any */
369
369
  const INDEX_HTML = '/index.html';
370
370
  class EchartsOptionsService {
371
- constructor(datePipe, yAxisService, chartTypesService, severityIconPipe, severityLabelPipe, translate, router) {
371
+ constructor(datePipe, yAxisService, chartTypesService, severityIconPipe, severityLabelPipe, translate, router, appState) {
372
372
  this.datePipe = datePipe;
373
373
  this.yAxisService = yAxisService;
374
374
  this.chartTypesService = chartTypesService;
@@ -376,6 +376,7 @@ class EchartsOptionsService {
376
376
  this.severityLabelPipe = severityLabelPipe;
377
377
  this.translate = translate;
378
378
  this.router = router;
379
+ this.appState = appState;
379
380
  this.TOOLTIP_WIDTH = 300;
380
381
  }
381
382
  getChartOptions(datapointsWithValues, timeRange, showSplitLines, events, alarms, displayOptions, selectedTimeRange, aggregatedDatapoints, sliderZoomUsed = false) {
@@ -389,6 +390,8 @@ class EchartsOptionsService {
389
390
  const gridLeft = leftAxis.length ? leftAxis.length * this.yAxisService.Y_AXIS_OFFSET : 32;
390
391
  const rightAxis = Array.isArray(yAxis) ? yAxis.filter(yx => yx.position === 'right') : [];
391
392
  const gridRight = rightAxis.length ? rightAxis.length * this.yAxisService.Y_AXIS_OFFSET : 16;
393
+ const currentUser = this.appState.currentUser?.getValue();
394
+ const selectedLanguage = currentUser?.customProperties?.['c8y_UserPreference-language'] || 'en';
392
395
  let intervalInMs = this.calculateExtendedIntervalInMs(selectedTimeRange?.interval || timeRange.interval || 'hours', selectedTimeRange || timeRange);
393
396
  if (sliderZoomUsed) {
394
397
  intervalInMs = this.calculateExtendedIntervalInMs(timeRange.interval || 'hours', timeRange);
@@ -482,7 +485,36 @@ class EchartsOptionsService {
482
485
  axisLabel: {
483
486
  hideOverlap: true,
484
487
  borderWidth: 2, // as there is no margin for labels spacing, transparent border is a workaround
485
- borderColor: 'transparent'
488
+ borderColor: 'transparent',
489
+ formatter: value => {
490
+ const date = new Date(value);
491
+ const locale = selectedLanguage.replace('_', '-');
492
+ const isStartOfMinute = date.getSeconds() === 0;
493
+ const isStartOfDay = date.getHours() === 0 && date.getMinutes() === 0 && date.getSeconds() === 0;
494
+ const isStartOfYear = date.getMonth() === 0 && date.getDate() === 1 && isStartOfDay;
495
+ let options;
496
+ // Case 1: Tick is start of year
497
+ // Shows only the year, e.g. "2025"
498
+ if (isStartOfYear) {
499
+ options = { year: 'numeric' };
500
+ }
501
+ // Case 2: Tick is start of day
502
+ // Shows abbreviated month and day, e.g. "Jan 13"
503
+ else if (isStartOfDay) {
504
+ options = { month: 'short', day: 'numeric' };
505
+ }
506
+ // Case 3: Tick is start of minute
507
+ // Shows hour and minute, e.g. "14:30" (format depends on locale)
508
+ else if (isStartOfMinute) {
509
+ options = { hour: 'numeric', minute: '2-digit' };
510
+ }
511
+ // Case 4: Interval is 1 minute or less
512
+ // Shows seconds, e.g. ":45"
513
+ else {
514
+ options = { second: '2-digit' };
515
+ }
516
+ return new Intl.DateTimeFormat(locale, options).format(date);
517
+ }
486
518
  },
487
519
  splitLine: {
488
520
  show: showSplitLines.XAxis,
@@ -1345,12 +1377,12 @@ class EchartsOptionsService {
1345
1377
  return acc;
1346
1378
  }, null);
1347
1379
  }
1348
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EchartsOptionsService, deps: [{ token: i1$1.DatePipe }, { token: YAxisService }, { token: ChartTypesService }, { token: i4.AlarmSeverityToIconPipe }, { token: i4.AlarmSeverityToLabelPipe }, { token: i5.TranslateService }, { token: i6.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
1380
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EchartsOptionsService, deps: [{ token: i1$1.DatePipe }, { token: YAxisService }, { token: ChartTypesService }, { token: i4.AlarmSeverityToIconPipe }, { token: i4.AlarmSeverityToLabelPipe }, { token: i5.TranslateService }, { token: i6.Router }, { token: i1$1.AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1349
1381
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EchartsOptionsService }); }
1350
1382
  }
1351
1383
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EchartsOptionsService, decorators: [{
1352
1384
  type: Injectable
1353
- }], ctorParameters: () => [{ type: i1$1.DatePipe }, { type: YAxisService }, { type: ChartTypesService }, { type: i4.AlarmSeverityToIconPipe }, { type: i4.AlarmSeverityToLabelPipe }, { type: i5.TranslateService }, { type: i6.Router }] });
1385
+ }], ctorParameters: () => [{ type: i1$1.DatePipe }, { type: YAxisService }, { type: ChartTypesService }, { type: i4.AlarmSeverityToIconPipe }, { type: i4.AlarmSeverityToLabelPipe }, { type: i5.TranslateService }, { type: i6.Router }, { type: i1$1.AppStateService }] });
1354
1386
 
1355
1387
  class ChartRealtimeService {
1356
1388
  constructor(measurementRealtime, alarmRealtimeService, eventRealtimeService, echartsOptionsService) {
@@ -1362,6 +1394,7 @@ class ChartRealtimeService {
1362
1394
  this.MIN_REALTIME_TIMEOUT = 250;
1363
1395
  this.MAX_REALTIME_TIMEOUT = 5_000;
1364
1396
  this.lastMeasurements = new Map();
1397
+ this.pendingAlarmsOrEvents = new Map();
1365
1398
  this.currentAlarms = [];
1366
1399
  this.currentEvents = [];
1367
1400
  }
@@ -1403,7 +1436,7 @@ class ChartRealtimeService {
1403
1436
  dateFrom: this.currentTimeRange.dateFrom.toISOString(),
1404
1437
  dateTo: this.currentTimeRange.dateTo.toISOString()
1405
1438
  });
1406
- interval(this.INTERVAL)
1439
+ this.realtimeIntervalSubscription = interval(this.INTERVAL)
1407
1440
  .pipe(tap(() => {
1408
1441
  const windowSize = this.currentTimeRange.dateTo.valueOf() - this.currentTimeRange.dateFrom.valueOf();
1409
1442
  const now = Date.now();
@@ -1438,7 +1471,16 @@ class ChartRealtimeService {
1438
1471
  this.realtimeSubscriptionMeasurements = measurement$
1439
1472
  .pipe(buffer(bufferReset$))
1440
1473
  .subscribe(measurements => {
1441
- this.updateChartInstance(measurements, null, displayOptions, datapointOutOfSyncCallback);
1474
+ const alarmsOrEvents = Array.from(this.pendingAlarmsOrEvents.values());
1475
+ this.pendingAlarmsOrEvents.clear();
1476
+ if (alarmsOrEvents.length) {
1477
+ alarmsOrEvents.forEach(alarmOrEvent => {
1478
+ this.updateChartInstance(measurements, alarmOrEvent, displayOptions, datapointOutOfSyncCallback);
1479
+ });
1480
+ }
1481
+ else {
1482
+ this.updateChartInstance(measurements, null, displayOptions, datapointOutOfSyncCallback);
1483
+ }
1442
1484
  // Store the last measurements
1443
1485
  measurements.forEach(measurement => {
1444
1486
  this.lastMeasurements.set(measurement.datapoint.fragment, measurement);
@@ -1446,27 +1488,21 @@ class ChartRealtimeService {
1446
1488
  });
1447
1489
  this.realtimeSubscriptionAlarmsEvents = allAlarmsAndEvents$
1448
1490
  .pipe(map(alarmOrEvent => {
1449
- const foundAlarmOrEvent = activeAlarmsOrEvents.find(aOrE => {
1450
- return aOrE.filters.type === alarmOrEvent.type;
1451
- });
1491
+ const foundAlarmOrEvent = activeAlarmsOrEvents.find(aOrE => aOrE.filters.type === alarmOrEvent.type);
1452
1492
  if (foundAlarmOrEvent) {
1453
1493
  alarmOrEvent['color'] = foundAlarmOrEvent.color;
1454
1494
  alarmOrEvent['selectedDatapoint'] = foundAlarmOrEvent.selectedDatapoint;
1495
+ const key = String(alarmOrEvent.id || alarmOrEvent.creationTime);
1496
+ this.pendingAlarmsOrEvents.set(key, alarmOrEvent);
1455
1497
  }
1456
- if (foundAlarmOrEvent) {
1457
- const fragment = alarmOrEvent['selectedDatapoint']?.fragment;
1458
- if (fragment && this.lastMeasurements.has(fragment)) {
1459
- const lastMeasurement = this.lastMeasurements.get(fragment);
1460
- this.updateChartInstance([lastMeasurement], alarmOrEvent, displayOptions, datapointOutOfSyncCallback);
1461
- }
1462
- }
1463
- return foundAlarmOrEvent ? alarmOrEvent : null;
1498
+ return null;
1464
1499
  }))
1465
1500
  .subscribe();
1466
1501
  }
1467
1502
  stopRealtime() {
1468
1503
  this.realtimeSubscriptionMeasurements?.unsubscribe();
1469
1504
  this.realtimeSubscriptionAlarmsEvents?.unsubscribe();
1505
+ this.realtimeIntervalSubscription?.unsubscribe();
1470
1506
  }
1471
1507
  /**
1472
1508
  * Updates the chart with the current alarms and events data. Only used when no active datapoints are selected.