@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.
Files changed (117) hide show
  1. package/dist/AI/ai-dashboard.component.d.ts +54 -0
  2. package/dist/AI/ai-dashboard.component.d.ts.map +1 -0
  3. package/dist/AI/ai-dashboard.component.js +248 -0
  4. package/dist/AI/ai-dashboard.component.js.map +1 -0
  5. package/dist/AI/components/agents/agent-configuration.component.d.ts +41 -0
  6. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -0
  7. package/dist/AI/components/agents/agent-configuration.component.js +325 -0
  8. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -0
  9. package/dist/AI/components/agents/agent-editor.component.d.ts +77 -0
  10. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -0
  11. package/dist/AI/components/agents/agent-editor.component.js +869 -0
  12. package/dist/AI/components/agents/agent-editor.component.js.map +1 -0
  13. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +33 -0
  14. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -0
  15. package/dist/AI/components/agents/agent-filter-panel.component.js +144 -0
  16. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -0
  17. package/dist/AI/components/execution-monitoring.component.d.ts +13 -0
  18. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -0
  19. package/dist/AI/components/execution-monitoring.component.js +30 -0
  20. package/dist/AI/components/execution-monitoring.component.js.map +1 -0
  21. package/dist/AI/components/models/model-management.component.d.ts +73 -0
  22. package/dist/AI/components/models/model-management.component.d.ts.map +1 -0
  23. package/dist/AI/components/models/model-management.component.js +669 -0
  24. package/dist/AI/components/models/model-management.component.js.map +1 -0
  25. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +49 -0
  26. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +1 -0
  27. package/dist/AI/components/prompts/prompt-filter-panel.component.js +186 -0
  28. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -0
  29. package/dist/AI/components/prompts/prompt-management.component.d.ts +113 -0
  30. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -0
  31. package/dist/AI/components/prompts/prompt-management.component.js +1316 -0
  32. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -0
  33. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +33 -0
  34. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +1 -0
  35. package/dist/AI/components/system/system-config-filter-panel.component.js +146 -0
  36. package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -0
  37. package/dist/AI/components/system/system-configuration.component.d.ts +37 -0
  38. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -0
  39. package/dist/AI/components/system/system-configuration.component.js +311 -0
  40. package/dist/AI/components/system/system-configuration.component.js.map +1 -0
  41. package/dist/Actions/actions-management-dashboard.component.d.ts +50 -0
  42. package/dist/Actions/actions-management-dashboard.component.d.ts.map +1 -0
  43. package/dist/Actions/actions-management-dashboard.component.js +282 -0
  44. package/dist/Actions/actions-management-dashboard.component.js.map +1 -0
  45. package/dist/Actions/components/actions-list-view.component.d.ts +52 -0
  46. package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -0
  47. package/dist/Actions/components/actions-list-view.component.js +366 -0
  48. package/dist/Actions/components/actions-list-view.component.js.map +1 -0
  49. package/dist/Actions/components/actions-overview.component.d.ts +71 -0
  50. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -0
  51. package/dist/Actions/components/actions-overview.component.js +605 -0
  52. package/dist/Actions/components/actions-overview.component.js.map +1 -0
  53. package/dist/Actions/components/categories-list-view.component.d.ts +11 -0
  54. package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -0
  55. package/dist/Actions/components/categories-list-view.component.js +35 -0
  56. package/dist/Actions/components/categories-list-view.component.js.map +1 -0
  57. package/dist/Actions/components/code-management.component.d.ts +11 -0
  58. package/dist/Actions/components/code-management.component.d.ts.map +1 -0
  59. package/dist/Actions/components/code-management.component.js +35 -0
  60. package/dist/Actions/components/code-management.component.js.map +1 -0
  61. package/dist/Actions/components/entity-integration.component.d.ts +11 -0
  62. package/dist/Actions/components/entity-integration.component.d.ts.map +1 -0
  63. package/dist/Actions/components/entity-integration.component.js +35 -0
  64. package/dist/Actions/components/entity-integration.component.js.map +1 -0
  65. package/dist/Actions/components/execution-monitoring.component.d.ts +83 -0
  66. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -0
  67. package/dist/Actions/components/execution-monitoring.component.js +629 -0
  68. package/dist/Actions/components/execution-monitoring.component.js.map +1 -0
  69. package/dist/Actions/components/executions-list-view.component.d.ts +11 -0
  70. package/dist/Actions/components/executions-list-view.component.d.ts.map +1 -0
  71. package/dist/Actions/components/executions-list-view.component.js +35 -0
  72. package/dist/Actions/components/executions-list-view.component.js.map +1 -0
  73. package/dist/Actions/components/scheduled-actions.component.d.ts +11 -0
  74. package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -0
  75. package/dist/Actions/components/scheduled-actions.component.js +35 -0
  76. package/dist/Actions/components/scheduled-actions.component.js.map +1 -0
  77. package/dist/Actions/components/security-permissions.component.d.ts +11 -0
  78. package/dist/Actions/components/security-permissions.component.d.ts.map +1 -0
  79. package/dist/Actions/components/security-permissions.component.js +35 -0
  80. package/dist/Actions/components/security-permissions.component.js.map +1 -0
  81. package/dist/Actions/index.d.ts +11 -0
  82. package/dist/Actions/index.d.ts.map +1 -0
  83. package/dist/Actions/index.js +11 -0
  84. package/dist/Actions/index.js.map +1 -0
  85. package/dist/EntityAdmin/components/entity-details.component.d.ts +50 -0
  86. package/dist/EntityAdmin/components/entity-details.component.d.ts.map +1 -0
  87. package/dist/EntityAdmin/components/entity-details.component.js +684 -0
  88. package/dist/EntityAdmin/components/entity-details.component.js.map +1 -0
  89. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +31 -0
  90. package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +1 -0
  91. package/dist/EntityAdmin/components/entity-filter-panel.component.js +162 -0
  92. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -0
  93. package/dist/EntityAdmin/components/erd-composite.component.d.ts +73 -0
  94. package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +1 -0
  95. package/dist/EntityAdmin/components/erd-composite.component.js +288 -0
  96. package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -0
  97. package/dist/EntityAdmin/components/erd-diagram.component.d.ts +47 -0
  98. package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +1 -0
  99. package/dist/EntityAdmin/components/erd-diagram.component.js +618 -0
  100. package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -0
  101. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +50 -0
  102. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -0
  103. package/dist/EntityAdmin/entity-admin-dashboard.component.js +190 -0
  104. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -0
  105. package/dist/generic/base-dashboard.d.ts +65 -0
  106. package/dist/generic/base-dashboard.d.ts.map +1 -0
  107. package/dist/generic/base-dashboard.js +86 -0
  108. package/dist/generic/base-dashboard.js.map +1 -0
  109. package/dist/module.d.ts +43 -0
  110. package/dist/module.d.ts.map +1 -0
  111. package/dist/module.js +141 -0
  112. package/dist/module.js.map +1 -0
  113. package/dist/public-api.d.ts +6 -0
  114. package/dist/public-api.d.ts.map +1 -0
  115. package/dist/public-api.js +18 -0
  116. package/dist/public-api.js.map +1 -0
  117. package/package.json +46 -0
