@memberjunction/ng-dashboards 5.34.1 → 5.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- 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 +104 -103
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
- package/dist/AI/components/analytics/error-analysis/error-analysis.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 +67 -87
- 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 +12 -19
- 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 +96 -203
- 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.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- 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.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +781 -783
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +79 -30
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +196 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +32 -40
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +32 -40
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +32 -40
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +127 -106
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +44 -45
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +309 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +866 -847
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +241 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +486 -532
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +234 -246
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +773 -783
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +587 -608
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +107 -93
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +36 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +2 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +24 -3
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +31 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +1 -1
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +28 -1
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +30 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +52 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -10,43 +10,43 @@ import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
|
10
10
|
import { RunView } from '@memberjunction/core';
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
import * as i1 from "@angular/common";
|
|
13
|
-
import * as i2 from "@
|
|
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_15_Template(rf, ctx) { if (rf & 1) {
|
|
16
|
+
i0.ɵɵelement(0, "mj-loading", 12);
|
|
17
17
|
} }
|
|
18
|
-
function
|
|
19
|
-
i0.ɵɵelementStart(0, "div",
|
|
20
|
-
i0.ɵɵelement(2, "div",
|
|
18
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_35_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementStart(0, "div", 37)(1, "div", 42);
|
|
20
|
+
i0.ɵɵelement(2, "div", 43)(3, "div", 44);
|
|
21
21
|
i0.ɵɵelementEnd();
|
|
22
|
-
i0.ɵɵelementStart(4, "span",
|
|
22
|
+
i0.ɵɵelementStart(4, "span", 45);
|
|
23
23
|
i0.ɵɵtext(5);
|
|
24
24
|
i0.ɵɵelementEnd()();
|
|
25
25
|
} if (rf & 2) {
|
|
26
|
-
const
|
|
26
|
+
const data_r1 = ctx.$implicit;
|
|
27
27
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
28
|
-
i0.ɵɵproperty("title",
|
|
28
|
+
i0.ɵɵproperty("title", data_r1.hour + ": " + (data_r1.success + data_r1.failed) + " events");
|
|
29
29
|
i0.ɵɵadvance(2);
|
|
30
|
-
i0.ɵɵstyleProp("height",
|
|
30
|
+
i0.ɵɵstyleProp("height", data_r1.success / ctx_r1.getMaxHourlyCount() * 100, "%");
|
|
31
31
|
i0.ɵɵadvance();
|
|
32
|
-
i0.ɵɵstyleProp("height",
|
|
32
|
+
i0.ɵɵstyleProp("height", data_r1.failed / ctx_r1.getMaxHourlyCount() * 100, "%");
|
|
33
33
|
i0.ɵɵadvance(2);
|
|
34
|
-
i0.ɵɵtextInterpolate(
|
|
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_16_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
i0.ɵɵelementStart(0, "div", 29)(1, "div", 33)(2, "h3");
|
|
38
|
+
i0.ɵɵelement(3, "i", 34);
|
|
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", 35)(6, "div", 36);
|
|
42
|
+
i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_16_Conditional_35_For_8_Template, 6, 6, "div", 37, i0.ɵɵrepeaterTrackByIdentity);
|
|
43
43
|
i0.ɵɵelementEnd()();
|
|
44
|
-
i0.ɵɵelementStart(9, "div",
|
|
45
|
-
i0.ɵɵelement(11, "span",
|
|
44
|
+
i0.ɵɵelementStart(9, "div", 38)(10, "span", 39);
|
|
45
|
+
i0.ɵɵelement(11, "span", 40);
|
|
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", 39);
|
|
49
|
+
i0.ɵɵelement(14, "span", 41);
|
|
50
50
|
i0.ɵɵtext(15, " Failed ");
|
|
51
51
|
i0.ɵɵelementEnd()()();
|
|
52
52
|
} if (rf & 2) {
|
|
@@ -54,273 +54,256 @@ function CredentialsAuditResourceComponent_Conditional_2_Conditional_48_Template
|
|
|
54
54
|
i0.ɵɵadvance(7);
|
|
55
55
|
i0.ɵɵrepeater(ctx_r1.hourlyData);
|
|
56
56
|
} }
|
|
57
|
-
function
|
|
58
|
-
|
|
59
|
-
i0.ɵɵelementStart(0, "button", 66);
|
|
60
|
-
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Conditional_54_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
|
|
61
|
-
i0.ɵɵelement(1, "i", 67);
|
|
62
|
-
i0.ɵɵelementEnd();
|
|
63
|
-
} }
|
|
64
|
-
function CredentialsAuditResourceComponent_Conditional_2_For_66_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
-
i0.ɵɵelementStart(0, "option", 38);
|
|
66
|
-
i0.ɵɵtext(1);
|
|
67
|
-
i0.ɵɵelementEnd();
|
|
68
|
-
} if (rf & 2) {
|
|
69
|
-
const op_r5 = ctx.$implicit;
|
|
70
|
-
i0.ɵɵproperty("value", op_r5);
|
|
71
|
-
i0.ɵɵadvance();
|
|
72
|
-
i0.ɵɵtextInterpolate(op_r5);
|
|
73
|
-
} }
|
|
74
|
-
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
75
|
-
i0.ɵɵelementStart(0, "div", 85);
|
|
57
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
58
|
+
i0.ɵɵelementStart(0, "div", 63);
|
|
76
59
|
i0.ɵɵtext(1);
|
|
77
60
|
i0.ɵɵelementEnd();
|
|
78
61
|
} if (rf & 2) {
|
|
79
|
-
const
|
|
62
|
+
const log_r4 = i0.ɵɵnextContext().$implicit;
|
|
80
63
|
i0.ɵɵadvance();
|
|
81
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
64
|
+
i0.ɵɵtextInterpolate1(" ", log_r4.Description, " ");
|
|
82
65
|
} }
|
|
83
|
-
function
|
|
84
|
-
i0.ɵɵelementStart(0, "span",
|
|
66
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
+
i0.ɵɵelementStart(0, "span", 66);
|
|
85
68
|
i0.ɵɵtext(1);
|
|
86
69
|
i0.ɵɵelementEnd();
|
|
87
70
|
} if (rf & 2) {
|
|
88
|
-
const
|
|
71
|
+
const log_r4 = i0.ɵɵnextContext().$implicit;
|
|
89
72
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
90
73
|
i0.ɵɵadvance();
|
|
91
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.getSubsystem(
|
|
74
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.getSubsystem(log_r4), " ");
|
|
92
75
|
} }
|
|
93
|
-
function
|
|
94
|
-
i0.ɵɵelementStart(0, "span",
|
|
95
|
-
i0.ɵɵelement(1, "i",
|
|
76
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
77
|
+
i0.ɵɵelementStart(0, "span", 67);
|
|
78
|
+
i0.ɵɵelement(1, "i", 70);
|
|
96
79
|
i0.ɵɵtext(2);
|
|
97
80
|
i0.ɵɵelementEnd();
|
|
98
81
|
} if (rf & 2) {
|
|
99
|
-
const
|
|
82
|
+
const log_r4 = i0.ɵɵnextContext().$implicit;
|
|
100
83
|
i0.ɵɵadvance(2);
|
|
101
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
84
|
+
i0.ɵɵtextInterpolate1(" ", log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialType, " ");
|
|
102
85
|
} }
|
|
103
|
-
function
|
|
104
|
-
i0.ɵɵelementStart(0, "div",
|
|
86
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
87
|
+
i0.ɵɵelementStart(0, "div", 72)(1, "span", 74);
|
|
105
88
|
i0.ɵɵtext(2, "IP Address");
|
|
106
89
|
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵelementStart(3, "span",
|
|
90
|
+
i0.ɵɵelementStart(3, "span", 75);
|
|
108
91
|
i0.ɵɵtext(4);
|
|
109
92
|
i0.ɵɵelementEnd()();
|
|
110
93
|
} if (rf & 2) {
|
|
111
|
-
const
|
|
94
|
+
const log_r4 = i0.ɵɵnextContext(2).$implicit;
|
|
112
95
|
i0.ɵɵadvance(4);
|
|
113
|
-
i0.ɵɵtextInterpolate(
|
|
96
|
+
i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.ipAddress);
|
|
114
97
|
} }
|
|
115
|
-
function
|
|
116
|
-
i0.ɵɵelementStart(0, "div",
|
|
98
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
+
i0.ɵɵelementStart(0, "div", 72)(1, "span", 74);
|
|
117
100
|
i0.ɵɵtext(2, "Duration");
|
|
118
101
|
i0.ɵɵelementEnd();
|
|
119
|
-
i0.ɵɵelementStart(3, "span",
|
|
102
|
+
i0.ɵɵelementStart(3, "span", 75);
|
|
120
103
|
i0.ɵɵtext(4);
|
|
121
104
|
i0.ɵɵelementEnd()();
|
|
122
105
|
} if (rf & 2) {
|
|
123
|
-
const
|
|
106
|
+
const log_r4 = i0.ɵɵnextContext(2).$implicit;
|
|
124
107
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
125
108
|
i0.ɵɵadvance(4);
|
|
126
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(
|
|
109
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.duration));
|
|
127
110
|
} }
|
|
128
|
-
function
|
|
129
|
-
i0.ɵɵelementStart(0, "div",
|
|
111
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
112
|
+
i0.ɵɵelementStart(0, "div", 72)(1, "span", 74);
|
|
130
113
|
i0.ɵɵtext(2, "Credential ID");
|
|
131
114
|
i0.ɵɵelementEnd();
|
|
132
|
-
i0.ɵɵelementStart(3, "span",
|
|
115
|
+
i0.ɵɵelementStart(3, "span", 76);
|
|
133
116
|
i0.ɵɵtext(4);
|
|
134
117
|
i0.ɵɵelementEnd()();
|
|
135
118
|
} if (rf & 2) {
|
|
136
|
-
const
|
|
119
|
+
const log_r4 = i0.ɵɵnextContext(2).$implicit;
|
|
137
120
|
i0.ɵɵadvance(4);
|
|
138
|
-
i0.ɵɵtextInterpolate(
|
|
121
|
+
i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialId);
|
|
139
122
|
} }
|
|
140
|
-
function
|
|
141
|
-
i0.ɵɵelementStart(0, "div",
|
|
123
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
124
|
+
i0.ɵɵelementStart(0, "div", 73)(1, "span", 74);
|
|
142
125
|
i0.ɵɵtext(2, "Error Message");
|
|
143
126
|
i0.ɵɵelementEnd();
|
|
144
|
-
i0.ɵɵelementStart(3, "span",
|
|
127
|
+
i0.ɵɵelementStart(3, "span", 77);
|
|
145
128
|
i0.ɵɵtext(4);
|
|
146
129
|
i0.ɵɵelementEnd()();
|
|
147
130
|
} if (rf & 2) {
|
|
148
|
-
const
|
|
131
|
+
const log_r4 = i0.ɵɵnextContext(2).$implicit;
|
|
149
132
|
i0.ɵɵadvance(4);
|
|
150
|
-
i0.ɵɵtextInterpolate(
|
|
133
|
+
i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.errorMessage);
|
|
151
134
|
} }
|
|
152
|
-
function
|
|
153
|
-
i0.ɵɵelementStart(0, "div",
|
|
135
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
136
|
+
i0.ɵɵelementStart(0, "div", 73)(1, "span", 74);
|
|
154
137
|
i0.ɵɵtext(2, "User Agent");
|
|
155
138
|
i0.ɵɵelementEnd();
|
|
156
|
-
i0.ɵɵelementStart(3, "span",
|
|
139
|
+
i0.ɵɵelementStart(3, "span", 78);
|
|
157
140
|
i0.ɵɵtext(4);
|
|
158
141
|
i0.ɵɵelementEnd()();
|
|
159
142
|
} if (rf & 2) {
|
|
160
|
-
const
|
|
143
|
+
const log_r4 = i0.ɵɵnextContext(2).$implicit;
|
|
161
144
|
i0.ɵɵadvance(4);
|
|
162
|
-
i0.ɵɵtextInterpolate(
|
|
145
|
+
i0.ɵɵtextInterpolate(log_r4.parsedDetails == null ? null : log_r4.parsedDetails.userAgent);
|
|
163
146
|
} }
|
|
164
|
-
function
|
|
165
|
-
i0.ɵɵelementStart(0, "div",
|
|
166
|
-
i0.ɵɵconditionalCreate(2,
|
|
167
|
-
i0.ɵɵconditionalCreate(3,
|
|
168
|
-
i0.ɵɵconditionalCreate(4,
|
|
169
|
-
i0.ɵɵconditionalCreate(5,
|
|
170
|
-
i0.ɵɵconditionalCreate(6,
|
|
147
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
148
|
+
i0.ɵɵelementStart(0, "div", 68)(1, "div", 71);
|
|
149
|
+
i0.ɵɵconditionalCreate(2, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_2_Template, 5, 1, "div", 72);
|
|
150
|
+
i0.ɵɵconditionalCreate(3, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_3_Template, 5, 1, "div", 72);
|
|
151
|
+
i0.ɵɵconditionalCreate(4, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_4_Template, 5, 1, "div", 72);
|
|
152
|
+
i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_5_Template, 5, 1, "div", 73);
|
|
153
|
+
i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Conditional_6_Template, 5, 1, "div", 73);
|
|
171
154
|
i0.ɵɵelementEnd()();
|
|
172
155
|
} if (rf & 2) {
|
|
173
|
-
const
|
|
156
|
+
const log_r4 = i0.ɵɵnextContext().$implicit;
|
|
174
157
|
i0.ɵɵadvance(2);
|
|
175
|
-
i0.ɵɵconditional((
|
|
158
|
+
i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.ipAddress) ? 2 : -1);
|
|
176
159
|
i0.ɵɵadvance();
|
|
177
|
-
i0.ɵɵconditional((
|
|
160
|
+
i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.duration) ? 3 : -1);
|
|
178
161
|
i0.ɵɵadvance();
|
|
179
|
-
i0.ɵɵconditional((
|
|
162
|
+
i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialId) ? 4 : -1);
|
|
180
163
|
i0.ɵɵadvance();
|
|
181
|
-
i0.ɵɵconditional((
|
|
164
|
+
i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.errorMessage) ? 5 : -1);
|
|
182
165
|
i0.ɵɵadvance();
|
|
183
|
-
i0.ɵɵconditional((
|
|
166
|
+
i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.userAgent) ? 6 : -1);
|
|
184
167
|
} }
|
|
185
|
-
function
|
|
186
|
-
const
|
|
187
|
-
i0.ɵɵelementStart(0, "div",
|
|
188
|
-
i0.ɵɵelement(2, "div",
|
|
189
|
-
i0.ɵɵelementEnd();
|
|
190
|
-
i0.ɵɵelementStart(3, "div",
|
|
191
|
-
i0.ɵɵlistener("click", function
|
|
192
|
-
i0.ɵɵelementStart(4, "div",
|
|
168
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
169
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
170
|
+
i0.ɵɵelementStart(0, "div", 52)(1, "div", 53);
|
|
171
|
+
i0.ɵɵelement(2, "div", 54);
|
|
172
|
+
i0.ɵɵelementEnd();
|
|
173
|
+
i0.ɵɵelementStart(3, "div", 55);
|
|
174
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_16_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", 56)(5, "div", 57);
|
|
193
176
|
i0.ɵɵelement(6, "i");
|
|
194
|
-
i0.ɵɵelementStart(7, "span",
|
|
177
|
+
i0.ɵɵelementStart(7, "span", 58);
|
|
195
178
|
i0.ɵɵtext(8);
|
|
196
179
|
i0.ɵɵelementEnd()();
|
|
197
|
-
i0.ɵɵelementStart(9, "div",
|
|
180
|
+
i0.ɵɵelementStart(9, "div", 59);
|
|
198
181
|
i0.ɵɵtext(10);
|
|
199
182
|
i0.ɵɵelementEnd()();
|
|
200
|
-
i0.ɵɵelementStart(11, "div",
|
|
201
|
-
i0.ɵɵelement(13, "i",
|
|
183
|
+
i0.ɵɵelementStart(11, "div", 60)(12, "div", 61);
|
|
184
|
+
i0.ɵɵelement(13, "i", 62);
|
|
202
185
|
i0.ɵɵtext(14);
|
|
203
186
|
i0.ɵɵelementEnd();
|
|
204
|
-
i0.ɵɵconditionalCreate(15,
|
|
205
|
-
i0.ɵɵelementStart(16, "div",
|
|
187
|
+
i0.ɵɵconditionalCreate(15, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_15_Template, 2, 1, "div", 63);
|
|
188
|
+
i0.ɵɵelementStart(16, "div", 64)(17, "span", 65);
|
|
206
189
|
i0.ɵɵelement(18, "i");
|
|
207
190
|
i0.ɵɵtext(19);
|
|
208
191
|
i0.ɵɵelementEnd();
|
|
209
|
-
i0.ɵɵconditionalCreate(20,
|
|
210
|
-
i0.ɵɵconditionalCreate(21,
|
|
192
|
+
i0.ɵɵconditionalCreate(20, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_20_Template, 2, 1, "span", 66);
|
|
193
|
+
i0.ɵɵconditionalCreate(21, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_21_Template, 3, 1, "span", 67);
|
|
211
194
|
i0.ɵɵelementEnd()();
|
|
212
|
-
i0.ɵɵconditionalCreate(22,
|
|
213
|
-
i0.ɵɵelementStart(23, "button",
|
|
195
|
+
i0.ɵɵconditionalCreate(22, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Conditional_22_Template, 7, 5, "div", 68);
|
|
196
|
+
i0.ɵɵelementStart(23, "button", 69);
|
|
214
197
|
i0.ɵɵelement(24, "i");
|
|
215
198
|
i0.ɵɵelementEnd()()();
|
|
216
199
|
} if (rf & 2) {
|
|
217
|
-
const
|
|
200
|
+
const log_r4 = ctx.$implicit;
|
|
218
201
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
219
|
-
i0.ɵɵclassProp("expanded", ctx_r1.expandedLogId ===
|
|
202
|
+
i0.ɵɵclassProp("expanded", ctx_r1.expandedLogId === log_r4.ID)("failed", log_r4.Status === "Failed");
|
|
220
203
|
i0.ɵɵadvance(2);
|
|
221
|
-
i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(
|
|
204
|
+
i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r4)));
|
|
222
205
|
i0.ɵɵadvance(4);
|
|
223
|
-
i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(
|
|
224
|
-
i0.ɵɵstyleProp("color", ctx_r1.getOperationColor(ctx_r1.getOperationType(
|
|
206
|
+
i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(log_r4)));
|
|
207
|
+
i0.ɵɵstyleProp("color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r4)));
|
|
225
208
|
i0.ɵɵadvance(2);
|
|
226
|
-
i0.ɵɵtextInterpolate(ctx_r1.getOperationType(
|
|
209
|
+
i0.ɵɵtextInterpolate(ctx_r1.getOperationType(log_r4));
|
|
227
210
|
i0.ɵɵadvance(2);
|
|
228
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatTime(
|
|
211
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatTime(log_r4.__mj_CreatedAt));
|
|
229
212
|
i0.ɵɵadvance(4);
|
|
230
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
213
|
+
i0.ɵɵtextInterpolate1(" ", log_r4.User || "Unknown", " ");
|
|
231
214
|
i0.ɵɵadvance();
|
|
232
|
-
i0.ɵɵconditional(
|
|
215
|
+
i0.ɵɵconditional(log_r4.Description ? 15 : -1);
|
|
233
216
|
i0.ɵɵadvance(2);
|
|
234
|
-
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(
|
|
217
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r4.Status));
|
|
235
218
|
i0.ɵɵadvance();
|
|
236
|
-
i0.ɵɵclassMap(
|
|
219
|
+
i0.ɵɵclassMap(log_r4.Status === "Success" ? "fa-solid fa-check" : "fa-solid fa-times");
|
|
237
220
|
i0.ɵɵadvance();
|
|
238
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
221
|
+
i0.ɵɵtextInterpolate1(" ", log_r4.Status, " ");
|
|
239
222
|
i0.ɵɵadvance();
|
|
240
|
-
i0.ɵɵconditional(ctx_r1.getSubsystem(
|
|
223
|
+
i0.ɵɵconditional(ctx_r1.getSubsystem(log_r4) ? 20 : -1);
|
|
241
224
|
i0.ɵɵadvance();
|
|
242
|
-
i0.ɵɵconditional((
|
|
225
|
+
i0.ɵɵconditional((log_r4.parsedDetails == null ? null : log_r4.parsedDetails.credentialType) ? 21 : -1);
|
|
243
226
|
i0.ɵɵadvance();
|
|
244
|
-
i0.ɵɵconditional(ctx_r1.expandedLogId ===
|
|
227
|
+
i0.ɵɵconditional(ctx_r1.expandedLogId === log_r4.ID ? 22 : -1);
|
|
245
228
|
i0.ɵɵadvance(2);
|
|
246
|
-
i0.ɵɵclassMap(ctx_r1.expandedLogId ===
|
|
229
|
+
i0.ɵɵclassMap(ctx_r1.expandedLogId === log_r4.ID ? "fa-solid fa-chevron-up" : "fa-solid fa-chevron-down");
|
|
247
230
|
} }
|
|
248
|
-
function
|
|
249
|
-
i0.ɵɵelementStart(0, "div",
|
|
231
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
232
|
+
i0.ɵɵelementStart(0, "div", 46)(1, "div", 47)(2, "span", 48);
|
|
250
233
|
i0.ɵɵtext(3);
|
|
251
234
|
i0.ɵɵelementEnd();
|
|
252
|
-
i0.ɵɵelementStart(4, "span",
|
|
235
|
+
i0.ɵɵelementStart(4, "span", 49);
|
|
253
236
|
i0.ɵɵtext(5);
|
|
254
237
|
i0.ɵɵelementEnd()();
|
|
255
|
-
i0.ɵɵelementStart(6, "div",
|
|
256
|
-
i0.ɵɵrepeaterCreate(7,
|
|
238
|
+
i0.ɵɵelementStart(6, "div", 50);
|
|
239
|
+
i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_For_8_Template, 25, 23, "div", 51, i0.ɵɵrepeaterTrackByIdentity);
|
|
257
240
|
i0.ɵɵelementEnd()();
|
|
258
241
|
} if (rf & 2) {
|
|
259
|
-
const
|
|
242
|
+
const group_r5 = ctx.$implicit;
|
|
260
243
|
i0.ɵɵadvance(3);
|
|
261
|
-
i0.ɵɵtextInterpolate(
|
|
244
|
+
i0.ɵɵtextInterpolate(group_r5.displayDate);
|
|
262
245
|
i0.ɵɵadvance(2);
|
|
263
|
-
i0.ɵɵtextInterpolate1("",
|
|
246
|
+
i0.ɵɵtextInterpolate1("", group_r5.logs.length, " events");
|
|
264
247
|
i0.ɵɵadvance(2);
|
|
265
|
-
i0.ɵɵrepeater(
|
|
248
|
+
i0.ɵɵrepeater(group_r5.logs);
|
|
266
249
|
} }
|
|
267
|
-
function
|
|
268
|
-
i0.ɵɵelementStart(0, "div",
|
|
269
|
-
i0.ɵɵrepeaterCreate(1,
|
|
250
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_36_Template(rf, ctx) { if (rf & 1) {
|
|
251
|
+
i0.ɵɵelementStart(0, "div", 30);
|
|
252
|
+
i0.ɵɵrepeaterCreate(1, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_For_2_Template, 9, 2, "div", 46, i0.ɵɵrepeaterTrackByIdentity);
|
|
270
253
|
i0.ɵɵelementEnd();
|
|
271
254
|
} if (rf & 2) {
|
|
272
255
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
273
256
|
i0.ɵɵadvance();
|
|
274
257
|
i0.ɵɵrepeater(ctx_r1.timelineGroups);
|
|
275
258
|
} }
|
|
276
|
-
function
|
|
277
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
259
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_37_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
260
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 81);
|
|
278
261
|
i0.ɵɵtext(2);
|
|
279
262
|
i0.ɵɵelementEnd();
|
|
280
|
-
i0.ɵɵelementStart(3, "td",
|
|
263
|
+
i0.ɵɵelementStart(3, "td", 82);
|
|
281
264
|
i0.ɵɵtext(4);
|
|
282
265
|
i0.ɵɵelementEnd();
|
|
283
|
-
i0.ɵɵelementStart(5, "td",
|
|
266
|
+
i0.ɵɵelementStart(5, "td", 83)(6, "span", 84);
|
|
284
267
|
i0.ɵɵelement(7, "i");
|
|
285
268
|
i0.ɵɵtext(8);
|
|
286
269
|
i0.ɵɵelementEnd()();
|
|
287
|
-
i0.ɵɵelementStart(9, "td",
|
|
270
|
+
i0.ɵɵelementStart(9, "td", 85);
|
|
288
271
|
i0.ɵɵtext(10);
|
|
289
272
|
i0.ɵɵelementEnd();
|
|
290
|
-
i0.ɵɵelementStart(11, "td",
|
|
273
|
+
i0.ɵɵelementStart(11, "td", 86);
|
|
291
274
|
i0.ɵɵtext(12);
|
|
292
275
|
i0.ɵɵelementEnd();
|
|
293
|
-
i0.ɵɵelementStart(13, "td",
|
|
276
|
+
i0.ɵɵelementStart(13, "td", 87)(14, "span", 65);
|
|
294
277
|
i0.ɵɵelement(15, "i");
|
|
295
278
|
i0.ɵɵtext(16);
|
|
296
279
|
i0.ɵɵelementEnd()()();
|
|
297
280
|
} if (rf & 2) {
|
|
298
|
-
const
|
|
281
|
+
const log_r6 = ctx.$implicit;
|
|
299
282
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
300
|
-
i0.ɵɵclassProp("failed-row",
|
|
283
|
+
i0.ɵɵclassProp("failed-row", log_r6.Status === "Failed");
|
|
301
284
|
i0.ɵɵadvance(2);
|
|
302
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatDate(
|
|
285
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDate(log_r6.__mj_CreatedAt));
|
|
303
286
|
i0.ɵɵadvance(2);
|
|
304
|
-
i0.ɵɵtextInterpolate(
|
|
287
|
+
i0.ɵɵtextInterpolate(log_r6.User || "Unknown");
|
|
305
288
|
i0.ɵɵadvance(2);
|
|
306
|
-
i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(
|
|
289
|
+
i0.ɵɵstyleProp("background-color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r6)) + "20")("color", ctx_r1.getOperationColor(ctx_r1.getOperationType(log_r6)));
|
|
307
290
|
i0.ɵɵadvance();
|
|
308
|
-
i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(
|
|
291
|
+
i0.ɵɵclassMap(ctx_r1.getOperationIcon(ctx_r1.getOperationType(log_r6)));
|
|
309
292
|
i0.ɵɵadvance();
|
|
310
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.getOperationType(
|
|
293
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.getOperationType(log_r6), " ");
|
|
311
294
|
i0.ɵɵadvance(2);
|
|
312
|
-
i0.ɵɵtextInterpolate(
|
|
295
|
+
i0.ɵɵtextInterpolate(log_r6.Description || "-");
|
|
313
296
|
i0.ɵɵadvance(2);
|
|
314
|
-
i0.ɵɵtextInterpolate(ctx_r1.getSubsystem(
|
|
297
|
+
i0.ɵɵtextInterpolate(ctx_r1.getSubsystem(log_r6) || "-");
|
|
315
298
|
i0.ɵɵadvance(2);
|
|
316
|
-
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(
|
|
299
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r6.Status));
|
|
317
300
|
i0.ɵɵadvance();
|
|
318
|
-
i0.ɵɵclassMap(
|
|
301
|
+
i0.ɵɵclassMap(log_r6.Status === "Success" ? "fa-solid fa-check" : "fa-solid fa-times");
|
|
319
302
|
i0.ɵɵadvance();
|
|
320
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
303
|
+
i0.ɵɵtextInterpolate1(" ", log_r6.Status, " ");
|
|
321
304
|
} }
|
|
322
|
-
function
|
|
323
|
-
i0.ɵɵelementStart(0, "div",
|
|
305
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
306
|
+
i0.ɵɵelementStart(0, "div", 31)(1, "table", 79)(2, "thead")(3, "tr")(4, "th");
|
|
324
307
|
i0.ɵɵtext(5, "Timestamp");
|
|
325
308
|
i0.ɵɵelementEnd();
|
|
326
309
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -339,36 +322,36 @@ function CredentialsAuditResourceComponent_Conditional_2_Conditional_85_Template
|
|
|
339
322
|
i0.ɵɵtext(15, "Status");
|
|
340
323
|
i0.ɵɵelementEnd()()();
|
|
341
324
|
i0.ɵɵelementStart(16, "tbody");
|
|
342
|
-
i0.ɵɵrepeaterCreate(17,
|
|
325
|
+
i0.ɵɵrepeaterCreate(17, CredentialsAuditResourceComponent_Conditional_16_Conditional_37_For_18_Template, 17, 17, "tr", 80, i0.ɵɵrepeaterTrackByIdentity);
|
|
343
326
|
i0.ɵɵelementEnd()()();
|
|
344
327
|
} if (rf & 2) {
|
|
345
328
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
346
329
|
i0.ɵɵadvance(17);
|
|
347
330
|
i0.ɵɵrepeater(ctx_r1.filteredLogs);
|
|
348
331
|
} }
|
|
349
|
-
function
|
|
350
|
-
const
|
|
332
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
333
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
351
334
|
i0.ɵɵelementStart(0, "p");
|
|
352
335
|
i0.ɵɵtext(1, " No events match your current filters. ");
|
|
353
|
-
i0.ɵɵelementStart(2, "button",
|
|
354
|
-
i0.ɵɵlistener("click", function
|
|
336
|
+
i0.ɵɵelementStart(2, "button", 89);
|
|
337
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_16_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()); });
|
|
355
338
|
i0.ɵɵtext(3, "Clear filters");
|
|
356
339
|
i0.ɵɵelementEnd()();
|
|
357
340
|
} }
|
|
358
|
-
function
|
|
341
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
359
342
|
i0.ɵɵelementStart(0, "p");
|
|
360
343
|
i0.ɵɵtext(1, " No credential access events in the selected time range. ");
|
|
361
344
|
i0.ɵɵelementEnd();
|
|
362
345
|
} }
|
|
363
|
-
function
|
|
364
|
-
i0.ɵɵelementStart(0, "div",
|
|
365
|
-
i0.ɵɵelement(2, "i",
|
|
346
|
+
function CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
347
|
+
i0.ɵɵelementStart(0, "div", 32)(1, "div", 88);
|
|
348
|
+
i0.ɵɵelement(2, "i", 16);
|
|
366
349
|
i0.ɵɵelementEnd();
|
|
367
350
|
i0.ɵɵelementStart(3, "h3");
|
|
368
351
|
i0.ɵɵtext(4, "No Audit Logs");
|
|
369
352
|
i0.ɵɵelementEnd();
|
|
370
|
-
i0.ɵɵconditionalCreate(5,
|
|
371
|
-
i0.ɵɵconditionalCreate(6,
|
|
353
|
+
i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Conditional_5_Template, 4, 0, "p");
|
|
354
|
+
i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Conditional_6_Template, 2, 0, "p");
|
|
372
355
|
i0.ɵɵelementEnd();
|
|
373
356
|
} if (rf & 2) {
|
|
374
357
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -377,120 +360,53 @@ function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Template
|
|
|
377
360
|
i0.ɵɵadvance();
|
|
378
361
|
i0.ɵɵconditional(!ctx_r1.searchText && !ctx_r1.selectedStatus && !ctx_r1.selectedOperation ? 6 : -1);
|
|
379
362
|
} }
|
|
380
|
-
function
|
|
381
|
-
|
|
382
|
-
i0.ɵɵ
|
|
383
|
-
i0.ɵɵtext(3, "Audit Trail");
|
|
384
|
-
i0.ɵɵelementEnd();
|
|
385
|
-
i0.ɵɵelementStart(4, "p", 5);
|
|
386
|
-
i0.ɵɵtext(5, "Credential access and modification history");
|
|
387
|
-
i0.ɵɵelementEnd()();
|
|
388
|
-
i0.ɵɵelementStart(6, "div", 6)(7, "button", 7);
|
|
389
|
-
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.exportToCSV()); });
|
|
390
|
-
i0.ɵɵelement(8, "i", 8);
|
|
391
|
-
i0.ɵɵelementStart(9, "span");
|
|
392
|
-
i0.ɵɵtext(10, "Export");
|
|
393
|
-
i0.ɵɵelementEnd()();
|
|
394
|
-
i0.ɵɵelementStart(11, "button", 9);
|
|
395
|
-
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.refresh()); });
|
|
396
|
-
i0.ɵɵelement(12, "i", 10);
|
|
397
|
-
i0.ɵɵelementEnd()()();
|
|
398
|
-
i0.ɵɵelementStart(13, "div", 11)(14, "div", 12)(15, "div", 13);
|
|
399
|
-
i0.ɵɵelement(16, "i", 14);
|
|
363
|
+
function CredentialsAuditResourceComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
364
|
+
i0.ɵɵelementStart(0, "div", 13)(1, "div", 14)(2, "div", 15);
|
|
365
|
+
i0.ɵɵelement(3, "i", 16);
|
|
400
366
|
i0.ɵɵelementEnd();
|
|
401
|
-
i0.ɵɵelementStart(
|
|
402
|
-
i0.ɵɵtext(
|
|
367
|
+
i0.ɵɵelementStart(4, "div", 17)(5, "div", 18);
|
|
368
|
+
i0.ɵɵtext(6);
|
|
403
369
|
i0.ɵɵelementEnd();
|
|
404
|
-
i0.ɵɵelementStart(
|
|
405
|
-
i0.ɵɵtext(
|
|
370
|
+
i0.ɵɵelementStart(7, "div", 19);
|
|
371
|
+
i0.ɵɵtext(8, "Total Events");
|
|
406
372
|
i0.ɵɵelementEnd()()();
|
|
407
|
-
i0.ɵɵelementStart(
|
|
408
|
-
i0.ɵɵelement(
|
|
373
|
+
i0.ɵɵelementStart(9, "div", 14)(10, "div", 20);
|
|
374
|
+
i0.ɵɵelement(11, "i", 21);
|
|
409
375
|
i0.ɵɵelementEnd();
|
|
410
|
-
i0.ɵɵelementStart(
|
|
411
|
-
i0.ɵɵtext(
|
|
376
|
+
i0.ɵɵelementStart(12, "div", 17)(13, "div", 22);
|
|
377
|
+
i0.ɵɵtext(14);
|
|
412
378
|
i0.ɵɵelementEnd();
|
|
413
|
-
i0.ɵɵelementStart(
|
|
414
|
-
i0.ɵɵtext(
|
|
379
|
+
i0.ɵɵelementStart(15, "div", 19);
|
|
380
|
+
i0.ɵɵtext(16, "Successful");
|
|
415
381
|
i0.ɵɵelementEnd()();
|
|
416
|
-
i0.ɵɵelementStart(
|
|
417
|
-
i0.ɵɵtext(
|
|
382
|
+
i0.ɵɵelementStart(17, "div", 23);
|
|
383
|
+
i0.ɵɵtext(18);
|
|
418
384
|
i0.ɵɵelementEnd()();
|
|
419
|
-
i0.ɵɵelementStart(
|
|
420
|
-
i0.ɵɵelement(
|
|
385
|
+
i0.ɵɵelementStart(19, "div", 14)(20, "div", 24);
|
|
386
|
+
i0.ɵɵelement(21, "i", 25);
|
|
421
387
|
i0.ɵɵelementEnd();
|
|
422
|
-
i0.ɵɵelementStart(
|
|
423
|
-
i0.ɵɵtext(
|
|
388
|
+
i0.ɵɵelementStart(22, "div", 17)(23, "div", 26);
|
|
389
|
+
i0.ɵɵtext(24);
|
|
424
390
|
i0.ɵɵelementEnd();
|
|
425
|
-
i0.ɵɵelementStart(
|
|
426
|
-
i0.ɵɵtext(
|
|
391
|
+
i0.ɵɵelementStart(25, "div", 19);
|
|
392
|
+
i0.ɵɵtext(26, "Failed");
|
|
427
393
|
i0.ɵɵelementEnd()()();
|
|
428
|
-
i0.ɵɵelementStart(
|
|
429
|
-
i0.ɵɵelement(
|
|
394
|
+
i0.ɵɵelementStart(27, "div", 14)(28, "div", 27);
|
|
395
|
+
i0.ɵɵelement(29, "i", 28);
|
|
430
396
|
i0.ɵɵelementEnd();
|
|
431
|
-
i0.ɵɵelementStart(
|
|
432
|
-
i0.ɵɵtext(
|
|
397
|
+
i0.ɵɵelementStart(30, "div", 17)(31, "div", 18);
|
|
398
|
+
i0.ɵɵtext(32);
|
|
433
399
|
i0.ɵɵelementEnd();
|
|
434
|
-
i0.ɵɵelementStart(
|
|
435
|
-
i0.ɵɵtext(
|
|
400
|
+
i0.ɵɵelementStart(33, "div", 19);
|
|
401
|
+
i0.ɵɵtext(34, "Unique Users");
|
|
436
402
|
i0.ɵɵelementEnd()()()();
|
|
437
|
-
i0.ɵɵconditionalCreate(
|
|
438
|
-
i0.ɵɵ
|
|
439
|
-
i0.ɵɵ
|
|
440
|
-
i0.ɵɵ
|
|
441
|
-
i0.ɵɵlistener("input", function CredentialsAuditResourceComponent_Conditional_2_Template_input_input_53_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSearchChange($event.target.value)); });
|
|
442
|
-
i0.ɵɵelementEnd();
|
|
443
|
-
i0.ɵɵconditionalCreate(54, CredentialsAuditResourceComponent_Conditional_2_Conditional_54_Template, 2, 0, "button", 33);
|
|
444
|
-
i0.ɵɵelementEnd();
|
|
445
|
-
i0.ɵɵelementStart(55, "select", 34);
|
|
446
|
-
i0.ɵɵlistener("change", function CredentialsAuditResourceComponent_Conditional_2_Template_select_change_55_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onStatusFilterChange($event.target.value)); });
|
|
447
|
-
i0.ɵɵelementStart(56, "option", 35);
|
|
448
|
-
i0.ɵɵtext(57, "All Statuses");
|
|
449
|
-
i0.ɵɵelementEnd();
|
|
450
|
-
i0.ɵɵelementStart(58, "option", 36);
|
|
451
|
-
i0.ɵɵtext(59, "Success");
|
|
452
|
-
i0.ɵɵelementEnd();
|
|
453
|
-
i0.ɵɵelementStart(60, "option", 37);
|
|
454
|
-
i0.ɵɵtext(61, "Failed");
|
|
455
|
-
i0.ɵɵelementEnd()();
|
|
456
|
-
i0.ɵɵelementStart(62, "select", 34);
|
|
457
|
-
i0.ɵɵlistener("change", function CredentialsAuditResourceComponent_Conditional_2_Template_select_change_62_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOperationFilterChange($event.target.value)); });
|
|
458
|
-
i0.ɵɵelementStart(63, "option", 35);
|
|
459
|
-
i0.ɵɵtext(64, "All Operations");
|
|
460
|
-
i0.ɵɵelementEnd();
|
|
461
|
-
i0.ɵɵrepeaterCreate(65, CredentialsAuditResourceComponent_Conditional_2_For_66_Template, 2, 2, "option", 38, i0.ɵɵrepeaterTrackByIdentity);
|
|
462
|
-
i0.ɵɵelementEnd();
|
|
463
|
-
i0.ɵɵelementStart(67, "select", 34);
|
|
464
|
-
i0.ɵɵlistener("change", function CredentialsAuditResourceComponent_Conditional_2_Template_select_change_67_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDateRangeChange($event.target.value)); });
|
|
465
|
-
i0.ɵɵelementStart(68, "option", 39);
|
|
466
|
-
i0.ɵɵtext(69, "Last 24 hours");
|
|
467
|
-
i0.ɵɵelementEnd();
|
|
468
|
-
i0.ɵɵelementStart(70, "option", 40);
|
|
469
|
-
i0.ɵɵtext(71, "Last 7 days");
|
|
470
|
-
i0.ɵɵelementEnd();
|
|
471
|
-
i0.ɵɵelementStart(72, "option", 41);
|
|
472
|
-
i0.ɵɵtext(73, "Last 30 days");
|
|
473
|
-
i0.ɵɵelementEnd();
|
|
474
|
-
i0.ɵɵelementStart(74, "option", 42);
|
|
475
|
-
i0.ɵɵtext(75, "Last 90 days");
|
|
476
|
-
i0.ɵɵelementEnd()()();
|
|
477
|
-
i0.ɵɵelementStart(76, "div", 43)(77, "div", 44);
|
|
478
|
-
i0.ɵɵtext(78);
|
|
479
|
-
i0.ɵɵelementEnd();
|
|
480
|
-
i0.ɵɵelementStart(79, "div", 45)(80, "button", 46);
|
|
481
|
-
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Template_button_click_80_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setViewMode("timeline")); });
|
|
482
|
-
i0.ɵɵelement(81, "i", 47);
|
|
483
|
-
i0.ɵɵelementEnd();
|
|
484
|
-
i0.ɵɵelementStart(82, "button", 48);
|
|
485
|
-
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Template_button_click_82_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setViewMode("table")); });
|
|
486
|
-
i0.ɵɵelement(83, "i", 49);
|
|
487
|
-
i0.ɵɵelementEnd()()()();
|
|
488
|
-
i0.ɵɵconditionalCreate(84, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_Template, 3, 0, "div", 50);
|
|
489
|
-
i0.ɵɵconditionalCreate(85, CredentialsAuditResourceComponent_Conditional_2_Conditional_85_Template, 19, 0, "div", 51);
|
|
490
|
-
i0.ɵɵconditionalCreate(86, CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Template, 7, 2, "div", 52);
|
|
403
|
+
i0.ɵɵconditionalCreate(35, CredentialsAuditResourceComponent_Conditional_16_Conditional_35_Template, 16, 0, "div", 29);
|
|
404
|
+
i0.ɵɵconditionalCreate(36, CredentialsAuditResourceComponent_Conditional_16_Conditional_36_Template, 3, 0, "div", 30);
|
|
405
|
+
i0.ɵɵconditionalCreate(37, CredentialsAuditResourceComponent_Conditional_16_Conditional_37_Template, 19, 0, "div", 31);
|
|
406
|
+
i0.ɵɵconditionalCreate(38, CredentialsAuditResourceComponent_Conditional_16_Conditional_38_Template, 7, 2, "div", 32);
|
|
491
407
|
} if (rf & 2) {
|
|
492
408
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
493
|
-
i0.ɵɵadvance(
|
|
409
|
+
i0.ɵɵadvance(6);
|
|
494
410
|
i0.ɵɵtextInterpolate(ctx_r1.auditLogs.length);
|
|
495
411
|
i0.ɵɵadvance(8);
|
|
496
412
|
i0.ɵɵtextInterpolate(ctx_r1.getSuccessCount());
|
|
@@ -501,31 +417,13 @@ function CredentialsAuditResourceComponent_Conditional_2_Template(rf, ctx) { if
|
|
|
501
417
|
i0.ɵɵadvance(8);
|
|
502
418
|
i0.ɵɵtextInterpolate(ctx_r1.getUniqueUserCount());
|
|
503
419
|
i0.ɵɵadvance(3);
|
|
504
|
-
i0.ɵɵconditional(ctx_r1.hourlyData.length > 0 ?
|
|
505
|
-
i0.ɵɵadvance(5);
|
|
506
|
-
i0.ɵɵproperty("value", ctx_r1.searchText);
|
|
420
|
+
i0.ɵɵconditional(ctx_r1.hourlyData.length > 0 ? 35 : -1);
|
|
507
421
|
i0.ɵɵadvance();
|
|
508
|
-
i0.ɵɵconditional(ctx_r1.
|
|
509
|
-
i0.ɵɵadvance();
|
|
510
|
-
i0.ɵɵproperty("value", ctx_r1.selectedStatus);
|
|
511
|
-
i0.ɵɵadvance(7);
|
|
512
|
-
i0.ɵɵproperty("value", ctx_r1.selectedOperation);
|
|
513
|
-
i0.ɵɵadvance(3);
|
|
514
|
-
i0.ɵɵrepeater(ctx_r1.getOperationList());
|
|
515
|
-
i0.ɵɵadvance(2);
|
|
516
|
-
i0.ɵɵproperty("value", ctx_r1.dateRange);
|
|
517
|
-
i0.ɵɵadvance(11);
|
|
518
|
-
i0.ɵɵtextInterpolate2(" ", ctx_r1.filteredLogs.length, " of ", ctx_r1.auditLogs.length, " events ");
|
|
519
|
-
i0.ɵɵadvance(2);
|
|
520
|
-
i0.ɵɵclassProp("active", ctx_r1.viewMode === "timeline");
|
|
521
|
-
i0.ɵɵadvance(2);
|
|
522
|
-
i0.ɵɵclassProp("active", ctx_r1.viewMode === "table");
|
|
523
|
-
i0.ɵɵadvance(2);
|
|
524
|
-
i0.ɵɵconditional(ctx_r1.viewMode === "timeline" && ctx_r1.timelineGroups.length > 0 ? 84 : -1);
|
|
422
|
+
i0.ɵɵconditional(ctx_r1.viewMode === "timeline" && ctx_r1.timelineGroups.length > 0 ? 36 : -1);
|
|
525
423
|
i0.ɵɵadvance();
|
|
526
|
-
i0.ɵɵconditional(ctx_r1.viewMode === "table" && ctx_r1.filteredLogs.length > 0 ?
|
|
424
|
+
i0.ɵɵconditional(ctx_r1.viewMode === "table" && ctx_r1.filteredLogs.length > 0 ? 37 : -1);
|
|
527
425
|
i0.ɵɵadvance();
|
|
528
|
-
i0.ɵɵconditional(ctx_r1.filteredLogs.length === 0 ?
|
|
426
|
+
i0.ɵɵconditional(ctx_r1.filteredLogs.length === 0 ? 38 : -1);
|
|
529
427
|
} }
|
|
530
428
|
// The Credential Access AuditLogType ID from metadata
|
|
531
429
|
const CREDENTIAL_ACCESS_AUDIT_LOG_TYPE_ID = 'E8D4D100-E785-42D3-997F-ECFF3B0BCFC0';
|
|
@@ -544,6 +442,87 @@ let CredentialsAuditResourceComponent = class CredentialsAuditResourceComponent
|
|
|
544
442
|
// Chart data
|
|
545
443
|
hourlyData = [];
|
|
546
444
|
operationCounts = new Map();
|
|
445
|
+
viewOptions = [
|
|
446
|
+
{ key: 'timeline', icon: 'fa-solid fa-timeline', title: 'Timeline view' },
|
|
447
|
+
{ key: 'table', icon: 'fa-solid fa-table', title: 'Table view' }
|
|
448
|
+
];
|
|
449
|
+
get FilterFields() {
|
|
450
|
+
return [
|
|
451
|
+
{
|
|
452
|
+
key: 'status',
|
|
453
|
+
type: 'dropdown',
|
|
454
|
+
label: 'Status',
|
|
455
|
+
icon: 'fa-solid fa-circle-info',
|
|
456
|
+
placeholder: 'All Statuses',
|
|
457
|
+
options: [
|
|
458
|
+
{ text: 'All Statuses', value: '' },
|
|
459
|
+
{ text: 'Success', value: 'Success' },
|
|
460
|
+
{ text: 'Failed', value: 'Failed' }
|
|
461
|
+
]
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
key: 'operation',
|
|
465
|
+
type: 'dropdown',
|
|
466
|
+
label: 'Operation',
|
|
467
|
+
icon: 'fa-solid fa-bolt',
|
|
468
|
+
placeholder: 'All Operations',
|
|
469
|
+
filterable: true,
|
|
470
|
+
options: [
|
|
471
|
+
{ text: 'All Operations', value: '' },
|
|
472
|
+
...this.getOperationList().map(op => ({ text: op, value: op }))
|
|
473
|
+
]
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
key: 'dateRange',
|
|
477
|
+
type: 'dropdown',
|
|
478
|
+
label: 'Time range',
|
|
479
|
+
icon: 'fa-solid fa-clock',
|
|
480
|
+
options: [
|
|
481
|
+
{ text: 'Last 24 hours', value: '1' },
|
|
482
|
+
{ text: 'Last 7 days', value: '7' },
|
|
483
|
+
{ text: 'Last 30 days', value: '30' },
|
|
484
|
+
{ text: 'Last 90 days', value: '90' }
|
|
485
|
+
]
|
|
486
|
+
}
|
|
487
|
+
];
|
|
488
|
+
}
|
|
489
|
+
get FilterValues() {
|
|
490
|
+
return {
|
|
491
|
+
status: this.selectedStatus,
|
|
492
|
+
operation: this.selectedOperation,
|
|
493
|
+
dateRange: this.dateRange
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
get ActiveFilterCount() {
|
|
497
|
+
let n = 0;
|
|
498
|
+
if (this.selectedStatus)
|
|
499
|
+
n++;
|
|
500
|
+
if (this.selectedOperation)
|
|
501
|
+
n++;
|
|
502
|
+
if (this.dateRange && this.dateRange !== '7')
|
|
503
|
+
n++; // 7-day is the default; don't count it
|
|
504
|
+
return n;
|
|
505
|
+
}
|
|
506
|
+
onFilterValuesChange(v) {
|
|
507
|
+
const next = (v ?? {});
|
|
508
|
+
if ((next.status ?? '') !== this.selectedStatus) {
|
|
509
|
+
this.onStatusFilterChange(next.status ?? '');
|
|
510
|
+
}
|
|
511
|
+
if ((next.operation ?? '') !== this.selectedOperation) {
|
|
512
|
+
this.onOperationFilterChange(next.operation ?? '');
|
|
513
|
+
}
|
|
514
|
+
if ((next.dateRange ?? '7') !== this.dateRange) {
|
|
515
|
+
this.onDateRangeChange(next.dateRange ?? '7');
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
resetFilters() {
|
|
519
|
+
if (this.selectedStatus)
|
|
520
|
+
this.onStatusFilterChange('');
|
|
521
|
+
if (this.selectedOperation)
|
|
522
|
+
this.onOperationFilterChange('');
|
|
523
|
+
if (this.dateRange !== '7')
|
|
524
|
+
this.onDateRangeChange('7');
|
|
525
|
+
}
|
|
547
526
|
constructor(cdr) {
|
|
548
527
|
super();
|
|
549
528
|
this.cdr = cdr;
|
|
@@ -846,17 +825,51 @@ let CredentialsAuditResourceComponent = class CredentialsAuditResourceComponent
|
|
|
846
825
|
link.click();
|
|
847
826
|
}
|
|
848
827
|
static ɵfac = function CredentialsAuditResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CredentialsAuditResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
849
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsAuditResourceComponent, selectors: [["mj-credentials-audit-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
850
|
-
i0.ɵɵelementStart(0, "
|
|
851
|
-
i0.ɵɵ
|
|
852
|
-
i0.ɵɵ
|
|
828
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsAuditResourceComponent, selectors: [["mj-credentials-audit-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 17, 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", ""], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], [3, "KeyChange", "Options", "ActiveKey"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Export to CSV", 3, "click"], [1, "fa-solid", "fa-download"], [3, "Clicked", "Loading"], ["toolbar", ""], ["Placeholder", "Search logs...", 3, "ValueChange", "Value"], ["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
|
+
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
|
|
830
|
+
i0.ɵɵelement(3, "mj-stat-badge", 2);
|
|
831
|
+
i0.ɵɵelementEnd();
|
|
832
|
+
i0.ɵɵelementStart(4, "div", 3)(5, "mj-filter-popover", 4);
|
|
833
|
+
i0.ɵɵlistener("ClearAllRequested", function CredentialsAuditResourceComponent_Template_mj_filter_popover_ClearAllRequested_5_listener() { return ctx.resetFilters(); });
|
|
834
|
+
i0.ɵɵelementStart(6, "mj-filter-panel", 5);
|
|
835
|
+
i0.ɵɵlistener("ValuesChange", function CredentialsAuditResourceComponent_Template_mj_filter_panel_ValuesChange_6_listener($event) { return ctx.onFilterValuesChange($event); })("Reset", function CredentialsAuditResourceComponent_Template_mj_filter_panel_Reset_6_listener() { return ctx.resetFilters(); });
|
|
836
|
+
i0.ɵɵelementEnd()();
|
|
837
|
+
i0.ɵɵelementStart(7, "mj-view-toggle", 6);
|
|
838
|
+
i0.ɵɵlistener("KeyChange", function CredentialsAuditResourceComponent_Template_mj_view_toggle_KeyChange_7_listener($event) { return ctx.setViewMode($event); });
|
|
853
839
|
i0.ɵɵelementEnd();
|
|
840
|
+
i0.ɵɵelementStart(8, "button", 7);
|
|
841
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Template_button_click_8_listener() { return ctx.exportToCSV(); });
|
|
842
|
+
i0.ɵɵelement(9, "i", 8);
|
|
843
|
+
i0.ɵɵtext(10, " Export ");
|
|
844
|
+
i0.ɵɵelementEnd();
|
|
845
|
+
i0.ɵɵelementStart(11, "mj-refresh-button", 9);
|
|
846
|
+
i0.ɵɵlistener("Clicked", function CredentialsAuditResourceComponent_Template_mj_refresh_button_Clicked_11_listener() { return ctx.refresh(); });
|
|
847
|
+
i0.ɵɵelementEnd()();
|
|
848
|
+
i0.ɵɵelementStart(12, "div", 10)(13, "mj-page-search", 11);
|
|
849
|
+
i0.ɵɵlistener("ValueChange", function CredentialsAuditResourceComponent_Template_mj_page_search_ValueChange_13_listener($event) { return ctx.onSearchChange($event); });
|
|
850
|
+
i0.ɵɵelementEnd()()();
|
|
851
|
+
i0.ɵɵelementStart(14, "mj-page-body");
|
|
852
|
+
i0.ɵɵconditionalCreate(15, CredentialsAuditResourceComponent_Conditional_15_Template, 1, 0, "mj-loading", 12);
|
|
853
|
+
i0.ɵɵconditionalCreate(16, CredentialsAuditResourceComponent_Conditional_16_Template, 39, 9);
|
|
854
|
+
i0.ɵɵelementEnd()();
|
|
854
855
|
} if (rf & 2) {
|
|
856
|
+
i0.ɵɵadvance(3);
|
|
857
|
+
i0.ɵɵproperty("Count", ctx.filteredLogs.length)("Total", ctx.auditLogs.length);
|
|
858
|
+
i0.ɵɵadvance(2);
|
|
859
|
+
i0.ɵɵproperty("ActiveCount", ctx.ActiveFilterCount)("ShowClearAll", ctx.ActiveFilterCount > 0);
|
|
860
|
+
i0.ɵɵadvance();
|
|
861
|
+
i0.ɵɵproperty("Fields", ctx.FilterFields)("Values", ctx.FilterValues);
|
|
855
862
|
i0.ɵɵadvance();
|
|
856
|
-
i0.ɵɵ
|
|
863
|
+
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
|
+
i0.ɵɵadvance(2);
|
|
869
|
+
i0.ɵɵconditional(ctx.isLoading ? 15 : -1);
|
|
857
870
|
i0.ɵɵadvance();
|
|
858
|
-
i0.ɵɵconditional(!ctx.isLoading ?
|
|
859
|
-
} }, dependencies: [i1.NgClass, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i3.LoadingComponent], styles: [".audit-container[_ngcontent-%COMP%] {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-page);\n}\n\n\n\n.audit-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.audit-subtitle[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-brand-primary);\n}\n\n\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--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.toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n position: relative;\n min-width: 200px;\n}\n\n.search-container[_ngcontent-%COMP%] i.fa-search[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n background: var(--mj-bg-surface-card);\n transition: all 0.2s ease;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--mj-border-default);\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 10px;\n}\n\n.search-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-text-disabled);\n color: var(--mj-text-inverse);\n}\n\n.filter-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.results-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.timeline-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group[_ngcontent-%COMP%] {\n background: var(--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 });
|
|
871
|
+
i0.ɵɵconditional(!ctx.isLoading ? 16 : -1);
|
|
872
|
+
} }, 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 });
|
|
860
873
|
};
|
|
861
874
|
CredentialsAuditResourceComponent = __decorate([
|
|
862
875
|
RegisterClass(BaseResourceComponent, 'CredentialsAuditResource')
|
|
@@ -864,7 +877,7 @@ CredentialsAuditResourceComponent = __decorate([
|
|
|
864
877
|
export { CredentialsAuditResourceComponent };
|
|
865
878
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CredentialsAuditResourceComponent, [{
|
|
866
879
|
type: Component,
|
|
867
|
-
args: [{ standalone: false, selector: 'mj-credentials-audit-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"audit-container\">\n @if (isLoading) {\n <mj-loading text=\"Loading audit logs...\"></mj-loading>\n }\n\n @if (!isLoading) {\n <!-- Header -->\n <div class=\"audit-header\">\n <div class=\"header-info\">\n <h2 class=\"audit-title\">Audit Trail</h2>\n <p class=\"audit-subtitle\">Credential access and modification history</p>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-secondary\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Export</span>\n </button>\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n <!-- 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 <!-- Toolbar -->\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search logs...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n @if (searchText) {\n <button class=\"search-clear\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <select\n class=\"filter-select\"\n [value]=\"selectedStatus\"\n (change)=\"onStatusFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Statuses</option>\n <option value=\"Success\">Success</option>\n <option value=\"Failed\">Failed</option>\n </select>\n <select\n class=\"filter-select\"\n [value]=\"selectedOperation\"\n (change)=\"onOperationFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Operations</option>\n @for (op of getOperationList(); track op) {\n <option [value]=\"op\">{{op}}</option>\n }\n </select>\n <select\n class=\"filter-select\"\n [value]=\"dateRange\"\n (change)=\"onDateRangeChange($any($event.target).value)\"\n >\n <option value=\"1\">Last 24 hours</option>\n <option value=\"7\">Last 7 days</option>\n <option value=\"30\">Last 30 days</option>\n <option value=\"90\">Last 90 days</option>\n </select>\n </div>\n <div class=\"toolbar-right\">\n <div class=\"results-info\">\n {{filteredLogs.length}} of {{auditLogs.length}} events\n </div>\n <div class=\"view-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'timeline'\"\n (click)=\"setViewMode('timeline')\"\n title=\"Timeline View\"\n >\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'table'\"\n (click)=\"setViewMode('table')\"\n title=\"Table View\"\n >\n <i class=\"fa-solid fa-table\"></i>\n </button>\n </div>\n </div>\n </div>\n <!-- 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</div>\n", styles: [".audit-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--mj-bg-page);\n}\n\n/* Header */\n.audit-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title {\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n}\n\n.audit-subtitle {\n font-size: 14px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.btn-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-brand-primary);\n}\n\n/* Stats Grid */\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--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/* Toolbar */\n.toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n/* Search */\n.search-container {\n position: relative;\n min-width: 200px;\n}\n\n.search-container i.fa-search {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.search-container input {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n background: var(--mj-bg-surface-card);\n transition: all 0.2s ease;\n}\n\n.search-container input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--mj-border-default);\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 10px;\n}\n\n.search-clear:hover {\n background: var(--mj-text-disabled);\n color: var(--mj-text-inverse);\n}\n\n.filter-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n font-size: 13px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.results-info {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n/* View Toggle */\n.view-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Timeline View */\n.timeline-container {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group {\n background: var(--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"] }]
|
|
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"] }]
|
|
868
881
|
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
869
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsAuditResourceComponent, { className: "CredentialsAuditResourceComponent", filePath: "src/Credentials/components/credentials-audit-resource.component.ts", lineNumber:
|
|
882
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsAuditResourceComponent, { className: "CredentialsAuditResourceComponent", filePath: "src/Credentials/components/credentials-audit-resource.component.ts", lineNumber: 39 }); })();
|
|
870
883
|
//# sourceMappingURL=credentials-audit-resource.component.js.map
|