@memberjunction/ng-dashboards 2.48.0 → 2.50.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 (92) hide show
  1. package/README.md +105 -2
  2. package/dist/AI/ai-dashboard.component.d.ts +2 -0
  3. package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
  4. package/dist/AI/ai-dashboard.component.js +66 -43
  5. package/dist/AI/ai-dashboard.component.js.map +1 -1
  6. package/dist/AI/components/agents/agent-configuration.component.js +45 -58
  7. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  8. package/dist/AI/components/agents/agent-editor.component.d.ts +6 -1
  9. package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
  10. package/dist/AI/components/agents/agent-editor.component.js +368 -366
  11. package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
  12. package/dist/AI/components/agents/agent-filter-panel.component.js +83 -85
  13. package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
  14. package/dist/AI/components/charts/performance-heatmap.component.d.ts +66 -0
  15. package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -0
  16. package/dist/AI/components/charts/performance-heatmap.component.js +428 -0
  17. package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -0
  18. package/dist/AI/components/charts/time-series-chart.component.d.ts +66 -0
  19. package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -0
  20. package/dist/AI/components/charts/time-series-chart.component.js +547 -0
  21. package/dist/AI/components/charts/time-series-chart.component.js.map +1 -0
  22. package/dist/AI/components/execution-monitoring.component.d.ts +157 -5
  23. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  24. package/dist/AI/components/execution-monitoring.component.js +2032 -20
  25. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  26. package/dist/AI/components/models/model-management.component.js +211 -237
  27. package/dist/AI/components/models/model-management.component.js.map +1 -1
  28. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +208 -226
  29. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  30. package/dist/AI/components/prompts/prompt-filter-panel.component.js +97 -99
  31. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
  32. package/dist/AI/components/prompts/prompt-management.component.js +381 -424
  33. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  34. package/dist/AI/components/prompts/prompt-version-control.component.js +173 -191
  35. package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
  36. package/dist/AI/components/system/system-config-filter-panel.component.js +85 -87
  37. package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
  38. package/dist/AI/components/system/system-configuration.component.js +86 -99
  39. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  40. package/dist/AI/components/widgets/kpi-card.component.d.ts +25 -0
  41. package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -0
  42. package/dist/AI/components/widgets/kpi-card.component.js +163 -0
  43. package/dist/AI/components/widgets/kpi-card.component.js.map +1 -0
  44. package/dist/AI/components/widgets/live-execution-widget.component.d.ts +25 -0
  45. package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -0
  46. package/dist/AI/components/widgets/live-execution-widget.component.js +298 -0
  47. package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -0
  48. package/dist/AI/index.d.ts +7 -0
  49. package/dist/AI/index.d.ts.map +1 -0
  50. package/dist/AI/index.js +9 -0
  51. package/dist/AI/index.js.map +1 -0
  52. package/dist/AI/services/ai-instrumentation.service.d.ts +109 -0
  53. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -0
  54. package/dist/AI/services/ai-instrumentation.service.js +490 -0
  55. package/dist/AI/services/ai-instrumentation.service.js.map +1 -0
  56. package/dist/Actions/actions-management-dashboard.component.js +40 -41
  57. package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
  58. package/dist/Actions/components/actions-list-view.component.js +117 -134
  59. package/dist/Actions/components/actions-list-view.component.js.map +1 -1
  60. package/dist/Actions/components/actions-overview.component.js +274 -296
  61. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  62. package/dist/Actions/components/categories-list-view.component.js +12 -14
  63. package/dist/Actions/components/categories-list-view.component.js.map +1 -1
  64. package/dist/Actions/components/code-management.component.js +12 -14
  65. package/dist/Actions/components/code-management.component.js.map +1 -1
  66. package/dist/Actions/components/entity-integration.component.js +12 -14
  67. package/dist/Actions/components/entity-integration.component.js.map +1 -1
  68. package/dist/Actions/components/execution-monitoring.component.js +238 -256
  69. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  70. package/dist/Actions/components/executions-list-view.component.js +12 -14
  71. package/dist/Actions/components/executions-list-view.component.js.map +1 -1
  72. package/dist/Actions/components/scheduled-actions.component.js +12 -14
  73. package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
  74. package/dist/Actions/components/security-permissions.component.js +12 -14
  75. package/dist/Actions/components/security-permissions.component.js.map +1 -1
  76. package/dist/EntityAdmin/components/entity-details.component.js +105 -107
  77. package/dist/EntityAdmin/components/entity-details.component.js.map +1 -1
  78. package/dist/EntityAdmin/components/entity-filter-panel.component.js +100 -102
  79. package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -1
  80. package/dist/EntityAdmin/components/erd-composite.component.js +84 -100
  81. package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -1
  82. package/dist/EntityAdmin/components/erd-diagram.component.js +50 -50
  83. package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -1
  84. package/dist/EntityAdmin/entity-admin-dashboard.component.js +45 -49
  85. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  86. package/dist/generic/base-dashboard.js +28 -40
  87. package/dist/generic/base-dashboard.js.map +1 -1
  88. package/dist/module.d.ts +16 -12
  89. package/dist/module.d.ts.map +1 -1
  90. package/dist/module.js +36 -15
  91. package/dist/module.js.map +1 -1
  92. package/package.json +6 -6