@@ -0,0 +1,605 @@
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.categoryId;
22
+ const _forTrack1 = ($index, $item) => $item.ID;
23
+ const _c0 = () => ({ text: "All Statuses", value: "all" });
24
+ const _c1 = () => ({ text: "Active", value: "Active" });
25
+ const _c2 = () => ({ text: "Pending", value: "Pending" });
26
+ const _c3 = () => ({ text: "Disabled", value: "Disabled" });
27
+ const _c4 = (a0, a1, a2, a3) => [a0, a1, a2, a3];
28
+ const _c5 = () => ({ text: "All Types", value: "all" });
29
+ const _c6 = () => ({ text: "AI Generated", value: "Generated" });
30
+ const _c7 = () => ({ text: "Custom", value: "Custom" });
31
+ const _c8 = (a0, a1, a2) => [a0, a1, a2];
32
+ function ActionsOverviewComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelement(0, "i", 42);
34
+ } }
35
+ function ActionsOverviewComponent_Conditional_68_For_2_Template(rf, ctx) { if (rf & 1) {
36
+ const _r1 = i0.ɵɵgetCurrentView();
37
+ i0.ɵɵelementStart(0, "div", 44);
38
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Conditional_68_For_2_Template_div_click_0_listener() { const category_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openCategory(category_r2.categoryId)); });
39
+ i0.ɵɵelementStart(1, "div", 45)(2, "div", 46);
40
+ i0.ɵɵtext(3);
41
+ i0.ɵɵelementEnd();
42
+ i0.ɵɵelementStart(4, "div", 47)(5, "span", 48);
43
+ i0.ɵɵtext(6);
44
+ i0.ɵɵelementEnd();
45
+ i0.ɵɵelementStart(7, "span", 48);
46
+ i0.ɵɵtext(8);
47
+ i0.ɵɵelementEnd();
48
+ i0.ɵɵelementStart(9, "span", 49);
49
+ i0.ɵɵtext(10);
50
+ i0.ɵɵelementEnd()()();
51
+ i0.ɵɵelementStart(11, "div", 50)(12, "div", 51);
52
+ i0.ɵɵelement(13, "div", 52);
53
+ i0.ɵɵelementEnd()()();
54
+ } if (rf & 2) {
55
+ const category_r2 = ctx.$implicit;
56
+ i0.ɵɵadvance(3);
57
+ i0.ɵɵtextInterpolate(category_r2.categoryName);
58
+ i0.ɵɵadvance(3);
59
+ i0.ɵɵtextInterpolate1("", category_r2.actionCount, " actions");
60
+ i0.ɵɵadvance(2);
61
+ i0.ɵɵtextInterpolate1("", category_r2.executionCount, " executions");
62
+ i0.ɵɵadvance(2);
63
+ i0.ɵɵtextInterpolate1("", category_r2.successRate, "% success");
64
+ i0.ɵɵadvance(3);
65
+ i0.ɵɵstyleProp("width", category_r2.successRate, "%");
66
+ } }
67
+ function ActionsOverviewComponent_Conditional_68_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelementStart(0, "div", 33);
69
+ i0.ɵɵrepeaterCreate(1, ActionsOverviewComponent_Conditional_68_For_2_Template, 14, 6, "div", 43, _forTrack0);
70
+ i0.ɵɵelementEnd();
71
+ } if (rf & 2) {
72
+ const ctx_r2 = i0.ɵɵnextContext();
73
+ i0.ɵɵadvance();
74
+ i0.ɵɵrepeater(ctx_r2.categoryStats);
75
+ } }
76
+ function ActionsOverviewComponent_Conditional_69_Template(rf, ctx) { if (rf & 1) {
77
+ i0.ɵɵelementStart(0, "div", 34);
78
+ i0.ɵɵelement(1, "i", 31);
79
+ i0.ɵɵelementStart(2, "p");
80
+ i0.ɵɵtext(3, "No category statistics available");
81
+ i0.ɵɵelementEnd()();
82
+ } }
83
+ function ActionsOverviewComponent_Conditional_76_For_2_Template(rf, ctx) { if (rf & 1) {
84
+ const _r4 = i0.ɵɵgetCurrentView();
85
+ i0.ɵɵelementStart(0, "div", 54);
86
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Conditional_76_For_2_Template_div_click_0_listener() { const action_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openAction(action_r5)); });
87
+ i0.ɵɵelementStart(1, "div", 55);
88
+ i0.ɵɵelement(2, "i");
89
+ i0.ɵɵelementEnd();
90
+ i0.ɵɵelementStart(3, "div", 56)(4, "div", 57);
91
+ i0.ɵɵtext(5);
92
+ i0.ɵɵelementEnd();
93
+ i0.ɵɵelementStart(6, "div", 58);
94
+ i0.ɵɵtext(7);
95
+ i0.ɵɵelementEnd()();
96
+ i0.ɵɵelementStart(8, "div", 59)(9, "kendo-chip", 60);
97
+ i0.ɵɵtext(10);
98
+ i0.ɵɵelementEnd()()();
99
+ } if (rf & 2) {
100
+ const action_r5 = ctx.$implicit;
101
+ const ctx_r2 = i0.ɵɵnextContext(2);
102
+ i0.ɵɵadvance(2);
103
+ i0.ɵɵclassMap(ctx_r2.getTypeIcon(action_r5.Type));
104
+ i0.ɵɵadvance(3);
105
+ i0.ɵɵtextInterpolate(action_r5.Name);
106
+ i0.ɵɵadvance(2);
107
+ i0.ɵɵtextInterpolate(action_r5.Description || "No description");
108
+ i0.ɵɵadvance(2);
109
+ i0.ɵɵproperty("themeColor", ctx_r2.getStatusColor(action_r5.Status))("size", "small");
110
+ i0.ɵɵadvance();
111
+ i0.ɵɵtextInterpolate1(" ", action_r5.Status, " ");
112
+ } }
113
+ function ActionsOverviewComponent_Conditional_76_Template(rf, ctx) { if (rf & 1) {
114
+ i0.ɵɵelementStart(0, "div", 37);
115
+ i0.ɵɵrepeaterCreate(1, ActionsOverviewComponent_Conditional_76_For_2_Template, 11, 7, "div", 53, _forTrack1);
116
+ i0.ɵɵelementEnd();
117
+ } if (rf & 2) {
118
+ const ctx_r2 = i0.ɵɵnextContext();
119
+ i0.ɵɵadvance();
120
+ i0.ɵɵrepeater(ctx_r2.recentActions);
121
+ } }
122
+ function ActionsOverviewComponent_Conditional_77_Template(rf, ctx) { if (rf & 1) {
123
+ i0.ɵɵelementStart(0, "div", 34);
124
+ i0.ɵɵelement(1, "i", 11);
125
+ i0.ɵɵelementStart(2, "p");
126
+ i0.ɵɵtext(3, "No recent actions found");
127
+ i0.ɵɵelementEnd()();
128
+ } }
129
+ function ActionsOverviewComponent_Conditional_84_For_2_Template(rf, ctx) { if (rf & 1) {
130
+ const _r6 = i0.ɵɵgetCurrentView();
131
+ i0.ɵɵelementStart(0, "div", 62);
132
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Conditional_84_For_2_Template_div_click_0_listener() { const execution_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openExecution(execution_r7)); });
133
+ i0.ɵɵelementStart(1, "div", 63);
134
+ i0.ɵɵtext(2);
135
+ i0.ɵɵpipe(3, "date");
136
+ i0.ɵɵelementEnd();
137
+ i0.ɵɵelementStart(4, "div", 64)(5, "div", 65);
138
+ i0.ɵɵtext(6);
139
+ i0.ɵɵelementEnd();
140
+ i0.ɵɵelementStart(7, "div", 66);
141
+ i0.ɵɵtext(8);
142
+ i0.ɵɵelementEnd()();
143
+ i0.ɵɵelementStart(9, "div", 67)(10, "kendo-chip", 60);
144
+ i0.ɵɵtext(11);
145
+ i0.ɵɵelementEnd()()();
146
+ } if (rf & 2) {
147
+ const execution_r7 = ctx.$implicit;
148
+ i0.ɵɵadvance(2);
149
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(3, 6, execution_r7.StartedAt, "MMM d, HH:mm"), " ");
150
+ i0.ɵɵadvance(4);
151
+ i0.ɵɵtextInterpolate1("Action ID: ", execution_r7.ActionID, "");
152
+ i0.ɵɵadvance(2);
153
+ i0.ɵɵtextInterpolate1("User: ", execution_r7.UserID, "");
154
+ i0.ɵɵadvance(2);
155
+ i0.ɵɵproperty("themeColor", execution_r7.ResultCode === "Success" ? "success" : "error")("size", "small");
156
+ i0.ɵɵadvance();
157
+ i0.ɵɵtextInterpolate1(" ", execution_r7.ResultCode || "Unknown", " ");
158
+ } }
159
+ function ActionsOverviewComponent_Conditional_84_Template(rf, ctx) { if (rf & 1) {
160
+ i0.ɵɵelementStart(0, "div", 40);
161
+ i0.ɵɵrepeaterCreate(1, ActionsOverviewComponent_Conditional_84_For_2_Template, 12, 9, "div", 61, _forTrack1);
162
+ i0.ɵɵelementEnd();
163
+ } if (rf & 2) {
164
+ const ctx_r2 = i0.ɵɵnextContext();
165
+ i0.ɵɵadvance();
166
+ i0.ɵɵrepeater(ctx_r2.recentExecutions);
167
+ } }
168
+ function ActionsOverviewComponent_Conditional_85_Template(rf, ctx) { if (rf & 1) {
169
+ i0.ɵɵelementStart(0, "div", 34);
170
+ i0.ɵɵelement(1, "i", 39);
171
+ i0.ɵɵelementStart(2, "p");
172
+ i0.ɵɵtext(3, "No recent executions found");
173
+ i0.ɵɵelementEnd()();
174
+ } }
175
+ function ActionsOverviewComponent_Conditional_86_Template(rf, ctx) { if (rf & 1) {
176
+ i0.ɵɵelementStart(0, "div", 41);
177
+ i0.ɵɵelement(1, "kendo-loader", 68);
178
+ i0.ɵɵelementEnd();
179
+ } if (rf & 2) {
180
+ i0.ɵɵadvance();
181
+ i0.ɵɵproperty("themeColor", "primary");
182
+ } }
183
+ export class ActionsOverviewComponent {
184
+ constructor() {
185
+ this.openEntityRecord = new EventEmitter();
186
+ this.showActionsListView = new EventEmitter();
187
+ this.showExecutionsListView = new EventEmitter();
188
+ this.showCategoriesListView = new EventEmitter();
189
+ this.isLoading = true;
190
+ this.metrics = {
191
+ totalActions: 0,
192
+ activeActions: 0,
193
+ pendingActions: 0,
194
+ disabledActions: 0,
195
+ totalExecutions: 0,
196
+ recentExecutions: 0,
197
+ successRate: 0,
198
+ totalCategories: 0,
199
+ aiGeneratedActions: 0,
200
+ customActions: 0
201
+ };
202
+ this.categoryStats = [];
203
+ this.recentActions = [];
204
+ this.recentExecutions = [];
205
+ this.topCategories = [];
206
+ this.searchTerm$ = new BehaviorSubject('');
207
+ this.selectedStatus$ = new BehaviorSubject('all');
208
+ this.selectedType$ = new BehaviorSubject('all');
209
+ this.destroy$ = new Subject();
210
+ }
211
+ ngOnInit() {
212
+ this.setupFilters();
213
+ this.loadData();
214
+ }
215
+ ngOnDestroy() {
216
+ this.destroy$.next();
217
+ this.destroy$.complete();
218
+ }
219
+ setupFilters() {
220
+ combineLatest([
221
+ this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),
222
+ this.selectedStatus$.pipe(distinctUntilChanged()),
223
+ this.selectedType$.pipe(distinctUntilChanged())
224
+ ]).pipe(takeUntil(this.destroy$)).subscribe(() => {
225
+ this.loadFilteredData();
226
+ });
227
+ }
228
+ loadData() {
229
+ return __awaiter(this, void 0, void 0, function* () {
230
+ try {
231
+ this.isLoading = true;
232
+ // Load all data in parallel
233
+ const [actions, categories, executions] = yield Promise.all([
234
+ this.loadActions(),
235
+ this.loadCategories(),
236
+ this.loadExecutions()
237
+ ]);
238
+ this.calculateMetrics(actions, categories, executions);
239
+ this.calculateCategoryStats(actions, categories, executions);
240
+ this.recentActions = actions.slice(0, 10);
241
+ this.recentExecutions = executions.slice(0, 10);
242
+ this.topCategories = categories.slice(0, 5);
243
+ }
244
+ catch (error) {
245
+ LogError('Failed to load actions overview data', undefined, error);
246
+ }
247
+ finally {
248
+ this.isLoading = false;
249
+ }
250
+ });
251
+ }
252
+ loadActions() {
253
+ return __awaiter(this, void 0, void 0, function* () {
254
+ const rv = new RunView();
255
+ const result = yield rv.RunView({
256
+ EntityName: 'Actions',
257
+ ExtraFilter: '',
258
+ OrderBy: 'UpdatedAt DESC',
259
+ UserSearchString: '',
260
+ IgnoreMaxRows: false,
261
+ MaxRows: 1000
262
+ });
263
+ if (result && result.Success && result.Results) {
264
+ return result.Results;
265
+ }
266
+ else {
267
+ throw new Error('Failed to load actions');
268
+ }
269
+ });
270
+ }
271
+ loadCategories() {
272
+ return __awaiter(this, void 0, void 0, function* () {
273
+ const rv = new RunView();
274
+ const result = yield rv.RunView({
275
+ EntityName: 'Action Categories',
276
+ ExtraFilter: '',
277
+ OrderBy: 'Name',
278
+ UserSearchString: '',
279
+ IgnoreMaxRows: false,
280
+ MaxRows: 1000
281
+ });
282
+ if (result && result.Success && result.Results) {
283
+ return result.Results;
284
+ }
285
+ else {
286
+ throw new Error('Failed to load action categories');
287
+ }
288
+ });
289
+ }
290
+ loadExecutions() {
291
+ return __awaiter(this, void 0, void 0, function* () {
292
+ const rv = new RunView();
293
+ const result = yield rv.RunView({
294
+ EntityName: 'Action Execution Logs',
295
+ ExtraFilter: '',
296
+ OrderBy: 'StartedAt DESC',
297
+ UserSearchString: '',
298
+ IgnoreMaxRows: false,
299
+ MaxRows: 1000
300
+ });
301
+ if (result && result.Success && result.Results) {
302
+ return result.Results;
303
+ }
304
+ else {
305
+ throw new Error('Failed to load action execution logs');
306
+ }
307
+ });
308
+ }
309
+ loadEntityActions() {
310
+ return __awaiter(this, void 0, void 0, function* () {
311
+ const rv = new RunView();
312
+ const result = yield rv.RunView({
313
+ EntityName: 'Entity Actions',
314
+ ExtraFilter: '',
315
+ OrderBy: 'UpdatedAt DESC',
316
+ UserSearchString: '',
317
+ IgnoreMaxRows: false,
318
+ MaxRows: 1000
319
+ });
320
+ if (result && result.Success && result.Results) {
321
+ return result.Results;
322
+ }
323
+ else {
324
+ throw new Error('Failed to load entity actions');
325
+ }
326
+ });
327
+ }
328
+ calculateMetrics(actions, categories, executions) {
329
+ this.metrics = {
330
+ totalActions: actions.length,
331
+ activeActions: actions.filter(a => a.Status === 'Active').length,
332
+ pendingActions: actions.filter(a => a.Status === 'Pending').length,
333
+ disabledActions: actions.filter(a => a.Status === 'Disabled').length,
334
+ totalExecutions: executions.length,
335
+ recentExecutions: executions.filter(e => {
336
+ const dayAgo = new Date();
337
+ dayAgo.setDate(dayAgo.getDate() - 1);
338
+ return new Date(e.StartedAt) > dayAgo;
339
+ }).length,
340
+ successRate: this.calculateSuccessRate(executions),
341
+ totalCategories: categories.length,
342
+ aiGeneratedActions: actions.filter(a => a.Type === 'Generated').length,
343
+ customActions: actions.filter(a => a.Type === 'Custom').length
344
+ };
345
+ }
346
+ calculateSuccessRate(executions) {
347
+ if (executions.length === 0)
348
+ return 0;
349
+ const successful = executions.filter(e => e.ResultCode === 'Success').length;
350
+ return Math.round((successful / executions.length) * 100);
351
+ }
352
+ calculateCategoryStats(actions, categories, executions) {
353
+ this.categoryStats = categories.map(category => {
354
+ const categoryActions = actions.filter(a => a.CategoryID === category.ID);
355
+ const categoryExecutions = executions.filter(e => categoryActions.some(a => a.ID === e.ActionID));
356
+ return {
357
+ categoryId: category.ID,
358
+ categoryName: category.Name,
359
+ actionCount: categoryActions.length,
360
+ executionCount: categoryExecutions.length,
361
+ successRate: this.calculateSuccessRate(categoryExecutions)
362
+ };
363
+ });
364
+ }
365
+ loadFilteredData() {
366
+ return __awaiter(this, void 0, void 0, function* () {
367
+ // Implement filtered data loading based on current filter values
368
+ const searchTerm = this.searchTerm$.value;
369
+ const status = this.selectedStatus$.value;
370
+ const type = this.selectedType$.value;
371
+ let extraFilter = '';
372
+ const filters = [];
373
+ if (status !== 'all') {
374
+ filters.push(`Status = '${status}'`);
375
+ }
376
+ if (type !== 'all') {
377
+ filters.push(`Type = '${type}'`);
378
+ }
379
+ if (filters.length > 0) {
380
+ extraFilter = filters.join(' AND ');
381
+ }
382
+ try {
383
+ const rv = new RunView();
384
+ const result = yield rv.RunView({
385
+ EntityName: 'Actions',
386
+ ExtraFilter: extraFilter,
387
+ OrderBy: 'UpdatedAt DESC',
388
+ UserSearchString: searchTerm,
389
+ IgnoreMaxRows: false,
390
+ MaxRows: 1000
391
+ });
392
+ this.recentActions = result.Results.slice(0, 10);
393
+ }
394
+ catch (error) {
395
+ LogError('Failed to load filtered actions', undefined, error);
396
+ }
397
+ });
398
+ }
399
+ onSearchChange(searchTerm) {
400
+ this.searchTerm$.next(searchTerm);
401
+ }
402
+ onStatusFilterChange(status) {
403
+ this.selectedStatus$.next(status);
404
+ }
405
+ onTypeFilterChange(type) {
406
+ this.selectedType$.next(type);
407
+ }
408
+ openAction(action) {
409
+ this.openEntityRecord.emit({
410
+ entityName: 'Actions',
411
+ recordId: action.ID
412
+ });
413
+ }
414
+ openCategory(categoryId) {
415
+ this.openEntityRecord.emit({
416
+ entityName: 'Action Categories',
417
+ recordId: categoryId
418
+ });
419
+ }
420
+ openExecution(execution) {
421
+ this.openEntityRecord.emit({
422
+ entityName: 'Action Execution Logs',
423
+ recordId: execution.ID
424
+ });
425
+ }
426
+ getStatusColor(status) {
427
+ switch (status) {
428
+ case 'Active': return 'success';
429
+ case 'Pending': return 'warning';
430
+ case 'Disabled': return 'error';
431
+ default: return 'info';
432
+ }
433
+ }
434
+ getTypeIcon(type) {
435
+ switch (type) {
436
+ case 'Generated': return 'fa-solid fa-robot';
437
+ case 'Custom': return 'fa-solid fa-code';
438
+ default: return 'fa-solid fa-cog';
439
+ }
440
+ }
441
+ // Metric card click handlers
442
+ onTotalActionsClick() {
443
+ this.showActionsListView.emit();
444
+ }
445
+ onExecutionsClick() {
446
+ this.showExecutionsListView.emit();
447
+ }
448
+ onCategoriesClick() {
449
+ this.showCategoriesListView.emit();
450
+ }
451
+ onAIGeneratedClick() {
452
+ // Filter to show AI generated actions in the current view
453
+ this.selectedType$.next('Generated');
454
+ }
455
+ }
456
+ ActionsOverviewComponent.ɵfac = function ActionsOverviewComponent_Factory(t) { return new (t || ActionsOverviewComponent)(); };
457
+ ActionsOverviewComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActionsOverviewComponent, selectors: [["mj-actions-overview"]], outputs: { openEntityRecord: "openEntityRecord", showActionsListView: "showActionsListView", showExecutionsListView: "showExecutionsListView", showCategoriesListView: "showCategoriesListView" }, decls: 87, vars: 35, consts: [["mjFillContainer", "", 1, "actions-overview"], [1, "overview-header"], [1, "filters-row"], [1, "search-container"], ["placeholder", "Search actions...", 3, "valueChange", "value"], ["kendoTextBoxPrefixTemplate", ""], [1, "filter-container"], ["textField", "text", "valueField", "value", 3, "valueChange", "data", "value"], [1, "metrics-grid"], [1, "metric-card", "primary", "clickable", 3, "click"], [1, "metric-icon"], [1, "fa-solid", "fa-cogs"], [1, "metric-content"], [1, "metric-value"], [1, "metric-label"], [1, "metric-breakdown"], [1, "active"], [1, "pending"], [1, "disabled"], [1, "metric-card", "success", "clickable", 3, "click"], [1, "fa-solid", "fa-play-circle"], [1, "recent"], [1, "success-rate"], [1, "metric-card", "info", "clickable", 3, "click"], [1, "fa-solid", "fa-sitemap"], [1, "metric-card", "warning", "clickable", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "custom"], [1, "content-grid"], [1, "panel", "category-stats"], [1, "panel-header"], [1, "fa-solid", "fa-chart-bar"], [1, "panel-content"], [1, "category-list"], [1, "empty-state"], [1, "panel", "recent-actions"], [1, "fa-solid", "fa-clock"], [1, "actions-list"], [1, "panel", "recent-executions"], [1, "fa-solid", "fa-history"], [1, "executions-list"], [1, "loading-overlay"], [1, "fa-solid", "fa-search"], [1, "category-item"], [1, "category-item", 3, "click"], [1, "category-info"], [1, "category-name"], [1, "category-metrics"], [1, "metric"], [1, "metric", "success-rate"], [1, "category-chart"], [1, "progress-bar"], [1, "progress-fill"], [1, "action-item"], [1, "action-item", 3, "click"], [1, "action-icon"], [1, "action-info"], [1, "action-name"], [1, "action-description"], [1, "action-status"], [3, "themeColor", "size"], [1, "execution-item"], [1, "execution-item", 3, "click"], [1, "execution-time"], [1, "execution-info"], [1, "execution-action"], [1, "execution-user"], [1, "execution-result"], ["type", "converging-spinner", 3, "themeColor"]], template: function ActionsOverviewComponent_Template(rf, ctx) { if (rf & 1) {
458
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3)(4, "kendo-textbox", 4);
459
+ i0.ɵɵlistener("valueChange", function ActionsOverviewComponent_Template_kendo_textbox_valueChange_4_listener($event) { return ctx.onSearchChange($event); });
460
+ i0.ɵɵtemplate(5, ActionsOverviewComponent_ng_template_5_Template, 1, 0, "ng-template", 5);
461
+ i0.ɵɵelementEnd()();
462
+ i0.ɵɵelementStart(6, "div", 6)(7, "kendo-dropdownlist", 7);
463
+ i0.ɵɵlistener("valueChange", function ActionsOverviewComponent_Template_kendo_dropdownlist_valueChange_7_listener($event) { return ctx.onStatusFilterChange($event); });
464
+ i0.ɵɵelementEnd()();
465
+ i0.ɵɵelementStart(8, "div", 6)(9, "kendo-dropdownlist", 7);
466
+ i0.ɵɵlistener("valueChange", function ActionsOverviewComponent_Template_kendo_dropdownlist_valueChange_9_listener($event) { return ctx.onTypeFilterChange($event); });
467
+ i0.ɵɵelementEnd()()()();
468
+ i0.ɵɵelementStart(10, "div", 8)(11, "div", 9);
469
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Template_div_click_11_listener() { return ctx.onTotalActionsClick(); });
470
+ i0.ɵɵelementStart(12, "div", 10);
471
+ i0.ɵɵelement(13, "i", 11);
472
+ i0.ɵɵelementEnd();
473
+ i0.ɵɵelementStart(14, "div", 12)(15, "div", 13);
474
+ i0.ɵɵtext(16);
475
+ i0.ɵɵelementEnd();
476
+ i0.ɵɵelementStart(17, "div", 14);
477
+ i0.ɵɵtext(18, "Total Actions");
478
+ i0.ɵɵelementEnd();
479
+ i0.ɵɵelementStart(19, "div", 15)(20, "span", 16);
480
+ i0.ɵɵtext(21);
481
+ i0.ɵɵelementEnd();
482
+ i0.ɵɵelementStart(22, "span", 17);
483
+ i0.ɵɵtext(23);
484
+ i0.ɵɵelementEnd();
485
+ i0.ɵɵelementStart(24, "span", 18);
486
+ i0.ɵɵtext(25);
487
+ i0.ɵɵelementEnd()()()();
488
+ i0.ɵɵelementStart(26, "div", 19);
489
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Template_div_click_26_listener() { return ctx.onExecutionsClick(); });
490
+ i0.ɵɵelementStart(27, "div", 10);
491
+ i0.ɵɵelement(28, "i", 20);
492
+ i0.ɵɵelementEnd();
493
+ i0.ɵɵelementStart(29, "div", 12)(30, "div", 13);
494
+ i0.ɵɵtext(31);
495
+ i0.ɵɵelementEnd();
496
+ i0.ɵɵelementStart(32, "div", 14);
497
+ i0.ɵɵtext(33, "Total Executions");
498
+ i0.ɵɵelementEnd();
499
+ i0.ɵɵelementStart(34, "div", 15)(35, "span", 21);
500
+ i0.ɵɵtext(36);
501
+ i0.ɵɵelementEnd();
502
+ i0.ɵɵelementStart(37, "span", 22);
503
+ i0.ɵɵtext(38);
504
+ i0.ɵɵelementEnd()()()();
505
+ i0.ɵɵelementStart(39, "div", 23);
506
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Template_div_click_39_listener() { return ctx.onCategoriesClick(); });
507
+ i0.ɵɵelementStart(40, "div", 10);
508
+ i0.ɵɵelement(41, "i", 24);
509
+ i0.ɵɵelementEnd();
510
+ i0.ɵɵelementStart(42, "div", 12)(43, "div", 13);
511
+ i0.ɵɵtext(44);
512
+ i0.ɵɵelementEnd();
513
+ i0.ɵɵelementStart(45, "div", 14);
514
+ i0.ɵɵtext(46, "Categories");
515
+ i0.ɵɵelementEnd();
516
+ i0.ɵɵelementStart(47, "div", 15)(48, "span");
517
+ i0.ɵɵtext(49, "Organized structure");
518
+ i0.ɵɵelementEnd()()()();
519
+ i0.ɵɵelementStart(50, "div", 25);
520
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Template_div_click_50_listener() { return ctx.onAIGeneratedClick(); });
521
+ i0.ɵɵelementStart(51, "div", 10);
522
+ i0.ɵɵelement(52, "i", 26);
523
+ i0.ɵɵelementEnd();
524
+ i0.ɵɵelementStart(53, "div", 12)(54, "div", 13);
525
+ i0.ɵɵtext(55);
526
+ i0.ɵɵelementEnd();
527
+ i0.ɵɵelementStart(56, "div", 14);
528
+ i0.ɵɵtext(57, "AI Generated");
529
+ i0.ɵɵelementEnd();
530
+ i0.ɵɵelementStart(58, "div", 15)(59, "span", 27);
531
+ i0.ɵɵtext(60);
532
+ i0.ɵɵelementEnd()()()()();
533
+ i0.ɵɵelementStart(61, "div", 28)(62, "div", 29)(63, "div", 30)(64, "h3");
534
+ i0.ɵɵelement(65, "i", 31);
535
+ i0.ɵɵtext(66, " Category Performance");
536
+ i0.ɵɵelementEnd()();
537
+ i0.ɵɵelementStart(67, "div", 32);
538
+ i0.ɵɵtemplate(68, ActionsOverviewComponent_Conditional_68_Template, 3, 0, "div", 33)(69, ActionsOverviewComponent_Conditional_69_Template, 4, 0, "div", 34);
539
+ i0.ɵɵelementEnd()();
540
+ i0.ɵɵelementStart(70, "div", 35)(71, "div", 30)(72, "h3");
541
+ i0.ɵɵelement(73, "i", 36);
542
+ i0.ɵɵtext(74, " Recent Actions");
543
+ i0.ɵɵelementEnd()();
544
+ i0.ɵɵelementStart(75, "div", 32);
545
+ i0.ɵɵtemplate(76, ActionsOverviewComponent_Conditional_76_Template, 3, 0, "div", 37)(77, ActionsOverviewComponent_Conditional_77_Template, 4, 0, "div", 34);
546
+ i0.ɵɵelementEnd()();
547
+ i0.ɵɵelementStart(78, "div", 38)(79, "div", 30)(80, "h3");
548
+ i0.ɵɵelement(81, "i", 39);
549
+ i0.ɵɵtext(82, " Recent Executions");
550
+ i0.ɵɵelementEnd()();
551
+ i0.ɵɵelementStart(83, "div", 32);
552
+ i0.ɵɵtemplate(84, ActionsOverviewComponent_Conditional_84_Template, 3, 0, "div", 40)(85, ActionsOverviewComponent_Conditional_85_Template, 4, 0, "div", 34);
553
+ i0.ɵɵelementEnd()()();
554
+ i0.ɵɵtemplate(86, ActionsOverviewComponent_Conditional_86_Template, 2, 1, "div", 41);
555
+ i0.ɵɵelementEnd();
556
+ } if (rf & 2) {
557
+ i0.ɵɵadvance(4);
558
+ i0.ɵɵproperty("value", ctx.searchTerm$.value);
559
+ i0.ɵɵadvance(3);
560
+ i0.ɵɵproperty("data", i0.ɵɵpureFunction4(23, _c4, i0.ɵɵpureFunction0(19, _c0), i0.ɵɵpureFunction0(20, _c1), i0.ɵɵpureFunction0(21, _c2), i0.ɵɵpureFunction0(22, _c3)))("value", ctx.selectedStatus$.value);
561
+ i0.ɵɵadvance(2);
562
+ i0.ɵɵproperty("data", i0.ɵɵpureFunction3(31, _c8, i0.ɵɵpureFunction0(28, _c5), i0.ɵɵpureFunction0(29, _c6), i0.ɵɵpureFunction0(30, _c7)))("value", ctx.selectedType$.value);
563
+ i0.ɵɵadvance(7);
564
+ i0.ɵɵtextInterpolate(ctx.metrics.totalActions);
565
+ i0.ɵɵadvance(5);
566
+ i0.ɵɵtextInterpolate1("", ctx.metrics.activeActions, " Active");
567
+ i0.ɵɵadvance(2);
568
+ i0.ɵɵtextInterpolate1("", ctx.metrics.pendingActions, " Pending");
569
+ i0.ɵɵadvance(2);
570
+ i0.ɵɵtextInterpolate1("", ctx.metrics.disabledActions, " Disabled");
571
+ i0.ɵɵadvance(6);
572
+ i0.ɵɵtextInterpolate(ctx.metrics.totalExecutions);
573
+ i0.ɵɵadvance(5);
574
+ i0.ɵɵtextInterpolate1("", ctx.metrics.recentExecutions, " in last 24h");
575
+ i0.ɵɵadvance(2);
576
+ i0.ɵɵtextInterpolate1("", ctx.metrics.successRate, "% success rate");
577
+ i0.ɵɵadvance(6);
578
+ i0.ɵɵtextInterpolate(ctx.metrics.totalCategories);
579
+ i0.ɵɵadvance(11);
580
+ i0.ɵɵtextInterpolate(ctx.metrics.aiGeneratedActions);
581
+ i0.ɵɵadvance(5);
582
+ i0.ɵɵtextInterpolate1("", ctx.metrics.customActions, " Custom");
583
+ i0.ɵɵadvance(8);
584
+ i0.ɵɵconditional(ctx.categoryStats.length > 0 ? 68 : 69);
585
+ i0.ɵɵadvance(8);
586
+ i0.ɵɵconditional(ctx.recentActions.length > 0 ? 76 : 77);
587
+ i0.ɵɵadvance(8);
588
+ i0.ɵɵconditional(ctx.recentExecutions.length > 0 ? 84 : 85);
589
+ i0.ɵɵadvance(2);
590
+ i0.ɵɵconditional(ctx.isLoading ? 86 : -1);
591
+ } }, dependencies: [i1.LoaderComponent, i2.DropDownListComponent, i3.TextBoxComponent, i3.TextBoxPrefixTemplateDirective, i4.FillContainer, i5.ChipComponent, i6.DatePipe], styles: [".actions-overview[_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 .overview-header {\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-container {\n min-width: 150px;\n \n kendo-dropdownlist {\n width: 100%;\n }\n }\n }\n }\n\n .metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 1.5rem;\n\n .metric-card {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1.5rem;\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: 3rem;\n height: 3rem;\n border-radius: 0.5rem;\n font-size: 1.25rem;\n\n i {\n color: white;\n }\n }\n\n .metric-content {\n flex: 1;\n\n .metric-value {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1;\n margin-bottom: 0.25rem;\n }\n\n .metric-label {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--kendo-color-subtle);\n margin-bottom: 0.5rem;\n }\n\n .metric-breakdown {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n font-size: 0.75rem;\n\n span {\n color: var(--kendo-color-subtle);\n\n &.active { color: var(--kendo-color-success); }\n &.pending { color: var(--kendo-color-warning); }\n &.disabled { color: var(--kendo-color-error); }\n &.recent { color: var(--kendo-color-info); }\n &.success-rate { color: var(--kendo-color-success); }\n &.custom { color: var(--kendo-color-primary); }\n }\n }\n }\n\n &.primary .metric-icon { background: var(--kendo-color-primary); }\n &.success .metric-icon { background: var(--kendo-color-success); }\n &.info .metric-icon { background: var(--kendo-color-info); }\n &.warning .metric-icon { background: var(--kendo-color-warning); }\n }\n }\n\n .content-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-template-rows: auto auto;\n gap: 1.5rem;\n flex: 1;\n\n .panel {\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n\n .panel-header {\n padding: 1rem 1.5rem;\n background: var(--kendo-color-app-surface);\n border-bottom: 1px solid var(--kendo-color-border);\n\n h3 {\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 .panel-content {\n padding: 1.5rem;\n height: calc(100% - 60px);\n overflow-y: auto;\n }\n }\n\n .category-stats {\n .category-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n\n .category-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 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 }\n\n .category-info {\n flex: 1;\n\n .category-name {\n font-weight: 600;\n margin-bottom: 0.25rem;\n }\n\n .category-metrics {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n\n .metric {\n &.success-rate {\n color: var(--kendo-color-success);\n font-weight: 600;\n }\n }\n }\n }\n\n .category-chart {\n width: 60px;\n\n .progress-bar {\n height: 6px;\n background: var(--kendo-color-border);\n border-radius: 3px;\n overflow: hidden;\n\n .progress-fill {\n height: 100%;\n background: var(--kendo-color-success);\n transition: width 0.3s ease;\n }\n }\n }\n }\n }\n }\n\n .recent-actions {\n .actions-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n\n .action-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 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 }\n\n .action-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 0.375rem;\n background: var(--kendo-color-primary-subtle);\n\n i {\n color: var(--kendo-color-primary);\n font-size: 1rem;\n }\n }\n\n .action-info {\n flex: 1;\n\n .action-name {\n font-weight: 600;\n margin-bottom: 0.25rem;\n }\n\n .action-description {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n line-height: 1.3;\n }\n }\n\n .action-status {\n flex-shrink: 0;\n }\n }\n }\n }\n\n .recent-executions {\n grid-column: 1 / -1;\n\n .executions-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\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 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 }\n\n .execution-time {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n min-width: 80px;\n }\n\n .execution-info {\n flex: 1;\n\n .execution-action {\n font-weight: 600;\n margin-bottom: 0.25rem;\n font-size: 0.875rem;\n }\n\n .execution-user {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n }\n }\n\n .execution-result {\n flex-shrink: 0;\n }\n }\n }\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 2.5rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\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 .actions-overview .content-grid {\n grid-template-columns: 1fr;\n \n .recent-executions {\n grid-column: 1;\n }\n }\n}\n\n@media (max-width: 768px) {\n .actions-overview[_ngcontent-%COMP%] {\n padding: 1rem;\n gap: 1rem;\n\n .metrics-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .overview-header .filters-row {\n flex-direction: column;\n align-items: stretch;\n\n .search-container,\n .filter-container {\n min-width: unset;\n }\n }\n }\n}"] });
592
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActionsOverviewComponent, [{
593
+ type: Component,
594
+ args: [{ selector: 'mj-actions-overview', template: "<div class=\"actions-overview\" mjFillContainer>\n <!-- Header with search and filters -->\n <div class=\"overview-header\">\n <div class=\"filters-row\">\n <div class=\"search-container\">\n <kendo-textbox \n placeholder=\"Search actions...\" \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-container\">\n <kendo-dropdownlist \n [data]=\"[\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Pending', value: 'Pending' },\n { text: 'Disabled', value: 'Disabled' }\n ]\"\n textField=\"text\"\n valueField=\"value\"\n [value]=\"selectedStatus$.value\"\n (valueChange)=\"onStatusFilterChange($event)\">\n </kendo-dropdownlist>\n </div>\n \n <div class=\"filter-container\">\n <kendo-dropdownlist \n [data]=\"[\n { text: 'All Types', value: 'all' },\n { text: 'AI Generated', value: 'Generated' },\n { text: 'Custom', value: 'Custom' }\n ]\"\n textField=\"text\"\n valueField=\"value\"\n [value]=\"selectedType$.value\"\n (valueChange)=\"onTypeFilterChange($event)\">\n </kendo-dropdownlist>\n </div>\n </div>\n </div>\n\n <!-- Metrics Cards -->\n <div class=\"metrics-grid\">\n <div class=\"metric-card primary clickable\" (click)=\"onTotalActionsClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-cogs\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalActions }}</div>\n <div class=\"metric-label\">Total Actions</div>\n <div class=\"metric-breakdown\">\n <span class=\"active\">{{ metrics.activeActions }} Active</span>\n <span class=\"pending\">{{ metrics.pendingActions }} Pending</span>\n <span class=\"disabled\">{{ metrics.disabledActions }} Disabled</span>\n </div>\n </div>\n </div>\n\n <div class=\"metric-card success clickable\" (click)=\"onExecutionsClick()\">\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 class=\"metric-breakdown\">\n <span class=\"recent\">{{ metrics.recentExecutions }} in last 24h</span>\n <span class=\"success-rate\">{{ metrics.successRate }}% success rate</span>\n </div>\n </div>\n </div>\n\n <div class=\"metric-card info clickable\" (click)=\"onCategoriesClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-sitemap\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.totalCategories }}</div>\n <div class=\"metric-label\">Categories</div>\n <div class=\"metric-breakdown\">\n <span>Organized structure</span>\n </div>\n </div>\n </div>\n\n <div class=\"metric-card warning clickable\" (click)=\"onAIGeneratedClick()\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-robot\"></i>\n </div>\n <div class=\"metric-content\">\n <div class=\"metric-value\">{{ metrics.aiGeneratedActions }}</div>\n <div class=\"metric-label\">AI Generated</div>\n <div class=\"metric-breakdown\">\n <span class=\"custom\">{{ metrics.customActions }} Custom</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Content Grid -->\n <div class=\"content-grid\">\n <!-- Category Statistics -->\n <div class=\"panel category-stats\">\n <div class=\"panel-header\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Category Performance</h3>\n </div>\n <div class=\"panel-content\">\n @if (categoryStats.length > 0) {\n <div class=\"category-list\">\n @for (category of categoryStats; track category.categoryId) {\n <div class=\"category-item\" (click)=\"openCategory(category.categoryId)\">\n <div class=\"category-info\">\n <div class=\"category-name\">{{ category.categoryName }}</div>\n <div class=\"category-metrics\">\n <span class=\"metric\">{{ category.actionCount }} actions</span>\n <span class=\"metric\">{{ category.executionCount }} executions</span>\n <span class=\"metric success-rate\">{{ category.successRate }}% success</span>\n </div>\n </div>\n <div class=\"category-chart\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width.%]=\"category.successRate\"></div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n <p>No category statistics available</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Actions -->\n <div class=\"panel recent-actions\">\n <div class=\"panel-header\">\n <h3><i class=\"fa-solid fa-clock\"></i> Recent Actions</h3>\n </div>\n <div class=\"panel-content\">\n @if (recentActions.length > 0) {\n <div class=\"actions-list\">\n @for (action of recentActions; track action.ID) {\n <div class=\"action-item\" (click)=\"openAction(action)\">\n <div class=\"action-icon\">\n <i [class]=\"getTypeIcon(action.Type)\"></i>\n </div>\n <div class=\"action-info\">\n <div class=\"action-name\">{{ action.Name }}</div>\n <div class=\"action-description\">{{ action.Description || 'No description' }}</div>\n </div>\n <div class=\"action-status\">\n <kendo-chip \n [themeColor]=\"getStatusColor(action.Status)\"\n [size]=\"'small'\">\n {{ action.Status }}\n </kendo-chip>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cogs\"></i>\n <p>No recent actions found</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Recent Executions -->\n <div class=\"panel recent-executions\">\n <div class=\"panel-header\">\n <h3><i class=\"fa-solid fa-history\"></i> Recent Executions</h3>\n </div>\n <div class=\"panel-content\">\n @if (recentExecutions.length > 0) {\n <div class=\"executions-list\">\n @for (execution of recentExecutions; track execution.ID) {\n <div class=\"execution-item\" (click)=\"openExecution(execution)\">\n <div class=\"execution-time\">\n {{ execution.StartedAt | date:'MMM d, HH:mm' }}\n </div>\n <div class=\"execution-info\">\n <div class=\"execution-action\">Action ID: {{ execution.ActionID }}</div>\n <div class=\"execution-user\">User: {{ execution.UserID }}</div>\n </div>\n <div class=\"execution-result\">\n <kendo-chip \n [themeColor]=\"execution.ResultCode === 'Success' ? 'success' : 'error'\"\n [size]=\"'small'\">\n {{ execution.ResultCode || 'Unknown' }}\n </kendo-chip>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-history\"></i>\n <p>No recent executions found</p>\n </div>\n }\n </div>\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: [".actions-overview {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n padding: 1.5rem;\n height: 100%;\n overflow-y: auto;\n\n .overview-header {\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-container {\n min-width: 150px;\n \n kendo-dropdownlist {\n width: 100%;\n }\n }\n }\n }\n\n .metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 1.5rem;\n\n .metric-card {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1.5rem;\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: 3rem;\n height: 3rem;\n border-radius: 0.5rem;\n font-size: 1.25rem;\n\n i {\n color: white;\n }\n }\n\n .metric-content {\n flex: 1;\n\n .metric-value {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1;\n margin-bottom: 0.25rem;\n }\n\n .metric-label {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--kendo-color-subtle);\n margin-bottom: 0.5rem;\n }\n\n .metric-breakdown {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n font-size: 0.75rem;\n\n span {\n color: var(--kendo-color-subtle);\n\n &.active { color: var(--kendo-color-success); }\n &.pending { color: var(--kendo-color-warning); }\n &.disabled { color: var(--kendo-color-error); }\n &.recent { color: var(--kendo-color-info); }\n &.success-rate { color: var(--kendo-color-success); }\n &.custom { color: var(--kendo-color-primary); }\n }\n }\n }\n\n &.primary .metric-icon { background: var(--kendo-color-primary); }\n &.success .metric-icon { background: var(--kendo-color-success); }\n &.info .metric-icon { background: var(--kendo-color-info); }\n &.warning .metric-icon { background: var(--kendo-color-warning); }\n }\n }\n\n .content-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-template-rows: auto auto;\n gap: 1.5rem;\n flex: 1;\n\n .panel {\n background: var(--kendo-color-surface);\n border: 1px solid var(--kendo-color-border);\n border-radius: 0.75rem;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n\n .panel-header {\n padding: 1rem 1.5rem;\n background: var(--kendo-color-app-surface);\n border-bottom: 1px solid var(--kendo-color-border);\n\n h3 {\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 .panel-content {\n padding: 1.5rem;\n height: calc(100% - 60px);\n overflow-y: auto;\n }\n }\n\n .category-stats {\n .category-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n\n .category-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 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 }\n\n .category-info {\n flex: 1;\n\n .category-name {\n font-weight: 600;\n margin-bottom: 0.25rem;\n }\n\n .category-metrics {\n display: flex;\n gap: 1rem;\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n\n .metric {\n &.success-rate {\n color: var(--kendo-color-success);\n font-weight: 600;\n }\n }\n }\n }\n\n .category-chart {\n width: 60px;\n\n .progress-bar {\n height: 6px;\n background: var(--kendo-color-border);\n border-radius: 3px;\n overflow: hidden;\n\n .progress-fill {\n height: 100%;\n background: var(--kendo-color-success);\n transition: width 0.3s ease;\n }\n }\n }\n }\n }\n }\n\n .recent-actions {\n .actions-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n\n .action-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 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 }\n\n .action-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 0.375rem;\n background: var(--kendo-color-primary-subtle);\n\n i {\n color: var(--kendo-color-primary);\n font-size: 1rem;\n }\n }\n\n .action-info {\n flex: 1;\n\n .action-name {\n font-weight: 600;\n margin-bottom: 0.25rem;\n }\n\n .action-description {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n line-height: 1.3;\n }\n }\n\n .action-status {\n flex-shrink: 0;\n }\n }\n }\n }\n\n .recent-executions {\n grid-column: 1 / -1;\n\n .executions-list {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\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 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 }\n\n .execution-time {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n font-weight: 600;\n min-width: 80px;\n }\n\n .execution-info {\n flex: 1;\n\n .execution-action {\n font-weight: 600;\n margin-bottom: 0.25rem;\n font-size: 0.875rem;\n }\n\n .execution-user {\n font-size: 0.75rem;\n color: var(--kendo-color-subtle);\n }\n }\n\n .execution-result {\n flex-shrink: 0;\n }\n }\n }\n }\n }\n\n .empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n text-align: center;\n color: var(--kendo-color-subtle);\n\n i {\n font-size: 2.5rem;\n margin-bottom: 1rem;\n opacity: 0.5;\n }\n\n p {\n margin: 0;\n font-size: 0.875rem;\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 .actions-overview .content-grid {\n grid-template-columns: 1fr;\n \n .recent-executions {\n grid-column: 1;\n }\n }\n}\n\n@media (max-width: 768px) {\n .actions-overview {\n padding: 1rem;\n gap: 1rem;\n\n .metrics-grid {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .overview-header .filters-row {\n flex-direction: column;\n align-items: stretch;\n\n .search-container,\n .filter-container {\n min-width: unset;\n }\n }\n }\n}"] }]
595
+ }], () => [], { openEntityRecord: [{
596
+ type: Output
597
+ }], showActionsListView: [{
598
+ type: Output
599
+ }], showExecutionsListView: [{
600
+ type: Output
601
+ }], showCategoriesListView: [{
602
+ type: Output
603
+ }] }); })();
604
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActionsOverviewComponent, { className: "ActionsOverviewComponent", filePath: "src/Actions/components/actions-overview.component.ts", lineNumber: 33 }); })();
605
+ //# sourceMappingURL=actions-overview.component.js.map