@memberjunction/ng-dashboards 2.127.0 → 2.129.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +34 -1
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +419 -109
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +3 -3
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +3 -3
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/{model-management-v2.component.d.ts → model-management.component.d.ts} +21 -5
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -0
- package/dist/AI/components/models/model-management.component.js +1283 -0
- package/dist/AI/components/models/model-management.component.js.map +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
- package/dist/AI/components/prompts/{prompt-management-v2.component.d.ts → prompt-management.component.d.ts} +30 -5
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -0
- package/dist/AI/components/prompts/prompt-management.component.js +1079 -0
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
- package/dist/AI/components/system/system-configuration.component.d.ts +55 -11
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +790 -131
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.js +3 -3
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
- package/dist/AI/index.d.ts +2 -2
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +2 -2
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -6
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.d.ts +2 -0
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +5 -2
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +3 -2
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +7 -3
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/Credentials/components/credential-category-edit-panel.component.d.ts +44 -0
- package/dist/Credentials/components/credential-category-edit-panel.component.d.ts.map +1 -0
- package/dist/Credentials/components/credential-category-edit-panel.component.js +456 -0
- package/dist/Credentials/components/credential-category-edit-panel.component.js.map +1 -0
- package/dist/Credentials/components/credential-edit-panel.component.d.ts +70 -0
- package/dist/Credentials/components/credential-edit-panel.component.d.ts.map +1 -0
- package/dist/Credentials/components/credential-edit-panel.component.js +694 -0
- package/dist/Credentials/components/credential-edit-panel.component.js.map +1 -0
- package/dist/Credentials/components/credential-type-edit-panel.component.d.ts +56 -0
- package/dist/Credentials/components/credential-type-edit-panel.component.d.ts.map +1 -0
- package/dist/Credentials/components/credential-type-edit-panel.component.js +563 -0
- package/dist/Credentials/components/credential-type-edit-panel.component.js.map +1 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +81 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js +864 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +61 -0
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-categories-resource.component.js +816 -0
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +83 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-list-resource.component.js +1253 -0
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +99 -0
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-overview-resource.component.js +936 -0
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +70 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -0
- package/dist/Credentials/components/credentials-types-resource.component.js +868 -0
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -0
- package/dist/Credentials/credentials-dashboard.component.d.ts +37 -0
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -0
- package/dist/Credentials/credentials-dashboard.component.js +290 -0
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -0
- package/dist/Credentials/index.d.ts +7 -0
- package/dist/Credentials/index.d.ts.map +1 -0
- package/dist/Credentials/index.js +9 -0
- package/dist/Credentials/index.js.map +1 -0
- package/dist/Credentials/pipes/group-by.pipe.d.ts +13 -0
- package/dist/Credentials/pipes/group-by.pipe.d.ts.map +1 -0
- package/dist/Credentials/pipes/group-by.pipe.js +29 -0
- package/dist/Credentials/pipes/group-by.pipe.js.map +1 -0
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +2 -2
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +3 -3
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +50 -19
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +17 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +77 -45
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +36 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +552 -368
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +5 -5
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +125 -151
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +15 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +70 -26
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -5
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +174 -166
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +2 -0
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +5 -2
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +4 -2
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/SystemDiagnostics/index.d.ts +2 -0
- package/dist/SystemDiagnostics/index.d.ts.map +1 -0
- package/dist/SystemDiagnostics/index.js +3 -0
- package/dist/SystemDiagnostics/index.js.map +1 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +497 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.js +6063 -0
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -0
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +5 -2
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/module.d.ts +103 -94
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +94 -29
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +3 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +21 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +28 -25
- package/dist/AI/components/models/model-management-v2.component.d.ts.map +0 -1
- package/dist/AI/components/models/model-management-v2.component.js +0 -981
- package/dist/AI/components/models/model-management-v2.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-management-v2.component.js +0 -811
- package/dist/AI/components/prompts/prompt-management-v2.component.js.map +0 -1
- package/dist/EntityAdmin/components/entity-details.component.d.ts +0 -50
- package/dist/EntityAdmin/components/entity-details.component.d.ts.map +0 -1
- package/dist/EntityAdmin/components/entity-details.component.js +0 -680
- package/dist/EntityAdmin/components/entity-details.component.js.map +0 -1
- package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts +0 -31
- package/dist/EntityAdmin/components/entity-filter-panel.component.d.ts.map +0 -1
- package/dist/EntityAdmin/components/entity-filter-panel.component.js +0 -160
- package/dist/EntityAdmin/components/entity-filter-panel.component.js.map +0 -1
- package/dist/EntityAdmin/components/erd-composite.component.d.ts +0 -73
- package/dist/EntityAdmin/components/erd-composite.component.d.ts.map +0 -1
- package/dist/EntityAdmin/components/erd-composite.component.js +0 -271
- package/dist/EntityAdmin/components/erd-composite.component.js.map +0 -1
- package/dist/EntityAdmin/components/erd-diagram.component.d.ts +0 -47
- package/dist/EntityAdmin/components/erd-diagram.component.d.ts.map +0 -1
- package/dist/EntityAdmin/components/erd-diagram.component.js +0 -618
- package/dist/EntityAdmin/components/erd-diagram.component.js.map +0 -1
|
@@ -0,0 +1,864 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Component, ChangeDetectionStrategy } from '@angular/core';
|
|
8
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
9
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
|
+
import { RunView } from '@memberjunction/core';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/common";
|
|
13
|
+
import * as i2 from "@angular/forms";
|
|
14
|
+
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
15
|
+
function CredentialsAuditResourceComponent_mj_loading_1_Template(rf, ctx) { if (rf & 1) {
|
|
16
|
+
i0.ɵɵelement(0, "mj-loading", 3);
|
|
17
|
+
} }
|
|
18
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_49_div_7_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementStart(0, "div", 65)(1, "div", 66);
|
|
20
|
+
i0.ɵɵelement(2, "div", 67)(3, "div", 68);
|
|
21
|
+
i0.ɵɵelementEnd();
|
|
22
|
+
i0.ɵɵelementStart(4, "span", 69);
|
|
23
|
+
i0.ɵɵtext(5);
|
|
24
|
+
i0.ɵɵelementEnd()();
|
|
25
|
+
} if (rf & 2) {
|
|
26
|
+
const data_r3 = ctx.$implicit;
|
|
27
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
28
|
+
i0.ɵɵproperty("title", data_r3.hour + ": " + (data_r3.success + data_r3.failed) + " events");
|
|
29
|
+
i0.ɵɵadvance(2);
|
|
30
|
+
i0.ɵɵstyleProp("height", data_r3.success / ctx_r1.getMaxHourlyCount() * 100, "%");
|
|
31
|
+
i0.ɵɵadvance();
|
|
32
|
+
i0.ɵɵstyleProp("height", data_r3.failed / ctx_r1.getMaxHourlyCount() * 100, "%");
|
|
33
|
+
i0.ɵɵadvance(2);
|
|
34
|
+
i0.ɵɵtextInterpolate(data_r3.hour.split(":")[0]);
|
|
35
|
+
} }
|
|
36
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_49_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
i0.ɵɵelementStart(0, "div", 55)(1, "div", 56)(2, "h3");
|
|
38
|
+
i0.ɵɵelement(3, "i", 57);
|
|
39
|
+
i0.ɵɵtext(4, " Today's Activity ");
|
|
40
|
+
i0.ɵɵelementEnd()();
|
|
41
|
+
i0.ɵɵelementStart(5, "div", 58)(6, "div", 59);
|
|
42
|
+
i0.ɵɵtemplate(7, CredentialsAuditResourceComponent_ng_container_2_div_49_div_7_Template, 6, 6, "div", 60);
|
|
43
|
+
i0.ɵɵelementEnd()();
|
|
44
|
+
i0.ɵɵelementStart(8, "div", 61)(9, "span", 62);
|
|
45
|
+
i0.ɵɵelement(10, "span", 63);
|
|
46
|
+
i0.ɵɵtext(11, " Success ");
|
|
47
|
+
i0.ɵɵelementEnd();
|
|
48
|
+
i0.ɵɵelementStart(12, "span", 62);
|
|
49
|
+
i0.ɵɵelement(13, "span", 64);
|
|
50
|
+
i0.ɵɵtext(14, " Failed ");
|
|
51
|
+
i0.ɵɵelementEnd()()();
|
|
52
|
+
} if (rf & 2) {
|
|
53
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
54
|
+
i0.ɵɵadvance(7);
|
|
55
|
+
i0.ɵɵproperty("ngForOf", ctx_r1.hourlyData);
|
|
56
|
+
} }
|
|
57
|
+
function CredentialsAuditResourceComponent_ng_container_2_button_55_Template(rf, ctx) { if (rf & 1) {
|
|
58
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
59
|
+
i0.ɵɵelementStart(0, "button", 70);
|
|
60
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_ng_container_2_button_55_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
|
|
61
|
+
i0.ɵɵelement(1, "i", 71);
|
|
62
|
+
i0.ɵɵelementEnd();
|
|
63
|
+
} }
|
|
64
|
+
function CredentialsAuditResourceComponent_ng_container_2_option_66_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
66
|
+
i0.ɵɵtext(1);
|
|
67
|
+
i0.ɵɵelementEnd();
|
|
68
|
+
} if (rf & 2) {
|
|
69
|
+
const op_r5 = ctx.$implicit;
|
|
70
|
+
i0.ɵɵproperty("value", op_r5);
|
|
71
|
+
i0.ɵɵadvance();
|
|
72
|
+
i0.ɵɵtextInterpolate(op_r5);
|
|
73
|
+
} }
|
|
74
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_15_Template(rf, ctx) { if (rf & 1) {
|
|
75
|
+
i0.ɵɵelementStart(0, "div", 99);
|
|
76
|
+
i0.ɵɵtext(1);
|
|
77
|
+
i0.ɵɵelementEnd();
|
|
78
|
+
} if (rf & 2) {
|
|
79
|
+
const log_r7 = i0.ɵɵnextContext().$implicit;
|
|
80
|
+
i0.ɵɵadvance();
|
|
81
|
+
i0.ɵɵtextInterpolate1(" ", log_r7.Description, " ");
|
|
82
|
+
} }
|
|
83
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_span_20_Template(rf, ctx) { if (rf & 1) {
|
|
84
|
+
i0.ɵɵelementStart(0, "span", 100);
|
|
85
|
+
i0.ɵɵtext(1);
|
|
86
|
+
i0.ɵɵelementEnd();
|
|
87
|
+
} if (rf & 2) {
|
|
88
|
+
const log_r7 = i0.ɵɵnextContext().$implicit;
|
|
89
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
90
|
+
i0.ɵɵadvance();
|
|
91
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.getSubsystem(log_r7), " ");
|
|
92
|
+
} }
|
|
93
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_span_21_Template(rf, ctx) { if (rf & 1) {
|
|
94
|
+
i0.ɵɵelementStart(0, "span", 101);
|
|
95
|
+
i0.ɵɵelement(1, "i", 102);
|
|
96
|
+
i0.ɵɵtext(2);
|
|
97
|
+
i0.ɵɵelementEnd();
|
|
98
|
+
} if (rf & 2) {
|
|
99
|
+
const log_r7 = i0.ɵɵnextContext().$implicit;
|
|
100
|
+
i0.ɵɵadvance(2);
|
|
101
|
+
i0.ɵɵtextInterpolate1(" ", log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialType, " ");
|
|
102
|
+
} }
|
|
103
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵelementStart(0, "div", 107)(1, "span", 108);
|
|
105
|
+
i0.ɵɵtext(2, "IP Address");
|
|
106
|
+
i0.ɵɵelementEnd();
|
|
107
|
+
i0.ɵɵelementStart(3, "span", 109);
|
|
108
|
+
i0.ɵɵtext(4);
|
|
109
|
+
i0.ɵɵelementEnd()();
|
|
110
|
+
} if (rf & 2) {
|
|
111
|
+
const log_r7 = i0.ɵɵnextContext(2).$implicit;
|
|
112
|
+
i0.ɵɵadvance(4);
|
|
113
|
+
i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.ipAddress);
|
|
114
|
+
} }
|
|
115
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_3_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
+
i0.ɵɵelementStart(0, "div", 107)(1, "span", 108);
|
|
117
|
+
i0.ɵɵtext(2, "Duration");
|
|
118
|
+
i0.ɵɵelementEnd();
|
|
119
|
+
i0.ɵɵelementStart(3, "span", 109);
|
|
120
|
+
i0.ɵɵtext(4);
|
|
121
|
+
i0.ɵɵelementEnd()();
|
|
122
|
+
} if (rf & 2) {
|
|
123
|
+
const log_r7 = i0.ɵɵnextContext(2).$implicit;
|
|
124
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
125
|
+
i0.ɵɵadvance(4);
|
|
126
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.duration));
|
|
127
|
+
} }
|
|
128
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_4_Template(rf, ctx) { if (rf & 1) {
|
|
129
|
+
i0.ɵɵelementStart(0, "div", 107)(1, "span", 108);
|
|
130
|
+
i0.ɵɵtext(2, "Credential ID");
|
|
131
|
+
i0.ɵɵelementEnd();
|
|
132
|
+
i0.ɵɵelementStart(3, "span", 110);
|
|
133
|
+
i0.ɵɵtext(4);
|
|
134
|
+
i0.ɵɵelementEnd()();
|
|
135
|
+
} if (rf & 2) {
|
|
136
|
+
const log_r7 = i0.ɵɵnextContext(2).$implicit;
|
|
137
|
+
i0.ɵɵadvance(4);
|
|
138
|
+
i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialId);
|
|
139
|
+
} }
|
|
140
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
+
i0.ɵɵelementStart(0, "div", 111)(1, "span", 108);
|
|
142
|
+
i0.ɵɵtext(2, "Error Message");
|
|
143
|
+
i0.ɵɵelementEnd();
|
|
144
|
+
i0.ɵɵelementStart(3, "span", 112);
|
|
145
|
+
i0.ɵɵtext(4);
|
|
146
|
+
i0.ɵɵelementEnd()();
|
|
147
|
+
} if (rf & 2) {
|
|
148
|
+
const log_r7 = i0.ɵɵnextContext(2).$implicit;
|
|
149
|
+
i0.ɵɵadvance(4);
|
|
150
|
+
i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.errorMessage);
|
|
151
|
+
} }
|
|
152
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_6_Template(rf, ctx) { if (rf & 1) {
|
|
153
|
+
i0.ɵɵelementStart(0, "div", 111)(1, "span", 108);
|
|
154
|
+
i0.ɵɵtext(2, "User Agent");
|
|
155
|
+
i0.ɵɵelementEnd();
|
|
156
|
+
i0.ɵɵelementStart(3, "span", 113);
|
|
157
|
+
i0.ɵɵtext(4);
|
|
158
|
+
i0.ɵɵelementEnd()();
|
|
159
|
+
} if (rf & 2) {
|
|
160
|
+
const log_r7 = i0.ɵɵnextContext(2).$implicit;
|
|
161
|
+
i0.ɵɵadvance(4);
|
|
162
|
+
i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.userAgent);
|
|
163
|
+
} }
|
|
164
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_Template(rf, ctx) { if (rf & 1) {
|
|
165
|
+
i0.ɵɵelementStart(0, "div", 103)(1, "div", 104);
|
|
166
|
+
i0.ɵɵtemplate(2, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_2_Template, 5, 1, "div", 105)(3, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_3_Template, 5, 1, "div", 105)(4, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_4_Template, 5, 1, "div", 105)(5, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_5_Template, 5, 1, "div", 106)(6, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_div_6_Template, 5, 1, "div", 106);
|
|
167
|
+
i0.ɵɵelementEnd()();
|
|
168
|
+
} if (rf & 2) {
|
|
169
|
+
const log_r7 = i0.ɵɵnextContext().$implicit;
|
|
170
|
+
i0.ɵɵadvance(2);
|
|
171
|
+
i0.ɵɵproperty("ngIf", log_r7.parsedDetails == null ? null : log_r7.parsedDetails.ipAddress);
|
|
172
|
+
i0.ɵɵadvance();
|
|
173
|
+
i0.ɵɵproperty("ngIf", log_r7.parsedDetails == null ? null : log_r7.parsedDetails.duration);
|
|
174
|
+
i0.ɵɵadvance();
|
|
175
|
+
i0.ɵɵproperty("ngIf", log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialId);
|
|
176
|
+
i0.ɵɵadvance();
|
|
177
|
+
i0.ɵɵproperty("ngIf", log_r7.parsedDetails == null ? null : log_r7.parsedDetails.errorMessage);
|
|
178
|
+
i0.ɵɵadvance();
|
|
179
|
+
i0.ɵɵproperty("ngIf", log_r7.parsedDetails == null ? null : log_r7.parsedDetails.userAgent);
|
|
180
|
+
} }
|
|
181
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_Template(rf, ctx) { if (rf & 1) {
|
|
182
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
183
|
+
i0.ɵɵelementStart(0, "div", 81)(1, "div", 82);
|
|
184
|
+
i0.ɵɵelement(2, "div", 83);
|
|
185
|
+
i0.ɵɵelementEnd();
|
|
186
|
+
i0.ɵɵelementStart(3, "div", 84);
|
|
187
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_Template_div_click_3_listener() { const log_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleLogExpand(log_r7.ID)); });
|
|
188
|
+
i0.ɵɵelementStart(4, "div", 85)(5, "div", 86);
|
|
189
|
+
i0.ɵɵelement(6, "i");
|
|
190
|
+
i0.ɵɵelementStart(7, "span", 87);
|
|
191
|
+
i0.ɵɵtext(8);
|
|
192
|
+
i0.ɵɵelementEnd()();
|
|
193
|
+
i0.ɵɵelementStart(9, "div", 88);
|
|
194
|
+
i0.ɵɵtext(10);
|
|
195
|
+
i0.ɵɵelementEnd()();
|
|
196
|
+
i0.ɵɵelementStart(11, "div", 89)(12, "div", 90);
|
|
197
|
+
i0.ɵɵelement(13, "i", 91);
|
|
198
|
+
i0.ɵɵtext(14);
|
|
199
|
+
i0.ɵɵelementEnd();
|
|
200
|
+
i0.ɵɵtemplate(15, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_15_Template, 2, 1, "div", 92);
|
|
201
|
+
i0.ɵɵelementStart(16, "div", 93)(17, "span", 94);
|
|
202
|
+
i0.ɵɵelement(18, "i");
|
|
203
|
+
i0.ɵɵtext(19);
|
|
204
|
+
i0.ɵɵelementEnd();
|
|
205
|
+
i0.ɵɵtemplate(20, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_span_20_Template, 2, 1, "span", 95)(21, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_span_21_Template, 3, 1, "span", 96);
|
|
206
|
+
i0.ɵɵelementEnd()();
|
|
207
|
+
i0.ɵɵtemplate(22, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div_22_Template, 7, 5, "div", 97);
|
|
208
|
+
i0.ɵɵelementStart(23, "button", 98);
|
|
209
|
+
i0.ɵɵelement(24, "i");
|
|
210
|
+
i0.ɵɵelementEnd()()();
|
|
211
|
+
} if (rf & 2) {
|
|
212
|
+
const log_r7 = ctx.$implicit;
|
|
213
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
214
|
+
i0.ɵɵclassProp("expanded", ctx_r1.expandedLogId === log_r7.ID)("failed", log_r7.Status === "Failed");
|
|
215
|
+
i0.ɵɵadvance(2);
|
|
216
|
+
i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r7)));
|
|
217
|
+
i0.ɵɵadvance(4);
|
|
218
|
+
i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(log_r7)));
|
|
219
|
+
i0.ɵɵstyleProp("color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r7)));
|
|
220
|
+
i0.ɵɵadvance(2);
|
|
221
|
+
i0.ɵɵtextInterpolate(ctx_r1.getOperationType(log_r7));
|
|
222
|
+
i0.ɵɵadvance(2);
|
|
223
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatTime(log_r7.__mj_CreatedAt));
|
|
224
|
+
i0.ɵɵadvance(4);
|
|
225
|
+
i0.ɵɵtextInterpolate1(" ", log_r7.User || "Unknown", " ");
|
|
226
|
+
i0.ɵɵadvance();
|
|
227
|
+
i0.ɵɵproperty("ngIf", log_r7.Description);
|
|
228
|
+
i0.ɵɵadvance(2);
|
|
229
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r7.Status));
|
|
230
|
+
i0.ɵɵadvance();
|
|
231
|
+
i0.ɵɵclassMap(log_r7.Status === "Success" ? "fa-solid fa-check" : "fa-solid fa-times");
|
|
232
|
+
i0.ɵɵadvance();
|
|
233
|
+
i0.ɵɵtextInterpolate1(" ", log_r7.Status, " ");
|
|
234
|
+
i0.ɵɵadvance();
|
|
235
|
+
i0.ɵɵproperty("ngIf", ctx_r1.getSubsystem(log_r7));
|
|
236
|
+
i0.ɵɵadvance();
|
|
237
|
+
i0.ɵɵproperty("ngIf", log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialType);
|
|
238
|
+
i0.ɵɵadvance();
|
|
239
|
+
i0.ɵɵproperty("ngIf", ctx_r1.expandedLogId === log_r7.ID);
|
|
240
|
+
i0.ɵɵadvance(2);
|
|
241
|
+
i0.ɵɵclassMap(ctx_r1.expandedLogId === log_r7.ID ? "fa-solid fa-chevron-up" : "fa-solid fa-chevron-down");
|
|
242
|
+
} }
|
|
243
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_Template(rf, ctx) { if (rf & 1) {
|
|
244
|
+
i0.ɵɵelementStart(0, "div", 75)(1, "div", 76)(2, "span", 77);
|
|
245
|
+
i0.ɵɵtext(3);
|
|
246
|
+
i0.ɵɵelementEnd();
|
|
247
|
+
i0.ɵɵelementStart(4, "span", 78);
|
|
248
|
+
i0.ɵɵtext(5);
|
|
249
|
+
i0.ɵɵelementEnd()();
|
|
250
|
+
i0.ɵɵelementStart(6, "div", 79);
|
|
251
|
+
i0.ɵɵtemplate(7, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_Template, 25, 23, "div", 80);
|
|
252
|
+
i0.ɵɵelementEnd()();
|
|
253
|
+
} if (rf & 2) {
|
|
254
|
+
const group_r8 = ctx.$implicit;
|
|
255
|
+
i0.ɵɵadvance(3);
|
|
256
|
+
i0.ɵɵtextInterpolate(group_r8.displayDate);
|
|
257
|
+
i0.ɵɵadvance(2);
|
|
258
|
+
i0.ɵɵtextInterpolate1("", group_r8.logs.length, " events");
|
|
259
|
+
i0.ɵɵadvance(2);
|
|
260
|
+
i0.ɵɵproperty("ngForOf", group_r8.logs);
|
|
261
|
+
} }
|
|
262
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_84_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
+
i0.ɵɵelementStart(0, "div", 73);
|
|
264
|
+
i0.ɵɵtemplate(1, CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_Template, 8, 3, "div", 74);
|
|
265
|
+
i0.ɵɵelementEnd();
|
|
266
|
+
} if (rf & 2) {
|
|
267
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
268
|
+
i0.ɵɵadvance();
|
|
269
|
+
i0.ɵɵproperty("ngForOf", ctx_r1.timelineGroups);
|
|
270
|
+
} }
|
|
271
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_85_tr_17_Template(rf, ctx) { if (rf & 1) {
|
|
272
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 117);
|
|
273
|
+
i0.ɵɵtext(2);
|
|
274
|
+
i0.ɵɵelementEnd();
|
|
275
|
+
i0.ɵɵelementStart(3, "td", 118);
|
|
276
|
+
i0.ɵɵtext(4);
|
|
277
|
+
i0.ɵɵelementEnd();
|
|
278
|
+
i0.ɵɵelementStart(5, "td", 119)(6, "span", 120);
|
|
279
|
+
i0.ɵɵelement(7, "i");
|
|
280
|
+
i0.ɵɵtext(8);
|
|
281
|
+
i0.ɵɵelementEnd()();
|
|
282
|
+
i0.ɵɵelementStart(9, "td", 121);
|
|
283
|
+
i0.ɵɵtext(10);
|
|
284
|
+
i0.ɵɵelementEnd();
|
|
285
|
+
i0.ɵɵelementStart(11, "td", 122);
|
|
286
|
+
i0.ɵɵtext(12);
|
|
287
|
+
i0.ɵɵelementEnd();
|
|
288
|
+
i0.ɵɵelementStart(13, "td", 123)(14, "span", 94);
|
|
289
|
+
i0.ɵɵelement(15, "i");
|
|
290
|
+
i0.ɵɵtext(16);
|
|
291
|
+
i0.ɵɵelementEnd()()();
|
|
292
|
+
} if (rf & 2) {
|
|
293
|
+
const log_r9 = ctx.$implicit;
|
|
294
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
295
|
+
i0.ɵɵclassProp("failed-row", log_r9.Status === "Failed");
|
|
296
|
+
i0.ɵɵadvance(2);
|
|
297
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDate(log_r9.__mj_CreatedAt));
|
|
298
|
+
i0.ɵɵadvance(2);
|
|
299
|
+
i0.ɵɵtextInterpolate(log_r9.User || "Unknown");
|
|
300
|
+
i0.ɵɵadvance(2);
|
|
301
|
+
i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r9)) + "20")("color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r9)));
|
|
302
|
+
i0.ɵɵadvance();
|
|
303
|
+
i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(log_r9)));
|
|
304
|
+
i0.ɵɵadvance();
|
|
305
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.getOperationType(log_r9), " ");
|
|
306
|
+
i0.ɵɵadvance(2);
|
|
307
|
+
i0.ɵɵtextInterpolate(log_r9.Description || "-");
|
|
308
|
+
i0.ɵɵadvance(2);
|
|
309
|
+
i0.ɵɵtextInterpolate(ctx_r1.getSubsystem(log_r9) || "-");
|
|
310
|
+
i0.ɵɵadvance(2);
|
|
311
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r9.Status));
|
|
312
|
+
i0.ɵɵadvance();
|
|
313
|
+
i0.ɵɵclassMap(log_r9.Status === "Success" ? "fa-solid fa-check" : "fa-solid fa-times");
|
|
314
|
+
i0.ɵɵadvance();
|
|
315
|
+
i0.ɵɵtextInterpolate1(" ", log_r9.Status, " ");
|
|
316
|
+
} }
|
|
317
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_85_Template(rf, ctx) { if (rf & 1) {
|
|
318
|
+
i0.ɵɵelementStart(0, "div", 114)(1, "table", 115)(2, "thead")(3, "tr")(4, "th");
|
|
319
|
+
i0.ɵɵtext(5, "Timestamp");
|
|
320
|
+
i0.ɵɵelementEnd();
|
|
321
|
+
i0.ɵɵelementStart(6, "th");
|
|
322
|
+
i0.ɵɵtext(7, "User");
|
|
323
|
+
i0.ɵɵelementEnd();
|
|
324
|
+
i0.ɵɵelementStart(8, "th");
|
|
325
|
+
i0.ɵɵtext(9, "Operation");
|
|
326
|
+
i0.ɵɵelementEnd();
|
|
327
|
+
i0.ɵɵelementStart(10, "th");
|
|
328
|
+
i0.ɵɵtext(11, "Description");
|
|
329
|
+
i0.ɵɵelementEnd();
|
|
330
|
+
i0.ɵɵelementStart(12, "th");
|
|
331
|
+
i0.ɵɵtext(13, "Subsystem");
|
|
332
|
+
i0.ɵɵelementEnd();
|
|
333
|
+
i0.ɵɵelementStart(14, "th");
|
|
334
|
+
i0.ɵɵtext(15, "Status");
|
|
335
|
+
i0.ɵɵelementEnd()()();
|
|
336
|
+
i0.ɵɵelementStart(16, "tbody");
|
|
337
|
+
i0.ɵɵtemplate(17, CredentialsAuditResourceComponent_ng_container_2_div_85_tr_17_Template, 17, 17, "tr", 116);
|
|
338
|
+
i0.ɵɵelementEnd()()();
|
|
339
|
+
} if (rf & 2) {
|
|
340
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
341
|
+
i0.ɵɵadvance(17);
|
|
342
|
+
i0.ɵɵproperty("ngForOf", ctx_r1.filteredLogs);
|
|
343
|
+
} }
|
|
344
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_86_p_5_Template(rf, ctx) { if (rf & 1) {
|
|
345
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
346
|
+
i0.ɵɵelementStart(0, "p");
|
|
347
|
+
i0.ɵɵtext(1, " No events match your current filters. ");
|
|
348
|
+
i0.ɵɵelementStart(2, "button", 126);
|
|
349
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_ng_container_2_div_86_p_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); ctx_r1.searchText = ""; ctx_r1.selectedStatus = ""; ctx_r1.selectedOperation = ""; return i0.ɵɵresetView(ctx_r1.applyFilters()); });
|
|
350
|
+
i0.ɵɵtext(3, "Clear filters");
|
|
351
|
+
i0.ɵɵelementEnd()();
|
|
352
|
+
} }
|
|
353
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_86_p_6_Template(rf, ctx) { if (rf & 1) {
|
|
354
|
+
i0.ɵɵelementStart(0, "p");
|
|
355
|
+
i0.ɵɵtext(1, " No credential access events in the selected time range. ");
|
|
356
|
+
i0.ɵɵelementEnd();
|
|
357
|
+
} }
|
|
358
|
+
function CredentialsAuditResourceComponent_ng_container_2_div_86_Template(rf, ctx) { if (rf & 1) {
|
|
359
|
+
i0.ɵɵelementStart(0, "div", 124)(1, "div", 125);
|
|
360
|
+
i0.ɵɵelement(2, "i", 16);
|
|
361
|
+
i0.ɵɵelementEnd();
|
|
362
|
+
i0.ɵɵelementStart(3, "h3");
|
|
363
|
+
i0.ɵɵtext(4, "No Audit Logs");
|
|
364
|
+
i0.ɵɵelementEnd();
|
|
365
|
+
i0.ɵɵtemplate(5, CredentialsAuditResourceComponent_ng_container_2_div_86_p_5_Template, 4, 0, "p", 2)(6, CredentialsAuditResourceComponent_ng_container_2_div_86_p_6_Template, 2, 0, "p", 2);
|
|
366
|
+
i0.ɵɵelementEnd();
|
|
367
|
+
} if (rf & 2) {
|
|
368
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
369
|
+
i0.ɵɵadvance(5);
|
|
370
|
+
i0.ɵɵproperty("ngIf", ctx_r1.searchText || ctx_r1.selectedStatus || ctx_r1.selectedOperation);
|
|
371
|
+
i0.ɵɵadvance();
|
|
372
|
+
i0.ɵɵproperty("ngIf", !ctx_r1.searchText && !ctx_r1.selectedStatus && !ctx_r1.selectedOperation);
|
|
373
|
+
} }
|
|
374
|
+
function CredentialsAuditResourceComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
|
|
375
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
376
|
+
i0.ɵɵelementContainerStart(0);
|
|
377
|
+
i0.ɵɵelementStart(1, "div", 4)(2, "div", 5)(3, "h2", 6);
|
|
378
|
+
i0.ɵɵtext(4, "Audit Trail");
|
|
379
|
+
i0.ɵɵelementEnd();
|
|
380
|
+
i0.ɵɵelementStart(5, "p", 7);
|
|
381
|
+
i0.ɵɵtext(6, "Credential access and modification history");
|
|
382
|
+
i0.ɵɵelementEnd()();
|
|
383
|
+
i0.ɵɵelementStart(7, "div", 8)(8, "button", 9);
|
|
384
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_ng_container_2_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.exportToCSV()); });
|
|
385
|
+
i0.ɵɵelement(9, "i", 10);
|
|
386
|
+
i0.ɵɵelementStart(10, "span");
|
|
387
|
+
i0.ɵɵtext(11, "Export");
|
|
388
|
+
i0.ɵɵelementEnd()();
|
|
389
|
+
i0.ɵɵelementStart(12, "button", 11);
|
|
390
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_ng_container_2_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.refresh()); });
|
|
391
|
+
i0.ɵɵelement(13, "i", 12);
|
|
392
|
+
i0.ɵɵelementEnd()()();
|
|
393
|
+
i0.ɵɵelementStart(14, "div", 13)(15, "div", 14)(16, "div", 15);
|
|
394
|
+
i0.ɵɵelement(17, "i", 16);
|
|
395
|
+
i0.ɵɵelementEnd();
|
|
396
|
+
i0.ɵɵelementStart(18, "div", 17)(19, "div", 18);
|
|
397
|
+
i0.ɵɵtext(20);
|
|
398
|
+
i0.ɵɵelementEnd();
|
|
399
|
+
i0.ɵɵelementStart(21, "div", 19);
|
|
400
|
+
i0.ɵɵtext(22, "Total Events");
|
|
401
|
+
i0.ɵɵelementEnd()()();
|
|
402
|
+
i0.ɵɵelementStart(23, "div", 14)(24, "div", 20);
|
|
403
|
+
i0.ɵɵelement(25, "i", 21);
|
|
404
|
+
i0.ɵɵelementEnd();
|
|
405
|
+
i0.ɵɵelementStart(26, "div", 17)(27, "div", 22);
|
|
406
|
+
i0.ɵɵtext(28);
|
|
407
|
+
i0.ɵɵelementEnd();
|
|
408
|
+
i0.ɵɵelementStart(29, "div", 19);
|
|
409
|
+
i0.ɵɵtext(30, "Successful");
|
|
410
|
+
i0.ɵɵelementEnd()();
|
|
411
|
+
i0.ɵɵelementStart(31, "div", 23);
|
|
412
|
+
i0.ɵɵtext(32);
|
|
413
|
+
i0.ɵɵelementEnd()();
|
|
414
|
+
i0.ɵɵelementStart(33, "div", 14)(34, "div", 24);
|
|
415
|
+
i0.ɵɵelement(35, "i", 25);
|
|
416
|
+
i0.ɵɵelementEnd();
|
|
417
|
+
i0.ɵɵelementStart(36, "div", 17)(37, "div", 26);
|
|
418
|
+
i0.ɵɵtext(38);
|
|
419
|
+
i0.ɵɵelementEnd();
|
|
420
|
+
i0.ɵɵelementStart(39, "div", 19);
|
|
421
|
+
i0.ɵɵtext(40, "Failed");
|
|
422
|
+
i0.ɵɵelementEnd()()();
|
|
423
|
+
i0.ɵɵelementStart(41, "div", 14)(42, "div", 27);
|
|
424
|
+
i0.ɵɵelement(43, "i", 28);
|
|
425
|
+
i0.ɵɵelementEnd();
|
|
426
|
+
i0.ɵɵelementStart(44, "div", 17)(45, "div", 18);
|
|
427
|
+
i0.ɵɵtext(46);
|
|
428
|
+
i0.ɵɵelementEnd();
|
|
429
|
+
i0.ɵɵelementStart(47, "div", 19);
|
|
430
|
+
i0.ɵɵtext(48, "Unique Users");
|
|
431
|
+
i0.ɵɵelementEnd()()()();
|
|
432
|
+
i0.ɵɵtemplate(49, CredentialsAuditResourceComponent_ng_container_2_div_49_Template, 15, 1, "div", 29);
|
|
433
|
+
i0.ɵɵelementStart(50, "div", 30)(51, "div", 31)(52, "div", 32);
|
|
434
|
+
i0.ɵɵelement(53, "i", 33);
|
|
435
|
+
i0.ɵɵelementStart(54, "input", 34);
|
|
436
|
+
i0.ɵɵlistener("input", function CredentialsAuditResourceComponent_ng_container_2_Template_input_input_54_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSearchChange($event.target.value)); });
|
|
437
|
+
i0.ɵɵelementEnd();
|
|
438
|
+
i0.ɵɵtemplate(55, CredentialsAuditResourceComponent_ng_container_2_button_55_Template, 2, 0, "button", 35);
|
|
439
|
+
i0.ɵɵelementEnd();
|
|
440
|
+
i0.ɵɵelementStart(56, "select", 36);
|
|
441
|
+
i0.ɵɵlistener("change", function CredentialsAuditResourceComponent_ng_container_2_Template_select_change_56_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onStatusFilterChange($event.target.value)); });
|
|
442
|
+
i0.ɵɵelementStart(57, "option", 37);
|
|
443
|
+
i0.ɵɵtext(58, "All Statuses");
|
|
444
|
+
i0.ɵɵelementEnd();
|
|
445
|
+
i0.ɵɵelementStart(59, "option", 38);
|
|
446
|
+
i0.ɵɵtext(60, "Success");
|
|
447
|
+
i0.ɵɵelementEnd();
|
|
448
|
+
i0.ɵɵelementStart(61, "option", 39);
|
|
449
|
+
i0.ɵɵtext(62, "Failed");
|
|
450
|
+
i0.ɵɵelementEnd()();
|
|
451
|
+
i0.ɵɵelementStart(63, "select", 36);
|
|
452
|
+
i0.ɵɵlistener("change", function CredentialsAuditResourceComponent_ng_container_2_Template_select_change_63_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOperationFilterChange($event.target.value)); });
|
|
453
|
+
i0.ɵɵelementStart(64, "option", 37);
|
|
454
|
+
i0.ɵɵtext(65, "All Operations");
|
|
455
|
+
i0.ɵɵelementEnd();
|
|
456
|
+
i0.ɵɵtemplate(66, CredentialsAuditResourceComponent_ng_container_2_option_66_Template, 2, 2, "option", 40);
|
|
457
|
+
i0.ɵɵelementEnd();
|
|
458
|
+
i0.ɵɵelementStart(67, "select", 36);
|
|
459
|
+
i0.ɵɵlistener("change", function CredentialsAuditResourceComponent_ng_container_2_Template_select_change_67_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDateRangeChange($event.target.value)); });
|
|
460
|
+
i0.ɵɵelementStart(68, "option", 41);
|
|
461
|
+
i0.ɵɵtext(69, "Last 24 hours");
|
|
462
|
+
i0.ɵɵelementEnd();
|
|
463
|
+
i0.ɵɵelementStart(70, "option", 42);
|
|
464
|
+
i0.ɵɵtext(71, "Last 7 days");
|
|
465
|
+
i0.ɵɵelementEnd();
|
|
466
|
+
i0.ɵɵelementStart(72, "option", 43);
|
|
467
|
+
i0.ɵɵtext(73, "Last 30 days");
|
|
468
|
+
i0.ɵɵelementEnd();
|
|
469
|
+
i0.ɵɵelementStart(74, "option", 44);
|
|
470
|
+
i0.ɵɵtext(75, "Last 90 days");
|
|
471
|
+
i0.ɵɵelementEnd()()();
|
|
472
|
+
i0.ɵɵelementStart(76, "div", 45)(77, "div", 46);
|
|
473
|
+
i0.ɵɵtext(78);
|
|
474
|
+
i0.ɵɵelementEnd();
|
|
475
|
+
i0.ɵɵelementStart(79, "div", 47)(80, "button", 48);
|
|
476
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_ng_container_2_Template_button_click_80_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setViewMode("timeline")); });
|
|
477
|
+
i0.ɵɵelement(81, "i", 49);
|
|
478
|
+
i0.ɵɵelementEnd();
|
|
479
|
+
i0.ɵɵelementStart(82, "button", 50);
|
|
480
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_ng_container_2_Template_button_click_82_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setViewMode("table")); });
|
|
481
|
+
i0.ɵɵelement(83, "i", 51);
|
|
482
|
+
i0.ɵɵelementEnd()()()();
|
|
483
|
+
i0.ɵɵtemplate(84, CredentialsAuditResourceComponent_ng_container_2_div_84_Template, 2, 1, "div", 52)(85, CredentialsAuditResourceComponent_ng_container_2_div_85_Template, 18, 1, "div", 53)(86, CredentialsAuditResourceComponent_ng_container_2_div_86_Template, 7, 2, "div", 54);
|
|
484
|
+
i0.ɵɵelementContainerEnd();
|
|
485
|
+
} if (rf & 2) {
|
|
486
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
487
|
+
i0.ɵɵadvance(20);
|
|
488
|
+
i0.ɵɵtextInterpolate(ctx_r1.auditLogs.length);
|
|
489
|
+
i0.ɵɵadvance(8);
|
|
490
|
+
i0.ɵɵtextInterpolate(ctx_r1.getSuccessCount());
|
|
491
|
+
i0.ɵɵadvance(4);
|
|
492
|
+
i0.ɵɵtextInterpolate1("", ctx_r1.getSuccessRate(), "%");
|
|
493
|
+
i0.ɵɵadvance(6);
|
|
494
|
+
i0.ɵɵtextInterpolate(ctx_r1.getFailedCount());
|
|
495
|
+
i0.ɵɵadvance(8);
|
|
496
|
+
i0.ɵɵtextInterpolate(ctx_r1.getUniqueUserCount());
|
|
497
|
+
i0.ɵɵadvance(3);
|
|
498
|
+
i0.ɵɵproperty("ngIf", ctx_r1.hourlyData.length > 0);
|
|
499
|
+
i0.ɵɵadvance(5);
|
|
500
|
+
i0.ɵɵproperty("value", ctx_r1.searchText);
|
|
501
|
+
i0.ɵɵadvance();
|
|
502
|
+
i0.ɵɵproperty("ngIf", ctx_r1.searchText);
|
|
503
|
+
i0.ɵɵadvance();
|
|
504
|
+
i0.ɵɵproperty("value", ctx_r1.selectedStatus);
|
|
505
|
+
i0.ɵɵadvance(7);
|
|
506
|
+
i0.ɵɵproperty("value", ctx_r1.selectedOperation);
|
|
507
|
+
i0.ɵɵadvance(3);
|
|
508
|
+
i0.ɵɵproperty("ngForOf", ctx_r1.getOperationList());
|
|
509
|
+
i0.ɵɵadvance();
|
|
510
|
+
i0.ɵɵproperty("value", ctx_r1.dateRange);
|
|
511
|
+
i0.ɵɵadvance(11);
|
|
512
|
+
i0.ɵɵtextInterpolate2(" ", ctx_r1.filteredLogs.length, " of ", ctx_r1.auditLogs.length, " events ");
|
|
513
|
+
i0.ɵɵadvance(2);
|
|
514
|
+
i0.ɵɵclassProp("active", ctx_r1.viewMode === "timeline");
|
|
515
|
+
i0.ɵɵadvance(2);
|
|
516
|
+
i0.ɵɵclassProp("active", ctx_r1.viewMode === "table");
|
|
517
|
+
i0.ɵɵadvance(2);
|
|
518
|
+
i0.ɵɵproperty("ngIf", ctx_r1.viewMode === "timeline" && ctx_r1.timelineGroups.length > 0);
|
|
519
|
+
i0.ɵɵadvance();
|
|
520
|
+
i0.ɵɵproperty("ngIf", ctx_r1.viewMode === "table" && ctx_r1.filteredLogs.length > 0);
|
|
521
|
+
i0.ɵɵadvance();
|
|
522
|
+
i0.ɵɵproperty("ngIf", ctx_r1.filteredLogs.length === 0);
|
|
523
|
+
} }
|
|
524
|
+
export function LoadCredentialsAuditResource() {
|
|
525
|
+
// Prevents tree-shaking
|
|
526
|
+
}
|
|
527
|
+
// The Credential Access AuditLogType ID from metadata
|
|
528
|
+
const CREDENTIAL_ACCESS_AUDIT_LOG_TYPE_ID = 'E8D4D100-E785-42D3-997F-ECFF3B0BCFC0';
|
|
529
|
+
let CredentialsAuditResourceComponent = class CredentialsAuditResourceComponent extends BaseResourceComponent {
|
|
530
|
+
cdr;
|
|
531
|
+
isLoading = true;
|
|
532
|
+
auditLogs = [];
|
|
533
|
+
filteredLogs = [];
|
|
534
|
+
timelineGroups = [];
|
|
535
|
+
selectedStatus = '';
|
|
536
|
+
selectedOperation = '';
|
|
537
|
+
dateRange = '7'; // days
|
|
538
|
+
searchText = '';
|
|
539
|
+
viewMode = 'timeline';
|
|
540
|
+
expandedLogId = null;
|
|
541
|
+
// Chart data
|
|
542
|
+
hourlyData = [];
|
|
543
|
+
operationCounts = new Map();
|
|
544
|
+
constructor(cdr) {
|
|
545
|
+
super();
|
|
546
|
+
this.cdr = cdr;
|
|
547
|
+
}
|
|
548
|
+
ngOnInit() {
|
|
549
|
+
this.loadData();
|
|
550
|
+
}
|
|
551
|
+
ngOnDestroy() {
|
|
552
|
+
// Cleanup if needed
|
|
553
|
+
}
|
|
554
|
+
async GetResourceDisplayName(data) {
|
|
555
|
+
return 'Audit Trail';
|
|
556
|
+
}
|
|
557
|
+
async GetResourceIconClass(data) {
|
|
558
|
+
return 'fa-solid fa-clipboard-list';
|
|
559
|
+
}
|
|
560
|
+
async loadData() {
|
|
561
|
+
try {
|
|
562
|
+
this.isLoading = true;
|
|
563
|
+
this.cdr.markForCheck();
|
|
564
|
+
const rv = new RunView();
|
|
565
|
+
// Calculate date filter
|
|
566
|
+
const startDate = new Date();
|
|
567
|
+
startDate.setDate(startDate.getDate() - parseInt(this.dateRange, 10));
|
|
568
|
+
const dateFilter = `AuditLogTypeID = '${CREDENTIAL_ACCESS_AUDIT_LOG_TYPE_ID}' AND __mj_CreatedAt >= '${startDate.toISOString()}'`;
|
|
569
|
+
const result = await rv.RunView({
|
|
570
|
+
EntityName: 'Audit Logs',
|
|
571
|
+
ExtraFilter: dateFilter,
|
|
572
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
573
|
+
MaxRows: 500,
|
|
574
|
+
ResultType: 'entity_object'
|
|
575
|
+
});
|
|
576
|
+
if (result.Success) {
|
|
577
|
+
this.auditLogs = result.Results;
|
|
578
|
+
this.parseAllDetails();
|
|
579
|
+
this.applyFilters();
|
|
580
|
+
this.buildChartData();
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
catch (error) {
|
|
584
|
+
console.error('Error loading audit logs:', error);
|
|
585
|
+
}
|
|
586
|
+
finally {
|
|
587
|
+
this.isLoading = false;
|
|
588
|
+
this.NotifyLoadComplete();
|
|
589
|
+
this.cdr.markForCheck();
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
parseAllDetails() {
|
|
593
|
+
for (const log of this.auditLogs) {
|
|
594
|
+
log.parsedDetails = this.parseDetails(log);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
parseDetails(log) {
|
|
598
|
+
try {
|
|
599
|
+
if (log.Details) {
|
|
600
|
+
return JSON.parse(log.Details);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
catch (e) {
|
|
604
|
+
// Ignore parse errors
|
|
605
|
+
}
|
|
606
|
+
return {};
|
|
607
|
+
}
|
|
608
|
+
onStatusFilterChange(status) {
|
|
609
|
+
this.selectedStatus = status;
|
|
610
|
+
this.applyFilters();
|
|
611
|
+
}
|
|
612
|
+
onOperationFilterChange(operation) {
|
|
613
|
+
this.selectedOperation = operation;
|
|
614
|
+
this.applyFilters();
|
|
615
|
+
}
|
|
616
|
+
onDateRangeChange(days) {
|
|
617
|
+
this.dateRange = days;
|
|
618
|
+
this.loadData();
|
|
619
|
+
}
|
|
620
|
+
onSearchChange(value) {
|
|
621
|
+
this.searchText = value;
|
|
622
|
+
this.applyFilters();
|
|
623
|
+
}
|
|
624
|
+
clearSearch() {
|
|
625
|
+
this.searchText = '';
|
|
626
|
+
this.applyFilters();
|
|
627
|
+
}
|
|
628
|
+
setViewMode(mode) {
|
|
629
|
+
this.viewMode = mode;
|
|
630
|
+
this.cdr.markForCheck();
|
|
631
|
+
}
|
|
632
|
+
toggleLogExpand(logId) {
|
|
633
|
+
this.expandedLogId = this.expandedLogId === logId ? null : logId;
|
|
634
|
+
this.cdr.markForCheck();
|
|
635
|
+
}
|
|
636
|
+
applyFilters() {
|
|
637
|
+
let filtered = [...this.auditLogs];
|
|
638
|
+
if (this.selectedStatus) {
|
|
639
|
+
filtered = filtered.filter(log => log.Status === this.selectedStatus);
|
|
640
|
+
}
|
|
641
|
+
if (this.selectedOperation) {
|
|
642
|
+
filtered = filtered.filter(log => {
|
|
643
|
+
const op = log.parsedDetails?.operation || 'Access';
|
|
644
|
+
return op === this.selectedOperation;
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
if (this.searchText) {
|
|
648
|
+
const searchLower = this.searchText.toLowerCase();
|
|
649
|
+
filtered = filtered.filter(log => {
|
|
650
|
+
const user = (log.User || '').toLowerCase();
|
|
651
|
+
const desc = (log.Description || '').toLowerCase();
|
|
652
|
+
const subsystem = (log.parsedDetails?.subsystem || '').toLowerCase();
|
|
653
|
+
const credType = (log.parsedDetails?.credentialType || '').toLowerCase();
|
|
654
|
+
return user.includes(searchLower) ||
|
|
655
|
+
desc.includes(searchLower) ||
|
|
656
|
+
subsystem.includes(searchLower) ||
|
|
657
|
+
credType.includes(searchLower);
|
|
658
|
+
});
|
|
659
|
+
}
|
|
660
|
+
this.filteredLogs = filtered;
|
|
661
|
+
this.buildTimelineGroups();
|
|
662
|
+
this.cdr.markForCheck();
|
|
663
|
+
}
|
|
664
|
+
buildTimelineGroups() {
|
|
665
|
+
const groups = new Map();
|
|
666
|
+
for (const log of this.filteredLogs) {
|
|
667
|
+
const date = new Date(log.__mj_CreatedAt);
|
|
668
|
+
const dateKey = date.toISOString().split('T')[0];
|
|
669
|
+
if (!groups.has(dateKey)) {
|
|
670
|
+
groups.set(dateKey, []);
|
|
671
|
+
}
|
|
672
|
+
groups.get(dateKey).push(log);
|
|
673
|
+
}
|
|
674
|
+
this.timelineGroups = Array.from(groups.entries())
|
|
675
|
+
.sort((a, b) => b[0].localeCompare(a[0]))
|
|
676
|
+
.map(([date, logs]) => ({
|
|
677
|
+
date,
|
|
678
|
+
displayDate: this.formatGroupDate(date),
|
|
679
|
+
logs
|
|
680
|
+
}));
|
|
681
|
+
}
|
|
682
|
+
formatGroupDate(dateString) {
|
|
683
|
+
const date = new Date(dateString);
|
|
684
|
+
const today = new Date();
|
|
685
|
+
const yesterday = new Date(today);
|
|
686
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
687
|
+
if (date.toDateString() === today.toDateString()) {
|
|
688
|
+
return 'Today';
|
|
689
|
+
}
|
|
690
|
+
else if (date.toDateString() === yesterday.toDateString()) {
|
|
691
|
+
return 'Yesterday';
|
|
692
|
+
}
|
|
693
|
+
else {
|
|
694
|
+
return date.toLocaleDateString('en-US', {
|
|
695
|
+
weekday: 'long',
|
|
696
|
+
month: 'long',
|
|
697
|
+
day: 'numeric',
|
|
698
|
+
year: date.getFullYear() !== today.getFullYear() ? 'numeric' : undefined
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
buildChartData() {
|
|
703
|
+
// Build hourly distribution for today
|
|
704
|
+
const hourCounts = {};
|
|
705
|
+
const today = new Date().toDateString();
|
|
706
|
+
for (let i = 0; i < 24; i++) {
|
|
707
|
+
const hour = i.toString().padStart(2, '0') + ':00';
|
|
708
|
+
hourCounts[hour] = { success: 0, failed: 0 };
|
|
709
|
+
}
|
|
710
|
+
for (const log of this.auditLogs) {
|
|
711
|
+
const date = new Date(log.__mj_CreatedAt);
|
|
712
|
+
if (date.toDateString() === today) {
|
|
713
|
+
const hour = date.getHours().toString().padStart(2, '0') + ':00';
|
|
714
|
+
if (log.Status === 'Success') {
|
|
715
|
+
hourCounts[hour].success++;
|
|
716
|
+
}
|
|
717
|
+
else {
|
|
718
|
+
hourCounts[hour].failed++;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
this.hourlyData = Object.entries(hourCounts).map(([hour, counts]) => ({
|
|
723
|
+
hour,
|
|
724
|
+
...counts
|
|
725
|
+
}));
|
|
726
|
+
// Build operation counts
|
|
727
|
+
this.operationCounts.clear();
|
|
728
|
+
for (const log of this.auditLogs) {
|
|
729
|
+
const op = log.parsedDetails?.operation || 'Access';
|
|
730
|
+
this.operationCounts.set(op, (this.operationCounts.get(op) || 0) + 1);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
getMaxHourlyCount() {
|
|
734
|
+
return Math.max(...this.hourlyData.map(d => d.success + d.failed), 1);
|
|
735
|
+
}
|
|
736
|
+
getOperationList() {
|
|
737
|
+
return Array.from(this.operationCounts.keys());
|
|
738
|
+
}
|
|
739
|
+
getStatusClass(status) {
|
|
740
|
+
switch (status) {
|
|
741
|
+
case 'Success': return 'success';
|
|
742
|
+
case 'Failed': return 'failed';
|
|
743
|
+
default: return 'unknown';
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
getOperationType(log) {
|
|
747
|
+
return log.parsedDetails?.operation || 'Access';
|
|
748
|
+
}
|
|
749
|
+
getSubsystem(log) {
|
|
750
|
+
return log.parsedDetails?.subsystem || '';
|
|
751
|
+
}
|
|
752
|
+
getOperationIcon(operation) {
|
|
753
|
+
switch (operation.toLowerCase()) {
|
|
754
|
+
case 'access': return 'fa-solid fa-eye';
|
|
755
|
+
case 'create': return 'fa-solid fa-plus';
|
|
756
|
+
case 'update': return 'fa-solid fa-pen';
|
|
757
|
+
case 'delete': return 'fa-solid fa-trash';
|
|
758
|
+
case 'rotate': return 'fa-solid fa-rotate';
|
|
759
|
+
case 'validate': return 'fa-solid fa-check-circle';
|
|
760
|
+
default: return 'fa-solid fa-circle';
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
getOperationColor(operation) {
|
|
764
|
+
switch (operation.toLowerCase()) {
|
|
765
|
+
case 'access': return '#6366f1';
|
|
766
|
+
case 'create': return '#10b981';
|
|
767
|
+
case 'update': return '#f59e0b';
|
|
768
|
+
case 'delete': return '#ef4444';
|
|
769
|
+
case 'rotate': return '#8b5cf6';
|
|
770
|
+
case 'validate': return '#06b6d4';
|
|
771
|
+
default: return '#6b7280';
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
formatDate(date) {
|
|
775
|
+
if (!date)
|
|
776
|
+
return '';
|
|
777
|
+
const d = new Date(date);
|
|
778
|
+
return d.toLocaleDateString('en-US', {
|
|
779
|
+
month: 'short',
|
|
780
|
+
day: 'numeric',
|
|
781
|
+
year: 'numeric',
|
|
782
|
+
hour: '2-digit',
|
|
783
|
+
minute: '2-digit',
|
|
784
|
+
second: '2-digit'
|
|
785
|
+
});
|
|
786
|
+
}
|
|
787
|
+
formatTime(date) {
|
|
788
|
+
if (!date)
|
|
789
|
+
return '';
|
|
790
|
+
const d = new Date(date);
|
|
791
|
+
return d.toLocaleTimeString('en-US', {
|
|
792
|
+
hour: '2-digit',
|
|
793
|
+
minute: '2-digit',
|
|
794
|
+
second: '2-digit'
|
|
795
|
+
});
|
|
796
|
+
}
|
|
797
|
+
formatDuration(ms) {
|
|
798
|
+
if (!ms)
|
|
799
|
+
return '-';
|
|
800
|
+
if (ms < 1000)
|
|
801
|
+
return `${ms}ms`;
|
|
802
|
+
return `${(ms / 1000).toFixed(2)}s`;
|
|
803
|
+
}
|
|
804
|
+
refresh() {
|
|
805
|
+
this.loadData();
|
|
806
|
+
}
|
|
807
|
+
getSuccessCount() {
|
|
808
|
+
return this.auditLogs.filter(log => log.Status === 'Success').length;
|
|
809
|
+
}
|
|
810
|
+
getFailedCount() {
|
|
811
|
+
return this.auditLogs.filter(log => log.Status === 'Failed').length;
|
|
812
|
+
}
|
|
813
|
+
getSuccessRate() {
|
|
814
|
+
if (this.auditLogs.length === 0)
|
|
815
|
+
return 0;
|
|
816
|
+
return Math.round((this.getSuccessCount() / this.auditLogs.length) * 100);
|
|
817
|
+
}
|
|
818
|
+
getUniqueUserCount() {
|
|
819
|
+
const users = new Set(this.auditLogs.map(log => log.User).filter(Boolean));
|
|
820
|
+
return users.size;
|
|
821
|
+
}
|
|
822
|
+
exportToCSV() {
|
|
823
|
+
const headers = ['Timestamp', 'User', 'Operation', 'Status', 'Description', 'Subsystem', 'Credential Type'];
|
|
824
|
+
const rows = this.filteredLogs.map(log => [
|
|
825
|
+
this.formatDate(log.__mj_CreatedAt),
|
|
826
|
+
log.User || '',
|
|
827
|
+
this.getOperationType(log),
|
|
828
|
+
log.Status || '',
|
|
829
|
+
log.Description || '',
|
|
830
|
+
this.getSubsystem(log),
|
|
831
|
+
log.parsedDetails?.credentialType || ''
|
|
832
|
+
]);
|
|
833
|
+
const csvContent = [
|
|
834
|
+
headers.join(','),
|
|
835
|
+
...rows.map(row => row.map(cell => `"${cell.replace(/"/g, '""')}"`).join(','))
|
|
836
|
+
].join('\n');
|
|
837
|
+
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
|
|
838
|
+
const link = document.createElement('a');
|
|
839
|
+
link.href = URL.createObjectURL(blob);
|
|
840
|
+
link.download = `credential-audit-log-${new Date().toISOString().split('T')[0]}.csv`;
|
|
841
|
+
link.click();
|
|
842
|
+
}
|
|
843
|
+
static ɵfac = function CredentialsAuditResourceComponent_Factory(t) { return new (t || CredentialsAuditResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
844
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsAuditResourceComponent, selectors: [["mj-credentials-audit-resource"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [[1, "audit-container"], ["text", "Loading audit logs...", 4, "ngIf"], [4, "ngIf"], ["text", "Loading audit logs..."], [1, "audit-header"], [1, "header-info"], [1, "audit-title"], [1, "audit-subtitle"], [1, "header-actions"], ["title", "Export to CSV", 1, "btn-secondary", 3, "click"], [1, "fa-solid", "fa-download"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "stats-grid"], [1, "stat-card"], [1, "stat-icon", "total"], [1, "fa-solid", "fa-clipboard-list"], [1, "stat-content"], [1, "stat-value"], [1, "stat-label"], [1, "stat-icon", "success"], [1, "fa-solid", "fa-check-circle"], [1, "stat-value", "success"], [1, "stat-rate"], [1, "stat-icon", "failed"], [1, "fa-solid", "fa-times-circle"], [1, "stat-value", "failed"], [1, "stat-icon", "users"], [1, "fa-solid", "fa-users"], ["class", "activity-chart", 4, "ngIf"], [1, "toolbar"], [1, "toolbar-left"], [1, "search-container"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search logs...", 3, "input", "value"], ["class", "search-clear", 3, "click", 4, "ngIf"], [1, "filter-select", 3, "change", "value"], ["value", ""], ["value", "Success"], ["value", "Failed"], [3, "value", 4, "ngFor", "ngForOf"], ["value", "1"], ["value", "7"], ["value", "30"], ["value", "90"], [1, "toolbar-right"], [1, "results-info"], [1, "view-toggle"], ["title", "Timeline View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-timeline"], ["title", "Table View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-table"], ["class", "timeline-container", 4, "ngIf"], ["class", "audit-table-container", 4, "ngIf"], ["class", "empty-state", 4, "ngIf"], [1, "activity-chart"], [1, "chart-header"], [1, "fa-solid", "fa-chart-bar"], [1, "chart-container"], [1, "chart-bars"], ["class", "chart-bar-wrapper", 3, "title", 4, "ngFor", "ngForOf"], [1, "chart-legend"], [1, "legend-item"], [1, "legend-color", "success"], [1, "legend-color", "failed"], [1, "chart-bar-wrapper", 3, "title"], [1, "chart-bar"], [1, "bar-segment", "success"], [1, "bar-segment", "failed"], [1, "chart-label"], [1, "search-clear", 3, "click"], [1, "fa-solid", "fa-times"], [3, "value"], [1, "timeline-container"], ["class", "timeline-group", 4, "ngFor", "ngForOf"], [1, "timeline-group"], [1, "timeline-date"], [1, "date-label"], [1, "date-count"], [1, "timeline-items"], ["class", "timeline-item", 3, "expanded", "failed", 4, "ngFor", "ngForOf"], [1, "timeline-item"], [1, "timeline-line"], [1, "timeline-dot"], [1, "timeline-content", 3, "click"], [1, "timeline-header"], [1, "timeline-operation"], [1, "operation-name"], [1, "timeline-time"], [1, "timeline-body"], [1, "timeline-user"], [1, "fa-solid", "fa-user"], ["class", "timeline-description", 4, "ngIf"], [1, "timeline-badges"], [1, "status-badge", 3, "ngClass"], ["class", "subsystem-badge", 4, "ngIf"], ["class", "type-badge", 4, "ngIf"], ["class", "timeline-details", 4, "ngIf"], [1, "expand-btn"], [1, "timeline-description"], [1, "subsystem-badge"], [1, "type-badge"], [1, "fa-solid", "fa-key"], [1, "timeline-details"], [1, "detail-grid"], ["class", "detail-item", 4, "ngIf"], ["class", "detail-item full-width", 4, "ngIf"], [1, "detail-item"], [1, "detail-label"], [1, "detail-value"], [1, "detail-value", "mono"], [1, "detail-item", "full-width"], [1, "detail-value", "error"], [1, "detail-value", "mono", "small"], [1, "audit-table-container"], [1, "audit-table"], [3, "failed-row", 4, "ngFor", "ngForOf"], [1, "timestamp"], [1, "user"], [1, "operation"], [1, "operation-badge"], [1, "description"], [1, "subsystem"], [1, "status"], [1, "empty-state"], [1, "empty-icon"], [1, "btn-link", 3, "click"]], template: function CredentialsAuditResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
845
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
846
|
+
i0.ɵɵtemplate(1, CredentialsAuditResourceComponent_mj_loading_1_Template, 1, 0, "mj-loading", 1)(2, CredentialsAuditResourceComponent_ng_container_2_Template, 87, 21, "ng-container", 2);
|
|
847
|
+
i0.ɵɵelementEnd();
|
|
848
|
+
} if (rf & 2) {
|
|
849
|
+
i0.ɵɵadvance();
|
|
850
|
+
i0.ɵɵproperty("ngIf", ctx.isLoading);
|
|
851
|
+
i0.ɵɵadvance();
|
|
852
|
+
i0.ɵɵproperty("ngIf", !ctx.isLoading);
|
|
853
|
+
} }, dependencies: [i1.NgClass, i1.NgForOf, i1.NgIf, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i3.LoadingComponent], styles: [".audit-container[_ngcontent-%COMP%] {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--background-secondary, #f8fafc);\n}\n\n\n\n.audit-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.audit-subtitle[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #374151);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n border-color: var(--accent-color, #6366f1);\n color: var(--accent-color, #6366f1);\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n color: var(--accent-color, #6366f1);\n}\n\n\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total[_ngcontent-%COMP%] {\n background: rgba(99, 102, 241, 0.1);\n color: #6366f1;\n}\n\n.stat-icon.success[_ngcontent-%COMP%] {\n background: rgba(16, 185, 129, 0.1);\n color: #10b981;\n}\n\n.stat-icon.failed[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.1);\n color: #ef4444;\n}\n\n.stat-icon.users[_ngcontent-%COMP%] {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n}\n\n.stat-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n}\n\n.stat-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n line-height: 1;\n}\n\n.stat-value.success[_ngcontent-%COMP%] {\n color: #10b981;\n}\n\n.stat-value.failed[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-top: 4px;\n}\n\n.stat-rate[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: #10b981;\n background: rgba(16, 185, 129, 0.1);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n\n\n.activity-chart[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--accent-color, #6366f1);\n}\n\n.chart-container[_ngcontent-%COMP%] {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar[_ngcontent-%COMP%] {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--bar-background, #f3f4f6);\n}\n\n.bar-segment[_ngcontent-%COMP%] {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success[_ngcontent-%COMP%] {\n background: linear-gradient(180deg, #10b981 0%, #059669 100%);\n}\n\n.bar-segment.failed[_ngcontent-%COMP%] {\n background: linear-gradient(180deg, #ef4444 0%, #dc2626 100%);\n}\n\n.chart-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--text-secondary, #9ca3af);\n margin-top: 4px;\n}\n\n.chart-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--border-color, #f3f4f6);\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n}\n\n.legend-color[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success[_ngcontent-%COMP%] {\n background: #10b981;\n}\n\n.legend-color.failed[_ngcontent-%COMP%] {\n background: #ef4444;\n}\n\n\n\n.toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n position: relative;\n min-width: 200px;\n}\n\n.search-container[_ngcontent-%COMP%] i.fa-search[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-secondary, #9ca3af);\n font-size: 13px;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n background: var(--input-background, #f9fafb);\n transition: all 0.2s ease;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n background: white;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--button-hover, #e5e7eb);\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n}\n\n.search-clear[_ngcontent-%COMP%]:hover {\n background: var(--text-secondary, #9ca3af);\n color: white;\n}\n\n.filter-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--input-background, #f9fafb);\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n}\n\n.results-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--toggle-background, #f3f4f6);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--text-primary, #1f2937);\n}\n\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n color: var(--accent-color, #6366f1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.timeline-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.date-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.date-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n background: var(--badge-background, #e5e7eb);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.timeline-item[_ngcontent-%COMP%] {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%]:hover {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timeline-line[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.operation-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n font-family: monospace;\n color: var(--text-secondary, #6b7280);\n}\n\n.timeline-body[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.timeline-user[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-bottom: 4px;\n}\n\n.timeline-user[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.timeline-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-primary, #374151);\n margin-bottom: 8px;\n}\n\n.timeline-badges[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.failed[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-badge.unknown[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.subsystem-badge[_ngcontent-%COMP%], \n.type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--badge-background, #f3f4f6);\n border-radius: 12px;\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n}\n\n.type-badge[_ngcontent-%COMP%] {\n background: rgba(99, 102, 241, 0.1);\n color: var(--accent-color, #6366f1);\n}\n\n.type-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.timeline-details[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 16px;\n background: var(--detail-background, #f9fafb);\n border-radius: 8px;\n border: 1px solid var(--border-color, #e5e7eb);\n}\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n}\n\n.detail-value.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small[_ngcontent-%COMP%] {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error[_ngcontent-%COMP%] {\n color: #dc2626;\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--text-secondary, #9ca3af);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--accent-color, #6366f1);\n}\n\n.expand-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.audit-table-container[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n}\n\n.audit-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: var(--hover-background, #f9fafb);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timestamp[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n white-space: nowrap;\n}\n\n.user[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.operation-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.description[_ngcontent-%COMP%] {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem[_ngcontent-%COMP%] {\n color: var(--text-secondary, #6b7280);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--text-secondary, #d1d5db);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--accent-color, #6366f1);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n\n\n@media (max-width: 1200px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .audit-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .toolbar[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .search-container[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .toolbar-right[_ngcontent-%COMP%] {\n justify-content: space-between;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .chart-label[_ngcontent-%COMP%] {\n display: none;\n }\n\n .chart-label[_ngcontent-%COMP%]:nth-child(4n+1) {\n display: block;\n }\n}"], changeDetection: 0 });
|
|
854
|
+
};
|
|
855
|
+
CredentialsAuditResourceComponent = __decorate([
|
|
856
|
+
RegisterClass(BaseResourceComponent, 'CredentialsAuditResource')
|
|
857
|
+
], CredentialsAuditResourceComponent);
|
|
858
|
+
export { CredentialsAuditResourceComponent };
|
|
859
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CredentialsAuditResourceComponent, [{
|
|
860
|
+
type: Component,
|
|
861
|
+
args: [{ selector: 'mj-credentials-audit-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"audit-container\">\n <mj-loading *ngIf=\"isLoading\" text=\"Loading audit logs...\"></mj-loading>\n\n <ng-container *ngIf=\"!isLoading\">\n <!-- Header -->\n <div class=\"audit-header\">\n <div class=\"header-info\">\n <h2 class=\"audit-title\">Audit Trail</h2>\n <p class=\"audit-subtitle\">Credential access and modification history</p>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-secondary\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Export</span>\n </button>\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <!-- Stats Cards -->\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-icon total\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{auditLogs.length}}</div>\n <div class=\"stat-label\">Total Events</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value success\">{{getSuccessCount()}}</div>\n <div class=\"stat-label\">Successful</div>\n </div>\n <div class=\"stat-rate\">{{getSuccessRate()}}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon failed\">\n <i class=\"fa-solid fa-times-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value failed\">{{getFailedCount()}}</div>\n <div class=\"stat-label\">Failed</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon users\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{getUniqueUserCount()}}</div>\n <div class=\"stat-label\">Unique Users</div>\n </div>\n </div>\n </div>\n\n <!-- Activity Chart -->\n <div class=\"activity-chart\" *ngIf=\"hourlyData.length > 0\">\n <div class=\"chart-header\">\n <h3>\n <i class=\"fa-solid fa-chart-bar\"></i>\n Today's Activity\n </h3>\n </div>\n <div class=\"chart-container\">\n <div class=\"chart-bars\">\n <div\n class=\"chart-bar-wrapper\"\n *ngFor=\"let data of hourlyData\"\n [title]=\"data.hour + ': ' + (data.success + data.failed) + ' events'\"\n >\n <div class=\"chart-bar\">\n <div\n class=\"bar-segment success\"\n [style.height.%]=\"(data.success / getMaxHourlyCount()) * 100\"\n ></div>\n <div\n class=\"bar-segment failed\"\n [style.height.%]=\"(data.failed / getMaxHourlyCount()) * 100\"\n ></div>\n </div>\n <span class=\"chart-label\">{{data.hour.split(':')[0]}}</span>\n </div>\n </div>\n </div>\n <div class=\"chart-legend\">\n <span class=\"legend-item\">\n <span class=\"legend-color success\"></span>\n Success\n </span>\n <span class=\"legend-item\">\n <span class=\"legend-color failed\"></span>\n Failed\n </span>\n </div>\n </div>\n\n <!-- Toolbar -->\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search logs...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n <button class=\"search-clear\" *ngIf=\"searchText\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <select\n class=\"filter-select\"\n [value]=\"selectedStatus\"\n (change)=\"onStatusFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Statuses</option>\n <option value=\"Success\">Success</option>\n <option value=\"Failed\">Failed</option>\n </select>\n\n <select\n class=\"filter-select\"\n [value]=\"selectedOperation\"\n (change)=\"onOperationFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Operations</option>\n <option *ngFor=\"let op of getOperationList()\" [value]=\"op\">{{op}}</option>\n </select>\n\n <select\n class=\"filter-select\"\n [value]=\"dateRange\"\n (change)=\"onDateRangeChange($any($event.target).value)\"\n >\n <option value=\"1\">Last 24 hours</option>\n <option value=\"7\">Last 7 days</option>\n <option value=\"30\">Last 30 days</option>\n <option value=\"90\">Last 90 days</option>\n </select>\n </div>\n\n <div class=\"toolbar-right\">\n <div class=\"results-info\">\n {{filteredLogs.length}} of {{auditLogs.length}} events\n </div>\n <div class=\"view-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'timeline'\"\n (click)=\"setViewMode('timeline')\"\n title=\"Timeline View\"\n >\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'table'\"\n (click)=\"setViewMode('table')\"\n title=\"Table View\"\n >\n <i class=\"fa-solid fa-table\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Timeline View -->\n <div class=\"timeline-container\" *ngIf=\"viewMode === 'timeline' && timelineGroups.length > 0\">\n <div class=\"timeline-group\" *ngFor=\"let group of timelineGroups\">\n <div class=\"timeline-date\">\n <span class=\"date-label\">{{group.displayDate}}</span>\n <span class=\"date-count\">{{group.logs.length}} events</span>\n </div>\n <div class=\"timeline-items\">\n <div\n class=\"timeline-item\"\n *ngFor=\"let log of group.logs\"\n [class.expanded]=\"expandedLogId === log.ID\"\n [class.failed]=\"log.Status === 'Failed'\"\n >\n <div class=\"timeline-line\">\n <div\n class=\"timeline-dot\"\n [style.backgroundColor]=\"getOperationColor(getOperationType(log))\"\n ></div>\n </div>\n <div class=\"timeline-content\" (click)=\"toggleLogExpand(log.ID)\">\n <div class=\"timeline-header\">\n <div class=\"timeline-operation\">\n <i [class]=\"getOperationIcon(getOperationType(log))\" [style.color]=\"getOperationColor(getOperationType(log))\"></i>\n <span class=\"operation-name\">{{getOperationType(log)}}</span>\n </div>\n <div class=\"timeline-time\">{{formatTime(log.__mj_CreatedAt)}}</div>\n </div>\n <div class=\"timeline-body\">\n <div class=\"timeline-user\">\n <i class=\"fa-solid fa-user\"></i>\n {{log.User || 'Unknown'}}\n </div>\n <div class=\"timeline-description\" *ngIf=\"log.Description\">\n {{log.Description}}\n </div>\n <div class=\"timeline-badges\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n <i [class]=\"log.Status === 'Success' ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n {{log.Status}}\n </span>\n <span class=\"subsystem-badge\" *ngIf=\"getSubsystem(log)\">\n {{getSubsystem(log)}}\n </span>\n <span class=\"type-badge\" *ngIf=\"log.parsedDetails?.credentialType\">\n <i class=\"fa-solid fa-key\"></i>\n {{log.parsedDetails?.credentialType}}\n </span>\n </div>\n </div>\n <div class=\"timeline-details\" *ngIf=\"expandedLogId === log.ID\">\n <div class=\"detail-grid\">\n <div class=\"detail-item\" *ngIf=\"log.parsedDetails?.ipAddress\">\n <span class=\"detail-label\">IP Address</span>\n <span class=\"detail-value\">{{log.parsedDetails?.ipAddress}}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"log.parsedDetails?.duration\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{formatDuration(log.parsedDetails?.duration)}}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"log.parsedDetails?.credentialId\">\n <span class=\"detail-label\">Credential ID</span>\n <span class=\"detail-value mono\">{{log.parsedDetails?.credentialId}}</span>\n </div>\n <div class=\"detail-item full-width\" *ngIf=\"log.parsedDetails?.errorMessage\">\n <span class=\"detail-label\">Error Message</span>\n <span class=\"detail-value error\">{{log.parsedDetails?.errorMessage}}</span>\n </div>\n <div class=\"detail-item full-width\" *ngIf=\"log.parsedDetails?.userAgent\">\n <span class=\"detail-label\">User Agent</span>\n <span class=\"detail-value mono small\">{{log.parsedDetails?.userAgent}}</span>\n </div>\n </div>\n </div>\n <button class=\"expand-btn\">\n <i [class]=\"expandedLogId === log.ID ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table View -->\n <div class=\"audit-table-container\" *ngIf=\"viewMode === 'table' && filteredLogs.length > 0\">\n <table class=\"audit-table\">\n <thead>\n <tr>\n <th>Timestamp</th>\n <th>User</th>\n <th>Operation</th>\n <th>Description</th>\n <th>Subsystem</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let log of filteredLogs\" [class.failed-row]=\"log.Status === 'Failed'\">\n <td class=\"timestamp\">{{formatDate(log.__mj_CreatedAt)}}</td>\n <td class=\"user\">{{log.User || 'Unknown'}}</td>\n <td class=\"operation\">\n <span class=\"operation-badge\" [style.backgroundColor]=\"getOperationColor(getOperationType(log)) + '20'\" [style.color]=\"getOperationColor(getOperationType(log))\">\n <i [class]=\"getOperationIcon(getOperationType(log))\"></i>\n {{getOperationType(log)}}\n </span>\n </td>\n <td class=\"description\">{{log.Description || '-'}}</td>\n <td class=\"subsystem\">{{getSubsystem(log) || '-'}}</td>\n <td class=\"status\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n <i [class]=\"log.Status === 'Success' ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n {{log.Status}}\n </span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Empty State -->\n <div class=\"empty-state\" *ngIf=\"filteredLogs.length === 0\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <h3>No Audit Logs</h3>\n <p *ngIf=\"searchText || selectedStatus || selectedOperation\">\n No events match your current filters.\n <button class=\"btn-link\" (click)=\"searchText = ''; selectedStatus = ''; selectedOperation = ''; applyFilters()\">Clear filters</button>\n </p>\n <p *ngIf=\"!searchText && !selectedStatus && !selectedOperation\">\n No credential access events in the selected time range.\n </p>\n </div>\n </ng-container>\n</div>\n", styles: [".audit-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--background-secondary, #f8fafc);\n}\n\n/* Header */\n.audit-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title {\n font-size: 24px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.audit-subtitle {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #374151);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary:hover {\n background: var(--hover-background, #f9fafb);\n border-color: var(--accent-color, #6366f1);\n color: var(--accent-color, #6366f1);\n}\n\n.btn-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon:hover {\n background: var(--hover-background, #f9fafb);\n color: var(--accent-color, #6366f1);\n}\n\n/* Stats Grid */\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total {\n background: rgba(99, 102, 241, 0.1);\n color: #6366f1;\n}\n\n.stat-icon.success {\n background: rgba(16, 185, 129, 0.1);\n color: #10b981;\n}\n\n.stat-icon.failed {\n background: rgba(239, 68, 68, 0.1);\n color: #ef4444;\n}\n\n.stat-icon.users {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n}\n\n.stat-icon i {\n font-size: 20px;\n}\n\n.stat-content {\n flex: 1;\n}\n\n.stat-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n line-height: 1;\n}\n\n.stat-value.success {\n color: #10b981;\n}\n\n.stat-value.failed {\n color: #ef4444;\n}\n\n.stat-label {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-top: 4px;\n}\n\n.stat-rate {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: #10b981;\n background: rgba(16, 185, 129, 0.1);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n/* Activity Chart */\n.activity-chart {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header {\n margin-bottom: 16px;\n}\n\n.chart-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.chart-header h3 i {\n color: var(--accent-color, #6366f1);\n}\n\n.chart-container {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--bar-background, #f3f4f6);\n}\n\n.bar-segment {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success {\n background: linear-gradient(180deg, #10b981 0%, #059669 100%);\n}\n\n.bar-segment.failed {\n background: linear-gradient(180deg, #ef4444 0%, #dc2626 100%);\n}\n\n.chart-label {\n font-size: 10px;\n color: var(--text-secondary, #9ca3af);\n margin-top: 4px;\n}\n\n.chart-legend {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--border-color, #f3f4f6);\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n}\n\n.legend-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success {\n background: #10b981;\n}\n\n.legend-color.failed {\n background: #ef4444;\n}\n\n/* Toolbar */\n.toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n/* Search */\n.search-container {\n position: relative;\n min-width: 200px;\n}\n\n.search-container i.fa-search {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-secondary, #9ca3af);\n font-size: 13px;\n}\n\n.search-container input {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n background: var(--input-background, #f9fafb);\n transition: all 0.2s ease;\n}\n\n.search-container input:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n background: white;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--button-hover, #e5e7eb);\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n}\n\n.search-clear:hover {\n background: var(--text-secondary, #9ca3af);\n color: white;\n}\n\n.filter-select {\n padding: 8px 12px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--input-background, #f9fafb);\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n}\n\n.results-info {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n/* View Toggle */\n.view-toggle {\n display: flex;\n background: var(--toggle-background, #f3f4f6);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn:hover {\n color: var(--text-primary, #1f2937);\n}\n\n.toggle-btn.active {\n background: var(--card-background, #ffffff);\n color: var(--accent-color, #6366f1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Timeline View */\n.timeline-container {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.date-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.date-count {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n background: var(--badge-background, #e5e7eb);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items {\n padding: 8px 0;\n}\n\n.timeline-item {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item:hover {\n background: var(--hover-background, #f9fafb);\n}\n\n.timeline-item.failed {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.timeline-item.failed:hover {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timeline-line {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation i {\n font-size: 14px;\n}\n\n.operation-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.timeline-time {\n font-size: 12px;\n font-family: monospace;\n color: var(--text-secondary, #6b7280);\n}\n\n.timeline-body {\n margin-bottom: 8px;\n}\n\n.timeline-user {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-bottom: 4px;\n}\n\n.timeline-user i {\n font-size: 11px;\n}\n\n.timeline-description {\n font-size: 13px;\n color: var(--text-primary, #374151);\n margin-bottom: 8px;\n}\n\n.timeline-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.failed {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-badge.unknown {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-badge i {\n font-size: 10px;\n}\n\n.subsystem-badge,\n.type-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--badge-background, #f3f4f6);\n border-radius: 12px;\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n}\n\n.type-badge {\n background: rgba(99, 102, 241, 0.1);\n color: var(--accent-color, #6366f1);\n}\n\n.type-badge i {\n font-size: 10px;\n}\n\n/* Timeline Details */\n.timeline-details {\n margin-top: 12px;\n padding: 16px;\n background: var(--detail-background, #f9fafb);\n border-radius: 8px;\n border: 1px solid var(--border-color, #e5e7eb);\n}\n\n.detail-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n}\n\n.detail-value {\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n}\n\n.detail-value.mono {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error {\n color: #dc2626;\n}\n\n.expand-btn {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--text-secondary, #9ca3af);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn:hover {\n color: var(--accent-color, #6366f1);\n}\n\n.expand-btn i {\n font-size: 10px;\n}\n\n/* Table View */\n.audit-table-container {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table th {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n}\n\n.audit-table td {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.audit-table tr:last-child td {\n border-bottom: none;\n}\n\n.audit-table tr:hover td {\n background: var(--hover-background, #f9fafb);\n}\n\n.audit-table tr.failed-row td {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.audit-table tr.failed-row:hover td {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timestamp {\n font-family: monospace;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n white-space: nowrap;\n}\n\n.user {\n font-weight: 500;\n}\n\n.operation-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge i {\n font-size: 10px;\n}\n\n.description {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem {\n color: var(--text-secondary, #6b7280);\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon i {\n font-size: 32px;\n color: var(--text-secondary, #d1d5db);\n}\n\n.empty-state h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.empty-state p {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--accent-color, #6366f1);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n/* Responsive */\n@media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container {\n padding: 16px;\n }\n\n .audit-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid {\n grid-template-columns: 1fr;\n }\n\n .toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left {\n flex-direction: column;\n }\n\n .search-container {\n width: 100%;\n }\n\n .filter-select {\n width: 100%;\n }\n\n .toolbar-right {\n justify-content: space-between;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n\n .chart-label {\n display: none;\n }\n\n .chart-label:nth-child(4n+1) {\n display: block;\n }\n}\n"] }]
|
|
862
|
+
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
863
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsAuditResourceComponent, { className: "CredentialsAuditResourceComponent", filePath: "src/Credentials/components/credentials-audit-resource.component.ts", lineNumber: 42 }); })();
|
|
864
|
+
//# sourceMappingURL=credentials-audit-resource.component.js.map
|