@@ -1,12 +1,3 @@
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
1
  import { Component, Output, EventEmitter } from '@angular/core';
11
2
  import { RunView, LogError } from '@memberjunction/core';
12
3
  import { Subject, BehaviorSubject, combineLatest } from 'rxjs';
@@ -181,33 +172,32 @@ function ActionsOverviewComponent_Conditional_86_Template(rf, ctx) { if (rf & 1)
181
172
  i0.ɵɵproperty("themeColor", "primary");
182
173
  } }
183
174
  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
- }
175
+ openEntityRecord = new EventEmitter();
176
+ showActionsListView = new EventEmitter();
177
+ showExecutionsListView = new EventEmitter();
178
+ showCategoriesListView = new EventEmitter();
179
+ isLoading = true;
180
+ metrics = {
181
+ totalActions: 0,
182
+ activeActions: 0,
183
+ pendingActions: 0,
184
+ disabledActions: 0,
185
+ totalExecutions: 0,
186
+ recentExecutions: 0,
187
+ successRate: 0,
188
+ totalCategories: 0,
189
+ aiGeneratedActions: 0,
190
+ customActions: 0
191
+ };
192
+ categoryStats = [];
193
+ recentActions = [];
194
+ recentExecutions = [];
195
+ topCategories = [];
196
+ searchTerm$ = new BehaviorSubject('');
197
+ selectedStatus$ = new BehaviorSubject('all');
198
+ selectedType$ = new BehaviorSubject('all');
199
+ destroy$ = new Subject();
200
+ constructor() { }
211
201
  ngOnInit() {
212
202
  this.setupFilters();
213
203
  this.loadData();
@@ -225,105 +215,95 @@ export class ActionsOverviewComponent {
225
215
  this.loadFilteredData();
226
216
  });
227
217
  }
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
- });
218
+ async loadData() {
219
+ try {
220
+ this.isLoading = true;
221
+ // Load all data in parallel
222
+ const [actions, categories, executions] = await Promise.all([
223
+ this.loadActions(),
224
+ this.loadCategories(),
225
+ this.loadExecutions()
226
+ ]);
227
+ this.calculateMetrics(actions, categories, executions);
228
+ this.calculateCategoryStats(actions, categories, executions);
229
+ this.recentActions = actions.slice(0, 10);
230
+ this.recentExecutions = executions.slice(0, 10);
231
+ this.topCategories = categories.slice(0, 5);
232
+ }
233
+ catch (error) {
234
+ LogError('Failed to load actions overview data', undefined, error);
235
+ }
236
+ finally {
237
+ this.isLoading = false;
238
+ }
251
239
  }
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
- }
240
+ async loadActions() {
241
+ const rv = new RunView();
242
+ const result = await rv.RunView({
243
+ EntityName: 'Actions',
244
+ ExtraFilter: '',
245
+ OrderBy: 'UpdatedAt DESC',
246
+ UserSearchString: '',
247
+ IgnoreMaxRows: false,
248
+ MaxRows: 1000
269
249
  });
250
+ if (result && result.Success && result.Results) {
251
+ return result.Results;
252
+ }
253
+ else {
254
+ throw new Error('Failed to load actions');
255
+ }
270
256
  }
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
- }
257
+ async loadCategories() {
258
+ const rv = new RunView();
259
+ const result = await rv.RunView({
260
+ EntityName: 'Action Categories',
261
+ ExtraFilter: '',
262
+ OrderBy: 'Name',
263
+ UserSearchString: '',
264
+ IgnoreMaxRows: false,
265
+ MaxRows: 1000
288
266
  });
267
+ if (result && result.Success && result.Results) {
268
+ return result.Results;
269
+ }
270
+ else {
271
+ throw new Error('Failed to load action categories');
272
+ }
289
273
  }
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
- }
274
+ async loadExecutions() {
275
+ const rv = new RunView();
276
+ const result = await rv.RunView({
277
+ EntityName: 'Action Execution Logs',
278
+ ExtraFilter: '',
279
+ OrderBy: 'StartedAt DESC',
280
+ UserSearchString: '',
281
+ IgnoreMaxRows: false,
282
+ MaxRows: 1000
307
283
  });
284
+ if (result && result.Success && result.Results) {
285
+ return result.Results;
286
+ }
287
+ else {
288
+ throw new Error('Failed to load action execution logs');
289
+ }
308
290
  }
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
- }
291
+ async loadEntityActions() {
292
+ const rv = new RunView();
293
+ const result = await rv.RunView({
294
+ EntityName: 'Entity Actions',
295
+ ExtraFilter: '',
296
+ OrderBy: 'UpdatedAt DESC',
297
+ UserSearchString: '',
298
+ IgnoreMaxRows: false,
299
+ MaxRows: 1000
326
300
  });
301
+ if (result && result.Success && result.Results) {
302
+ return result.Results;
303
+ }
304
+ else {
305
+ throw new Error('Failed to load entity actions');
306
+ }
327
307
  }
