diff --git a/ui-ngx/src/app/core/services/script/node-script-test.service.ts b/ui-ngx/src/app/core/services/script/node-script-test.service.ts index d6272d58b7..600c290edc 100644 --- a/ui-ngx/src/app/core/services/script/node-script-test.service.ts +++ b/ui-ngx/src/app/core/services/script/node-script-test.service.ts @@ -23,6 +23,7 @@ import { NodeScriptTestDialogComponent, NodeScriptTestDialogData } from '@shared/components/dialog/node-script-test-dialog.component'; +import { sortObjectKeys } from '@core/utils'; @Injectable({ providedIn: 'root' @@ -71,10 +72,12 @@ export class NodeScriptTestService { } if (!metadata) { metadata = { - deviceType: 'default', deviceName: 'Test Device', + deviceType: 'default', ts: new Date().getTime() + '' }; + } else { + metadata = sortObjectKeys(metadata); } if (!msgType) { msgType = 'POST_TELEMETRY_REQUEST'; diff --git a/ui-ngx/src/app/core/utils.ts b/ui-ngx/src/app/core/utils.ts index f8ccb6ae61..bf18c2dcae 100644 --- a/ui-ngx/src/app/core/utils.ts +++ b/ui-ngx/src/app/core/utils.ts @@ -510,3 +510,10 @@ export function padValue(val: any, dec: number): string { strVal = (n ? '-' : '') + strVal; return strVal; } + +export function sortObjectKeys(obj: T): T { + return Object.keys(obj).sort().reduce((acc, key) => { + acc[key] = obj[key]; + return acc; + }, {} as T); +} diff --git a/ui-ngx/src/app/modules/home/components/event/event-table-config.ts b/ui-ngx/src/app/modules/home/components/event/event-table-config.ts index 0d99ed3eb7..a0bed03aad 100644 --- a/ui-ngx/src/app/modules/home/components/event/event-table-config.ts +++ b/ui-ngx/src/app/modules/home/components/event/event-table-config.ts @@ -38,6 +38,7 @@ import { EventContentDialogComponent, EventContentDialogData } from '@home/components/event/event-content-dialog.component'; +import { sortObjectKeys } from '@core/utils'; export class EventTableConfig extends EntityTableConfig { @@ -209,7 +210,7 @@ export class EventTableConfig extends EntityTableConfig { icon: 'more_horiz', isEnabled: (entity) => entity.body.metadata ? entity.body.metadata.length > 0 : false, onAction: ($event, entity) => this.showContent($event, entity.body.metadata, - 'event.metadata', ContentType.JSON) + 'event.metadata', ContentType.JSON, true) }, '40px'), new EntityActionTableColumn('error', 'event.error', @@ -229,10 +230,15 @@ export class EventTableConfig extends EntityTableConfig { } } - showContent($event: MouseEvent, content: string, title: string, contentType: ContentType = null): void { + showContent($event: MouseEvent, content: string, title: string, contentType: ContentType = null, sortKeys = false): void { if ($event) { $event.stopPropagation(); } + if (contentType === ContentType.JSON && sortKeys) { + try { + content = JSON.stringify(sortObjectKeys(JSON.parse(content))); + } catch (e) {} + } this.dialog.open(EventContentDialogComponent, { disableClose: true, panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],