@memberjunction/ng-dashboards 2.47.0 → 2.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -2
- package/dist/AI/ai-dashboard.component.d.ts +2 -0
- package/dist/AI/ai-dashboard.component.d.ts.map +1 -1
- package/dist/AI/ai-dashboard.component.js +66 -43
- package/dist/AI/ai-dashboard.component.js.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +45 -58
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +6 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +368 -366
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +83 -85
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts +66 -0
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -0
- package/dist/AI/components/charts/performance-heatmap.component.js +428 -0
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts +66 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -0
- package/dist/AI/components/charts/time-series-chart.component.js +547 -0
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts +157 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +2032 -20
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +211 -237
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +208 -226
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +97 -99
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +381 -424
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +173 -191
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +85 -87
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +86 -99
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.d.ts +25 -0
- package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -0
- package/dist/AI/components/widgets/kpi-card.component.js +163 -0
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -0
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts +25 -0
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -0
- package/dist/AI/components/widgets/live-execution-widget.component.js +298 -0
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -0
- package/dist/AI/index.d.ts +7 -0
- package/dist/AI/index.d.ts.map +1 -0
- package/dist/AI/index.js +9 -0
- package/dist/AI/index.js.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts +109 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -0
- package/dist/AI/services/ai-instrumentation.service.js +490 -0
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -0
- package/dist/Actions/actions-management-dashboard.component.js +40 -41
- package/dist/Actions/actions-management-dashboard.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +117 -134
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +274 -296
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +12 -14
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.js +12 -14
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +12 -14
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +238 -256
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +12 -14
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +12 -14
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +12 -14
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/EntityAdmin/components/entity-details.component.js +105 -107
- package/dist/EntityAdmin/components/entity-details.component.js.map +1 -1
- package/dist/EntityAdmin/components/entity-filter-panel.component.js +100 -102
- package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +1 -1
- package/dist/EntityAdmin/components/erd-composite.component.js +84 -100
- package/dist/EntityAdmin/components/erd-composite.component.js.map +1 -1
- package/dist/EntityAdmin/components/erd-diagram.component.js +50 -50
- package/dist/EntityAdmin/components/erd-diagram.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +45 -49
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/generic/base-dashboard.js +28 -40
- package/dist/generic/base-dashboard.js.map +1 -1
- package/dist/module.d.ts +16 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +36 -15
- package/dist/module.js.map +1 -1
- 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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
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}"] }]
|