328
308
  calculateMetrics(actions, categories, executions) {
329
309
  this.metrics = {
@@ -362,39 +342,37 @@ export class ActionsOverviewComponent {
362
342
  };
363
343
  });
364
344
  }
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
- });
345
+ async loadFilteredData() {
346
+ // Implement filtered data loading based on current filter values
347
+ const searchTerm = this.searchTerm$.value;
348
+ const status = this.selectedStatus$.value;
349
+ const type = this.selectedType$.value;
350
+ let extraFilter = '';
351
+ const filters = [];
352
+ if (status !== 'all') {
353
+ filters.push(`Status = '${status}'`);
354
+ }
355
+ if (type !== 'all') {
356
+ filters.push(`Type = '${type}'`);
357
+ }
358
+ if (filters.length > 0) {
359
+ extraFilter = filters.join(' AND ');
360
+ }
361
+ try {
362
+ const rv = new RunView();
363
+ const result = await rv.RunView({
364
+ EntityName: 'Actions',
365
+ ExtraFilter: extraFilter,
366
+ OrderBy: 'UpdatedAt DESC',
367
+ UserSearchString: searchTerm,
368
+ IgnoreMaxRows: false,
369
+ MaxRows: 1000
370
+ });
371
+ this.recentActions = result.Results.slice(0, 10);
372
+ }
373
+ catch (error) {
374
+ LogError('Failed to load filtered actions', undefined, error);
375
+ }
398
376
  }
