@memberjunction/ng-dashboards 2.42.0
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.
- package/dist/AI/ai-dashboard.component.d.ts +54 -0
- package/dist/AI/ai-dashboard.component.d.ts.map +1 -0
- package/dist/AI/ai-dashboard.component.js +248 -0
- package/dist/AI/ai-dashboard.component.js.map +1 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts +41 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -0
- package/dist/AI/components/agents/agent-configuration.component.js +325 -0
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -0
- package/dist/AI/components/agents/agent-editor.component.d.ts +77 -0
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -0
- package/dist/AI/components/agents/agent-editor.component.js +869 -0
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -0
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +33 -0
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -0
- package/dist/AI/components/agents/agent-filter-panel.component.js +144 -0
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts +13 -0
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -0
- package/dist/AI/components/execution-monitoring.component.js +30 -0
- package/dist/AI/components/execution-monitoring.component.js.map +1 -0
- package/dist/AI/components/models/model-management.component.d.ts +73 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -0
- package/dist/AI/components/models/model-management.component.js +669 -0
- package/dist/AI/components/models/model-management.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +49 -0
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +1 -0
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +186 -0
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts +113 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -0
- package/dist/AI/components/prompts/prompt-management.component.js +1316 -0
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -0
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +33 -0
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +1 -0
- package/dist/AI/components/system/system-config-filter-panel.component.js +146 -0
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -0
- package/dist/AI/components/system/system-configuration.component.d.ts +37 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -0
- package/dist/AI/components/system/system-configuration.component.js +311 -0
- package/dist/AI/components/system/system-configuration.component.js.map +1 -0
- package/dist/Actions/actions-management-dashboard.component.d.ts +50 -0
- package/dist/Actions/actions-management-dashboard.component.d.ts.map +1 -0
- package/dist/Actions/actions-management-dashboard.component.js +282 -0
- package/dist/Actions/actions-management-dashboard.component.js.map +1 -0
- package/dist/Actions/components/actions-list-view.component.d.ts +52 -0
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -0
- package/dist/Actions/components/actions-list-view.component.js +366 -0
- package/dist/Actions/components/actions-list-view.component.js.map +1 -0
- package/dist/Actions/components/actions-overview.component.d.ts +71 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -0
- package/dist/Actions/components/actions-overview.component.js +605 -0
- package/dist/Actions/components/actions-overview.component.js.map +1 -0
- package/dist/Actions/components/categories-list-view.component.d.ts +11 -0
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -0
- package/dist/Actions/components/categories-list-view.component.js +35 -0
- package/dist/Actions/components/categories-list-view.component.js.map +1 -0
- package/dist/Actions/components/code-management.component.d.ts +11 -0
- package/dist/Actions/components/code-management.component.d.ts.map +1 -0
- package/dist/Actions/components/code-management.component.js +35 -0
- package/dist/Actions/components/code-management.component.js.map +1 -0
- package/dist/Actions/components/entity-integration.component.d.ts +11 -0
- package/dist/Actions/components/entity-integration.component.d.ts.map +1 -0
- package/dist/Actions/components/entity-integration.component.js +35 -0
- package/dist/Actions/components/entity-integration.component.js.map +1 -0
- package/dist/Actions/components/execution-monitoring.component.d.ts +83 -0
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -0
- package/dist/Actions/components/execution-monitoring.component.js +629 -0
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -0
- package/dist/Actions/components/executions-list-view.component.d.ts +11 -0
- package/dist/Actions/components/executions-list-view.component.d.ts.map +1 -0
- package/dist/Actions/components/executions-list-view.component.js +35 -0
- package/dist/Actions/components/executions-list-view.component.js.map +1 -0
- package/dist/Actions/components/scheduled-actions.component.d.ts +11 -0
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -0
- package/dist/Actions/components/scheduled-actions.component.js +35 -0
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -0
- package/dist/Actions/components/security-permissions.component.d.ts +11 -0
- package/dist/Actions/components/security-permissions.component.d.ts.map +1 -0
- package/dist/Actions/components/security-permissions.component.js +35 -0
- package/dist/Actions/components/security-permissions.component.js.map +1 -0
- package/dist/Actions/index.d.ts +11 -0
- package/dist/Actions/index.d.ts.map +1 -0
- package/dist/Actions/index.js +11 -0
- package/dist/Actions/index.js.map +1 -0
- package/dist/EntityAdmin/components/entity-details.component.d.ts +50 -0
- package/dist/EntityAdmin/components/entity-details.component.d.ts.map +1 -0
- package/dist/EntityAdmin/components/entity-details.component.js +684 -0
- package/dist/EntityAdmin/components/entity-details.component.js.map +1 -0
- package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +31 -0
- package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +1 -0
- package/dist/EntityAdmin/components/entity-filter-panel.component.js +162 -0
- package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -0
- package/dist/EntityAdmin/components/erd-composite.component.d.ts +73 -0
- package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +1 -0
- package/dist/EntityAdmin/components/erd-composite.component.js +288 -0
- package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -0
- package/dist/EntityAdmin/components/erd-diagram.component.d.ts +47 -0
- package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +1 -0
- package/dist/EntityAdmin/components/erd-diagram.component.js +618 -0
- package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +50 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +190 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -0
- package/dist/generic/base-dashboard.d.ts +65 -0
- package/dist/generic/base-dashboard.d.ts.map +1 -0
- package/dist/generic/base-dashboard.js +86 -0
- package/dist/generic/base-dashboard.js.map +1 -0
- package/dist/module.d.ts +43 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +141 -0
- package/dist/module.js.map +1 -0
- package/dist/public-api.d.ts +6 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +18 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,629 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { Component, Output, EventEmitter } from '@angular/core';
|
|
11
|
+
import { RunView, LogError } from '@memberjunction/core';
|
|
12
|
+
import { Subject, BehaviorSubject, combineLatest } from 'rxjs';
|
|
13
|
+
import { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@progress/kendo-angular-indicators";
|
|
16
|
+
import * as i2 from "@progress/kendo-angular-dropdowns";
|
|
17
|
+
import * as i3 from "@progress/kendo-angular-inputs";
|
|
18
|
+
import * as i4 from "@memberjunction/ng-container-directives";
|
|
19
|
+
import * as i5 from "@progress/kendo-angular-buttons";
|
|
20
|
+
import * as i6 from "@angular/common";
|
|
21
|
+
const _forTrack0 = ($index, $item) => $item.date;
|
|
22
|
+
const _forTrack1 = ($index, $item) => $item.ID;
|
|
23
|
+
function ExecutionMonitoringComponent_ng_template_11_Template(rf, ctx) { if (rf & 1) {
|
|
24
|
+
i0.ɵɵelement(0, "i", 40);
|
|
25
|
+
} }
|
|
26
|
+
function ExecutionMonitoringComponent_Conditional_75_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
27
|
+
i0.ɵɵelementStart(0, "div", 42)(1, "div", 47);
|
|
28
|
+
i0.ɵɵelement(2, "div", 48)(3, "div", 49);
|
|
29
|
+
i0.ɵɵelementEnd();
|
|
30
|
+
i0.ɵɵelementStart(4, "div", 50);
|
|
31
|
+
i0.ɵɵtext(5);
|
|
32
|
+
i0.ɵɵpipe(6, "date");
|
|
33
|
+
i0.ɵɵelementEnd();
|
|
34
|
+
i0.ɵɵelementStart(7, "div", 51);
|
|
35
|
+
i0.ɵɵtext(8);
|
|
36
|
+
i0.ɵɵelementEnd()();
|
|
37
|
+
} if (rf & 2) {
|
|
38
|
+
const trend_r1 = ctx.$implicit;
|
|
39
|
+
i0.ɵɵadvance(2);
|
|
40
|
+
i0.ɵɵstyleProp("height", trend_r1.total > 0 ? trend_r1.successful / trend_r1.total * 100 : 0, "%");
|
|
41
|
+
i0.ɵɵadvance();
|
|
42
|
+
i0.ɵɵstyleProp("height", trend_r1.total > 0 ? trend_r1.failed / trend_r1.total * 100 : 0, "%");
|
|
43
|
+
i0.ɵɵadvance(2);
|
|
44
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(6, 6, trend_r1.date, "MMM d"));
|
|
45
|
+
i0.ɵɵadvance(3);
|
|
46
|
+
i0.ɵɵtextInterpolate(trend_r1.total);
|
|
47
|
+
} }
|
|
48
|
+
function ExecutionMonitoringComponent_Conditional_75_Template(rf, ctx) { if (rf & 1) {
|
|
49
|
+
i0.ɵɵelementStart(0, "div", 41);
|
|
50
|
+
i0.ɵɵrepeaterCreate(1, ExecutionMonitoringComponent_Conditional_75_For_2_Template, 9, 9, "div", 42, _forTrack0);
|
|
51
|
+
i0.ɵɵelementEnd();
|
|
52
|
+
i0.ɵɵelementStart(3, "div", 43)(4, "div", 44);
|
|
53
|
+
i0.ɵɵelement(5, "div", 45);
|
|
54
|
+
i0.ɵɵelementStart(6, "span");
|
|
55
|
+
i0.ɵɵtext(7, "Successful");
|
|
56
|
+
i0.ɵɵelementEnd()();
|
|
57
|
+
i0.ɵɵelementStart(8, "div", 44);
|
|
58
|
+
i0.ɵɵelement(9, "div", 46);
|
|
59
|
+
i0.ɵɵelementStart(10, "span");
|
|
60
|
+
i0.ɵɵtext(11, "Failed");
|
|
61
|
+
i0.ɵɵelementEnd()()();
|
|
62
|
+
} if (rf & 2) {
|
|
63
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
64
|
+
i0.ɵɵadvance();
|
|
65
|
+
i0.ɵɵrepeater(ctx_r1.executionTrends);
|
|
66
|
+
} }
|
|
67
|
+
function ExecutionMonitoringComponent_Conditional_76_Template(rf, ctx) { if (rf & 1) {
|
|
68
|
+
i0.ɵɵelementStart(0, "div", 33);
|
|
69
|
+
i0.ɵɵelement(1, "i", 31);
|
|
70
|
+
i0.ɵɵelementStart(2, "p");
|
|
71
|
+
i0.ɵɵtext(3, "No execution trends available");
|
|
72
|
+
i0.ɵɵelementEnd()();
|
|
73
|
+
} }
|
|
74
|
+
function ExecutionMonitoringComponent_Conditional_85_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
75
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
76
|
+
i0.ɵɵelementStart(0, "div", 53);
|
|
77
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_85_For_1_Template_div_click_0_listener() { const execution_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openExecution(execution_r4)); });
|
|
78
|
+
i0.ɵɵelementStart(1, "div", 54);
|
|
79
|
+
i0.ɵɵelement(2, "i");
|
|
80
|
+
i0.ɵɵelementEnd();
|
|
81
|
+
i0.ɵɵelementStart(3, "div", 55)(4, "div", 56);
|
|
82
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_85_For_1_Template_div_click_4_listener($event) { const execution_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.openAction(execution_r4.ActionID); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
83
|
+
i0.ɵɵtext(5);
|
|
84
|
+
i0.ɵɵelementEnd();
|
|
85
|
+
i0.ɵɵelementStart(6, "div", 57)(7, "span", 58);
|
|
86
|
+
i0.ɵɵtext(8);
|
|
87
|
+
i0.ɵɵpipe(9, "date");
|
|
88
|
+
i0.ɵɵelementEnd();
|
|
89
|
+
i0.ɵɵelementStart(10, "span", 59);
|
|
90
|
+
i0.ɵɵtext(11);
|
|
91
|
+
i0.ɵɵelementEnd();
|
|
92
|
+
i0.ɵɵelementStart(12, "span", 60);
|
|
93
|
+
i0.ɵɵtext(13);
|
|
94
|
+
i0.ɵɵelementEnd()()();
|
|
95
|
+
i0.ɵɵelementStart(14, "div", 61)(15, "kendo-chip", 62);
|
|
96
|
+
i0.ɵɵtext(16);
|
|
97
|
+
i0.ɵɵelementEnd()();
|
|
98
|
+
i0.ɵɵelementStart(17, "div", 63)(18, "button", 64);
|
|
99
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Conditional_85_For_1_Template_button_click_18_listener($event) { i0.ɵɵrestoreView(_r3); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
100
|
+
i0.ɵɵelementEnd()()();
|
|
101
|
+
} if (rf & 2) {
|
|
102
|
+
const execution_r4 = ctx.$implicit;
|
|
103
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
104
|
+
i0.ɵɵadvance(2);
|
|
105
|
+
i0.ɵɵclassMap(ctx_r1.getResultIcon(execution_r4.ResultCode));
|
|
106
|
+
i0.ɵɵadvance(3);
|
|
107
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.getActionName(execution_r4.ActionID), " ");
|
|
108
|
+
i0.ɵɵadvance(3);
|
|
109
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(9, 11, execution_r4.StartedAt, "MMM d, HH:mm:ss"));
|
|
110
|
+
i0.ɵɵadvance(3);
|
|
111
|
+
i0.ɵɵtextInterpolate(execution_r4.UserID);
|
|
112
|
+
i0.ɵɵadvance(2);
|
|
113
|
+
i0.ɵɵtextInterpolate(ctx_r1.getDuration(execution_r4));
|
|
114
|
+
i0.ɵɵadvance(2);
|
|
115
|
+
i0.ɵɵproperty("themeColor", ctx_r1.getResultColor(execution_r4.ResultCode))("size", "small");
|
|
116
|
+
i0.ɵɵadvance();
|
|
117
|
+
i0.ɵɵtextInterpolate1(" ", execution_r4.ResultCode || "Unknown", " ");
|
|
118
|
+
i0.ɵɵadvance(2);
|
|
119
|
+
i0.ɵɵproperty("fillMode", "flat")("icon", "more-vertical");
|
|
120
|
+
} }
|
|
121
|
+
function ExecutionMonitoringComponent_Conditional_85_Template(rf, ctx) { if (rf & 1) {
|
|
122
|
+
i0.ɵɵrepeaterCreate(0, ExecutionMonitoringComponent_Conditional_85_For_1_Template, 19, 14, "div", 52, _forTrack1);
|
|
123
|
+
} if (rf & 2) {
|
|
124
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
125
|
+
i0.ɵɵrepeater(ctx_r1.filteredExecutions);
|
|
126
|
+
} }
|
|
127
|
+
function ExecutionMonitoringComponent_Conditional_86_Template(rf, ctx) { if (rf & 1) {
|
|
128
|
+
i0.ɵɵelementStart(0, "div", 38);
|
|
129
|
+
i0.ɵɵelement(1, "i", 40);
|
|
130
|
+
i0.ɵɵelementStart(2, "h5");
|
|
131
|
+
i0.ɵɵtext(3, "No executions found");
|
|
132
|
+
i0.ɵɵelementEnd();
|
|
133
|
+
i0.ɵɵelementStart(4, "p");
|
|
134
|
+
i0.ɵɵtext(5, "Try adjusting your filters or search terms");
|
|
135
|
+
i0.ɵɵelementEnd()();
|
|
136
|
+
} }
|
|
137
|
+
function ExecutionMonitoringComponent_Conditional_87_Template(rf, ctx) { if (rf & 1) {
|
|
138
|
+
i0.ɵɵelementStart(0, "div", 39);
|
|
139
|
+
i0.ɵɵelement(1, "kendo-loader", 65);
|
|
140
|
+
i0.ɵɵelementEnd();
|
|
141
|
+
} if (rf & 2) {
|
|
142
|
+
i0.ɵɵadvance();
|
|
143
|
+
i0.ɵɵproperty("themeColor", "primary");
|
|
144
|
+
} }
|
|
145
|
+
export class ExecutionMonitoringComponent {
|
|
146
|
+
constructor() {
|
|
147
|
+
this.openEntityRecord = new EventEmitter();
|
|
148
|
+
this.showExecutionsListView = new EventEmitter();
|
|
149
|
+
this.isLoading = true;
|
|
150
|
+
this.executions = [];
|
|
151
|
+
this.filteredExecutions = [];
|
|
152
|
+
this.actions = new Map();
|
|
153
|
+
this.metrics = {
|
|
154
|
+
totalExecutions: 0,
|
|
155
|
+
successfulExecutions: 0,
|
|
156
|
+
failedExecutions: 0,
|
|
157
|
+
averageDuration: 0,
|
|
158
|
+
executionsToday: 0,
|
|
159
|
+
executionsThisWeek: 0,
|
|
160
|
+
currentlyRunning: 0
|
|
161
|
+
};
|
|
162
|
+
this.executionTrends = [];
|
|
163
|
+
this.searchTerm$ = new BehaviorSubject('');
|
|
164
|
+
this.selectedResult$ = new BehaviorSubject('all');
|
|
165
|
+
this.selectedTimeRange$ = new BehaviorSubject('7days');
|
|
166
|
+
this.selectedAction$ = new BehaviorSubject('all');
|
|
167
|
+
this.timeRangeOptions = [
|
|
168
|
+
{ text: 'Last 24 Hours', value: '24hours' },
|
|
169
|
+
{ text: 'Last 7 Days', value: '7days' },
|
|
170
|
+
{ text: 'Last 30 Days', value: '30days' },
|
|
171
|
+
{ text: 'Last 90 Days', value: '90days' }
|
|
172
|
+
];
|
|
173
|
+
this.resultOptions = [
|
|
174
|
+
{ text: 'All Results', value: 'all' },
|
|
175
|
+
{ text: 'Success', value: 'Success' },
|
|
176
|
+
{ text: 'Failed', value: 'Failed' },
|
|
177
|
+
{ text: 'Error', value: 'Error' },
|
|
178
|
+
{ text: 'Running', value: 'Running' }
|
|
179
|
+
];
|
|
180
|
+
this.actionOptions = [
|
|
181
|
+
{ text: 'All Actions', value: 'all' }
|
|
182
|
+
];
|
|
183
|
+
this.destroy$ = new Subject();
|
|
184
|
+
}
|
|
185
|
+
ngOnInit() {
|
|
186
|
+
this.setupFilters();
|
|
187
|
+
this.loadData();
|
|
188
|
+
}
|
|
189
|
+
ngOnDestroy() {
|
|
190
|
+
this.destroy$.next();
|
|
191
|
+
this.destroy$.complete();
|
|
192
|
+
}
|
|
193
|
+
setupFilters() {
|
|
194
|
+
combineLatest([
|
|
195
|
+
this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),
|
|
196
|
+
this.selectedResult$.pipe(distinctUntilChanged()),
|
|
197
|
+
this.selectedTimeRange$.pipe(distinctUntilChanged()),
|
|
198
|
+
this.selectedAction$.pipe(distinctUntilChanged())
|
|
199
|
+
]).pipe(takeUntil(this.destroy$)).subscribe(() => {
|
|
200
|
+
this.applyFilters();
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
loadData() {
|
|
204
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
205
|
+
try {
|
|
206
|
+
this.isLoading = true;
|
|
207
|
+
const [executions, actions] = yield Promise.all([
|
|
208
|
+
this.loadExecutions(),
|
|
209
|
+
this.loadActions()
|
|
210
|
+
]);
|
|
211
|
+
this.executions = executions;
|
|
212
|
+
this.populateActionsMap(actions);
|
|
213
|
+
this.buildActionOptions(actions);
|
|
214
|
+
this.calculateMetrics();
|
|
215
|
+
this.generateExecutionTrends();
|
|
216
|
+
this.applyFilters();
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
LogError('Failed to load execution monitoring data', undefined, error);
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
this.isLoading = false;
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
loadExecutions() {
|
|
227
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
228
|
+
const rv = new RunView();
|
|
229
|
+
const result = yield rv.RunView({
|
|
230
|
+
EntityName: 'Action Execution Logs',
|
|
231
|
+
ExtraFilter: '',
|
|
232
|
+
OrderBy: 'StartedAt DESC',
|
|
233
|
+
UserSearchString: '',
|
|
234
|
+
IgnoreMaxRows: false,
|
|
235
|
+
MaxRows: 5000
|
|
236
|
+
});
|
|
237
|
+
if (result && result.Success && result.Results) {
|
|
238
|
+
return result.Results;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
throw new Error('Failed to load action execution logs');
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
loadActions() {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
const rv = new RunView();
|
|
248
|
+
const result = yield rv.RunView({
|
|
249
|
+
EntityName: 'Actions',
|
|
250
|
+
ExtraFilter: '',
|
|
251
|
+
OrderBy: 'Name',
|
|
252
|
+
UserSearchString: '',
|
|
253
|
+
IgnoreMaxRows: false,
|
|
254
|
+
MaxRows: 1000
|
|
255
|
+
});
|
|
256
|
+
if (result && result.Success && result.Results) {
|
|
257
|
+
return result.Results;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
throw new Error('Failed to load actions');
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
populateActionsMap(actions) {
|
|
265
|
+
this.actions.clear();
|
|
266
|
+
actions.forEach(action => {
|
|
267
|
+
this.actions.set(action.ID, action);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
buildActionOptions(actions) {
|
|
271
|
+
this.actionOptions = [
|
|
272
|
+
{ text: 'All Actions', value: 'all' },
|
|
273
|
+
...actions.map(action => ({
|
|
274
|
+
text: action.Name,
|
|
275
|
+
value: action.ID
|
|
276
|
+
}))
|
|
277
|
+
];
|
|
278
|
+
}
|
|
279
|
+
calculateMetrics() {
|
|
280
|
+
const now = new Date();
|
|
281
|
+
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
282
|
+
const weekAgo = new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
283
|
+
this.metrics = {
|
|
284
|
+
totalExecutions: this.executions.length,
|
|
285
|
+
successfulExecutions: this.executions.filter(e => e.ResultCode === 'Success').length,
|
|
286
|
+
failedExecutions: this.executions.filter(e => e.ResultCode && ['Failed', 'Error'].includes(e.ResultCode)).length,
|
|
287
|
+
averageDuration: this.calculateAverageDuration(),
|
|
288
|
+
executionsToday: this.executions.filter(e => new Date(e.StartedAt) >= today).length,
|
|
289
|
+
executionsThisWeek: this.executions.filter(e => new Date(e.StartedAt) >= weekAgo).length,
|
|
290
|
+
currentlyRunning: this.executions.filter(e => e.ResultCode === 'Running' || !e.EndedAt).length
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
calculateAverageDuration() {
|
|
294
|
+
const completedExecutions = this.executions.filter(e => e.StartedAt && e.EndedAt);
|
|
295
|
+
if (completedExecutions.length === 0)
|
|
296
|
+
return 0;
|
|
297
|
+
const totalDuration = completedExecutions.reduce((sum, execution) => {
|
|
298
|
+
const start = new Date(execution.StartedAt).getTime();
|
|
299
|
+
const end = new Date(execution.EndedAt).getTime();
|
|
300
|
+
return sum + (end - start);
|
|
301
|
+
}, 0);
|
|
302
|
+
return Math.round(totalDuration / completedExecutions.length / 1000); // Average in seconds
|
|
303
|
+
}
|
|
304
|
+
generateExecutionTrends() {
|
|
305
|
+
const trends = new Map();
|
|
306
|
+
const last7Days = Array.from({ length: 7 }, (_, i) => {
|
|
307
|
+
const date = new Date();
|
|
308
|
+
date.setDate(date.getDate() - i);
|
|
309
|
+
return date.toISOString().split('T')[0];
|
|
310
|
+
}).reverse();
|
|
311
|
+
// Initialize trends for last 7 days
|
|
312
|
+
last7Days.forEach(date => {
|
|
313
|
+
trends.set(date, {
|
|
314
|
+
date,
|
|
315
|
+
successful: 0,
|
|
316
|
+
failed: 0,
|
|
317
|
+
total: 0
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
// Populate trends with execution data
|
|
321
|
+
this.executions.forEach(execution => {
|
|
322
|
+
if (!execution.StartedAt)
|
|
323
|
+
return;
|
|
324
|
+
const date = new Date(execution.StartedAt).toISOString().split('T')[0];
|
|
325
|
+
const trend = trends.get(date);
|
|
326
|
+
if (trend) {
|
|
327
|
+
trend.total++;
|
|
328
|
+
if (execution.ResultCode === 'Success') {
|
|
329
|
+
trend.successful++;
|
|
330
|
+
}
|
|
331
|
+
else if (execution.ResultCode && ['Failed', 'Error'].includes(execution.ResultCode)) {
|
|
332
|
+
trend.failed++;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
this.executionTrends = Array.from(trends.values());
|
|
337
|
+
}
|
|
338
|
+
applyFilters() {
|
|
339
|
+
let filtered = [...this.executions];
|
|
340
|
+
// Apply time range filter
|
|
341
|
+
const timeRange = this.selectedTimeRange$.value;
|
|
342
|
+
if (timeRange !== 'all') {
|
|
343
|
+
const cutoffDate = this.getTimeRangeCutoff(timeRange);
|
|
344
|
+
filtered = filtered.filter(e => e.StartedAt && new Date(e.StartedAt) >= cutoffDate);
|
|
345
|
+
}
|
|
346
|
+
// Apply result filter
|
|
347
|
+
const result = this.selectedResult$.value;
|
|
348
|
+
if (result !== 'all') {
|
|
349
|
+
if (result === 'Running') {
|
|
350
|
+
filtered = filtered.filter(e => !e.EndedAt || e.ResultCode === 'Running');
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
filtered = filtered.filter(e => e.ResultCode === result);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Apply action filter
|
|
357
|
+
const actionId = this.selectedAction$.value;
|
|
358
|
+
if (actionId !== 'all') {
|
|
359
|
+
filtered = filtered.filter(e => e.ActionID === actionId);
|
|
360
|
+
}
|
|
361
|
+
// Apply search filter
|
|
362
|
+
const searchTerm = this.searchTerm$.value.toLowerCase();
|
|
363
|
+
if (searchTerm) {
|
|
364
|
+
filtered = filtered.filter(e => {
|
|
365
|
+
var _a, _b;
|
|
366
|
+
const action = this.actions.get(e.ActionID);
|
|
367
|
+
return ((action === null || action === void 0 ? void 0 : action.Name.toLowerCase().includes(searchTerm)) ||
|
|
368
|
+
((_a = e.ResultCode) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchTerm)) ||
|
|
369
|
+
((_b = e.UserID) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchTerm)));
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
this.filteredExecutions = filtered;
|
|
373
|
+
}
|
|
374
|
+
getTimeRangeCutoff(timeRange) {
|
|
375
|
+
const now = new Date();
|
|
376
|
+
switch (timeRange) {
|
|
377
|
+
case '24hours':
|
|
378
|
+
return new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
|
379
|
+
case '7days':
|
|
380
|
+
return new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
381
|
+
case '30days':
|
|
382
|
+
return new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
|
|
383
|
+
case '90days':
|
|
384
|
+
return new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000);
|
|
385
|
+
default:
|
|
386
|
+
return new Date(0);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
onSearchChange(searchTerm) {
|
|
390
|
+
this.searchTerm$.next(searchTerm);
|
|
391
|
+
}
|
|
392
|
+
onResultFilterChange(result) {
|
|
393
|
+
this.selectedResult$.next(result);
|
|
394
|
+
}
|
|
395
|
+
onTimeRangeChange(timeRange) {
|
|
396
|
+
this.selectedTimeRange$.next(timeRange);
|
|
397
|
+
}
|
|
398
|
+
onActionFilterChange(actionId) {
|
|
399
|
+
this.selectedAction$.next(actionId);
|
|
400
|
+
}
|
|
401
|
+
openExecution(execution) {
|
|
402
|
+
this.openEntityRecord.emit({
|
|
403
|
+
entityName: 'Action Execution Logs',
|
|
404
|
+
recordId: execution.ID
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
openAction(actionId) {
|
|
408
|
+
this.openEntityRecord.emit({
|
|
409
|
+
entityName: 'Actions',
|
|
410
|
+
recordId: actionId
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
getActionName(actionId) {
|
|
414
|
+
var _a;
|
|
415
|
+
return ((_a = this.actions.get(actionId)) === null || _a === void 0 ? void 0 : _a.Name) || `Action ${actionId}`;
|
|
416
|
+
}
|
|
417
|
+
getResultColor(resultCode) {
|
|
418
|
+
if (!resultCode)
|
|
419
|
+
return 'info';
|
|
420
|
+
switch (resultCode.toLowerCase()) {
|
|
421
|
+
case 'success': return 'success';
|
|
422
|
+
case 'failed':
|
|
423
|
+
case 'error': return 'error';
|
|
424
|
+
case 'running': return 'warning';
|
|
425
|
+
default: return 'info';
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
getResultIcon(resultCode) {
|
|
429
|
+
if (!resultCode)
|
|
430
|
+
return 'fa-solid fa-question';
|
|
431
|
+
switch (resultCode.toLowerCase()) {
|
|
432
|
+
case 'success': return 'fa-solid fa-check-circle';
|
|
433
|
+
case 'failed':
|
|
434
|
+
case 'error': return 'fa-solid fa-exclamation-circle';
|
|
435
|
+
case 'running': return 'fa-solid fa-spinner fa-spin';
|
|
436
|
+
default: return 'fa-solid fa-info-circle';
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
getDuration(execution) {
|
|
440
|
+
if (!execution.StartedAt || !execution.EndedAt) {
|
|
441
|
+
return execution.EndedAt ? 'Unknown' : 'Running';
|
|
442
|
+
}
|
|
443
|
+
const start = new Date(execution.StartedAt).getTime();
|
|
444
|
+
const end = new Date(execution.EndedAt).getTime();
|
|
445
|
+
const duration = Math.round((end - start) / 1000);
|
|
446
|
+
if (duration < 60)
|
|
447
|
+
return `${duration}s`;
|
|
448
|
+
if (duration < 3600)
|
|
449
|
+
return `${Math.round(duration / 60)}m`;
|
|
450
|
+
return `${Math.round(duration / 3600)}h`;
|
|
451
|
+
}
|
|
452
|
+
getSuccessRate() {
|
|
453
|
+
if (this.metrics.totalExecutions === 0)
|
|
454
|
+
return 0;
|
|
455
|
+
return Math.round((this.metrics.successfulExecutions / this.metrics.totalExecutions) * 100);
|
|
456
|
+
}
|
|
457
|
+
refreshData() {
|
|
458
|
+
this.loadData();
|
|
459
|
+
}
|
|
460
|
+
// Metric card click handlers
|
|
461
|
+
onTotalExecutionsClick() {
|
|
462
|
+
this.showExecutionsListView.emit();
|
|
463
|
+
}
|
|
464
|
+
onSuccessRateClick() {
|
|
465
|
+
this.selectedResult$.next('Success');
|
|
466
|
+
}
|
|
467
|
+
onFailedExecutionsClick() {
|
|
468
|
+
this.selectedResult$.next('Failed');
|
|
469
|
+
}
|
|
470
|
+
onRunningExecutionsClick() {
|
|
471
|
+
this.selectedResult$.next('Running');
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
ExecutionMonitoringComponent.ɵfac = function ExecutionMonitoringComponent_Factory(t) { return new (t || ExecutionMonitoringComponent)(); };
|
|
475
|
+
ExecutionMonitoringComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ExecutionMonitoringComponent, selectors: [["mj-execution-monitoring"]], outputs: { openEntityRecord: "openEntityRecord", showExecutionsListView: "showExecutionsListView" }, decls: 88, vars: 22, consts: [["mjFillContainer", "", 1, "execution-monitoring"], [1, "monitoring-header"], [1, "header-title"], [1, "fa-solid", "fa-chart-line"], ["kendoButton", "", 1, "refresh-btn", 3, "click", "primary", "icon"], [1, "filters-row"], [1, "search-container"], ["placeholder", "Search executions...", 3, "valueChange", "value"], ["kendoTextBoxPrefixTemplate", ""], [1, "filter-group"], ["textField", "text", "valueField", "value", 3, "valueChange", "data", "value"], [1, "metrics-summary"], [1, "metric-card", "total", "clickable", 3, "click"], [1, "metric-icon"], [1, "fa-solid", "fa-play-circle"], [1, "metric-content"], [1, "metric-value"], [1, "metric-label"], [1, "metric-card", "success", "clickable", 3, "click"], [1, "fa-solid", "fa-check-circle"], [1, "metric-detail"], [1, "metric-card", "error", "clickable", 3, "click"], [1, "fa-solid", "fa-exclamation-circle"], [1, "metric-card", "duration"], [1, "fa-solid", "fa-clock"], [1, "metric-card", "activity"], [1, "fa-solid", "fa-calendar-day"], [1, "metric-card", "running", "clickable", 3, "click"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "trends-section"], [1, "section-header"], [1, "fa-solid", "fa-chart-area"], [1, "trends-chart"], [1, "empty-chart"], [1, "executions-section"], [1, "fa-solid", "fa-list"], [1, "results-count"], [1, "executions-list"], [1, "empty-state"], [1, "loading-overlay"], [1, "fa-solid", "fa-search"], [1, "trend-bars"], [1, "trend-bar"], [1, "chart-legend"], [1, "legend-item"], [1, "legend-color", "success"], [1, "legend-color", "failed"], [1, "bar-container"], [1, "bar-success"], [1, "bar-failed"], [1, "bar-label"], [1, "bar-total"], [1, "execution-item"], [1, "execution-item", 3, "click"], [1, "execution-status"], [1, "execution-main"], [1, "execution-action", 3, "click"], [1, "execution-details"], [1, "execution-time"], [1, "execution-user"], [1, "execution-duration"], [1, "execution-result"], [3, "themeColor", "size"], [1, "execution-actions"], ["kendoButton", "", 3, "click", "fillMode", "icon"], ["type", "converging-spinner", 3, "themeColor"]], template: function ExecutionMonitoringComponent_Template(rf, ctx) { if (rf & 1) {
|
|
476
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h3");
|
|
477
|
+
i0.ɵɵelement(4, "i", 3);
|
|
478
|
+
i0.ɵɵtext(5, " Execution Monitoring");
|
|
479
|
+
i0.ɵɵelementEnd();
|
|
480
|
+
i0.ɵɵelementStart(6, "button", 4);
|
|
481
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_button_click_6_listener() { return ctx.refreshData(); });
|
|
482
|
+
i0.ɵɵtext(7, " Refresh ");
|
|
483
|
+
i0.ɵɵelementEnd()();
|
|
484
|
+
i0.ɵɵelementStart(8, "div", 5)(9, "div", 6)(10, "kendo-textbox", 7);
|
|
485
|
+
i0.ɵɵlistener("valueChange", function ExecutionMonitoringComponent_Template_kendo_textbox_valueChange_10_listener($event) { return ctx.onSearchChange($event); });
|
|
486
|
+
i0.ɵɵtemplate(11, ExecutionMonitoringComponent_ng_template_11_Template, 1, 0, "ng-template", 8);
|
|
487
|
+
i0.ɵɵelementEnd()();
|
|
488
|
+
i0.ɵɵelementStart(12, "div", 9)(13, "kendo-dropdownlist", 10);
|
|
489
|
+
i0.ɵɵlistener("valueChange", function ExecutionMonitoringComponent_Template_kendo_dropdownlist_valueChange_13_listener($event) { return ctx.onTimeRangeChange($event); });
|
|
490
|
+
i0.ɵɵelementEnd();
|
|
491
|
+
i0.ɵɵelementStart(14, "kendo-dropdownlist", 10);
|
|
492
|
+
i0.ɵɵlistener("valueChange", function ExecutionMonitoringComponent_Template_kendo_dropdownlist_valueChange_14_listener($event) { return ctx.onResultFilterChange($event); });
|
|
493
|
+
i0.ɵɵelementEnd();
|
|
494
|
+
i0.ɵɵelementStart(15, "kendo-dropdownlist", 10);
|
|
495
|
+
i0.ɵɵlistener("valueChange", function ExecutionMonitoringComponent_Template_kendo_dropdownlist_valueChange_15_listener($event) { return ctx.onActionFilterChange($event); });
|
|
496
|
+
i0.ɵɵelementEnd()()()();
|
|
497
|
+
i0.ɵɵelementStart(16, "div", 11)(17, "div", 12);
|
|
498
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_17_listener() { return ctx.onTotalExecutionsClick(); });
|
|
499
|
+
i0.ɵɵelementStart(18, "div", 13);
|
|
500
|
+
i0.ɵɵelement(19, "i", 14);
|
|
501
|
+
i0.ɵɵelementEnd();
|
|
502
|
+
i0.ɵɵelementStart(20, "div", 15)(21, "div", 16);
|
|
503
|
+
i0.ɵɵtext(22);
|
|
504
|
+
i0.ɵɵelementEnd();
|
|
505
|
+
i0.ɵɵelementStart(23, "div", 17);
|
|
506
|
+
i0.ɵɵtext(24, "Total Executions");
|
|
507
|
+
i0.ɵɵelementEnd()()();
|
|
508
|
+
i0.ɵɵelementStart(25, "div", 18);
|
|
509
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_25_listener() { return ctx.onSuccessRateClick(); });
|
|
510
|
+
i0.ɵɵelementStart(26, "div", 13);
|
|
511
|
+
i0.ɵɵelement(27, "i", 19);
|
|
512
|
+
i0.ɵɵelementEnd();
|
|
513
|
+
i0.ɵɵelementStart(28, "div", 15)(29, "div", 16);
|
|
514
|
+
i0.ɵɵtext(30);
|
|
515
|
+
i0.ɵɵelementEnd();
|
|
516
|
+
i0.ɵɵelementStart(31, "div", 17);
|
|
517
|
+
i0.ɵɵtext(32, "Success Rate");
|
|
518
|
+
i0.ɵɵelementEnd();
|
|
519
|
+
i0.ɵɵelementStart(33, "div", 20);
|
|
520
|
+
i0.ɵɵtext(34);
|
|
521
|
+
i0.ɵɵelementEnd()()();
|
|
522
|
+
i0.ɵɵelementStart(35, "div", 21);
|
|
523
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_35_listener() { return ctx.onFailedExecutionsClick(); });
|
|
524
|
+
i0.ɵɵelementStart(36, "div", 13);
|
|
525
|
+
i0.ɵɵelement(37, "i", 22);
|
|
526
|
+
i0.ɵɵelementEnd();
|
|
527
|
+
i0.ɵɵelementStart(38, "div", 15)(39, "div", 16);
|
|
528
|
+
i0.ɵɵtext(40);
|
|
529
|
+
i0.ɵɵelementEnd();
|
|
530
|
+
i0.ɵɵelementStart(41, "div", 17);
|
|
531
|
+
i0.ɵɵtext(42, "Failed Executions");
|
|
532
|
+
i0.ɵɵelementEnd()()();
|
|
533
|
+
i0.ɵɵelementStart(43, "div", 23)(44, "div", 13);
|
|
534
|
+
i0.ɵɵelement(45, "i", 24);
|
|
535
|
+
i0.ɵɵelementEnd();
|
|
536
|
+
i0.ɵɵelementStart(46, "div", 15)(47, "div", 16);
|
|
537
|
+
i0.ɵɵtext(48);
|
|
538
|
+
i0.ɵɵelementEnd();
|
|
539
|
+
i0.ɵɵelementStart(49, "div", 17);
|
|
540
|
+
i0.ɵɵtext(50, "Avg Duration");
|
|
541
|
+
i0.ɵɵelementEnd()()();
|
|
542
|
+
i0.ɵɵelementStart(51, "div", 25)(52, "div", 13);
|
|
543
|
+
i0.ɵɵelement(53, "i", 26);
|
|
544
|
+
i0.ɵɵelementEnd();
|
|
545
|
+
i0.ɵɵelementStart(54, "div", 15)(55, "div", 16);
|
|
546
|
+
i0.ɵɵtext(56);
|
|
547
|
+
i0.ɵɵelementEnd();
|
|
548
|
+
i0.ɵɵelementStart(57, "div", 17);
|
|
549
|
+
i0.ɵɵtext(58, "Today");
|
|
550
|
+
i0.ɵɵelementEnd();
|
|
551
|
+
i0.ɵɵelementStart(59, "div", 20);
|
|
552
|
+
i0.ɵɵtext(60);
|
|
553
|
+
i0.ɵɵelementEnd()()();
|
|
554
|
+
i0.ɵɵelementStart(61, "div", 27);
|
|
555
|
+
i0.ɵɵlistener("click", function ExecutionMonitoringComponent_Template_div_click_61_listener() { return ctx.onRunningExecutionsClick(); });
|
|
556
|
+
i0.ɵɵelementStart(62, "div", 13);
|
|
557
|
+
i0.ɵɵelement(63, "i", 28);
|
|
558
|
+
i0.ɵɵelementEnd();
|
|
559
|
+
i0.ɵɵelementStart(64, "div", 15)(65, "div", 16);
|
|
560
|
+
i0.ɵɵtext(66);
|
|
561
|
+
i0.ɵɵelementEnd();
|
|
562
|
+
i0.ɵɵelementStart(67, "div", 17);
|
|
563
|
+
i0.ɵɵtext(68, "Currently Running");
|
|
564
|
+
i0.ɵɵelementEnd()()()();
|
|
565
|
+
i0.ɵɵelementStart(69, "div", 29)(70, "div", 30)(71, "h4");
|
|
566
|
+
i0.ɵɵelement(72, "i", 31);
|
|
567
|
+
i0.ɵɵtext(73, " 7-Day Execution Trends");
|
|
568
|
+
i0.ɵɵelementEnd()();
|
|
569
|
+
i0.ɵɵelementStart(74, "div", 32);
|
|
570
|
+
i0.ɵɵtemplate(75, ExecutionMonitoringComponent_Conditional_75_Template, 12, 0)(76, ExecutionMonitoringComponent_Conditional_76_Template, 4, 0, "div", 33);
|
|
571
|
+
i0.ɵɵelementEnd()();
|
|
572
|
+
i0.ɵɵelementStart(77, "div", 34)(78, "div", 30)(79, "h4");
|
|
573
|
+
i0.ɵɵelement(80, "i", 35);
|
|
574
|
+
i0.ɵɵtext(81, " Recent Executions");
|
|
575
|
+
i0.ɵɵelementEnd();
|
|
576
|
+
i0.ɵɵelementStart(82, "div", 36);
|
|
577
|
+
i0.ɵɵtext(83);
|
|
578
|
+
i0.ɵɵelementEnd()();
|
|
579
|
+
i0.ɵɵelementStart(84, "div", 37);
|
|
580
|
+
i0.ɵɵtemplate(85, ExecutionMonitoringComponent_Conditional_85_Template, 2, 0)(86, ExecutionMonitoringComponent_Conditional_86_Template, 6, 0, "div", 38);
|
|
581
|
+
i0.ɵɵelementEnd()();
|
|
582
|
+
i0.ɵɵtemplate(87, ExecutionMonitoringComponent_Conditional_87_Template, 2, 1, "div", 39);
|
|
583
|
+
i0.ɵɵelementEnd();
|
|
584
|
+
} if (rf & 2) {
|
|
585
|
+
i0.ɵɵadvance(6);
|
|
586
|
+
i0.ɵɵproperty("primary", true)("icon", "refresh");
|
|
587
|
+
i0.ɵɵadvance(4);
|
|
588
|
+
i0.ɵɵproperty("value", ctx.searchTerm$.value);
|
|
589
|
+
i0.ɵɵadvance(3);
|
|
590
|
+
i0.ɵɵproperty("data", ctx.timeRangeOptions)("value", ctx.selectedTimeRange$.value);
|
|
591
|
+
i0.ɵɵadvance();
|
|
592
|
+
i0.ɵɵproperty("data", ctx.resultOptions)("value", ctx.selectedResult$.value);
|
|
593
|
+
i0.ɵɵadvance();
|
|
594
|
+
i0.ɵɵproperty("data", ctx.actionOptions)("value", ctx.selectedAction$.value);
|
|
595
|
+
i0.ɵɵadvance(7);
|
|
596
|
+
i0.ɵɵtextInterpolate(ctx.metrics.totalExecutions);
|
|
597
|
+
i0.ɵɵadvance(8);
|
|
598
|
+
i0.ɵɵtextInterpolate1("", ctx.getSuccessRate(), "%");
|
|
599
|
+
i0.ɵɵadvance(4);
|
|
600
|
+
i0.ɵɵtextInterpolate2("", ctx.metrics.successfulExecutions, "/", ctx.metrics.totalExecutions, "");
|
|
601
|
+
i0.ɵɵadvance(6);
|
|
602
|
+
i0.ɵɵtextInterpolate(ctx.metrics.failedExecutions);
|
|
603
|
+
i0.ɵɵadvance(8);
|
|
604
|
+
i0.ɵɵtextInterpolate1("", ctx.metrics.averageDuration, "s");
|
|
605
|
+
i0.ɵɵadvance(8);
|
|
606
|
+
i0.ɵɵtextInterpolate(ctx.metrics.executionsToday);
|
|
607
|
+
i0.ɵɵadvance(4);
|
|
608
|
+
i0.ɵɵtextInterpolate1("", ctx.metrics.executionsThisWeek, " this week");
|
|
609
|
+
i0.ɵɵadvance(6);
|
|
610
|
+
i0.ɵɵtextInterpolate(ctx.metrics.currentlyRunning);
|
|
611
|
+
i0.ɵɵadvance(9);
|
|
612
|
+
i0.ɵɵconditional(ctx.executionTrends.length > 0 ? 75 : 76);
|
|
613
|
+
i0.ɵɵadvance(8);
|
|
614
|
+
i0.ɵɵtextInterpolate1("", ctx.filteredExecutions.length, " executions");
|
|
615
|
+
i0.ɵɵadvance(2);
|
|
616
|
+
i0.ɵɵconditional(ctx.filteredExecutions.length > 0 ? 85 : 86);
|
|
617
|
+
i0.ɵɵadvance(2);
|
|
618
|
+
i0.ɵɵconditional(ctx.isLoading ? 87 : -1);
|
|
619
|
+
} }, dependencies: [i1.LoaderComponent, i2.DropDownListComponent, i3.TextBoxComponent, i3.TextBoxPrefixTemplateDirective, i4.FillContainer, i5.ButtonComponent, i5.ChipComponent, i6.DatePipe], styles: [".execution-monitoring[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n\n .monitoring-header {\n .header-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n\n h3 {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .refresh-btn {\n gap: 0.5rem;\n }\n }\n\n .filters-row {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex-wrap: wrap;\n\n .search-container {\n flex: 1;\n min-width: 200px;\n\n kendo-textbox {\n width: 100%;\n }\n }\n\n .filter-group {\n display: flex;\n gap: 0.75rem;\n \n kendo-dropdownlist {\n min-width: 140px;\n }\n }\n }\n }\n\n .metrics-summary {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 1rem;\n\n .metric-card {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1.25rem;\n border-radius: 0.75rem;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.2s ease;\n\n &.clickable {\n cursor: pointer;\n \n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n }\n }\n\n .metric-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 0.5rem;\n font-size: 1rem;\n\n i {\n color: white;\n }\n }\n\n .metric-content {\n flex: 1;\n\n .metric-value {\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n margin-bottom: 0.25rem;\n }\n\n .metric-label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--kendo-color-subtle);\n margin-bottom: 0.125rem;\n }\n\n .metric-detail {\n font-size: 0.625rem;\n color: var(--kendo-color-subtle);\n }\n }\n\n &.total .metric-icon { background: var(--kendo-color-primary); }\n &.success .metric-icon { background: var(--kendo-color-success); }\n &.error .metric-icon { background: var(--kendo-color-error); }\n &.duration .metric-icon { background: var(--kendo-color-info); }\n &.activity .metric-icon { background: var(--kendo-color-warning); }\n &.running .metric-icon { background: var(--kendo-color-secondary); }\n }\n }\n\n .trends-section {\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n padding: 1.5rem;\n\n .section-header {\n margin-bottom: 1.5rem;\n\n h4 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n }\n\n .trends-chart {\n .trend-bars {\n display: flex;\n align-items: end;\n gap: 1rem;\n height: 120px;\n margin-bottom: 1rem;\n\n .trend-bar {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n\n .bar-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 80px;\n border-radius: 0.25rem;\n overflow: hidden;\n background: var(--kendo-color-border);\n position: relative;\n\n .bar-success {\n background: var(--kendo-color-success);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n }\n\n .bar-failed {\n background: var(--kendo-color-error);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n }\n }\n\n .bar-label {\n font-size: 0.625rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n\n .bar-total {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface);\n }\n }\n }\n\n .chart-legend {\n display: flex;\n justify-content: center;\n gap: 1.5rem;\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n\n .legend-color {\n width: 12px;\n height: 12px;\n border-radius: 2px;\n\n &.success { background: var(--kendo-color-success); }\n &.failed { background: var(--kendo-color-error); }\n }\n }\n }\n\n .empty-chart {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 120px;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n }\n\n .executions-section {\n flex: 1;\n min-height: 0;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n display: flex;\n flex-direction: column;\n\n .section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1.5rem 1.5rem 0;\n margin-bottom: 1rem;\n\n h4 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .results-count {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n }\n\n .executions-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 0 1.5rem 1.5rem;\n\n .execution-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.5rem;\n margin-bottom: 0.75rem;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--kendo-color-base-hover);\n border-color: var(--kendo-color-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .execution-status {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n\n i {\n font-size: 1rem;\n\n &.fa-check-circle { color: var(--kendo-color-success); }\n &.fa-exclamation-circle { color: var(--kendo-color-error); }\n &.fa-spinner { color: var(--kendo-color-warning); }\n &.fa-info-circle,\n &.fa-question { color: var(--kendo-color-info); }\n }\n }\n\n .execution-main {\n flex: 1;\n\n .execution-action {\n font-weight: 600;\n margin-bottom: 0.25rem;\n color: var(--kendo-color-primary);\n cursor: pointer;\n transition: color 0.2s ease;\n\n &:hover {\n color: var(--kendo-color-primary-darker);\n text-decoration: underline;\n }\n }\n\n .execution-details {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n\n .execution-time {\n font-weight: 600;\n }\n\n .execution-user {\n color: var(--kendo-color-info);\n }\n\n .execution-duration {\n font-weight: 600;\n }\n }\n }\n\n .execution-result {\n flex-shrink: 0;\n }\n\n .execution-actions {\n flex-shrink: 0;\n\n button {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n }\n\n &:hover .execution-actions button {\n opacity: 1;\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h5 {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n}\n\n//[_ngcontent-%COMP%] Responsive[_ngcontent-%COMP%] design\n@media[_ngcontent-%COMP%] (max-width[_ngcontent-%COMP%]: 1200px)[_ngcontent-%COMP%] {\n .execution-monitoring {\n .metrics-summary {\n grid-template-columns: repeat(3, 1fr);\n }\n\n .monitoring-header .filters-row {\n .filter-group {\n flex-wrap: wrap;\n }\n }\n }\n}\n\n@media (max-width: 768px) {\n .execution-monitoring[_ngcontent-%COMP%] {\n padding: 1rem;\n gap: 1rem;\n\n .metrics-summary {\n grid-template-columns: repeat(2, 1fr);\n gap: 0.75rem;\n\n .metric-card {\n padding: 1rem;\n\n .metric-content .metric-value {\n font-size: 1.25rem;\n }\n }\n }\n\n .monitoring-header {\n .header-title {\n flex-direction: column;\n align-items: stretch;\n gap: 1rem;\n }\n\n .filters-row {\n flex-direction: column;\n align-items: stretch;\n\n .search-container,\n .filter-group {\n min-width: unset;\n }\n\n .filter-group {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.5rem;\n }\n }\n }\n\n .trends-section .trends-chart .trend-bars {\n gap: 0.5rem;\n }\n }\n}"] });
|
|
620
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ExecutionMonitoringComponent, [{
|
|
621
|
+
type: Component,
|
|
622
|
+
args: [{ selector: 'mj-execution-monitoring', template: "<div class=\"execution-monitoring\" mjFillContainer>\n <!-- Header with filters -->\n <div class=\"monitoring-header\">\n <div class=\"header-title\">\n <h3><i class=\"fa-solid fa-chart-line\"></i> Execution Monitoring</h3>\n <button kendoButton [primary]=\"true\" [icon]=\"'refresh'\" (click)=\"refreshData()\" class=\"refresh-btn\">\n Refresh\n </button>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <kendo-textbox \n placeholder=\"Search executions...\" \n [value]=\"searchTerm$.value\"\n (valueChange)=\"onSearchChange($event)\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n \n <div class=\"filter-group\">\n <kendo-dropdownlist \n [data]=\"timeRangeOptions\"\n textField=\"text\"\n valueField=\"value\"\n [value]=\"selectedTimeRange$.value\"\n (valueChange)=\"onTimeRangeChange($event)\">\n </kendo-dropdownlist>\n \n <kendo-dropdownlist \n [data]=\"resultOptions\"\n textField=\"text\"\n valueField=\"value\"\n [value]=\"selectedResult$.value\"\n (valueChange)=\"onResultFilterChange($event)\">\n </kendo-dropdownlist>\n \n <kendo-dropdownlist \n [data]=\"actionOptions\"\n textField=\"text\"\n valueField=\"value\"\n [value]=\"selectedAction$.value\"\n (valueChange)=\"onActionFilterChange($event)\">\n </kendo-dropdownlist>\n </div>\n </div>\n </div>\n\n <!-- Metrics Summary -->\n <div class=\"metrics-summary\">\n <div class=\"metric-card total clickable\" (click)=\"onTotalExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-play-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalExecutions }}</div>\n <div class=\"metric-label\">Total Executions</div>\n </div>\n </div>\n\n <div class=\"metric-card success clickable\" (click)=\"onSuccessRateClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ getSuccessRate() }}%</div>\n <div class=\"metric-label\">Success Rate</div>\n <div class=\"metric-detail\">{{ metrics.successfulExecutions }}/{{ metrics.totalExecutions }}</div>\n </div>\n </div>\n\n <div class=\"metric-card error clickable\" (click)=\"onFailedExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.failedExecutions }}</div>\n <div class=\"metric-label\">Failed Executions</div>\n </div>\n </div>\n\n <div class=\"metric-card duration\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.averageDuration }}s</div>\n <div class=\"metric-label\">Avg Duration</div>\n </div>\n </div>\n\n <div class=\"metric-card activity\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-calendar-day\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.executionsToday }}</div>\n <div class=\"metric-label\">Today</div>\n <div class=\"metric-detail\">{{ metrics.executionsThisWeek }} this week</div>\n </div>\n </div>\n\n <div class=\"metric-card running clickable\" (click)=\"onRunningExecutionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.currentlyRunning }}</div>\n <div class=\"metric-label\">Currently Running</div>\n </div>\n </div>\n </div>\n\n <!-- Execution Trends Chart -->\n <div class=\"trends-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-chart-area\"></i> 7-Day Execution Trends</h4>\n </div>\n <div class=\"trends-chart\">\n @if (executionTrends.length > 0) {\n <div class=\"trend-bars\">\n @for (trend of executionTrends; track trend.date) {\n <div class=\"trend-bar\">\n <div class=\"bar-container\">\n <div class=\"bar-success\" [style.height.%]=\"trend.total > 0 ? (trend.successful / trend.total) * 100 : 0\"></div>\n <div class=\"bar-failed\" [style.height.%]=\"trend.total > 0 ? (trend.failed / trend.total) * 100 : 0\"></div>\n </div>\n <div class=\"bar-label\">{{ trend.date | date:'MMM d' }}</div>\n <div class=\"bar-total\">{{ trend.total }}</div>\n </div>\n }\n </div>\n <div class=\"chart-legend\">\n <div class=\"legend-item\">\n <div class=\"legend-color success\"></div>\n <span>Successful</span>\n </div>\n <div class=\"legend-item\">\n <div class=\"legend-color failed\"></div>\n <span>Failed</span>\n </div>\n </div>\n } @else {\n <div class=\"empty-chart\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <p>No execution trends available</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Execution List -->\n <div class=\"executions-section\">\n <div class=\"section-header\">\n <h4><i class=\"fa-solid fa-list\"></i> Recent Executions</h4>\n <div class=\"results-count\">{{ filteredExecutions.length }} executions</div>\n </div>\n \n <div class=\"executions-list\">\n @if (filteredExecutions.length > 0) {\n @for (execution of filteredExecutions; track execution.ID) {\n <div class=\"execution-item\" (click)=\"openExecution(execution)\">\n <div class=\"execution-status\">\n <i [class]=\"getResultIcon(execution.ResultCode)\"></i>\n </div>\n \n <div class=\"execution-main\">\n <div class=\"execution-action\" (click)=\"openAction(execution.ActionID!); $event.stopPropagation()\">\n {{ getActionName(execution.ActionID!) }}\n </div>\n <div class=\"execution-details\">\n <span class=\"execution-time\">{{ execution.StartedAt | date:'MMM d, HH:mm:ss' }}</span>\n <span class=\"execution-user\">{{ execution.UserID }}</span>\n <span class=\"execution-duration\">{{ getDuration(execution) }}</span>\n </div>\n </div>\n \n <div class=\"execution-result\">\n <kendo-chip \n [themeColor]=\"getResultColor(execution.ResultCode)\"\n [size]=\"'small'\">\n {{ execution.ResultCode || 'Unknown' }}\n </kendo-chip>\n </div>\n \n <div class=\"execution-actions\">\n <button kendoButton \n [fillMode]=\"'flat'\" \n [icon]=\"'more-vertical'\"\n (click)=\"$event.stopPropagation()\">\n </button>\n </div>\n </div>\n }\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h5>No executions found</h5>\n <p>Try adjusting your filters or search terms</p>\n </div>\n }\n </div>\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <kendo-loader type=\"converging-spinner\" [themeColor]=\"'primary'\"></kendo-loader>\n </div>\n }\n</div>", styles: [".execution-monitoring {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n\n .monitoring-header {\n .header-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n\n h3 {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .refresh-btn {\n gap: 0.5rem;\n }\n }\n\n .filters-row {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex-wrap: wrap;\n\n .search-container {\n flex: 1;\n min-width: 200px;\n\n kendo-textbox {\n width: 100%;\n }\n }\n\n .filter-group {\n display: flex;\n gap: 0.75rem;\n \n kendo-dropdownlist {\n min-width: 140px;\n }\n }\n }\n }\n\n .metrics-summary {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 1rem;\n\n .metric-card {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1.25rem;\n border-radius: 0.75rem;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: all 0.2s ease;\n\n &.clickable {\n cursor: pointer;\n \n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n }\n }\n\n .metric-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 0.5rem;\n font-size: 1rem;\n\n i {\n color: white;\n }\n }\n\n .metric-content {\n flex: 1;\n\n .metric-value {\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n margin-bottom: 0.25rem;\n }\n\n .metric-label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--kendo-color-subtle);\n margin-bottom: 0.125rem;\n }\n\n .metric-detail {\n font-size: 0.625rem;\n color: var(--kendo-color-subtle);\n }\n }\n\n &.total .metric-icon { background: var(--kendo-color-primary); }\n &.success .metric-icon { background: var(--kendo-color-success); }\n &.error .metric-icon { background: var(--kendo-color-error); }\n &.duration .metric-icon { background: var(--kendo-color-info); }\n &.activity .metric-icon { background: var(--kendo-color-warning); }\n &.running .metric-icon { background: var(--kendo-color-secondary); }\n }\n }\n\n .trends-section {\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n padding: 1.5rem;\n\n .section-header {\n margin-bottom: 1.5rem;\n\n h4 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n }\n\n .trends-chart {\n .trend-bars {\n display: flex;\n align-items: end;\n gap: 1rem;\n height: 120px;\n margin-bottom: 1rem;\n\n .trend-bar {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n\n .bar-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 80px;\n border-radius: 0.25rem;\n overflow: hidden;\n background: var(--kendo-color-border);\n position: relative;\n\n .bar-success {\n background: var(--kendo-color-success);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n }\n\n .bar-failed {\n background: var(--kendo-color-error);\n width: 100%;\n min-height: 2px;\n transition: height 0.3s ease;\n }\n }\n\n .bar-label {\n font-size: 0.625rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n\n .bar-total {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--kendo-color-on-app-surface);\n }\n }\n }\n\n .chart-legend {\n display: flex;\n justify-content: center;\n gap: 1.5rem;\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.75rem;\n\n .legend-color {\n width: 12px;\n height: 12px;\n border-radius: 2px;\n\n &.success { background: var(--kendo-color-success); }\n &.failed { background: var(--kendo-color-error); }\n }\n }\n }\n\n .empty-chart {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 120px;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n }\n\n .executions-section {\n flex: 1;\n min-height: 0;\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n display: flex;\n flex-direction: column;\n\n .section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1.5rem 1.5rem 0;\n margin-bottom: 1rem;\n\n h4 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n\n i {\n color: var(--kendo-color-primary);\n }\n }\n\n .results-count {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n }\n }\n\n .executions-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 0 1.5rem 1.5rem;\n\n .execution-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem;\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.5rem;\n margin-bottom: 0.75rem;\n cursor: pointer;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--kendo-color-base-hover);\n border-color: var(--kendo-color-primary);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .execution-status {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n\n i {\n font-size: 1rem;\n\n &.fa-check-circle { color: var(--kendo-color-success); }\n &.fa-exclamation-circle { color: var(--kendo-color-error); }\n &.fa-spinner { color: var(--kendo-color-warning); }\n &.fa-info-circle,\n &.fa-question { color: var(--kendo-color-info); }\n }\n }\n\n .execution-main {\n flex: 1;\n\n .execution-action {\n font-weight: 600;\n margin-bottom: 0.25rem;\n color: var(--kendo-color-primary);\n cursor: pointer;\n transition: color 0.2s ease;\n\n &:hover {\n color: var(--kendo-color-primary-darker);\n text-decoration: underline;\n }\n }\n\n .execution-details {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n\n .execution-time {\n font-weight: 600;\n }\n\n .execution-user {\n color: var(--kendo-color-info);\n }\n\n .execution-duration {\n font-weight: 600;\n }\n }\n }\n\n .execution-result {\n flex-shrink: 0;\n }\n\n .execution-actions {\n flex-shrink: 0;\n\n button {\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n }\n\n &:hover .execution-actions button {\n opacity: 1;\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 3rem 2rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 3rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n h5 {\n margin: 0 0 0.5rem 0;\n font-size: 1rem;\n font-weight: 600;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\n }\n }\n }\n }\n\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n}\n\n// Responsive design\n@media (max-width: 1200px) {\n .execution-monitoring {\n .metrics-summary {\n grid-template-columns: repeat(3, 1fr);\n }\n\n .monitoring-header .filters-row {\n .filter-group {\n flex-wrap: wrap;\n }\n }\n }\n}\n\n@media (max-width: 768px) {\n .execution-monitoring {\n padding: 1rem;\n gap: 1rem;\n\n .metrics-summary {\n grid-template-columns: repeat(2, 1fr);\n gap: 0.75rem;\n\n .metric-card {\n padding: 1rem;\n\n .metric-content .metric-value {\n font-size: 1.25rem;\n }\n }\n }\n\n .monitoring-header {\n .header-title {\n flex-direction: column;\n align-items: stretch;\n gap: 1rem;\n }\n\n .filters-row {\n flex-direction: column;\n align-items: stretch;\n\n .search-container,\n .filter-group {\n min-width: unset;\n }\n\n .filter-group {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));\n gap: 0.5rem;\n }\n }\n }\n\n .trends-section .trends-chart .trend-bars {\n gap: 0.5rem;\n }\n }\n}"] }]
|
|
623
|
+
}], () => [], { openEntityRecord: [{
|
|
624
|
+
type: Output
|
|
625
|
+
}], showExecutionsListView: [{
|
|
626
|
+
type: Output
|
|
627
|
+
}] }); })();
|
|
628
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ExecutionMonitoringComponent, { className: "ExecutionMonitoringComponent", filePath: "src/Actions/components/execution-monitoring.component.ts", lineNumber: 29 }); })();
|
|
629
|
+
//# sourceMappingURL=execution-monitoring.component.js.map
|