@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
|
@@ -9,18 +9,18 @@ import * as i3 from "@progress/kendo-angular-inputs";
|
|
|
9
9
|
import * as i4 from "@progress/kendo-angular-dateinputs";
|
|
10
10
|
import * as i5 from "@progress/kendo-angular-buttons";
|
|
11
11
|
import * as i6 from "@memberjunction/ng-shared-generic";
|
|
12
|
-
function
|
|
12
|
+
function APIKeyEditPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
13
13
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
14
|
-
i0.ɵɵelementStart(0, "div",
|
|
15
|
-
i0.ɵɵlistener("click", function
|
|
14
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
15
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
|
|
16
16
|
i0.ɵɵelementEnd();
|
|
17
17
|
} }
|
|
18
|
-
function
|
|
19
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
18
|
+
function APIKeyEditPanelComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelement(0, "mj-loading", 8);
|
|
20
20
|
} }
|
|
21
|
-
function
|
|
22
|
-
i0.ɵɵelementStart(0, "div",
|
|
23
|
-
i0.ɵɵelement(1, "i",
|
|
21
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
+
i0.ɵɵelementStart(0, "div", 10);
|
|
23
|
+
i0.ɵɵelement(1, "i", 24);
|
|
24
24
|
i0.ɵɵtext(2);
|
|
25
25
|
i0.ɵɵelementEnd();
|
|
26
26
|
} if (rf & 2) {
|
|
@@ -28,9 +28,9 @@ function APIKeyEditPanelComponent_ng_container_12_div_1_Template(rf, ctx) { if (
|
|
|
28
28
|
i0.ɵɵadvance(2);
|
|
29
29
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.SuccessMessage, " ");
|
|
30
30
|
} }
|
|
31
|
-
function
|
|
32
|
-
i0.ɵɵelementStart(0, "div",
|
|
33
|
-
i0.ɵɵelement(1, "i",
|
|
31
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
+
i0.ɵɵelementStart(0, "div", 11);
|
|
33
|
+
i0.ɵɵelement(1, "i", 25);
|
|
34
34
|
i0.ɵɵtext(2);
|
|
35
35
|
i0.ɵɵelementEnd();
|
|
36
36
|
} if (rf & 2) {
|
|
@@ -38,16 +38,16 @@ function APIKeyEditPanelComponent_ng_container_12_div_2_Template(rf, ctx) { if (
|
|
|
38
38
|
i0.ɵɵadvance(2);
|
|
39
39
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.ErrorMessage, " ");
|
|
40
40
|
} }
|
|
41
|
-
function
|
|
42
|
-
i0.ɵɵelementStart(0, "span",
|
|
41
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
+
i0.ɵɵelementStart(0, "span", 16);
|
|
43
43
|
i0.ɵɵtext(1, "!");
|
|
44
44
|
i0.ɵɵelementEnd();
|
|
45
45
|
} }
|
|
46
|
-
function
|
|
46
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
47
47
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
48
|
-
i0.ɵɵelementStart(0, "button",
|
|
49
|
-
i0.ɵɵlistener("click", function
|
|
50
|
-
i0.ɵɵelement(1, "i",
|
|
48
|
+
i0.ɵɵelementStart(0, "button", 46);
|
|
49
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleEdit()); });
|
|
50
|
+
i0.ɵɵelement(1, "i", 47);
|
|
51
51
|
i0.ɵɵtext(2);
|
|
52
52
|
i0.ɵɵelementEnd();
|
|
53
53
|
} if (rf & 2) {
|
|
@@ -57,94 +57,96 @@ function APIKeyEditPanelComponent_ng_container_12_div_15_button_33_Template(rf,
|
|
|
57
57
|
i0.ɵɵadvance();
|
|
58
58
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.IsEditing ? "Cancel" : "Edit", " ");
|
|
59
59
|
} }
|
|
60
|
-
function
|
|
60
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
61
61
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
62
|
-
i0.ɵɵelementStart(0, "button",
|
|
63
|
-
i0.ɵɵlistener("click", function
|
|
62
|
+
i0.ɵɵelementStart(0, "button", 48);
|
|
63
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_47_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.EditExpiresAt = null); });
|
|
64
64
|
i0.ɵɵelement(1, "i", 7);
|
|
65
65
|
i0.ɵɵtext(2, " Never expires ");
|
|
66
66
|
i0.ɵɵelementEnd();
|
|
67
67
|
} }
|
|
68
|
-
function
|
|
69
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
68
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_48_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
69
|
+
i0.ɵɵelement(0, "mj-loading", 50);
|
|
70
70
|
} if (rf & 2) {
|
|
71
71
|
i0.ɵɵproperty("showText", false);
|
|
72
72
|
} }
|
|
73
|
-
function
|
|
73
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_48_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
74
74
|
i0.ɵɵelementStart(0, "span");
|
|
75
|
-
i0.ɵɵelement(1, "i",
|
|
75
|
+
i0.ɵɵelement(1, "i", 51);
|
|
76
76
|
i0.ɵɵtext(2, " Save Changes ");
|
|
77
77
|
i0.ɵɵelementEnd();
|
|
78
78
|
} }
|
|
79
|
-
function
|
|
79
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_48_Template(rf, ctx) { if (rf & 1) {
|
|
80
80
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
81
|
-
i0.ɵɵelementStart(0, "div",
|
|
82
|
-
i0.ɵɵlistener("click", function
|
|
83
|
-
i0.ɵɵ
|
|
81
|
+
i0.ɵɵelementStart(0, "div", 43)(1, "button", 49);
|
|
82
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_48_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.saveChanges()); });
|
|
83
|
+
i0.ɵɵconditionalCreate(2, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_48_Conditional_2_Template, 1, 1, "mj-loading", 50);
|
|
84
|
+
i0.ɵɵconditionalCreate(3, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_48_Conditional_3_Template, 3, 0, "span");
|
|
84
85
|
i0.ɵɵelementEnd()();
|
|
85
86
|
} if (rf & 2) {
|
|
86
87
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
87
88
|
i0.ɵɵadvance();
|
|
88
89
|
i0.ɵɵproperty("themeColor", "primary")("disabled", ctx_r1.IsSaving);
|
|
89
90
|
i0.ɵɵadvance();
|
|
90
|
-
i0.ɵɵ
|
|
91
|
+
i0.ɵɵconditional(ctx_r1.IsSaving ? 2 : -1);
|
|
91
92
|
i0.ɵɵadvance();
|
|
92
|
-
i0.ɵɵ
|
|
93
|
+
i0.ɵɵconditional(!ctx_r1.IsSaving ? 3 : -1);
|
|
93
94
|
} }
|
|
94
|
-
function
|
|
95
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
95
96
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
96
|
-
i0.ɵɵelementStart(0, "div",
|
|
97
|
-
i0.ɵɵelement(2, "i",
|
|
97
|
+
i0.ɵɵelementStart(0, "div", 52)(1, "div", 54);
|
|
98
|
+
i0.ɵɵelement(2, "i", 55);
|
|
98
99
|
i0.ɵɵelementStart(3, "div")(4, "strong");
|
|
99
100
|
i0.ɵɵtext(5, "Revoke this API key");
|
|
100
101
|
i0.ɵɵelementEnd();
|
|
101
102
|
i0.ɵɵelementStart(6, "p");
|
|
102
103
|
i0.ɵɵtext(7, "Once revoked, this key will immediately stop working. This action cannot be undone.");
|
|
103
104
|
i0.ɵɵelementEnd()()();
|
|
104
|
-
i0.ɵɵelementStart(8, "button",
|
|
105
|
-
i0.ɵɵlistener("click", function
|
|
106
|
-
i0.ɵɵelement(9, "i",
|
|
105
|
+
i0.ɵɵelementStart(8, "button", 56);
|
|
106
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_3_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.startRevoke()); });
|
|
107
|
+
i0.ɵɵelement(9, "i", 57);
|
|
107
108
|
i0.ɵɵtext(10, " Revoke Key ");
|
|
108
109
|
i0.ɵɵelementEnd()();
|
|
109
110
|
} }
|
|
110
|
-
function
|
|
111
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
111
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_4_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
112
|
+
i0.ɵɵelement(0, "mj-loading", 50);
|
|
112
113
|
} if (rf & 2) {
|
|
113
114
|
i0.ɵɵproperty("showText", false);
|
|
114
115
|
} }
|
|
115
|
-
function
|
|
116
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_4_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
116
117
|
i0.ɵɵelementStart(0, "span");
|
|
117
|
-
i0.ɵɵelement(1, "i",
|
|
118
|
+
i0.ɵɵelement(1, "i", 57);
|
|
118
119
|
i0.ɵɵtext(2, " Revoke Key ");
|
|
119
120
|
i0.ɵɵelementEnd();
|
|
120
121
|
} }
|
|
121
|
-
function
|
|
122
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
122
123
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
123
|
-
i0.ɵɵelementStart(0, "div",
|
|
124
|
-
i0.ɵɵelement(2, "i",
|
|
124
|
+
i0.ɵɵelementStart(0, "div", 53)(1, "div", 58);
|
|
125
|
+
i0.ɵɵelement(2, "i", 59);
|
|
125
126
|
i0.ɵɵelementStart(3, "div")(4, "strong");
|
|
126
127
|
i0.ɵɵtext(5, "Are you absolutely sure?");
|
|
127
128
|
i0.ɵɵelementEnd();
|
|
128
129
|
i0.ɵɵelementStart(6, "p");
|
|
129
130
|
i0.ɵɵtext(7, "This will permanently revoke the API key. Any applications using this key will immediately lose access.");
|
|
130
131
|
i0.ɵɵelementEnd()()();
|
|
131
|
-
i0.ɵɵelementStart(8, "div",
|
|
132
|
+
i0.ɵɵelementStart(8, "div", 60)(9, "label");
|
|
132
133
|
i0.ɵɵtext(10, "Type ");
|
|
133
134
|
i0.ɵɵelementStart(11, "code");
|
|
134
135
|
i0.ɵɵtext(12, "REVOKE");
|
|
135
136
|
i0.ɵɵelementEnd();
|
|
136
137
|
i0.ɵɵtext(13, " to confirm:");
|
|
137
138
|
i0.ɵɵelementEnd();
|
|
138
|
-
i0.ɵɵelementStart(14, "input",
|
|
139
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
139
|
+
i0.ɵɵelementStart(14, "input", 61);
|
|
140
|
+
i0.ɵɵtwoWayListener("ngModelChange", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_4_Template_input_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.RevokeConfirmText, $event) || (ctx_r1.RevokeConfirmText = $event); return i0.ɵɵresetView($event); });
|
|
140
141
|
i0.ɵɵelementEnd()();
|
|
141
|
-
i0.ɵɵelementStart(15, "div",
|
|
142
|
-
i0.ɵɵlistener("click", function
|
|
142
|
+
i0.ɵɵelementStart(15, "div", 62)(16, "button", 23);
|
|
143
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_4_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.cancelRevoke()); });
|
|
143
144
|
i0.ɵɵtext(17, "Cancel");
|
|
144
145
|
i0.ɵɵelementEnd();
|
|
145
|
-
i0.ɵɵelementStart(18, "button",
|
|
146
|
-
i0.ɵɵlistener("click", function
|
|
147
|
-
i0.ɵɵ
|
|
146
|
+
i0.ɵɵelementStart(18, "button", 63);
|
|
147
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_4_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.confirmRevoke()); });
|
|
148
|
+
i0.ɵɵconditionalCreate(19, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_4_Conditional_19_Template, 1, 1, "mj-loading", 50);
|
|
149
|
+
i0.ɵɵconditionalCreate(20, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_4_Conditional_20_Template, 3, 0, "span");
|
|
148
150
|
i0.ɵɵelementEnd()()();
|
|
149
151
|
} if (rf & 2) {
|
|
150
152
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
@@ -153,26 +155,27 @@ function APIKeyEditPanelComponent_ng_container_12_div_15_div_49_div_4_Template(r
|
|
|
153
155
|
i0.ɵɵadvance(4);
|
|
154
156
|
i0.ɵɵproperty("disabled", ctx_r1.RevokeConfirmText !== "REVOKE" || ctx_r1.IsRevoking);
|
|
155
157
|
i0.ɵɵadvance();
|
|
156
|
-
i0.ɵɵ
|
|
158
|
+
i0.ɵɵconditional(ctx_r1.IsRevoking ? 19 : -1);
|
|
157
159
|
i0.ɵɵadvance();
|
|
158
|
-
i0.ɵɵ
|
|
160
|
+
i0.ɵɵconditional(!ctx_r1.IsRevoking ? 20 : -1);
|
|
159
161
|
} }
|
|
160
|
-
function
|
|
161
|
-
i0.ɵɵelementStart(0, "div",
|
|
162
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
163
|
+
i0.ɵɵelementStart(0, "div", 44)(1, "h4");
|
|
162
164
|
i0.ɵɵtext(2, "Danger Zone");
|
|
163
165
|
i0.ɵɵelementEnd();
|
|
164
|
-
i0.ɵɵ
|
|
166
|
+
i0.ɵɵconditionalCreate(3, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_3_Template, 11, 0, "div", 52);
|
|
167
|
+
i0.ɵɵconditionalCreate(4, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Conditional_4_Template, 21, 4, "div", 53);
|
|
165
168
|
i0.ɵɵelementEnd();
|
|
166
169
|
} if (rf & 2) {
|
|
167
170
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
168
171
|
i0.ɵɵadvance(3);
|
|
169
|
-
i0.ɵɵ
|
|
172
|
+
i0.ɵɵconditional(!ctx_r1.ShowRevokeConfirm ? 3 : -1);
|
|
170
173
|
i0.ɵɵadvance();
|
|
171
|
-
i0.ɵɵ
|
|
174
|
+
i0.ɵɵconditional(ctx_r1.ShowRevokeConfirm ? 4 : -1);
|
|
172
175
|
} }
|
|
173
|
-
function
|
|
174
|
-
i0.ɵɵelementStart(0, "div",
|
|
175
|
-
i0.ɵɵelement(1, "i",
|
|
176
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
177
|
+
i0.ɵɵelementStart(0, "div", 45);
|
|
178
|
+
i0.ɵɵelement(1, "i", 57);
|
|
176
179
|
i0.ɵɵelementStart(2, "div")(3, "strong");
|
|
177
180
|
i0.ɵɵtext(4, "This API key has been revoked");
|
|
178
181
|
i0.ɵɵelementEnd();
|
|
@@ -180,66 +183,67 @@ function APIKeyEditPanelComponent_ng_container_12_div_15_div_50_Template(rf, ctx
|
|
|
180
183
|
i0.ɵɵtext(6, "It can no longer be used for authentication. Consider deleting this record if no longer needed.");
|
|
181
184
|
i0.ɵɵelementEnd()()();
|
|
182
185
|
} }
|
|
183
|
-
function
|
|
186
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
184
187
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
185
|
-
i0.ɵɵelementStart(0, "div",
|
|
188
|
+
i0.ɵɵelementStart(0, "div", 19)(1, "div", 26)(2, "div", 27)(3, "div", 28)(4, "span", 29);
|
|
186
189
|
i0.ɵɵtext(5, "Key Hash");
|
|
187
190
|
i0.ɵɵelementEnd();
|
|
188
|
-
i0.ɵɵelementStart(6, "code",
|
|
191
|
+
i0.ɵɵelementStart(6, "code", 30);
|
|
189
192
|
i0.ɵɵtext(7);
|
|
190
193
|
i0.ɵɵelementEnd()()();
|
|
191
|
-
i0.ɵɵelementStart(8, "div",
|
|
194
|
+
i0.ɵɵelementStart(8, "div", 31)(9, "div", 32)(10, "span", 29);
|
|
192
195
|
i0.ɵɵtext(11, "Created");
|
|
193
196
|
i0.ɵɵelementEnd();
|
|
194
|
-
i0.ɵɵelementStart(12, "span",
|
|
197
|
+
i0.ɵɵelementStart(12, "span", 33);
|
|
195
198
|
i0.ɵɵtext(13);
|
|
196
199
|
i0.ɵɵelementEnd()();
|
|
197
|
-
i0.ɵɵelementStart(14, "div",
|
|
200
|
+
i0.ɵɵelementStart(14, "div", 32)(15, "span", 29);
|
|
198
201
|
i0.ɵɵtext(16, "Created By");
|
|
199
202
|
i0.ɵɵelementEnd();
|
|
200
|
-
i0.ɵɵelementStart(17, "span",
|
|
203
|
+
i0.ɵɵelementStart(17, "span", 33);
|
|
201
204
|
i0.ɵɵtext(18);
|
|
202
205
|
i0.ɵɵelementEnd()();
|
|
203
|
-
i0.ɵɵelementStart(19, "div",
|
|
206
|
+
i0.ɵɵelementStart(19, "div", 32)(20, "span", 29);
|
|
204
207
|
i0.ɵɵtext(21, "Owner");
|
|
205
208
|
i0.ɵɵelementEnd();
|
|
206
|
-
i0.ɵɵelementStart(22, "span",
|
|
209
|
+
i0.ɵɵelementStart(22, "span", 33);
|
|
207
210
|
i0.ɵɵtext(23);
|
|
208
211
|
i0.ɵɵelementEnd()();
|
|
209
|
-
i0.ɵɵelementStart(24, "div",
|
|
212
|
+
i0.ɵɵelementStart(24, "div", 32)(25, "span", 29);
|
|
210
213
|
i0.ɵɵtext(26, "Last Used");
|
|
211
214
|
i0.ɵɵelementEnd();
|
|
212
|
-
i0.ɵɵelementStart(27, "span",
|
|
215
|
+
i0.ɵɵelementStart(27, "span", 33);
|
|
213
216
|
i0.ɵɵtext(28);
|
|
214
217
|
i0.ɵɵelementEnd()()()();
|
|
215
|
-
i0.ɵɵelementStart(29, "div",
|
|
218
|
+
i0.ɵɵelementStart(29, "div", 34)(30, "div", 35)(31, "h4");
|
|
216
219
|
i0.ɵɵtext(32, "Key Configuration");
|
|
217
220
|
i0.ɵɵelementEnd();
|
|
218
|
-
i0.ɵɵ
|
|
221
|
+
i0.ɵɵconditionalCreate(33, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_33_Template, 3, 5, "button", 36);
|
|
219
222
|
i0.ɵɵelementEnd();
|
|
220
|
-
i0.ɵɵelementStart(34, "div",
|
|
223
|
+
i0.ɵɵelementStart(34, "div", 37)(35, "label");
|
|
221
224
|
i0.ɵɵtext(36, "Label");
|
|
222
225
|
i0.ɵɵelementEnd();
|
|
223
|
-
i0.ɵɵelementStart(37, "input",
|
|
224
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
226
|
+
i0.ɵɵelementStart(37, "input", 38);
|
|
227
|
+
i0.ɵɵtwoWayListener("ngModelChange", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Template_input_ngModelChange_37_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditLabel, $event) || (ctx_r1.EditLabel = $event); return i0.ɵɵresetView($event); });
|
|
225
228
|
i0.ɵɵelementEnd()();
|
|
226
|
-
i0.ɵɵelementStart(38, "div",
|
|
229
|
+
i0.ɵɵelementStart(38, "div", 37)(39, "label");
|
|
227
230
|
i0.ɵɵtext(40, "Description");
|
|
228
231
|
i0.ɵɵelementEnd();
|
|
229
|
-
i0.ɵɵelementStart(41, "textarea",
|
|
230
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
232
|
+
i0.ɵɵelementStart(41, "textarea", 39);
|
|
233
|
+
i0.ɵɵtwoWayListener("ngModelChange", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Template_textarea_ngModelChange_41_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditDescription, $event) || (ctx_r1.EditDescription = $event); return i0.ɵɵresetView($event); });
|
|
231
234
|
i0.ɵɵelementEnd()();
|
|
232
|
-
i0.ɵɵelementStart(42, "div",
|
|
235
|
+
i0.ɵɵelementStart(42, "div", 37)(43, "label");
|
|
233
236
|
i0.ɵɵtext(44, "Expiration");
|
|
234
237
|
i0.ɵɵelementEnd();
|
|
235
|
-
i0.ɵɵelementStart(45, "div",
|
|
236
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
238
|
+
i0.ɵɵelementStart(45, "div", 40)(46, "kendo-datepicker", 41);
|
|
239
|
+
i0.ɵɵtwoWayListener("ngModelChange", function APIKeyEditPanelComponent_Conditional_12_Conditional_14_Template_kendo_datepicker_ngModelChange_46_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EditExpiresAt, $event) || (ctx_r1.EditExpiresAt = $event); return i0.ɵɵresetView($event); });
|
|
237
240
|
i0.ɵɵelementEnd();
|
|
238
|
-
i0.ɵɵ
|
|
241
|
+
i0.ɵɵconditionalCreate(47, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_47_Template, 3, 0, "button", 42);
|
|
239
242
|
i0.ɵɵelementEnd()();
|
|
240
|
-
i0.ɵɵ
|
|
243
|
+
i0.ɵɵconditionalCreate(48, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_48_Template, 4, 4, "div", 43);
|
|
241
244
|
i0.ɵɵelementEnd();
|
|
242
|
-
i0.ɵɵ
|
|
245
|
+
i0.ɵɵconditionalCreate(49, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_49_Template, 5, 2, "div", 44);
|
|
246
|
+
i0.ɵɵconditionalCreate(50, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Conditional_50_Template, 7, 0, "div", 45);
|
|
243
247
|
i0.ɵɵelementEnd();
|
|
244
248
|
} if (rf & 2) {
|
|
245
249
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -256,7 +260,7 @@ function APIKeyEditPanelComponent_ng_container_12_div_15_Template(rf, ctx) { if
|
|
|
256
260
|
i0.ɵɵadvance();
|
|
257
261
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.APIKey.LastUsedAt ? ctx_r1.formatDate(ctx_r1.APIKey.LastUsedAt) : "Never", " ");
|
|
258
262
|
i0.ɵɵadvance(5);
|
|
259
|
-
i0.ɵɵ
|
|
263
|
+
i0.ɵɵconditional(ctx_r1.APIKey.Status === "Active" ? 33 : -1);
|
|
260
264
|
i0.ɵɵadvance(4);
|
|
261
265
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.EditLabel);
|
|
262
266
|
i0.ɵɵproperty("disabled", !ctx_r1.IsEditing);
|
|
@@ -267,42 +271,43 @@ function APIKeyEditPanelComponent_ng_container_12_div_15_Template(rf, ctx) { if
|
|
|
267
271
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.EditExpiresAt);
|
|
268
272
|
i0.ɵɵproperty("disabled", !ctx_r1.IsEditing)("min", ctx_r1.getMinDate());
|
|
269
273
|
i0.ɵɵadvance();
|
|
270
|
-
i0.ɵɵ
|
|
274
|
+
i0.ɵɵconditional(ctx_r1.IsEditing && ctx_r1.EditExpiresAt ? 47 : -1);
|
|
271
275
|
i0.ɵɵadvance();
|
|
272
|
-
i0.ɵɵ
|
|
276
|
+
i0.ɵɵconditional(ctx_r1.IsEditing ? 48 : -1);
|
|
273
277
|
i0.ɵɵadvance();
|
|
274
|
-
i0.ɵɵ
|
|
278
|
+
i0.ɵɵconditional(ctx_r1.APIKey.Status === "Active" ? 49 : -1);
|
|
275
279
|
i0.ɵɵadvance();
|
|
276
|
-
i0.ɵɵ
|
|
280
|
+
i0.ɵɵconditional(ctx_r1.APIKey.Status === "Revoked" ? 50 : -1);
|
|
277
281
|
} }
|
|
278
|
-
function
|
|
279
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
282
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_5_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
283
|
+
i0.ɵɵelement(0, "mj-loading", 50);
|
|
280
284
|
} if (rf & 2) {
|
|
281
285
|
i0.ɵɵproperty("showText", false);
|
|
282
286
|
} }
|
|
283
|
-
function
|
|
287
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_5_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
284
288
|
i0.ɵɵelementStart(0, "span");
|
|
285
|
-
i0.ɵɵelement(1, "i",
|
|
289
|
+
i0.ɵɵelement(1, "i", 51);
|
|
286
290
|
i0.ɵɵtext(2, " Save Changes ");
|
|
287
291
|
i0.ɵɵelementEnd();
|
|
288
292
|
} }
|
|
289
|
-
function
|
|
293
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
290
294
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
291
|
-
i0.ɵɵelementStart(0, "button",
|
|
292
|
-
i0.ɵɵlistener("click", function
|
|
293
|
-
i0.ɵɵ
|
|
295
|
+
i0.ɵɵelementStart(0, "button", 49);
|
|
296
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.saveScopeChanges()); });
|
|
297
|
+
i0.ɵɵconditionalCreate(1, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_5_Conditional_1_Template, 1, 1, "mj-loading", 50);
|
|
298
|
+
i0.ɵɵconditionalCreate(2, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_5_Conditional_2_Template, 3, 0, "span");
|
|
294
299
|
i0.ɵɵelementEnd();
|
|
295
300
|
} if (rf & 2) {
|
|
296
301
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
297
302
|
i0.ɵɵproperty("themeColor", "primary")("disabled", ctx_r1.IsSaving);
|
|
298
303
|
i0.ɵɵadvance();
|
|
299
|
-
i0.ɵɵ
|
|
304
|
+
i0.ɵɵconditional(ctx_r1.IsSaving ? 1 : -1);
|
|
300
305
|
i0.ɵɵadvance();
|
|
301
|
-
i0.ɵɵ
|
|
306
|
+
i0.ɵɵconditional(!ctx_r1.IsSaving ? 2 : -1);
|
|
302
307
|
} }
|
|
303
|
-
function
|
|
304
|
-
i0.ɵɵelementStart(0, "div",
|
|
305
|
-
i0.ɵɵelement(1, "i",
|
|
308
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
309
|
+
i0.ɵɵelementStart(0, "div", 68);
|
|
310
|
+
i0.ɵɵelement(1, "i", 55);
|
|
306
311
|
i0.ɵɵelementStart(2, "div")(3, "strong");
|
|
307
312
|
i0.ɵɵtext(4, "Warning: No permissions assigned");
|
|
308
313
|
i0.ɵɵelementEnd();
|
|
@@ -310,15 +315,15 @@ function APIKeyEditPanelComponent_ng_container_12_div_16_div_6_Template(rf, ctx)
|
|
|
310
315
|
i0.ɵɵtext(6, "This API key has no assigned scopes and cannot perform any operations. All API requests using this key will be rejected until scopes are assigned.");
|
|
311
316
|
i0.ɵɵelementEnd()()();
|
|
312
317
|
} }
|
|
313
|
-
function
|
|
314
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
318
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
319
|
+
i0.ɵɵelement(0, "mj-loading", 69);
|
|
315
320
|
} }
|
|
316
|
-
function
|
|
321
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
317
322
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
318
|
-
i0.ɵɵelementStart(0, "label",
|
|
319
|
-
i0.ɵɵlistener("click", function
|
|
320
|
-
i0.ɵɵelementStart(1, "input",
|
|
321
|
-
i0.ɵɵlistener("change", function
|
|
323
|
+
i0.ɵɵelementStart(0, "label", 80);
|
|
324
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_9_Template_label_click_0_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
325
|
+
i0.ɵɵelementStart(1, "input", 81);
|
|
326
|
+
i0.ɵɵlistener("change", function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_9_Template_input_change_1_listener() { i0.ɵɵrestoreView(_r13); const category_r12 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleCategoryAll(category_r12)); });
|
|
322
327
|
i0.ɵɵelementEnd();
|
|
323
328
|
i0.ɵɵelementStart(2, "span");
|
|
324
329
|
i0.ɵɵtext(3, "All");
|
|
@@ -328,8 +333,8 @@ function APIKeyEditPanelComponent_ng_container_12_div_16_div_8_div_1_label_9_Tem
|
|
|
328
333
|
i0.ɵɵadvance();
|
|
329
334
|
i0.ɵɵproperty("checked", category_r12.allSelected);
|
|
330
335
|
} }
|
|
331
|
-
function
|
|
332
|
-
i0.ɵɵelementStart(0, "span",
|
|
336
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_11_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
337
|
+
i0.ɵɵelementStart(0, "span", 87);
|
|
333
338
|
i0.ɵɵtext(1);
|
|
334
339
|
i0.ɵɵelementEnd();
|
|
335
340
|
} if (rf & 2) {
|
|
@@ -337,16 +342,16 @@ function APIKeyEditPanelComponent_ng_container_12_div_16_div_8_div_1_div_11_div_
|
|
|
337
342
|
i0.ɵɵadvance();
|
|
338
343
|
i0.ɵɵtextInterpolate1(" ", item_r15.scope.Description, " ");
|
|
339
344
|
} }
|
|
340
|
-
function
|
|
345
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
341
346
|
const _r14 = i0.ɵɵgetCurrentView();
|
|
342
|
-
i0.ɵɵelementStart(0, "div",
|
|
343
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
344
|
-
i0.ɵɵlistener("change", function
|
|
347
|
+
i0.ɵɵelementStart(0, "div", 82)(1, "label", 83)(2, "input", 84);
|
|
348
|
+
i0.ɵɵtwoWayListener("ngModelChange", function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_11_For_2_Template_input_ngModelChange_2_listener($event) { const item_r15 = i0.ɵɵrestoreView(_r14).$implicit; i0.ɵɵtwoWayBindingSet(item_r15.selected, $event) || (item_r15.selected = $event); return i0.ɵɵresetView($event); });
|
|
349
|
+
i0.ɵɵlistener("change", function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_11_For_2_Template_input_change_2_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.onScopeChange()); });
|
|
345
350
|
i0.ɵɵelementEnd();
|
|
346
|
-
i0.ɵɵelementStart(3, "div",
|
|
351
|
+
i0.ɵɵelementStart(3, "div", 85)(4, "span", 86);
|
|
347
352
|
i0.ɵɵtext(5);
|
|
348
353
|
i0.ɵɵelementEnd();
|
|
349
|
-
i0.ɵɵ
|
|
354
|
+
i0.ɵɵconditionalCreate(6, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_11_For_2_Conditional_6_Template, 2, 1, "span", 87);
|
|
350
355
|
i0.ɵɵelementEnd()()();
|
|
351
356
|
} if (rf & 2) {
|
|
352
357
|
const item_r15 = ctx.$implicit;
|
|
@@ -357,34 +362,34 @@ function APIKeyEditPanelComponent_ng_container_12_div_16_div_8_div_1_div_11_div_
|
|
|
357
362
|
i0.ɵɵadvance(3);
|
|
358
363
|
i0.ɵɵtextInterpolate(item_r15.scope.Name);
|
|
359
364
|
i0.ɵɵadvance();
|
|
360
|
-
i0.ɵɵ
|
|
365
|
+
i0.ɵɵconditional(item_r15.scope.Description ? 6 : -1);
|
|
361
366
|
} }
|
|
362
|
-
function
|
|
363
|
-
i0.ɵɵelementStart(0, "div",
|
|
364
|
-
i0.ɵɵ
|
|
367
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
368
|
+
i0.ɵɵelementStart(0, "div", 79);
|
|
369
|
+
i0.ɵɵrepeaterCreate(1, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_11_For_2_Template, 7, 4, "div", 82, i0.ɵɵrepeaterTrackByIdentity);
|
|
365
370
|
i0.ɵɵelementEnd();
|
|
366
371
|
} if (rf & 2) {
|
|
367
372
|
const category_r12 = i0.ɵɵnextContext().$implicit;
|
|
368
373
|
i0.ɵɵadvance();
|
|
369
|
-
i0.ɵɵ
|
|
374
|
+
i0.ɵɵrepeater(category_r12.scopes);
|
|
370
375
|
} }
|
|
371
|
-
function
|
|
376
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
372
377
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
373
|
-
i0.ɵɵelementStart(0, "div",
|
|
374
|
-
i0.ɵɵlistener("click", function
|
|
375
|
-
i0.ɵɵelementStart(2, "div",
|
|
378
|
+
i0.ɵɵelementStart(0, "div", 71)(1, "div", 72);
|
|
379
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Template_div_click_1_listener() { const category_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleCategory(category_r12)); });
|
|
380
|
+
i0.ɵɵelementStart(2, "div", 73);
|
|
376
381
|
i0.ɵɵelement(3, "i");
|
|
377
|
-
i0.ɵɵelementStart(4, "span",
|
|
382
|
+
i0.ɵɵelementStart(4, "span", 74);
|
|
378
383
|
i0.ɵɵtext(5);
|
|
379
384
|
i0.ɵɵelementEnd();
|
|
380
|
-
i0.ɵɵelementStart(6, "span",
|
|
385
|
+
i0.ɵɵelementStart(6, "span", 75);
|
|
381
386
|
i0.ɵɵtext(7);
|
|
382
387
|
i0.ɵɵelementEnd()();
|
|
383
|
-
i0.ɵɵelementStart(8, "div",
|
|
384
|
-
i0.ɵɵ
|
|
385
|
-
i0.ɵɵelement(10, "i",
|
|
388
|
+
i0.ɵɵelementStart(8, "div", 76);
|
|
389
|
+
i0.ɵɵconditionalCreate(9, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_9_Template, 4, 1, "label", 77);
|
|
390
|
+
i0.ɵɵelement(10, "i", 78);
|
|
386
391
|
i0.ɵɵelementEnd()();
|
|
387
|
-
i0.ɵɵ
|
|
392
|
+
i0.ɵɵconditionalCreate(11, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Conditional_11_Template, 3, 0, "div", 79);
|
|
388
393
|
i0.ɵɵelementEnd();
|
|
389
394
|
} if (rf & 2) {
|
|
390
395
|
const category_r12 = ctx.$implicit;
|
|
@@ -397,58 +402,60 @@ function APIKeyEditPanelComponent_ng_container_12_div_16_div_8_div_1_Template(rf
|
|
|
397
402
|
i0.ɵɵadvance(2);
|
|
398
403
|
i0.ɵɵtextInterpolate2(" ", ctx_r1.getSelectedCount(category_r12), "/", category_r12.scopes.length, " ");
|
|
399
404
|
i0.ɵɵadvance(2);
|
|
400
|
-
i0.ɵɵ
|
|
405
|
+
i0.ɵɵconditional(ctx_r1.APIKey.Status === "Active" ? 9 : -1);
|
|
401
406
|
i0.ɵɵadvance();
|
|
402
407
|
i0.ɵɵclassProp("fa-chevron-down", !category_r12.expanded)("fa-chevron-up", category_r12.expanded);
|
|
403
408
|
i0.ɵɵadvance();
|
|
404
|
-
i0.ɵɵ
|
|
409
|
+
i0.ɵɵconditional(category_r12.expanded ? 11 : -1);
|
|
405
410
|
} }
|
|
406
|
-
function
|
|
407
|
-
i0.ɵɵelementStart(0, "div",
|
|
408
|
-
i0.ɵɵ
|
|
411
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
412
|
+
i0.ɵɵelementStart(0, "div", 70);
|
|
413
|
+
i0.ɵɵrepeaterCreate(1, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_For_2_Template, 12, 13, "div", 71, i0.ɵɵrepeaterTrackByIdentity);
|
|
409
414
|
i0.ɵɵelementEnd();
|
|
410
415
|
} if (rf & 2) {
|
|
411
416
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
412
417
|
i0.ɵɵadvance();
|
|
413
|
-
i0.ɵɵ
|
|
418
|
+
i0.ɵɵrepeater(ctx_r1.ScopeCategories);
|
|
414
419
|
} }
|
|
415
|
-
function
|
|
416
|
-
i0.ɵɵelementStart(0, "div",
|
|
420
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
421
|
+
i0.ɵɵelementStart(0, "div", 20)(1, "div", 64)(2, "div", 65)(3, "span", 66);
|
|
417
422
|
i0.ɵɵtext(4);
|
|
418
423
|
i0.ɵɵelementEnd()();
|
|
419
|
-
i0.ɵɵ
|
|
424
|
+
i0.ɵɵconditionalCreate(5, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_5_Template, 3, 4, "button", 67);
|
|
420
425
|
i0.ɵɵelementEnd();
|
|
421
|
-
i0.ɵɵ
|
|
426
|
+
i0.ɵɵconditionalCreate(6, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_6_Template, 7, 0, "div", 68);
|
|
427
|
+
i0.ɵɵconditionalCreate(7, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_7_Template, 1, 0, "mj-loading", 69);
|
|
428
|
+
i0.ɵɵconditionalCreate(8, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Conditional_8_Template, 3, 0, "div", 70);
|
|
422
429
|
i0.ɵɵelementEnd();
|
|
423
430
|
} if (rf & 2) {
|
|
424
431
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
425
432
|
i0.ɵɵadvance(4);
|
|
426
433
|
i0.ɵɵtextInterpolate1("", ctx_r1.getAssignedScopeCount(), " permissions assigned");
|
|
427
434
|
i0.ɵɵadvance();
|
|
428
|
-
i0.ɵɵ
|
|
435
|
+
i0.ɵɵconditional(ctx_r1.HasScopeChanges && ctx_r1.APIKey.Status === "Active" ? 5 : -1);
|
|
429
436
|
i0.ɵɵadvance();
|
|
430
|
-
i0.ɵɵ
|
|
437
|
+
i0.ɵɵconditional(!ctx_r1.IsLoadingScopes && ctx_r1.getAssignedScopeCount() === 0 && ctx_r1.APIKey.Status === "Active" ? 6 : -1);
|
|
431
438
|
i0.ɵɵadvance();
|
|
432
|
-
i0.ɵɵ
|
|
439
|
+
i0.ɵɵconditional(ctx_r1.IsLoadingScopes ? 7 : -1);
|
|
433
440
|
i0.ɵɵadvance();
|
|
434
|
-
i0.ɵɵ
|
|
441
|
+
i0.ɵɵconditional(!ctx_r1.IsLoadingScopes ? 8 : -1);
|
|
435
442
|
} }
|
|
436
|
-
function
|
|
437
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
443
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
444
|
+
i0.ɵɵelement(0, "mj-loading", 88);
|
|
438
445
|
} }
|
|
439
|
-
function
|
|
440
|
-
i0.ɵɵelementStart(0, "div",
|
|
446
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_2_Conditional_14_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
447
|
+
i0.ɵɵelementStart(0, "div", 102)(1, "span", 98);
|
|
441
448
|
i0.ɵɵtext(2);
|
|
442
449
|
i0.ɵɵelementEnd();
|
|
443
|
-
i0.ɵɵelementStart(3, "span",
|
|
450
|
+
i0.ɵɵelementStart(3, "span", 99)(4, "span", 103);
|
|
444
451
|
i0.ɵɵtext(5);
|
|
445
452
|
i0.ɵɵelementEnd();
|
|
446
453
|
i0.ɵɵtext(6);
|
|
447
454
|
i0.ɵɵelementEnd();
|
|
448
|
-
i0.ɵɵelementStart(7, "span",
|
|
455
|
+
i0.ɵɵelementStart(7, "span", 104);
|
|
449
456
|
i0.ɵɵtext(8);
|
|
450
457
|
i0.ɵɵelementEnd();
|
|
451
|
-
i0.ɵɵelementStart(9, "span",
|
|
458
|
+
i0.ɵɵelementStart(9, "span", 101);
|
|
452
459
|
i0.ɵɵtext(10);
|
|
453
460
|
i0.ɵɵelementEnd()();
|
|
454
461
|
} if (rf & 2) {
|
|
@@ -467,29 +474,29 @@ function APIKeyEditPanelComponent_ng_container_12_div_17_div_2_div_14_div_10_Tem
|
|
|
467
474
|
i0.ɵɵadvance(2);
|
|
468
475
|
i0.ɵɵtextInterpolate1("", log_r16.responseTime, "ms");
|
|
469
476
|
} }
|
|
470
|
-
function
|
|
471
|
-
i0.ɵɵelementStart(0, "div",
|
|
477
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
478
|
+
i0.ɵɵelementStart(0, "div", 95)(1, "div", 97)(2, "span", 98);
|
|
472
479
|
i0.ɵɵtext(3, "Time");
|
|
473
480
|
i0.ɵɵelementEnd();
|
|
474
|
-
i0.ɵɵelementStart(4, "span",
|
|
481
|
+
i0.ɵɵelementStart(4, "span", 99);
|
|
475
482
|
i0.ɵɵtext(5, "Endpoint");
|
|
476
483
|
i0.ɵɵelementEnd();
|
|
477
|
-
i0.ɵɵelementStart(6, "span",
|
|
484
|
+
i0.ɵɵelementStart(6, "span", 100);
|
|
478
485
|
i0.ɵɵtext(7, "Status");
|
|
479
486
|
i0.ɵɵelementEnd();
|
|
480
|
-
i0.ɵɵelementStart(8, "span",
|
|
487
|
+
i0.ɵɵelementStart(8, "span", 101);
|
|
481
488
|
i0.ɵɵtext(9, "Duration");
|
|
482
489
|
i0.ɵɵelementEnd()();
|
|
483
|
-
i0.ɵɵ
|
|
490
|
+
i0.ɵɵrepeaterCreate(10, APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_2_Conditional_14_For_11_Template, 11, 6, "div", 102, i0.ɵɵrepeaterTrackByIdentity);
|
|
484
491
|
i0.ɵɵelementEnd();
|
|
485
492
|
} if (rf & 2) {
|
|
486
493
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
487
494
|
i0.ɵɵadvance(10);
|
|
488
|
-
i0.ɵɵ
|
|
495
|
+
i0.ɵɵrepeater(ctx_r1.UsageLogs);
|
|
489
496
|
} }
|
|
490
|
-
function
|
|
491
|
-
i0.ɵɵelementStart(0, "div",
|
|
492
|
-
i0.ɵɵelement(1, "i",
|
|
497
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
498
|
+
i0.ɵɵelementStart(0, "div", 96);
|
|
499
|
+
i0.ɵɵelement(1, "i", 105);
|
|
493
500
|
i0.ɵɵelementStart(2, "span");
|
|
494
501
|
i0.ɵɵtext(3, "No usage logs yet");
|
|
495
502
|
i0.ɵɵelementEnd();
|
|
@@ -497,24 +504,25 @@ function APIKeyEditPanelComponent_ng_container_12_div_17_div_2_div_15_Template(r
|
|
|
497
504
|
i0.ɵɵtext(5, "Usage will be recorded when this API key is used for authentication");
|
|
498
505
|
i0.ɵɵelementEnd()();
|
|
499
506
|
} }
|
|
500
|
-
function
|
|
501
|
-
i0.ɵɵelementStart(0, "div",
|
|
502
|
-
i0.ɵɵelement(3, "i",
|
|
503
|
-
i0.ɵɵelementStart(4, "div",
|
|
507
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
508
|
+
i0.ɵɵelementStart(0, "div", 89)(1, "div", 90)(2, "div", 91);
|
|
509
|
+
i0.ɵɵelement(3, "i", 17);
|
|
510
|
+
i0.ɵɵelementStart(4, "div", 92);
|
|
504
511
|
i0.ɵɵtext(5);
|
|
505
512
|
i0.ɵɵelementEnd();
|
|
506
|
-
i0.ɵɵelementStart(6, "div",
|
|
513
|
+
i0.ɵɵelementStart(6, "div", 93);
|
|
507
514
|
i0.ɵɵtext(7, "Total Requests");
|
|
508
515
|
i0.ɵɵelementEnd()();
|
|
509
|
-
i0.ɵɵelementStart(8, "div",
|
|
510
|
-
i0.ɵɵelement(9, "i",
|
|
511
|
-
i0.ɵɵelementStart(10, "div",
|
|
516
|
+
i0.ɵɵelementStart(8, "div", 91);
|
|
517
|
+
i0.ɵɵelement(9, "i", 94);
|
|
518
|
+
i0.ɵɵelementStart(10, "div", 92);
|
|
512
519
|
i0.ɵɵtext(11);
|
|
513
520
|
i0.ɵɵelementEnd();
|
|
514
|
-
i0.ɵɵelementStart(12, "div",
|
|
521
|
+
i0.ɵɵelementStart(12, "div", 93);
|
|
515
522
|
i0.ɵɵtext(13, "Last Used");
|
|
516
523
|
i0.ɵɵelementEnd()()();
|
|
517
|
-
i0.ɵɵ
|
|
524
|
+
i0.ɵɵconditionalCreate(14, APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_2_Conditional_14_Template, 12, 0, "div", 95);
|
|
525
|
+
i0.ɵɵconditionalCreate(15, APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_2_Conditional_15_Template, 6, 0, "div", 96);
|
|
518
526
|
i0.ɵɵelementEnd();
|
|
519
527
|
} if (rf & 2) {
|
|
520
528
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -523,74 +531,71 @@ function APIKeyEditPanelComponent_ng_container_12_div_17_div_2_Template(rf, ctx)
|
|
|
523
531
|
i0.ɵɵadvance(6);
|
|
524
532
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.UsageLogs.length > 0 ? ctx_r1.formatRelativeTime(ctx_r1.UsageLogs[0].timestamp) : "Never", " ");
|
|
525
533
|
i0.ɵɵadvance(3);
|
|
526
|
-
i0.ɵɵ
|
|
534
|
+
i0.ɵɵconditional(ctx_r1.UsageLogs.length > 0 ? 14 : -1);
|
|
527
535
|
i0.ɵɵadvance();
|
|
528
|
-
i0.ɵɵ
|
|
536
|
+
i0.ɵɵconditional(ctx_r1.UsageLogs.length === 0 ? 15 : -1);
|
|
529
537
|
} }
|
|
530
|
-
function
|
|
531
|
-
i0.ɵɵelementStart(0, "div",
|
|
532
|
-
i0.ɵɵ
|
|
538
|
+
function APIKeyEditPanelComponent_Conditional_12_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
539
|
+
i0.ɵɵelementStart(0, "div", 21);
|
|
540
|
+
i0.ɵɵconditionalCreate(1, APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_1_Template, 1, 0, "mj-loading", 88);
|
|
541
|
+
i0.ɵɵconditionalCreate(2, APIKeyEditPanelComponent_Conditional_12_Conditional_16_Conditional_2_Template, 16, 4, "div", 89);
|
|
533
542
|
i0.ɵɵelementEnd();
|
|
534
543
|
} if (rf & 2) {
|
|
535
544
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
536
545
|
i0.ɵɵadvance();
|
|
537
|
-
i0.ɵɵ
|
|
546
|
+
i0.ɵɵconditional(ctx_r1.IsLoadingLogs ? 1 : -1);
|
|
538
547
|
i0.ɵɵadvance();
|
|
539
|
-
i0.ɵɵ
|
|
548
|
+
i0.ɵɵconditional(!ctx_r1.IsLoadingLogs ? 2 : -1);
|
|
540
549
|
} }
|
|
541
|
-
function
|
|
550
|
+
function APIKeyEditPanelComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
542
551
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
543
|
-
i0.ɵɵ
|
|
544
|
-
i0.ɵɵ
|
|
545
|
-
i0.ɵɵelementStart(
|
|
546
|
-
i0.ɵɵlistener("click", function
|
|
547
|
-
i0.ɵɵelement(
|
|
548
|
-
i0.ɵɵtext(
|
|
552
|
+
i0.ɵɵconditionalCreate(0, APIKeyEditPanelComponent_Conditional_12_Conditional_0_Template, 3, 1, "div", 10);
|
|
553
|
+
i0.ɵɵconditionalCreate(1, APIKeyEditPanelComponent_Conditional_12_Conditional_1_Template, 3, 1, "div", 11);
|
|
554
|
+
i0.ɵɵelementStart(2, "div", 12)(3, "button", 13);
|
|
555
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ActiveTab = "details"); });
|
|
556
|
+
i0.ɵɵelement(4, "i", 14);
|
|
557
|
+
i0.ɵɵtext(5, " Details ");
|
|
549
558
|
i0.ɵɵelementEnd();
|
|
550
|
-
i0.ɵɵelementStart(
|
|
551
|
-
i0.ɵɵlistener("click", function
|
|
552
|
-
i0.ɵɵelement(
|
|
553
|
-
i0.ɵɵtext(
|
|
554
|
-
i0.ɵɵ
|
|
559
|
+
i0.ɵɵelementStart(6, "button", 13);
|
|
560
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ActiveTab = "scopes"); });
|
|
561
|
+
i0.ɵɵelement(7, "i", 15);
|
|
562
|
+
i0.ɵɵtext(8, " Permissions ");
|
|
563
|
+
i0.ɵɵconditionalCreate(9, APIKeyEditPanelComponent_Conditional_12_Conditional_9_Template, 2, 0, "span", 16);
|
|
555
564
|
i0.ɵɵelementEnd();
|
|
556
|
-
i0.ɵɵelementStart(
|
|
557
|
-
i0.ɵɵlistener("click", function
|
|
558
|
-
i0.ɵɵelement(
|
|
559
|
-
i0.ɵɵtext(
|
|
565
|
+
i0.ɵɵelementStart(10, "button", 13);
|
|
566
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ActiveTab = "usage"); });
|
|
567
|
+
i0.ɵɵelement(11, "i", 17);
|
|
568
|
+
i0.ɵɵtext(12, " Usage ");
|
|
560
569
|
i0.ɵɵelementEnd()();
|
|
561
|
-
i0.ɵɵelementStart(
|
|
562
|
-
i0.ɵɵ
|
|
570
|
+
i0.ɵɵelementStart(13, "div", 18);
|
|
571
|
+
i0.ɵɵconditionalCreate(14, APIKeyEditPanelComponent_Conditional_12_Conditional_14_Template, 51, 20, "div", 19);
|
|
572
|
+
i0.ɵɵconditionalCreate(15, APIKeyEditPanelComponent_Conditional_12_Conditional_15_Template, 9, 5, "div", 20);
|
|
573
|
+
i0.ɵɵconditionalCreate(16, APIKeyEditPanelComponent_Conditional_12_Conditional_16_Template, 3, 2, "div", 21);
|
|
563
574
|
i0.ɵɵelementEnd();
|
|
564
|
-
i0.ɵɵelementStart(
|
|
565
|
-
i0.ɵɵlistener("click", function
|
|
566
|
-
i0.ɵɵtext(
|
|
575
|
+
i0.ɵɵelementStart(17, "div", 22)(18, "button", 23);
|
|
576
|
+
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Conditional_12_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
|
|
577
|
+
i0.ɵɵtext(19, "Close");
|
|
567
578
|
i0.ɵɵelementEnd()();
|
|
568
|
-
i0.ɵɵelementContainerEnd();
|
|
569
579
|
} if (rf & 2) {
|
|
570
580
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
581
|
+
i0.ɵɵconditional(ctx_r1.SuccessMessage ? 0 : -1);
|
|
571
582
|
i0.ɵɵadvance();
|
|
572
|
-
i0.ɵɵ
|
|
573
|
-
i0.ɵɵadvance();
|
|
574
|
-
i0.ɵɵproperty("ngIf", ctx_r1.ErrorMessage);
|
|
583
|
+
i0.ɵɵconditional(ctx_r1.ErrorMessage ? 1 : -1);
|
|
575
584
|
i0.ɵɵadvance(2);
|
|
576
585
|
i0.ɵɵclassProp("active", ctx_r1.ActiveTab === "details");
|
|
577
586
|
i0.ɵɵadvance(3);
|
|
578
587
|
i0.ɵɵclassProp("active", ctx_r1.ActiveTab === "scopes");
|
|
579
588
|
i0.ɵɵadvance(3);
|
|
580
|
-
i0.ɵɵ
|
|
589
|
+
i0.ɵɵconditional(ctx_r1.HasScopeChanges ? 9 : -1);
|
|
581
590
|
i0.ɵɵadvance();
|
|
582
591
|
i0.ɵɵclassProp("active", ctx_r1.ActiveTab === "usage");
|
|
583
592
|
i0.ɵɵadvance(4);
|
|
584
|
-
i0.ɵɵ
|
|
593
|
+
i0.ɵɵconditional(ctx_r1.ActiveTab === "details" ? 14 : -1);
|
|
585
594
|
i0.ɵɵadvance();
|
|
586
|
-
i0.ɵɵ
|
|
595
|
+
i0.ɵɵconditional(ctx_r1.ActiveTab === "scopes" ? 15 : -1);
|
|
587
596
|
i0.ɵɵadvance();
|
|
588
|
-
i0.ɵɵ
|
|
597
|
+
i0.ɵɵconditional(ctx_r1.ActiveTab === "usage" ? 16 : -1);
|
|
589
598
|
} }
|
|
590
|
-
/** Tree shaking prevention function */
|
|
591
|
-
export function LoadAPIKeyEditPanel() {
|
|
592
|
-
// This function prevents tree shaking
|
|
593
|
-
}
|
|
594
599
|
/**
|
|
595
600
|
* Panel for viewing and editing existing API keys
|
|
596
601
|
*/
|
|
@@ -1020,9 +1025,9 @@ export class APIKeyEditPanelComponent {
|
|
|
1020
1025
|
}
|
|
1021
1026
|
static ɵfac = function APIKeyEditPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || APIKeyEditPanelComponent)(); };
|
|
1022
1027
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: APIKeyEditPanelComponent, selectors: [["mj-api-key-edit-panel"]], hostBindings: function APIKeyEditPanelComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1023
|
-
i0.ɵɵlistener("keydown.escape", function APIKeyEditPanelComponent_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); },
|
|
1024
|
-
} }, inputs: { Visible: "Visible", KeyId: "KeyId" }, outputs: { VisibleChange: "VisibleChange", Updated: "Updated", Revoked: "Revoked", Closed: "Closed" }, features: [i0.ɵɵNgOnChangesFeature], decls: 13, vars: 10, consts: [[
|
|
1025
|
-
i0.ɵɵ
|
|
1028
|
+
i0.ɵɵlistener("keydown.escape", function APIKeyEditPanelComponent_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, i0.ɵɵresolveDocument);
|
|
1029
|
+
} }, inputs: { Visible: "Visible", KeyId: "KeyId" }, outputs: { VisibleChange: "VisibleChange", Updated: "Updated", Revoked: "Revoked", Closed: "Closed" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 13, vars: 10, consts: [[1, "slideout-backdrop"], [1, "slideout-panel"], [1, "slideout-header"], [1, "slideout-title"], [1, "fa-solid", "fa-key"], [1, "key-status"], ["title", "Close (Esc)", 1, "slideout-close", 3, "click"], [1, "fa-solid", "fa-times"], ["text", "Loading key details..."], [1, "slideout-backdrop", 3, "click"], [1, "message", "success"], [1, "message", "error"], [1, "slideout-tabs"], [1, "slideout-tab", 3, "click"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-shield-halved"], [1, "tab-badge", "unsaved"], [1, "fa-solid", "fa-chart-line"], [1, "slideout-content"], [1, "tab-panel"], [1, "tab-panel", "scopes-panel"], [1, "tab-panel", "usage-panel"], [1, "slideout-footer"], ["kendoButton", "", 3, "click"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-circle-exclamation"], [1, "key-info-card"], [1, "info-header"], [1, "info-row"], [1, "info-label"], [1, "hash-value"], [1, "info-grid"], [1, "info-item"], [1, "info-value"], [1, "edit-section"], [1, "section-header"], [1, "edit-toggle"], [1, "form-field"], ["kendoTextBox", "", 1, "form-input", 3, "ngModelChange", "ngModel", "disabled"], ["kendoTextArea", "", 1, "form-textarea", 3, "ngModelChange", "ngModel", "disabled", "rows"], [1, "expiration-field"], ["format", "MMM d, yyyy", "placeholder", "Never expires", 3, "ngModelChange", "ngModel", "disabled", "min"], [1, "clear-btn"], [1, "edit-actions"], [1, "danger-zone"], [1, "revoked-notice"], [1, "edit-toggle", 3, "click"], [1, "fa-solid"], [1, "clear-btn", 3, "click"], ["kendoButton", "", 3, "click", "themeColor", "disabled"], ["size", "small", 3, "showText"], [1, "fa-solid", "fa-save"], [1, "revoke-section"], [1, "revoke-confirm"], [1, "revoke-info"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "revoke-btn", 3, "click"], [1, "fa-solid", "fa-ban"], [1, "confirm-warning"], [1, "fa-solid", "fa-skull-crossbones"], [1, "confirm-input"], ["kendoTextBox", "", "placeholder", "REVOKE", 3, "ngModelChange", "ngModel"], [1, "confirm-actions"], [1, "confirm-revoke-btn", 3, "click", "disabled"], [1, "scopes-header"], [1, "scopes-info"], [1, "scope-count"], ["kendoButton", "", 3, "themeColor", "disabled"], [1, "no-scopes-warning"], ["text", "Loading permissions..."], [1, "scope-categories"], [1, "scope-category"], [1, "category-header", 3, "click"], [1, "category-left"], [1, "category-name"], [1, "category-count"], [1, "category-right"], [1, "category-all-toggle"], [1, "fa-solid", "expand-icon"], [1, "category-scopes"], [1, "category-all-toggle", 3, "click"], ["type", "checkbox", "kendoCheckBox", "", 3, "change", "checked"], [1, "scope-item"], [1, "scope-label"], ["type", "checkbox", "kendoCheckBox", "", 3, "ngModelChange", "change", "ngModel", "disabled"], [1, "scope-info"], [1, "scope-name"], [1, "scope-desc"], ["text", "Loading usage logs..."], [1, "usage-content"], [1, "usage-stats"], [1, "stat-card"], [1, "stat-value"], [1, "stat-label"], [1, "fa-solid", "fa-clock"], [1, "usage-logs"], [1, "empty-state"], [1, "log-header"], [1, "col-time"], [1, "col-endpoint"], [1, "col-status"], [1, "col-duration"], [1, "log-item"], [1, "method-badge"], [1, "col-status", 3, "ngClass"], [1, "fa-solid", "fa-chart-area"]], template: function APIKeyEditPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1030
|
+
i0.ɵɵconditionalCreate(0, APIKeyEditPanelComponent_Conditional_0_Template, 1, 0, "div", 0);
|
|
1026
1031
|
i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
|
|
1027
1032
|
i0.ɵɵelement(4, "i", 4);
|
|
1028
1033
|
i0.ɵɵelementStart(5, "span");
|
|
@@ -1035,10 +1040,11 @@ export class APIKeyEditPanelComponent {
|
|
|
1035
1040
|
i0.ɵɵlistener("click", function APIKeyEditPanelComponent_Template_button_click_9_listener() { return ctx.close(); });
|
|
1036
1041
|
i0.ɵɵelement(10, "i", 7);
|
|
1037
1042
|
i0.ɵɵelementEnd()();
|
|
1038
|
-
i0.ɵɵ
|
|
1043
|
+
i0.ɵɵconditionalCreate(11, APIKeyEditPanelComponent_Conditional_11_Template, 1, 0, "mj-loading", 8);
|
|
1044
|
+
i0.ɵɵconditionalCreate(12, APIKeyEditPanelComponent_Conditional_12_Template, 20, 12);
|
|
1039
1045
|
i0.ɵɵelementEnd();
|
|
1040
1046
|
} if (rf & 2) {
|
|
1041
|
-
i0.ɵɵ
|
|
1047
|
+
i0.ɵɵconditional(ctx.Visible ? 0 : -1);
|
|
1042
1048
|
i0.ɵɵadvance();
|
|
1043
1049
|
i0.ɵɵclassProp("open", ctx.Visible);
|
|
1044
1050
|
i0.ɵɵadvance(6);
|
|
@@ -1046,14 +1052,14 @@ export class APIKeyEditPanelComponent {
|
|
|
1046
1052
|
i0.ɵɵadvance();
|
|
1047
1053
|
i0.ɵɵtextInterpolate1(" ", ctx.APIKey == null ? null : ctx.APIKey.Status, " ");
|
|
1048
1054
|
i0.ɵɵadvance(3);
|
|
1049
|
-
i0.ɵɵ
|
|
1055
|
+
i0.ɵɵconditional(ctx.IsLoading ? 11 : -1);
|
|
1050
1056
|
i0.ɵɵadvance();
|
|
1051
|
-
i0.ɵɵ
|
|
1052
|
-
} }, dependencies: [i1.NgClass, i1.NgForOf, i1.NgIf, i2.DefaultValueAccessor, i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.TextAreaDirective, i3.TextBoxDirective, i3.CheckBoxDirective, i4.DatePickerComponent, i5.ButtonComponent, i6.LoadingComponent], styles: ["\n\n\n\n\n\n\n.slideout-backdrop[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 100;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.slideout-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--card-background, #ffffff);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.slideout-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n flex-shrink: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: #78350f;\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f59e0b;\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.key-status[_ngcontent-%COMP%] {\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.key-status.active[_ngcontent-%COMP%] {\n background: rgba(16, 185, 129, 0.2);\n color: #059669;\n}\n\n.key-status.revoked[_ngcontent-%COMP%] {\n background: rgba(220, 38, 38, 0.2);\n color: #dc2626;\n}\n\n.slideout-close[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.5);\n border: none;\n border-radius: 8px;\n color: #92400e;\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.8);\n color: #78350f;\n}\n\n\n\n.slideout-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n padding: 12px 24px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.slideout-tab[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background: transparent;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.slideout-tab[_ngcontent-%COMP%]:hover {\n background: #e5e7eb;\n color: #374151;\n}\n\n.slideout-tab.active[_ngcontent-%COMP%] {\n background: #f59e0b;\n color: white;\n}\n\n.slideout-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.tab-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 9px;\n font-size: 10px;\n font-weight: 600;\n}\n\n.tab-badge.unsaved[_ngcontent-%COMP%] {\n background: #ef4444;\n color: white;\n}\n\n.slideout-tab[_ngcontent-%COMP%]:not(.active) .tab-badge[_ngcontent-%COMP%] {\n background: #e5e7eb;\n color: #374151;\n}\n\n\n\n.slideout-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.tab-panel[_ngcontent-%COMP%] {\n padding: 20px 24px;\n}\n\n\n\n.slideout-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n padding: 16px 24px;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button {\n min-width: 80px;\n padding: 8px 16px;\n font-weight: 500;\n border-radius: 6px;\n}\n\n\n\n.message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n margin: 12px 16px;\n border-radius: 8px;\n font-size: 14px;\n}\n\n.message.success[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.message.error[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n\n\n\n\n\n.key-info-card[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-radius: 10px;\n padding: 14px 16px;\n margin-bottom: 16px;\n}\n\n.info-header[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n padding-bottom: 12px;\n border-bottom: 1px solid rgba(245, 158, 11, 0.3);\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #92400e;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.hash-value[_ngcontent-%COMP%] {\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n color: #78350f;\n word-break: break-all;\n background: rgba(255, 255, 255, 0.5);\n padding: 8px 12px;\n border-radius: 6px;\n}\n\n.info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 10px 16px;\n}\n\n.info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: #78350f;\n}\n\n.info-value.never-used[_ngcontent-%COMP%] {\n color: #6b7280;\n font-style: italic;\n}\n\n\n\n.edit-section[_ngcontent-%COMP%] {\n background: #f9fafb;\n border-radius: 10px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 14px;\n}\n\n.section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.edit-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.edit-toggle[_ngcontent-%COMP%]:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.form-field[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.form-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: #374151;\n margin-bottom: 4px;\n}\n\n.form-input[_ngcontent-%COMP%], \n.form-textarea[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.expiration-field[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.clear-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px dashed #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.clear-btn[_ngcontent-%COMP%]:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.edit-actions[_ngcontent-%COMP%] {\n margin-top: 14px;\n padding-top: 14px;\n border-top: 1px solid #e5e7eb;\n}\n\n\n\n.danger-zone[_ngcontent-%COMP%] {\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 10px;\n padding: 14px 16px;\n}\n\n.danger-zone[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 12px;\n font-weight: 600;\n color: #dc2626;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.revoke-section[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n}\n\n.revoke-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n flex: 1;\n}\n\n.revoke-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n}\n\n.revoke-info[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: #991b1b;\n margin-bottom: 4px;\n}\n\n.revoke-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #7f1d1d;\n}\n\n.revoke-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: white;\n border: 1px solid #dc2626;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: #dc2626;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.revoke-btn[_ngcontent-%COMP%]:hover {\n background: #dc2626;\n color: white;\n}\n\n\n\n.revoke-confirm[_ngcontent-%COMP%] {\n background: #fef2f2;\n border-radius: 8px;\n}\n\n.confirm-warning[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.confirm-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: #dc2626;\n}\n\n.confirm-warning[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: #991b1b;\n font-size: 16px;\n margin-bottom: 4px;\n}\n\n.confirm-warning[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #7f1d1d;\n}\n\n.confirm-input[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.confirm-input[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n font-size: 14px;\n font-weight: 500;\n color: #7f1d1d;\n margin-bottom: 8px;\n}\n\n.confirm-input[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: #fee2e2;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.confirm-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.confirm-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.confirm-revoke-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: #dc2626;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.confirm-revoke-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #b91c1c;\n}\n\n.confirm-revoke-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.revoked-notice[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 20px;\n background: #f3f4f6;\n border-radius: 12px;\n}\n\n.revoked-notice[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: #6b7280;\n}\n\n.revoked-notice[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: #374151;\n margin-bottom: 4px;\n}\n\n.revoked-notice[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #6b7280;\n}\n\n\n\n.scopes-tab[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.scopes-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding-bottom: 16px;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.scope-count[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #374151;\n}\n\n\n\n.scope-categories[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category[_ngcontent-%COMP%] {\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n}\n\n.category-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.category-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n}\n\n.category-count[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.category-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.category-all-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.category-all-toggle[_ngcontent-%COMP%]:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.category-all-toggle[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n margin: 0;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n color: #9ca3af;\n font-size: 12px;\n transition: transform 0.2s ease;\n}\n\n.category-scopes[_ngcontent-%COMP%] {\n padding: 8px 16px 16px;\n border-top: 1px solid #e5e7eb;\n background: white;\n}\n\n.scope-item[_ngcontent-%COMP%] {\n padding: 10px 0;\n border-bottom: 1px solid #f3f4f6;\n}\n\n.scope-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.scope-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-name[_ngcontent-%COMP%] {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: #374151;\n font-family: monospace;\n}\n\n.scope-desc[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n color: #6b7280;\n margin-top: 2px;\n}\n\n\n\n.usage-tab[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.usage-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-radius: 12px;\n text-align: center;\n}\n\n.stat-card[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: #f59e0b;\n margin-bottom: 12px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: #78350f;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #92400e;\n margin-top: 4px;\n}\n\n\n\n.usage-logs[_ngcontent-%COMP%] {\n background: #f9fafb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.log-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 100px 1fr 80px 80px;\n gap: 12px;\n padding: 12px 16px;\n background: #e5e7eb;\n font-size: 11px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.log-item[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 100px 1fr 80px 80px;\n gap: 12px;\n padding: 12px 16px;\n border-bottom: 1px solid #e5e7eb;\n font-size: 13px;\n align-items: center;\n}\n\n.log-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.col-time[_ngcontent-%COMP%] {\n color: #6b7280;\n}\n\n.col-endpoint[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: monospace;\n color: #374151;\n}\n\n.method-badge[_ngcontent-%COMP%] {\n padding: 2px 6px;\n background: #dbeafe;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n color: #1d4ed8;\n}\n\n.col-status[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.col-status.status-success[_ngcontent-%COMP%] {\n color: #10b981;\n}\n\n.col-status.status-warning[_ngcontent-%COMP%] {\n color: #f59e0b;\n}\n\n.col-status.status-error[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.col-duration[_ngcontent-%COMP%] {\n color: #6b7280;\n text-align: right;\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: 48px 24px;\n color: #6b7280;\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 500;\n color: #374151;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 8px 0 0 0;\n font-size: 13px;\n}\n\n\n\n\n\n\n[_nghost-%COMP%] .form-input .k-input, \n[_nghost-%COMP%] .form-textarea .k-input-inner, \n[_nghost-%COMP%] .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: #e5e7eb;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .form-input:focus-within, \n[_nghost-%COMP%] .form-textarea:focus-within, \n[_nghost-%COMP%] .k-datepicker:focus-within {\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n\n\n\n[_nghost-%COMP%] .edit-actions .k-button {\n min-width: 120px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .edit-actions .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n[_nghost-%COMP%] .edit-actions .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n\n\n[_nghost-%COMP%] .scopes-header .k-button {\n min-width: 120px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .scopes-header .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n[_nghost-%COMP%] .scopes-header .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n\n\n.no-scopes-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border: 1px solid #fecaca;\n border-radius: 10px;\n margin-bottom: 16px;\n font-size: 13px;\n color: #991b1b;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: #991b1b;\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n line-height: 1.5;\n}"] });
|
|
1057
|
+
i0.ɵɵconditional(!ctx.IsLoading && ctx.APIKey ? 12 : -1);
|
|
1058
|
+
} }, dependencies: [i1.NgClass, i2.DefaultValueAccessor, i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.TextBoxDirective, i3.TextAreaDirective, i3.CheckBoxDirective, i4.DatePickerComponent, i5.ButtonComponent, i6.LoadingComponent], styles: ["\n\n\n\n\n\n\n.slideout-backdrop[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 100;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.slideout-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--card-background, #ffffff);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.slideout-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n flex-shrink: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: #78350f;\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f59e0b;\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.key-status[_ngcontent-%COMP%] {\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.key-status.active[_ngcontent-%COMP%] {\n background: rgba(16, 185, 129, 0.2);\n color: #059669;\n}\n\n.key-status.revoked[_ngcontent-%COMP%] {\n background: rgba(220, 38, 38, 0.2);\n color: #dc2626;\n}\n\n.slideout-close[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.5);\n border: none;\n border-radius: 8px;\n color: #92400e;\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.8);\n color: #78350f;\n}\n\n\n\n.slideout-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n padding: 12px 24px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.slideout-tab[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background: transparent;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.slideout-tab[_ngcontent-%COMP%]:hover {\n background: #e5e7eb;\n color: #374151;\n}\n\n.slideout-tab.active[_ngcontent-%COMP%] {\n background: #f59e0b;\n color: white;\n}\n\n.slideout-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.tab-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 9px;\n font-size: 10px;\n font-weight: 600;\n}\n\n.tab-badge.unsaved[_ngcontent-%COMP%] {\n background: #ef4444;\n color: white;\n}\n\n.slideout-tab[_ngcontent-%COMP%]:not(.active) .tab-badge[_ngcontent-%COMP%] {\n background: #e5e7eb;\n color: #374151;\n}\n\n\n\n.slideout-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.tab-panel[_ngcontent-%COMP%] {\n padding: 20px 24px;\n}\n\n\n\n.slideout-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n padding: 16px 24px;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n[_nghost-%COMP%] .slideout-footer .k-button {\n min-width: 80px;\n padding: 8px 16px;\n font-weight: 500;\n border-radius: 6px;\n}\n\n\n\n.message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n margin: 12px 16px;\n border-radius: 8px;\n font-size: 14px;\n}\n\n.message.success[_ngcontent-%COMP%] {\n background: #d1fae5;\n color: #059669;\n}\n\n.message.error[_ngcontent-%COMP%] {\n background: #fee2e2;\n color: #dc2626;\n}\n\n\n\n\n\n\n.key-info-card[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-radius: 10px;\n padding: 14px 16px;\n margin-bottom: 16px;\n}\n\n.info-header[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n padding-bottom: 12px;\n border-bottom: 1px solid rgba(245, 158, 11, 0.3);\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: #92400e;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.hash-value[_ngcontent-%COMP%] {\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n color: #78350f;\n word-break: break-all;\n background: rgba(255, 255, 255, 0.5);\n padding: 8px 12px;\n border-radius: 6px;\n}\n\n.info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 10px 16px;\n}\n\n.info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: #78350f;\n}\n\n.info-value.never-used[_ngcontent-%COMP%] {\n color: #6b7280;\n font-style: italic;\n}\n\n\n\n.edit-section[_ngcontent-%COMP%] {\n background: #f9fafb;\n border-radius: 10px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 14px;\n}\n\n.section-header[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.edit-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.edit-toggle[_ngcontent-%COMP%]:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.form-field[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.form-field[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: #374151;\n margin-bottom: 4px;\n}\n\n.form-input[_ngcontent-%COMP%], \n.form-textarea[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.expiration-field[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.clear-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px dashed #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.clear-btn[_ngcontent-%COMP%]:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.edit-actions[_ngcontent-%COMP%] {\n margin-top: 14px;\n padding-top: 14px;\n border-top: 1px solid #e5e7eb;\n}\n\n\n\n.danger-zone[_ngcontent-%COMP%] {\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 10px;\n padding: 14px 16px;\n}\n\n.danger-zone[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 12px;\n font-weight: 600;\n color: #dc2626;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.revoke-section[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n}\n\n.revoke-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n flex: 1;\n}\n\n.revoke-info[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n}\n\n.revoke-info[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: #991b1b;\n margin-bottom: 4px;\n}\n\n.revoke-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #7f1d1d;\n}\n\n.revoke-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: white;\n border: 1px solid #dc2626;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: #dc2626;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.revoke-btn[_ngcontent-%COMP%]:hover {\n background: #dc2626;\n color: white;\n}\n\n\n\n.revoke-confirm[_ngcontent-%COMP%] {\n background: #fef2f2;\n border-radius: 8px;\n}\n\n.confirm-warning[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.confirm-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: #dc2626;\n}\n\n.confirm-warning[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: #991b1b;\n font-size: 16px;\n margin-bottom: 4px;\n}\n\n.confirm-warning[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #7f1d1d;\n}\n\n.confirm-input[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.confirm-input[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n font-size: 14px;\n font-weight: 500;\n color: #7f1d1d;\n margin-bottom: 8px;\n}\n\n.confirm-input[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: #fee2e2;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.confirm-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.confirm-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.confirm-revoke-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: #dc2626;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.confirm-revoke-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #b91c1c;\n}\n\n.confirm-revoke-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.revoked-notice[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 20px;\n background: #f3f4f6;\n border-radius: 12px;\n}\n\n.revoked-notice[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: #6b7280;\n}\n\n.revoked-notice[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: #374151;\n margin-bottom: 4px;\n}\n\n.revoked-notice[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #6b7280;\n}\n\n\n\n.scopes-tab[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.scopes-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding-bottom: 16px;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.scope-count[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #374151;\n}\n\n\n\n.scope-categories[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category[_ngcontent-%COMP%] {\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n}\n\n.category-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.category-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n}\n\n.category-count[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.category-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.category-all-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.category-all-toggle[_ngcontent-%COMP%]:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.category-all-toggle[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n margin: 0;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n color: #9ca3af;\n font-size: 12px;\n transition: transform 0.2s ease;\n}\n\n.category-scopes[_ngcontent-%COMP%] {\n padding: 8px 16px 16px;\n border-top: 1px solid #e5e7eb;\n background: white;\n}\n\n.scope-item[_ngcontent-%COMP%] {\n padding: 10px 0;\n border-bottom: 1px solid #f3f4f6;\n}\n\n.scope-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.scope-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.scope-name[_ngcontent-%COMP%] {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: #374151;\n font-family: monospace;\n}\n\n.scope-desc[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n color: #6b7280;\n margin-top: 2px;\n}\n\n\n\n.usage-tab[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.usage-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-radius: 12px;\n text-align: center;\n}\n\n.stat-card[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: #f59e0b;\n margin-bottom: 12px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: #78350f;\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #92400e;\n margin-top: 4px;\n}\n\n\n\n.usage-logs[_ngcontent-%COMP%] {\n background: #f9fafb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.log-header[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 100px 1fr 80px 80px;\n gap: 12px;\n padding: 12px 16px;\n background: #e5e7eb;\n font-size: 11px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.log-item[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 100px 1fr 80px 80px;\n gap: 12px;\n padding: 12px 16px;\n border-bottom: 1px solid #e5e7eb;\n font-size: 13px;\n align-items: center;\n}\n\n.log-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.col-time[_ngcontent-%COMP%] {\n color: #6b7280;\n}\n\n.col-endpoint[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: monospace;\n color: #374151;\n}\n\n.method-badge[_ngcontent-%COMP%] {\n padding: 2px 6px;\n background: #dbeafe;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n color: #1d4ed8;\n}\n\n.col-status[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.col-status.status-success[_ngcontent-%COMP%] {\n color: #10b981;\n}\n\n.col-status.status-warning[_ngcontent-%COMP%] {\n color: #f59e0b;\n}\n\n.col-status.status-error[_ngcontent-%COMP%] {\n color: #ef4444;\n}\n\n.col-duration[_ngcontent-%COMP%] {\n color: #6b7280;\n text-align: right;\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: 48px 24px;\n color: #6b7280;\n text-align: center;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 500;\n color: #374151;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 8px 0 0 0;\n font-size: 13px;\n}\n\n\n\n\n\n\n[_nghost-%COMP%] .form-input .k-input, \n[_nghost-%COMP%] .form-textarea .k-input-inner, \n[_nghost-%COMP%] .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: #e5e7eb;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .form-input:focus-within, \n[_nghost-%COMP%] .form-textarea:focus-within, \n[_nghost-%COMP%] .k-datepicker:focus-within {\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n\n\n\n[_nghost-%COMP%] .edit-actions .k-button {\n min-width: 120px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .edit-actions .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n[_nghost-%COMP%] .edit-actions .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n\n\n[_nghost-%COMP%] .scopes-header .k-button {\n min-width: 120px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .scopes-header .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n[_nghost-%COMP%] .scopes-header .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n\n\n.no-scopes-warning[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border: 1px solid #fecaca;\n border-radius: 10px;\n margin-bottom: 16px;\n font-size: 13px;\n color: #991b1b;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n display: block;\n color: #991b1b;\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n line-height: 1.5;\n}"] });
|
|
1053
1059
|
}
|
|
1054
1060
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(APIKeyEditPanelComponent, [{
|
|
1055
1061
|
type: Component,
|
|
1056
|
-
args: [{ selector: 'mj-api-key-edit-panel', template: "<!-- Slide-out Backdrop -->\n<div class=\"slideout-backdrop\" *ngIf=\"Visible\" (click)=\"close()\"></div>\n\n<!-- Slide-out Panel -->\n<div class=\"slideout-panel\" [class.open]=\"Visible\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>API Key Details</span>\n <span class=\"key-status\" [class.active]=\"APIKey?.Status === 'Active'\"\n [class.revoked]=\"APIKey?.Status === 'Revoked'\">\n {{APIKey?.Status}}\n </span>\n </div>\n <button class=\"slideout-close\" (click)=\"close()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <mj-loading *ngIf=\"IsLoading\" text=\"Loading key details...\"></mj-loading>\n\n <ng-container *ngIf=\"!IsLoading && APIKey\">\n <!-- Success/Error Messages -->\n <div class=\"message success\" *ngIf=\"SuccessMessage\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{SuccessMessage}}\n </div>\n <div class=\"message error\" *ngIf=\"ErrorMessage\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ErrorMessage}}\n </div>\n\n <!-- Tabs -->\n <div class=\"slideout-tabs\">\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'details'\"\n (click)=\"ActiveTab = 'details'\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Details\n </button>\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'scopes'\"\n (click)=\"ActiveTab = 'scopes'\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Permissions\n <span class=\"tab-badge unsaved\" *ngIf=\"HasScopeChanges\">!</span>\n </button>\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'usage'\"\n (click)=\"ActiveTab = 'usage'\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Usage\n </button>\n </div>\n\n <div class=\"slideout-content\">\n <!-- Details Tab -->\n <div class=\"tab-panel\" *ngIf=\"ActiveTab === 'details'\">\n <div class=\"key-info-card\">\n <div class=\"info-header\">\n <div class=\"info-row\">\n <span class=\"info-label\">Key Hash</span>\n <code class=\"hash-value\">{{APIKey.Hash}}</code>\n </div>\n </div>\n\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{formatDate(APIKey.__mj_CreatedAt)}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Created By</span>\n <span class=\"info-value\">{{APIKey.CreatedByUser}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Owner</span>\n <span class=\"info-value\">{{APIKey.User}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Used</span>\n <span class=\"info-value\" [class.never-used]=\"!APIKey.LastUsedAt\">\n {{APIKey.LastUsedAt ? formatDate(APIKey.LastUsedAt) : 'Never'}}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Editable Fields -->\n <div class=\"edit-section\">\n <div class=\"section-header\">\n <h4>Key Configuration</h4>\n <button class=\"edit-toggle\" *ngIf=\"APIKey.Status === 'Active'\"\n (click)=\"toggleEdit()\">\n <i class=\"fa-solid\" [class.fa-pencil]=\"!IsEditing\" [class.fa-times]=\"IsEditing\"></i>\n {{IsEditing ? 'Cancel' : 'Edit'}}\n </button>\n </div>\n\n <div class=\"form-field\">\n <label>Label</label>\n <input kendoTextBox [(ngModel)]=\"EditLabel\"\n [disabled]=\"!IsEditing\"\n class=\"form-input\" />\n </div>\n\n <div class=\"form-field\">\n <label>Description</label>\n <textarea kendoTextArea [(ngModel)]=\"EditDescription\"\n [disabled]=\"!IsEditing\"\n [rows]=\"3\"\n class=\"form-textarea\"></textarea>\n </div>\n\n <div class=\"form-field\">\n <label>Expiration</label>\n <div class=\"expiration-field\">\n <kendo-datepicker [(ngModel)]=\"EditExpiresAt\"\n [disabled]=\"!IsEditing\"\n [min]=\"getMinDate()\"\n format=\"MMM d, yyyy\"\n placeholder=\"Never expires\">\n </kendo-datepicker>\n <button class=\"clear-btn\" *ngIf=\"IsEditing && EditExpiresAt\"\n (click)=\"EditExpiresAt = null\">\n <i class=\"fa-solid fa-times\"></i>\n Never expires\n </button>\n </div>\n </div>\n\n <div class=\"edit-actions\" *ngIf=\"IsEditing\">\n <button kendoButton [themeColor]=\"'primary'\"\n [disabled]=\"IsSaving\"\n (click)=\"saveChanges()\">\n <mj-loading *ngIf=\"IsSaving\" [showText]=\"false\" size=\"small\"></mj-loading>\n <span *ngIf=\"!IsSaving\">\n <i class=\"fa-solid fa-save\"></i>\n Save Changes\n </span>\n </button>\n </div>\n </div>\n\n <!-- Revoke Section -->\n <div class=\"danger-zone\" *ngIf=\"APIKey.Status === 'Active'\">\n <h4>Danger Zone</h4>\n <div class=\"revoke-section\" *ngIf=\"!ShowRevokeConfirm\">\n <div class=\"revoke-info\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Revoke this API key</strong>\n <p>Once revoked, this key will immediately stop working. This action cannot be undone.</p>\n </div>\n </div>\n <button class=\"revoke-btn\" (click)=\"startRevoke()\">\n <i class=\"fa-solid fa-ban\"></i>\n Revoke Key\n </button>\n </div>\n\n <div class=\"revoke-confirm\" *ngIf=\"ShowRevokeConfirm\">\n <div class=\"confirm-warning\">\n <i class=\"fa-solid fa-skull-crossbones\"></i>\n <div>\n <strong>Are you absolutely sure?</strong>\n <p>This will permanently revoke the API key. Any applications using this key will immediately lose access.</p>\n </div>\n </div>\n <div class=\"confirm-input\">\n <label>Type <code>REVOKE</code> to confirm:</label>\n <input kendoTextBox [(ngModel)]=\"RevokeConfirmText\"\n placeholder=\"REVOKE\" />\n </div>\n <div class=\"confirm-actions\">\n <button kendoButton (click)=\"cancelRevoke()\">Cancel</button>\n <button class=\"confirm-revoke-btn\"\n [disabled]=\"RevokeConfirmText !== 'REVOKE' || IsRevoking\"\n (click)=\"confirmRevoke()\">\n <mj-loading *ngIf=\"IsRevoking\" [showText]=\"false\" size=\"small\"></mj-loading>\n <span *ngIf=\"!IsRevoking\">\n <i class=\"fa-solid fa-ban\"></i>\n Revoke Key\n </span>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Revoked Notice -->\n <div class=\"revoked-notice\" *ngIf=\"APIKey.Status === 'Revoked'\">\n <i class=\"fa-solid fa-ban\"></i>\n <div>\n <strong>This API key has been revoked</strong>\n <p>It can no longer be used for authentication. Consider deleting this record if no longer needed.</p>\n </div>\n </div>\n </div>\n\n <!-- Scopes Tab -->\n <div class=\"tab-panel scopes-panel\" *ngIf=\"ActiveTab === 'scopes'\">\n <div class=\"scopes-header\">\n <div class=\"scopes-info\">\n <span class=\"scope-count\">{{getAssignedScopeCount()}} permissions assigned</span>\n </div>\n <button kendoButton [themeColor]=\"'primary'\"\n *ngIf=\"HasScopeChanges && APIKey.Status === 'Active'\"\n [disabled]=\"IsSaving\"\n (click)=\"saveScopeChanges()\">\n <mj-loading *ngIf=\"IsSaving\" [showText]=\"false\" size=\"small\"></mj-loading>\n <span *ngIf=\"!IsSaving\">\n <i class=\"fa-solid fa-save\"></i>\n Save Changes\n </span>\n </button>\n </div>\n\n <!-- No Scopes Warning -->\n <div class=\"no-scopes-warning\" *ngIf=\"!IsLoadingScopes && getAssignedScopeCount() === 0 && APIKey.Status === 'Active'\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Warning: No permissions assigned</strong>\n <p>This API key has no assigned scopes and cannot perform any operations. All API requests using this key will be rejected until scopes are assigned.</p>\n </div>\n </div>\n\n <mj-loading *ngIf=\"IsLoadingScopes\" text=\"Loading permissions...\"></mj-loading>\n\n <div class=\"scope-categories\" *ngIf=\"!IsLoadingScopes\">\n <div class=\"scope-category\" *ngFor=\"let category of ScopeCategories\">\n <div class=\"category-header\" (click)=\"toggleCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-count\">\n {{getSelectedCount(category)}}/{{category.scopes.length}}\n </span>\n </div>\n <div class=\"category-right\">\n <label class=\"category-all-toggle\"\n (click)=\"$event.stopPropagation()\"\n *ngIf=\"APIKey.Status === 'Active'\">\n <input type=\"checkbox\" kendoCheckBox\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n <i class=\"fa-solid expand-icon\" [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n\n <div class=\"category-scopes\" *ngIf=\"category.expanded\">\n <div class=\"scope-item\" *ngFor=\"let item of category.scopes\">\n <label class=\"scope-label\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"item.selected\"\n [disabled]=\"APIKey.Status === 'Revoked'\"\n (change)=\"onScopeChange()\" />\n <div class=\"scope-info\">\n <span class=\"scope-name\">{{item.scope.Name}}</span>\n <span class=\"scope-desc\" *ngIf=\"item.scope.Description\">\n {{item.scope.Description}}\n </span>\n </div>\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Usage Tab -->\n <div class=\"tab-panel usage-panel\" *ngIf=\"ActiveTab === 'usage'\">\n <mj-loading *ngIf=\"IsLoadingLogs\" text=\"Loading usage logs...\"></mj-loading>\n\n <div class=\"usage-content\" *ngIf=\"!IsLoadingLogs\">\n <div class=\"usage-stats\">\n <div class=\"stat-card\">\n <i class=\"fa-solid fa-chart-line\"></i>\n <div class=\"stat-value\">{{UsageLogs.length}}</div>\n <div class=\"stat-label\">Total Requests</div>\n </div>\n <div class=\"stat-card\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"stat-value\">\n {{UsageLogs.length > 0 ? formatRelativeTime(UsageLogs[0].timestamp) : 'Never'}}\n </div>\n <div class=\"stat-label\">Last Used</div>\n </div>\n </div>\n\n <div class=\"usage-logs\" *ngIf=\"UsageLogs.length > 0\">\n <div class=\"log-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n <div class=\"log-item\" *ngFor=\"let log of UsageLogs\">\n <span class=\"col-time\">{{formatRelativeTime(log.timestamp)}}</span>\n <span class=\"col-endpoint\">\n <span class=\"method-badge\">{{log.method}}</span>\n {{log.endpoint}}\n </span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n </div>\n\n <div class=\"empty-state\" *ngIf=\"UsageLogs.length === 0\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>No usage logs yet</span>\n <p>Usage will be recorded when this API key is used for authentication</p>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"slideout-footer\">\n <button kendoButton (click)=\"close()\">Close</button>\n </div>\n </ng-container>\n</div>\n", styles: ["/* ========================================\n Slide-out Panel Styles\n ======================================== */\n\n/* Backdrop */\n.slideout-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 100;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Slide-out Panel */\n.slideout-panel {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--card-background, #ffffff);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open {\n transform: translateX(0);\n}\n\n/* Panel Header */\n.slideout-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n flex-shrink: 0;\n}\n\n.slideout-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: #78350f;\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title i {\n color: #f59e0b;\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.key-status {\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.key-status.active {\n background: rgba(16, 185, 129, 0.2);\n color: #059669;\n}\n\n.key-status.revoked {\n background: rgba(220, 38, 38, 0.2);\n color: #dc2626;\n}\n\n.slideout-close {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.5);\n border: none;\n border-radius: 8px;\n color: #92400e;\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close:hover {\n background: rgba(255, 255, 255, 0.8);\n color: #78350f;\n}\n\n/* Panel Tabs */\n.slideout-tabs {\n display: flex;\n gap: 4px;\n padding: 12px 24px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.slideout-tab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background: transparent;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.slideout-tab:hover {\n background: #e5e7eb;\n color: #374151;\n}\n\n.slideout-tab.active {\n background: #f59e0b;\n color: white;\n}\n\n.slideout-tab i {\n font-size: 14px;\n}\n\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 9px;\n font-size: 10px;\n font-weight: 600;\n}\n\n.tab-badge.unsaved {\n background: #ef4444;\n color: white;\n}\n\n.slideout-tab:not(.active) .tab-badge {\n background: #e5e7eb;\n color: #374151;\n}\n\n/* Panel Content */\n.slideout-content {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.tab-panel {\n padding: 20px 24px;\n}\n\n/* Panel Footer */\n.slideout-footer {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n padding: 16px 24px;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n:host ::ng-deep .slideout-footer .k-button {\n min-width: 80px;\n padding: 8px 16px;\n font-weight: 500;\n border-radius: 6px;\n}\n\n/* Messages */\n.message {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n margin: 12px 16px;\n border-radius: 8px;\n font-size: 14px;\n}\n\n.message.success {\n background: #d1fae5;\n color: #059669;\n}\n\n.message.error {\n background: #fee2e2;\n color: #dc2626;\n}\n\n/* Legacy tab styles removed - now using slideout-tabs */\n\n/* Key Info Card */\n.key-info-card {\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-radius: 10px;\n padding: 14px 16px;\n margin-bottom: 16px;\n}\n\n.info-header {\n margin-bottom: 12px;\n padding-bottom: 12px;\n border-bottom: 1px solid rgba(245, 158, 11, 0.3);\n}\n\n.info-row {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.info-label {\n font-size: 12px;\n font-weight: 500;\n color: #92400e;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.hash-value {\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n color: #78350f;\n word-break: break-all;\n background: rgba(255, 255, 255, 0.5);\n padding: 8px 12px;\n border-radius: 6px;\n}\n\n.info-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 10px 16px;\n}\n\n.info-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 500;\n color: #78350f;\n}\n\n.info-value.never-used {\n color: #6b7280;\n font-style: italic;\n}\n\n/* Edit Section */\n.edit-section {\n background: #f9fafb;\n border-radius: 10px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 14px;\n}\n\n.section-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.edit-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.edit-toggle:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.form-field {\n margin-bottom: 12px;\n}\n\n.form-field label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: #374151;\n margin-bottom: 4px;\n}\n\n.form-input,\n.form-textarea {\n width: 100%;\n}\n\n.expiration-field {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.clear-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px dashed #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.clear-btn:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.edit-actions {\n margin-top: 14px;\n padding-top: 14px;\n border-top: 1px solid #e5e7eb;\n}\n\n/* Danger Zone */\n.danger-zone {\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 10px;\n padding: 14px 16px;\n}\n\n.danger-zone h4 {\n margin: 0 0 12px 0;\n font-size: 12px;\n font-weight: 600;\n color: #dc2626;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.revoke-section {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n}\n\n.revoke-info {\n display: flex;\n gap: 12px;\n flex: 1;\n}\n\n.revoke-info i {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n}\n\n.revoke-info strong {\n display: block;\n color: #991b1b;\n margin-bottom: 4px;\n}\n\n.revoke-info p {\n margin: 0;\n font-size: 13px;\n color: #7f1d1d;\n}\n\n.revoke-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: white;\n border: 1px solid #dc2626;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: #dc2626;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.revoke-btn:hover {\n background: #dc2626;\n color: white;\n}\n\n/* Revoke Confirm */\n.revoke-confirm {\n background: #fef2f2;\n border-radius: 8px;\n}\n\n.confirm-warning {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.confirm-warning i {\n font-size: 24px;\n color: #dc2626;\n}\n\n.confirm-warning strong {\n display: block;\n color: #991b1b;\n font-size: 16px;\n margin-bottom: 4px;\n}\n\n.confirm-warning p {\n margin: 0;\n font-size: 13px;\n color: #7f1d1d;\n}\n\n.confirm-input {\n margin-bottom: 16px;\n}\n\n.confirm-input label {\n display: block;\n font-size: 14px;\n font-weight: 500;\n color: #7f1d1d;\n margin-bottom: 8px;\n}\n\n.confirm-input code {\n background: #fee2e2;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.confirm-input input {\n width: 100%;\n}\n\n.confirm-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.confirm-revoke-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: #dc2626;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.confirm-revoke-btn:hover:not(:disabled) {\n background: #b91c1c;\n}\n\n.confirm-revoke-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Revoked Notice */\n.revoked-notice {\n display: flex;\n gap: 12px;\n padding: 20px;\n background: #f3f4f6;\n border-radius: 12px;\n}\n\n.revoked-notice i {\n font-size: 24px;\n color: #6b7280;\n}\n\n.revoked-notice strong {\n display: block;\n color: #374151;\n margin-bottom: 4px;\n}\n\n.revoked-notice p {\n margin: 0;\n font-size: 13px;\n color: #6b7280;\n}\n\n/* Scopes Tab */\n.scopes-tab {\n padding: 16px;\n}\n\n.scopes-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding-bottom: 16px;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.scope-count {\n font-size: 14px;\n font-weight: 500;\n color: #374151;\n}\n\n/* Scope Categories */\n.scope-categories {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category {\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header:hover {\n background: #f3f4f6;\n}\n\n.category-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left i {\n font-size: 16px;\n}\n\n.category-name {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n}\n\n.category-count {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.category-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.category-all-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.category-all-toggle:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.category-all-toggle input {\n margin: 0;\n}\n\n.expand-icon {\n color: #9ca3af;\n font-size: 12px;\n transition: transform 0.2s ease;\n}\n\n.category-scopes {\n padding: 8px 16px 16px;\n border-top: 1px solid #e5e7eb;\n background: white;\n}\n\n.scope-item {\n padding: 10px 0;\n border-bottom: 1px solid #f3f4f6;\n}\n\n.scope-item:last-child {\n border-bottom: none;\n}\n\n.scope-label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info {\n flex: 1;\n}\n\n.scope-name {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: #374151;\n font-family: monospace;\n}\n\n.scope-desc {\n display: block;\n font-size: 12px;\n color: #6b7280;\n margin-top: 2px;\n}\n\n/* Usage Tab */\n.usage-tab {\n padding: 16px;\n}\n\n.usage-stats {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-radius: 12px;\n text-align: center;\n}\n\n.stat-card i {\n font-size: 24px;\n color: #f59e0b;\n margin-bottom: 12px;\n}\n\n.stat-value {\n font-size: 24px;\n font-weight: 700;\n color: #78350f;\n}\n\n.stat-label {\n font-size: 12px;\n color: #92400e;\n margin-top: 4px;\n}\n\n/* Usage Logs */\n.usage-logs {\n background: #f9fafb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.log-header {\n display: grid;\n grid-template-columns: 100px 1fr 80px 80px;\n gap: 12px;\n padding: 12px 16px;\n background: #e5e7eb;\n font-size: 11px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.log-item {\n display: grid;\n grid-template-columns: 100px 1fr 80px 80px;\n gap: 12px;\n padding: 12px 16px;\n border-bottom: 1px solid #e5e7eb;\n font-size: 13px;\n align-items: center;\n}\n\n.log-item:last-child {\n border-bottom: none;\n}\n\n.col-time {\n color: #6b7280;\n}\n\n.col-endpoint {\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: monospace;\n color: #374151;\n}\n\n.method-badge {\n padding: 2px 6px;\n background: #dbeafe;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n color: #1d4ed8;\n}\n\n.col-status {\n font-weight: 600;\n}\n\n.col-status.status-success {\n color: #10b981;\n}\n\n.col-status.status-warning {\n color: #f59e0b;\n}\n\n.col-status.status-error {\n color: #ef4444;\n}\n\n.col-duration {\n color: #6b7280;\n text-align: right;\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: 48px 24px;\n color: #6b7280;\n text-align: center;\n}\n\n.empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n\n.empty-state span {\n font-size: 16px;\n font-weight: 500;\n color: #374151;\n}\n\n.empty-state p {\n margin: 8px 0 0 0;\n font-size: 13px;\n}\n\n/* Legacy kendo-window styles removed - now using slideout-panel */\n\n/* Input and form field styling */\n:host ::ng-deep .form-input .k-input,\n:host ::ng-deep .form-textarea .k-input-inner,\n:host ::ng-deep .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: #e5e7eb;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .form-input:focus-within,\n:host ::ng-deep .form-textarea:focus-within,\n:host ::ng-deep .k-datepicker:focus-within {\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n\n/* Button styling in edit actions */\n:host ::ng-deep .edit-actions .k-button {\n min-width: 120px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .edit-actions .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n:host ::ng-deep .edit-actions .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n/* Scopes header button styling */\n:host ::ng-deep .scopes-header .k-button {\n min-width: 120px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .scopes-header .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n:host ::ng-deep .scopes-header .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n/* No Scopes Warning */\n.no-scopes-warning {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border: 1px solid #fecaca;\n border-radius: 10px;\n margin-bottom: 16px;\n font-size: 13px;\n color: #991b1b;\n}\n\n.no-scopes-warning i {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning strong {\n display: block;\n color: #991b1b;\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning p {\n margin: 0;\n line-height: 1.5;\n}\n"] }]
|
|
1062
|
+
args: [{ standalone: false, selector: 'mj-api-key-edit-panel', template: "<!-- Slide-out Backdrop -->\n@if (Visible) {\n <div class=\"slideout-backdrop\" (click)=\"close()\"></div>\n}\n\n<!-- Slide-out Panel -->\n<div class=\"slideout-panel\" [class.open]=\"Visible\">\n <!-- Header -->\n <div class=\"slideout-header\">\n <div class=\"slideout-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>API Key Details</span>\n <span class=\"key-status\" [class.active]=\"APIKey?.Status === 'Active'\"\n [class.revoked]=\"APIKey?.Status === 'Revoked'\">\n {{APIKey?.Status}}\n </span>\n </div>\n <button class=\"slideout-close\" (click)=\"close()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n @if (IsLoading) {\n <mj-loading text=\"Loading key details...\"></mj-loading>\n }\n\n @if (!IsLoading && APIKey) {\n <!-- Success/Error Messages -->\n @if (SuccessMessage) {\n <div class=\"message success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n {{SuccessMessage}}\n </div>\n }\n @if (ErrorMessage) {\n <div class=\"message error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ErrorMessage}}\n </div>\n }\n <!-- Tabs -->\n <div class=\"slideout-tabs\">\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'details'\"\n (click)=\"ActiveTab = 'details'\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Details\n </button>\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'scopes'\"\n (click)=\"ActiveTab = 'scopes'\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Permissions\n @if (HasScopeChanges) {\n <span class=\"tab-badge unsaved\">!</span>\n }\n </button>\n <button class=\"slideout-tab\" [class.active]=\"ActiveTab === 'usage'\"\n (click)=\"ActiveTab = 'usage'\">\n <i class=\"fa-solid fa-chart-line\"></i>\n Usage\n </button>\n </div>\n <div class=\"slideout-content\">\n <!-- Details Tab -->\n @if (ActiveTab === 'details') {\n <div class=\"tab-panel\">\n <div class=\"key-info-card\">\n <div class=\"info-header\">\n <div class=\"info-row\">\n <span class=\"info-label\">Key Hash</span>\n <code class=\"hash-value\">{{APIKey.Hash}}</code>\n </div>\n </div>\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{formatDate(APIKey.__mj_CreatedAt)}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Created By</span>\n <span class=\"info-value\">{{APIKey.CreatedByUser}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Owner</span>\n <span class=\"info-value\">{{APIKey.User}}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Used</span>\n <span class=\"info-value\" [class.never-used]=\"!APIKey.LastUsedAt\">\n {{APIKey.LastUsedAt ? formatDate(APIKey.LastUsedAt) : 'Never'}}\n </span>\n </div>\n </div>\n </div>\n <!-- Editable Fields -->\n <div class=\"edit-section\">\n <div class=\"section-header\">\n <h4>Key Configuration</h4>\n @if (APIKey.Status === 'Active') {\n <button class=\"edit-toggle\"\n (click)=\"toggleEdit()\">\n <i class=\"fa-solid\" [class.fa-pencil]=\"!IsEditing\" [class.fa-times]=\"IsEditing\"></i>\n {{IsEditing ? 'Cancel' : 'Edit'}}\n </button>\n }\n </div>\n <div class=\"form-field\">\n <label>Label</label>\n <input kendoTextBox [(ngModel)]=\"EditLabel\"\n [disabled]=\"!IsEditing\"\n class=\"form-input\" />\n </div>\n <div class=\"form-field\">\n <label>Description</label>\n <textarea kendoTextArea [(ngModel)]=\"EditDescription\"\n [disabled]=\"!IsEditing\"\n [rows]=\"3\"\n class=\"form-textarea\"></textarea>\n </div>\n <div class=\"form-field\">\n <label>Expiration</label>\n <div class=\"expiration-field\">\n <kendo-datepicker [(ngModel)]=\"EditExpiresAt\"\n [disabled]=\"!IsEditing\"\n [min]=\"getMinDate()\"\n format=\"MMM d, yyyy\"\n placeholder=\"Never expires\">\n </kendo-datepicker>\n @if (IsEditing && EditExpiresAt) {\n <button class=\"clear-btn\"\n (click)=\"EditExpiresAt = null\">\n <i class=\"fa-solid fa-times\"></i>\n Never expires\n </button>\n }\n </div>\n </div>\n @if (IsEditing) {\n <div class=\"edit-actions\">\n <button kendoButton [themeColor]=\"'primary'\"\n [disabled]=\"IsSaving\"\n (click)=\"saveChanges()\">\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsSaving) {\n <span>\n <i class=\"fa-solid fa-save\"></i>\n Save Changes\n </span>\n }\n </button>\n </div>\n }\n </div>\n <!-- Revoke Section -->\n @if (APIKey.Status === 'Active') {\n <div class=\"danger-zone\">\n <h4>Danger Zone</h4>\n @if (!ShowRevokeConfirm) {\n <div class=\"revoke-section\">\n <div class=\"revoke-info\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Revoke this API key</strong>\n <p>Once revoked, this key will immediately stop working. This action cannot be undone.</p>\n </div>\n </div>\n <button class=\"revoke-btn\" (click)=\"startRevoke()\">\n <i class=\"fa-solid fa-ban\"></i>\n Revoke Key\n </button>\n </div>\n }\n @if (ShowRevokeConfirm) {\n <div class=\"revoke-confirm\">\n <div class=\"confirm-warning\">\n <i class=\"fa-solid fa-skull-crossbones\"></i>\n <div>\n <strong>Are you absolutely sure?</strong>\n <p>This will permanently revoke the API key. Any applications using this key will immediately lose access.</p>\n </div>\n </div>\n <div class=\"confirm-input\">\n <label>Type <code>REVOKE</code> to confirm:</label>\n <input kendoTextBox [(ngModel)]=\"RevokeConfirmText\"\n placeholder=\"REVOKE\" />\n </div>\n <div class=\"confirm-actions\">\n <button kendoButton (click)=\"cancelRevoke()\">Cancel</button>\n <button class=\"confirm-revoke-btn\"\n [disabled]=\"RevokeConfirmText !== 'REVOKE' || IsRevoking\"\n (click)=\"confirmRevoke()\">\n @if (IsRevoking) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsRevoking) {\n <span>\n <i class=\"fa-solid fa-ban\"></i>\n Revoke Key\n </span>\n }\n </button>\n </div>\n </div>\n }\n </div>\n }\n <!-- Revoked Notice -->\n @if (APIKey.Status === 'Revoked') {\n <div class=\"revoked-notice\">\n <i class=\"fa-solid fa-ban\"></i>\n <div>\n <strong>This API key has been revoked</strong>\n <p>It can no longer be used for authentication. Consider deleting this record if no longer needed.</p>\n </div>\n </div>\n }\n </div>\n }\n <!-- Scopes Tab -->\n @if (ActiveTab === 'scopes') {\n <div class=\"tab-panel scopes-panel\">\n <div class=\"scopes-header\">\n <div class=\"scopes-info\">\n <span class=\"scope-count\">{{getAssignedScopeCount()}} permissions assigned</span>\n </div>\n @if (HasScopeChanges && APIKey.Status === 'Active') {\n <button kendoButton [themeColor]=\"'primary'\"\n [disabled]=\"IsSaving\"\n (click)=\"saveScopeChanges()\">\n @if (IsSaving) {\n <mj-loading [showText]=\"false\" size=\"small\"></mj-loading>\n }\n @if (!IsSaving) {\n <span>\n <i class=\"fa-solid fa-save\"></i>\n Save Changes\n </span>\n }\n </button>\n }\n </div>\n <!-- No Scopes Warning -->\n @if (!IsLoadingScopes && getAssignedScopeCount() === 0 && APIKey.Status === 'Active') {\n <div class=\"no-scopes-warning\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div>\n <strong>Warning: No permissions assigned</strong>\n <p>This API key has no assigned scopes and cannot perform any operations. All API requests using this key will be rejected until scopes are assigned.</p>\n </div>\n </div>\n }\n @if (IsLoadingScopes) {\n <mj-loading text=\"Loading permissions...\"></mj-loading>\n }\n @if (!IsLoadingScopes) {\n <div class=\"scope-categories\">\n @for (category of ScopeCategories; track category) {\n <div class=\"scope-category\">\n <div class=\"category-header\" (click)=\"toggleCategory(category)\">\n <div class=\"category-left\">\n <i [class]=\"category.icon\" [style.color]=\"category.color\"></i>\n <span class=\"category-name\">{{category.name}}</span>\n <span class=\"category-count\">\n {{getSelectedCount(category)}}/{{category.scopes.length}}\n </span>\n </div>\n <div class=\"category-right\">\n @if (APIKey.Status === 'Active') {\n <label class=\"category-all-toggle\"\n (click)=\"$event.stopPropagation()\"\n >\n <input type=\"checkbox\" kendoCheckBox\n [checked]=\"category.allSelected\"\n (change)=\"toggleCategoryAll(category)\" />\n <span>All</span>\n </label>\n }\n <i class=\"fa-solid expand-icon\" [class.fa-chevron-down]=\"!category.expanded\"\n [class.fa-chevron-up]=\"category.expanded\"></i>\n </div>\n </div>\n @if (category.expanded) {\n <div class=\"category-scopes\">\n @for (item of category.scopes; track item) {\n <div class=\"scope-item\">\n <label class=\"scope-label\">\n <input type=\"checkbox\" kendoCheckBox\n [(ngModel)]=\"item.selected\"\n [disabled]=\"APIKey.Status === 'Revoked'\"\n (change)=\"onScopeChange()\" />\n <div class=\"scope-info\">\n <span class=\"scope-name\">{{item.scope.Name}}</span>\n @if (item.scope.Description) {\n <span class=\"scope-desc\">\n {{item.scope.Description}}\n </span>\n }\n </div>\n </label>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- Usage Tab -->\n @if (ActiveTab === 'usage') {\n <div class=\"tab-panel usage-panel\">\n @if (IsLoadingLogs) {\n <mj-loading text=\"Loading usage logs...\"></mj-loading>\n }\n @if (!IsLoadingLogs) {\n <div class=\"usage-content\">\n <div class=\"usage-stats\">\n <div class=\"stat-card\">\n <i class=\"fa-solid fa-chart-line\"></i>\n <div class=\"stat-value\">{{UsageLogs.length}}</div>\n <div class=\"stat-label\">Total Requests</div>\n </div>\n <div class=\"stat-card\">\n <i class=\"fa-solid fa-clock\"></i>\n <div class=\"stat-value\">\n {{UsageLogs.length > 0 ? formatRelativeTime(UsageLogs[0].timestamp) : 'Never'}}\n </div>\n <div class=\"stat-label\">Last Used</div>\n </div>\n </div>\n @if (UsageLogs.length > 0) {\n <div class=\"usage-logs\">\n <div class=\"log-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n @for (log of UsageLogs; track log) {\n <div class=\"log-item\">\n <span class=\"col-time\">{{formatRelativeTime(log.timestamp)}}</span>\n <span class=\"col-endpoint\">\n <span class=\"method-badge\">{{log.method}}</span>\n {{log.endpoint}}\n </span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n }\n @if (UsageLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>No usage logs yet</span>\n <p>Usage will be recorded when this API key is used for authentication</p>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <!-- Footer -->\n <div class=\"slideout-footer\">\n <button kendoButton (click)=\"close()\">Close</button>\n </div>\n }\n</div>\n", styles: ["/* ========================================\n Slide-out Panel Styles\n ======================================== */\n\n/* Backdrop */\n.slideout-backdrop {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 100;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Slide-out Panel */\n.slideout-panel {\n position: absolute;\n top: 0;\n right: 0;\n width: 520px;\n height: 100%;\n max-height: 100%;\n background: var(--card-background, #ffffff);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 101;\n display: flex;\n flex-direction: column;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(100%);\n overflow: hidden;\n}\n\n.slideout-panel.open {\n transform: translateX(0);\n}\n\n/* Panel Header */\n.slideout-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-bottom: 1px solid #fcd34d;\n flex-shrink: 0;\n}\n\n.slideout-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n font-size: 17px;\n color: #78350f;\n flex: 1;\n min-width: 0;\n}\n\n.slideout-title i {\n color: #f59e0b;\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.key-status {\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n flex-shrink: 0;\n}\n\n.key-status.active {\n background: rgba(16, 185, 129, 0.2);\n color: #059669;\n}\n\n.key-status.revoked {\n background: rgba(220, 38, 38, 0.2);\n color: #dc2626;\n}\n\n.slideout-close {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.5);\n border: none;\n border-radius: 8px;\n color: #92400e;\n cursor: pointer;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.slideout-close:hover {\n background: rgba(255, 255, 255, 0.8);\n color: #78350f;\n}\n\n/* Panel Tabs */\n.slideout-tabs {\n display: flex;\n gap: 4px;\n padding: 12px 24px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.slideout-tab {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n background: transparent;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.slideout-tab:hover {\n background: #e5e7eb;\n color: #374151;\n}\n\n.slideout-tab.active {\n background: #f59e0b;\n color: white;\n}\n\n.slideout-tab i {\n font-size: 14px;\n}\n\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 9px;\n font-size: 10px;\n font-weight: 600;\n}\n\n.tab-badge.unsaved {\n background: #ef4444;\n color: white;\n}\n\n.slideout-tab:not(.active) .tab-badge {\n background: #e5e7eb;\n color: #374151;\n}\n\n/* Panel Content */\n.slideout-content {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.tab-panel {\n padding: 20px 24px;\n}\n\n/* Panel Footer */\n.slideout-footer {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n padding: 16px 24px;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n:host ::ng-deep .slideout-footer .k-button {\n min-width: 80px;\n padding: 8px 16px;\n font-weight: 500;\n border-radius: 6px;\n}\n\n/* Messages */\n.message {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n margin: 12px 16px;\n border-radius: 8px;\n font-size: 14px;\n}\n\n.message.success {\n background: #d1fae5;\n color: #059669;\n}\n\n.message.error {\n background: #fee2e2;\n color: #dc2626;\n}\n\n/* Legacy tab styles removed - now using slideout-tabs */\n\n/* Key Info Card */\n.key-info-card {\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-radius: 10px;\n padding: 14px 16px;\n margin-bottom: 16px;\n}\n\n.info-header {\n margin-bottom: 12px;\n padding-bottom: 12px;\n border-bottom: 1px solid rgba(245, 158, 11, 0.3);\n}\n\n.info-row {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.info-label {\n font-size: 12px;\n font-weight: 500;\n color: #92400e;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.hash-value {\n font-family: 'Fira Code', 'Consolas', monospace;\n font-size: 13px;\n color: #78350f;\n word-break: break-all;\n background: rgba(255, 255, 255, 0.5);\n padding: 8px 12px;\n border-radius: 6px;\n}\n\n.info-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 10px 16px;\n}\n\n.info-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 500;\n color: #78350f;\n}\n\n.info-value.never-used {\n color: #6b7280;\n font-style: italic;\n}\n\n/* Edit Section */\n.edit-section {\n background: #f9fafb;\n border-radius: 10px;\n padding: 16px;\n margin-bottom: 16px;\n}\n\n.section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 14px;\n}\n\n.section-header h4 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.edit-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.edit-toggle:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.form-field {\n margin-bottom: 12px;\n}\n\n.form-field label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: #374151;\n margin-bottom: 4px;\n}\n\n.form-input,\n.form-textarea {\n width: 100%;\n}\n\n.expiration-field {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.clear-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px dashed #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.clear-btn:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.edit-actions {\n margin-top: 14px;\n padding-top: 14px;\n border-top: 1px solid #e5e7eb;\n}\n\n/* Danger Zone */\n.danger-zone {\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 10px;\n padding: 14px 16px;\n}\n\n.danger-zone h4 {\n margin: 0 0 12px 0;\n font-size: 12px;\n font-weight: 600;\n color: #dc2626;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.revoke-section {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n}\n\n.revoke-info {\n display: flex;\n gap: 12px;\n flex: 1;\n}\n\n.revoke-info i {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n}\n\n.revoke-info strong {\n display: block;\n color: #991b1b;\n margin-bottom: 4px;\n}\n\n.revoke-info p {\n margin: 0;\n font-size: 13px;\n color: #7f1d1d;\n}\n\n.revoke-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: white;\n border: 1px solid #dc2626;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: #dc2626;\n cursor: pointer;\n transition: all 0.2s ease;\n white-space: nowrap;\n}\n\n.revoke-btn:hover {\n background: #dc2626;\n color: white;\n}\n\n/* Revoke Confirm */\n.revoke-confirm {\n background: #fef2f2;\n border-radius: 8px;\n}\n\n.confirm-warning {\n display: flex;\n gap: 12px;\n margin-bottom: 20px;\n}\n\n.confirm-warning i {\n font-size: 24px;\n color: #dc2626;\n}\n\n.confirm-warning strong {\n display: block;\n color: #991b1b;\n font-size: 16px;\n margin-bottom: 4px;\n}\n\n.confirm-warning p {\n margin: 0;\n font-size: 13px;\n color: #7f1d1d;\n}\n\n.confirm-input {\n margin-bottom: 16px;\n}\n\n.confirm-input label {\n display: block;\n font-size: 14px;\n font-weight: 500;\n color: #7f1d1d;\n margin-bottom: 8px;\n}\n\n.confirm-input code {\n background: #fee2e2;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.confirm-input input {\n width: 100%;\n}\n\n.confirm-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.confirm-revoke-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: #dc2626;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.confirm-revoke-btn:hover:not(:disabled) {\n background: #b91c1c;\n}\n\n.confirm-revoke-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Revoked Notice */\n.revoked-notice {\n display: flex;\n gap: 12px;\n padding: 20px;\n background: #f3f4f6;\n border-radius: 12px;\n}\n\n.revoked-notice i {\n font-size: 24px;\n color: #6b7280;\n}\n\n.revoked-notice strong {\n display: block;\n color: #374151;\n margin-bottom: 4px;\n}\n\n.revoked-notice p {\n margin: 0;\n font-size: 13px;\n color: #6b7280;\n}\n\n/* Scopes Tab */\n.scopes-tab {\n padding: 16px;\n}\n\n.scopes-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding-bottom: 16px;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.scope-count {\n font-size: 14px;\n font-weight: 500;\n color: #374151;\n}\n\n/* Scope Categories */\n.scope-categories {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.scope-category {\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.category-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 14px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.category-header:hover {\n background: #f3f4f6;\n}\n\n.category-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.category-left i {\n font-size: 16px;\n}\n\n.category-name {\n font-weight: 600;\n font-size: 14px;\n color: #1f2937;\n}\n\n.category-count {\n padding: 2px 8px;\n background: #e5e7eb;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.category-right {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.category-all-toggle {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.category-all-toggle:hover {\n border-color: #f59e0b;\n color: #f59e0b;\n}\n\n.category-all-toggle input {\n margin: 0;\n}\n\n.expand-icon {\n color: #9ca3af;\n font-size: 12px;\n transition: transform 0.2s ease;\n}\n\n.category-scopes {\n padding: 8px 16px 16px;\n border-top: 1px solid #e5e7eb;\n background: white;\n}\n\n.scope-item {\n padding: 10px 0;\n border-bottom: 1px solid #f3f4f6;\n}\n\n.scope-item:last-child {\n border-bottom: none;\n}\n\n.scope-label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.scope-info {\n flex: 1;\n}\n\n.scope-name {\n display: block;\n font-weight: 500;\n font-size: 13px;\n color: #374151;\n font-family: monospace;\n}\n\n.scope-desc {\n display: block;\n font-size: 12px;\n color: #6b7280;\n margin-top: 2px;\n}\n\n/* Usage Tab */\n.usage-tab {\n padding: 16px;\n}\n\n.usage-stats {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n}\n\n.stat-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);\n border-radius: 12px;\n text-align: center;\n}\n\n.stat-card i {\n font-size: 24px;\n color: #f59e0b;\n margin-bottom: 12px;\n}\n\n.stat-value {\n font-size: 24px;\n font-weight: 700;\n color: #78350f;\n}\n\n.stat-label {\n font-size: 12px;\n color: #92400e;\n margin-top: 4px;\n}\n\n/* Usage Logs */\n.usage-logs {\n background: #f9fafb;\n border-radius: 10px;\n overflow: hidden;\n}\n\n.log-header {\n display: grid;\n grid-template-columns: 100px 1fr 80px 80px;\n gap: 12px;\n padding: 12px 16px;\n background: #e5e7eb;\n font-size: 11px;\n font-weight: 600;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.log-item {\n display: grid;\n grid-template-columns: 100px 1fr 80px 80px;\n gap: 12px;\n padding: 12px 16px;\n border-bottom: 1px solid #e5e7eb;\n font-size: 13px;\n align-items: center;\n}\n\n.log-item:last-child {\n border-bottom: none;\n}\n\n.col-time {\n color: #6b7280;\n}\n\n.col-endpoint {\n display: flex;\n align-items: center;\n gap: 8px;\n font-family: monospace;\n color: #374151;\n}\n\n.method-badge {\n padding: 2px 6px;\n background: #dbeafe;\n border-radius: 4px;\n font-size: 10px;\n font-weight: 600;\n color: #1d4ed8;\n}\n\n.col-status {\n font-weight: 600;\n}\n\n.col-status.status-success {\n color: #10b981;\n}\n\n.col-status.status-warning {\n color: #f59e0b;\n}\n\n.col-status.status-error {\n color: #ef4444;\n}\n\n.col-duration {\n color: #6b7280;\n text-align: right;\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: 48px 24px;\n color: #6b7280;\n text-align: center;\n}\n\n.empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n\n.empty-state span {\n font-size: 16px;\n font-weight: 500;\n color: #374151;\n}\n\n.empty-state p {\n margin: 8px 0 0 0;\n font-size: 13px;\n}\n\n/* Legacy kendo-window styles removed - now using slideout-panel */\n\n/* Input and form field styling */\n:host ::ng-deep .form-input .k-input,\n:host ::ng-deep .form-textarea .k-input-inner,\n:host ::ng-deep .k-datepicker .k-input {\n padding: 10px 14px;\n border-radius: 8px;\n font-size: 14px;\n border-color: #e5e7eb;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .form-input:focus-within,\n:host ::ng-deep .form-textarea:focus-within,\n:host ::ng-deep .k-datepicker:focus-within {\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.1);\n}\n\n/* Button styling in edit actions */\n:host ::ng-deep .edit-actions .k-button {\n min-width: 120px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .edit-actions .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n:host ::ng-deep .edit-actions .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n/* Scopes header button styling */\n:host ::ng-deep .scopes-header .k-button {\n min-width: 120px;\n padding: 10px 20px;\n font-weight: 600;\n border-radius: 8px;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .scopes-header .k-button-solid-primary {\n background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);\n border: none;\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.3);\n}\n\n:host ::ng-deep .scopes-header .k-button-solid-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.4);\n}\n\n/* No Scopes Warning */\n.no-scopes-warning {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);\n border: 1px solid #fecaca;\n border-radius: 10px;\n margin-bottom: 16px;\n font-size: 13px;\n color: #991b1b;\n}\n\n.no-scopes-warning i {\n font-size: 20px;\n color: #dc2626;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n.no-scopes-warning strong {\n display: block;\n color: #991b1b;\n font-size: 14px;\n margin-bottom: 4px;\n}\n\n.no-scopes-warning p {\n margin: 0;\n line-height: 1.5;\n}\n"] }]
|
|
1057
1063
|
}], null, { Visible: [{
|
|
1058
1064
|
type: Input
|
|
1059
1065
|
}], KeyId: [{
|
|
@@ -1070,5 +1076,5 @@ export class APIKeyEditPanelComponent {
|
|
|
1070
1076
|
type: HostListener,
|
|
1071
1077
|
args: ['document:keydown.escape']
|
|
1072
1078
|
}] }); })();
|
|
1073
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIKeyEditPanelComponent, { className: "APIKeyEditPanelComponent", filePath: "src/APIKeys/api-key-edit-panel.component.ts", lineNumber:
|
|
1079
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(APIKeyEditPanelComponent, { className: "APIKeyEditPanelComponent", filePath: "src/APIKeys/api-key-edit-panel.component.ts", lineNumber: 42 }); })();
|
|
1074
1080
|
//# sourceMappingURL=api-key-edit-panel.component.js.map
|