@memberjunction/ng-dashboards 5.38.0 → 5.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -7
- package/dist/AI/components/agents/agent-configuration.component.js +199 -198
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -856
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7841
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +209 -208
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +130 -128
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +17 -17
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +550 -532
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +14 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/AI/services/cache-metrics.d.ts +50 -0
- package/dist/AI/services/cache-metrics.d.ts.map +1 -0
- package/dist/AI/services/cache-metrics.js +43 -0
- package/dist/AI/services/cache-metrics.js.map +1 -0
- package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js +132 -131
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +141 -141
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +15 -15
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +2 -2
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +2 -2
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +2 -2
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +72 -50
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +103 -102
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +52 -51
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +39 -38
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +92 -89
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +18 -17
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -85
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +155 -150
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +245 -243
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +18 -17
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +236 -229
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +390 -389
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +525 -566
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +135 -134
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +443 -438
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +436 -427
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +1 -1
- package/dist/Testing/components/testing-runs.component.js +116 -115
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +6 -7
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +173 -172
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +116 -92
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +47 -35
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +40 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +1 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +7 -1
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +4 -5
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +7 -5
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +55 -54
|
@@ -12,14 +12,14 @@ import * as i0 from "@angular/core";
|
|
|
12
12
|
import * as i1 from "@angular/common";
|
|
13
13
|
import * as i2 from "@memberjunction/ng-ui-components";
|
|
14
14
|
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
15
|
-
function
|
|
16
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
15
|
+
function CredentialsAuditResourceComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
16
|
+
i0.ɵɵelement(0, "mj-loading", 13);
|
|
17
17
|
} }
|
|
18
|
-
function
|
|
19
|
-
i0.ɵɵelementStart(0, "div",
|
|
20
|
-
i0.ɵɵelement(2, "div",
|
|
18
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_35_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementStart(0, "div", 38)(1, "div", 43);
|
|
20
|
+
i0.ɵɵelement(2, "div", 44)(3, "div", 45);
|
|
21
21
|
i0.ɵɵelementEnd();
|
|
22
|
-
i0.ɵɵelementStart(4, "span",
|
|
22
|
+
i0.ɵɵelementStart(4, "span", 46);
|
|
23
23
|
i0.ɵɵtext(5);
|
|
24
24
|
i0.ɵɵelementEnd()();
|
|
25
25
|
} if (rf & 2) {
|
|
@@ -33,20 +33,20 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_35_For_8_T
|
|
|
33
33
|
i0.ɵɵadvance(2);
|
|
34
34
|
i0.ɵɵtextInterpolate(data_r1.hour.split(":")[0]);
|
|
35
35
|
} }
|
|
36
|
-
function
|
|
37
|
-
i0.ɵɵelementStart(0, "div",
|
|
38
|
-
i0.ɵɵelement(3, "i",
|
|
36
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
i0.ɵɵelementStart(0, "div", 30)(1, "div", 34)(2, "h3");
|
|
38
|
+
i0.ɵɵelement(3, "i", 35);
|
|
39
39
|
i0.ɵɵtext(4, " Today's Activity ");
|
|
40
40
|
i0.ɵɵelementEnd()();
|
|
41
|
-
i0.ɵɵelementStart(5, "div",
|
|
42
|
-
i0.ɵɵrepeaterCreate(7,
|
|
41
|
+
i0.ɵɵelementStart(5, "div", 36)(6, "div", 37);
|
|
42
|
+
i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_17_Conditional_35_For_8_Template, 6, 6, "div", 38, i0.ɵɵrepeaterTrackByIdentity);
|
|
43
43
|
i0.ɵɵelementEnd()();
|
|
44
|
-
i0.ɵɵelementStart(9, "div",
|
|
45
|
-
i0.ɵɵelement(11, "span",
|
|
44
|
+
i0.ɵɵelementStart(9, "div", 39)(10, "span", 40);
|
|
45
|
+
i0.ɵɵelement(11, "span", 41);
|
|
46
46
|
i0.ɵɵtext(12, " Success ");
|
|
47
47
|
i0.ɵɵelementEnd();
|
|
48
|
-
i0.ɵɵelementStart(13, "span",
|
|
49
|
-
i0.ɵɵelement(14, "span",
|
|
48
|
+
i0.ɵɵelementStart(13, "span", 40);
|
|
49
|
+
i0.ɵɵelement(14, "span", 42);
|
|
50
50
|
i0.ɵɵtext(15, " Failed ");
|
|
51
51
|
i0.ɵɵelementEnd()()();
|
|
52
52
|
} if (rf & 2) {
|
|
@@ -54,8 +54,8 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_35_Templat
|
|
|
54
54
|
i0.ɵɵadvance(7);
|
|
55
55
|
i0.ɵɵrepeater(ctx_r1.hourlyData);
|
|
56
56
|
} }
|
|
57
|
-
function
|
|
58
|
-
i0.ɵɵelementStart(0, "div",
|
|
57
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
58
|
+
i0.ɵɵelementStart(0, "div", 64);
|
|
59
59
|
i0.ɵɵtext(1);
|
|
60
60
|
i0.ɵɵelementEnd();
|
|
61
61
|
} if (rf & 2) {
|
|
@@ -63,8 +63,8 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
63
63
|
i0.ɵɵadvance();
|
|
64
64
|
i0.ɵɵtextInterpolate1(" ", log_r4.Description, " ");
|
|
65
65
|
} }
|
|
66
|
-
function
|
|
67
|
-
i0.ɵɵelementStart(0, "span",
|
|
66
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
+
i0.ɵɵelementStart(0, "span", 67);
|
|
68
68
|
i0.ɵɵtext(1);
|
|
69
69
|
i0.ɵɵelementEnd();
|
|
70
70
|
} if (rf & 2) {
|
|
@@ -73,9 +73,9 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
73
73
|
i0.ɵɵadvance();
|
|
74
74
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.getSubsystem(log_r4), " ");
|
|
75
75
|
} }
|
|
76
|
-
function
|
|
77
|
-
i0.ɵɵelementStart(0, "span",
|
|
78
|
-
i0.ɵɵelement(1, "i",
|
|
76
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
77
|
+
i0.ɵɵelementStart(0, "span", 68);
|
|
78
|
+
i0.ɵɵelement(1, "i", 71);
|
|
79
79
|
i0.ɵɵtext(2);
|
|
80
80
|
i0.ɵɵelementEnd();
|
|
81
81
|
} if (rf & 2) {
|
|
@@ -83,11 +83,11 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
83
83
|
i0.ɵɵadvance(2);
|
|
84
84
|
i0.ɵɵtextInterpolate1(" ", log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialType, " ");
|
|
85
85
|
} }
|
|
86
|
-
function
|
|
87
|
-
i0.ɵɵelementStart(0, "div",
|
|
86
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
87
|
+
i0.ɵɵelementStart(0, "div", 73)(1, "span", 75);
|
|
88
88
|
i0.ɵɵtext(2, "IP Address");
|
|
89
89
|
i0.ɵɵelementEnd();
|
|
90
|
-
i0.ɵɵelementStart(3, "span",
|
|
90
|
+
i0.ɵɵelementStart(3, "span", 76);
|
|
91
91
|
i0.ɵɵtext(4);
|
|
92
92
|
i0.ɵɵelementEnd()();
|
|
93
93
|
} if (rf & 2) {
|
|
@@ -95,11 +95,11 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
95
95
|
i0.ɵɵadvance(4);
|
|
96
96
|
i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.ipAddress);
|
|
97
97
|
} }
|
|
98
|
-
function
|
|
99
|
-
i0.ɵɵelementStart(0, "div",
|
|
98
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
+
i0.ɵɵelementStart(0, "div", 73)(1, "span", 75);
|
|
100
100
|
i0.ɵɵtext(2, "Duration");
|
|
101
101
|
i0.ɵɵelementEnd();
|
|
102
|
-
i0.ɵɵelementStart(3, "span",
|
|
102
|
+
i0.ɵɵelementStart(3, "span", 76);
|
|
103
103
|
i0.ɵɵtext(4);
|
|
104
104
|
i0.ɵɵelementEnd()();
|
|
105
105
|
} if (rf & 2) {
|
|
@@ -108,11 +108,11 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
108
108
|
i0.ɵɵadvance(4);
|
|
109
109
|
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.duration));
|
|
110
110
|
} }
|
|
111
|
-
function
|
|
112
|
-
i0.ɵɵelementStart(0, "div",
|
|
111
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
112
|
+
i0.ɵɵelementStart(0, "div", 73)(1, "span", 75);
|
|
113
113
|
i0.ɵɵtext(2, "Credential ID");
|
|
114
114
|
i0.ɵɵelementEnd();
|
|
115
|
-
i0.ɵɵelementStart(3, "span",
|
|
115
|
+
i0.ɵɵelementStart(3, "span", 77);
|
|
116
116
|
i0.ɵɵtext(4);
|
|
117
117
|
i0.ɵɵelementEnd()();
|
|
118
118
|
} if (rf & 2) {
|
|
@@ -120,11 +120,11 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
120
120
|
i0.ɵɵadvance(4);
|
|
121
121
|
i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialId);
|
|
122
122
|
} }
|
|
123
|
-
function
|
|
124
|
-
i0.ɵɵelementStart(0, "div",
|
|
123
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
124
|
+
i0.ɵɵelementStart(0, "div", 74)(1, "span", 75);
|
|
125
125
|
i0.ɵɵtext(2, "Error Message");
|
|
126
126
|
i0.ɵɵelementEnd();
|
|
127
|
-
i0.ɵɵelementStart(3, "span",
|
|
127
|
+
i0.ɵɵelementStart(3, "span", 78);
|
|
128
128
|
i0.ɵɵtext(4);
|
|
129
129
|
i0.ɵɵelementEnd()();
|
|
130
130
|
} if (rf & 2) {
|
|
@@ -132,11 +132,11 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
132
132
|
i0.ɵɵadvance(4);
|
|
133
133
|
i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.errorMessage);
|
|
134
134
|
} }
|
|
135
|
-
function
|
|
136
|
-
i0.ɵɵelementStart(0, "div",
|
|
135
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
136
|
+
i0.ɵɵelementStart(0, "div", 74)(1, "span", 75);
|
|
137
137
|
i0.ɵɵtext(2, "User Agent");
|
|
138
138
|
i0.ɵɵelementEnd();
|
|
139
|
-
i0.ɵɵelementStart(3, "span",
|
|
139
|
+
i0.ɵɵelementStart(3, "span", 79);
|
|
140
140
|
i0.ɵɵtext(4);
|
|
141
141
|
i0.ɵɵelementEnd()();
|
|
142
142
|
} if (rf & 2) {
|
|
@@ -144,13 +144,13 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
144
144
|
i0.ɵɵadvance(4);
|
|
145
145
|
i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.userAgent);
|
|
146
146
|
} }
|
|
147
|
-
function
|
|
148
|
-
i0.ɵɵelementStart(0, "div",
|
|
149
|
-
i0.ɵɵconditionalCreate(2,
|
|
150
|
-
i0.ɵɵconditionalCreate(3,
|
|
151
|
-
i0.ɵɵconditionalCreate(4,
|
|
152
|
-
i0.ɵɵconditionalCreate(5,
|
|
153
|
-
i0.ɵɵconditionalCreate(6,
|
|
147
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
148
|
+
i0.ɵɵelementStart(0, "div", 69)(1, "div", 72);
|
|
149
|
+
i0.ɵɵconditionalCreate(2, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_2_Template, 5, 1, "div", 73);
|
|
150
|
+
i0.ɵɵconditionalCreate(3, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_3_Template, 5, 1, "div", 73);
|
|
151
|
+
i0.ɵɵconditionalCreate(4, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_4_Template, 5, 1, "div", 73);
|
|
152
|
+
i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_5_Template, 5, 1, "div", 74);
|
|
153
|
+
i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Conditional_6_Template, 5, 1, "div", 74);
|
|
154
154
|
i0.ɵɵelementEnd()();
|
|
155
155
|
} if (rf & 2) {
|
|
156
156
|
const log_r4 = i0.ɵɵnextContext().$implicit;
|
|
@@ -165,35 +165,35 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
165
165
|
i0.ɵɵadvance();
|
|
166
166
|
i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.userAgent) ? 6 : -1);
|
|
167
167
|
} }
|
|
168
|
-
function
|
|
168
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
169
169
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
170
|
-
i0.ɵɵelementStart(0, "div",
|
|
171
|
-
i0.ɵɵelement(2, "div",
|
|
170
|
+
i0.ɵɵelementStart(0, "div", 53)(1, "div", 54);
|
|
171
|
+
i0.ɵɵelement(2, "div", 55);
|
|
172
172
|
i0.ɵɵelementEnd();
|
|
173
|
-
i0.ɵɵelementStart(3, "div",
|
|
174
|
-
i0.ɵɵlistener("click", function
|
|
175
|
-
i0.ɵɵelementStart(4, "div",
|
|
173
|
+
i0.ɵɵelementStart(3, "div", 56);
|
|
174
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Template_div_click_3_listener() { const log_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleLogExpand(log_r4.ID)); });
|
|
175
|
+
i0.ɵɵelementStart(4, "div", 57)(5, "div", 58);
|
|
176
176
|
i0.ɵɵelement(6, "i");
|
|
177
|
-
i0.ɵɵelementStart(7, "span",
|
|
177
|
+
i0.ɵɵelementStart(7, "span", 59);
|
|
178
178
|
i0.ɵɵtext(8);
|
|
179
179
|
i0.ɵɵelementEnd()();
|
|
180
|
-
i0.ɵɵelementStart(9, "div",
|
|
180
|
+
i0.ɵɵelementStart(9, "div", 60);
|
|
181
181
|
i0.ɵɵtext(10);
|
|
182
182
|
i0.ɵɵelementEnd()();
|
|
183
|
-
i0.ɵɵelementStart(11, "div",
|
|
184
|
-
i0.ɵɵelement(13, "i",
|
|
183
|
+
i0.ɵɵelementStart(11, "div", 61)(12, "div", 62);
|
|
184
|
+
i0.ɵɵelement(13, "i", 63);
|
|
185
185
|
i0.ɵɵtext(14);
|
|
186
186
|
i0.ɵɵelementEnd();
|
|
187
|
-
i0.ɵɵconditionalCreate(15,
|
|
188
|
-
i0.ɵɵelementStart(16, "div",
|
|
187
|
+
i0.ɵɵconditionalCreate(15, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_15_Template, 2, 1, "div", 64);
|
|
188
|
+
i0.ɵɵelementStart(16, "div", 65)(17, "span", 66);
|
|
189
189
|
i0.ɵɵelement(18, "i");
|
|
190
190
|
i0.ɵɵtext(19);
|
|
191
191
|
i0.ɵɵelementEnd();
|
|
192
|
-
i0.ɵɵconditionalCreate(20,
|
|
193
|
-
i0.ɵɵconditionalCreate(21,
|
|
192
|
+
i0.ɵɵconditionalCreate(20, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_20_Template, 2, 1, "span", 67);
|
|
193
|
+
i0.ɵɵconditionalCreate(21, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_21_Template, 3, 1, "span", 68);
|
|
194
194
|
i0.ɵɵelementEnd()();
|
|
195
|
-
i0.ɵɵconditionalCreate(22,
|
|
196
|
-
i0.ɵɵelementStart(23, "button",
|
|
195
|
+
i0.ɵɵconditionalCreate(22, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Conditional_22_Template, 7, 5, "div", 69);
|
|
196
|
+
i0.ɵɵelementStart(23, "button", 70);
|
|
197
197
|
i0.ɵɵelement(24, "i");
|
|
198
198
|
i0.ɵɵelementEnd()()();
|
|
199
199
|
} if (rf & 2) {
|
|
@@ -228,15 +228,15 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_F
|
|
|
228
228
|
i0.ɵɵadvance(2);
|
|
229
229
|
i0.ɵɵclassMap(ctx_r1.expandedLogId === log_r4.ID ? "fa-solid fa-chevron-up" : "fa-solid fa-chevron-down");
|
|
230
230
|
} }
|
|
231
|
-
function
|
|
232
|
-
i0.ɵɵelementStart(0, "div",
|
|
231
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
232
|
+
i0.ɵɵelementStart(0, "div", 47)(1, "div", 48)(2, "span", 49);
|
|
233
233
|
i0.ɵɵtext(3);
|
|
234
234
|
i0.ɵɵelementEnd();
|
|
235
|
-
i0.ɵɵelementStart(4, "span",
|
|
235
|
+
i0.ɵɵelementStart(4, "span", 50);
|
|
236
236
|
i0.ɵɵtext(5);
|
|
237
237
|
i0.ɵɵelementEnd()();
|
|
238
|
-
i0.ɵɵelementStart(6, "div",
|
|
239
|
-
i0.ɵɵrepeaterCreate(7,
|
|
238
|
+
i0.ɵɵelementStart(6, "div", 51);
|
|
239
|
+
i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_For_8_Template, 25, 23, "div", 52, i0.ɵɵrepeaterTrackByIdentity);
|
|
240
240
|
i0.ɵɵelementEnd()();
|
|
241
241
|
} if (rf & 2) {
|
|
242
242
|
const group_r5 = ctx.$implicit;
|
|
@@ -247,33 +247,33 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_T
|
|
|
247
247
|
i0.ɵɵadvance(2);
|
|
248
248
|
i0.ɵɵrepeater(group_r5.logs);
|
|
249
249
|
} }
|
|
250
|
-
function
|
|
251
|
-
i0.ɵɵelementStart(0, "div",
|
|
252
|
-
i0.ɵɵrepeaterCreate(1,
|
|
250
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_36_Template(rf, ctx) { if (rf & 1) {
|
|
251
|
+
i0.ɵɵelementStart(0, "div", 31);
|
|
252
|
+
i0.ɵɵrepeaterCreate(1, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_For_2_Template, 9, 2, "div", 47, i0.ɵɵrepeaterTrackByIdentity);
|
|
253
253
|
i0.ɵɵelementEnd();
|
|
254
254
|
} if (rf & 2) {
|
|
255
255
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
256
256
|
i0.ɵɵadvance();
|
|
257
257
|
i0.ɵɵrepeater(ctx_r1.timelineGroups);
|
|
258
258
|
} }
|
|
259
|
-
function
|
|
260
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
259
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_37_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
260
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 82);
|
|
261
261
|
i0.ɵɵtext(2);
|
|
262
262
|
i0.ɵɵelementEnd();
|
|
263
|
-
i0.ɵɵelementStart(3, "td",
|
|
263
|
+
i0.ɵɵelementStart(3, "td", 83);
|
|
264
264
|
i0.ɵɵtext(4);
|
|
265
265
|
i0.ɵɵelementEnd();
|
|
266
|
-
i0.ɵɵelementStart(5, "td",
|
|
266
|
+
i0.ɵɵelementStart(5, "td", 84)(6, "span", 85);
|
|
267
267
|
i0.ɵɵelement(7, "i");
|
|
268
268
|
i0.ɵɵtext(8);
|
|
269
269
|
i0.ɵɵelementEnd()();
|
|
270
|
-
i0.ɵɵelementStart(9, "td",
|
|
270
|
+
i0.ɵɵelementStart(9, "td", 86);
|
|
271
271
|
i0.ɵɵtext(10);
|
|
272
272
|
i0.ɵɵelementEnd();
|
|
273
|
-
i0.ɵɵelementStart(11, "td",
|
|
273
|
+
i0.ɵɵelementStart(11, "td", 87);
|
|
274
274
|
i0.ɵɵtext(12);
|
|
275
275
|
i0.ɵɵelementEnd();
|
|
276
|
-
i0.ɵɵelementStart(13, "td",
|
|
276
|
+
i0.ɵɵelementStart(13, "td", 88)(14, "span", 66);
|
|
277
277
|
i0.ɵɵelement(15, "i");
|
|
278
278
|
i0.ɵɵtext(16);
|
|
279
279
|
i0.ɵɵelementEnd()()();
|
|
@@ -302,8 +302,8 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_37_For_18_
|
|
|
302
302
|
i0.ɵɵadvance();
|
|
303
303
|
i0.ɵɵtextInterpolate1(" ", log_r6.Status, " ");
|
|
304
304
|
} }
|
|
305
|
-
function
|
|
306
|
-
i0.ɵɵelementStart(0, "div",
|
|
305
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
306
|
+
i0.ɵɵelementStart(0, "div", 32)(1, "table", 80)(2, "thead")(3, "tr")(4, "th");
|
|
307
307
|
i0.ɵɵtext(5, "Timestamp");
|
|
308
308
|
i0.ɵɵelementEnd();
|
|
309
309
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -322,36 +322,36 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_37_Templat
|
|
|
322
322
|
i0.ɵɵtext(15, "Status");
|
|
323
323
|
i0.ɵɵelementEnd()()();
|
|
324
324
|
i0.ɵɵelementStart(16, "tbody");
|
|
325
|
-
i0.ɵɵrepeaterCreate(17,
|
|
325
|
+
i0.ɵɵrepeaterCreate(17, CredentialsAuditResourceComponent_Conditional_17_Conditional_37_For_18_Template, 17, 17, "tr", 81, i0.ɵɵrepeaterTrackByIdentity);
|
|
326
326
|
i0.ɵɵelementEnd()()();
|
|
327
327
|
} if (rf & 2) {
|
|
328
328
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
329
329
|
i0.ɵɵadvance(17);
|
|
330
330
|
i0.ɵɵrepeater(ctx_r1.filteredLogs);
|
|
331
331
|
} }
|
|
332
|
-
function
|
|
332
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_38_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
333
333
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
334
334
|
i0.ɵɵelementStart(0, "p");
|
|
335
335
|
i0.ɵɵtext(1, " No events match your current filters. ");
|
|
336
|
-
i0.ɵɵelementStart(2, "button",
|
|
337
|
-
i0.ɵɵlistener("click", function
|
|
336
|
+
i0.ɵɵelementStart(2, "button", 90);
|
|
337
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_17_Conditional_38_Conditional_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); ctx_r1.searchText = ""; ctx_r1.selectedStatus = ""; ctx_r1.selectedOperation = ""; return i0.ɵɵresetView(ctx_r1.applyFilters()); });
|
|
338
338
|
i0.ɵɵtext(3, "Clear filters");
|
|
339
339
|
i0.ɵɵelementEnd()();
|
|
340
340
|
} }
|
|
341
|
-
function
|
|
341
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_38_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
342
342
|
i0.ɵɵelementStart(0, "p");
|
|
343
343
|
i0.ɵɵtext(1, " No credential access events in the selected time range. ");
|
|
344
344
|
i0.ɵɵelementEnd();
|
|
345
345
|
} }
|
|
346
|
-
function
|
|
347
|
-
i0.ɵɵelementStart(0, "div",
|
|
348
|
-
i0.ɵɵelement(2, "i",
|
|
346
|
+
function CredentialsAuditResourceComponent_Conditional_17_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
347
|
+
i0.ɵɵelementStart(0, "div", 33)(1, "div", 89);
|
|
348
|
+
i0.ɵɵelement(2, "i", 17);
|
|
349
349
|
i0.ɵɵelementEnd();
|
|
350
350
|
i0.ɵɵelementStart(3, "h3");
|
|
351
351
|
i0.ɵɵtext(4, "No Audit Logs");
|
|
352
352
|
i0.ɵɵelementEnd();
|
|
353
|
-
i0.ɵɵconditionalCreate(5,
|
|
354
|
-
i0.ɵɵconditionalCreate(6,
|
|
353
|
+
i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_17_Conditional_38_Conditional_5_Template, 4, 0, "p");
|
|
354
|
+
i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_17_Conditional_38_Conditional_6_Template, 2, 0, "p");
|
|
355
355
|
i0.ɵɵelementEnd();
|
|
356
356
|
} if (rf & 2) {
|
|
357
357
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -360,50 +360,50 @@ function CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Templat
|
|
|
360
360
|
i0.ɵɵadvance();
|
|
361
361
|
i0.ɵɵconditional(!ctx_r1.searchText && !ctx_r1.selectedStatus && !ctx_r1.selectedOperation ? 6 : -1);
|
|
362
362
|
} }
|
|
363
|
-
function
|
|
364
|
-
i0.ɵɵelementStart(0, "div",
|
|
365
|
-
i0.ɵɵelement(3, "i",
|
|
363
|
+
function CredentialsAuditResourceComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
364
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "div", 15)(2, "div", 16);
|
|
365
|
+
i0.ɵɵelement(3, "i", 17);
|
|
366
366
|
i0.ɵɵelementEnd();
|
|
367
|
-
i0.ɵɵelementStart(4, "div",
|
|
367
|
+
i0.ɵɵelementStart(4, "div", 18)(5, "div", 19);
|
|
368
368
|
i0.ɵɵtext(6);
|
|
369
369
|
i0.ɵɵelementEnd();
|
|
370
|
-
i0.ɵɵelementStart(7, "div",
|
|
370
|
+
i0.ɵɵelementStart(7, "div", 20);
|
|
371
371
|
i0.ɵɵtext(8, "Total Events");
|
|
372
372
|
i0.ɵɵelementEnd()()();
|
|
373
|
-
i0.ɵɵelementStart(9, "div",
|
|
374
|
-
i0.ɵɵelement(11, "i",
|
|
373
|
+
i0.ɵɵelementStart(9, "div", 15)(10, "div", 21);
|
|
374
|
+
i0.ɵɵelement(11, "i", 22);
|
|
375
375
|
i0.ɵɵelementEnd();
|
|
376
|
-
i0.ɵɵelementStart(12, "div",
|
|
376
|
+
i0.ɵɵelementStart(12, "div", 18)(13, "div", 23);
|
|
377
377
|
i0.ɵɵtext(14);
|
|
378
378
|
i0.ɵɵelementEnd();
|
|
379
|
-
i0.ɵɵelementStart(15, "div",
|
|
379
|
+
i0.ɵɵelementStart(15, "div", 20);
|
|
380
380
|
i0.ɵɵtext(16, "Successful");
|
|
381
381
|
i0.ɵɵelementEnd()();
|
|
382
|
-
i0.ɵɵelementStart(17, "div",
|
|
382
|
+
i0.ɵɵelementStart(17, "div", 24);
|
|
383
383
|
i0.ɵɵtext(18);
|
|
384
384
|
i0.ɵɵelementEnd()();
|
|
385
|
-
i0.ɵɵelementStart(19, "div",
|
|
386
|
-
i0.ɵɵelement(21, "i",
|
|
385
|
+
i0.ɵɵelementStart(19, "div", 15)(20, "div", 25);
|
|
386
|
+
i0.ɵɵelement(21, "i", 26);
|
|
387
387
|
i0.ɵɵelementEnd();
|
|
388
|
-
i0.ɵɵelementStart(22, "div",
|
|
388
|
+
i0.ɵɵelementStart(22, "div", 18)(23, "div", 27);
|
|
389
389
|
i0.ɵɵtext(24);
|
|
390
390
|
i0.ɵɵelementEnd();
|
|
391
|
-
i0.ɵɵelementStart(25, "div",
|
|
391
|
+
i0.ɵɵelementStart(25, "div", 20);
|
|
392
392
|
i0.ɵɵtext(26, "Failed");
|
|
393
393
|
i0.ɵɵelementEnd()()();
|
|
394
|
-
i0.ɵɵelementStart(27, "div",
|
|
395
|
-
i0.ɵɵelement(29, "i",
|
|
394
|
+
i0.ɵɵelementStart(27, "div", 15)(28, "div", 28);
|
|
395
|
+
i0.ɵɵelement(29, "i", 29);
|
|
396
396
|
i0.ɵɵelementEnd();
|
|
397
|
-
i0.ɵɵelementStart(30, "div",
|
|
397
|
+
i0.ɵɵelementStart(30, "div", 18)(31, "div", 19);
|
|
398
398
|
i0.ɵɵtext(32);
|
|
399
399
|
i0.ɵɵelementEnd();
|
|
400
|
-
i0.ɵɵelementStart(33, "div",
|
|
400
|
+
i0.ɵɵelementStart(33, "div", 20);
|
|
401
401
|
i0.ɵɵtext(34, "Unique Users");
|
|
402
402
|
i0.ɵɵelementEnd()()()();
|
|
403
|
-
i0.ɵɵconditionalCreate(35,
|
|
404
|
-
i0.ɵɵconditionalCreate(36,
|
|
405
|
-
i0.ɵɵconditionalCreate(37,
|
|
406
|
-
i0.ɵɵconditionalCreate(38,
|
|
403
|
+
i0.ɵɵconditionalCreate(35, CredentialsAuditResourceComponent_Conditional_17_Conditional_35_Template, 16, 0, "div", 30);
|
|
404
|
+
i0.ɵɵconditionalCreate(36, CredentialsAuditResourceComponent_Conditional_17_Conditional_36_Template, 3, 0, "div", 31);
|
|
405
|
+
i0.ɵɵconditionalCreate(37, CredentialsAuditResourceComponent_Conditional_17_Conditional_37_Template, 19, 0, "div", 32);
|
|
406
|
+
i0.ɵɵconditionalCreate(38, CredentialsAuditResourceComponent_Conditional_17_Conditional_38_Template, 7, 2, "div", 33);
|
|
407
407
|
} if (rf & 2) {
|
|
408
408
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
409
409
|
i0.ɵɵadvance(6);
|
|
@@ -825,50 +825,51 @@ let CredentialsAuditResourceComponent = class CredentialsAuditResourceComponent
|
|
|
825
825
|
link.click();
|
|
826
826
|
}
|
|
827
827
|
static ɵfac = function CredentialsAuditResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CredentialsAuditResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
828
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsAuditResourceComponent, selectors: [["mj-credentials-audit-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
828
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsAuditResourceComponent, selectors: [["mj-credentials-audit-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 18, vars: 12, consts: [["Title", "Audit Trail", "Icon", "fa-solid fa-clipboard-list", "Subtitle", "Credential access and modification history"], ["meta", ""], ["Label", "events", 3, "Count", "Total"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Export to CSV", 3, "click"], [1, "fa-solid", "fa-download"], [1, "action-btn-label"], [3, "Clicked", "Loading"], ["toolbar", ""], ["Placeholder", "Search logs...", 3, "ValueChange", "Value"], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], [3, "KeyChange", "Options", "ActiveKey"], ["text", "Loading audit logs..."], [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"], [1, "activity-chart"], [1, "timeline-container"], [1, "audit-table-container"], [1, "empty-state"], [1, "chart-header"], [1, "fa-solid", "fa-chart-bar"], [1, "chart-container"], [1, "chart-bars"], [1, "chart-bar-wrapper", 3, "title"], [1, "chart-legend"], [1, "legend-item"], [1, "legend-color", "success"], [1, "legend-color", "failed"], [1, "chart-bar"], [1, "bar-segment", "success"], [1, "bar-segment", "failed"], [1, "chart-label"], [1, "timeline-group"], [1, "timeline-date"], [1, "date-label"], [1, "date-count"], [1, "timeline-items"], [1, "timeline-item", 3, "expanded", "failed"], [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"], [1, "timeline-description"], [1, "timeline-badges"], [1, "status-badge", 3, "ngClass"], [1, "subsystem-badge"], [1, "type-badge"], [1, "timeline-details"], [1, "expand-btn"], [1, "fa-solid", "fa-key"], [1, "detail-grid"], [1, "detail-item"], [1, "detail-item", "full-width"], [1, "detail-label"], [1, "detail-value"], [1, "detail-value", "mono"], [1, "detail-value", "error"], [1, "detail-value", "mono", "small"], [1, "audit-table"], [3, "failed-row"], [1, "timestamp"], [1, "user"], [1, "operation"], [1, "operation-badge"], [1, "description"], [1, "subsystem"], [1, "status"], [1, "empty-icon"], [1, "btn-link", 3, "click"]], template: function CredentialsAuditResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
829
829
|
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
|
|
830
830
|
i0.ɵɵelement(3, "mj-stat-badge", 2);
|
|
831
831
|
i0.ɵɵelementEnd();
|
|
832
|
-
i0.ɵɵelementStart(4, "div", 3)(5, "
|
|
833
|
-
i0.ɵɵlistener("
|
|
834
|
-
i0.ɵɵ
|
|
835
|
-
i0.ɵɵ
|
|
832
|
+
i0.ɵɵelementStart(4, "div", 3)(5, "button", 4);
|
|
833
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Template_button_click_5_listener() { return ctx.exportToCSV(); });
|
|
834
|
+
i0.ɵɵelement(6, "i", 5);
|
|
835
|
+
i0.ɵɵelementStart(7, "span", 6);
|
|
836
|
+
i0.ɵɵtext(8, "Export");
|
|
836
837
|
i0.ɵɵelementEnd()();
|
|
837
|
-
i0.ɵɵelementStart(
|
|
838
|
-
i0.ɵɵlistener("
|
|
839
|
-
i0.ɵɵelementEnd();
|
|
840
|
-
i0.ɵɵelementStart(8, "
|
|
841
|
-
i0.ɵɵlistener("
|
|
842
|
-
i0.ɵɵelement(9, "i", 8);
|
|
843
|
-
i0.ɵɵtext(10, " Export ");
|
|
838
|
+
i0.ɵɵelementStart(9, "mj-refresh-button", 7);
|
|
839
|
+
i0.ɵɵlistener("Clicked", function CredentialsAuditResourceComponent_Template_mj_refresh_button_Clicked_9_listener() { return ctx.refresh(); });
|
|
840
|
+
i0.ɵɵelementEnd()();
|
|
841
|
+
i0.ɵɵelementStart(10, "div", 8)(11, "mj-page-search", 9);
|
|
842
|
+
i0.ɵɵlistener("ValueChange", function CredentialsAuditResourceComponent_Template_mj_page_search_ValueChange_11_listener($event) { return ctx.onSearchChange($event); });
|
|
844
843
|
i0.ɵɵelementEnd();
|
|
845
|
-
i0.ɵɵelementStart(
|
|
846
|
-
i0.ɵɵlistener("
|
|
844
|
+
i0.ɵɵelementStart(12, "mj-filter-popover", 10);
|
|
845
|
+
i0.ɵɵlistener("ClearAllRequested", function CredentialsAuditResourceComponent_Template_mj_filter_popover_ClearAllRequested_12_listener() { return ctx.resetFilters(); });
|
|
846
|
+
i0.ɵɵelementStart(13, "mj-filter-panel", 11);
|
|
847
|
+
i0.ɵɵlistener("ValuesChange", function CredentialsAuditResourceComponent_Template_mj_filter_panel_ValuesChange_13_listener($event) { return ctx.onFilterValuesChange($event); })("Reset", function CredentialsAuditResourceComponent_Template_mj_filter_panel_Reset_13_listener() { return ctx.resetFilters(); });
|
|
847
848
|
i0.ɵɵelementEnd()();
|
|
848
|
-
i0.ɵɵelementStart(
|
|
849
|
-
i0.ɵɵlistener("
|
|
849
|
+
i0.ɵɵelementStart(14, "mj-view-toggle", 12);
|
|
850
|
+
i0.ɵɵlistener("KeyChange", function CredentialsAuditResourceComponent_Template_mj_view_toggle_KeyChange_14_listener($event) { return ctx.setViewMode($event); });
|
|
850
851
|
i0.ɵɵelementEnd()()();
|
|
851
|
-
i0.ɵɵelementStart(
|
|
852
|
-
i0.ɵɵconditionalCreate(
|
|
853
|
-
i0.ɵɵconditionalCreate(
|
|
852
|
+
i0.ɵɵelementStart(15, "mj-page-body");
|
|
853
|
+
i0.ɵɵconditionalCreate(16, CredentialsAuditResourceComponent_Conditional_16_Template, 1, 0, "mj-loading", 13);
|
|
854
|
+
i0.ɵɵconditionalCreate(17, CredentialsAuditResourceComponent_Conditional_17_Template, 39, 9);
|
|
854
855
|
i0.ɵɵelementEnd()();
|
|
855
856
|
} if (rf & 2) {
|
|
856
857
|
i0.ɵɵadvance(3);
|
|
857
858
|
i0.ɵɵproperty("Count", ctx.filteredLogs.length)("Total", ctx.auditLogs.length);
|
|
859
|
+
i0.ɵɵadvance(6);
|
|
860
|
+
i0.ɵɵproperty("Loading", ctx.isLoading);
|
|
858
861
|
i0.ɵɵadvance(2);
|
|
862
|
+
i0.ɵɵproperty("Value", ctx.searchText);
|
|
863
|
+
i0.ɵɵadvance();
|
|
859
864
|
i0.ɵɵproperty("ActiveCount", ctx.ActiveFilterCount)("ShowClearAll", ctx.ActiveFilterCount > 0);
|
|
860
865
|
i0.ɵɵadvance();
|
|
861
866
|
i0.ɵɵproperty("Fields", ctx.FilterFields)("Values", ctx.FilterValues);
|
|
862
867
|
i0.ɵɵadvance();
|
|
863
868
|
i0.ɵɵproperty("Options", ctx.viewOptions)("ActiveKey", ctx.viewMode);
|
|
864
|
-
i0.ɵɵadvance(4);
|
|
865
|
-
i0.ɵɵproperty("Loading", ctx.isLoading);
|
|
866
|
-
i0.ɵɵadvance(2);
|
|
867
|
-
i0.ɵɵproperty("Value", ctx.searchText);
|
|
868
869
|
i0.ɵɵadvance(2);
|
|
869
|
-
i0.ɵɵconditional(ctx.isLoading ?
|
|
870
|
+
i0.ɵɵconditional(ctx.isLoading ? 16 : -1);
|
|
870
871
|
i0.ɵɵadvance();
|
|
871
|
-
i0.ɵɵconditional(!ctx.isLoading ?
|
|
872
|
+
i0.ɵɵconditional(!ctx.isLoading ? 17 : -1);
|
|
872
873
|
} }, dependencies: [i1.NgClass, i2.MJButtonDirective, i2.MJPageHeaderComponent, i2.MJPageLayoutComponent, i2.MJPageBodyComponent, i2.MJPageSearchComponent, i2.MJFilterPopoverComponent, i2.MJFilterPanelComponent, i2.MJViewToggleComponent, i2.MJStatBadgeComponent, i2.MJRefreshButtonComponent, i3.LoadingComponent], styles: ["\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(--mj-bg-surface);\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: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon.success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n color: var(--mj-status-success);\n}\n\n.stat-icon.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n color: var(--mj-status-error);\n}\n\n.stat-icon.users[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\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(--mj-text-primary);\n line-height: 1;\n}\n\n.stat-value.success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.stat-value.failed[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\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: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n\n\n.activity-chart[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\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(--mj-text-primary);\n margin: 0;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\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(--mj-bg-surface-sunken);\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: var(--mj-status-success);\n}\n\n.bar-segment.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n}\n\n.chart-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\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(--mj-bg-surface-sunken);\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\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: var(--mj-status-success);\n}\n\n.legend-color.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\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(--mj-bg-surface);\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(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.date-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.date-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\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(--mj-bg-surface-card);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\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(--mj-text-primary);\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n font-family: monospace;\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-text-primary);\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: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.unknown[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.type-badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\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(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\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(--mj-text-secondary);\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\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: var(--mj-status-error);\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(--mj-text-disabled);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\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(--mj-bg-surface);\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(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.audit-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\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(--mj-bg-surface-card);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timestamp[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-bg-surface);\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(--mj-bg-surface-sunken);\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(--mj-border-strong);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\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(--mj-brand-primary-hover);\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 });
|
|
873
874
|
};
|
|
874
875
|
CredentialsAuditResourceComponent = __decorate([
|
|
@@ -877,7 +878,7 @@ CredentialsAuditResourceComponent = __decorate([
|
|
|
877
878
|
export { CredentialsAuditResourceComponent };
|
|
878
879
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CredentialsAuditResourceComponent, [{
|
|
879
880
|
type: Component,
|
|
880
|
-
args: [{ standalone: false, selector: 'mj-credentials-audit-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Audit Trail\"\n Icon=\"fa-solid fa-clipboard-list\"\n Subtitle=\"Credential access and modification history\">\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredLogs.length\"\n [Total]=\"auditLogs.length\"\n Label=\"events\">\n </mj-stat-badge>\n </div>\n <div actions>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetFilters()\">\n <mj-filter-panel\n [Fields]=\"FilterFields\"\n [Values]=\"FilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-view-toggle\n [Options]=\"viewOptions\"\n [ActiveKey]=\"viewMode\"\n (KeyChange)=\"setViewMode($any($event))\">\n </mj-view-toggle>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i> Export\n </button>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search logs...\"\n [Value]=\"searchText\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (isLoading) {\n <mj-loading text=\"Loading audit logs...\"></mj-loading>\n }\n\n @if (!isLoading) {\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 <!-- Activity Chart -->\n @if (hourlyData.length > 0) {\n <div class=\"activity-chart\">\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 @for (data of hourlyData; track data) {\n <div\n class=\"chart-bar-wrapper\"\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 }\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 <!-- Timeline View -->\n @if (viewMode === 'timeline' && timelineGroups.length > 0) {\n <div class=\"timeline-container\">\n @for (group of timelineGroups; track group) {\n <div class=\"timeline-group\">\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 @for (log of group.logs; track log) {\n <div\n class=\"timeline-item\"\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 @if (log.Description) {\n <div class=\"timeline-description\">\n {{log.Description}}\n </div>\n }\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 @if (getSubsystem(log)) {\n <span class=\"subsystem-badge\">\n {{getSubsystem(log)}}\n </span>\n }\n @if (log.parsedDetails?.credentialType) {\n <span class=\"type-badge\">\n <i class=\"fa-solid fa-key\"></i>\n {{log.parsedDetails?.credentialType}}\n </span>\n }\n </div>\n </div>\n @if (expandedLogId === log.ID) {\n <div class=\"timeline-details\">\n <div class=\"detail-grid\">\n @if (log.parsedDetails?.ipAddress) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">IP Address</span>\n <span class=\"detail-value\">{{log.parsedDetails?.ipAddress}}</span>\n </div>\n }\n @if (log.parsedDetails?.duration) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{formatDuration(log.parsedDetails?.duration)}}</span>\n </div>\n }\n @if (log.parsedDetails?.credentialId) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Credential ID</span>\n <span class=\"detail-value mono\">{{log.parsedDetails?.credentialId}}</span>\n </div>\n }\n @if (log.parsedDetails?.errorMessage) {\n <div class=\"detail-item full-width\">\n <span class=\"detail-label\">Error Message</span>\n <span class=\"detail-value error\">{{log.parsedDetails?.errorMessage}}</span>\n </div>\n }\n @if (log.parsedDetails?.userAgent) {\n <div class=\"detail-item full-width\">\n <span class=\"detail-label\">User Agent</span>\n <span class=\"detail-value mono small\">{{log.parsedDetails?.userAgent}}</span>\n </div>\n }\n </div>\n </div>\n }\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 }\n </div>\n </div>\n }\n </div>\n }\n <!-- Table View -->\n @if (viewMode === 'table' && filteredLogs.length > 0) {\n <div class=\"audit-table-container\">\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 @for (log of filteredLogs; track log) {\n <tr [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 }\n </tbody>\n </table>\n </div>\n }\n <!-- Empty State -->\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <h3>No Audit Logs</h3>\n @if (searchText || selectedStatus || selectedOperation) {\n <p>\n No events match your current filters.\n <button class=\"btn-link\" (click)=\"searchText = ''; selectedStatus = ''; selectedOperation = ''; applyFilters()\">Clear filters</button>\n </p>\n }\n @if (!searchText && !selectedStatus && !selectedOperation) {\n <p>\n No credential access events in the selected time range.\n </p>\n }\n </div>\n }\n }\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* 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(--mj-bg-surface);\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: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon.success {\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n color: var(--mj-status-success);\n}\n\n.stat-icon.failed {\n background: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n color: var(--mj-status-error);\n}\n\n.stat-icon.users {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\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(--mj-text-primary);\n line-height: 1;\n}\n\n.stat-value.success {\n color: var(--mj-status-success);\n}\n\n.stat-value.failed {\n color: var(--mj-status-error);\n}\n\n.stat-label {\n font-size: 13px;\n color: var(--mj-text-secondary);\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: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n/* Activity Chart */\n.activity-chart {\n background: var(--mj-bg-surface);\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(--mj-text-primary);\n margin: 0;\n}\n\n.chart-header h3 i {\n color: var(--mj-brand-primary);\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(--mj-bg-surface-sunken);\n}\n\n.bar-segment {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success {\n background: var(--mj-status-success);\n}\n\n.bar-segment.failed {\n background: var(--mj-status-error);\n}\n\n.chart-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\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(--mj-bg-surface-sunken);\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.legend-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success {\n background: var(--mj-status-success);\n}\n\n.legend-color.failed {\n background: var(--mj-status-error);\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(--mj-bg-surface);\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(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.date-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.date-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\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(--mj-bg-surface-card);\n}\n\n.timeline-item.failed {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.timeline-item.failed:hover {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\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(--mj-text-primary);\n}\n\n.timeline-time {\n font-size: 12px;\n font-family: monospace;\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-text-primary);\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: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.failed {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.unknown {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.type-badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\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(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\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(--mj-text-secondary);\n}\n\n.detail-value {\n font-size: 13px;\n color: var(--mj-text-primary);\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: var(--mj-status-error);\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(--mj-text-disabled);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn:hover {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn i {\n font-size: 10px;\n}\n\n/* Table View */\n.audit-table-container {\n background: var(--mj-bg-surface);\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(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.audit-table td {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.audit-table tr:last-child td {\n border-bottom: none;\n}\n\n.audit-table tr:hover td {\n background: var(--mj-bg-surface-card);\n}\n\n.audit-table tr.failed-row td {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.audit-table tr.failed-row:hover td {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timestamp {\n font-family: monospace;\n font-size: 12px;\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-bg-surface);\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(--mj-bg-surface-sunken);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon i {\n font-size: 32px;\n color: var(--mj-border-strong);\n}\n\n.empty-state h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n}\n\n.empty-state p {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link:hover {\n color: var(--mj-brand-primary-hover);\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"] }]
|
|
881
|
+
args: [{ standalone: false, selector: 'mj-credentials-audit-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<mj-page-layout>\n <mj-page-header\n Title=\"Audit Trail\"\n Icon=\"fa-solid fa-clipboard-list\"\n Subtitle=\"Credential access and modification history\">\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredLogs.length\"\n [Total]=\"auditLogs.length\"\n Label=\"events\">\n </mj-stat-badge>\n </div>\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i> <span class=\"action-btn-label\">Export</span>\n </button>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search logs...\"\n [Value]=\"searchText\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetFilters()\">\n <mj-filter-panel\n [Fields]=\"FilterFields\"\n [Values]=\"FilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n <mj-view-toggle\n [Options]=\"viewOptions\"\n [ActiveKey]=\"viewMode\"\n (KeyChange)=\"setViewMode($any($event))\">\n </mj-view-toggle>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (isLoading) {\n <mj-loading text=\"Loading audit logs...\"></mj-loading>\n }\n\n @if (!isLoading) {\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 <!-- Activity Chart -->\n @if (hourlyData.length > 0) {\n <div class=\"activity-chart\">\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 @for (data of hourlyData; track data) {\n <div\n class=\"chart-bar-wrapper\"\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 }\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 <!-- Timeline View -->\n @if (viewMode === 'timeline' && timelineGroups.length > 0) {\n <div class=\"timeline-container\">\n @for (group of timelineGroups; track group) {\n <div class=\"timeline-group\">\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 @for (log of group.logs; track log) {\n <div\n class=\"timeline-item\"\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 @if (log.Description) {\n <div class=\"timeline-description\">\n {{log.Description}}\n </div>\n }\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 @if (getSubsystem(log)) {\n <span class=\"subsystem-badge\">\n {{getSubsystem(log)}}\n </span>\n }\n @if (log.parsedDetails?.credentialType) {\n <span class=\"type-badge\">\n <i class=\"fa-solid fa-key\"></i>\n {{log.parsedDetails?.credentialType}}\n </span>\n }\n </div>\n </div>\n @if (expandedLogId === log.ID) {\n <div class=\"timeline-details\">\n <div class=\"detail-grid\">\n @if (log.parsedDetails?.ipAddress) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">IP Address</span>\n <span class=\"detail-value\">{{log.parsedDetails?.ipAddress}}</span>\n </div>\n }\n @if (log.parsedDetails?.duration) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{formatDuration(log.parsedDetails?.duration)}}</span>\n </div>\n }\n @if (log.parsedDetails?.credentialId) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Credential ID</span>\n <span class=\"detail-value mono\">{{log.parsedDetails?.credentialId}}</span>\n </div>\n }\n @if (log.parsedDetails?.errorMessage) {\n <div class=\"detail-item full-width\">\n <span class=\"detail-label\">Error Message</span>\n <span class=\"detail-value error\">{{log.parsedDetails?.errorMessage}}</span>\n </div>\n }\n @if (log.parsedDetails?.userAgent) {\n <div class=\"detail-item full-width\">\n <span class=\"detail-label\">User Agent</span>\n <span class=\"detail-value mono small\">{{log.parsedDetails?.userAgent}}</span>\n </div>\n }\n </div>\n </div>\n }\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 }\n </div>\n </div>\n }\n </div>\n }\n <!-- Table View -->\n @if (viewMode === 'table' && filteredLogs.length > 0) {\n <div class=\"audit-table-container\">\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 @for (log of filteredLogs; track log) {\n <tr [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 }\n </tbody>\n </table>\n </div>\n }\n <!-- Empty State -->\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <h3>No Audit Logs</h3>\n @if (searchText || selectedStatus || selectedOperation) {\n <p>\n No events match your current filters.\n <button class=\"btn-link\" (click)=\"searchText = ''; selectedStatus = ''; selectedOperation = ''; applyFilters()\">Clear filters</button>\n </p>\n }\n @if (!searchText && !selectedStatus && !selectedOperation) {\n <p>\n No credential access events in the selected time range.\n </p>\n }\n </div>\n }\n }\n </mj-page-body>\n</mj-page-layout>\n", styles: ["/* 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(--mj-bg-surface);\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: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.stat-icon.success {\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n color: var(--mj-status-success);\n}\n\n.stat-icon.failed {\n background: color-mix(in srgb, var(--mj-status-error) 10%, transparent);\n color: var(--mj-status-error);\n}\n\n.stat-icon.users {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\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(--mj-text-primary);\n line-height: 1;\n}\n\n.stat-value.success {\n color: var(--mj-status-success);\n}\n\n.stat-value.failed {\n color: var(--mj-status-error);\n}\n\n.stat-label {\n font-size: 13px;\n color: var(--mj-text-secondary);\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: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 10%, transparent);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n/* Activity Chart */\n.activity-chart {\n background: var(--mj-bg-surface);\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(--mj-text-primary);\n margin: 0;\n}\n\n.chart-header h3 i {\n color: var(--mj-brand-primary);\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(--mj-bg-surface-sunken);\n}\n\n.bar-segment {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success {\n background: var(--mj-status-success);\n}\n\n.bar-segment.failed {\n background: var(--mj-status-error);\n}\n\n.chart-label {\n font-size: 10px;\n color: var(--mj-text-disabled);\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(--mj-bg-surface-sunken);\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.legend-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success {\n background: var(--mj-status-success);\n}\n\n.legend-color.failed {\n background: var(--mj-status-error);\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(--mj-bg-surface);\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(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.date-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.date-count {\n font-size: 12px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\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(--mj-bg-surface-card);\n}\n\n.timeline-item.failed {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.timeline-item.failed:hover {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\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(--mj-text-primary);\n}\n\n.timeline-time {\n font-size: 12px;\n font-family: monospace;\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-text-primary);\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: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-badge.failed {\n background: color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-badge.unknown {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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(--mj-bg-surface-sunken);\n border-radius: 12px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n.type-badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\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(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\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(--mj-text-secondary);\n}\n\n.detail-value {\n font-size: 13px;\n color: var(--mj-text-primary);\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: var(--mj-status-error);\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(--mj-text-disabled);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn:hover {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn i {\n font-size: 10px;\n}\n\n/* Table View */\n.audit-table-container {\n background: var(--mj-bg-surface);\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(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.audit-table td {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.audit-table tr:last-child td {\n border-bottom: none;\n}\n\n.audit-table tr:hover td {\n background: var(--mj-bg-surface-card);\n}\n\n.audit-table tr.failed-row td {\n background: color-mix(in srgb, var(--mj-status-error) 2%, transparent);\n}\n\n.audit-table tr.failed-row:hover td {\n background: color-mix(in srgb, var(--mj-status-error) 5%, transparent);\n}\n\n.timestamp {\n font-family: monospace;\n font-size: 12px;\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-bg-surface);\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(--mj-bg-surface-sunken);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon i {\n font-size: 32px;\n color: var(--mj-border-strong);\n}\n\n.empty-state h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 8px 0;\n}\n\n.empty-state p {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link:hover {\n color: var(--mj-brand-primary-hover);\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"] }]
|
|
881
882
|
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
882
883
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsAuditResourceComponent, { className: "CredentialsAuditResourceComponent", filePath: "src/Credentials/components/credentials-audit-resource.component.ts", lineNumber: 39 }); })();
|
|
883
884
|
//# sourceMappingURL=credentials-audit-resource.component.js.map
|