2019-08-22 18:44:48 +03:00
|
|
|
///
|
2024-01-09 10:46:16 +02:00
|
|
|
/// Copyright © 2016-2024 The Thingsboard Authors
|
2019-08-22 18:44:48 +03:00
|
|
|
///
|
|
|
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
/// you may not use this file except in compliance with the License.
|
|
|
|
|
/// You may obtain a copy of the License at
|
|
|
|
|
///
|
|
|
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
///
|
|
|
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
/// See the License for the specific language governing permissions and
|
|
|
|
|
/// limitations under the License.
|
|
|
|
|
///
|
|
|
|
|
|
|
|
|
|
import {
|
2022-08-02 15:22:57 +03:00
|
|
|
CellActionDescriptorType,
|
2019-08-22 18:44:48 +03:00
|
|
|
DateEntityTableColumn,
|
|
|
|
|
EntityActionTableColumn,
|
2025-02-13 17:02:46 +02:00
|
|
|
EntityLinkTableColumn,
|
2019-08-22 18:44:48 +03:00
|
|
|
EntityTableColumn,
|
|
|
|
|
EntityTableConfig
|
|
|
|
|
} from '@home/models/entity/entities-table-config.models';
|
2023-07-11 15:36:07 +03:00
|
|
|
import { DebugEventType, Event, EventBody, EventType, FilterEventBody } from '@shared/models/event.models';
|
2021-11-08 19:21:26 +02:00
|
|
|
import { TimePageLink } from '@shared/models/page/page-link';
|
|
|
|
|
import { TranslateService } from '@ngx-translate/core';
|
|
|
|
|
import { DatePipe } from '@angular/common';
|
2023-02-17 19:24:01 +02:00
|
|
|
import { MatDialog } from '@angular/material/dialog';
|
2021-11-08 19:21:26 +02:00
|
|
|
import { EntityId } from '@shared/models/id/entity-id';
|
|
|
|
|
import { EventService } from '@app/core/http/event.service';
|
|
|
|
|
import { EventTableHeaderComponent } from '@home/components/event/event-table-header.component';
|
2025-02-13 17:02:46 +02:00
|
|
|
import { EntityType, EntityTypeResource } from '@shared/models/entity-type.models';
|
2023-11-02 16:52:51 +02:00
|
|
|
import { fromEvent, Observable } from 'rxjs';
|
2021-11-08 19:21:26 +02:00
|
|
|
import { PageData } from '@shared/models/page/page-data';
|
|
|
|
|
import { Direction } from '@shared/models/page/sort-order';
|
|
|
|
|
import { DialogService } from '@core/services/dialog.service';
|
|
|
|
|
import { ContentType } from '@shared/models/constants';
|
2020-01-22 20:05:30 +02:00
|
|
|
import {
|
|
|
|
|
EventContentDialogComponent,
|
|
|
|
|
EventContentDialogData
|
|
|
|
|
} from '@home/components/event/event-content-dialog.component';
|
2025-02-13 17:02:46 +02:00
|
|
|
import { getEntityDetailsPageURL, isEqual, sortObjectKeys } from '@core/utils';
|
2024-11-12 17:39:22 +02:00
|
|
|
import { DAY, historyInterval, MINUTE } from '@shared/models/time/time.models';
|
|
|
|
|
import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
|
2023-07-03 17:13:11 +03:00
|
|
|
import { ChangeDetectorRef, EventEmitter, Injector, StaticProvider, ViewContainerRef } from '@angular/core';
|
2021-11-08 19:21:26 +02:00
|
|
|
import { ComponentPortal } from '@angular/cdk/portal';
|
2021-04-15 12:05:04 +03:00
|
|
|
import {
|
|
|
|
|
EVENT_FILTER_PANEL_DATA,
|
|
|
|
|
EventFilterPanelComponent,
|
|
|
|
|
EventFilterPanelData,
|
|
|
|
|
FilterEntityColumn
|
|
|
|
|
} from '@home/components/event/event-filter-panel.component';
|
2023-11-02 16:52:51 +02:00
|
|
|
import { DEFAULT_OVERLAY_POSITIONS } from '@shared/models/overlay.models';
|
2024-11-12 17:39:22 +02:00
|
|
|
import { getCurrentAuthState } from '@core/auth/auth.selectors';
|
|
|
|
|
import { Store } from '@ngrx/store';
|
|
|
|
|
import { AppState } from '@core/core.state';
|
2019-08-22 18:44:48 +03:00
|
|
|
|
|
|
|
|
export class EventTableConfig extends EntityTableConfig<Event, TimePageLink> {
|
|
|
|
|
|
|
|
|
|
eventTypeValue: EventType | DebugEventType;
|
2022-01-19 17:43:52 +02:00
|
|
|
hideClearEventAction = false;
|
2019-08-22 18:44:48 +03:00
|
|
|
|
2021-04-15 12:05:04 +03:00
|
|
|
private filterParams: FilterEventBody = {};
|
|
|
|
|
private filterColumns: FilterEntityColumn[] = [];
|
2024-11-13 15:09:29 +02:00
|
|
|
private readonly maxDebugModeDurationMinutes = getCurrentAuthState(this.store).maxDebugModeDurationMinutes;
|
2021-04-15 12:05:04 +03:00
|
|
|
|
2019-08-22 18:44:48 +03:00
|
|
|
set eventType(eventType: EventType | DebugEventType) {
|
|
|
|
|
if (this.eventTypeValue !== eventType) {
|
|
|
|
|
this.eventTypeValue = eventType;
|
2023-07-03 17:13:11 +03:00
|
|
|
this.updateCellAction();
|
2019-08-22 18:44:48 +03:00
|
|
|
this.updateColumns(true);
|
2021-04-15 12:05:04 +03:00
|
|
|
this.updateFilterColumns();
|
2019-08-22 18:44:48 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get eventType(): EventType | DebugEventType {
|
|
|
|
|
return this.eventTypeValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
eventTypes: Array<EventType | DebugEventType>;
|
|
|
|
|
|
|
|
|
|
constructor(private eventService: EventService,
|
|
|
|
|
private dialogService: DialogService,
|
|
|
|
|
private translate: TranslateService,
|
|
|
|
|
private datePipe: DatePipe,
|
|
|
|
|
private dialog: MatDialog,
|
|
|
|
|
public entityId: EntityId,
|
|
|
|
|
public tenantId: string,
|
|
|
|
|
private defaultEventType: EventType | DebugEventType,
|
|
|
|
|
private disabledEventTypes: Array<EventType | DebugEventType> = null,
|
2021-04-15 12:05:04 +03:00
|
|
|
private debugEventTypes: Array<DebugEventType> = null,
|
|
|
|
|
private overlay: Overlay,
|
|
|
|
|
private viewContainerRef: ViewContainerRef,
|
2023-06-27 17:30:56 +03:00
|
|
|
private cd: ChangeDetectorRef,
|
2024-11-13 15:09:29 +02:00
|
|
|
private store: Store<AppState>,
|
2023-07-03 17:13:11 +03:00
|
|
|
public testButtonLabel?: string,
|
2023-07-11 15:36:07 +03:00
|
|
|
private debugEventSelected?: EventEmitter<EventBody>) {
|
2019-08-22 18:44:48 +03:00
|
|
|
super();
|
|
|
|
|
this.loadDataOnInit = false;
|
|
|
|
|
this.tableTitle = '';
|
|
|
|
|
this.useTimePageLink = true;
|
2024-12-02 11:21:20 +02:00
|
|
|
const defaultInterval = this.maxDebugModeDurationMinutes ? Math.min(this.maxDebugModeDurationMinutes * MINUTE, DAY) : DAY;
|
|
|
|
|
this.defaultTimewindowInterval = historyInterval(defaultInterval);
|
2019-08-22 18:44:48 +03:00
|
|
|
this.detailsPanelEnabled = false;
|
|
|
|
|
this.selectionEnabled = false;
|
|
|
|
|
this.searchEnabled = false;
|
|
|
|
|
this.addEnabled = false;
|
|
|
|
|
this.entitiesDeleteEnabled = false;
|
2022-01-12 17:31:30 +02:00
|
|
|
this.pageMode = false;
|
2019-08-22 18:44:48 +03:00
|
|
|
|
|
|
|
|
this.headerComponent = EventTableHeaderComponent;
|
|
|
|
|
|
|
|
|
|
this.eventTypes = Object.keys(EventType).map(type => EventType[type]);
|
|
|
|
|
|
|
|
|
|
if (disabledEventTypes && disabledEventTypes.length) {
|
|
|
|
|
this.eventTypes = this.eventTypes.filter(type => disabledEventTypes.indexOf(type) === -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (debugEventTypes && debugEventTypes.length) {
|
|
|
|
|
this.eventTypes = [...this.eventTypes, ...debugEventTypes];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.eventTypeValue = defaultEventType;
|
|
|
|
|
|
|
|
|
|
this.entityTranslations = {
|
|
|
|
|
noEntities: 'event.no-events-prompt'
|
|
|
|
|
};
|
|
|
|
|
this.entityResources = {
|
2020-04-07 17:06:04 +03:00
|
|
|
} as EntityTypeResource<Event>;
|
2019-08-22 18:44:48 +03:00
|
|
|
this.entitiesFetchFunction = pageLink => this.fetchEvents(pageLink);
|
|
|
|
|
|
|
|
|
|
this.defaultSortOrder = {property: 'createdTime', direction: Direction.DESC};
|
|
|
|
|
|
|
|
|
|
this.updateColumns();
|
2023-07-03 17:13:11 +03:00
|
|
|
this.updateCellAction();
|
2021-04-15 12:05:04 +03:00
|
|
|
this.updateFilterColumns();
|
|
|
|
|
|
|
|
|
|
this.headerActionDescriptors.push({
|
2021-09-01 12:15:00 +03:00
|
|
|
name: this.translate.instant('event.clear-filter'),
|
2021-09-02 11:19:19 +03:00
|
|
|
icon: 'mdi:filter-variant-remove',
|
2021-09-01 12:15:00 +03:00
|
|
|
isEnabled: () => !isEqual(this.filterParams, {}),
|
|
|
|
|
onAction: ($event) => {
|
|
|
|
|
this.clearFiter($event);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
2021-04-15 12:05:04 +03:00
|
|
|
name: this.translate.instant('event.events-filter'),
|
|
|
|
|
icon: 'filter_list',
|
|
|
|
|
isEnabled: () => true,
|
|
|
|
|
onAction: ($event) => {
|
|
|
|
|
this.editEventFilter($event);
|
|
|
|
|
}
|
2021-11-05 17:29:46 +02:00
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('event.clean-events'),
|
|
|
|
|
icon: 'delete',
|
2022-01-19 17:43:52 +02:00
|
|
|
isEnabled: () => !this.hideClearEventAction,
|
|
|
|
|
onAction: $event => this.clearEvents($event)
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clearEvents($event) {
|
|
|
|
|
if ($event) {
|
|
|
|
|
$event.stopPropagation();
|
|
|
|
|
}
|
|
|
|
|
this.dialogService.confirm(
|
|
|
|
|
this.translate.instant('event.clear-request-title'),
|
|
|
|
|
this.translate.instant('event.clear-request-text'),
|
|
|
|
|
this.translate.instant('action.no'),
|
|
|
|
|
this.translate.instant('action.yes')
|
|
|
|
|
).subscribe((res) => {
|
|
|
|
|
if (res) {
|
|
|
|
|
this.eventService.clearEvents(this.entityId, this.eventType, this.filterParams,
|
2022-01-20 12:07:18 +02:00
|
|
|
this.tenantId, this.getTable().pageLink as TimePageLink).subscribe(
|
2021-11-08 14:19:44 +02:00
|
|
|
() => {
|
2022-01-19 17:02:18 +02:00
|
|
|
this.getTable().paginator.pageIndex = 0;
|
|
|
|
|
this.updateData();
|
2021-11-08 14:19:44 +02:00
|
|
|
}
|
|
|
|
|
);
|
2022-01-19 17:43:52 +02:00
|
|
|
}
|
2021-04-15 12:05:04 +03:00
|
|
|
});
|
2019-08-22 18:44:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fetchEvents(pageLink: TimePageLink): Observable<PageData<Event>> {
|
2021-04-15 12:05:04 +03:00
|
|
|
return this.eventService.getFilterEvents(this.entityId, this.eventType, this.tenantId, this.filterParams, pageLink);
|
2019-08-22 18:44:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateColumns(updateTableColumns: boolean = false): void {
|
|
|
|
|
this.columns = [];
|
|
|
|
|
this.columns.push(
|
2021-08-19 15:22:46 +02:00
|
|
|
new DateEntityTableColumn<Event>('createdTime', 'event.event-time', this.datePipe, '120px', 'yyyy-MM-dd HH:mm:ss.SSS'),
|
2020-12-22 19:21:06 +02:00
|
|
|
new EntityTableColumn<Event>('server', 'event.server', '100px',
|
|
|
|
|
(entity) => entity.body.server, entity => ({}), false));
|
2019-08-22 18:44:48 +03:00
|
|
|
switch (this.eventType) {
|
|
|
|
|
case EventType.ERROR:
|
|
|
|
|
this.columns.push(
|
|
|
|
|
new EntityTableColumn<Event>('method', 'event.method', '100%',
|
|
|
|
|
(entity) => entity.body.method, entity => ({}), false),
|
|
|
|
|
new EntityActionTableColumn<Event>('error', 'event.error',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
|
|
|
|
isEnabled: (entity) => entity.body.error && entity.body.error.length > 0,
|
|
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.error, 'event.error')
|
|
|
|
|
},
|
|
|
|
|
'100px')
|
|
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
case EventType.LC_EVENT:
|
|
|
|
|
this.columns.push(
|
|
|
|
|
new EntityTableColumn<Event>('method', 'event.event', '100%',
|
|
|
|
|
(entity) => entity.body.event, entity => ({}), false),
|
|
|
|
|
new EntityTableColumn<Event>('status', 'event.status', '100%',
|
|
|
|
|
(entity) =>
|
|
|
|
|
this.translate.instant(entity.body.success ? 'event.success' : 'event.failed'), entity => ({}), false),
|
|
|
|
|
new EntityActionTableColumn<Event>('error', 'event.error',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
|
|
|
|
isEnabled: (entity) => entity.body.error && entity.body.error.length > 0,
|
|
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.error, 'event.error')
|
|
|
|
|
},
|
|
|
|
|
'100px')
|
|
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
case EventType.STATS:
|
|
|
|
|
this.columns.push(
|
2020-01-24 19:05:41 +02:00
|
|
|
new EntityTableColumn<Event>('messagesProcessed', 'event.messages-processed', '50%',
|
2019-08-22 18:44:48 +03:00
|
|
|
(entity) => entity.body.messagesProcessed + '',
|
2020-01-24 19:05:41 +02:00
|
|
|
() => ({}),
|
2019-08-22 18:44:48 +03:00
|
|
|
false,
|
2020-01-24 19:05:41 +02:00
|
|
|
() => ({}), () => undefined, true),
|
|
|
|
|
new EntityTableColumn<Event>('errorsOccurred', 'event.errors-occurred', '50%',
|
2019-08-22 18:44:48 +03:00
|
|
|
(entity) => entity.body.errorsOccurred + '',
|
2020-01-24 19:05:41 +02:00
|
|
|
() => ({}),
|
2019-08-22 18:44:48 +03:00
|
|
|
false,
|
2020-01-24 19:05:41 +02:00
|
|
|
() => ({}), () => undefined, true)
|
2019-08-22 18:44:48 +03:00
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
case DebugEventType.DEBUG_RULE_NODE:
|
2022-08-02 15:22:57 +03:00
|
|
|
this.columns[0].width = '80px';
|
|
|
|
|
(this.columns[1] as EntityTableColumn<Event>).headerCellStyleFunction = () => ({padding: '0 12px 0 0'});
|
|
|
|
|
(this.columns[1] as EntityTableColumn<Event>).cellStyleFunction = () => ({padding: '0 12px 0 0'});
|
2019-08-22 18:44:48 +03:00
|
|
|
this.columns.push(
|
2020-01-22 20:05:30 +02:00
|
|
|
new EntityTableColumn<Event>('type', 'event.type', '40px',
|
|
|
|
|
(entity) => entity.body.type, entity => ({
|
|
|
|
|
padding: '0 12px 0 0',
|
|
|
|
|
}), false, key => ({
|
|
|
|
|
padding: '0 12px 0 0'
|
|
|
|
|
})),
|
2022-08-02 15:22:57 +03:00
|
|
|
new EntityTableColumn<Event>('entityType', 'event.entity-type', '75px',
|
2022-07-26 16:28:55 +03:00
|
|
|
(entity) => entity.body.entityType, entity => ({
|
2020-01-22 20:05:30 +02:00
|
|
|
padding: '0 12px 0 0',
|
|
|
|
|
}), false, key => ({
|
|
|
|
|
padding: '0 12px 0 0'
|
|
|
|
|
})),
|
2022-08-02 15:22:57 +03:00
|
|
|
new EntityTableColumn<Event>('entityId', 'event.entity-id', '85px',
|
2023-05-04 15:17:50 +03:00
|
|
|
(entity) => `<span style="display: inline-block; width: 7ch">${entity.body.entityId.substring(0, 6)}…</span>`,
|
|
|
|
|
() => ({
|
2020-01-24 19:05:41 +02:00
|
|
|
padding: '0 12px 0 0'
|
2022-08-02 15:22:57 +03:00
|
|
|
}), false, () => ({
|
|
|
|
|
padding: '0 12px 0 0'
|
|
|
|
|
}),
|
|
|
|
|
() => undefined, false, {
|
|
|
|
|
name: this.translate.instant('event.copy-entity-id'),
|
|
|
|
|
icon: 'content_paste',
|
|
|
|
|
style: {
|
2023-02-21 19:18:04 +02:00
|
|
|
padding: '4px',
|
2022-08-02 15:22:57 +03:00
|
|
|
'font-size': '16px',
|
|
|
|
|
color: 'rgba(0,0,0,.87)'
|
|
|
|
|
},
|
|
|
|
|
isEnabled: () => true,
|
|
|
|
|
onAction: ($event, entity) => entity.body.entityId,
|
|
|
|
|
type: CellActionDescriptorType.COPY_BUTTON
|
|
|
|
|
}),
|
|
|
|
|
new EntityTableColumn<Event>('msgId', 'event.message-id', '85px',
|
2023-05-04 15:17:50 +03:00
|
|
|
(entity) => `<span style="display: inline-block; width: 7ch">${entity.body.msgId.substring(0, 6)}…</span>`,
|
|
|
|
|
() => ({
|
2022-08-02 15:22:57 +03:00
|
|
|
padding: '0 12px 0 0'
|
|
|
|
|
}), false, () => ({
|
2020-01-22 20:05:30 +02:00
|
|
|
padding: '0 12px 0 0'
|
2022-08-02 15:22:57 +03:00
|
|
|
}), () => undefined, false, {
|
|
|
|
|
name: this.translate.instant('event.copy-message-id'),
|
|
|
|
|
icon: 'content_paste',
|
|
|
|
|
style: {
|
2023-02-21 19:18:04 +02:00
|
|
|
padding: '4px',
|
2022-08-02 15:22:57 +03:00
|
|
|
'font-size': '16px',
|
|
|
|
|
color: 'rgba(0,0,0,.87)'
|
|
|
|
|
},
|
|
|
|
|
isEnabled: () => true,
|
|
|
|
|
onAction: ($event, entity) => entity.body.msgId,
|
|
|
|
|
type: CellActionDescriptorType.COPY_BUTTON
|
2020-01-22 20:05:30 +02:00
|
|
|
}),
|
2020-01-24 19:05:41 +02:00
|
|
|
new EntityTableColumn<Event>('msgType', 'event.message-type', '100px',
|
2020-01-22 20:05:30 +02:00
|
|
|
(entity) => entity.body.msgType, entity => ({
|
|
|
|
|
whiteSpace: 'nowrap',
|
2020-01-24 19:05:41 +02:00
|
|
|
padding: '0 12px 0 0'
|
2020-01-22 20:05:30 +02:00
|
|
|
}), false, key => ({
|
|
|
|
|
padding: '0 12px 0 0'
|
|
|
|
|
}),
|
|
|
|
|
entity => entity.body.msgType),
|
2023-08-22 15:06:51 +03:00
|
|
|
new EntityTableColumn<Event>('relationType', 'event.relation-type', '85px',
|
2022-08-02 15:22:57 +03:00
|
|
|
(entity) => entity.body.relationType, () => ({padding: '0 12px 0 0'}), false, () => ({
|
2020-01-22 20:05:30 +02:00
|
|
|
padding: '0 12px 0 0'
|
|
|
|
|
})),
|
2019-08-22 18:44:48 +03:00
|
|
|
new EntityActionTableColumn<Event>('data', 'event.data',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
2020-01-22 20:05:30 +02:00
|
|
|
isEnabled: (entity) => entity.body.data ? entity.body.data.length > 0 : false,
|
2019-08-22 18:44:48 +03:00
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.data,
|
|
|
|
|
'event.data', entity.body.dataType)
|
|
|
|
|
},
|
2023-05-02 17:25:12 +03:00
|
|
|
'48px'),
|
2019-08-22 18:44:48 +03:00
|
|
|
new EntityActionTableColumn<Event>('metadata', 'event.metadata',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
2020-01-22 20:05:30 +02:00
|
|
|
isEnabled: (entity) => entity.body.metadata ? entity.body.metadata.length > 0 : false,
|
2019-08-22 18:44:48 +03:00
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.metadata,
|
2020-08-11 17:43:19 +03:00
|
|
|
'event.metadata', ContentType.JSON, true)
|
2019-08-22 18:44:48 +03:00
|
|
|
},
|
2023-05-02 17:25:12 +03:00
|
|
|
'48px'),
|
2019-08-22 18:44:48 +03:00
|
|
|
new EntityActionTableColumn<Event>('error', 'event.error',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
|
|
|
|
isEnabled: (entity) => entity.body.error && entity.body.error.length > 0,
|
|
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.error,
|
|
|
|
|
'event.error')
|
|
|
|
|
},
|
2023-05-02 17:25:12 +03:00
|
|
|
'48px')
|
2019-08-22 18:44:48 +03:00
|
|
|
);
|
|
|
|
|
break;
|
2022-07-26 17:38:22 +03:00
|
|
|
case DebugEventType.DEBUG_RULE_CHAIN:
|
|
|
|
|
this.columns[0].width = '100px';
|
|
|
|
|
this.columns.push(
|
|
|
|
|
new EntityActionTableColumn<Event>('message', 'event.message',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
|
|
|
|
isEnabled: (entity) => entity.body.message ? entity.body.message.length > 0 : false,
|
|
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.message,
|
|
|
|
|
'event.message')
|
|
|
|
|
},
|
2023-05-02 17:25:12 +03:00
|
|
|
'48px'),
|
2022-07-26 17:38:22 +03:00
|
|
|
new EntityActionTableColumn<Event>('error', 'event.error',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
|
|
|
|
isEnabled: (entity) => entity.body.error && entity.body.error.length > 0,
|
|
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.error,
|
|
|
|
|
'event.error')
|
|
|
|
|
},
|
2023-05-02 17:25:12 +03:00
|
|
|
'48px')
|
2022-07-26 17:38:22 +03:00
|
|
|
);
|
|
|
|
|
break;
|
2025-02-06 15:47:52 +02:00
|
|
|
case DebugEventType.DEBUG_CALCULATED_FIELD:
|
2025-02-06 17:31:59 +02:00
|
|
|
this.columns[0].width = '80px';
|
2025-02-11 17:29:44 +02:00
|
|
|
this.columns[1].width = '100px';
|
2025-02-06 15:47:52 +02:00
|
|
|
this.columns.push(
|
2025-02-13 17:02:46 +02:00
|
|
|
new EntityLinkTableColumn<Event>('entityId', 'event.entity-id', '100px',
|
2025-02-11 16:04:23 +02:00
|
|
|
(entity) => `<span style="display: inline-block; width: 9ch">${entity.body.entityId.substring(0, 8)}…</span>`,
|
2025-02-13 17:02:46 +02:00
|
|
|
(entity) => getEntityDetailsPageURL(entity.body.entityId, entity.body.entityType as EntityType),
|
2025-02-06 15:47:52 +02:00
|
|
|
false,
|
|
|
|
|
() => ({padding: '0 12px 0 0'}),
|
2025-02-13 17:44:04 +02:00
|
|
|
() => ({padding: '0 12px 0 0'}),
|
2025-02-13 17:02:46 +02:00
|
|
|
(entity) => entity.body.entityId,
|
2025-02-06 15:47:52 +02:00
|
|
|
{
|
|
|
|
|
name: this.translate.instant('event.copy-entity-id'),
|
|
|
|
|
icon: 'content_paste',
|
|
|
|
|
style: {
|
|
|
|
|
padding: '4px',
|
|
|
|
|
'font-size': '16px',
|
|
|
|
|
color: 'rgba(0,0,0,.87)'
|
|
|
|
|
},
|
|
|
|
|
isEnabled: () => true,
|
|
|
|
|
onAction: ($event, entity) => entity.body.entityId,
|
|
|
|
|
type: CellActionDescriptorType.COPY_BUTTON
|
|
|
|
|
}
|
|
|
|
|
),
|
2025-02-13 12:33:30 +02:00
|
|
|
new EntityTableColumn<Event>('messageId', 'event.message-id', '100px',
|
2025-02-12 15:57:12 +02:00
|
|
|
(entity) => entity.body.msgId ? `<span style="display: inline-block; width: 9ch">${entity.body.msgId?.substring(0, 8)}…</span>` : '-',
|
2025-02-06 15:47:52 +02:00
|
|
|
() => ({padding: '0 12px 0 0'}),
|
|
|
|
|
false,
|
|
|
|
|
() => ({padding: '0 12px 0 0'}),
|
2025-02-13 17:02:46 +02:00
|
|
|
(entity) => entity.body.msgId,
|
2025-02-06 15:47:52 +02:00
|
|
|
false,
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('event.copy-message-id'),
|
|
|
|
|
icon: 'content_paste',
|
|
|
|
|
style: {
|
|
|
|
|
padding: '4px',
|
|
|
|
|
'font-size': '16px',
|
|
|
|
|
color: 'rgba(0,0,0,.87)'
|
|
|
|
|
},
|
2025-02-12 15:57:12 +02:00
|
|
|
isEnabled: (entity) => !!entity.body.msgId,
|
|
|
|
|
onAction: (_, entity) => entity.body.msgId,
|
2025-02-06 15:47:52 +02:00
|
|
|
type: CellActionDescriptorType.COPY_BUTTON
|
|
|
|
|
}
|
|
|
|
|
),
|
2025-02-06 16:10:26 +02:00
|
|
|
new EntityTableColumn<Event>('messageType', 'event.message-type', '100px',
|
2025-02-12 15:57:12 +02:00
|
|
|
(entity) => entity.body.msgType ?? '-',
|
2025-02-06 15:47:52 +02:00
|
|
|
() => ({padding: '0 12px 0 0'}),
|
|
|
|
|
false
|
|
|
|
|
),
|
|
|
|
|
new EntityActionTableColumn<Event>('arguments', 'event.arguments',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
|
|
|
|
isEnabled: (entity) => entity.body.arguments !== undefined,
|
|
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.arguments,
|
|
|
|
|
'event.arguments', ContentType.JSON, true)
|
|
|
|
|
},
|
2025-02-06 16:10:26 +02:00
|
|
|
'48px'
|
2025-02-06 15:47:52 +02:00
|
|
|
),
|
|
|
|
|
new EntityActionTableColumn<Event>('result', 'event.result',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
|
|
|
|
isEnabled: (entity) => entity.body.result !== undefined,
|
|
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.result,
|
|
|
|
|
'event.result', ContentType.JSON, true)
|
|
|
|
|
},
|
2025-02-06 16:10:26 +02:00
|
|
|
'48px'
|
2025-02-06 15:47:52 +02:00
|
|
|
),
|
|
|
|
|
new EntityActionTableColumn<Event>('error', 'event.error',
|
|
|
|
|
{
|
|
|
|
|
name: this.translate.instant('action.view'),
|
|
|
|
|
icon: 'more_horiz',
|
|
|
|
|
isEnabled: (entity) => entity.body.error && entity.body.error.length > 0,
|
|
|
|
|
onAction: ($event, entity) => this.showContent($event, entity.body.error,
|
|
|
|
|
'event.error')
|
|
|
|
|
},
|
2025-02-06 16:10:26 +02:00
|
|
|
'48px'
|
2025-02-06 15:47:52 +02:00
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
break;
|
2019-08-22 18:44:48 +03:00
|
|
|
}
|
|
|
|
|
if (updateTableColumns) {
|
2022-01-19 17:02:18 +02:00
|
|
|
this.getTable().columnsUpdated(true);
|
2019-08-22 18:44:48 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-03 17:13:11 +03:00
|
|
|
updateCellAction() {
|
|
|
|
|
this.cellActionDescriptors = [];
|
|
|
|
|
switch (this.eventType) {
|
|
|
|
|
case DebugEventType.DEBUG_RULE_NODE:
|
|
|
|
|
if (this.testButtonLabel) {
|
|
|
|
|
this.cellActionDescriptors.push({
|
2023-07-14 18:59:20 +03:00
|
|
|
name: this.translate.instant('rulenode.test-with-this-message', {test: this.translate.instant(this.testButtonLabel)}),
|
2023-07-03 17:13:11 +03:00
|
|
|
icon: 'bug_report',
|
2023-07-31 09:28:08 +03:00
|
|
|
isEnabled: (entity) => entity.body.type === 'IN' || entity.body.error !== undefined,
|
2023-07-03 17:13:11 +03:00
|
|
|
onAction: ($event, entity) => {
|
|
|
|
|
this.debugEventSelected.next(entity.body);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
break;
|
2025-02-10 15:35:14 +02:00
|
|
|
case DebugEventType.DEBUG_CALCULATED_FIELD:
|
|
|
|
|
this.cellActionDescriptors.push({
|
|
|
|
|
name: this.translate.instant('common.test-with-this-message', {test: this.translate.instant(this.testButtonLabel)}),
|
|
|
|
|
icon: 'bug_report',
|
|
|
|
|
isEnabled: () => true,
|
2025-02-10 16:11:46 +02:00
|
|
|
onAction: (_, entity) => this.debugEventSelected.next(entity.body)
|
2025-02-10 15:35:14 +02:00
|
|
|
});
|
|
|
|
|
break;
|
2023-07-03 17:13:11 +03:00
|
|
|
}
|
|
|
|
|
this.getTable()?.cellActionDescriptorsUpdated();
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-11 17:43:19 +03:00
|
|
|
showContent($event: MouseEvent, content: string, title: string, contentType: ContentType = null, sortKeys = false): void {
|
2019-08-22 18:44:48 +03:00
|
|
|
if ($event) {
|
|
|
|
|
$event.stopPropagation();
|
|
|
|
|
}
|
2020-08-11 17:43:19 +03:00
|
|
|
if (contentType === ContentType.JSON && sortKeys) {
|
|
|
|
|
try {
|
|
|
|
|
content = JSON.stringify(sortObjectKeys(JSON.parse(content)));
|
|
|
|
|
} catch (e) {}
|
2020-08-11 13:43:37 +03:00
|
|
|
}
|
2020-01-22 20:05:30 +02:00
|
|
|
this.dialog.open<EventContentDialogComponent, EventContentDialogData>(EventContentDialogComponent, {
|
|
|
|
|
disableClose: true,
|
|
|
|
|
panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],
|
|
|
|
|
data: {
|
2020-08-11 17:43:19 +03:00
|
|
|
content,
|
2020-01-22 20:05:30 +02:00
|
|
|
title,
|
|
|
|
|
contentType
|
|
|
|
|
}
|
|
|
|
|
});
|
2019-08-22 18:44:48 +03:00
|
|
|
}
|
2021-04-15 12:05:04 +03:00
|
|
|
|
|
|
|
|
private updateFilterColumns() {
|
|
|
|
|
this.filterParams = {};
|
|
|
|
|
this.filterColumns = [{key: 'server', title: 'event.server'}];
|
|
|
|
|
switch (this.eventType) {
|
|
|
|
|
case EventType.ERROR:
|
|
|
|
|
this.filterColumns.push(
|
|
|
|
|
{key: 'method', title: 'event.method'},
|
2021-10-14 21:30:50 +03:00
|
|
|
{key: 'errorStr', title: 'event.error'}
|
2021-04-15 12:05:04 +03:00
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
case EventType.LC_EVENT:
|
|
|
|
|
this.filterColumns.push(
|
2021-04-29 18:25:23 +03:00
|
|
|
{key: 'event', title: 'event.event'},
|
2021-04-15 12:05:04 +03:00
|
|
|
{key: 'status', title: 'event.status'},
|
2021-10-14 21:30:50 +03:00
|
|
|
{key: 'errorStr', title: 'event.error'}
|
2021-04-15 12:05:04 +03:00
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
case EventType.STATS:
|
|
|
|
|
this.filterColumns.push(
|
2022-07-27 15:45:12 +03:00
|
|
|
{key: 'minMessagesProcessed', title: 'event.min-messages-processed'},
|
|
|
|
|
{key: 'maxMessagesProcessed', title: 'event.max-messages-processed'},
|
|
|
|
|
{key: 'minErrorsOccurred', title: 'event.min-errors-occurred'},
|
|
|
|
|
{key: 'maxErrorsOccurred', title: 'event.max-errors-occurred'}
|
2021-04-15 12:05:04 +03:00
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
case DebugEventType.DEBUG_RULE_NODE:
|
|
|
|
|
this.filterColumns.push(
|
|
|
|
|
{key: 'msgDirectionType', title: 'event.type'},
|
|
|
|
|
{key: 'entityId', title: 'event.entity-id'},
|
2022-07-26 17:38:22 +03:00
|
|
|
{key: 'entityType', title: 'event.entity-type'},
|
2022-07-26 17:58:19 +03:00
|
|
|
{key: 'msgId', title: 'event.message-id'},
|
2021-04-15 12:05:04 +03:00
|
|
|
{key: 'msgType', title: 'event.message-type'},
|
|
|
|
|
{key: 'relationType', title: 'event.relation-type'},
|
|
|
|
|
{key: 'dataSearch', title: 'event.data'},
|
|
|
|
|
{key: 'metadataSearch', title: 'event.metadata'},
|
|
|
|
|
{key: 'isError', title: 'event.error'},
|
2021-10-14 21:30:50 +03:00
|
|
|
{key: 'errorStr', title: 'event.error'}
|
2021-04-15 12:05:04 +03:00
|
|
|
);
|
|
|
|
|
break;
|
2022-07-26 17:38:22 +03:00
|
|
|
case DebugEventType.DEBUG_RULE_CHAIN:
|
|
|
|
|
this.filterColumns.push(
|
2022-07-26 17:58:19 +03:00
|
|
|
{key: 'message', title: 'event.message'},
|
2022-07-26 17:38:22 +03:00
|
|
|
{key: 'isError', title: 'event.error'},
|
2025-02-06 15:47:52 +02:00
|
|
|
{key: 'errorStr', title: 'event.error'}
|
|
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
case DebugEventType.DEBUG_CALCULATED_FIELD:
|
|
|
|
|
this.filterColumns.push(
|
|
|
|
|
{key: 'entityId', title: 'event.entity-id'},
|
|
|
|
|
{key: 'messageId', title: 'event.message-id'},
|
|
|
|
|
{key: 'messageType', title: 'event.message-type'},
|
2025-02-13 10:52:04 +02:00
|
|
|
{key: 'arguments', title: 'event.arguments'},
|
|
|
|
|
{key: 'result', title: 'event.result'},
|
2025-02-06 15:47:52 +02:00
|
|
|
{key: 'isError', title: 'event.error'},
|
2022-07-26 17:38:22 +03:00
|
|
|
{key: 'errorStr', title: 'event.error'}
|
|
|
|
|
);
|
|
|
|
|
break;
|
2021-04-15 12:05:04 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-01 12:15:00 +03:00
|
|
|
private clearFiter($event) {
|
|
|
|
|
if ($event) {
|
|
|
|
|
$event.stopPropagation();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.filterParams = {};
|
2022-01-19 17:02:18 +02:00
|
|
|
this.getTable().paginator.pageIndex = 0;
|
|
|
|
|
this.updateData();
|
2021-09-01 12:15:00 +03:00
|
|
|
}
|
|
|
|
|
|
2021-04-15 12:05:04 +03:00
|
|
|
private editEventFilter($event: MouseEvent) {
|
|
|
|
|
if ($event) {
|
|
|
|
|
$event.stopPropagation();
|
|
|
|
|
}
|
|
|
|
|
const target = $event.target || $event.srcElement || $event.currentTarget;
|
2023-11-02 16:52:51 +02:00
|
|
|
const config = new OverlayConfig({
|
|
|
|
|
panelClass: 'tb-panel-container',
|
|
|
|
|
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
|
|
|
hasBackdrop: true,
|
|
|
|
|
height: 'fit-content',
|
|
|
|
|
maxHeight: '65vh'
|
|
|
|
|
});
|
|
|
|
|
config.positionStrategy = this.overlay.position()
|
|
|
|
|
.flexibleConnectedTo(target as HTMLElement)
|
|
|
|
|
.withPositions(DEFAULT_OVERLAY_POSITIONS);
|
2021-04-15 12:05:04 +03:00
|
|
|
|
|
|
|
|
const overlayRef = this.overlay.create(config);
|
|
|
|
|
overlayRef.backdropClick().subscribe(() => {
|
|
|
|
|
overlayRef.dispose();
|
|
|
|
|
});
|
|
|
|
|
const providers: StaticProvider[] = [
|
|
|
|
|
{
|
|
|
|
|
provide: EVENT_FILTER_PANEL_DATA,
|
|
|
|
|
useValue: {
|
|
|
|
|
columns: this.filterColumns,
|
|
|
|
|
filterParams: this.filterParams
|
|
|
|
|
} as EventFilterPanelData
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
provide: OverlayRef,
|
|
|
|
|
useValue: overlayRef
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
const injector = Injector.create({parent: this.viewContainerRef.injector, providers});
|
|
|
|
|
const componentRef = overlayRef.attach(new ComponentPortal(EventFilterPanelComponent,
|
|
|
|
|
this.viewContainerRef, injector));
|
2023-11-02 16:52:51 +02:00
|
|
|
const resizeWindows$ = fromEvent(window, 'resize').subscribe(() => {
|
|
|
|
|
overlayRef.updatePosition();
|
|
|
|
|
});
|
2021-04-15 12:05:04 +03:00
|
|
|
componentRef.onDestroy(() => {
|
2023-11-02 16:52:51 +02:00
|
|
|
resizeWindows$.unsubscribe();
|
2021-04-15 12:05:04 +03:00
|
|
|
if (componentRef.instance.result && !isEqual(this.filterParams, componentRef.instance.result.filterParams)) {
|
|
|
|
|
this.filterParams = componentRef.instance.result.filterParams;
|
2022-01-19 17:02:18 +02:00
|
|
|
this.getTable().paginator.pageIndex = 0;
|
|
|
|
|
this.updateData();
|
2021-04-15 12:05:04 +03:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
this.cd.detectChanges();
|
|
|
|
|
}
|
2019-08-22 18:44:48 +03:00
|
|
|
}
|
2020-10-23 15:18:34 +03:00
|
|
|
|