@memberjunction/ng-dashboards 5.30.1 → 5.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +4 -4
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +8 -6
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +6 -5
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +2 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +6 -5
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +6 -5
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +2 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +7 -4
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +3 -2
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +10 -6
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +2 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +6 -5
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +2 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +6 -5
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +55 -52
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -15
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -3
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +2 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +10 -8
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts +2 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +13 -10
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1181 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -0
- package/dist/AI/components/tags/tags-resource.component.js +7487 -0
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +25 -21
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +5 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +12 -4
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +5 -4
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts +2 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +5 -5
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +11 -10
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.d.ts +2 -1
- package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +6 -5
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +4 -4
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +8 -6
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.d.ts +3 -2
- package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +10 -8
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts +2 -1
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +6 -5
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts +2 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +6 -5
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +1 -1
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts +2 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +6 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts +2 -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 +7 -5
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts +2 -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 +7 -5
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +4 -4
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +1 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +1 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +1 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +3 -3
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +5 -4
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +2 -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 +6 -4
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +11 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +61 -27
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +19 -11
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts +4 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +11 -3
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +10 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +18 -9
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts +11 -1
- package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-studio-state.service.js +23 -3
- package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts +6 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +16 -6
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -1
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +13 -13
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts +4 -0
- package/dist/DashboardBrowser/dashboard-share-adapter.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-adapter.js +5 -2
- package/dist/DashboardBrowser/dashboard-share-adapter.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +3 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +9 -4
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +3 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +7 -6
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +3 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +6 -5
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +10 -9
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +6 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +15 -5
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts +64 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js +400 -0
- package/dist/DatabaseDesigner/components/create-wizard/database-create-wizard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts +42 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js +232 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-basics.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts +14 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js +38 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-fields.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts +24 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js +77 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-pipeline.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts +88 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js +404 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-relationships.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts +12 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js +116 -0
- package/dist/DatabaseDesigner/components/create-wizard/steps/step-review.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +55 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +204 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +61 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js +485 -0
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts +52 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js +320 -0
- package/dist/DatabaseDesigner/components/modify/database-modify.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts +79 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js +378 -0
- package/dist/DatabaseDesigner/components/shared/database-preview-pane.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts +85 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js +429 -0
- package/dist/DatabaseDesigner/components/shared/entity-fields-grid.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts +58 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js +333 -0
- package/dist/DatabaseDesigner/components/shared/entity-pipeline-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts +36 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js +345 -0
- package/dist/DatabaseDesigner/components/shared/entity-review-panel.component.js.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts +13 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.d.ts.map +1 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js +81 -0
- package/dist/DatabaseDesigner/components/shared/wizard-step-indicator.component.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +30 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +131 -0
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts +19 -0
- package/dist/DatabaseDesigner/database-designer-erd.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer-erd.js +84 -0
- package/dist/DatabaseDesigner/database-designer-erd.js.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts +167 -0
- package/dist/DatabaseDesigner/database-designer.types.d.ts.map +1 -0
- package/dist/DatabaseDesigner/database-designer.types.js +26 -0
- package/dist/DatabaseDesigner/database-designer.types.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts +94 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js +392 -0
- package/dist/DatabaseDesigner/services/database-designer.engine.js.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts +78 -0
- package/dist/DatabaseDesigner/services/database-designer.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js +273 -0
- package/dist/DatabaseDesigner/services/database-designer.service.js.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts +79 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.d.ts.map +1 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js +204 -0
- package/dist/DatabaseDesigner/services/entity-wizard-state.service.js.map +1 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-config-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-config-dialog.component.js +6 -4
- package/dist/Home/action-pin-config-dialog.component.js.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts +2 -1
- package/dist/Home/action-pin-runner-dialog.component.d.ts.map +1 -1
- package/dist/Home/action-pin-runner-dialog.component.js +5 -4
- package/dist/Home/action-pin-runner-dialog.component.js.map +1 -1
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +10 -12
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +3 -3
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +11 -10
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -2
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +1 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +5 -4
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +5 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +27 -19
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +8 -6
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +6 -6
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +3 -3
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +6 -6
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +4 -4
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +6 -6
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +11 -10
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +5 -0
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +11 -3
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +8 -6
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts +2 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +7 -5
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +12 -12
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Permissions/permissions-shared.d.ts +3 -3
- package/dist/Permissions/permissions-shared.d.ts.map +1 -1
- package/dist/Permissions/permissions-shared.js +5 -5
- package/dist/Permissions/permissions-shared.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +1 -1
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +1 -2
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +5 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +21 -13
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +9 -7
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts +6 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.js +21 -11
- package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +3 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +15 -11
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +5 -5
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +1 -2
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +35 -34
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +6 -0
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +3 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +4 -3
- package/dist/shared/entity-field-display.d.ts.map +1 -1
- package/dist/shared/entity-field-display.js +9 -9
- package/dist/shared/entity-field-display.js.map +1 -1
- package/package.json +52 -51
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-key-list.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-key-list.component.ts","../../src/APIKeys/api-key-list.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIKeyScopeEntity, MJAPIScopeEntity } from '@memberjunction/core-entities';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\n\n/** Filter options for the list */\nexport type APIKeyFilter = 'all' | 'active' | 'revoked' | 'expiring' | 'expired' | 'never-used';\n\n/** Category scope display */\ninterface CategoryScopeCount {\n category: string;\n count: number;\n color: string;\n icon: string;\n}\n\n/** Scope info for display */\ninterface KeyScopeInfo {\n count: number;\n preview: string[];\n categories: CategoryScopeCount[];\n}\n/**\n * List view component for displaying and filtering API keys\n */\n@Component({\n standalone: false,\n selector: 'mj-api-key-list',\n templateUrl: './api-key-list.component.html',\n styleUrls: ['./api-key-list.component.css']\n})\nexport class APIKeyListComponent implements OnInit, OnChanges {\n @Input() Filter: APIKeyFilter = 'all';\n @Output() KeySelected = new EventEmitter<MJAPIKeyEntity>();\n @Output() CreateRequested = new EventEmitter<void>();\n\n // Expose Math for template\n public Math = Math;\n\n // Data\n public AllKeys: MJAPIKeyEntity[] = [];\n public FilteredKeys: MJAPIKeyEntity[] = [];\n public IsLoading = true;\n\n // Search\n public SearchText = '';\n\n // Sorting\n public SortField: 'Label' | 'Status' | 'User' | 'LastUsedAt' | 'ExpiresAt' | '__mj_CreatedAt' = '__mj_CreatedAt';\n public SortDirection: 'asc' | 'desc' = 'desc';\n\n // Pagination\n public PageSize = 20;\n public CurrentPage = 1;\n\n // Statistics\n public Stats = {\n total: 0,\n active: 0,\n revoked: 0,\n expiring: 0,\n expired: 0,\n neverUsed: 0\n };\n\n // Scope counts per key\n public KeyScopeMap = new Map<string, KeyScopeInfo>();\n private AllScopes: MJAPIScopeEntity[] = [];\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n // Dynamic category UI config built from root scopes\n private categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n\n async ngOnInit(): Promise<void> {\n await this.loadKeys();\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['Filter'] && !changes['Filter'].firstChange) {\n this.applyFilters();\n }\n }\n\n /**\n * Load all API keys\n */\n public async loadKeys(): Promise<void> {\n this.IsLoading = true;\n try {\n const rv = new RunView();\n const base = APIKeysEngineBase.Instance;\n\n // Load keys and key-scope assignments (scopes from cache)\n const [keysResult, keyScopesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: API Keys',\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: API Key Scopes',\n ResultType: 'entity_object'\n }\n ]);\n\n if (keysResult.Success) {\n this.AllKeys = keysResult.Results as MJAPIKeyEntity[];\n this.AllScopes = base.Scopes;\n\n // Build category UI config from root scopes\n this.categoryUIConfigs.clear();\n for (const scope of this.AllScopes) {\n if (!scope.ParentID) {\n const uiConfig = parseAPIScopeUIConfig(scope);\n this.categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n // Build scope lookup map\n const scopeMap = new Map<string, MJAPIScopeEntity>();\n for (const scope of this.AllScopes) {\n scopeMap.set(scope.ID, scope);\n }\n\n // Build key scope counts with category breakdown\n this.KeyScopeMap.clear();\n if (keyScopesResult.Success) {\n const keyScopes = keyScopesResult.Results as MJAPIKeyScopeEntity[];\n const keyToScopes = new Map<string, { names: string[]; categories: Map<string, number> }>();\n\n for (const ks of keyScopes) {\n if (!keyToScopes.has(ks.APIKeyID)) {\n keyToScopes.set(ks.APIKeyID, { names: [], categories: new Map() });\n }\n const scope = scopeMap.get(ks.ScopeID);\n if (scope) {\n const keyData = keyToScopes.get(ks.APIKeyID)!;\n keyData.names.push(scope.FullPath || scope.Name);\n const category = scope.Category || 'Other';\n keyData.categories.set(category, (keyData.categories.get(category) || 0) + 1);\n }\n }\n\n for (const [keyId, data] of keyToScopes.entries()) {\n const categories: CategoryScopeCount[] = Array.from(data.categories.entries())\n .map(([category, count]) => {\n const config = this.categoryUIConfigs.get(category) || this.defaultUIConfig;\n return {\n category,\n count,\n color: config.color,\n icon: config.icon\n };\n })\n .sort((a, b) => b.count - a.count);\n\n this.KeyScopeMap.set(keyId, {\n count: data.names.length,\n preview: data.names.slice(0, 3),\n categories\n });\n }\n }\n\n this.calculateStats();\n this.applyFilters();\n }\n } catch (error) {\n console.error('Error loading API keys:', error);\n } finally {\n this.IsLoading = false;\n }\n }\n\n /**\n * Get scope info for a key\n */\n public getScopeInfo(key: MJAPIKeyEntity): KeyScopeInfo {\n return this.KeyScopeMap.get(key.ID) || { count: 0, preview: [], categories: [] };\n }\n\n /**\n * Calculate statistics\n */\n private calculateStats(): void {\n const now = new Date();\n const thirtyDaysFromNow = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n this.Stats = {\n total: this.AllKeys.length,\n active: this.AllKeys.filter(k => k.Status === 'Active').length,\n revoked: this.AllKeys.filter(k => k.Status === 'Revoked').length,\n expiring: this.AllKeys.filter(k =>\n k.Status === 'Active' &&\n k.ExpiresAt &&\n new Date(k.ExpiresAt) > now &&\n new Date(k.ExpiresAt) < thirtyDaysFromNow\n ).length,\n expired: this.AllKeys.filter(k =>\n k.ExpiresAt && new Date(k.ExpiresAt) < now\n ).length,\n neverUsed: this.AllKeys.filter(k =>\n k.Status === 'Active' && !k.LastUsedAt\n ).length\n };\n }\n\n /**\n * Apply filters and sorting\n */\n public applyFilters(): void {\n const now = new Date();\n const thirtyDaysFromNow = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n let filtered = [...this.AllKeys];\n\n // Apply status filter\n switch (this.Filter) {\n case 'active':\n filtered = filtered.filter(k => k.Status === 'Active');\n break;\n case 'revoked':\n filtered = filtered.filter(k => k.Status === 'Revoked');\n break;\n case 'expiring':\n filtered = filtered.filter(k =>\n k.Status === 'Active' &&\n k.ExpiresAt &&\n new Date(k.ExpiresAt) > now &&\n new Date(k.ExpiresAt) < thirtyDaysFromNow\n );\n break;\n case 'expired':\n filtered = filtered.filter(k =>\n k.ExpiresAt && new Date(k.ExpiresAt) < now\n );\n break;\n case 'never-used':\n filtered = filtered.filter(k =>\n k.Status === 'Active' && !k.LastUsedAt\n );\n break;\n }\n\n // Apply search filter\n if (this.SearchText.trim()) {\n const search = this.SearchText.toLowerCase();\n filtered = filtered.filter(k =>\n k.Label.toLowerCase().includes(search) ||\n (k.Description && k.Description.toLowerCase().includes(search)) ||\n k.User.toLowerCase().includes(search) ||\n k.Hash.toLowerCase().includes(search)\n );\n }\n\n // Apply sorting\n filtered.sort((a, b) => {\n let aVal: string | number | Date | null = null;\n let bVal: string | number | Date | null = null;\n\n switch (this.SortField) {\n case 'Label':\n aVal = a.Label.toLowerCase();\n bVal = b.Label.toLowerCase();\n break;\n case 'Status':\n aVal = a.Status;\n bVal = b.Status;\n break;\n case 'User':\n aVal = a.User.toLowerCase();\n bVal = b.User.toLowerCase();\n break;\n case 'LastUsedAt':\n aVal = a.LastUsedAt ? new Date(a.LastUsedAt).getTime() : 0;\n bVal = b.LastUsedAt ? new Date(b.LastUsedAt).getTime() : 0;\n break;\n case 'ExpiresAt':\n aVal = a.ExpiresAt ? new Date(a.ExpiresAt).getTime() : Number.MAX_SAFE_INTEGER;\n bVal = b.ExpiresAt ? new Date(b.ExpiresAt).getTime() : Number.MAX_SAFE_INTEGER;\n break;\n case '__mj_CreatedAt':\n aVal = new Date(a.__mj_CreatedAt).getTime();\n bVal = new Date(b.__mj_CreatedAt).getTime();\n break;\n }\n\n if (aVal < bVal) return this.SortDirection === 'asc' ? -1 : 1;\n if (aVal > bVal) return this.SortDirection === 'asc' ? 1 : -1;\n return 0;\n });\n\n this.FilteredKeys = filtered;\n this.CurrentPage = 1;\n }\n\n /**\n * Handle search input\n */\n public onSearch(): void {\n this.applyFilters();\n }\n\n /**\n * Clear search\n */\n public clearSearch(): void {\n this.SearchText = '';\n this.applyFilters();\n }\n\n /**\n * Set filter\n */\n public setFilter(filter: APIKeyFilter): void {\n this.Filter = filter;\n this.applyFilters();\n }\n\n /**\n * Toggle sort\n */\n public toggleSort(field: typeof this.SortField): void {\n if (this.SortField === field) {\n this.SortDirection = this.SortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDirection = field === 'Label' ? 'asc' : 'desc';\n }\n this.applyFilters();\n }\n\n /**\n * Get sort icon class\n */\n public getSortIcon(field: typeof this.SortField): string {\n if (this.SortField !== field) return 'fa-solid fa-sort';\n return this.SortDirection === 'asc' ? 'fa-solid fa-sort-up' : 'fa-solid fa-sort-down';\n }\n\n /**\n * Get paginated keys\n */\n public getPaginatedKeys(): MJAPIKeyEntity[] {\n const start = (this.CurrentPage - 1) * this.PageSize;\n return this.FilteredKeys.slice(start, start + this.PageSize);\n }\n\n /**\n * Get total pages\n */\n public getTotalPages(): number {\n return Math.ceil(this.FilteredKeys.length / this.PageSize);\n }\n\n /**\n * Go to page\n */\n public goToPage(page: number): void {\n if (page >= 1 && page <= this.getTotalPages()) {\n this.CurrentPage = page;\n }\n }\n\n /**\n * Get page numbers to display\n */\n public getPageNumbers(): number[] {\n const total = this.getTotalPages();\n const current = this.CurrentPage;\n const pages: number[] = [];\n\n if (total <= 7) {\n for (let i = 1; i <= total; i++) pages.push(i);\n } else {\n pages.push(1);\n if (current > 3) pages.push(-1); // ellipsis\n\n const start = Math.max(2, current - 1);\n const end = Math.min(total - 1, current + 1);\n\n for (let i = start; i <= end; i++) pages.push(i);\n\n if (current < total - 2) pages.push(-1); // ellipsis\n pages.push(total);\n }\n\n return pages;\n }\n\n /**\n * Select a key\n */\n public selectKey(key: MJAPIKeyEntity): void {\n this.KeySelected.emit(key);\n }\n\n /**\n * Request key creation\n */\n public requestCreate(): void {\n this.CreateRequested.emit();\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const d = new Date(date);\n const diff = now.getTime() - d.getTime();\n const days = Math.floor(diff / 86400000);\n\n if (days === 0) {\n const hours = Math.floor(diff / 3600000);\n if (hours === 0) {\n const minutes = Math.floor(diff / 60000);\n return minutes < 1 ? 'Just now' : `${minutes}m ago`;\n }\n return `${hours}h ago`;\n }\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n /**\n * Format expiration for display\n */\n public formatExpiration(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const d = new Date(date);\n const diff = d.getTime() - now.getTime();\n\n if (diff < 0) return 'Expired';\n\n const days = Math.floor(diff / 86400000);\n if (days === 0) return 'Today';\n if (days === 1) return 'Tomorrow';\n if (days < 30) return `${days} days`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n /**\n * Get expiration status class\n */\n public getExpirationClass(key: MJAPIKeyEntity): string {\n if (!key.ExpiresAt) return 'never';\n\n const now = new Date();\n const expiresAt = new Date(key.ExpiresAt);\n const diff = expiresAt.getTime() - now.getTime();\n const days = Math.floor(diff / 86400000);\n\n if (diff < 0) return 'expired';\n if (days < 7) return 'critical';\n if (days < 30) return 'warning';\n return 'ok';\n }\n\n /**\n * Get filter count\n */\n public getFilterCount(filter: APIKeyFilter): number {\n switch (filter) {\n case 'all': return this.Stats.total;\n case 'active': return this.Stats.active;\n case 'revoked': return this.Stats.revoked;\n case 'expiring': return this.Stats.expiring;\n case 'expired': return this.Stats.expired;\n case 'never-used': return this.Stats.neverUsed;\n }\n }\n}\n","<div class=\"list-container\">\n <!-- Header -->\n <div class=\"list-header\">\n <div class=\"header-left\">\n <h3>API Keys</h3>\n <span class=\"count-badge\">{{FilteredKeys.length}} of {{AllKeys.length}}</span>\n </div>\n <div class=\"header-right\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\" [(ngModel)]=\"SearchText\"\n (ngModelChange)=\"onSearch()\"\n placeholder=\"Search keys...\" />\n @if (SearchText) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <button class=\"create-btn\" (click)=\"requestCreate()\">\n <i class=\"fa-solid fa-plus\"></i>\n Generate Key\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs -->\n <div class=\"filter-tabs\">\n <button class=\"filter-tab\" [class.active]=\"Filter === 'all'\"\n (click)=\"setFilter('all')\">\n All\n <span class=\"tab-count\">{{Stats.total}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'active'\"\n (click)=\"setFilter('active')\">\n <i class=\"fa-solid fa-check-circle status-active\"></i>\n Active\n <span class=\"tab-count\">{{Stats.active}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'expiring'\"\n [class.has-warning]=\"Stats.expiring > 0\"\n (click)=\"setFilter('expiring')\">\n <i class=\"fa-solid fa-clock status-warning\"></i>\n Expiring Soon\n <span class=\"tab-count\">{{Stats.expiring}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'expired'\"\n [class.has-danger]=\"Stats.expired > 0\"\n (click)=\"setFilter('expired')\">\n <i class=\"fa-solid fa-circle-exclamation status-danger\"></i>\n Expired\n <span class=\"tab-count\">{{Stats.expired}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'never-used'\"\n (click)=\"setFilter('never-used')\">\n <i class=\"fa-solid fa-question-circle status-info\"></i>\n Never Used\n <span class=\"tab-count\">{{Stats.neverUsed}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'revoked'\"\n (click)=\"setFilter('revoked')\">\n <i class=\"fa-solid fa-ban status-revoked\"></i>\n Revoked\n <span class=\"tab-count\">{{Stats.revoked}}</span>\n </button>\n </div>\n\n <!-- Loading -->\n @if (IsLoading) {\n <mj-loading text=\"Loading API keys...\"></mj-loading>\n }\n\n <!-- Grid -->\n @if (!IsLoading) {\n <div class=\"key-grid\">\n <!-- Header Row -->\n <div class=\"grid-header\">\n <div class=\"col-key sortable\" (click)=\"toggleSort('Label')\">\n Key\n <i [class]=\"getSortIcon('Label')\"></i>\n </div>\n <div class=\"col-owner sortable\" (click)=\"toggleSort('User')\">\n Owner\n <i [class]=\"getSortIcon('User')\"></i>\n </div>\n <div class=\"col-status sortable\" (click)=\"toggleSort('Status')\">\n Status\n <i [class]=\"getSortIcon('Status')\"></i>\n </div>\n <div class=\"col-scopes\">\n Scopes\n </div>\n <div class=\"col-expires sortable\" (click)=\"toggleSort('ExpiresAt')\">\n Expires\n <i [class]=\"getSortIcon('ExpiresAt')\"></i>\n </div>\n <div class=\"col-used sortable\" (click)=\"toggleSort('LastUsedAt')\">\n Last Used\n <i [class]=\"getSortIcon('LastUsedAt')\"></i>\n </div>\n <div class=\"col-created sortable\" (click)=\"toggleSort('__mj_CreatedAt')\">\n Created\n <i [class]=\"getSortIcon('__mj_CreatedAt')\"></i>\n </div>\n </div>\n <!-- Key Rows -->\n @for (key of getPaginatedKeys(); track key) {\n <div class=\"grid-row\"\n (click)=\"selectKey(key)\">\n <div class=\"col-key\">\n <div class=\"key-icon\" [class.active]=\"key.Status === 'Active'\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"key-details\">\n <span class=\"key-label\">{{key.Label}}</span>\n <code class=\"key-hash\">...{{key.Hash.slice(-12)}}</code>\n </div>\n </div>\n <div class=\"col-owner\">\n <span class=\"owner-name\">{{key.User}}</span>\n </div>\n <div class=\"col-status\">\n <span class=\"status-badge\" [class.active]=\"key.Status === 'Active'\"\n [class.revoked]=\"key.Status === 'Revoked'\">\n {{key.Status}}\n </span>\n </div>\n <div class=\"col-scopes\">\n @if (getScopeInfo(key).count > 0) {\n <div class=\"scopes-display\">\n <div class=\"scope-badges\">\n @for (cat of getScopeInfo(key).categories; track cat; let i = $index) {\n @if (i < 3) {\n <span class=\"scope-badge\"\n [style.backgroundColor]=\"cat.color + '15'\"\n [style.color]=\"cat.color\"\n [title]=\"cat.category + ': ' + cat.count + ' scope(s)'\">\n <i [class]=\"cat.icon\"></i>\n <span class=\"badge-count\">{{cat.count}}</span>\n </span>\n }\n }\n @if (getScopeInfo(key).categories.length > 3) {\n <span class=\"scope-more\">\n +{{getScopeInfo(key).categories.length - 3}}\n </span>\n }\n </div>\n <span class=\"scopes-total\">\n {{getScopeInfo(key).count}} total\n </span>\n </div>\n }\n @if (getScopeInfo(key).count === 0) {\n <span class=\"no-scopes\">\n <i class=\"fa-solid fa-shield-xmark\"></i>\n None\n </span>\n }\n </div>\n <div class=\"col-expires\">\n <span class=\"expires-value\" [ngClass]=\"getExpirationClass(key)\">\n {{formatExpiration(key.ExpiresAt)}}\n </span>\n </div>\n <div class=\"col-used\">\n <span class=\"used-value\" [class.never]=\"!key.LastUsedAt\">\n {{formatDate(key.LastUsedAt)}}\n </span>\n </div>\n <div class=\"col-created\">\n <span class=\"created-value\">{{formatDate(key.__mj_CreatedAt)}}</span>\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredKeys.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-key\"></i>\n @if (SearchText) {\n <span>No keys matching \"{{SearchText}}\"</span>\n }\n @if (!SearchText && Filter !== 'all') {\n <span>No {{Filter}} keys found</span>\n }\n @if (!SearchText && Filter === 'all') {\n <span>No API keys created yet</span>\n }\n @if (Filter === 'all' && !SearchText) {\n <button class=\"create-empty-btn\"\n (click)=\"requestCreate()\">\n <i class=\"fa-solid fa-plus\"></i>\n Generate Your First Key\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Pagination -->\n @if (!IsLoading && FilteredKeys.length > PageSize) {\n <div class=\"pagination\">\n <div class=\"page-info\">\n Showing {{(CurrentPage - 1) * PageSize + 1}} - {{Math.min(CurrentPage * PageSize, FilteredKeys.length)}}\n of {{FilteredKeys.length}}\n </div>\n <div class=\"page-buttons\">\n <button class=\"page-btn\" [disabled]=\"CurrentPage === 1\"\n (click)=\"goToPage(CurrentPage - 1)\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n @for (page of getPageNumbers(); track page) {\n @if (page > 0) {\n <button class=\"page-btn\"\n [class.active]=\"page === CurrentPage\"\n (click)=\"goToPage(page)\">\n {{page}}\n </button>\n }\n @if (page === -1) {\n <span class=\"page-ellipsis\">...</span>\n }\n }\n <button class=\"page-btn\" [disabled]=\"CurrentPage === getTotalPages()\"\n (click)=\"goToPage(CurrentPage + 1)\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"api-key-list.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-key-list.component.ts","../../src/APIKeys/api-key-list.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIKeyScopeEntity, MJAPIScopeEntity } from '@memberjunction/core-entities';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n/** Filter options for the list */\nexport type APIKeyFilter = 'all' | 'active' | 'revoked' | 'expiring' | 'expired' | 'never-used';\n\n/** Category scope display */\ninterface CategoryScopeCount {\n category: string;\n count: number;\n color: string;\n icon: string;\n}\n\n/** Scope info for display */\ninterface KeyScopeInfo {\n count: number;\n preview: string[];\n categories: CategoryScopeCount[];\n}\n/**\n * List view component for displaying and filtering API keys\n */\n@Component({\n standalone: false,\n selector: 'mj-api-key-list',\n templateUrl: './api-key-list.component.html',\n styleUrls: ['./api-key-list.component.css']\n})\nexport class APIKeyListComponent extends BaseAngularComponent implements OnInit, OnChanges {\n @Input() Filter: APIKeyFilter = 'all';\n @Output() KeySelected = new EventEmitter<MJAPIKeyEntity>();\n @Output() CreateRequested = new EventEmitter<void>();\n\n // Expose Math for template\n public Math = Math;\n\n // Data\n public AllKeys: MJAPIKeyEntity[] = [];\n public FilteredKeys: MJAPIKeyEntity[] = [];\n public IsLoading = true;\n\n // Search\n public SearchText = '';\n\n // Sorting\n public SortField: 'Label' | 'Status' | 'User' | 'LastUsedAt' | 'ExpiresAt' | '__mj_CreatedAt' = '__mj_CreatedAt';\n public SortDirection: 'asc' | 'desc' = 'desc';\n\n // Pagination\n public PageSize = 20;\n public CurrentPage = 1;\n\n // Statistics\n public Stats = {\n total: 0,\n active: 0,\n revoked: 0,\n expiring: 0,\n expired: 0,\n neverUsed: 0\n };\n\n // Scope counts per key\n public KeyScopeMap = new Map<string, KeyScopeInfo>();\n private AllScopes: MJAPIScopeEntity[] = [];\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n // Dynamic category UI config built from root scopes\n private categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n\n async ngOnInit(): Promise<void> {\n await this.loadKeys();\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['Filter'] && !changes['Filter'].firstChange) {\n this.applyFilters();\n }\n }\n\n /**\n * Load all API keys\n */\n public async loadKeys(): Promise<void> {\n this.IsLoading = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const base = APIKeysEngineBase.Instance;\n\n // Load keys and key-scope assignments (scopes from cache)\n const [keysResult, keyScopesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: API Keys',\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n },\n {\n EntityName: 'MJ: API Key Scopes',\n ResultType: 'entity_object'\n }\n ]);\n\n if (keysResult.Success) {\n this.AllKeys = keysResult.Results as MJAPIKeyEntity[];\n this.AllScopes = base.Scopes;\n\n // Build category UI config from root scopes\n this.categoryUIConfigs.clear();\n for (const scope of this.AllScopes) {\n if (!scope.ParentID) {\n const uiConfig = parseAPIScopeUIConfig(scope);\n this.categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n // Build scope lookup map\n const scopeMap = new Map<string, MJAPIScopeEntity>();\n for (const scope of this.AllScopes) {\n scopeMap.set(scope.ID, scope);\n }\n\n // Build key scope counts with category breakdown\n this.KeyScopeMap.clear();\n if (keyScopesResult.Success) {\n const keyScopes = keyScopesResult.Results as MJAPIKeyScopeEntity[];\n const keyToScopes = new Map<string, { names: string[]; categories: Map<string, number> }>();\n\n for (const ks of keyScopes) {\n if (!keyToScopes.has(ks.APIKeyID)) {\n keyToScopes.set(ks.APIKeyID, { names: [], categories: new Map() });\n }\n const scope = scopeMap.get(ks.ScopeID);\n if (scope) {\n const keyData = keyToScopes.get(ks.APIKeyID)!;\n keyData.names.push(scope.FullPath || scope.Name);\n const category = scope.Category || 'Other';\n keyData.categories.set(category, (keyData.categories.get(category) || 0) + 1);\n }\n }\n\n for (const [keyId, data] of keyToScopes.entries()) {\n const categories: CategoryScopeCount[] = Array.from(data.categories.entries())\n .map(([category, count]) => {\n const config = this.categoryUIConfigs.get(category) || this.defaultUIConfig;\n return {\n category,\n count,\n color: config.color,\n icon: config.icon\n };\n })\n .sort((a, b) => b.count - a.count);\n\n this.KeyScopeMap.set(keyId, {\n count: data.names.length,\n preview: data.names.slice(0, 3),\n categories\n });\n }\n }\n\n this.calculateStats();\n this.applyFilters();\n }\n } catch (error) {\n console.error('Error loading API keys:', error);\n } finally {\n this.IsLoading = false;\n }\n }\n\n /**\n * Get scope info for a key\n */\n public getScopeInfo(key: MJAPIKeyEntity): KeyScopeInfo {\n return this.KeyScopeMap.get(key.ID) || { count: 0, preview: [], categories: [] };\n }\n\n /**\n * Calculate statistics\n */\n private calculateStats(): void {\n const now = new Date();\n const thirtyDaysFromNow = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n this.Stats = {\n total: this.AllKeys.length,\n active: this.AllKeys.filter(k => k.Status === 'Active').length,\n revoked: this.AllKeys.filter(k => k.Status === 'Revoked').length,\n expiring: this.AllKeys.filter(k =>\n k.Status === 'Active' &&\n k.ExpiresAt &&\n new Date(k.ExpiresAt) > now &&\n new Date(k.ExpiresAt) < thirtyDaysFromNow\n ).length,\n expired: this.AllKeys.filter(k =>\n k.ExpiresAt && new Date(k.ExpiresAt) < now\n ).length,\n neverUsed: this.AllKeys.filter(k =>\n k.Status === 'Active' && !k.LastUsedAt\n ).length\n };\n }\n\n /**\n * Apply filters and sorting\n */\n public applyFilters(): void {\n const now = new Date();\n const thirtyDaysFromNow = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n let filtered = [...this.AllKeys];\n\n // Apply status filter\n switch (this.Filter) {\n case 'active':\n filtered = filtered.filter(k => k.Status === 'Active');\n break;\n case 'revoked':\n filtered = filtered.filter(k => k.Status === 'Revoked');\n break;\n case 'expiring':\n filtered = filtered.filter(k =>\n k.Status === 'Active' &&\n k.ExpiresAt &&\n new Date(k.ExpiresAt) > now &&\n new Date(k.ExpiresAt) < thirtyDaysFromNow\n );\n break;\n case 'expired':\n filtered = filtered.filter(k =>\n k.ExpiresAt && new Date(k.ExpiresAt) < now\n );\n break;\n case 'never-used':\n filtered = filtered.filter(k =>\n k.Status === 'Active' && !k.LastUsedAt\n );\n break;\n }\n\n // Apply search filter\n if (this.SearchText.trim()) {\n const search = this.SearchText.toLowerCase();\n filtered = filtered.filter(k =>\n k.Label.toLowerCase().includes(search) ||\n (k.Description && k.Description.toLowerCase().includes(search)) ||\n k.User.toLowerCase().includes(search) ||\n k.Hash.toLowerCase().includes(search)\n );\n }\n\n // Apply sorting\n filtered.sort((a, b) => {\n let aVal: string | number | Date | null = null;\n let bVal: string | number | Date | null = null;\n\n switch (this.SortField) {\n case 'Label':\n aVal = a.Label.toLowerCase();\n bVal = b.Label.toLowerCase();\n break;\n case 'Status':\n aVal = a.Status;\n bVal = b.Status;\n break;\n case 'User':\n aVal = a.User.toLowerCase();\n bVal = b.User.toLowerCase();\n break;\n case 'LastUsedAt':\n aVal = a.LastUsedAt ? new Date(a.LastUsedAt).getTime() : 0;\n bVal = b.LastUsedAt ? new Date(b.LastUsedAt).getTime() : 0;\n break;\n case 'ExpiresAt':\n aVal = a.ExpiresAt ? new Date(a.ExpiresAt).getTime() : Number.MAX_SAFE_INTEGER;\n bVal = b.ExpiresAt ? new Date(b.ExpiresAt).getTime() : Number.MAX_SAFE_INTEGER;\n break;\n case '__mj_CreatedAt':\n aVal = new Date(a.__mj_CreatedAt).getTime();\n bVal = new Date(b.__mj_CreatedAt).getTime();\n break;\n }\n\n if (aVal < bVal) return this.SortDirection === 'asc' ? -1 : 1;\n if (aVal > bVal) return this.SortDirection === 'asc' ? 1 : -1;\n return 0;\n });\n\n this.FilteredKeys = filtered;\n this.CurrentPage = 1;\n }\n\n /**\n * Handle search input\n */\n public onSearch(): void {\n this.applyFilters();\n }\n\n /**\n * Clear search\n */\n public clearSearch(): void {\n this.SearchText = '';\n this.applyFilters();\n }\n\n /**\n * Set filter\n */\n public setFilter(filter: APIKeyFilter): void {\n this.Filter = filter;\n this.applyFilters();\n }\n\n /**\n * Toggle sort\n */\n public toggleSort(field: typeof this.SortField): void {\n if (this.SortField === field) {\n this.SortDirection = this.SortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortField = field;\n this.SortDirection = field === 'Label' ? 'asc' : 'desc';\n }\n this.applyFilters();\n }\n\n /**\n * Get sort icon class\n */\n public getSortIcon(field: typeof this.SortField): string {\n if (this.SortField !== field) return 'fa-solid fa-sort';\n return this.SortDirection === 'asc' ? 'fa-solid fa-sort-up' : 'fa-solid fa-sort-down';\n }\n\n /**\n * Get paginated keys\n */\n public getPaginatedKeys(): MJAPIKeyEntity[] {\n const start = (this.CurrentPage - 1) * this.PageSize;\n return this.FilteredKeys.slice(start, start + this.PageSize);\n }\n\n /**\n * Get total pages\n */\n public getTotalPages(): number {\n return Math.ceil(this.FilteredKeys.length / this.PageSize);\n }\n\n /**\n * Go to page\n */\n public goToPage(page: number): void {\n if (page >= 1 && page <= this.getTotalPages()) {\n this.CurrentPage = page;\n }\n }\n\n /**\n * Get page numbers to display\n */\n public getPageNumbers(): number[] {\n const total = this.getTotalPages();\n const current = this.CurrentPage;\n const pages: number[] = [];\n\n if (total <= 7) {\n for (let i = 1; i <= total; i++) pages.push(i);\n } else {\n pages.push(1);\n if (current > 3) pages.push(-1); // ellipsis\n\n const start = Math.max(2, current - 1);\n const end = Math.min(total - 1, current + 1);\n\n for (let i = start; i <= end; i++) pages.push(i);\n\n if (current < total - 2) pages.push(-1); // ellipsis\n pages.push(total);\n }\n\n return pages;\n }\n\n /**\n * Select a key\n */\n public selectKey(key: MJAPIKeyEntity): void {\n this.KeySelected.emit(key);\n }\n\n /**\n * Request key creation\n */\n public requestCreate(): void {\n this.CreateRequested.emit();\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const d = new Date(date);\n const diff = now.getTime() - d.getTime();\n const days = Math.floor(diff / 86400000);\n\n if (days === 0) {\n const hours = Math.floor(diff / 3600000);\n if (hours === 0) {\n const minutes = Math.floor(diff / 60000);\n return minutes < 1 ? 'Just now' : `${minutes}m ago`;\n }\n return `${hours}h ago`;\n }\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n /**\n * Format expiration for display\n */\n public formatExpiration(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const d = new Date(date);\n const diff = d.getTime() - now.getTime();\n\n if (diff < 0) return 'Expired';\n\n const days = Math.floor(diff / 86400000);\n if (days === 0) return 'Today';\n if (days === 1) return 'Tomorrow';\n if (days < 30) return `${days} days`;\n\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });\n }\n\n /**\n * Get expiration status class\n */\n public getExpirationClass(key: MJAPIKeyEntity): string {\n if (!key.ExpiresAt) return 'never';\n\n const now = new Date();\n const expiresAt = new Date(key.ExpiresAt);\n const diff = expiresAt.getTime() - now.getTime();\n const days = Math.floor(diff / 86400000);\n\n if (diff < 0) return 'expired';\n if (days < 7) return 'critical';\n if (days < 30) return 'warning';\n return 'ok';\n }\n\n /**\n * Get filter count\n */\n public getFilterCount(filter: APIKeyFilter): number {\n switch (filter) {\n case 'all': return this.Stats.total;\n case 'active': return this.Stats.active;\n case 'revoked': return this.Stats.revoked;\n case 'expiring': return this.Stats.expiring;\n case 'expired': return this.Stats.expired;\n case 'never-used': return this.Stats.neverUsed;\n }\n }\n}\n","<div class=\"list-container\">\n <!-- Header -->\n <div class=\"list-header\">\n <div class=\"header-left\">\n <h3>API Keys</h3>\n <span class=\"count-badge\">{{FilteredKeys.length}} of {{AllKeys.length}}</span>\n </div>\n <div class=\"header-right\">\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\" [(ngModel)]=\"SearchText\"\n (ngModelChange)=\"onSearch()\"\n placeholder=\"Search keys...\" />\n @if (SearchText) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n <button class=\"create-btn\" (click)=\"requestCreate()\">\n <i class=\"fa-solid fa-plus\"></i>\n Generate Key\n </button>\n </div>\n </div>\n\n <!-- Filter Tabs -->\n <div class=\"filter-tabs\">\n <button class=\"filter-tab\" [class.active]=\"Filter === 'all'\"\n (click)=\"setFilter('all')\">\n All\n <span class=\"tab-count\">{{Stats.total}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'active'\"\n (click)=\"setFilter('active')\">\n <i class=\"fa-solid fa-check-circle status-active\"></i>\n Active\n <span class=\"tab-count\">{{Stats.active}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'expiring'\"\n [class.has-warning]=\"Stats.expiring > 0\"\n (click)=\"setFilter('expiring')\">\n <i class=\"fa-solid fa-clock status-warning\"></i>\n Expiring Soon\n <span class=\"tab-count\">{{Stats.expiring}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'expired'\"\n [class.has-danger]=\"Stats.expired > 0\"\n (click)=\"setFilter('expired')\">\n <i class=\"fa-solid fa-circle-exclamation status-danger\"></i>\n Expired\n <span class=\"tab-count\">{{Stats.expired}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'never-used'\"\n (click)=\"setFilter('never-used')\">\n <i class=\"fa-solid fa-question-circle status-info\"></i>\n Never Used\n <span class=\"tab-count\">{{Stats.neverUsed}}</span>\n </button>\n <button class=\"filter-tab\" [class.active]=\"Filter === 'revoked'\"\n (click)=\"setFilter('revoked')\">\n <i class=\"fa-solid fa-ban status-revoked\"></i>\n Revoked\n <span class=\"tab-count\">{{Stats.revoked}}</span>\n </button>\n </div>\n\n <!-- Loading -->\n @if (IsLoading) {\n <mj-loading text=\"Loading API keys...\"></mj-loading>\n }\n\n <!-- Grid -->\n @if (!IsLoading) {\n <div class=\"key-grid\">\n <!-- Header Row -->\n <div class=\"grid-header\">\n <div class=\"col-key sortable\" (click)=\"toggleSort('Label')\">\n Key\n <i [class]=\"getSortIcon('Label')\"></i>\n </div>\n <div class=\"col-owner sortable\" (click)=\"toggleSort('User')\">\n Owner\n <i [class]=\"getSortIcon('User')\"></i>\n </div>\n <div class=\"col-status sortable\" (click)=\"toggleSort('Status')\">\n Status\n <i [class]=\"getSortIcon('Status')\"></i>\n </div>\n <div class=\"col-scopes\">\n Scopes\n </div>\n <div class=\"col-expires sortable\" (click)=\"toggleSort('ExpiresAt')\">\n Expires\n <i [class]=\"getSortIcon('ExpiresAt')\"></i>\n </div>\n <div class=\"col-used sortable\" (click)=\"toggleSort('LastUsedAt')\">\n Last Used\n <i [class]=\"getSortIcon('LastUsedAt')\"></i>\n </div>\n <div class=\"col-created sortable\" (click)=\"toggleSort('__mj_CreatedAt')\">\n Created\n <i [class]=\"getSortIcon('__mj_CreatedAt')\"></i>\n </div>\n </div>\n <!-- Key Rows -->\n @for (key of getPaginatedKeys(); track key) {\n <div class=\"grid-row\"\n (click)=\"selectKey(key)\">\n <div class=\"col-key\">\n <div class=\"key-icon\" [class.active]=\"key.Status === 'Active'\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"key-details\">\n <span class=\"key-label\">{{key.Label}}</span>\n <code class=\"key-hash\">...{{key.Hash.slice(-12)}}</code>\n </div>\n </div>\n <div class=\"col-owner\">\n <span class=\"owner-name\">{{key.User}}</span>\n </div>\n <div class=\"col-status\">\n <span class=\"status-badge\" [class.active]=\"key.Status === 'Active'\"\n [class.revoked]=\"key.Status === 'Revoked'\">\n {{key.Status}}\n </span>\n </div>\n <div class=\"col-scopes\">\n @if (getScopeInfo(key).count > 0) {\n <div class=\"scopes-display\">\n <div class=\"scope-badges\">\n @for (cat of getScopeInfo(key).categories; track cat; let i = $index) {\n @if (i < 3) {\n <span class=\"scope-badge\"\n [style.backgroundColor]=\"cat.color + '15'\"\n [style.color]=\"cat.color\"\n [title]=\"cat.category + ': ' + cat.count + ' scope(s)'\">\n <i [class]=\"cat.icon\"></i>\n <span class=\"badge-count\">{{cat.count}}</span>\n </span>\n }\n }\n @if (getScopeInfo(key).categories.length > 3) {\n <span class=\"scope-more\">\n +{{getScopeInfo(key).categories.length - 3}}\n </span>\n }\n </div>\n <span class=\"scopes-total\">\n {{getScopeInfo(key).count}} total\n </span>\n </div>\n }\n @if (getScopeInfo(key).count === 0) {\n <span class=\"no-scopes\">\n <i class=\"fa-solid fa-shield-xmark\"></i>\n None\n </span>\n }\n </div>\n <div class=\"col-expires\">\n <span class=\"expires-value\" [ngClass]=\"getExpirationClass(key)\">\n {{formatExpiration(key.ExpiresAt)}}\n </span>\n </div>\n <div class=\"col-used\">\n <span class=\"used-value\" [class.never]=\"!key.LastUsedAt\">\n {{formatDate(key.LastUsedAt)}}\n </span>\n </div>\n <div class=\"col-created\">\n <span class=\"created-value\">{{formatDate(key.__mj_CreatedAt)}}</span>\n </div>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredKeys.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-key\"></i>\n @if (SearchText) {\n <span>No keys matching \"{{SearchText}}\"</span>\n }\n @if (!SearchText && Filter !== 'all') {\n <span>No {{Filter}} keys found</span>\n }\n @if (!SearchText && Filter === 'all') {\n <span>No API keys created yet</span>\n }\n @if (Filter === 'all' && !SearchText) {\n <button class=\"create-empty-btn\"\n (click)=\"requestCreate()\">\n <i class=\"fa-solid fa-plus\"></i>\n Generate Your First Key\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Pagination -->\n @if (!IsLoading && FilteredKeys.length > PageSize) {\n <div class=\"pagination\">\n <div class=\"page-info\">\n Showing {{(CurrentPage - 1) * PageSize + 1}} - {{Math.min(CurrentPage * PageSize, FilteredKeys.length)}}\n of {{FilteredKeys.length}}\n </div>\n <div class=\"page-buttons\">\n <button class=\"page-btn\" [disabled]=\"CurrentPage === 1\"\n (click)=\"goToPage(CurrentPage - 1)\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n @for (page of getPageNumbers(); track page) {\n @if (page > 0) {\n <button class=\"page-btn\"\n [class.active]=\"page === CurrentPage\"\n (click)=\"goToPage(page)\">\n {{page}}\n </button>\n }\n @if (page === -1) {\n <span class=\"page-ellipsis\">...</span>\n }\n }\n <button class=\"page-btn\" [disabled]=\"CurrentPage === getTotalPages()\"\n (click)=\"goToPage(CurrentPage + 1)\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n </div>\n }\n</div>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys-resource.component.d.ts","sourceRoot":"","sources":["../../src/APIKeys/api-keys-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAa,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,cAAc,EAAoE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE/I,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;;AAEvE,iDAAiD;AACjD,KAAK,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAE9E,0CAA0C;AAC1C,UAAU,YAAY;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,qCAAqC;AACrC,UAAU,SAAS;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,wBAAwB;AACxB,KAAK,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAEpC,oBAAoB;AACpB,KAAK,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC5D;;;;;;;GAOG;AACH,qBAOa,wBAAyB,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IACtE,gBAAgB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAExE,UAAmB,QAAQ,gBAAuB;IAClD,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"api-keys-resource.component.d.ts","sourceRoot":"","sources":["../../src/APIKeys/api-keys-resource.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
import { Component, ViewChild } from '@angular/core';
|
|
8
8
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
9
9
|
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
10
|
-
import {
|
|
10
|
+
import { RunView } from '@memberjunction/core';
|
|
11
11
|
import { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';
|
|
12
12
|
import { Subject } from 'rxjs';
|
|
13
13
|
import * as i0 from "@angular/core";
|
|
@@ -618,7 +618,7 @@ function APIKeysResourceComponent_Conditional_2_Template(rf, ctx) { if (rf & 1)
|
|
|
618
618
|
let APIKeysResourceComponent = class APIKeysResourceComponent extends BaseResourceComponent {
|
|
619
619
|
keyListComponent;
|
|
620
620
|
destroy$ = new Subject();
|
|
621
|
-
md =
|
|
621
|
+
md = this.ProviderToUse;
|
|
622
622
|
cdr;
|
|
623
623
|
// View state
|
|
624
624
|
CurrentView = 'overview';
|
|
@@ -713,7 +713,7 @@ let APIKeysResourceComponent = class APIKeysResourceComponent extends BaseResour
|
|
|
713
713
|
* Load all API keys
|
|
714
714
|
*/
|
|
715
715
|
async loadAPIKeys() {
|
|
716
|
-
const rv =
|
|
716
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
717
717
|
const result = await rv.RunView({
|
|
718
718
|
EntityName: 'MJ: API Keys',
|
|
719
719
|
OrderBy: '__mj_CreatedAt DESC',
|
|
@@ -762,7 +762,7 @@ let APIKeysResourceComponent = class APIKeysResourceComponent extends BaseResour
|
|
|
762
762
|
* Load recent activity from usage logs and key changes
|
|
763
763
|
*/
|
|
764
764
|
async loadRecentActivity() {
|
|
765
|
-
const rv =
|
|
765
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
766
766
|
// Load usage logs
|
|
767
767
|
const usageResult = await rv.RunView({
|
|
768
768
|
EntityName: 'MJ: API Key Usage Logs',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys-resource.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-keys-resource.component.ts","../../src/APIKeys/api-keys-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIScopeEntity, MJAPIKeyUsageLogEntity, MJAPIApplicationEntity, ResourceData } from '@memberjunction/core-entities';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\nimport { Subject } from 'rxjs';\nimport { APIKeyFilter, APIKeyListComponent } from './api-key-list.component';\nimport { APIKeyCreateResult } from './api-key-create-dialog.component';\n\n/** Activity types for recent activity display */\ntype ActivityAction = 'Created' | 'Updated' | 'Revoked' | 'Used' | 'Extended';\n\n/** Interface for recent activity items */\ninterface ActivityItem {\n keyLabel: string;\n action: ActivityAction;\n user: string;\n date: Date;\n keyId: string;\n}\n\n/** Interface for scope statistics */\ninterface ScopeStat {\n category: string;\n count: number;\n percentage: number;\n color: string;\n iconClass: string;\n}\n\n/** Current view type */\ntype ViewType = 'overview' | 'list';\n\n/** Main tab type */\ntype MainTab = 'keys' | 'applications' | 'scopes' | 'usage';\n/**\n * API Keys Resource Component\n * Provides management interface for MJ API Keys including:\n * - Overview statistics and health monitoring\n * - Key listing with status filters\n * - Key creation and revocation\n * - Usage tracking and analytics\n */\n@RegisterClass(BaseResourceComponent, 'APIKeysResource')\n@Component({\n standalone: false,\n selector: 'mj-api-keys-resource',\n templateUrl: './api-keys-resource.component.html',\n styleUrls: ['./api-keys-resource.component.css']\n})\nexport class APIKeysResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n @ViewChild('keyList') keyListComponent: APIKeyListComponent | undefined;\n\n protected override destroy$ = new Subject<void>();\n private md = new Metadata();\n private cdr: ChangeDetectorRef;\n\n // View state\n public CurrentView: ViewType = 'overview';\n public ListFilter: APIKeyFilter = 'all';\n public MainTab: MainTab = 'keys';\n public NavOpen = false;\n\n // Application and scope counts for tab badges\n public ApplicationCount = 0;\n public ScopeCount = 0;\n\n // Loading states\n public IsLoading = true;\n\n // Statistics\n public TotalKeys = 0;\n public ActiveKeys = 0;\n public RevokedKeys = 0;\n public ExpiringSoonCount = 0;\n public ExpiredKeys = 0;\n public NeverUsedKeys = 0;\n\n // Data collections\n public APIKeys: MJAPIKeyEntity[] = [];\n public RecentActivity: ActivityItem[] = [];\n public ScopeStats: ScopeStat[] = [];\n public TopUsedKeys: MJAPIKeyEntity[] = [];\n\n // Dialog states\n public ShowCreateDialog = false;\n public ShowEditPanel = false;\n public SelectedKeyId: string | null = null;\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n // Dynamic category UI configs built from root scopes\n private categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n\n // User permissions\n public UserCanCreateKeys = false;\n public UserCanRevokeKeys = false;\n\n constructor(cdr: ChangeDetectorRef) {\n super();\n this.cdr = cdr;\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'API Keys';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-key';\n }\n\n /**\n * Load all dashboard data\n */\n public async loadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n try {\n await Promise.all([\n this.loadAPIKeys(),\n this.loadScopeStats(),\n this.loadRecentActivity(),\n this.loadCounts(),\n this.checkPermissions()\n ]);\n this.calculateStatistics();\n } catch (error) {\n console.error('Error loading API Keys dashboard data:', error);\n } finally {\n this.IsLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load application and scope counts for tab badges.\n * Uses cached data from APIKeysEngineBase.\n */\n private loadCounts(): void {\n const base = APIKeysEngineBase.Instance;\n this.ApplicationCount = base.Applications.length;\n this.ScopeCount = base.Scopes.length;\n }\n\n /**\n * Load all API keys\n */\n private async loadAPIKeys(): Promise<void> {\n const rv = new RunView();\n const result = await rv.RunView<MJAPIKeyEntity>({\n EntityName: 'MJ: API Keys',\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n });\n if (result.Success) {\n this.APIKeys = result.Results;\n }\n }\n\n /**\n * Load scope statistics by category.\n * Uses cached data from APIKeysEngineBase.\n */\n private loadScopeStats(): void {\n const base = APIKeysEngineBase.Instance;\n const scopes = base.Scopes;\n\n // Build category UI configs from root scopes\n this.categoryUIConfigs.clear();\n for (const scope of scopes) {\n if (!scope.ParentID) {\n const uiConfig = parseAPIScopeUIConfig(scope);\n this.categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n const categoryMap = new Map<string, number>();\n for (const scope of scopes) {\n const category = scope.Category || 'Other';\n categoryMap.set(category, (categoryMap.get(category) || 0) + 1);\n }\n\n const total = scopes.length;\n this.ScopeStats = Array.from(categoryMap.entries()).map(([category, count]) => {\n const config = this.categoryUIConfigs.get(category) || this.defaultUIConfig;\n return {\n category,\n count,\n percentage: total > 0 ? Math.round((count / total) * 100) : 0,\n color: config.color,\n iconClass: config.icon\n };\n });\n }\n\n /**\n * Load recent activity from usage logs and key changes\n */\n private async loadRecentActivity(): Promise<void> {\n const rv = new RunView();\n\n // Load usage logs\n const usageResult = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 20,\n ResultType: 'entity_object'\n });\n\n const activities: ActivityItem[] = [];\n\n if (usageResult.Success) {\n for (const log of usageResult.Results.slice(0, 10)) {\n activities.push({\n keyLabel: log.APIKey || 'Unknown Key',\n action: 'Used',\n user: log.APIKey || 'System',\n date: log.__mj_CreatedAt,\n keyId: log.APIKeyID\n });\n }\n }\n\n // Add key creation/update activities from keys\n for (const key of this.APIKeys.slice(0, 10)) {\n if (key.Status === 'Revoked') {\n activities.push({\n keyLabel: key.Label,\n action: 'Revoked',\n user: key.User,\n date: key.__mj_UpdatedAt,\n keyId: key.ID\n });\n } else {\n activities.push({\n keyLabel: key.Label,\n action: 'Created',\n user: key.CreatedByUser,\n date: key.__mj_CreatedAt,\n keyId: key.ID\n });\n }\n }\n\n // Sort by date and take top 10\n this.RecentActivity = activities\n .sort((a, b) => b.date.getTime() - a.date.getTime())\n .slice(0, 10);\n }\n\n /**\n * Check user permissions\n */\n private async checkPermissions(): Promise<void> {\n // Check if user can create/manage API keys\n const entityInfo = this.md.Entities.find(e => e.Name === 'MJ: API Keys');\n if (entityInfo) {\n const permissions = entityInfo.GetUserPermisions(this.md.CurrentUser);\n this.UserCanCreateKeys = permissions.CanCreate;\n this.UserCanRevokeKeys = permissions.CanUpdate;\n }\n }\n\n /**\n * Calculate dashboard statistics from loaded data\n */\n private calculateStatistics(): void {\n const now = new Date();\n const thirtyDaysFromNow = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n this.TotalKeys = this.APIKeys.length;\n this.ActiveKeys = this.APIKeys.filter(k => k.Status === 'Active').length;\n this.RevokedKeys = this.APIKeys.filter(k => k.Status === 'Revoked').length;\n\n this.ExpiredKeys = this.APIKeys.filter(k =>\n k.ExpiresAt && new Date(k.ExpiresAt) < now\n ).length;\n\n this.ExpiringSoonCount = this.APIKeys.filter(k =>\n k.Status === 'Active' &&\n k.ExpiresAt &&\n new Date(k.ExpiresAt) > now &&\n new Date(k.ExpiresAt) < thirtyDaysFromNow\n ).length;\n\n this.NeverUsedKeys = this.APIKeys.filter(k =>\n k.Status === 'Active' && !k.LastUsedAt\n ).length;\n\n // Get top used keys (most recently used active keys)\n this.TopUsedKeys = this.APIKeys\n .filter(k => k.Status === 'Active' && k.LastUsedAt)\n .sort((a, b) => {\n const aDate = a.LastUsedAt ? new Date(a.LastUsedAt).getTime() : 0;\n const bDate = b.LastUsedAt ? new Date(b.LastUsedAt).getTime() : 0;\n return bDate - aDate;\n })\n .slice(0, 5);\n }\n\n /**\n * Refresh all data\n */\n public async refresh(): Promise<void> {\n await this.loadData();\n if (this.keyListComponent) {\n await this.keyListComponent.loadKeys();\n }\n }\n\n /**\n * Switch to list view\n */\n public showListView(filter: APIKeyFilter = 'all'): void {\n this.ListFilter = filter;\n this.CurrentView = 'list';\n }\n\n /**\n * Switch to overview\n */\n public showOverview(): void {\n this.CurrentView = 'overview';\n }\n\n /**\n * Open create dialog\n */\n public openCreateDialog(): void {\n this.ShowCreateDialog = true;\n }\n\n /**\n * Handle key created\n */\n public async onKeyCreated(result: APIKeyCreateResult): Promise<void> {\n if (result.success) {\n await this.refresh();\n }\n }\n\n /**\n * Handle create dialog closed\n */\n public onCreateDialogClosed(): void {\n this.ShowCreateDialog = false;\n }\n\n /**\n * Open edit panel for a key\n */\n public openEditPanel(key: MJAPIKeyEntity): void {\n this.SelectedKeyId = key.ID;\n this.ShowEditPanel = true;\n }\n\n /**\n * Handle key from list selected\n */\n public onKeySelected(key: MJAPIKeyEntity): void {\n this.openEditPanel(key);\n }\n\n /**\n * Handle key updated\n */\n public async onKeyUpdated(): Promise<void> {\n await this.refresh();\n }\n\n /**\n * Handle key revoked\n */\n public async onKeyRevoked(): Promise<void> {\n await this.refresh();\n }\n\n /**\n * Handle edit panel closed\n */\n public onEditPanelClosed(): void {\n this.ShowEditPanel = false;\n this.SelectedKeyId = null;\n }\n\n /**\n * Get health score (0-100) based on key status\n */\n public getHealthScore(): number {\n if (this.TotalKeys === 0) return 100;\n\n let score = 100;\n\n // Deduct for expired keys\n score -= (this.ExpiredKeys / this.TotalKeys) * 40;\n\n // Deduct for expiring soon\n score -= (this.ExpiringSoonCount / this.TotalKeys) * 20;\n\n // Deduct for never used active keys (might be leaked)\n score -= (this.NeverUsedKeys / this.TotalKeys) * 10;\n\n // Deduct if too many active keys\n if (this.ActiveKeys > 20) {\n score -= Math.min(15, (this.ActiveKeys - 20) * 0.5);\n }\n\n return Math.max(0, Math.round(score));\n }\n\n /**\n * Get health label based on score\n */\n public getHealthLabel(): string {\n const score = this.getHealthScore();\n if (score >= 90) return 'Excellent Security';\n if (score >= 75) return 'Good Security';\n if (score >= 50) return 'Needs Attention';\n return 'Critical Issues';\n }\n\n /**\n * Get CSS class for health banner\n */\n public getHealthClass(): string {\n const score = this.getHealthScore();\n if (score >= 75) return '';\n if (score >= 50) return 'health-warning';\n return 'health-critical';\n }\n\n /**\n * Get donut chart offset for segment\n */\n public getDonutOffset(index: number): number {\n let offset = 0;\n for (let i = 0; i < index; i++) {\n offset -= this.ScopeStats[i].percentage * 2.51;\n }\n return offset;\n }\n\n /**\n * Get activity icon based on action\n */\n public getActionIcon(action: ActivityAction): string {\n switch (action) {\n case 'Created': return 'fa-solid fa-plus';\n case 'Updated': return 'fa-solid fa-pencil';\n case 'Revoked': return 'fa-solid fa-ban';\n case 'Used': return 'fa-solid fa-arrow-right-to-bracket';\n case 'Extended': return 'fa-solid fa-clock-rotate-left';\n default: return 'fa-solid fa-circle';\n }\n }\n\n /**\n * Get CSS class for activity action\n */\n public getActionClass(action: ActivityAction): string {\n switch (action) {\n case 'Created': return 'action-created';\n case 'Updated': return 'action-updated';\n case 'Revoked': return 'action-revoked';\n case 'Used': return 'action-used';\n case 'Extended': return 'action-extended';\n default: return '';\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return new Date(date).toLocaleDateString();\n }\n\n /**\n * Format expiration for display\n */\n public formatExpiration(date: Date | null): string {\n if (!date) return 'Never expires';\n\n const now = new Date();\n const expiresAt = new Date(date);\n const diff = expiresAt.getTime() - now.getTime();\n\n if (diff < 0) return 'Expired';\n\n const days = Math.floor(diff / 86400000);\n if (days === 0) return 'Expires today';\n if (days === 1) return 'Expires tomorrow';\n if (days < 30) return `Expires in ${days} days`;\n\n return `Expires ${expiresAt.toLocaleDateString()}`;\n }\n\n /**\n * Get expiration status class\n */\n public getExpirationClass(key: MJAPIKeyEntity): string {\n if (!key.ExpiresAt) return '';\n\n const now = new Date();\n const expiresAt = new Date(key.ExpiresAt);\n const diff = expiresAt.getTime() - now.getTime();\n const days = Math.floor(diff / 86400000);\n\n if (diff < 0) return 'expired';\n if (days < 7) return 'expiring-critical';\n if (days < 30) return 'expiring-soon';\n return '';\n }\n\n /**\n * View activity for a key\n */\n public onActivityClick(activity: ActivityItem): void {\n const key = this.APIKeys.find(k => UUIDsEqual(k.ID, activity.keyId));\n if (key) {\n this.openEditPanel(key);\n }\n }\n\n /**\n * View scope details - now navigates to scopes tab\n */\n public onScopeClick(_stat: ScopeStat): void {\n this.MainTab = 'scopes';\n }\n\n /**\n * Switch to a main tab\n */\n public switchTab(tab: MainTab): void {\n this.MainTab = tab;\n // Reset to overview when switching back to keys\n if (tab === 'keys') {\n this.CurrentView = 'overview';\n }\n }\n\n /**\n * Toggle mobile navigation\n */\n public toggleNav(): void {\n this.NavOpen = !this.NavOpen;\n }\n\n /**\n * Close mobile navigation\n */\n public closeNav(): void {\n this.NavOpen = false;\n }\n\n /**\n * Handle updates from child panels\n */\n public async onDataUpdated(): Promise<void> {\n await this.loadCounts();\n this.cdr.markForCheck();\n }\n}\n","<div class=\"api-keys-dashboard\" [class.panel-open]=\"ShowCreateDialog || ShowEditPanel\" [class.nav-open]=\"NavOpen\">\n @if (IsLoading) {\n <mj-loading text=\"Loading API Keys...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Left Navigation Sidebar -->\n <div class=\"dashboard-nav\">\n <div class=\"nav-header\">\n <div class=\"nav-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>API Keys</span>\n </div>\n </div>\n <div class=\"nav-items\">\n <button class=\"nav-item\" [class.active]=\"MainTab === 'keys'\" (click)=\"switchTab('keys'); closeNav()\">\n <i class=\"fa-solid fa-key\"></i>\n <span class=\"nav-label\">API Keys</span>\n <span class=\"nav-badge\">{{TotalKeys}}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"MainTab === 'applications'\" (click)=\"switchTab('applications'); closeNav()\">\n <i class=\"fa-solid fa-cube\"></i>\n <span class=\"nav-label\">Applications</span>\n <span class=\"nav-badge\">{{ApplicationCount}}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"MainTab === 'scopes'\" (click)=\"switchTab('scopes'); closeNav()\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span class=\"nav-label\">Scopes</span>\n <span class=\"nav-badge\">{{ScopeCount}}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"MainTab === 'usage'\" (click)=\"switchTab('usage'); closeNav()\">\n <i class=\"fa-solid fa-chart-line\"></i>\n <span class=\"nav-label\">Usage Analytics</span>\n </button>\n </div>\n </div>\n <!-- Main Content Area -->\n <div class=\"dashboard-content\">\n <div class=\"content-wrapper\">\n <!-- Keys Tab Content -->\n @if (MainTab === 'keys') {\n <!-- Overview View -->\n @if (CurrentView === 'overview') {\n <!-- Header with Actions -->\n <div class=\"overview-header\">\n <div class=\"header-left\">\n <h2 class=\"overview-title\">API Keys Management</h2>\n <p class=\"overview-subtitle\">Manage API keys for external integrations and services</p>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-refresh\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n @if (UserCanCreateKeys) {\n <button class=\"btn-primary\" (click)=\"openCreateDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Generate New Key</span>\n </button>\n }\n </div>\n </div>\n <!-- Health Score Banner -->\n <div class=\"health-banner\" [ngClass]=\"getHealthClass()\">\n <div class=\"health-score-container\">\n <div class=\"health-score-ring\">\n <svg viewBox=\"0 0 36 36\" class=\"circular-chart\">\n <path class=\"circle-bg\"\n d=\"M18 2.0845\n a 15.9155 15.9155 0 0 1 0 31.831\n a 15.9155 15.9155 0 0 1 0 -31.831\"\n />\n <path class=\"circle\"\n [attr.stroke-dasharray]=\"getHealthScore() + ', 100'\"\n d=\"M18 2.0845\n a 15.9155 15.9155 0 0 1 0 31.831\n a 15.9155 15.9155 0 0 1 0 -31.831\"\n />\n </svg>\n <div class=\"health-score-value\">{{getHealthScore()}}</div>\n </div>\n </div>\n <div class=\"health-info\">\n <div class=\"health-label\">{{getHealthLabel()}}</div>\n <div class=\"health-details\">\n @if (ExpiredKeys > 0) {\n <span class=\"health-alert\" (click)=\"showListView('expired')\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ExpiredKeys}} expired\n </span>\n }\n @if (ExpiringSoonCount > 0) {\n <span class=\"health-warning-text\" (click)=\"showListView('expiring')\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ExpiringSoonCount}} expiring soon\n </span>\n }\n @if (NeverUsedKeys > 0) {\n <span class=\"health-info-text\" (click)=\"showListView('never-used')\">\n <i class=\"fa-solid fa-question-circle\"></i>\n {{NeverUsedKeys}} never used\n </span>\n }\n @if (ExpiredKeys === 0 && ExpiringSoonCount === 0 && NeverUsedKeys === 0) {\n <span class=\"health-ok\">\n <i class=\"fa-solid fa-check-circle\"></i>\n All keys healthy\n </span>\n }\n </div>\n </div>\n </div>\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n <div class=\"kpi-card clickable\" (click)=\"showListView('all')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{TotalKeys}}</div>\n <div class=\"kpi-label\">Total Keys</div>\n </div>\n <div class=\"kpi-trend\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n </div>\n <div class=\"kpi-card active clickable\" (click)=\"showListView('active')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ActiveKeys}}</div>\n <div class=\"kpi-label\">Active</div>\n </div>\n <div class=\"kpi-trend success\">\n <span class=\"percentage\">{{TotalKeys > 0 ? (ActiveKeys / TotalKeys * 100).toFixed(0) : 100}}%</span>\n </div>\n </div>\n <div class=\"kpi-card clickable\" [class.warning]=\"ExpiringSoonCount > 0\" (click)=\"showListView('expiring')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ExpiringSoonCount}}</div>\n <div class=\"kpi-label\">Expiring Soon</div>\n </div>\n @if (ExpiringSoonCount > 0) {\n <div class=\"kpi-trend warning\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n }\n </div>\n <div class=\"kpi-card clickable\" [class.danger]=\"RevokedKeys > 0\" (click)=\"showListView('revoked')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-ban\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{RevokedKeys}}</div>\n <div class=\"kpi-label\">Revoked</div>\n </div>\n </div>\n <div class=\"kpi-card clickable\" (click)=\"switchTab('scopes')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ScopeStats.length}}</div>\n <div class=\"kpi-label\">Scope Categories</div>\n </div>\n </div>\n </div>\n <!-- Content Grid -->\n <div class=\"content-grid\">\n <!-- Recently Used Keys -->\n <div class=\"panel keys-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Recently Used Keys</span>\n </div>\n <button class=\"panel-action\" (click)=\"showListView('all')\">\n View All <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n </div>\n <div class=\"panel-body\">\n @if (TopUsedKeys.length > 0) {\n <div class=\"key-list\">\n @for (key of TopUsedKeys; track key) {\n <div class=\"key-item\" (click)=\"openEditPanel(key)\">\n <div class=\"key-icon\" [class.active]=\"key.Status === 'Active'\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"key-info\">\n <div class=\"key-label\">{{key.Label}}</div>\n <div class=\"key-meta\">\n <span class=\"key-user\">{{key.User}}</span>\n <span class=\"key-hash\">...{{key.Hash.slice(-8)}}</span>\n </div>\n </div>\n <div class=\"key-status\">\n <div class=\"last-used\">{{formatDate(key.LastUsedAt)}}</div>\n <div class=\"expiration\" [ngClass]=\"getExpirationClass(key)\">\n {{formatExpiration(key.ExpiresAt)}}\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if (TopUsedKeys.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-key\"></i>\n <span>No active keys with recent usage</span>\n </div>\n }\n </div>\n </div>\n <!-- Scope Categories -->\n <div class=\"panel scope-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>Permission Scopes</span>\n </div>\n <span class=\"panel-subtitle\">Available scope categories</span>\n </div>\n <div class=\"panel-body\">\n @if (ScopeStats.length > 0) {\n <div class=\"scope-chart\">\n <!-- Visual Donut Chart -->\n <div class=\"donut-chart-container\">\n <svg viewBox=\"0 0 100 100\" class=\"donut-chart\">\n <circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"none\" stroke=\"#e5e7eb\" stroke-width=\"12\"/>\n @for (stat of ScopeStats; track stat; let i = $index) {\n <ng-container>\n <circle\n cx=\"50\" cy=\"50\" r=\"40\"\n fill=\"none\"\n [attr.stroke]=\"stat.color\"\n stroke-width=\"12\"\n [attr.stroke-dasharray]=\"stat.percentage * 2.51 + ' ' + (251 - stat.percentage * 2.51)\"\n [attr.stroke-dashoffset]=\"getDonutOffset(i)\"\n class=\"donut-segment\"\n (click)=\"onScopeClick(stat)\"\n />\n </ng-container>\n }\n </svg>\n <div class=\"donut-center\">\n <div class=\"donut-total\">{{ScopeStats.length}}</div>\n <div class=\"donut-label\">Categories</div>\n </div>\n </div>\n <!-- Legend -->\n <div class=\"scope-legend\">\n @for (stat of ScopeStats; track stat) {\n <div class=\"legend-item\" (click)=\"onScopeClick(stat)\">\n <div class=\"legend-color\" [style.backgroundColor]=\"stat.color\"></div>\n <div class=\"legend-info\">\n <div class=\"legend-name\">\n <i [class]=\"stat.iconClass\"></i>\n {{stat.category}}\n </div>\n <div class=\"legend-value\">{{stat.count}} scopes</div>\n </div>\n <i class=\"fa-solid fa-chevron-right legend-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n @if (ScopeStats.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>No scopes configured</span>\n </div>\n }\n </div>\n </div>\n <!-- Recent Activity -->\n <div class=\"panel activity-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span>Recent Activity</span>\n </div>\n </div>\n <div class=\"panel-body\">\n @if (RecentActivity.length > 0) {\n <div class=\"activity-list\">\n @for (activity of RecentActivity; track activity) {\n <div class=\"activity-item\" (click)=\"onActivityClick(activity)\">\n <div class=\"activity-icon\" [ngClass]=\"getActionClass(activity.action)\">\n <i [class]=\"getActionIcon(activity.action)\"></i>\n </div>\n <div class=\"activity-info\">\n <div class=\"activity-name\">{{activity.keyLabel}}</div>\n <div class=\"activity-meta\">\n <span class=\"activity-action\">{{activity.action}}</span>\n @if (activity.user) {\n <span class=\"activity-user\">by {{activity.user}}</span>\n }\n </div>\n </div>\n <div class=\"activity-time\">\n {{formatDate(activity.date)}}\n </div>\n </div>\n }\n </div>\n }\n @if (RecentActivity.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No recent activity</span>\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Quick Actions -->\n @if (UserCanCreateKeys) {\n <div class=\"quick-actions\">\n <div class=\"quick-actions-title\">Quick Actions</div>\n <div class=\"quick-actions-grid\">\n <button class=\"quick-action\" (click)=\"openCreateDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Generate Key</span>\n </button>\n <button class=\"quick-action\" (click)=\"showListView('all')\">\n <i class=\"fa-solid fa-list\"></i>\n <span>View All Keys</span>\n </button>\n <button class=\"quick-action\" (click)=\"showListView('expiring')\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Expiring Keys</span>\n </button>\n <button class=\"quick-action\" (click)=\"showListView('never-used')\">\n <i class=\"fa-solid fa-question-circle\"></i>\n <span>Never Used</span>\n </button>\n </div>\n </div>\n }\n <!-- Security Notice -->\n <div class=\"security-notice\">\n <i class=\"fa-solid fa-shield-check\"></i>\n <div class=\"notice-content\">\n <strong>Security Best Practices:</strong>\n API keys should be rotated regularly and revoked when no longer needed.\n Keys are hashed and stored securely - the raw key is only shown once at creation time.\n All API key usage is logged for audit purposes.\n </div>\n </div>\n }\n <!-- List View -->\n @if (CurrentView === 'list') {\n <div class=\"list-view-header\">\n <button class=\"back-btn\" (click)=\"showOverview()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back to Overview\n </button>\n </div>\n <mj-api-key-list #keyList\n [Filter]=\"ListFilter\"\n (KeySelected)=\"onKeySelected($event)\"\n (CreateRequested)=\"openCreateDialog()\">\n </mj-api-key-list>\n }\n }\n <!-- Applications Tab Content -->\n @if (MainTab === 'applications') {\n <mj-api-applications-panel\n (ApplicationUpdated)=\"onDataUpdated()\">\n </mj-api-applications-panel>\n }\n <!-- Scopes Tab Content -->\n @if (MainTab === 'scopes') {\n <mj-api-scopes-panel\n (ScopeUpdated)=\"onDataUpdated()\">\n </mj-api-scopes-panel>\n }\n <!-- Usage Tab Content -->\n @if (MainTab === 'usage') {\n <mj-api-usage-panel></mj-api-usage-panel>\n }\n </div><!-- /.content-wrapper -->\n </div><!-- /.dashboard-content -->\n <!-- Mobile Navigation Toggle -->\n <button class=\"mobile-nav-toggle\" (click)=\"toggleNav()\">\n <i class=\"fa-solid\" [class.fa-bars]=\"!NavOpen\" [class.fa-times]=\"NavOpen\"></i>\n </button>\n <!-- Mobile Navigation Overlay -->\n <div class=\"mobile-nav-overlay\" (click)=\"closeNav()\"></div>\n }\n\n <!-- Create Dialog -->\n <mj-api-key-create-dialog\n [Visible]=\"ShowCreateDialog\"\n (Created)=\"onKeyCreated($event)\"\n (Closed)=\"onCreateDialogClosed()\">\n </mj-api-key-create-dialog>\n\n <!-- Edit Panel -->\n <mj-api-key-edit-panel\n [Visible]=\"ShowEditPanel\"\n [KeyId]=\"SelectedKeyId\"\n (Updated)=\"onKeyUpdated()\"\n (Revoked)=\"onKeyRevoked()\"\n (Closed)=\"onEditPanelClosed()\">\n </mj-api-key-edit-panel>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"api-keys-resource.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-keys-resource.component.ts","../../src/APIKeys/api-keys-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIScopeEntity, MJAPIKeyUsageLogEntity, MJAPIApplicationEntity, ResourceData } from '@memberjunction/core-entities';\nimport { APIKeysEngineBase, parseAPIScopeUIConfig } from '@memberjunction/api-keys-base';\nimport { Subject } from 'rxjs';\nimport { APIKeyFilter, APIKeyListComponent } from './api-key-list.component';\nimport { APIKeyCreateResult } from './api-key-create-dialog.component';\n\n/** Activity types for recent activity display */\ntype ActivityAction = 'Created' | 'Updated' | 'Revoked' | 'Used' | 'Extended';\n\n/** Interface for recent activity items */\ninterface ActivityItem {\n keyLabel: string;\n action: ActivityAction;\n user: string;\n date: Date;\n keyId: string;\n}\n\n/** Interface for scope statistics */\ninterface ScopeStat {\n category: string;\n count: number;\n percentage: number;\n color: string;\n iconClass: string;\n}\n\n/** Current view type */\ntype ViewType = 'overview' | 'list';\n\n/** Main tab type */\ntype MainTab = 'keys' | 'applications' | 'scopes' | 'usage';\n/**\n * API Keys Resource Component\n * Provides management interface for MJ API Keys including:\n * - Overview statistics and health monitoring\n * - Key listing with status filters\n * - Key creation and revocation\n * - Usage tracking and analytics\n */\n@RegisterClass(BaseResourceComponent, 'APIKeysResource')\n@Component({\n standalone: false,\n selector: 'mj-api-keys-resource',\n templateUrl: './api-keys-resource.component.html',\n styleUrls: ['./api-keys-resource.component.css']\n})\nexport class APIKeysResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n @ViewChild('keyList') keyListComponent: APIKeyListComponent | undefined;\n\n protected override destroy$ = new Subject<void>();\n private md = this.ProviderToUse;\n private cdr: ChangeDetectorRef;\n\n // View state\n public CurrentView: ViewType = 'overview';\n public ListFilter: APIKeyFilter = 'all';\n public MainTab: MainTab = 'keys';\n public NavOpen = false;\n\n // Application and scope counts for tab badges\n public ApplicationCount = 0;\n public ScopeCount = 0;\n\n // Loading states\n public IsLoading = true;\n\n // Statistics\n public TotalKeys = 0;\n public ActiveKeys = 0;\n public RevokedKeys = 0;\n public ExpiringSoonCount = 0;\n public ExpiredKeys = 0;\n public NeverUsedKeys = 0;\n\n // Data collections\n public APIKeys: MJAPIKeyEntity[] = [];\n public RecentActivity: ActivityItem[] = [];\n public ScopeStats: ScopeStat[] = [];\n public TopUsedKeys: MJAPIKeyEntity[] = [];\n\n // Dialog states\n public ShowCreateDialog = false;\n public ShowEditPanel = false;\n public SelectedKeyId: string | null = null;\n\n // Default UI config for categories without explicit configuration\n private readonly defaultUIConfig = {\n icon: 'fa-solid fa-ellipsis',\n color: 'var(--mj-text-muted)'\n };\n\n // Dynamic category UI configs built from root scopes\n private categoryUIConfigs = new Map<string, { icon: string; color: string }>();\n\n // User permissions\n public UserCanCreateKeys = false;\n public UserCanRevokeKeys = false;\n\n constructor(cdr: ChangeDetectorRef) {\n super();\n this.cdr = cdr;\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'API Keys';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-key';\n }\n\n /**\n * Load all dashboard data\n */\n public async loadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n try {\n await Promise.all([\n this.loadAPIKeys(),\n this.loadScopeStats(),\n this.loadRecentActivity(),\n this.loadCounts(),\n this.checkPermissions()\n ]);\n this.calculateStatistics();\n } catch (error) {\n console.error('Error loading API Keys dashboard data:', error);\n } finally {\n this.IsLoading = false;\n this.NotifyLoadComplete();\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load application and scope counts for tab badges.\n * Uses cached data from APIKeysEngineBase.\n */\n private loadCounts(): void {\n const base = APIKeysEngineBase.Instance;\n this.ApplicationCount = base.Applications.length;\n this.ScopeCount = base.Scopes.length;\n }\n\n /**\n * Load all API keys\n */\n private async loadAPIKeys(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJAPIKeyEntity>({\n EntityName: 'MJ: API Keys',\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n });\n if (result.Success) {\n this.APIKeys = result.Results;\n }\n }\n\n /**\n * Load scope statistics by category.\n * Uses cached data from APIKeysEngineBase.\n */\n private loadScopeStats(): void {\n const base = APIKeysEngineBase.Instance;\n const scopes = base.Scopes;\n\n // Build category UI configs from root scopes\n this.categoryUIConfigs.clear();\n for (const scope of scopes) {\n if (!scope.ParentID) {\n const uiConfig = parseAPIScopeUIConfig(scope);\n this.categoryUIConfigs.set(scope.Category, {\n icon: uiConfig.icon || this.defaultUIConfig.icon,\n color: uiConfig.color || this.defaultUIConfig.color\n });\n }\n }\n\n const categoryMap = new Map<string, number>();\n for (const scope of scopes) {\n const category = scope.Category || 'Other';\n categoryMap.set(category, (categoryMap.get(category) || 0) + 1);\n }\n\n const total = scopes.length;\n this.ScopeStats = Array.from(categoryMap.entries()).map(([category, count]) => {\n const config = this.categoryUIConfigs.get(category) || this.defaultUIConfig;\n return {\n category,\n count,\n percentage: total > 0 ? Math.round((count / total) * 100) : 0,\n color: config.color,\n iconClass: config.icon\n };\n });\n }\n\n /**\n * Load recent activity from usage logs and key changes\n */\n private async loadRecentActivity(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load usage logs\n const usageResult = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 20,\n ResultType: 'entity_object'\n });\n\n const activities: ActivityItem[] = [];\n\n if (usageResult.Success) {\n for (const log of usageResult.Results.slice(0, 10)) {\n activities.push({\n keyLabel: log.APIKey || 'Unknown Key',\n action: 'Used',\n user: log.APIKey || 'System',\n date: log.__mj_CreatedAt,\n keyId: log.APIKeyID\n });\n }\n }\n\n // Add key creation/update activities from keys\n for (const key of this.APIKeys.slice(0, 10)) {\n if (key.Status === 'Revoked') {\n activities.push({\n keyLabel: key.Label,\n action: 'Revoked',\n user: key.User,\n date: key.__mj_UpdatedAt,\n keyId: key.ID\n });\n } else {\n activities.push({\n keyLabel: key.Label,\n action: 'Created',\n user: key.CreatedByUser,\n date: key.__mj_CreatedAt,\n keyId: key.ID\n });\n }\n }\n\n // Sort by date and take top 10\n this.RecentActivity = activities\n .sort((a, b) => b.date.getTime() - a.date.getTime())\n .slice(0, 10);\n }\n\n /**\n * Check user permissions\n */\n private async checkPermissions(): Promise<void> {\n // Check if user can create/manage API keys\n const entityInfo = this.md.Entities.find(e => e.Name === 'MJ: API Keys');\n if (entityInfo) {\n const permissions = entityInfo.GetUserPermisions(this.md.CurrentUser);\n this.UserCanCreateKeys = permissions.CanCreate;\n this.UserCanRevokeKeys = permissions.CanUpdate;\n }\n }\n\n /**\n * Calculate dashboard statistics from loaded data\n */\n private calculateStatistics(): void {\n const now = new Date();\n const thirtyDaysFromNow = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);\n\n this.TotalKeys = this.APIKeys.length;\n this.ActiveKeys = this.APIKeys.filter(k => k.Status === 'Active').length;\n this.RevokedKeys = this.APIKeys.filter(k => k.Status === 'Revoked').length;\n\n this.ExpiredKeys = this.APIKeys.filter(k =>\n k.ExpiresAt && new Date(k.ExpiresAt) < now\n ).length;\n\n this.ExpiringSoonCount = this.APIKeys.filter(k =>\n k.Status === 'Active' &&\n k.ExpiresAt &&\n new Date(k.ExpiresAt) > now &&\n new Date(k.ExpiresAt) < thirtyDaysFromNow\n ).length;\n\n this.NeverUsedKeys = this.APIKeys.filter(k =>\n k.Status === 'Active' && !k.LastUsedAt\n ).length;\n\n // Get top used keys (most recently used active keys)\n this.TopUsedKeys = this.APIKeys\n .filter(k => k.Status === 'Active' && k.LastUsedAt)\n .sort((a, b) => {\n const aDate = a.LastUsedAt ? new Date(a.LastUsedAt).getTime() : 0;\n const bDate = b.LastUsedAt ? new Date(b.LastUsedAt).getTime() : 0;\n return bDate - aDate;\n })\n .slice(0, 5);\n }\n\n /**\n * Refresh all data\n */\n public async refresh(): Promise<void> {\n await this.loadData();\n if (this.keyListComponent) {\n await this.keyListComponent.loadKeys();\n }\n }\n\n /**\n * Switch to list view\n */\n public showListView(filter: APIKeyFilter = 'all'): void {\n this.ListFilter = filter;\n this.CurrentView = 'list';\n }\n\n /**\n * Switch to overview\n */\n public showOverview(): void {\n this.CurrentView = 'overview';\n }\n\n /**\n * Open create dialog\n */\n public openCreateDialog(): void {\n this.ShowCreateDialog = true;\n }\n\n /**\n * Handle key created\n */\n public async onKeyCreated(result: APIKeyCreateResult): Promise<void> {\n if (result.success) {\n await this.refresh();\n }\n }\n\n /**\n * Handle create dialog closed\n */\n public onCreateDialogClosed(): void {\n this.ShowCreateDialog = false;\n }\n\n /**\n * Open edit panel for a key\n */\n public openEditPanel(key: MJAPIKeyEntity): void {\n this.SelectedKeyId = key.ID;\n this.ShowEditPanel = true;\n }\n\n /**\n * Handle key from list selected\n */\n public onKeySelected(key: MJAPIKeyEntity): void {\n this.openEditPanel(key);\n }\n\n /**\n * Handle key updated\n */\n public async onKeyUpdated(): Promise<void> {\n await this.refresh();\n }\n\n /**\n * Handle key revoked\n */\n public async onKeyRevoked(): Promise<void> {\n await this.refresh();\n }\n\n /**\n * Handle edit panel closed\n */\n public onEditPanelClosed(): void {\n this.ShowEditPanel = false;\n this.SelectedKeyId = null;\n }\n\n /**\n * Get health score (0-100) based on key status\n */\n public getHealthScore(): number {\n if (this.TotalKeys === 0) return 100;\n\n let score = 100;\n\n // Deduct for expired keys\n score -= (this.ExpiredKeys / this.TotalKeys) * 40;\n\n // Deduct for expiring soon\n score -= (this.ExpiringSoonCount / this.TotalKeys) * 20;\n\n // Deduct for never used active keys (might be leaked)\n score -= (this.NeverUsedKeys / this.TotalKeys) * 10;\n\n // Deduct if too many active keys\n if (this.ActiveKeys > 20) {\n score -= Math.min(15, (this.ActiveKeys - 20) * 0.5);\n }\n\n return Math.max(0, Math.round(score));\n }\n\n /**\n * Get health label based on score\n */\n public getHealthLabel(): string {\n const score = this.getHealthScore();\n if (score >= 90) return 'Excellent Security';\n if (score >= 75) return 'Good Security';\n if (score >= 50) return 'Needs Attention';\n return 'Critical Issues';\n }\n\n /**\n * Get CSS class for health banner\n */\n public getHealthClass(): string {\n const score = this.getHealthScore();\n if (score >= 75) return '';\n if (score >= 50) return 'health-warning';\n return 'health-critical';\n }\n\n /**\n * Get donut chart offset for segment\n */\n public getDonutOffset(index: number): number {\n let offset = 0;\n for (let i = 0; i < index; i++) {\n offset -= this.ScopeStats[i].percentage * 2.51;\n }\n return offset;\n }\n\n /**\n * Get activity icon based on action\n */\n public getActionIcon(action: ActivityAction): string {\n switch (action) {\n case 'Created': return 'fa-solid fa-plus';\n case 'Updated': return 'fa-solid fa-pencil';\n case 'Revoked': return 'fa-solid fa-ban';\n case 'Used': return 'fa-solid fa-arrow-right-to-bracket';\n case 'Extended': return 'fa-solid fa-clock-rotate-left';\n default: return 'fa-solid fa-circle';\n }\n }\n\n /**\n * Get CSS class for activity action\n */\n public getActionClass(action: ActivityAction): string {\n switch (action) {\n case 'Created': return 'action-created';\n case 'Updated': return 'action-updated';\n case 'Revoked': return 'action-revoked';\n case 'Used': return 'action-used';\n case 'Extended': return 'action-extended';\n default: return '';\n }\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return 'Just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return new Date(date).toLocaleDateString();\n }\n\n /**\n * Format expiration for display\n */\n public formatExpiration(date: Date | null): string {\n if (!date) return 'Never expires';\n\n const now = new Date();\n const expiresAt = new Date(date);\n const diff = expiresAt.getTime() - now.getTime();\n\n if (diff < 0) return 'Expired';\n\n const days = Math.floor(diff / 86400000);\n if (days === 0) return 'Expires today';\n if (days === 1) return 'Expires tomorrow';\n if (days < 30) return `Expires in ${days} days`;\n\n return `Expires ${expiresAt.toLocaleDateString()}`;\n }\n\n /**\n * Get expiration status class\n */\n public getExpirationClass(key: MJAPIKeyEntity): string {\n if (!key.ExpiresAt) return '';\n\n const now = new Date();\n const expiresAt = new Date(key.ExpiresAt);\n const diff = expiresAt.getTime() - now.getTime();\n const days = Math.floor(diff / 86400000);\n\n if (diff < 0) return 'expired';\n if (days < 7) return 'expiring-critical';\n if (days < 30) return 'expiring-soon';\n return '';\n }\n\n /**\n * View activity for a key\n */\n public onActivityClick(activity: ActivityItem): void {\n const key = this.APIKeys.find(k => UUIDsEqual(k.ID, activity.keyId));\n if (key) {\n this.openEditPanel(key);\n }\n }\n\n /**\n * View scope details - now navigates to scopes tab\n */\n public onScopeClick(_stat: ScopeStat): void {\n this.MainTab = 'scopes';\n }\n\n /**\n * Switch to a main tab\n */\n public switchTab(tab: MainTab): void {\n this.MainTab = tab;\n // Reset to overview when switching back to keys\n if (tab === 'keys') {\n this.CurrentView = 'overview';\n }\n }\n\n /**\n * Toggle mobile navigation\n */\n public toggleNav(): void {\n this.NavOpen = !this.NavOpen;\n }\n\n /**\n * Close mobile navigation\n */\n public closeNav(): void {\n this.NavOpen = false;\n }\n\n /**\n * Handle updates from child panels\n */\n public async onDataUpdated(): Promise<void> {\n await this.loadCounts();\n this.cdr.markForCheck();\n }\n}\n","<div class=\"api-keys-dashboard\" [class.panel-open]=\"ShowCreateDialog || ShowEditPanel\" [class.nav-open]=\"NavOpen\">\n @if (IsLoading) {\n <mj-loading text=\"Loading API Keys...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Left Navigation Sidebar -->\n <div class=\"dashboard-nav\">\n <div class=\"nav-header\">\n <div class=\"nav-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>API Keys</span>\n </div>\n </div>\n <div class=\"nav-items\">\n <button class=\"nav-item\" [class.active]=\"MainTab === 'keys'\" (click)=\"switchTab('keys'); closeNav()\">\n <i class=\"fa-solid fa-key\"></i>\n <span class=\"nav-label\">API Keys</span>\n <span class=\"nav-badge\">{{TotalKeys}}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"MainTab === 'applications'\" (click)=\"switchTab('applications'); closeNav()\">\n <i class=\"fa-solid fa-cube\"></i>\n <span class=\"nav-label\">Applications</span>\n <span class=\"nav-badge\">{{ApplicationCount}}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"MainTab === 'scopes'\" (click)=\"switchTab('scopes'); closeNav()\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span class=\"nav-label\">Scopes</span>\n <span class=\"nav-badge\">{{ScopeCount}}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"MainTab === 'usage'\" (click)=\"switchTab('usage'); closeNav()\">\n <i class=\"fa-solid fa-chart-line\"></i>\n <span class=\"nav-label\">Usage Analytics</span>\n </button>\n </div>\n </div>\n <!-- Main Content Area -->\n <div class=\"dashboard-content\">\n <div class=\"content-wrapper\">\n <!-- Keys Tab Content -->\n @if (MainTab === 'keys') {\n <!-- Overview View -->\n @if (CurrentView === 'overview') {\n <!-- Header with Actions -->\n <div class=\"overview-header\">\n <div class=\"header-left\">\n <h2 class=\"overview-title\">API Keys Management</h2>\n <p class=\"overview-subtitle\">Manage API keys for external integrations and services</p>\n </div>\n <div class=\"header-actions\">\n <button class=\"btn-refresh\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-refresh\"></i>\n </button>\n @if (UserCanCreateKeys) {\n <button class=\"btn-primary\" (click)=\"openCreateDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Generate New Key</span>\n </button>\n }\n </div>\n </div>\n <!-- Health Score Banner -->\n <div class=\"health-banner\" [ngClass]=\"getHealthClass()\">\n <div class=\"health-score-container\">\n <div class=\"health-score-ring\">\n <svg viewBox=\"0 0 36 36\" class=\"circular-chart\">\n <path class=\"circle-bg\"\n d=\"M18 2.0845\n a 15.9155 15.9155 0 0 1 0 31.831\n a 15.9155 15.9155 0 0 1 0 -31.831\"\n />\n <path class=\"circle\"\n [attr.stroke-dasharray]=\"getHealthScore() + ', 100'\"\n d=\"M18 2.0845\n a 15.9155 15.9155 0 0 1 0 31.831\n a 15.9155 15.9155 0 0 1 0 -31.831\"\n />\n </svg>\n <div class=\"health-score-value\">{{getHealthScore()}}</div>\n </div>\n </div>\n <div class=\"health-info\">\n <div class=\"health-label\">{{getHealthLabel()}}</div>\n <div class=\"health-details\">\n @if (ExpiredKeys > 0) {\n <span class=\"health-alert\" (click)=\"showListView('expired')\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ExpiredKeys}} expired\n </span>\n }\n @if (ExpiringSoonCount > 0) {\n <span class=\"health-warning-text\" (click)=\"showListView('expiring')\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ExpiringSoonCount}} expiring soon\n </span>\n }\n @if (NeverUsedKeys > 0) {\n <span class=\"health-info-text\" (click)=\"showListView('never-used')\">\n <i class=\"fa-solid fa-question-circle\"></i>\n {{NeverUsedKeys}} never used\n </span>\n }\n @if (ExpiredKeys === 0 && ExpiringSoonCount === 0 && NeverUsedKeys === 0) {\n <span class=\"health-ok\">\n <i class=\"fa-solid fa-check-circle\"></i>\n All keys healthy\n </span>\n }\n </div>\n </div>\n </div>\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n <div class=\"kpi-card clickable\" (click)=\"showListView('all')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{TotalKeys}}</div>\n <div class=\"kpi-label\">Total Keys</div>\n </div>\n <div class=\"kpi-trend\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n </div>\n <div class=\"kpi-card active clickable\" (click)=\"showListView('active')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ActiveKeys}}</div>\n <div class=\"kpi-label\">Active</div>\n </div>\n <div class=\"kpi-trend success\">\n <span class=\"percentage\">{{TotalKeys > 0 ? (ActiveKeys / TotalKeys * 100).toFixed(0) : 100}}%</span>\n </div>\n </div>\n <div class=\"kpi-card clickable\" [class.warning]=\"ExpiringSoonCount > 0\" (click)=\"showListView('expiring')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ExpiringSoonCount}}</div>\n <div class=\"kpi-label\">Expiring Soon</div>\n </div>\n @if (ExpiringSoonCount > 0) {\n <div class=\"kpi-trend warning\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n }\n </div>\n <div class=\"kpi-card clickable\" [class.danger]=\"RevokedKeys > 0\" (click)=\"showListView('revoked')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-ban\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{RevokedKeys}}</div>\n <div class=\"kpi-label\">Revoked</div>\n </div>\n </div>\n <div class=\"kpi-card clickable\" (click)=\"switchTab('scopes')\">\n <div class=\"kpi-icon\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{ScopeStats.length}}</div>\n <div class=\"kpi-label\">Scope Categories</div>\n </div>\n </div>\n </div>\n <!-- Content Grid -->\n <div class=\"content-grid\">\n <!-- Recently Used Keys -->\n <div class=\"panel keys-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-key\"></i>\n <span>Recently Used Keys</span>\n </div>\n <button class=\"panel-action\" (click)=\"showListView('all')\">\n View All <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n </div>\n <div class=\"panel-body\">\n @if (TopUsedKeys.length > 0) {\n <div class=\"key-list\">\n @for (key of TopUsedKeys; track key) {\n <div class=\"key-item\" (click)=\"openEditPanel(key)\">\n <div class=\"key-icon\" [class.active]=\"key.Status === 'Active'\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"key-info\">\n <div class=\"key-label\">{{key.Label}}</div>\n <div class=\"key-meta\">\n <span class=\"key-user\">{{key.User}}</span>\n <span class=\"key-hash\">...{{key.Hash.slice(-8)}}</span>\n </div>\n </div>\n <div class=\"key-status\">\n <div class=\"last-used\">{{formatDate(key.LastUsedAt)}}</div>\n <div class=\"expiration\" [ngClass]=\"getExpirationClass(key)\">\n {{formatExpiration(key.ExpiresAt)}}\n </div>\n </div>\n </div>\n }\n </div>\n }\n @if (TopUsedKeys.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-key\"></i>\n <span>No active keys with recent usage</span>\n </div>\n }\n </div>\n </div>\n <!-- Scope Categories -->\n <div class=\"panel scope-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>Permission Scopes</span>\n </div>\n <span class=\"panel-subtitle\">Available scope categories</span>\n </div>\n <div class=\"panel-body\">\n @if (ScopeStats.length > 0) {\n <div class=\"scope-chart\">\n <!-- Visual Donut Chart -->\n <div class=\"donut-chart-container\">\n <svg viewBox=\"0 0 100 100\" class=\"donut-chart\">\n <circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"none\" stroke=\"#e5e7eb\" stroke-width=\"12\"/>\n @for (stat of ScopeStats; track stat; let i = $index) {\n <ng-container>\n <circle\n cx=\"50\" cy=\"50\" r=\"40\"\n fill=\"none\"\n [attr.stroke]=\"stat.color\"\n stroke-width=\"12\"\n [attr.stroke-dasharray]=\"stat.percentage * 2.51 + ' ' + (251 - stat.percentage * 2.51)\"\n [attr.stroke-dashoffset]=\"getDonutOffset(i)\"\n class=\"donut-segment\"\n (click)=\"onScopeClick(stat)\"\n />\n </ng-container>\n }\n </svg>\n <div class=\"donut-center\">\n <div class=\"donut-total\">{{ScopeStats.length}}</div>\n <div class=\"donut-label\">Categories</div>\n </div>\n </div>\n <!-- Legend -->\n <div class=\"scope-legend\">\n @for (stat of ScopeStats; track stat) {\n <div class=\"legend-item\" (click)=\"onScopeClick(stat)\">\n <div class=\"legend-color\" [style.backgroundColor]=\"stat.color\"></div>\n <div class=\"legend-info\">\n <div class=\"legend-name\">\n <i [class]=\"stat.iconClass\"></i>\n {{stat.category}}\n </div>\n <div class=\"legend-value\">{{stat.count}} scopes</div>\n </div>\n <i class=\"fa-solid fa-chevron-right legend-arrow\"></i>\n </div>\n }\n </div>\n </div>\n }\n @if (ScopeStats.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>No scopes configured</span>\n </div>\n }\n </div>\n </div>\n <!-- Recent Activity -->\n <div class=\"panel activity-panel\">\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n <span>Recent Activity</span>\n </div>\n </div>\n <div class=\"panel-body\">\n @if (RecentActivity.length > 0) {\n <div class=\"activity-list\">\n @for (activity of RecentActivity; track activity) {\n <div class=\"activity-item\" (click)=\"onActivityClick(activity)\">\n <div class=\"activity-icon\" [ngClass]=\"getActionClass(activity.action)\">\n <i [class]=\"getActionIcon(activity.action)\"></i>\n </div>\n <div class=\"activity-info\">\n <div class=\"activity-name\">{{activity.keyLabel}}</div>\n <div class=\"activity-meta\">\n <span class=\"activity-action\">{{activity.action}}</span>\n @if (activity.user) {\n <span class=\"activity-user\">by {{activity.user}}</span>\n }\n </div>\n </div>\n <div class=\"activity-time\">\n {{formatDate(activity.date)}}\n </div>\n </div>\n }\n </div>\n }\n @if (RecentActivity.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No recent activity</span>\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Quick Actions -->\n @if (UserCanCreateKeys) {\n <div class=\"quick-actions\">\n <div class=\"quick-actions-title\">Quick Actions</div>\n <div class=\"quick-actions-grid\">\n <button class=\"quick-action\" (click)=\"openCreateDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Generate Key</span>\n </button>\n <button class=\"quick-action\" (click)=\"showListView('all')\">\n <i class=\"fa-solid fa-list\"></i>\n <span>View All Keys</span>\n </button>\n <button class=\"quick-action\" (click)=\"showListView('expiring')\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Expiring Keys</span>\n </button>\n <button class=\"quick-action\" (click)=\"showListView('never-used')\">\n <i class=\"fa-solid fa-question-circle\"></i>\n <span>Never Used</span>\n </button>\n </div>\n </div>\n }\n <!-- Security Notice -->\n <div class=\"security-notice\">\n <i class=\"fa-solid fa-shield-check\"></i>\n <div class=\"notice-content\">\n <strong>Security Best Practices:</strong>\n API keys should be rotated regularly and revoked when no longer needed.\n Keys are hashed and stored securely - the raw key is only shown once at creation time.\n All API key usage is logged for audit purposes.\n </div>\n </div>\n }\n <!-- List View -->\n @if (CurrentView === 'list') {\n <div class=\"list-view-header\">\n <button class=\"back-btn\" (click)=\"showOverview()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n Back to Overview\n </button>\n </div>\n <mj-api-key-list #keyList\n [Filter]=\"ListFilter\"\n (KeySelected)=\"onKeySelected($event)\"\n (CreateRequested)=\"openCreateDialog()\">\n </mj-api-key-list>\n }\n }\n <!-- Applications Tab Content -->\n @if (MainTab === 'applications') {\n <mj-api-applications-panel\n (ApplicationUpdated)=\"onDataUpdated()\">\n </mj-api-applications-panel>\n }\n <!-- Scopes Tab Content -->\n @if (MainTab === 'scopes') {\n <mj-api-scopes-panel\n (ScopeUpdated)=\"onDataUpdated()\">\n </mj-api-scopes-panel>\n }\n <!-- Usage Tab Content -->\n @if (MainTab === 'usage') {\n <mj-api-usage-panel></mj-api-usage-panel>\n }\n </div><!-- /.content-wrapper -->\n </div><!-- /.dashboard-content -->\n <!-- Mobile Navigation Toggle -->\n <button class=\"mobile-nav-toggle\" (click)=\"toggleNav()\">\n <i class=\"fa-solid\" [class.fa-bars]=\"!NavOpen\" [class.fa-times]=\"NavOpen\"></i>\n </button>\n <!-- Mobile Navigation Overlay -->\n <div class=\"mobile-nav-overlay\" (click)=\"closeNav()\"></div>\n }\n\n <!-- Create Dialog -->\n <mj-api-key-create-dialog\n [Visible]=\"ShowCreateDialog\"\n (Created)=\"onKeyCreated($event)\"\n (Closed)=\"onCreateDialogClosed()\">\n </mj-api-key-create-dialog>\n\n <!-- Edit Panel -->\n <mj-api-key-edit-panel\n [Visible]=\"ShowEditPanel\"\n [KeyId]=\"SelectedKeyId\"\n (Updated)=\"onKeyUpdated()\"\n (Revoked)=\"onKeyRevoked()\"\n (Closed)=\"onEditPanelClosed()\">\n </mj-api-key-edit-panel>\n</div>\n"]}
|