diff --git a/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java index 0392ec7f25..5fe270dd31 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/audit/AuditLogServiceImpl.java @@ -298,7 +298,7 @@ public class AuditLogServiceImpl implements AuditLogService { AuditLog result = new AuditLog(); UUID id = Uuids.timeBased(); result.setId(new AuditLogId(id)); - result.setCreatedTime(id.timestamp()); + result.setCreatedTime(Uuids.unixTimestamp(id)); result.setTenantId(tenantId); result.setEntityId(entityId); result.setEntityName(entityName); diff --git a/ui-ngx/src/app/core/api/alarm-data-subscription.ts b/ui-ngx/src/app/core/api/alarm-data-subscription.ts index bbdfa46861..3e2570896d 100644 --- a/ui-ngx/src/app/core/api/alarm-data-subscription.ts +++ b/ui-ngx/src/app/core/api/alarm-data-subscription.ts @@ -136,7 +136,7 @@ export class AlarmDataSubscription { this.subscriber.alarmData$.subscribe((alarmDataUpdate) => { if (alarmDataUpdate.data) { - this.onPageData(alarmDataUpdate.data); + this.onPageData(alarmDataUpdate.data, alarmDataUpdate.allowedEntities, alarmDataUpdate.totalEntities); } else if (alarmDataUpdate.update) { this.onDataUpdate(alarmDataUpdate.update); } @@ -151,7 +151,7 @@ export class AlarmDataSubscription { totalElements: 1, totalPages: 1 }; - this.onPageData(pageData); + this.onPageData(pageData, 1024, 1); } } @@ -163,10 +163,10 @@ export class AlarmDataSubscription { } } - private onPageData(pageData: PageData) { + private onPageData(pageData: PageData, allowedEntities: number, totalEntities: number) { this.pageData = pageData; this.resetData(); - this.listener.alarmsLoaded(pageData, this.alarmDataSubscriptionOptions.pageLink); + this.listener.alarmsLoaded(pageData, this.alarmDataSubscriptionOptions.pageLink, allowedEntities, totalEntities); } private onDataUpdate(update: Array) { diff --git a/ui-ngx/src/app/core/api/alarm-data.service.ts b/ui-ngx/src/app/core/api/alarm-data.service.ts index 304b068094..87d3ee02ca 100644 --- a/ui-ngx/src/app/core/api/alarm-data.service.ts +++ b/ui-ngx/src/app/core/api/alarm-data.service.ts @@ -31,7 +31,7 @@ import { deepClone } from '@core/utils'; export interface AlarmDataListener { subscriptionTimewindow?: SubscriptionTimewindow; alarmSource: Datasource; - alarmsLoaded: (pageData: PageData, pageLink: AlarmDataPageLink) => void; + alarmsLoaded: (pageData: PageData, pageLink: AlarmDataPageLink, allowedEntities: number, totalEntities: number) => void; alarmsUpdated: (update: Array, pageData: PageData) => void; subscription?: AlarmDataSubscription; } diff --git a/ui-ngx/src/app/core/api/widget-subscription.ts b/ui-ngx/src/app/core/api/widget-subscription.ts index 51c0a0ee42..54988774aa 100644 --- a/ui-ngx/src/app/core/api/widget-subscription.ts +++ b/ui-ngx/src/app/core/api/widget-subscription.ts @@ -1272,8 +1272,16 @@ export class WidgetSubscription implements IWidgetSubscription { } } - private alarmsLoaded(alarms: PageData) { + private alarmsLoaded(alarms: PageData, allowedEntities: number, totalEntities: number) { this.alarms = alarms; + if (totalEntities > allowedEntities) { + const message = this.ctx.translate.instant('widget.alarm-data-overflow', + { allowedEntities, totalEntities }); + this.onSubscriptionMessage({ + severity: 'warn', + message + }); + } if (this.subscriptionTimewindow && this.subscriptionTimewindow.realtimeWindowMs) { this.updateTimewindow(); } @@ -1281,7 +1289,7 @@ export class WidgetSubscription implements IWidgetSubscription { } private alarmsUpdated(_updated: Array, alarms: PageData) { - this.alarmsLoaded(alarms); + this.alarmsLoaded(alarms, 0, 0); } private updateLegend(dataIndex: number, data: DataSet, detectChanges: boolean) { diff --git a/ui-ngx/src/app/core/ws/telemetry-websocket.service.ts b/ui-ngx/src/app/core/ws/telemetry-websocket.service.ts index 4d94556fff..a79672be74 100644 --- a/ui-ngx/src/app/core/ws/telemetry-websocket.service.ts +++ b/ui-ngx/src/app/core/ws/telemetry-websocket.service.ts @@ -336,11 +336,9 @@ export class TelemetryWebsocketService implements TelemetryService { } private showWsError(errorCode: number, errorMsg: string) { - let message = 'WebSocket Error: '; - if (errorMsg) { - message += errorMsg; - } else { - message += `error code - ${errorCode}.`; + let message = errorMsg; + if (!message) { + message += `WebSocket Error: error code - ${errorCode}.`; } this.store.dispatch(new ActionNotificationShow( { diff --git a/ui-ngx/src/app/shared/models/telemetry/telemetry.models.ts b/ui-ngx/src/app/shared/models/telemetry/telemetry.models.ts index b92f9244db..18858bdbf7 100644 --- a/ui-ngx/src/app/shared/models/telemetry/telemetry.models.ts +++ b/ui-ngx/src/app/shared/models/telemetry/telemetry.models.ts @@ -284,6 +284,8 @@ export interface EntityDataUpdateMsg extends DataUpdateMsg { export interface AlarmDataUpdateMsg extends DataUpdateMsg { dataUpdateType: DataUpdateType.ALARM_DATA; + allowedEntities: number; + totalEntities: number; } export type WebsocketDataMsg = AlarmDataUpdateMsg | EntityDataUpdateMsg | SubscriptionUpdateMsg; @@ -372,8 +374,13 @@ export class EntityDataUpdate extends DataUpdate { } export class AlarmDataUpdate extends DataUpdate { + allowedEntities: number; + totalEntities: number; + constructor(msg: AlarmDataUpdateMsg) { super(msg); + this.allowedEntities = msg.allowedEntities; + this.totalEntities = msg.totalEntities; } } diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index 2c9d64e289..c056f2eaeb 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -1806,7 +1806,8 @@ "undo": "Undo widget changes", "export": "Export widget", "no-data": "No data to display on widget", - "data-overflow": "Widget displays {{count}} out of {{total}} entities" + "data-overflow": "Widget displays {{count}} out of {{total}} entities", + "alarm-data-overflow": "Widget displays alarms for {{allowedEntities}} (maximum allowed) entities out of {{totalEntities}} entities" }, "widget-action": { "header-button": "Widget header button",