399
377
  onSearchChange(searchTerm) {
400
378
  this.searchTerm$.next(searchTerm);
@@ -452,143 +430,143 @@ export class ActionsOverviewComponent {
452
430
  // Filter to show AI generated actions in the current view
453
431
  this.selectedType$.next('Generated');
454
432
  }
433
+ static ɵfac = function ActionsOverviewComponent_Factory(t) { return new (t || ActionsOverviewComponent)(); };
434
+ static ɵ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) {
435
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3)(4, "kendo-textbox", 4);
436
+ i0.ɵɵlistener("valueChange", function ActionsOverviewComponent_Template_kendo_textbox_valueChange_4_listener($event) { return ctx.onSearchChange($event); });
437
+ i0.ɵɵtemplate(5, ActionsOverviewComponent_ng_template_5_Template, 1, 0, "ng-template", 5);
438
+ i0.ɵɵelementEnd()();
439
+ i0.ɵɵelementStart(6, "div", 6)(7, "kendo-dropdownlist", 7);
440
+ i0.ɵɵlistener("valueChange", function ActionsOverviewComponent_Template_kendo_dropdownlist_valueChange_7_listener($event) { return ctx.onStatusFilterChange($event); });
441
+ i0.ɵɵelementEnd()();
442
+ i0.ɵɵelementStart(8, "div", 6)(9, "kendo-dropdownlist", 7);
443
+ i0.ɵɵlistener("valueChange", function ActionsOverviewComponent_Template_kendo_dropdownlist_valueChange_9_listener($event) { return ctx.onTypeFilterChange($event); });
444
+ i0.ɵɵelementEnd()()()();
445
+ i0.ɵɵelementStart(10, "div", 8)(11, "div", 9);
446
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Template_div_click_11_listener() { return ctx.onTotalActionsClick(); });
447
+ i0.ɵɵelementStart(12, "div", 10);
448
+ i0.ɵɵelement(13, "i", 11);
449
+ i0.ɵɵelementEnd();
450
+ i0.ɵɵelementStart(14, "div", 12)(15, "div", 13);
451
+ i0.ɵɵtext(16);
452
+ i0.ɵɵelementEnd();
453
+ i0.ɵɵelementStart(17, "div", 14);
454
+ i0.ɵɵtext(18, "Total Actions");
455
+ i0.ɵɵelementEnd();
456
+ i0.ɵɵelementStart(19, "div", 15)(20, "span", 16);
457
+ i0.ɵɵtext(21);
458
+ i0.ɵɵelementEnd();
459
+ i0.ɵɵelementStart(22, "span", 17);
460
+ i0.ɵɵtext(23);
461
+ i0.ɵɵelementEnd();
462
+ i0.ɵɵelementStart(24, "span", 18);
463
+ i0.ɵɵtext(25);
464
+ i0.ɵɵelementEnd()()()();
465
+ i0.ɵɵelementStart(26, "div", 19);
466
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Template_div_click_26_listener() { return ctx.onExecutionsClick(); });
467
+ i0.ɵɵelementStart(27, "div", 10);
468
+ i0.ɵɵelement(28, "i", 20);
469
+ i0.ɵɵelementEnd();
470
+ i0.ɵɵelementStart(29, "div", 12)(30, "div", 13);
471
+ i0.ɵɵtext(31);
472
+ i0.ɵɵelementEnd();
473
+ i0.ɵɵelementStart(32, "div", 14);
474
+ i0.ɵɵtext(33, "Total Executions");
475
+ i0.ɵɵelementEnd();
476
+ i0.ɵɵelementStart(34, "div", 15)(35, "span", 21);
477
+ i0.ɵɵtext(36);
478
+ i0.ɵɵelementEnd();
479
+ i0.ɵɵelementStart(37, "span", 22);
480
+ i0.ɵɵtext(38);
481
+ i0.ɵɵelementEnd()()()();
482
+ i0.ɵɵelementStart(39, "div", 23);
483
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Template_div_click_39_listener() { return ctx.onCategoriesClick(); });
484
+ i0.ɵɵelementStart(40, "div", 10);
485
+ i0.ɵɵelement(41, "i", 24);
486
+ i0.ɵɵelementEnd();
487
+ i0.ɵɵelementStart(42, "div", 12)(43, "div", 13);
488
+ i0.ɵɵtext(44);
489
+ i0.ɵɵelementEnd();
490
+ i0.ɵɵelementStart(45, "div", 14);
491
+ i0.ɵɵtext(46, "Categories");
492
+ i0.ɵɵelementEnd();
493
+ i0.ɵɵelementStart(47, "div", 15)(48, "span");
494
+ i0.ɵɵtext(49, "Organized structure");
495
+ i0.ɵɵelementEnd()()()();
496
+ i0.ɵɵelementStart(50, "div", 25);
497
+ i0.ɵɵlistener("click", function ActionsOverviewComponent_Template_div_click_50_listener() { return ctx.onAIGeneratedClick(); });
498
+ i0.ɵɵelementStart(51, "div", 10);
499
+ i0.ɵɵelement(52, "i", 26);
500
+ i0.ɵɵelementEnd();
501
+ i0.ɵɵelementStart(53, "div", 12)(54, "div", 13);
502
+ i0.ɵɵtext(55);
503
+ i0.ɵɵelementEnd();
504
+ i0.ɵɵelementStart(56, "div", 14);
505
+ i0.ɵɵtext(57, "AI Generated");
506
+ i0.ɵɵelementEnd();
507
+ i0.ɵɵelementStart(58, "div", 15)(59, "span", 27);
508
+ i0.ɵɵtext(60);
509
+ i0.ɵɵelementEnd()()()()();
510
+ i0.ɵɵelementStart(61, "div", 28)(62, "div", 29)(63, "div", 30)(64, "h3");
511
+ i0.ɵɵelement(65, "i", 31);
512
+ i0.ɵɵtext(66, " Category Performance");
513
+ i0.ɵɵelementEnd()();
514
+ i0.ɵɵelementStart(67, "div", 32);
515
+ i0.ɵɵtemplate(68, ActionsOverviewComponent_Conditional_68_Template, 3, 0, "div", 33)(69, ActionsOverviewComponent_Conditional_69_Template, 4, 0, "div", 34);
516
+ i0.ɵɵelementEnd()();
517
+ i0.ɵɵelementStart(70, "div", 35)(71, "div", 30)(72, "h3");
518
+ i0.ɵɵelement(73, "i", 36);
519
+ i0.ɵɵtext(74, " Recent Actions");
520
+ i0.ɵɵelementEnd()();
521
+ i0.ɵɵelementStart(75, "div", 32);
522
+ i0.ɵɵtemplate(76, ActionsOverviewComponent_Conditional_76_Template, 3, 0, "div", 37)(77, ActionsOverviewComponent_Conditional_77_Template, 4, 0, "div", 34);
523
+ i0.ɵɵelementEnd()();
524
+ i0.ɵɵelementStart(78, "div", 38)(79, "div", 30)(80, "h3");
525
+ i0.ɵɵelement(81, "i", 39);
526
+ i0.ɵɵtext(82, " Recent Executions");
527
+ i0.ɵɵelementEnd()();
528
+ i0.ɵɵelementStart(83, "div", 32);
529
+ i0.ɵɵtemplate(84, ActionsOverviewComponent_Conditional_84_Template, 3, 0, "div", 40)(85, ActionsOverviewComponent_Conditional_85_Template, 4, 0, "div", 34);
530
+ i0.ɵɵelementEnd()()();
531
+ i0.ɵɵtemplate(86, ActionsOverviewComponent_Conditional_86_Template, 2, 1, "div", 41);
532
+ i0.ɵɵelementEnd();
533
+ } if (rf & 2) {
534
+ i0.ɵɵadvance(4);
535
+ i0.ɵɵproperty("value", ctx.searchTerm$.value);
536
+ i0.ɵɵadvance(3);
537
+ 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);
538
+ i0.ɵɵadvance(2);
539
+ i0.ɵɵproperty("data", i0.ɵɵpureFunction3(31, _c8, i0.ɵɵpureFunction0(28, _c5), i0.ɵɵpureFunction0(29, _c6), i0.ɵɵpureFunction0(30, _c7)))("value", ctx.selectedType$.value);
540
+ i0.ɵɵadvance(7);
541
+ i0.ɵɵtextInterpolate(ctx.metrics.totalActions);
542
+ i0.ɵɵadvance(5);
543
+ i0.ɵɵtextInterpolate1("", ctx.metrics.activeActions, " Active");
544
+ i0.ɵɵadvance(2);
545
+ i0.ɵɵtextInterpolate1("", ctx.metrics.pendingActions, " Pending");
546
+ i0.ɵɵadvance(2);
547
+ i0.ɵɵtextInterpolate1("", ctx.metrics.disabledActions, " Disabled");
548
+ i0.ɵɵadvance(6);
549
+ i0.ɵɵtextInterpolate(ctx.metrics.totalExecutions);
550
+ i0.ɵɵadvance(5);
551
+ i0.ɵɵtextInterpolate1("", ctx.metrics.recentExecutions, " in last 24h");
552
+ i0.ɵɵadvance(2);
553
+ i0.ɵɵtextInterpolate1("", ctx.metrics.successRate, "% success rate");
554
+ i0.ɵɵadvance(6);
555
+ i0.ɵɵtextInterpolate(ctx.metrics.totalCategories);
556
+ i0.ɵɵadvance(11);
557
+ i0.ɵɵtextInterpolate(ctx.metrics.aiGeneratedActions);
558
+ i0.ɵɵadvance(5);
559
+ i0.ɵɵtextInterpolate1("", ctx.metrics.customActions, " Custom");
560
+ i0.ɵɵadvance(8);
561
+ i0.ɵɵconditional(ctx.categoryStats.length > 0 ? 68 : 69);
562
+ i0.ɵɵadvance(8);
563
+ i0.ɵɵconditional(ctx.recentActions.length > 0 ? 76 : 77);
564
+ i0.ɵɵadvance(8);
565
+ i0.ɵɵconditional(ctx.recentExecutions.length > 0 ? 84 : 85);
566
+ i0.ɵɵadvance(2);
567
+ i0.ɵɵconditional(ctx.isLoading ? 86 : -1);
568
+ } }, 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}"] });
455
569
  }
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
570
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActionsOverviewComponent, [{
593
571
  type: Component,
594
572
  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}"] }]