@memberjunction/ng-dashboards 3.4.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -339
- package/dist/AI/components/agents/agent-configuration.component.d.ts +12 -5
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +103 -44
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +14 -5
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +149 -211
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +4 -4
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.js +4 -6
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.js +6 -7
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +0 -4
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +33 -37
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +3 -6
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +34 -27
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +22 -17
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +4 -4
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +3 -6
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +34 -32
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +33 -28
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +4 -4
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +0 -4
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +26 -27
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.js +52 -42
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.js +7 -7
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +0 -2
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +193 -189
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts +0 -2
- package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +175 -180
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts +0 -2
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +231 -225
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.d.ts +0 -2
- package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +113 -114
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +0 -2
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +294 -302
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.d.ts +0 -2
- package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +151 -155
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.d.ts +0 -2
- package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +237 -234
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +15 -14
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +3 -6
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +17 -19
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +6 -6
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.d.ts +0 -4
- package/dist/Actions/components/code-management.component.d.ts.map +1 -1
- package/dist/Actions/components/code-management.component.js +3 -9
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.d.ts +0 -4
- package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +3 -9
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +3 -6
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +13 -16
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +3 -3
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-breadcrumb.component.js +6 -6
- package/dist/Actions/components/explorer/action-breadcrumb.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +11 -10
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -4
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +10 -14
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-list-item.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-list-item.component.js +8 -8
- package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +15 -14
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-tree-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-tree-panel.component.js +11 -10
- package/dist/Actions/components/explorer/action-tree-panel.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 -4
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +10 -10
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +8 -8
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.d.ts +0 -4
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +3 -9
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.d.ts +0 -4
- package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +3 -9
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/Actions/index.d.ts +0 -7
- package/dist/Actions/index.d.ts.map +1 -1
- package/dist/Actions/index.js +0 -8
- package/dist/Actions/index.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.d.ts +0 -1
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +38 -51
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +0 -4
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +112 -108
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts +0 -4
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +210 -201
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts +0 -4
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +136 -124
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts +0 -4
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +91 -88
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +0 -4
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -122
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +0 -4
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +21 -20
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +11 -12
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +25 -22
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +16 -16
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/browser/component-browser.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/browser/component-browser.component.js +23 -21
- package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +10 -10
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +13 -13
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +7 -7
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +5 -5
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +4 -4
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +9 -9
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +4 -4
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +10 -9
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +4 -4
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +200 -196
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +195 -190
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +251 -240
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +228 -226
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +214 -210
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts +0 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +31 -44
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/Credentials/pipes/group-by.pipe.d.ts.map +1 -1
- package/dist/Credentials/pipes/group-by.pipe.js +2 -1
- package/dist/Credentials/pipes/group-by.pipe.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -80
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +46 -45
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +7 -7
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +15 -15
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +17 -11
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +2 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +83 -64
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +0 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +3 -6
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/index.d.ts +2 -2
- package/dist/DataExplorer/index.d.ts.map +1 -1
- package/dist/DataExplorer/index.js +2 -2
- package/dist/DataExplorer/index.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +0 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +6 -7
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-application.d.ts +109 -27
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +351 -75
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +48 -12
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +267 -187
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +0 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +761 -685
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +0 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +340 -316
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +0 -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 +530 -482
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +0 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +508 -455
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +44 -39
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +0 -1
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +0 -11
- package/dist/Lists/index.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts +0 -4
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +33 -39
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-log-detail-panel.component.d.ts +0 -4
- package/dist/MCP/components/mcp-log-detail-panel.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-log-detail-panel.component.js +42 -44
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts +3 -4
- package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +186 -77
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts +0 -4
- package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +187 -187
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/index.d.ts +5 -5
- package/dist/MCP/index.d.ts.map +1 -1
- package/dist/MCP/index.js +5 -5
- package/dist/MCP/index.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +65 -7
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +976 -697
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-filter-panel.component.d.ts +54 -0
- package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -0
- package/dist/MCP/mcp-filter-panel.component.js +288 -0
- package/dist/MCP/mcp-filter-panel.component.js.map +1 -0
- package/dist/MCP/mcp-resource.component.d.ts +11 -5
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +8 -9
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +16 -19
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +17 -26
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/MCP/services/mcp-tools.service.d.ts +10 -4
- package/dist/MCP/services/mcp-tools.service.d.ts.map +1 -1
- package/dist/MCP/services/mcp-tools.service.js +5 -6
- package/dist/MCP/services/mcp-tools.service.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +0 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +79 -88
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/job-slideout.component.d.ts.map +1 -1
- package/dist/Scheduling/components/job-slideout.component.js +117 -116
- package/dist/Scheduling/components/job-slideout.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +0 -4
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +3 -9
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +134 -134
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +0 -4
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +3 -9
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +102 -97
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +0 -4
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +3 -9
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +127 -122
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +0 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +35 -43
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +0 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1552 -1534
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +3 -3
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +30 -30
- package/dist/Testing/components/testing-analytics.component.js.map +1 -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 +3 -3
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +7 -7
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +3 -3
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +42 -35
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +3 -3
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +16 -16
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +3 -3
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +15 -15
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.d.ts.map +1 -1
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +73 -61
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
- package/dist/Testing/components/widgets/suite-tree.component.d.ts.map +1 -1
- package/dist/Testing/components/widgets/suite-tree.component.js +34 -31
- package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js +180 -171
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +0 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +9 -8
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts +119 -0
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -0
- package/dist/VersionHistory/components/diff-resource.component.js +1162 -0
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -0
- package/dist/VersionHistory/components/graph-resource.component.d.ts +67 -0
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -0
- package/dist/VersionHistory/components/graph-resource.component.js +521 -0
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -0
- package/dist/VersionHistory/components/index.d.ts +5 -0
- package/dist/VersionHistory/components/index.d.ts.map +1 -0
- package/dist/VersionHistory/components/index.js +5 -0
- package/dist/VersionHistory/components/index.js.map +1 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts +89 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -0
- package/dist/VersionHistory/components/labels-resource.component.js +968 -0
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts +40 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -0
- package/dist/VersionHistory/components/restore-resource.component.js +472 -0
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -0
- package/dist/VersionHistory/index.d.ts +2 -0
- package/dist/VersionHistory/index.d.ts.map +1 -0
- package/dist/VersionHistory/index.js +2 -0
- package/dist/VersionHistory/index.js.map +1 -0
- package/dist/module.d.ts +42 -36
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +41 -7
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +20 -19
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +22 -120
- package/dist/public-api.js.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.js +2 -1
- package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
- package/package.json +64 -62
|
@@ -12,14 +12,14 @@ import * as i0 from "@angular/core";
|
|
|
12
12
|
import * as i1 from "@angular/common";
|
|
13
13
|
import * as i2 from "@angular/forms";
|
|
14
14
|
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
15
|
-
function
|
|
16
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
15
|
+
function CredentialsAuditResourceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
16
|
+
i0.ɵɵelement(0, "mj-loading", 1);
|
|
17
17
|
} }
|
|
18
|
-
function
|
|
19
|
-
i0.ɵɵelementStart(0, "div",
|
|
20
|
-
i0.ɵɵelement(2, "div",
|
|
18
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_48_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementStart(0, "div", 57)(1, "div", 62);
|
|
20
|
+
i0.ɵɵelement(2, "div", 63)(3, "div", 64);
|
|
21
21
|
i0.ɵɵelementEnd();
|
|
22
|
-
i0.ɵɵelementStart(4, "span",
|
|
22
|
+
i0.ɵɵelementStart(4, "span", 65);
|
|
23
23
|
i0.ɵɵtext(5);
|
|
24
24
|
i0.ɵɵelementEnd()();
|
|
25
25
|
} if (rf & 2) {
|
|
@@ -33,36 +33,36 @@ function CredentialsAuditResourceComponent_ng_container_2_div_49_div_7_Template(
|
|
|
33
33
|
i0.ɵɵadvance(2);
|
|
34
34
|
i0.ɵɵtextInterpolate(data_r3.hour.split(":")[0]);
|
|
35
35
|
} }
|
|
36
|
-
function
|
|
37
|
-
i0.ɵɵelementStart(0, "div",
|
|
38
|
-
i0.ɵɵelement(3, "i",
|
|
36
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
i0.ɵɵelementStart(0, "div", 27)(1, "div", 53)(2, "h3");
|
|
38
|
+
i0.ɵɵelement(3, "i", 54);
|
|
39
39
|
i0.ɵɵtext(4, " Today's Activity ");
|
|
40
40
|
i0.ɵɵelementEnd()();
|
|
41
|
-
i0.ɵɵelementStart(5, "div",
|
|
42
|
-
i0.ɵɵ
|
|
41
|
+
i0.ɵɵelementStart(5, "div", 55)(6, "div", 56);
|
|
42
|
+
i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_2_Conditional_48_For_8_Template, 6, 6, "div", 57, i0.ɵɵrepeaterTrackByIdentity);
|
|
43
43
|
i0.ɵɵelementEnd()();
|
|
44
|
-
i0.ɵɵelementStart(
|
|
45
|
-
i0.ɵɵelement(
|
|
46
|
-
i0.ɵɵtext(
|
|
44
|
+
i0.ɵɵelementStart(9, "div", 58)(10, "span", 59);
|
|
45
|
+
i0.ɵɵelement(11, "span", 60);
|
|
46
|
+
i0.ɵɵtext(12, " Success ");
|
|
47
47
|
i0.ɵɵelementEnd();
|
|
48
|
-
i0.ɵɵelementStart(
|
|
49
|
-
i0.ɵɵelement(
|
|
50
|
-
i0.ɵɵtext(
|
|
48
|
+
i0.ɵɵelementStart(13, "span", 59);
|
|
49
|
+
i0.ɵɵelement(14, "span", 61);
|
|
50
|
+
i0.ɵɵtext(15, " Failed ");
|
|
51
51
|
i0.ɵɵelementEnd()()();
|
|
52
52
|
} if (rf & 2) {
|
|
53
53
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
54
54
|
i0.ɵɵadvance(7);
|
|
55
|
-
i0.ɵɵ
|
|
55
|
+
i0.ɵɵrepeater(ctx_r1.hourlyData);
|
|
56
56
|
} }
|
|
57
|
-
function
|
|
57
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_54_Template(rf, ctx) { if (rf & 1) {
|
|
58
58
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
59
|
-
i0.ɵɵelementStart(0, "button",
|
|
60
|
-
i0.ɵɵlistener("click", function
|
|
61
|
-
i0.ɵɵelement(1, "i",
|
|
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
62
|
i0.ɵɵelementEnd();
|
|
63
63
|
} }
|
|
64
|
-
function
|
|
65
|
-
i0.ɵɵelementStart(0, "option",
|
|
64
|
+
function CredentialsAuditResourceComponent_Conditional_2_For_66_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
+
i0.ɵɵelementStart(0, "option", 38);
|
|
66
66
|
i0.ɵɵtext(1);
|
|
67
67
|
i0.ɵɵelementEnd();
|
|
68
68
|
} if (rf & 2) {
|
|
@@ -71,8 +71,8 @@ function CredentialsAuditResourceComponent_ng_container_2_option_66_Template(rf,
|
|
|
71
71
|
i0.ɵɵadvance();
|
|
72
72
|
i0.ɵɵtextInterpolate(op_r5);
|
|
73
73
|
} }
|
|
74
|
-
function
|
|
75
|
-
i0.ɵɵelementStart(0, "div",
|
|
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);
|
|
76
76
|
i0.ɵɵtext(1);
|
|
77
77
|
i0.ɵɵelementEnd();
|
|
78
78
|
} if (rf & 2) {
|
|
@@ -80,8 +80,8 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div
|
|
|
80
80
|
i0.ɵɵadvance();
|
|
81
81
|
i0.ɵɵtextInterpolate1(" ", log_r7.Description, " ");
|
|
82
82
|
} }
|
|
83
|
-
function
|
|
84
|
-
i0.ɵɵelementStart(0, "span",
|
|
83
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
84
|
+
i0.ɵɵelementStart(0, "span", 88);
|
|
85
85
|
i0.ɵɵtext(1);
|
|
86
86
|
i0.ɵɵelementEnd();
|
|
87
87
|
} if (rf & 2) {
|
|
@@ -90,9 +90,9 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_spa
|
|
|
90
90
|
i0.ɵɵadvance();
|
|
91
91
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.getSubsystem(log_r7), " ");
|
|
92
92
|
} }
|
|
93
|
-
function
|
|
94
|
-
i0.ɵɵelementStart(0, "span",
|
|
95
|
-
i0.ɵɵelement(1, "i",
|
|
93
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
94
|
+
i0.ɵɵelementStart(0, "span", 89);
|
|
95
|
+
i0.ɵɵelement(1, "i", 92);
|
|
96
96
|
i0.ɵɵtext(2);
|
|
97
97
|
i0.ɵɵelementEnd();
|
|
98
98
|
} if (rf & 2) {
|
|
@@ -100,11 +100,11 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_spa
|
|
|
100
100
|
i0.ɵɵadvance(2);
|
|
101
101
|
i0.ɵɵtextInterpolate1(" ", log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialType, " ");
|
|
102
102
|
} }
|
|
103
|
-
function
|
|
104
|
-
i0.ɵɵelementStart(0, "div",
|
|
103
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵelementStart(0, "div", 94)(1, "span", 96);
|
|
105
105
|
i0.ɵɵtext(2, "IP Address");
|
|
106
106
|
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵelementStart(3, "span",
|
|
107
|
+
i0.ɵɵelementStart(3, "span", 97);
|
|
108
108
|
i0.ɵɵtext(4);
|
|
109
109
|
i0.ɵɵelementEnd()();
|
|
110
110
|
} if (rf & 2) {
|
|
@@ -112,11 +112,11 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div
|
|
|
112
112
|
i0.ɵɵadvance(4);
|
|
113
113
|
i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.ipAddress);
|
|
114
114
|
} }
|
|
115
|
-
function
|
|
116
|
-
i0.ɵɵelementStart(0, "div",
|
|
115
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
+
i0.ɵɵelementStart(0, "div", 94)(1, "span", 96);
|
|
117
117
|
i0.ɵɵtext(2, "Duration");
|
|
118
118
|
i0.ɵɵelementEnd();
|
|
119
|
-
i0.ɵɵelementStart(3, "span",
|
|
119
|
+
i0.ɵɵelementStart(3, "span", 97);
|
|
120
120
|
i0.ɵɵtext(4);
|
|
121
121
|
i0.ɵɵelementEnd()();
|
|
122
122
|
} if (rf & 2) {
|
|
@@ -125,11 +125,11 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div
|
|
|
125
125
|
i0.ɵɵadvance(4);
|
|
126
126
|
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.duration));
|
|
127
127
|
} }
|
|
128
|
-
function
|
|
129
|
-
i0.ɵɵelementStart(0, "div",
|
|
128
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
129
|
+
i0.ɵɵelementStart(0, "div", 94)(1, "span", 96);
|
|
130
130
|
i0.ɵɵtext(2, "Credential ID");
|
|
131
131
|
i0.ɵɵelementEnd();
|
|
132
|
-
i0.ɵɵelementStart(3, "span",
|
|
132
|
+
i0.ɵɵelementStart(3, "span", 98);
|
|
133
133
|
i0.ɵɵtext(4);
|
|
134
134
|
i0.ɵɵelementEnd()();
|
|
135
135
|
} if (rf & 2) {
|
|
@@ -137,11 +137,11 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div
|
|
|
137
137
|
i0.ɵɵadvance(4);
|
|
138
138
|
i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialId);
|
|
139
139
|
} }
|
|
140
|
-
function
|
|
141
|
-
i0.ɵɵelementStart(0, "div",
|
|
140
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
+
i0.ɵɵelementStart(0, "div", 95)(1, "span", 96);
|
|
142
142
|
i0.ɵɵtext(2, "Error Message");
|
|
143
143
|
i0.ɵɵelementEnd();
|
|
144
|
-
i0.ɵɵelementStart(3, "span",
|
|
144
|
+
i0.ɵɵelementStart(3, "span", 99);
|
|
145
145
|
i0.ɵɵtext(4);
|
|
146
146
|
i0.ɵɵelementEnd()();
|
|
147
147
|
} if (rf & 2) {
|
|
@@ -149,11 +149,11 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div
|
|
|
149
149
|
i0.ɵɵadvance(4);
|
|
150
150
|
i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.errorMessage);
|
|
151
151
|
} }
|
|
152
|
-
function
|
|
153
|
-
i0.ɵɵelementStart(0, "div",
|
|
152
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
153
|
+
i0.ɵɵelementStart(0, "div", 95)(1, "span", 96);
|
|
154
154
|
i0.ɵɵtext(2, "User Agent");
|
|
155
155
|
i0.ɵɵelementEnd();
|
|
156
|
-
i0.ɵɵelementStart(3, "span",
|
|
156
|
+
i0.ɵɵelementStart(3, "span", 100);
|
|
157
157
|
i0.ɵɵtext(4);
|
|
158
158
|
i0.ɵɵelementEnd()();
|
|
159
159
|
} if (rf & 2) {
|
|
@@ -161,51 +161,56 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_div
|
|
|
161
161
|
i0.ɵɵadvance(4);
|
|
162
162
|
i0.ɵɵtextInterpolate(log_r7.parsedDetails == null ? null : log_r7.parsedDetails.userAgent);
|
|
163
163
|
} }
|
|
164
|
-
function
|
|
165
|
-
i0.ɵɵelementStart(0, "div",
|
|
166
|
-
i0.ɵɵ
|
|
164
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
165
|
+
i0.ɵɵelementStart(0, "div", 90)(1, "div", 93);
|
|
166
|
+
i0.ɵɵconditionalCreate(2, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_2_Template, 5, 1, "div", 94);
|
|
167
|
+
i0.ɵɵconditionalCreate(3, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_3_Template, 5, 1, "div", 94);
|
|
168
|
+
i0.ɵɵconditionalCreate(4, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_4_Template, 5, 1, "div", 94);
|
|
169
|
+
i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_5_Template, 5, 1, "div", 95);
|
|
170
|
+
i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Conditional_6_Template, 5, 1, "div", 95);
|
|
167
171
|
i0.ɵɵelementEnd()();
|
|
168
172
|
} if (rf & 2) {
|
|
169
173
|
const log_r7 = i0.ɵɵnextContext().$implicit;
|
|
170
174
|
i0.ɵɵadvance(2);
|
|
171
|
-
i0.ɵɵ
|
|
175
|
+
i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.ipAddress) ? 2 : -1);
|
|
172
176
|
i0.ɵɵadvance();
|
|
173
|
-
i0.ɵɵ
|
|
177
|
+
i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.duration) ? 3 : -1);
|
|
174
178
|
i0.ɵɵadvance();
|
|
175
|
-
i0.ɵɵ
|
|
179
|
+
i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialId) ? 4 : -1);
|
|
176
180
|
i0.ɵɵadvance();
|
|
177
|
-
i0.ɵɵ
|
|
181
|
+
i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.errorMessage) ? 5 : -1);
|
|
178
182
|
i0.ɵɵadvance();
|
|
179
|
-
i0.ɵɵ
|
|
183
|
+
i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.userAgent) ? 6 : -1);
|
|
180
184
|
} }
|
|
181
|
-
function
|
|
185
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
182
186
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
183
|
-
i0.ɵɵelementStart(0, "div",
|
|
184
|
-
i0.ɵɵelement(2, "div",
|
|
187
|
+
i0.ɵɵelementStart(0, "div", 74)(1, "div", 75);
|
|
188
|
+
i0.ɵɵelement(2, "div", 76);
|
|
185
189
|
i0.ɵɵelementEnd();
|
|
186
|
-
i0.ɵɵelementStart(3, "div",
|
|
187
|
-
i0.ɵɵlistener("click", function
|
|
188
|
-
i0.ɵɵelementStart(4, "div",
|
|
190
|
+
i0.ɵɵelementStart(3, "div", 77);
|
|
191
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Template_div_click_3_listener() { const log_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleLogExpand(log_r7.ID)); });
|
|
192
|
+
i0.ɵɵelementStart(4, "div", 78)(5, "div", 79);
|
|
189
193
|
i0.ɵɵelement(6, "i");
|
|
190
|
-
i0.ɵɵelementStart(7, "span",
|
|
194
|
+
i0.ɵɵelementStart(7, "span", 80);
|
|
191
195
|
i0.ɵɵtext(8);
|
|
192
196
|
i0.ɵɵelementEnd()();
|
|
193
|
-
i0.ɵɵelementStart(9, "div",
|
|
197
|
+
i0.ɵɵelementStart(9, "div", 81);
|
|
194
198
|
i0.ɵɵtext(10);
|
|
195
199
|
i0.ɵɵelementEnd()();
|
|
196
|
-
i0.ɵɵelementStart(11, "div",
|
|
197
|
-
i0.ɵɵelement(13, "i",
|
|
200
|
+
i0.ɵɵelementStart(11, "div", 82)(12, "div", 83);
|
|
201
|
+
i0.ɵɵelement(13, "i", 84);
|
|
198
202
|
i0.ɵɵtext(14);
|
|
199
203
|
i0.ɵɵelementEnd();
|
|
200
|
-
i0.ɵɵ
|
|
201
|
-
i0.ɵɵelementStart(16, "div",
|
|
204
|
+
i0.ɵɵconditionalCreate(15, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_15_Template, 2, 1, "div", 85);
|
|
205
|
+
i0.ɵɵelementStart(16, "div", 86)(17, "span", 87);
|
|
202
206
|
i0.ɵɵelement(18, "i");
|
|
203
207
|
i0.ɵɵtext(19);
|
|
204
208
|
i0.ɵɵelementEnd();
|
|
205
|
-
i0.ɵɵ
|
|
209
|
+
i0.ɵɵconditionalCreate(20, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_20_Template, 2, 1, "span", 88);
|
|
210
|
+
i0.ɵɵconditionalCreate(21, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_21_Template, 3, 1, "span", 89);
|
|
206
211
|
i0.ɵɵelementEnd()();
|
|
207
|
-
i0.ɵɵ
|
|
208
|
-
i0.ɵɵelementStart(23, "button",
|
|
212
|
+
i0.ɵɵconditionalCreate(22, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Conditional_22_Template, 7, 5, "div", 90);
|
|
213
|
+
i0.ɵɵelementStart(23, "button", 91);
|
|
209
214
|
i0.ɵɵelement(24, "i");
|
|
210
215
|
i0.ɵɵelementEnd()()();
|
|
211
216
|
} if (rf & 2) {
|
|
@@ -224,7 +229,7 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_Tem
|
|
|
224
229
|
i0.ɵɵadvance(4);
|
|
225
230
|
i0.ɵɵtextInterpolate1(" ", log_r7.User || "Unknown", " ");
|
|
226
231
|
i0.ɵɵadvance();
|
|
227
|
-
i0.ɵɵ
|
|
232
|
+
i0.ɵɵconditional(log_r7.Description ? 15 : -1);
|
|
228
233
|
i0.ɵɵadvance(2);
|
|
229
234
|
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r7.Status));
|
|
230
235
|
i0.ɵɵadvance();
|
|
@@ -232,23 +237,23 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_div_7_Tem
|
|
|
232
237
|
i0.ɵɵadvance();
|
|
233
238
|
i0.ɵɵtextInterpolate1(" ", log_r7.Status, " ");
|
|
234
239
|
i0.ɵɵadvance();
|
|
235
|
-
i0.ɵɵ
|
|
240
|
+
i0.ɵɵconditional(ctx_r1.getSubsystem(log_r7) ? 20 : -1);
|
|
236
241
|
i0.ɵɵadvance();
|
|
237
|
-
i0.ɵɵ
|
|
242
|
+
i0.ɵɵconditional((log_r7.parsedDetails == null ? null : log_r7.parsedDetails.credentialType) ? 21 : -1);
|
|
238
243
|
i0.ɵɵadvance();
|
|
239
|
-
i0.ɵɵ
|
|
244
|
+
i0.ɵɵconditional(ctx_r1.expandedLogId === log_r7.ID ? 22 : -1);
|
|
240
245
|
i0.ɵɵadvance(2);
|
|
241
246
|
i0.ɵɵclassMap(ctx_r1.expandedLogId === log_r7.ID ? "fa-solid fa-chevron-up" : "fa-solid fa-chevron-down");
|
|
242
247
|
} }
|
|
243
|
-
function
|
|
244
|
-
i0.ɵɵelementStart(0, "div",
|
|
248
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
249
|
+
i0.ɵɵelementStart(0, "div", 68)(1, "div", 69)(2, "span", 70);
|
|
245
250
|
i0.ɵɵtext(3);
|
|
246
251
|
i0.ɵɵelementEnd();
|
|
247
|
-
i0.ɵɵelementStart(4, "span",
|
|
252
|
+
i0.ɵɵelementStart(4, "span", 71);
|
|
248
253
|
i0.ɵɵtext(5);
|
|
249
254
|
i0.ɵɵelementEnd()();
|
|
250
|
-
i0.ɵɵelementStart(6, "div",
|
|
251
|
-
i0.ɵɵ
|
|
255
|
+
i0.ɵɵelementStart(6, "div", 72);
|
|
256
|
+
i0.ɵɵrepeaterCreate(7, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_For_8_Template, 25, 23, "div", 73, i0.ɵɵrepeaterTrackByIdentity);
|
|
252
257
|
i0.ɵɵelementEnd()();
|
|
253
258
|
} if (rf & 2) {
|
|
254
259
|
const group_r8 = ctx.$implicit;
|
|
@@ -257,35 +262,35 @@ function CredentialsAuditResourceComponent_ng_container_2_div_84_div_1_Template(
|
|
|
257
262
|
i0.ɵɵadvance(2);
|
|
258
263
|
i0.ɵɵtextInterpolate1("", group_r8.logs.length, " events");
|
|
259
264
|
i0.ɵɵadvance(2);
|
|
260
|
-
i0.ɵɵ
|
|
265
|
+
i0.ɵɵrepeater(group_r8.logs);
|
|
261
266
|
} }
|
|
262
|
-
function
|
|
263
|
-
i0.ɵɵelementStart(0, "div",
|
|
264
|
-
i0.ɵɵ
|
|
267
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_84_Template(rf, ctx) { if (rf & 1) {
|
|
268
|
+
i0.ɵɵelementStart(0, "div", 50);
|
|
269
|
+
i0.ɵɵrepeaterCreate(1, CredentialsAuditResourceComponent_Conditional_2_Conditional_84_For_2_Template, 9, 2, "div", 68, i0.ɵɵrepeaterTrackByIdentity);
|
|
265
270
|
i0.ɵɵelementEnd();
|
|
266
271
|
} if (rf & 2) {
|
|
267
272
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
268
273
|
i0.ɵɵadvance();
|
|
269
|
-
i0.ɵɵ
|
|
274
|
+
i0.ɵɵrepeater(ctx_r1.timelineGroups);
|
|
270
275
|
} }
|
|
271
|
-
function
|
|
272
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
276
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_85_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
277
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 103);
|
|
273
278
|
i0.ɵɵtext(2);
|
|
274
279
|
i0.ɵɵelementEnd();
|
|
275
|
-
i0.ɵɵelementStart(3, "td",
|
|
280
|
+
i0.ɵɵelementStart(3, "td", 104);
|
|
276
281
|
i0.ɵɵtext(4);
|
|
277
282
|
i0.ɵɵelementEnd();
|
|
278
|
-
i0.ɵɵelementStart(5, "td",
|
|
283
|
+
i0.ɵɵelementStart(5, "td", 105)(6, "span", 106);
|
|
279
284
|
i0.ɵɵelement(7, "i");
|
|
280
285
|
i0.ɵɵtext(8);
|
|
281
286
|
i0.ɵɵelementEnd()();
|
|
282
|
-
i0.ɵɵelementStart(9, "td",
|
|
287
|
+
i0.ɵɵelementStart(9, "td", 107);
|
|
283
288
|
i0.ɵɵtext(10);
|
|
284
289
|
i0.ɵɵelementEnd();
|
|
285
|
-
i0.ɵɵelementStart(11, "td",
|
|
290
|
+
i0.ɵɵelementStart(11, "td", 108);
|
|
286
291
|
i0.ɵɵtext(12);
|
|
287
292
|
i0.ɵɵelementEnd();
|
|
288
|
-
i0.ɵɵelementStart(13, "td",
|
|
293
|
+
i0.ɵɵelementStart(13, "td", 109)(14, "span", 87);
|
|
289
294
|
i0.ɵɵelement(15, "i");
|
|
290
295
|
i0.ɵɵtext(16);
|
|
291
296
|
i0.ɵɵelementEnd()()();
|
|
@@ -314,8 +319,8 @@ function CredentialsAuditResourceComponent_ng_container_2_div_85_tr_17_Template(
|
|
|
314
319
|
i0.ɵɵadvance();
|
|
315
320
|
i0.ɵɵtextInterpolate1(" ", log_r9.Status, " ");
|
|
316
321
|
} }
|
|
317
|
-
function
|
|
318
|
-
i0.ɵɵelementStart(0, "div",
|
|
322
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_85_Template(rf, ctx) { if (rf & 1) {
|
|
323
|
+
i0.ɵɵelementStart(0, "div", 51)(1, "table", 101)(2, "thead")(3, "tr")(4, "th");
|
|
319
324
|
i0.ɵɵtext(5, "Timestamp");
|
|
320
325
|
i0.ɵɵelementEnd();
|
|
321
326
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -334,157 +339,158 @@ function CredentialsAuditResourceComponent_ng_container_2_div_85_Template(rf, ct
|
|
|
334
339
|
i0.ɵɵtext(15, "Status");
|
|
335
340
|
i0.ɵɵelementEnd()()();
|
|
336
341
|
i0.ɵɵelementStart(16, "tbody");
|
|
337
|
-
i0.ɵɵ
|
|
342
|
+
i0.ɵɵrepeaterCreate(17, CredentialsAuditResourceComponent_Conditional_2_Conditional_85_For_18_Template, 17, 17, "tr", 102, i0.ɵɵrepeaterTrackByIdentity);
|
|
338
343
|
i0.ɵɵelementEnd()()();
|
|
339
344
|
} if (rf & 2) {
|
|
340
345
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
341
346
|
i0.ɵɵadvance(17);
|
|
342
|
-
i0.ɵɵ
|
|
347
|
+
i0.ɵɵrepeater(ctx_r1.filteredLogs);
|
|
343
348
|
} }
|
|
344
|
-
function
|
|
349
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
345
350
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
346
351
|
i0.ɵɵelementStart(0, "p");
|
|
347
352
|
i0.ɵɵtext(1, " No events match your current filters. ");
|
|
348
|
-
i0.ɵɵelementStart(2, "button",
|
|
349
|
-
i0.ɵɵlistener("click", function
|
|
353
|
+
i0.ɵɵelementStart(2, "button", 111);
|
|
354
|
+
i0.ɵɵlistener("click", function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_5_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); ctx_r1.searchText = ""; ctx_r1.selectedStatus = ""; ctx_r1.selectedOperation = ""; return i0.ɵɵresetView(ctx_r1.applyFilters()); });
|
|
350
355
|
i0.ɵɵtext(3, "Clear filters");
|
|
351
356
|
i0.ɵɵelementEnd()();
|
|
352
357
|
} }
|
|
353
|
-
function
|
|
358
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
354
359
|
i0.ɵɵelementStart(0, "p");
|
|
355
360
|
i0.ɵɵtext(1, " No credential access events in the selected time range. ");
|
|
356
361
|
i0.ɵɵelementEnd();
|
|
357
362
|
} }
|
|
358
|
-
function
|
|
359
|
-
i0.ɵɵelementStart(0, "div",
|
|
360
|
-
i0.ɵɵelement(2, "i",
|
|
363
|
+
function CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Template(rf, ctx) { if (rf & 1) {
|
|
364
|
+
i0.ɵɵelementStart(0, "div", 52)(1, "div", 110);
|
|
365
|
+
i0.ɵɵelement(2, "i", 14);
|
|
361
366
|
i0.ɵɵelementEnd();
|
|
362
367
|
i0.ɵɵelementStart(3, "h3");
|
|
363
368
|
i0.ɵɵtext(4, "No Audit Logs");
|
|
364
369
|
i0.ɵɵelementEnd();
|
|
365
|
-
i0.ɵɵ
|
|
370
|
+
i0.ɵɵconditionalCreate(5, CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_5_Template, 4, 0, "p");
|
|
371
|
+
i0.ɵɵconditionalCreate(6, CredentialsAuditResourceComponent_Conditional_2_Conditional_86_Conditional_6_Template, 2, 0, "p");
|
|
366
372
|
i0.ɵɵelementEnd();
|
|
367
373
|
} if (rf & 2) {
|
|
368
374
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
369
375
|
i0.ɵɵadvance(5);
|
|
370
|
-
i0.ɵɵ
|
|
376
|
+
i0.ɵɵconditional(ctx_r1.searchText || ctx_r1.selectedStatus || ctx_r1.selectedOperation ? 5 : -1);
|
|
371
377
|
i0.ɵɵadvance();
|
|
372
|
-
i0.ɵɵ
|
|
378
|
+
i0.ɵɵconditional(!ctx_r1.searchText && !ctx_r1.selectedStatus && !ctx_r1.selectedOperation ? 6 : -1);
|
|
373
379
|
} }
|
|
374
|
-
function
|
|
380
|
+
function CredentialsAuditResourceComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
375
381
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
376
|
-
i0.ɵɵ
|
|
377
|
-
i0.ɵɵ
|
|
378
|
-
i0.ɵɵtext(4, "Audit Trail");
|
|
382
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "h2", 4);
|
|
383
|
+
i0.ɵɵtext(3, "Audit Trail");
|
|
379
384
|
i0.ɵɵelementEnd();
|
|
380
|
-
i0.ɵɵelementStart(
|
|
381
|
-
i0.ɵɵtext(
|
|
385
|
+
i0.ɵɵelementStart(4, "p", 5);
|
|
386
|
+
i0.ɵɵtext(5, "Credential access and modification history");
|
|
382
387
|
i0.ɵɵelementEnd()();
|
|
383
|
-
i0.ɵɵelementStart(
|
|
384
|
-
i0.ɵɵlistener("click", function
|
|
385
|
-
i0.ɵɵelement(
|
|
386
|
-
i0.ɵɵelementStart(
|
|
387
|
-
i0.ɵɵtext(
|
|
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");
|
|
388
393
|
i0.ɵɵelementEnd()();
|
|
389
|
-
i0.ɵɵelementStart(
|
|
390
|
-
i0.ɵɵlistener("click", function
|
|
391
|
-
i0.ɵɵelement(
|
|
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);
|
|
392
397
|
i0.ɵɵelementEnd()()();
|
|
393
|
-
i0.ɵɵelementStart(
|
|
394
|
-
i0.ɵɵelement(
|
|
398
|
+
i0.ɵɵelementStart(13, "div", 11)(14, "div", 12)(15, "div", 13);
|
|
399
|
+
i0.ɵɵelement(16, "i", 14);
|
|
395
400
|
i0.ɵɵelementEnd();
|
|
396
|
-
i0.ɵɵelementStart(
|
|
397
|
-
i0.ɵɵtext(
|
|
401
|
+
i0.ɵɵelementStart(17, "div", 15)(18, "div", 16);
|
|
402
|
+
i0.ɵɵtext(19);
|
|
398
403
|
i0.ɵɵelementEnd();
|
|
399
|
-
i0.ɵɵelementStart(
|
|
400
|
-
i0.ɵɵtext(
|
|
404
|
+
i0.ɵɵelementStart(20, "div", 17);
|
|
405
|
+
i0.ɵɵtext(21, "Total Events");
|
|
401
406
|
i0.ɵɵelementEnd()()();
|
|
402
|
-
i0.ɵɵelementStart(
|
|
403
|
-
i0.ɵɵelement(
|
|
407
|
+
i0.ɵɵelementStart(22, "div", 12)(23, "div", 18);
|
|
408
|
+
i0.ɵɵelement(24, "i", 19);
|
|
404
409
|
i0.ɵɵelementEnd();
|
|
405
|
-
i0.ɵɵelementStart(
|
|
406
|
-
i0.ɵɵtext(
|
|
410
|
+
i0.ɵɵelementStart(25, "div", 15)(26, "div", 20);
|
|
411
|
+
i0.ɵɵtext(27);
|
|
407
412
|
i0.ɵɵelementEnd();
|
|
408
|
-
i0.ɵɵelementStart(
|
|
409
|
-
i0.ɵɵtext(
|
|
413
|
+
i0.ɵɵelementStart(28, "div", 17);
|
|
414
|
+
i0.ɵɵtext(29, "Successful");
|
|
410
415
|
i0.ɵɵelementEnd()();
|
|
411
|
-
i0.ɵɵelementStart(
|
|
412
|
-
i0.ɵɵtext(
|
|
416
|
+
i0.ɵɵelementStart(30, "div", 21);
|
|
417
|
+
i0.ɵɵtext(31);
|
|
413
418
|
i0.ɵɵelementEnd()();
|
|
414
|
-
i0.ɵɵelementStart(
|
|
415
|
-
i0.ɵɵelement(
|
|
419
|
+
i0.ɵɵelementStart(32, "div", 12)(33, "div", 22);
|
|
420
|
+
i0.ɵɵelement(34, "i", 23);
|
|
416
421
|
i0.ɵɵelementEnd();
|
|
417
|
-
i0.ɵɵelementStart(
|
|
418
|
-
i0.ɵɵtext(
|
|
422
|
+
i0.ɵɵelementStart(35, "div", 15)(36, "div", 24);
|
|
423
|
+
i0.ɵɵtext(37);
|
|
419
424
|
i0.ɵɵelementEnd();
|
|
420
|
-
i0.ɵɵelementStart(
|
|
421
|
-
i0.ɵɵtext(
|
|
425
|
+
i0.ɵɵelementStart(38, "div", 17);
|
|
426
|
+
i0.ɵɵtext(39, "Failed");
|
|
422
427
|
i0.ɵɵelementEnd()()();
|
|
423
|
-
i0.ɵɵelementStart(
|
|
424
|
-
i0.ɵɵelement(
|
|
428
|
+
i0.ɵɵelementStart(40, "div", 12)(41, "div", 25);
|
|
429
|
+
i0.ɵɵelement(42, "i", 26);
|
|
425
430
|
i0.ɵɵelementEnd();
|
|
426
|
-
i0.ɵɵelementStart(
|
|
427
|
-
i0.ɵɵtext(
|
|
431
|
+
i0.ɵɵelementStart(43, "div", 15)(44, "div", 16);
|
|
432
|
+
i0.ɵɵtext(45);
|
|
428
433
|
i0.ɵɵelementEnd();
|
|
429
|
-
i0.ɵɵelementStart(
|
|
430
|
-
i0.ɵɵtext(
|
|
434
|
+
i0.ɵɵelementStart(46, "div", 17);
|
|
435
|
+
i0.ɵɵtext(47, "Unique Users");
|
|
431
436
|
i0.ɵɵelementEnd()()()();
|
|
432
|
-
i0.ɵɵ
|
|
433
|
-
i0.ɵɵelementStart(
|
|
434
|
-
i0.ɵɵelement(
|
|
435
|
-
i0.ɵɵelementStart(
|
|
436
|
-
i0.ɵɵlistener("input", function
|
|
437
|
+
i0.ɵɵconditionalCreate(48, CredentialsAuditResourceComponent_Conditional_2_Conditional_48_Template, 16, 0, "div", 27);
|
|
438
|
+
i0.ɵɵelementStart(49, "div", 28)(50, "div", 29)(51, "div", 30);
|
|
439
|
+
i0.ɵɵelement(52, "i", 31);
|
|
440
|
+
i0.ɵɵelementStart(53, "input", 32);
|
|
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)); });
|
|
437
442
|
i0.ɵɵelementEnd();
|
|
438
|
-
i0.ɵɵ
|
|
443
|
+
i0.ɵɵconditionalCreate(54, CredentialsAuditResourceComponent_Conditional_2_Conditional_54_Template, 2, 0, "button", 33);
|
|
439
444
|
i0.ɵɵelementEnd();
|
|
440
|
-
i0.ɵɵelementStart(
|
|
441
|
-
i0.ɵɵlistener("change", function
|
|
442
|
-
i0.ɵɵelementStart(
|
|
443
|
-
i0.ɵɵtext(
|
|
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");
|
|
444
449
|
i0.ɵɵelementEnd();
|
|
445
|
-
i0.ɵɵelementStart(
|
|
446
|
-
i0.ɵɵtext(
|
|
450
|
+
i0.ɵɵelementStart(58, "option", 36);
|
|
451
|
+
i0.ɵɵtext(59, "Success");
|
|
447
452
|
i0.ɵɵelementEnd();
|
|
448
|
-
i0.ɵɵelementStart(
|
|
449
|
-
i0.ɵɵtext(
|
|
453
|
+
i0.ɵɵelementStart(60, "option", 37);
|
|
454
|
+
i0.ɵɵtext(61, "Failed");
|
|
450
455
|
i0.ɵɵelementEnd()();
|
|
451
|
-
i0.ɵɵelementStart(
|
|
452
|
-
i0.ɵɵlistener("change", function
|
|
453
|
-
i0.ɵɵelementStart(
|
|
454
|
-
i0.ɵɵtext(
|
|
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");
|
|
455
460
|
i0.ɵɵelementEnd();
|
|
456
|
-
i0.ɵɵ
|
|
461
|
+
i0.ɵɵrepeaterCreate(65, CredentialsAuditResourceComponent_Conditional_2_For_66_Template, 2, 2, "option", 38, i0.ɵɵrepeaterTrackByIdentity);
|
|
457
462
|
i0.ɵɵelementEnd();
|
|
458
|
-
i0.ɵɵelementStart(67, "select",
|
|
459
|
-
i0.ɵɵlistener("change", function
|
|
460
|
-
i0.ɵɵelementStart(68, "option",
|
|
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);
|
|
461
466
|
i0.ɵɵtext(69, "Last 24 hours");
|
|
462
467
|
i0.ɵɵelementEnd();
|
|
463
|
-
i0.ɵɵelementStart(70, "option",
|
|
468
|
+
i0.ɵɵelementStart(70, "option", 40);
|
|
464
469
|
i0.ɵɵtext(71, "Last 7 days");
|
|
465
470
|
i0.ɵɵelementEnd();
|
|
466
|
-
i0.ɵɵelementStart(72, "option",
|
|
471
|
+
i0.ɵɵelementStart(72, "option", 41);
|
|
467
472
|
i0.ɵɵtext(73, "Last 30 days");
|
|
468
473
|
i0.ɵɵelementEnd();
|
|
469
|
-
i0.ɵɵelementStart(74, "option",
|
|
474
|
+
i0.ɵɵelementStart(74, "option", 42);
|
|
470
475
|
i0.ɵɵtext(75, "Last 90 days");
|
|
471
476
|
i0.ɵɵelementEnd()()();
|
|
472
|
-
i0.ɵɵelementStart(76, "div",
|
|
477
|
+
i0.ɵɵelementStart(76, "div", 43)(77, "div", 44);
|
|
473
478
|
i0.ɵɵtext(78);
|
|
474
479
|
i0.ɵɵelementEnd();
|
|
475
|
-
i0.ɵɵelementStart(79, "div",
|
|
476
|
-
i0.ɵɵlistener("click", function
|
|
477
|
-
i0.ɵɵelement(81, "i",
|
|
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);
|
|
478
483
|
i0.ɵɵelementEnd();
|
|
479
|
-
i0.ɵɵelementStart(82, "button",
|
|
480
|
-
i0.ɵɵlistener("click", function
|
|
481
|
-
i0.ɵɵelement(83, "i",
|
|
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);
|
|
482
487
|
i0.ɵɵelementEnd()()()();
|
|
483
|
-
i0.ɵɵ
|
|
484
|
-
i0.ɵɵ
|
|
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);
|
|
485
491
|
} if (rf & 2) {
|
|
486
492
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
487
|
-
i0.ɵɵadvance(
|
|
493
|
+
i0.ɵɵadvance(19);
|
|
488
494
|
i0.ɵɵtextInterpolate(ctx_r1.auditLogs.length);
|
|
489
495
|
i0.ɵɵadvance(8);
|
|
490
496
|
i0.ɵɵtextInterpolate(ctx_r1.getSuccessCount());
|
|
@@ -495,18 +501,18 @@ function CredentialsAuditResourceComponent_ng_container_2_Template(rf, ctx) { if
|
|
|
495
501
|
i0.ɵɵadvance(8);
|
|
496
502
|
i0.ɵɵtextInterpolate(ctx_r1.getUniqueUserCount());
|
|
497
503
|
i0.ɵɵadvance(3);
|
|
498
|
-
i0.ɵɵ
|
|
504
|
+
i0.ɵɵconditional(ctx_r1.hourlyData.length > 0 ? 48 : -1);
|
|
499
505
|
i0.ɵɵadvance(5);
|
|
500
506
|
i0.ɵɵproperty("value", ctx_r1.searchText);
|
|
501
507
|
i0.ɵɵadvance();
|
|
502
|
-
i0.ɵɵ
|
|
508
|
+
i0.ɵɵconditional(ctx_r1.searchText ? 54 : -1);
|
|
503
509
|
i0.ɵɵadvance();
|
|
504
510
|
i0.ɵɵproperty("value", ctx_r1.selectedStatus);
|
|
505
511
|
i0.ɵɵadvance(7);
|
|
506
512
|
i0.ɵɵproperty("value", ctx_r1.selectedOperation);
|
|
507
513
|
i0.ɵɵadvance(3);
|
|
508
|
-
i0.ɵɵ
|
|
509
|
-
i0.ɵɵadvance();
|
|
514
|
+
i0.ɵɵrepeater(ctx_r1.getOperationList());
|
|
515
|
+
i0.ɵɵadvance(2);
|
|
510
516
|
i0.ɵɵproperty("value", ctx_r1.dateRange);
|
|
511
517
|
i0.ɵɵadvance(11);
|
|
512
518
|
i0.ɵɵtextInterpolate2(" ", ctx_r1.filteredLogs.length, " of ", ctx_r1.auditLogs.length, " events ");
|
|
@@ -515,15 +521,12 @@ function CredentialsAuditResourceComponent_ng_container_2_Template(rf, ctx) { if
|
|
|
515
521
|
i0.ɵɵadvance(2);
|
|
516
522
|
i0.ɵɵclassProp("active", ctx_r1.viewMode === "table");
|
|
517
523
|
i0.ɵɵadvance(2);
|
|
518
|
-
i0.ɵɵ
|
|
524
|
+
i0.ɵɵconditional(ctx_r1.viewMode === "timeline" && ctx_r1.timelineGroups.length > 0 ? 84 : -1);
|
|
519
525
|
i0.ɵɵadvance();
|
|
520
|
-
i0.ɵɵ
|
|
526
|
+
i0.ɵɵconditional(ctx_r1.viewMode === "table" && ctx_r1.filteredLogs.length > 0 ? 85 : -1);
|
|
521
527
|
i0.ɵɵadvance();
|
|
522
|
-
i0.ɵɵ
|
|
528
|
+
i0.ɵɵconditional(ctx_r1.filteredLogs.length === 0 ? 86 : -1);
|
|
523
529
|
} }
|
|
524
|
-
export function LoadCredentialsAuditResource() {
|
|
525
|
-
// Prevents tree-shaking
|
|
526
|
-
}
|
|
527
530
|
// The Credential Access AuditLogType ID from metadata
|
|
528
531
|
const CREDENTIAL_ACCESS_AUDIT_LOG_TYPE_ID = 'E8D4D100-E785-42D3-997F-ECFF3B0BCFC0';
|
|
529
532
|
let CredentialsAuditResourceComponent = class CredentialsAuditResourceComponent extends BaseResourceComponent {
|
|
@@ -841,16 +844,17 @@ let CredentialsAuditResourceComponent = class CredentialsAuditResourceComponent
|
|
|
841
844
|
link.click();
|
|
842
845
|
}
|
|
843
846
|
static ɵfac = function CredentialsAuditResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CredentialsAuditResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
844
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsAuditResourceComponent, selectors: [["mj-credentials-audit-resource"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [[1, "audit-container"], ["text", "Loading audit logs..."
|
|
847
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CredentialsAuditResourceComponent, selectors: [["mj-credentials-audit-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [[1, "audit-container"], ["text", "Loading audit logs..."], [1, "audit-header"], [1, "header-info"], [1, "audit-title"], [1, "audit-subtitle"], [1, "header-actions"], ["title", "Export to CSV", 1, "btn-secondary", 3, "click"], [1, "fa-solid", "fa-download"], ["title", "Refresh", 1, "btn-icon", 3, "click"], [1, "fa-solid", "fa-refresh"], [1, "stats-grid"], [1, "stat-card"], [1, "stat-icon", "total"], [1, "fa-solid", "fa-clipboard-list"], [1, "stat-content"], [1, "stat-value"], [1, "stat-label"], [1, "stat-icon", "success"], [1, "fa-solid", "fa-check-circle"], [1, "stat-value", "success"], [1, "stat-rate"], [1, "stat-icon", "failed"], [1, "fa-solid", "fa-times-circle"], [1, "stat-value", "failed"], [1, "stat-icon", "users"], [1, "fa-solid", "fa-users"], [1, "activity-chart"], [1, "toolbar"], [1, "toolbar-left"], [1, "search-container"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search logs...", 3, "input", "value"], [1, "search-clear"], [1, "filter-select", 3, "change", "value"], ["value", ""], ["value", "Success"], ["value", "Failed"], [3, "value"], ["value", "1"], ["value", "7"], ["value", "30"], ["value", "90"], [1, "toolbar-right"], [1, "results-info"], [1, "view-toggle"], ["title", "Timeline View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-timeline"], ["title", "Table View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-table"], [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, "search-clear", 3, "click"], [1, "fa-solid", "fa-times"], [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) {
|
|
845
848
|
i0.ɵɵelementStart(0, "div", 0);
|
|
846
|
-
i0.ɵɵ
|
|
849
|
+
i0.ɵɵconditionalCreate(1, CredentialsAuditResourceComponent_Conditional_1_Template, 1, 0, "mj-loading", 1);
|
|
850
|
+
i0.ɵɵconditionalCreate(2, CredentialsAuditResourceComponent_Conditional_2_Template, 87, 20);
|
|
847
851
|
i0.ɵɵelementEnd();
|
|
848
852
|
} if (rf & 2) {
|
|
849
853
|
i0.ɵɵadvance();
|
|
850
|
-
i0.ɵɵ
|
|
854
|
+
i0.ɵɵconditional(ctx.isLoading ? 1 : -1);
|
|
851
855
|
i0.ɵɵadvance();
|
|
852
|
-
i0.ɵɵ
|
|
853
|
-
} }, dependencies: [i1.NgClass, i1.NgForOf, i1.NgIf, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i3.LoadingComponent], styles: [".audit-container[_ngcontent-%COMP%] {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--background-secondary, #f8fafc);\n}\n\n\n\n.audit-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.audit-subtitle[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #374151);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n border-color: var(--accent-color, #6366f1);\n color: var(--accent-color, #6366f1);\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n color: var(--accent-color, #6366f1);\n}\n\n\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total[_ngcontent-%COMP%] {\n background: rgba(99, 102, 241, 0.1);\n color: #6366f1;\n}\n\n.stat-icon.success[_ngcontent-%COMP%] {\n background: rgba(16, 185, 129, 0.1);\n color: #10b981;\n}\n\n.stat-icon.failed[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.1);\n color: #ef4444;\n}\n\n.stat-icon.users[_ngcontent-%COMP%] {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n}\n\n.stat-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n}\n\n.stat-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n line-height: 1;\n}\n\n.stat-value.success[_ngcontent-%COMP%] {\n color: #10b981;\n}\n\n.stat-value.failed[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-top: 4px;\n}\n\n.stat-rate[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: #10b981;\n background: rgba(16, 185, 129, 0.1);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n\n\n.activity-chart[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--accent-color, #6366f1);\n}\n\n.chart-container[_ngcontent-%COMP%] {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar[_ngcontent-%COMP%] {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--bar-background, #f3f4f6);\n}\n\n.bar-segment[_ngcontent-%COMP%] {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success[_ngcontent-%COMP%] {\n background: linear-gradient(180deg, #10b981 0%, #059669 100%);\n}\n\n.bar-segment.failed[_ngcontent-%COMP%] {\n background: linear-gradient(180deg, #ef4444 0%, #dc2626 100%);\n}\n\n.chart-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--text-secondary, #9ca3af);\n margin-top: 4px;\n}\n\n.chart-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--border-color, #f3f4f6);\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n}\n\n.legend-color[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success[_ngcontent-%COMP%] {\n background: #10b981;\n}\n\n.legend-color.failed[_ngcontent-%COMP%] {\n background: #ef4444;\n}\n\n\n\n.toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n position: relative;\n min-width: 200px;\n}\n\n.search-container[_ngcontent-%COMP%] i.fa-search[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-secondary, #9ca3af);\n font-size: 13px;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n background: var(--input-background, #f9fafb);\n transition: all 0.2s ease;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n background: white;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--button-hover, #e5e7eb);\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n}\n\n.search-clear[_ngcontent-%COMP%]:hover {\n background: var(--text-secondary, #9ca3af);\n color: white;\n}\n\n.filter-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--input-background, #f9fafb);\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n}\n\n.results-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--toggle-background, #f3f4f6);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--text-primary, #1f2937);\n}\n\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n color: var(--accent-color, #6366f1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.timeline-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.date-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.date-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n background: var(--badge-background, #e5e7eb);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.timeline-item[_ngcontent-%COMP%] {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%]:hover {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timeline-line[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.operation-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n font-family: monospace;\n color: var(--text-secondary, #6b7280);\n}\n\n.timeline-body[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.timeline-user[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-bottom: 4px;\n}\n\n.timeline-user[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.timeline-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-primary, #374151);\n margin-bottom: 8px;\n}\n\n.timeline-badges[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.failed[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-badge.unknown[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.subsystem-badge[_ngcontent-%COMP%], \n.type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--badge-background, #f3f4f6);\n border-radius: 12px;\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n}\n\n.type-badge[_ngcontent-%COMP%] {\n background: rgba(99, 102, 241, 0.1);\n color: var(--accent-color, #6366f1);\n}\n\n.type-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.timeline-details[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 16px;\n background: var(--detail-background, #f9fafb);\n border-radius: 8px;\n border: 1px solid var(--border-color, #e5e7eb);\n}\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n}\n\n.detail-value.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small[_ngcontent-%COMP%] {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error[_ngcontent-%COMP%] {\n color: #dc2626;\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--text-secondary, #9ca3af);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--accent-color, #6366f1);\n}\n\n.expand-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.audit-table-container[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n}\n\n.audit-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: var(--hover-background, #f9fafb);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timestamp[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n white-space: nowrap;\n}\n\n.user[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.operation-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.description[_ngcontent-%COMP%] {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem[_ngcontent-%COMP%] {\n color: var(--text-secondary, #6b7280);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--text-secondary, #d1d5db);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--accent-color, #6366f1);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n\n\n@media (max-width: 1200px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .audit-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .toolbar[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .search-container[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .toolbar-right[_ngcontent-%COMP%] {\n justify-content: space-between;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .chart-label[_ngcontent-%COMP%] {\n display: none;\n }\n\n .chart-label[_ngcontent-%COMP%]:nth-child(4n+1) {\n display: block;\n }\n}"], changeDetection: 0 });
|
|
856
|
+
i0.ɵɵconditional(!ctx.isLoading ? 2 : -1);
|
|
857
|
+
} }, 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(--background-secondary, #f8fafc);\n}\n\n\n\n.audit-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.audit-subtitle[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #374151);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n border-color: var(--accent-color, #6366f1);\n color: var(--accent-color, #6366f1);\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n color: var(--accent-color, #6366f1);\n}\n\n\n\n.stats-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total[_ngcontent-%COMP%] {\n background: rgba(99, 102, 241, 0.1);\n color: #6366f1;\n}\n\n.stat-icon.success[_ngcontent-%COMP%] {\n background: rgba(16, 185, 129, 0.1);\n color: #10b981;\n}\n\n.stat-icon.failed[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.1);\n color: #ef4444;\n}\n\n.stat-icon.users[_ngcontent-%COMP%] {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n}\n\n.stat-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n}\n\n.stat-content[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n line-height: 1;\n}\n\n.stat-value.success[_ngcontent-%COMP%] {\n color: #10b981;\n}\n\n.stat-value.failed[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-top: 4px;\n}\n\n.stat-rate[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: #10b981;\n background: rgba(16, 185, 129, 0.1);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n\n\n.activity-chart[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.chart-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--accent-color, #6366f1);\n}\n\n.chart-container[_ngcontent-%COMP%] {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar[_ngcontent-%COMP%] {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--bar-background, #f3f4f6);\n}\n\n.bar-segment[_ngcontent-%COMP%] {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success[_ngcontent-%COMP%] {\n background: linear-gradient(180deg, #10b981 0%, #059669 100%);\n}\n\n.bar-segment.failed[_ngcontent-%COMP%] {\n background: linear-gradient(180deg, #ef4444 0%, #dc2626 100%);\n}\n\n.chart-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--text-secondary, #9ca3af);\n margin-top: 4px;\n}\n\n.chart-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--border-color, #f3f4f6);\n}\n\n.legend-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n}\n\n.legend-color[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success[_ngcontent-%COMP%] {\n background: #10b981;\n}\n\n.legend-color.failed[_ngcontent-%COMP%] {\n background: #ef4444;\n}\n\n\n\n.toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n position: relative;\n min-width: 200px;\n}\n\n.search-container[_ngcontent-%COMP%] i.fa-search[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-secondary, #9ca3af);\n font-size: 13px;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n background: var(--input-background, #f9fafb);\n transition: all 0.2s ease;\n}\n\n.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n background: white;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--button-hover, #e5e7eb);\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n}\n\n.search-clear[_ngcontent-%COMP%]:hover {\n background: var(--text-secondary, #9ca3af);\n color: white;\n}\n\n.filter-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--input-background, #f9fafb);\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n}\n\n.results-info[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--toggle-background, #f3f4f6);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--text-primary, #1f2937);\n}\n\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n color: var(--accent-color, #6366f1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.timeline-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.date-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.date-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n background: var(--badge-background, #e5e7eb);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.timeline-item[_ngcontent-%COMP%] {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item[_ngcontent-%COMP%]:hover {\n background: var(--hover-background, #f9fafb);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.timeline-item.failed[_ngcontent-%COMP%]:hover {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timeline-line[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot[_ngcontent-%COMP%] {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.operation-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.timeline-time[_ngcontent-%COMP%] {\n font-size: 12px;\n font-family: monospace;\n color: var(--text-secondary, #6b7280);\n}\n\n.timeline-body[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.timeline-user[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-bottom: 4px;\n}\n\n.timeline-user[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.timeline-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-primary, #374151);\n margin-bottom: 8px;\n}\n\n.timeline-badges[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.failed[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-badge.unknown[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.subsystem-badge[_ngcontent-%COMP%], \n.type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--badge-background, #f3f4f6);\n border-radius: 12px;\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n}\n\n.type-badge[_ngcontent-%COMP%] {\n background: rgba(99, 102, 241, 0.1);\n color: var(--accent-color, #6366f1);\n}\n\n.type-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.timeline-details[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 16px;\n background: var(--detail-background, #f9fafb);\n border-radius: 8px;\n border: 1px solid var(--border-color, #e5e7eb);\n}\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n}\n\n.detail-value.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small[_ngcontent-%COMP%] {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error[_ngcontent-%COMP%] {\n color: #dc2626;\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--text-secondary, #9ca3af);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n color: var(--accent-color, #6366f1);\n}\n\n.expand-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.audit-table-container[_ngcontent-%COMP%] {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n}\n\n.audit-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.audit-table[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: var(--hover-background, #f9fafb);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.audit-table[_ngcontent-%COMP%] tr.failed-row[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timestamp[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n white-space: nowrap;\n}\n\n.user[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.operation-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.description[_ngcontent-%COMP%] {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem[_ngcontent-%COMP%] {\n color: var(--text-secondary, #6b7280);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--text-secondary, #d1d5db);\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.btn-link[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--accent-color, #6366f1);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link[_ngcontent-%COMP%]:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n\n\n@media (max-width: 1200px) {\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .audit-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .toolbar[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .search-container[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .toolbar-right[_ngcontent-%COMP%] {\n justify-content: space-between;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .chart-label[_ngcontent-%COMP%] {\n display: none;\n }\n\n .chart-label[_ngcontent-%COMP%]:nth-child(4n+1) {\n display: block;\n }\n}"], changeDetection: 0 });
|
|
854
858
|
};
|
|
855
859
|
CredentialsAuditResourceComponent = __decorate([
|
|
856
860
|
RegisterClass(BaseResourceComponent, 'CredentialsAuditResource')
|
|
@@ -858,7 +862,7 @@ CredentialsAuditResourceComponent = __decorate([
|
|
|
858
862
|
export { CredentialsAuditResourceComponent };
|
|
859
863
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CredentialsAuditResourceComponent, [{
|
|
860
864
|
type: Component,
|
|
861
|
-
args: [{ selector: 'mj-credentials-audit-resource', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"audit-container\">\n <mj-loading *ngIf=\"isLoading\" text=\"Loading audit logs...\"></mj-loading>\n\n <ng-container *ngIf=\"!isLoading\">\n <!-- Header -->\n <div class=\"audit-header\">\n <div class=\"header-info\">\n <h2 class=\"audit-title\">Audit Trail</h2>\n <p class=\"audit-subtitle\">Credential access and modification history</p>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-secondary\" (click)=\"exportToCSV()\" title=\"Export to CSV\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Export</span>\n </button>\n <button class=\"btn-icon\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n </div>\n </div>\n\n <!-- Stats Cards -->\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-icon total\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{auditLogs.length}}</div>\n <div class=\"stat-label\">Total Events</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value success\">{{getSuccessCount()}}</div>\n <div class=\"stat-label\">Successful</div>\n </div>\n <div class=\"stat-rate\">{{getSuccessRate()}}%</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon failed\">\n <i class=\"fa-solid fa-times-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value failed\">{{getFailedCount()}}</div>\n <div class=\"stat-label\">Failed</div>\n </div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-icon users\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\">{{getUniqueUserCount()}}</div>\n <div class=\"stat-label\">Unique Users</div>\n </div>\n </div>\n </div>\n\n <!-- Activity Chart -->\n <div class=\"activity-chart\" *ngIf=\"hourlyData.length > 0\">\n <div class=\"chart-header\">\n <h3>\n <i class=\"fa-solid fa-chart-bar\"></i>\n Today's Activity\n </h3>\n </div>\n <div class=\"chart-container\">\n <div class=\"chart-bars\">\n <div\n class=\"chart-bar-wrapper\"\n *ngFor=\"let data of hourlyData\"\n [title]=\"data.hour + ': ' + (data.success + data.failed) + ' events'\"\n >\n <div class=\"chart-bar\">\n <div\n class=\"bar-segment success\"\n [style.height.%]=\"(data.success / getMaxHourlyCount()) * 100\"\n ></div>\n <div\n class=\"bar-segment failed\"\n [style.height.%]=\"(data.failed / getMaxHourlyCount()) * 100\"\n ></div>\n </div>\n <span class=\"chart-label\">{{data.hour.split(':')[0]}}</span>\n </div>\n </div>\n </div>\n <div class=\"chart-legend\">\n <span class=\"legend-item\">\n <span class=\"legend-color success\"></span>\n Success\n </span>\n <span class=\"legend-item\">\n <span class=\"legend-color failed\"></span>\n Failed\n </span>\n </div>\n </div>\n\n <!-- Toolbar -->\n <div class=\"toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search logs...\"\n [value]=\"searchText\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n <button class=\"search-clear\" *ngIf=\"searchText\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <select\n class=\"filter-select\"\n [value]=\"selectedStatus\"\n (change)=\"onStatusFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Statuses</option>\n <option value=\"Success\">Success</option>\n <option value=\"Failed\">Failed</option>\n </select>\n\n <select\n class=\"filter-select\"\n [value]=\"selectedOperation\"\n (change)=\"onOperationFilterChange($any($event.target).value)\"\n >\n <option value=\"\">All Operations</option>\n <option *ngFor=\"let op of getOperationList()\" [value]=\"op\">{{op}}</option>\n </select>\n\n <select\n class=\"filter-select\"\n [value]=\"dateRange\"\n (change)=\"onDateRangeChange($any($event.target).value)\"\n >\n <option value=\"1\">Last 24 hours</option>\n <option value=\"7\">Last 7 days</option>\n <option value=\"30\">Last 30 days</option>\n <option value=\"90\">Last 90 days</option>\n </select>\n </div>\n\n <div class=\"toolbar-right\">\n <div class=\"results-info\">\n {{filteredLogs.length}} of {{auditLogs.length}} events\n </div>\n <div class=\"view-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'timeline'\"\n (click)=\"setViewMode('timeline')\"\n title=\"Timeline View\"\n >\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'table'\"\n (click)=\"setViewMode('table')\"\n title=\"Table View\"\n >\n <i class=\"fa-solid fa-table\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Timeline View -->\n <div class=\"timeline-container\" *ngIf=\"viewMode === 'timeline' && timelineGroups.length > 0\">\n <div class=\"timeline-group\" *ngFor=\"let group of timelineGroups\">\n <div class=\"timeline-date\">\n <span class=\"date-label\">{{group.displayDate}}</span>\n <span class=\"date-count\">{{group.logs.length}} events</span>\n </div>\n <div class=\"timeline-items\">\n <div\n class=\"timeline-item\"\n *ngFor=\"let log of group.logs\"\n [class.expanded]=\"expandedLogId === log.ID\"\n [class.failed]=\"log.Status === 'Failed'\"\n >\n <div class=\"timeline-line\">\n <div\n class=\"timeline-dot\"\n [style.backgroundColor]=\"getOperationColor(getOperationType(log))\"\n ></div>\n </div>\n <div class=\"timeline-content\" (click)=\"toggleLogExpand(log.ID)\">\n <div class=\"timeline-header\">\n <div class=\"timeline-operation\">\n <i [class]=\"getOperationIcon(getOperationType(log))\" [style.color]=\"getOperationColor(getOperationType(log))\"></i>\n <span class=\"operation-name\">{{getOperationType(log)}}</span>\n </div>\n <div class=\"timeline-time\">{{formatTime(log.__mj_CreatedAt)}}</div>\n </div>\n <div class=\"timeline-body\">\n <div class=\"timeline-user\">\n <i class=\"fa-solid fa-user\"></i>\n {{log.User || 'Unknown'}}\n </div>\n <div class=\"timeline-description\" *ngIf=\"log.Description\">\n {{log.Description}}\n </div>\n <div class=\"timeline-badges\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n <i [class]=\"log.Status === 'Success' ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n {{log.Status}}\n </span>\n <span class=\"subsystem-badge\" *ngIf=\"getSubsystem(log)\">\n {{getSubsystem(log)}}\n </span>\n <span class=\"type-badge\" *ngIf=\"log.parsedDetails?.credentialType\">\n <i class=\"fa-solid fa-key\"></i>\n {{log.parsedDetails?.credentialType}}\n </span>\n </div>\n </div>\n <div class=\"timeline-details\" *ngIf=\"expandedLogId === log.ID\">\n <div class=\"detail-grid\">\n <div class=\"detail-item\" *ngIf=\"log.parsedDetails?.ipAddress\">\n <span class=\"detail-label\">IP Address</span>\n <span class=\"detail-value\">{{log.parsedDetails?.ipAddress}}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"log.parsedDetails?.duration\">\n <span class=\"detail-label\">Duration</span>\n <span class=\"detail-value\">{{formatDuration(log.parsedDetails?.duration)}}</span>\n </div>\n <div class=\"detail-item\" *ngIf=\"log.parsedDetails?.credentialId\">\n <span class=\"detail-label\">Credential ID</span>\n <span class=\"detail-value mono\">{{log.parsedDetails?.credentialId}}</span>\n </div>\n <div class=\"detail-item full-width\" *ngIf=\"log.parsedDetails?.errorMessage\">\n <span class=\"detail-label\">Error Message</span>\n <span class=\"detail-value error\">{{log.parsedDetails?.errorMessage}}</span>\n </div>\n <div class=\"detail-item full-width\" *ngIf=\"log.parsedDetails?.userAgent\">\n <span class=\"detail-label\">User Agent</span>\n <span class=\"detail-value mono small\">{{log.parsedDetails?.userAgent}}</span>\n </div>\n </div>\n </div>\n <button class=\"expand-btn\">\n <i [class]=\"expandedLogId === log.ID ? 'fa-solid fa-chevron-up' : 'fa-solid fa-chevron-down'\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Table View -->\n <div class=\"audit-table-container\" *ngIf=\"viewMode === 'table' && filteredLogs.length > 0\">\n <table class=\"audit-table\">\n <thead>\n <tr>\n <th>Timestamp</th>\n <th>User</th>\n <th>Operation</th>\n <th>Description</th>\n <th>Subsystem</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let log of filteredLogs\" [class.failed-row]=\"log.Status === 'Failed'\">\n <td class=\"timestamp\">{{formatDate(log.__mj_CreatedAt)}}</td>\n <td class=\"user\">{{log.User || 'Unknown'}}</td>\n <td class=\"operation\">\n <span class=\"operation-badge\" [style.backgroundColor]=\"getOperationColor(getOperationType(log)) + '20'\" [style.color]=\"getOperationColor(getOperationType(log))\">\n <i [class]=\"getOperationIcon(getOperationType(log))\"></i>\n {{getOperationType(log)}}\n </span>\n </td>\n <td class=\"description\">{{log.Description || '-'}}</td>\n <td class=\"subsystem\">{{getSubsystem(log) || '-'}}</td>\n <td class=\"status\">\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n <i [class]=\"log.Status === 'Success' ? 'fa-solid fa-check' : 'fa-solid fa-times'\"></i>\n {{log.Status}}\n </span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Empty State -->\n <div class=\"empty-state\" *ngIf=\"filteredLogs.length === 0\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-clipboard-list\"></i>\n </div>\n <h3>No Audit Logs</h3>\n <p *ngIf=\"searchText || selectedStatus || selectedOperation\">\n No events match your current filters.\n <button class=\"btn-link\" (click)=\"searchText = ''; selectedStatus = ''; selectedOperation = ''; applyFilters()\">Clear filters</button>\n </p>\n <p *ngIf=\"!searchText && !selectedStatus && !selectedOperation\">\n No credential access events in the selected time range.\n </p>\n </div>\n </ng-container>\n</div>\n", styles: [".audit-container {\n padding: 24px;\n height: 100%;\n overflow-y: auto;\n background: var(--background-secondary, #f8fafc);\n}\n\n/* Header */\n.audit-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title {\n font-size: 24px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.audit-subtitle {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #374151);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary:hover {\n background: var(--hover-background, #f9fafb);\n border-color: var(--accent-color, #6366f1);\n color: var(--accent-color, #6366f1);\n}\n\n.btn-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon:hover {\n background: var(--hover-background, #f9fafb);\n color: var(--accent-color, #6366f1);\n}\n\n/* Stats Grid */\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total {\n background: rgba(99, 102, 241, 0.1);\n color: #6366f1;\n}\n\n.stat-icon.success {\n background: rgba(16, 185, 129, 0.1);\n color: #10b981;\n}\n\n.stat-icon.failed {\n background: rgba(239, 68, 68, 0.1);\n color: #ef4444;\n}\n\n.stat-icon.users {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n}\n\n.stat-icon i {\n font-size: 20px;\n}\n\n.stat-content {\n flex: 1;\n}\n\n.stat-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n line-height: 1;\n}\n\n.stat-value.success {\n color: #10b981;\n}\n\n.stat-value.failed {\n color: #ef4444;\n}\n\n.stat-label {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-top: 4px;\n}\n\n.stat-rate {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: #10b981;\n background: rgba(16, 185, 129, 0.1);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n/* Activity Chart */\n.activity-chart {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header {\n margin-bottom: 16px;\n}\n\n.chart-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.chart-header h3 i {\n color: var(--accent-color, #6366f1);\n}\n\n.chart-container {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--bar-background, #f3f4f6);\n}\n\n.bar-segment {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success {\n background: linear-gradient(180deg, #10b981 0%, #059669 100%);\n}\n\n.bar-segment.failed {\n background: linear-gradient(180deg, #ef4444 0%, #dc2626 100%);\n}\n\n.chart-label {\n font-size: 10px;\n color: var(--text-secondary, #9ca3af);\n margin-top: 4px;\n}\n\n.chart-legend {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--border-color, #f3f4f6);\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n}\n\n.legend-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success {\n background: #10b981;\n}\n\n.legend-color.failed {\n background: #ef4444;\n}\n\n/* Toolbar */\n.toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n/* Search */\n.search-container {\n position: relative;\n min-width: 200px;\n}\n\n.search-container i.fa-search {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-secondary, #9ca3af);\n font-size: 13px;\n}\n\n.search-container input {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n background: var(--input-background, #f9fafb);\n transition: all 0.2s ease;\n}\n\n.search-container input:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n background: white;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--button-hover, #e5e7eb);\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n}\n\n.search-clear:hover {\n background: var(--text-secondary, #9ca3af);\n color: white;\n}\n\n.filter-select {\n padding: 8px 12px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--input-background, #f9fafb);\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n}\n\n.results-info {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n/* View Toggle */\n.view-toggle {\n display: flex;\n background: var(--toggle-background, #f3f4f6);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn:hover {\n color: var(--text-primary, #1f2937);\n}\n\n.toggle-btn.active {\n background: var(--card-background, #ffffff);\n color: var(--accent-color, #6366f1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Timeline View */\n.timeline-container {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.date-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.date-count {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n background: var(--badge-background, #e5e7eb);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items {\n padding: 8px 0;\n}\n\n.timeline-item {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item:hover {\n background: var(--hover-background, #f9fafb);\n}\n\n.timeline-item.failed {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.timeline-item.failed:hover {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timeline-line {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation i {\n font-size: 14px;\n}\n\n.operation-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.timeline-time {\n font-size: 12px;\n font-family: monospace;\n color: var(--text-secondary, #6b7280);\n}\n\n.timeline-body {\n margin-bottom: 8px;\n}\n\n.timeline-user {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-bottom: 4px;\n}\n\n.timeline-user i {\n font-size: 11px;\n}\n\n.timeline-description {\n font-size: 13px;\n color: var(--text-primary, #374151);\n margin-bottom: 8px;\n}\n\n.timeline-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.failed {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-badge.unknown {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-badge i {\n font-size: 10px;\n}\n\n.subsystem-badge,\n.type-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--badge-background, #f3f4f6);\n border-radius: 12px;\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n}\n\n.type-badge {\n background: rgba(99, 102, 241, 0.1);\n color: var(--accent-color, #6366f1);\n}\n\n.type-badge i {\n font-size: 10px;\n}\n\n/* Timeline Details */\n.timeline-details {\n margin-top: 12px;\n padding: 16px;\n background: var(--detail-background, #f9fafb);\n border-radius: 8px;\n border: 1px solid var(--border-color, #e5e7eb);\n}\n\n.detail-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n}\n\n.detail-value {\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n}\n\n.detail-value.mono {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error {\n color: #dc2626;\n}\n\n.expand-btn {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--text-secondary, #9ca3af);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn:hover {\n color: var(--accent-color, #6366f1);\n}\n\n.expand-btn i {\n font-size: 10px;\n}\n\n/* Table View */\n.audit-table-container {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table th {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n}\n\n.audit-table td {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.audit-table tr:last-child td {\n border-bottom: none;\n}\n\n.audit-table tr:hover td {\n background: var(--hover-background, #f9fafb);\n}\n\n.audit-table tr.failed-row td {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.audit-table tr.failed-row:hover td {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timestamp {\n font-family: monospace;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n white-space: nowrap;\n}\n\n.user {\n font-weight: 500;\n}\n\n.operation-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge i {\n font-size: 10px;\n}\n\n.description {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem {\n color: var(--text-secondary, #6b7280);\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon i {\n font-size: 32px;\n color: var(--text-secondary, #d1d5db);\n}\n\n.empty-state h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.empty-state p {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--accent-color, #6366f1);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n/* Responsive */\n@media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container {\n padding: 16px;\n }\n\n .audit-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid {\n grid-template-columns: 1fr;\n }\n\n .toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left {\n flex-direction: column;\n }\n\n .search-container {\n width: 100%;\n }\n\n .filter-select {\n width: 100%;\n }\n\n .toolbar-right {\n justify-content: space-between;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n\n .chart-label {\n display: none;\n }\n\n .chart-label:nth-child(4n+1) {\n display: block;\n }\n}\n"] }]
|
|
865
|
+
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(--background-secondary, #f8fafc);\n}\n\n/* Header */\n.audit-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.header-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.audit-title {\n font-size: 24px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.audit-subtitle {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n}\n\n.btn-secondary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--text-primary, #374151);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-secondary:hover {\n background: var(--hover-background, #f9fafb);\n border-color: var(--accent-color, #6366f1);\n color: var(--accent-color, #6366f1);\n}\n\n.btn-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--card-background, #ffffff);\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.btn-icon:hover {\n background: var(--hover-background, #f9fafb);\n color: var(--accent-color, #6366f1);\n}\n\n/* Stats Grid */\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n}\n\n.stat-icon {\n width: 48px;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n flex-shrink: 0;\n}\n\n.stat-icon.total {\n background: rgba(99, 102, 241, 0.1);\n color: #6366f1;\n}\n\n.stat-icon.success {\n background: rgba(16, 185, 129, 0.1);\n color: #10b981;\n}\n\n.stat-icon.failed {\n background: rgba(239, 68, 68, 0.1);\n color: #ef4444;\n}\n\n.stat-icon.users {\n background: rgba(139, 92, 246, 0.1);\n color: #8b5cf6;\n}\n\n.stat-icon i {\n font-size: 20px;\n}\n\n.stat-content {\n flex: 1;\n}\n\n.stat-value {\n font-size: 28px;\n font-weight: 700;\n color: var(--text-primary, #1f2937);\n line-height: 1;\n}\n\n.stat-value.success {\n color: #10b981;\n}\n\n.stat-value.failed {\n color: #ef4444;\n}\n\n.stat-label {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-top: 4px;\n}\n\n.stat-rate {\n position: absolute;\n top: 12px;\n right: 16px;\n font-size: 12px;\n font-weight: 600;\n color: #10b981;\n background: rgba(16, 185, 129, 0.1);\n padding: 4px 8px;\n border-radius: 8px;\n}\n\n/* Activity Chart */\n.activity-chart {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n padding: 20px;\n margin-bottom: 20px;\n}\n\n.chart-header {\n margin-bottom: 16px;\n}\n\n.chart-header h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0;\n}\n\n.chart-header h3 i {\n color: var(--accent-color, #6366f1);\n}\n\n.chart-container {\n height: 120px;\n padding: 0 4px;\n}\n\n.chart-bars {\n display: flex;\n align-items: flex-end;\n height: 100%;\n gap: 2px;\n}\n\n.chart-bar-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n\n.chart-bar {\n flex: 1;\n width: 100%;\n max-width: 24px;\n display: flex;\n flex-direction: column-reverse;\n border-radius: 4px 4px 0 0;\n overflow: hidden;\n background: var(--bar-background, #f3f4f6);\n}\n\n.bar-segment {\n width: 100%;\n transition: height 0.3s ease;\n}\n\n.bar-segment.success {\n background: linear-gradient(180deg, #10b981 0%, #059669 100%);\n}\n\n.bar-segment.failed {\n background: linear-gradient(180deg, #ef4444 0%, #dc2626 100%);\n}\n\n.chart-label {\n font-size: 10px;\n color: var(--text-secondary, #9ca3af);\n margin-top: 4px;\n}\n\n.chart-legend {\n display: flex;\n justify-content: center;\n gap: 24px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--border-color, #f3f4f6);\n}\n\n.legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n}\n\n.legend-color {\n width: 12px;\n height: 12px;\n border-radius: 3px;\n}\n\n.legend-color.success {\n background: #10b981;\n}\n\n.legend-color.failed {\n background: #ef4444;\n}\n\n/* Toolbar */\n.toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n margin-bottom: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.toolbar-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.toolbar-right {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n/* Search */\n.search-container {\n position: relative;\n min-width: 200px;\n}\n\n.search-container i.fa-search {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--text-secondary, #9ca3af);\n font-size: 13px;\n}\n\n.search-container input {\n width: 100%;\n padding: 8px 36px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n font-size: 13px;\n background: var(--input-background, #f9fafb);\n transition: all 0.2s ease;\n}\n\n.search-container input:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n background: white;\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: var(--button-hover, #e5e7eb);\n border-radius: 50%;\n cursor: pointer;\n color: var(--text-secondary, #6b7280);\n font-size: 10px;\n}\n\n.search-clear:hover {\n background: var(--text-secondary, #9ca3af);\n color: white;\n}\n\n.filter-select {\n padding: 8px 12px;\n border: 1px solid var(--border-color, #e5e7eb);\n border-radius: 8px;\n background: var(--input-background, #f9fafb);\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: var(--accent-color, #6366f1);\n}\n\n.results-info {\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n}\n\n/* View Toggle */\n.view-toggle {\n display: flex;\n background: var(--toggle-background, #f3f4f6);\n border-radius: 8px;\n padding: 4px;\n}\n\n.toggle-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--text-secondary, #6b7280);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.toggle-btn:hover {\n color: var(--text-primary, #1f2937);\n}\n\n.toggle-btn.active {\n background: var(--card-background, #ffffff);\n color: var(--accent-color, #6366f1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Timeline View */\n.timeline-container {\n display: flex;\n flex-direction: column;\n gap: 24px;\n}\n\n.timeline-group {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.timeline-date {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.date-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.date-count {\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n background: var(--badge-background, #e5e7eb);\n padding: 4px 10px;\n border-radius: 12px;\n}\n\n.timeline-items {\n padding: 8px 0;\n}\n\n.timeline-item {\n display: flex;\n padding: 12px 20px;\n transition: background 0.2s ease;\n}\n\n.timeline-item:hover {\n background: var(--hover-background, #f9fafb);\n}\n\n.timeline-item.failed {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.timeline-item.failed:hover {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timeline-line {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n margin-right: 16px;\n flex-shrink: 0;\n}\n\n.timeline-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.timeline-content {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n position: relative;\n}\n\n.timeline-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 8px;\n}\n\n.timeline-operation {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.timeline-operation i {\n font-size: 14px;\n}\n\n.operation-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n}\n\n.timeline-time {\n font-size: 12px;\n font-family: monospace;\n color: var(--text-secondary, #6b7280);\n}\n\n.timeline-body {\n margin-bottom: 8px;\n}\n\n.timeline-user {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--text-secondary, #6b7280);\n margin-bottom: 4px;\n}\n\n.timeline-user i {\n font-size: 11px;\n}\n\n.timeline-description {\n font-size: 13px;\n color: var(--text-primary, #374151);\n margin-bottom: 8px;\n}\n\n.timeline-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.success {\n background: #d1fae5;\n color: #059669;\n}\n\n.status-badge.failed {\n background: #fee2e2;\n color: #dc2626;\n}\n\n.status-badge.unknown {\n background: #f3f4f6;\n color: #6b7280;\n}\n\n.status-badge i {\n font-size: 10px;\n}\n\n.subsystem-badge,\n.type-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: var(--badge-background, #f3f4f6);\n border-radius: 12px;\n font-size: 11px;\n color: var(--text-secondary, #6b7280);\n}\n\n.type-badge {\n background: rgba(99, 102, 241, 0.1);\n color: var(--accent-color, #6366f1);\n}\n\n.type-badge i {\n font-size: 10px;\n}\n\n/* Timeline Details */\n.timeline-details {\n margin-top: 12px;\n padding: 16px;\n background: var(--detail-background, #f9fafb);\n border-radius: 8px;\n border: 1px solid var(--border-color, #e5e7eb);\n}\n\n.detail-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n}\n\n.detail-value {\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n}\n\n.detail-value.mono {\n font-family: monospace;\n font-size: 12px;\n}\n\n.detail-value.small {\n font-size: 11px;\n word-break: break-all;\n}\n\n.detail-value.error {\n color: #dc2626;\n}\n\n.expand-btn {\n position: absolute;\n top: 0;\n right: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: var(--text-secondary, #9ca3af);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.expand-btn:hover {\n color: var(--accent-color, #6366f1);\n}\n\n.expand-btn i {\n font-size: 10px;\n}\n\n/* Table View */\n.audit-table-container {\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n overflow: hidden;\n}\n\n.audit-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.audit-table th {\n padding: 14px 16px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-secondary, #6b7280);\n background: var(--header-background, #f9fafb);\n border-bottom: 1px solid var(--border-color, #e5e7eb);\n}\n\n.audit-table td {\n padding: 14px 16px;\n font-size: 13px;\n color: var(--text-primary, #1f2937);\n border-bottom: 1px solid var(--border-color, #f3f4f6);\n}\n\n.audit-table tr:last-child td {\n border-bottom: none;\n}\n\n.audit-table tr:hover td {\n background: var(--hover-background, #f9fafb);\n}\n\n.audit-table tr.failed-row td {\n background: rgba(239, 68, 68, 0.02);\n}\n\n.audit-table tr.failed-row:hover td {\n background: rgba(239, 68, 68, 0.05);\n}\n\n.timestamp {\n font-family: monospace;\n font-size: 12px;\n color: var(--text-secondary, #6b7280);\n white-space: nowrap;\n}\n\n.user {\n font-weight: 500;\n}\n\n.operation-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.operation-badge i {\n font-size: 10px;\n}\n\n.description {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.subsystem {\n color: var(--text-secondary, #6b7280);\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n background: var(--card-background, #ffffff);\n border-radius: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n text-align: center;\n}\n\n.empty-icon {\n width: 80px;\n height: 80px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--icon-background, #f3f4f6);\n border-radius: 50%;\n margin-bottom: 20px;\n}\n\n.empty-icon i {\n font-size: 32px;\n color: var(--text-secondary, #d1d5db);\n}\n\n.empty-state h3 {\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary, #1f2937);\n margin: 0 0 8px 0;\n}\n\n.empty-state p {\n font-size: 14px;\n color: var(--text-secondary, #6b7280);\n margin: 0;\n}\n\n.btn-link {\n background: none;\n border: none;\n color: var(--accent-color, #6366f1);\n cursor: pointer;\n font-size: inherit;\n padding: 0;\n text-decoration: underline;\n}\n\n.btn-link:hover {\n color: var(--accent-hover, #4f46e5);\n}\n\n/* Responsive */\n@media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 768px) {\n .audit-container {\n padding: 16px;\n }\n\n .audit-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 16px;\n }\n\n .stats-grid {\n grid-template-columns: 1fr;\n }\n\n .toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n\n .toolbar-left {\n flex-direction: column;\n }\n\n .search-container {\n width: 100%;\n }\n\n .filter-select {\n width: 100%;\n }\n\n .toolbar-right {\n justify-content: space-between;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n\n .chart-label {\n display: none;\n }\n\n .chart-label:nth-child(4n+1) {\n display: block;\n }\n}\n"] }]
|
|
862
866
|
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
863
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsAuditResourceComponent, { className: "CredentialsAuditResourceComponent", filePath: "src/Credentials/components/credentials-audit-resource.component.ts", lineNumber:
|
|
867
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CredentialsAuditResourceComponent, { className: "CredentialsAuditResourceComponent", filePath: "src/Credentials/components/credentials-audit-resource.component.ts", lineNumber: 38 }); })();
|
|
864
868
|
//# sourceMappingURL=credentials-audit-resource.component.js.map
|