@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-usage-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-usage-panel.component.ts","../../src/APIKeys/api-usage-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIKeyUsageLogEntity } from '@memberjunction/core-entities';\n/** Time bucket for aggregation */\ninterface TimeBucket {\n label: string;\n date: Date;\n requests: number;\n errors: number;\n avgResponseTime: number;\n}\n\n/** Endpoint stats */\ninterface EndpointStats {\n endpoint: string;\n method: string;\n requests: number;\n avgResponseTime: number;\n errorRate: number;\n}\n\n/** Key stats */\ninterface KeyStats {\n keyId: string;\n label: string;\n requests: number;\n lastUsed: Date | null;\n}\n\n/** Status code group */\ninterface StatusGroup {\n label: string;\n code: string;\n count: number;\n percentage: number;\n color: string;\n}\n\n/** Usage log item for display */\ninterface UsageLogItem {\n id: string;\n timestamp: Date;\n endpoint: string;\n method: string;\n statusCode: number;\n responseTime: number;\n keyLabel: string;\n keyId: string;\n}\n\n/**\n * API Usage Analytics Panel Component\n * Comprehensive usage statistics and drill-down capabilities\n */\n@Component({\n standalone: false,\n selector: 'mj-api-usage-panel',\n templateUrl: './api-usage-panel.component.html',\n styleUrls: ['./api-usage-panel.component.css']\n})\nexport class APIUsagePanelComponent implements OnInit {\n private md = new Metadata();\n private cdr: ChangeDetectorRef;\n\n // Loading states\n public IsLoading = true;\n public IsLoadingLogs = false;\n\n // Time range filter\n public TimeRange: 'day' | 'week' | 'month' | 'all' = 'week';\n\n // Summary KPIs\n public TotalRequests = 0;\n public TotalErrors = 0;\n public AvgResponseTime = 0;\n public SuccessRate = 0;\n public UniqueKeys = 0;\n public UniqueEndpoints = 0;\n\n // Trend data (vs previous period)\n public RequestsTrend = 0;\n public ErrorsTrend = 0;\n public ResponseTimeTrend = 0;\n\n // Chart data\n public TimeBuckets: TimeBucket[] = [];\n public MaxRequests = 0;\n public MaxErrors = 0;\n\n // Breakdown data\n public TopEndpoints: EndpointStats[] = [];\n public TopKeys: KeyStats[] = [];\n public StatusGroups: StatusGroup[] = [];\n\n // Recent logs\n public RecentLogs: UsageLogItem[] = [];\n public ShowLogsPanel = false;\n public LogsFilter: { endpoint?: string; keyId?: string } = {};\n\n // Key map for labels\n public KeyMap = new Map<string, string>();\n\n // Expose Math for template\n public Math = Math;\n\n constructor(cdr: ChangeDetectorRef) {\n this.cdr = cdr;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadData();\n }\n\n /**\n * Load all usage data\n */\n public async loadData(): Promise<void> {\n this.IsLoading = true;\n try {\n // Load keys for label lookup\n await this.loadKeys();\n // Load usage data\n await this.loadUsageStats();\n } catch (error) {\n console.error('Error loading usage data:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load API keys for label lookup\n */\n private async loadKeys(): Promise<void> {\n const rv = new RunView();\n const result = await rv.RunView<MJAPIKeyEntity>({\n EntityName: 'MJ: API Keys',\n Fields: ['ID', 'Label'],\n ResultType: 'simple'\n });\n if (result.Success) {\n for (const key of result.Results) {\n this.KeyMap.set(key.ID, key.Label);\n }\n }\n }\n\n /**\n * Load usage statistics based on time range\n */\n private async loadUsageStats(): Promise<void> {\n const rv = new RunView();\n const filter = this.getTimeFilter();\n\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 5000,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n const logs = result.Results;\n this.calculateSummaryKPIs(logs);\n this.buildTimeBuckets(logs);\n this.buildEndpointStats(logs);\n this.buildKeyStats(logs);\n this.buildStatusGroups(logs);\n this.RecentLogs = logs.slice(0, 20).map(log => this.mapLogToItem(log));\n }\n }\n\n /**\n * Get time filter for RunView based on selected range\n */\n private getTimeFilter(): string {\n const now = new Date();\n let startDate: Date;\n\n switch (this.TimeRange) {\n case 'day':\n startDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case 'week':\n startDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case 'month':\n startDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case 'all':\n default:\n return '';\n }\n\n return `__mj_CreatedAt >= '${startDate.toISOString()}'`;\n }\n\n /**\n * Calculate summary KPIs\n */\n private calculateSummaryKPIs(logs: MJAPIKeyUsageLogEntity[]): void {\n this.TotalRequests = logs.length;\n\n // Count errors (4xx and 5xx status codes)\n this.TotalErrors = logs.filter(l => l.StatusCode >= 400).length;\n\n // Calculate average response time\n const totalResponseTime = logs.reduce((sum, l) => sum + (l.ResponseTimeMs || 0), 0);\n this.AvgResponseTime = this.TotalRequests > 0\n ? Math.round(totalResponseTime / this.TotalRequests)\n : 0;\n\n // Success rate\n this.SuccessRate = this.TotalRequests > 0\n ? Math.round(((this.TotalRequests - this.TotalErrors) / this.TotalRequests) * 100)\n : 100;\n\n // Unique counts\n const keySet = new Set(logs.map(l => l.APIKeyID));\n const endpointSet = new Set(logs.map(l => l.Endpoint));\n this.UniqueKeys = keySet.size;\n this.UniqueEndpoints = endpointSet.size;\n }\n\n /**\n * Build time buckets for chart\n */\n private buildTimeBuckets(logs: MJAPIKeyUsageLogEntity[]): void {\n const bucketCount = this.TimeRange === 'day' ? 24 : this.TimeRange === 'week' ? 7 : 30;\n const bucketDuration = this.TimeRange === 'day' ? 60 * 60 * 1000 : 24 * 60 * 60 * 1000;\n\n const now = new Date();\n const buckets: TimeBucket[] = [];\n\n for (let i = bucketCount - 1; i >= 0; i--) {\n const bucketDate = new Date(now.getTime() - i * bucketDuration);\n const bucketLogs = logs.filter(l => {\n const logDate = new Date(l.__mj_CreatedAt);\n const nextBucket = new Date(bucketDate.getTime() + bucketDuration);\n return logDate >= bucketDate && logDate < nextBucket;\n });\n\n const errors = bucketLogs.filter(l => l.StatusCode >= 400).length;\n const totalTime = bucketLogs.reduce((sum, l) => sum + (l.ResponseTimeMs || 0), 0);\n\n buckets.push({\n label: this.formatBucketLabel(bucketDate),\n date: bucketDate,\n requests: bucketLogs.length,\n errors,\n avgResponseTime: bucketLogs.length > 0 ? Math.round(totalTime / bucketLogs.length) : 0\n });\n }\n\n this.TimeBuckets = buckets;\n this.MaxRequests = Math.max(...buckets.map(b => b.requests), 1);\n this.MaxErrors = Math.max(...buckets.map(b => b.errors), 1);\n }\n\n /**\n * Format bucket label based on time range\n */\n private formatBucketLabel(date: Date): string {\n if (this.TimeRange === 'day') {\n return date.toLocaleTimeString('en-US', { hour: 'numeric' });\n }\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n }\n\n /**\n * Build endpoint statistics\n */\n private buildEndpointStats(logs: MJAPIKeyUsageLogEntity[]): void {\n const endpointMap = new Map<string, {\n endpoint: string;\n method: string;\n requests: number;\n totalTime: number;\n errors: number\n }>();\n\n for (const log of logs) {\n const key = `${log.Method}:${log.Endpoint}`;\n const existing = endpointMap.get(key);\n if (existing) {\n existing.requests++;\n existing.totalTime += log.ResponseTimeMs || 0;\n if (log.StatusCode >= 400) existing.errors++;\n } else {\n endpointMap.set(key, {\n endpoint: log.Endpoint,\n method: log.Method,\n requests: 1,\n totalTime: log.ResponseTimeMs || 0,\n errors: log.StatusCode >= 400 ? 1 : 0\n });\n }\n }\n\n this.TopEndpoints = Array.from(endpointMap.values())\n .map(e => ({\n endpoint: e.endpoint,\n method: e.method,\n requests: e.requests,\n avgResponseTime: Math.round(e.totalTime / e.requests),\n errorRate: Math.round((e.errors / e.requests) * 100)\n }))\n .sort((a, b) => b.requests - a.requests)\n .slice(0, 10);\n }\n\n /**\n * Build key statistics\n */\n private buildKeyStats(logs: MJAPIKeyUsageLogEntity[]): void {\n const keyMap = new Map<string, { requests: number; lastUsed: Date | null }>();\n\n for (const log of logs) {\n const existing = keyMap.get(log.APIKeyID);\n const logDate = new Date(log.__mj_CreatedAt);\n if (existing) {\n existing.requests++;\n if (!existing.lastUsed || logDate > existing.lastUsed) {\n existing.lastUsed = logDate;\n }\n } else {\n keyMap.set(log.APIKeyID, {\n requests: 1,\n lastUsed: logDate\n });\n }\n }\n\n this.TopKeys = Array.from(keyMap.entries())\n .map(([keyId, stats]) => ({\n keyId,\n label: this.KeyMap.get(keyId) || 'Unknown Key',\n requests: stats.requests,\n lastUsed: stats.lastUsed\n }))\n .sort((a, b) => b.requests - a.requests)\n .slice(0, 10);\n }\n\n /**\n * Build status code groups\n */\n private buildStatusGroups(logs: MJAPIKeyUsageLogEntity[]): void {\n const groups: Record<string, { count: number; label: string; color: string }> = {\n '2xx': { count: 0, label: 'Success (2xx)', color: '#10b981' },\n '3xx': { count: 0, label: 'Redirect (3xx)', color: '#3b82f6' },\n '4xx': { count: 0, label: 'Client Error (4xx)', color: '#f59e0b' },\n '5xx': { count: 0, label: 'Server Error (5xx)', color: '#ef4444' }\n };\n\n for (const log of logs) {\n const code = Math.floor(log.StatusCode / 100);\n const key = `${code}xx`;\n if (groups[key]) {\n groups[key].count++;\n }\n }\n\n this.StatusGroups = Object.entries(groups)\n .filter(([_, v]) => v.count > 0)\n .map(([code, v]) => ({\n code,\n label: v.label,\n count: v.count,\n percentage: this.TotalRequests > 0 ? Math.round((v.count / this.TotalRequests) * 100) : 0,\n color: v.color\n }));\n }\n\n /**\n * Map log entity to display item\n */\n private mapLogToItem(log: MJAPIKeyUsageLogEntity): UsageLogItem {\n return {\n id: log.ID,\n timestamp: new Date(log.__mj_CreatedAt),\n endpoint: log.Endpoint,\n method: log.Method,\n statusCode: log.StatusCode,\n responseTime: log.ResponseTimeMs || 0,\n keyLabel: this.KeyMap.get(log.APIKeyID) || 'Unknown',\n keyId: log.APIKeyID\n };\n }\n\n /**\n * Change time range and reload\n */\n public async setTimeRange(range: 'day' | 'week' | 'month' | 'all'): Promise<void> {\n this.TimeRange = range;\n await this.loadData();\n }\n\n /**\n * Get bar height percentage for chart\n */\n public getBarHeight(value: number): number {\n if (this.MaxRequests === 0) return 0;\n return Math.max(2, (value / this.MaxRequests) * 100);\n }\n\n /**\n * Get error bar height for chart\n */\n public getErrorBarHeight(bucket: TimeBucket): number {\n if (bucket.requests === 0) return 0;\n return (bucket.errors / bucket.requests) * 100;\n }\n\n /**\n * Drill down into endpoint\n */\n public drillDownEndpoint(endpoint: EndpointStats): void {\n this.LogsFilter = { endpoint: endpoint.endpoint };\n this.loadFilteredLogs();\n this.ShowLogsPanel = true;\n }\n\n /**\n * Drill down into key\n */\n public drillDownKey(key: KeyStats): void {\n this.LogsFilter = { keyId: key.keyId };\n this.loadFilteredLogs();\n this.ShowLogsPanel = true;\n }\n\n /**\n * Load filtered logs for drill-down\n */\n private async loadFilteredLogs(): Promise<void> {\n this.IsLoadingLogs = true;\n const rv = new RunView();\n let filter = this.getTimeFilter();\n\n if (this.LogsFilter.endpoint) {\n filter += filter ? ' AND ' : '';\n filter += `Endpoint = '${this.LogsFilter.endpoint}'`;\n }\n if (this.LogsFilter.keyId) {\n filter += filter ? ' AND ' : '';\n filter += `APIKeyID = '${this.LogsFilter.keyId}'`;\n }\n\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.RecentLogs = result.Results.map(log => this.mapLogToItem(log));\n }\n\n this.IsLoadingLogs = false;\n this.cdr.markForCheck();\n }\n\n /**\n * Close logs panel\n */\n public closeLogsPanel(): void {\n this.ShowLogsPanel = false;\n this.LogsFilter = {};\n }\n\n /**\n * Get status class for HTTP status code\n */\n public getStatusClass(statusCode: number): string {\n if (statusCode >= 200 && statusCode < 300) return 'status-success';\n if (statusCode >= 300 && statusCode < 400) return 'status-info';\n if (statusCode >= 400 && statusCode < 500) return 'status-warning';\n if (statusCode >= 500) return 'status-error';\n return '';\n }\n\n /**\n * Get method badge class\n */\n public getMethodClass(method: string): string {\n const m = method.toUpperCase();\n if (m === 'GET') return 'method-get';\n if (m === 'POST') return 'method-post';\n if (m === 'PUT' || m === 'PATCH') return 'method-put';\n if (m === 'DELETE') return 'method-delete';\n return 'method-other';\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n const d = new Date(date);\n const now = new Date();\n const diff = now.getTime() - d.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\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\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n }\n\n /**\n * Format number with K/M suffix\n */\n public formatNumber(num: number): string {\n if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M';\n if (num >= 1000) return (num / 1000).toFixed(1) + 'K';\n return num.toString();\n }\n}\n","<div class=\"usage-panel\">\n @if (IsLoading) {\n <mj-loading text=\"Loading usage analytics...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n API Usage Analytics\n </h3>\n <p class=\"panel-subtitle\">Monitor API key usage, performance, and trends</p>\n </div>\n <div class=\"time-filters\">\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'day'\"\n (click)=\"setTimeRange('day')\">24 Hours</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'week'\"\n (click)=\"setTimeRange('week')\">7 Days</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'month'\"\n (click)=\"setTimeRange('month')\">30 Days</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'all'\"\n (click)=\"setTimeRange('all')\">All Time</button>\n </div>\n </div>\n <!-- Summary KPIs -->\n <div class=\"kpi-grid\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon requests\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{formatNumber(TotalRequests)}}</div>\n <div class=\"kpi-label\">Total Requests</div>\n </div>\n </div>\n <div class=\"kpi-card\" [class.success]=\"SuccessRate >= 95\">\n <div class=\"kpi-icon success-rate\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{SuccessRate}}%</div>\n <div class=\"kpi-label\">Success Rate</div>\n </div>\n </div>\n <div class=\"kpi-card\" [class.warning]=\"TotalErrors > 0\">\n <div class=\"kpi-icon errors\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{formatNumber(TotalErrors)}}</div>\n <div class=\"kpi-label\">Errors</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon response-time\">\n <i class=\"fa-solid fa-gauge-high\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{AvgResponseTime}}ms</div>\n <div class=\"kpi-label\">Avg Response Time</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon keys\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{UniqueKeys}}</div>\n <div class=\"kpi-label\">Active Keys</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon endpoints\">\n <i class=\"fa-solid fa-code-branch\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{UniqueEndpoints}}</div>\n <div class=\"kpi-label\">Unique Endpoints</div>\n </div>\n </div>\n </div>\n <!-- Usage Chart -->\n <div class=\"chart-section\">\n <div class=\"chart-header\">\n <h4>Request Volume</h4>\n <div class=\"chart-legend\">\n <span class=\"legend-item\">\n <span class=\"legend-color requests\"></span> Requests\n </span>\n <span class=\"legend-item\">\n <span class=\"legend-color errors\"></span> Errors\n </span>\n </div>\n </div>\n @if (TimeBuckets.length > 0) {\n <div class=\"chart-container\">\n <div class=\"chart-bars\">\n @for (bucket of TimeBuckets; track bucket) {\n <div class=\"bar-group\" [title]=\"bucket.requests + ' requests, ' + bucket.errors + ' errors'\">\n <div class=\"bar-wrapper\">\n <div class=\"bar requests-bar\"\n [style.height.%]=\"getBarHeight(bucket.requests)\">\n @if (bucket.errors > 0) {\n <div class=\"bar errors-bar\"\n [style.height.%]=\"getErrorBarHeight(bucket)\"\n >\n </div>\n }\n </div>\n </div>\n <div class=\"bar-label\">{{bucket.label}}</div>\n </div>\n }\n </div>\n <div class=\"chart-y-axis\">\n <span>{{formatNumber(MaxRequests)}}</span>\n <span>{{formatNumber(Math.round(MaxRequests / 2))}}</span>\n <span>0</span>\n </div>\n </div>\n }\n @if (TimeBuckets.length === 0) {\n <div class=\"empty-chart\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>No usage data available</span>\n </div>\n }\n </div>\n <!-- Breakdown Grid -->\n <div class=\"breakdown-grid\">\n <!-- Top Endpoints -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-code-branch\"></i>\n Top Endpoints\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (TopEndpoints.length > 0) {\n <div class=\"endpoint-list\">\n @for (ep of TopEndpoints; track ep) {\n <div class=\"endpoint-item\"\n (click)=\"drillDownEndpoint(ep)\">\n <div class=\"endpoint-info\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(ep.method)\">\n {{ep.method}}\n </span>\n <span class=\"endpoint-path\">{{ep.endpoint}}</span>\n </div>\n <div class=\"endpoint-stats\">\n <span class=\"endpoint-requests\">{{formatNumber(ep.requests)}}</span>\n <span class=\"endpoint-time\">{{ep.avgResponseTime}}ms</span>\n <span class=\"endpoint-error\" [class.has-errors]=\"ep.errorRate > 0\">\n {{ep.errorRate}}% err\n </span>\n </div>\n </div>\n }\n </div>\n }\n @if (TopEndpoints.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-code-branch\"></i>\n <span>No endpoint data</span>\n </div>\n }\n </div>\n </div>\n <!-- Top Keys -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-key\"></i>\n Most Active Keys\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (TopKeys.length > 0) {\n <div class=\"key-list\">\n @for (key of TopKeys; track key) {\n <div class=\"key-item\"\n (click)=\"drillDownKey(key)\">\n <div class=\"key-info\">\n <span class=\"key-label\">{{key.label}}</span>\n <span class=\"key-last-used\">{{formatDate(key.lastUsed)}}</span>\n </div>\n <div class=\"key-requests\">{{formatNumber(key.requests)}}</div>\n </div>\n }\n </div>\n }\n @if (TopKeys.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-key\"></i>\n <span>No key data</span>\n </div>\n }\n </div>\n </div>\n <!-- Status Distribution -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-circle-half-stroke\"></i>\n Status Distribution\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (StatusGroups.length > 0) {\n <div class=\"status-distribution\">\n <div class=\"status-bar\">\n @for (group of StatusGroups; track group) {\n <div class=\"status-segment\"\n [style.width.%]=\"group.percentage\"\n [style.backgroundColor]=\"group.color\"\n [title]=\"group.label + ': ' + group.count + ' (' + group.percentage + '%)'\">\n </div>\n }\n </div>\n <div class=\"status-legend\">\n @for (group of StatusGroups; track group) {\n <div class=\"status-legend-item\">\n <span class=\"status-color\" [style.backgroundColor]=\"group.color\"></span>\n <span class=\"status-label\">{{group.label}}</span>\n <span class=\"status-count\">{{formatNumber(group.count)}} ({{group.percentage}}%)</span>\n </div>\n }\n </div>\n </div>\n }\n @if (StatusGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-circle-half-stroke\"></i>\n <span>No status data</span>\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Recent Logs -->\n <div class=\"logs-section\">\n <div class=\"logs-header\">\n <h4>\n <i class=\"fa-solid fa-list\"></i>\n Recent Requests\n </h4>\n </div>\n @if (RecentLogs.length > 0) {\n <div class=\"logs-table\">\n <div class=\"logs-table-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-key\">API Key</span>\n <span class=\"col-method\">Method</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n <div class=\"logs-table-body\">\n @for (log of RecentLogs; track log) {\n <div class=\"log-row\">\n <span class=\"col-time\">{{formatDate(log.timestamp)}}</span>\n <span class=\"col-key\">{{log.keyLabel}}</span>\n <span class=\"col-method\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(log.method)\">\n {{log.method}}\n </span>\n </span>\n <span class=\"col-endpoint\">{{log.endpoint}}</span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n </div>\n }\n @if (RecentLogs.length === 0) {\n <div class=\"empty-state large\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No requests logged yet</span>\n <p>API usage will appear here once keys are used</p>\n </div>\n }\n </div>\n }\n\n <!-- Drill-down Panel -->\n @if (ShowLogsPanel) {\n <mj-window\n [Width]=\"800\"\n [MinWidth]=\"600\"\n [Height]=\"500\"\n [MinHeight]=\"400\"\n [Resizable]=\"true\"\n [Draggable]=\"true\"\n [Top]=\"80\"\n [Visible]=\"true\"\n (Close)=\"closeLogsPanel()\">\n <mj-window-titlebar>\n <div class=\"drilldown-title\">\n <i class=\"fa-solid fa-magnifying-glass-chart\"></i>\n <span>Request Details</span>\n @if (LogsFilter.endpoint) {\n <span class=\"filter-badge\">\n {{LogsFilter.endpoint}}\n </span>\n }\n @if (LogsFilter.keyId) {\n <span class=\"filter-badge\">\n Key: {{KeyMap.get(LogsFilter.keyId) || 'Unknown'}}\n </span>\n }\n </div>\n <button mjButton variant=\"flat\" (click)=\"closeLogsPanel()\" class=\"window-close-btn\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </mj-window-titlebar>\n <div class=\"drilldown-content\">\n @if (IsLoadingLogs) {\n <mj-loading text=\"Loading requests...\"></mj-loading>\n }\n @if (!IsLoadingLogs) {\n <div class=\"drilldown-logs\">\n <div class=\"logs-table\">\n <div class=\"logs-table-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-key\">API Key</span>\n <span class=\"col-method\">Method</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n <div class=\"logs-table-body scrollable\">\n @for (log of RecentLogs; track log) {\n <div class=\"log-row\">\n <span class=\"col-time\">{{formatDate(log.timestamp)}}</span>\n <span class=\"col-key\">{{log.keyLabel}}</span>\n <span class=\"col-method\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(log.method)\">\n {{log.method}}\n </span>\n </span>\n <span class=\"col-endpoint\">{{log.endpoint}}</span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </mj-window>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"api-usage-panel.component.js","sourceRoot":"","sources":["../../src/APIKeys/api-usage-panel.component.ts","../../src/APIKeys/api-usage-panel.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport { MJAPIKeyEntity, MJAPIKeyUsageLogEntity } from '@memberjunction/core-entities';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n/** Time bucket for aggregation */\ninterface TimeBucket {\n label: string;\n date: Date;\n requests: number;\n errors: number;\n avgResponseTime: number;\n}\n\n/** Endpoint stats */\ninterface EndpointStats {\n endpoint: string;\n method: string;\n requests: number;\n avgResponseTime: number;\n errorRate: number;\n}\n\n/** Key stats */\ninterface KeyStats {\n keyId: string;\n label: string;\n requests: number;\n lastUsed: Date | null;\n}\n\n/** Status code group */\ninterface StatusGroup {\n label: string;\n code: string;\n count: number;\n percentage: number;\n color: string;\n}\n\n/** Usage log item for display */\ninterface UsageLogItem {\n id: string;\n timestamp: Date;\n endpoint: string;\n method: string;\n statusCode: number;\n responseTime: number;\n keyLabel: string;\n keyId: string;\n}\n\n/**\n * API Usage Analytics Panel Component\n * Comprehensive usage statistics and drill-down capabilities\n */\n@Component({\n standalone: false,\n selector: 'mj-api-usage-panel',\n templateUrl: './api-usage-panel.component.html',\n styleUrls: ['./api-usage-panel.component.css']\n})\nexport class APIUsagePanelComponent extends BaseAngularComponent implements OnInit {\n private get md() { return this.ProviderToUse; }\n private cdr: ChangeDetectorRef;\n\n // Loading states\n public IsLoading = true;\n public IsLoadingLogs = false;\n\n // Time range filter\n public TimeRange: 'day' | 'week' | 'month' | 'all' = 'week';\n\n // Summary KPIs\n public TotalRequests = 0;\n public TotalErrors = 0;\n public AvgResponseTime = 0;\n public SuccessRate = 0;\n public UniqueKeys = 0;\n public UniqueEndpoints = 0;\n\n // Trend data (vs previous period)\n public RequestsTrend = 0;\n public ErrorsTrend = 0;\n public ResponseTimeTrend = 0;\n\n // Chart data\n public TimeBuckets: TimeBucket[] = [];\n public MaxRequests = 0;\n public MaxErrors = 0;\n\n // Breakdown data\n public TopEndpoints: EndpointStats[] = [];\n public TopKeys: KeyStats[] = [];\n public StatusGroups: StatusGroup[] = [];\n\n // Recent logs\n public RecentLogs: UsageLogItem[] = [];\n public ShowLogsPanel = false;\n public LogsFilter: { endpoint?: string; keyId?: string } = {};\n\n // Key map for labels\n public KeyMap = new Map<string, string>();\n\n // Expose Math for template\n public Math = Math;\n\n constructor(cdr: ChangeDetectorRef) {\n super();\n this.cdr = cdr;\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadData();\n }\n\n /**\n * Load all usage data\n */\n public async loadData(): Promise<void> {\n this.IsLoading = true;\n try {\n // Load keys for label lookup\n await this.loadKeys();\n // Load usage data\n await this.loadUsageStats();\n } catch (error) {\n console.error('Error loading usage data:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Load API keys for label lookup\n */\n private async loadKeys(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJAPIKeyEntity>({\n EntityName: 'MJ: API Keys',\n Fields: ['ID', 'Label'],\n ResultType: 'simple'\n });\n if (result.Success) {\n for (const key of result.Results) {\n this.KeyMap.set(key.ID, key.Label);\n }\n }\n }\n\n /**\n * Load usage statistics based on time range\n */\n private async loadUsageStats(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = this.getTimeFilter();\n\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 5000,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n const logs = result.Results;\n this.calculateSummaryKPIs(logs);\n this.buildTimeBuckets(logs);\n this.buildEndpointStats(logs);\n this.buildKeyStats(logs);\n this.buildStatusGroups(logs);\n this.RecentLogs = logs.slice(0, 20).map(log => this.mapLogToItem(log));\n }\n }\n\n /**\n * Get time filter for RunView based on selected range\n */\n private getTimeFilter(): string {\n const now = new Date();\n let startDate: Date;\n\n switch (this.TimeRange) {\n case 'day':\n startDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case 'week':\n startDate = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case 'month':\n startDate = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n case 'all':\n default:\n return '';\n }\n\n return `__mj_CreatedAt >= '${startDate.toISOString()}'`;\n }\n\n /**\n * Calculate summary KPIs\n */\n private calculateSummaryKPIs(logs: MJAPIKeyUsageLogEntity[]): void {\n this.TotalRequests = logs.length;\n\n // Count errors (4xx and 5xx status codes)\n this.TotalErrors = logs.filter(l => l.StatusCode >= 400).length;\n\n // Calculate average response time\n const totalResponseTime = logs.reduce((sum, l) => sum + (l.ResponseTimeMs || 0), 0);\n this.AvgResponseTime = this.TotalRequests > 0\n ? Math.round(totalResponseTime / this.TotalRequests)\n : 0;\n\n // Success rate\n this.SuccessRate = this.TotalRequests > 0\n ? Math.round(((this.TotalRequests - this.TotalErrors) / this.TotalRequests) * 100)\n : 100;\n\n // Unique counts\n const keySet = new Set(logs.map(l => l.APIKeyID));\n const endpointSet = new Set(logs.map(l => l.Endpoint));\n this.UniqueKeys = keySet.size;\n this.UniqueEndpoints = endpointSet.size;\n }\n\n /**\n * Build time buckets for chart\n */\n private buildTimeBuckets(logs: MJAPIKeyUsageLogEntity[]): void {\n const bucketCount = this.TimeRange === 'day' ? 24 : this.TimeRange === 'week' ? 7 : 30;\n const bucketDuration = this.TimeRange === 'day' ? 60 * 60 * 1000 : 24 * 60 * 60 * 1000;\n\n const now = new Date();\n const buckets: TimeBucket[] = [];\n\n for (let i = bucketCount - 1; i >= 0; i--) {\n const bucketDate = new Date(now.getTime() - i * bucketDuration);\n const bucketLogs = logs.filter(l => {\n const logDate = new Date(l.__mj_CreatedAt);\n const nextBucket = new Date(bucketDate.getTime() + bucketDuration);\n return logDate >= bucketDate && logDate < nextBucket;\n });\n\n const errors = bucketLogs.filter(l => l.StatusCode >= 400).length;\n const totalTime = bucketLogs.reduce((sum, l) => sum + (l.ResponseTimeMs || 0), 0);\n\n buckets.push({\n label: this.formatBucketLabel(bucketDate),\n date: bucketDate,\n requests: bucketLogs.length,\n errors,\n avgResponseTime: bucketLogs.length > 0 ? Math.round(totalTime / bucketLogs.length) : 0\n });\n }\n\n this.TimeBuckets = buckets;\n this.MaxRequests = Math.max(...buckets.map(b => b.requests), 1);\n this.MaxErrors = Math.max(...buckets.map(b => b.errors), 1);\n }\n\n /**\n * Format bucket label based on time range\n */\n private formatBucketLabel(date: Date): string {\n if (this.TimeRange === 'day') {\n return date.toLocaleTimeString('en-US', { hour: 'numeric' });\n }\n return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n }\n\n /**\n * Build endpoint statistics\n */\n private buildEndpointStats(logs: MJAPIKeyUsageLogEntity[]): void {\n const endpointMap = new Map<string, {\n endpoint: string;\n method: string;\n requests: number;\n totalTime: number;\n errors: number\n }>();\n\n for (const log of logs) {\n const key = `${log.Method}:${log.Endpoint}`;\n const existing = endpointMap.get(key);\n if (existing) {\n existing.requests++;\n existing.totalTime += log.ResponseTimeMs || 0;\n if (log.StatusCode >= 400) existing.errors++;\n } else {\n endpointMap.set(key, {\n endpoint: log.Endpoint,\n method: log.Method,\n requests: 1,\n totalTime: log.ResponseTimeMs || 0,\n errors: log.StatusCode >= 400 ? 1 : 0\n });\n }\n }\n\n this.TopEndpoints = Array.from(endpointMap.values())\n .map(e => ({\n endpoint: e.endpoint,\n method: e.method,\n requests: e.requests,\n avgResponseTime: Math.round(e.totalTime / e.requests),\n errorRate: Math.round((e.errors / e.requests) * 100)\n }))\n .sort((a, b) => b.requests - a.requests)\n .slice(0, 10);\n }\n\n /**\n * Build key statistics\n */\n private buildKeyStats(logs: MJAPIKeyUsageLogEntity[]): void {\n const keyMap = new Map<string, { requests: number; lastUsed: Date | null }>();\n\n for (const log of logs) {\n const existing = keyMap.get(log.APIKeyID);\n const logDate = new Date(log.__mj_CreatedAt);\n if (existing) {\n existing.requests++;\n if (!existing.lastUsed || logDate > existing.lastUsed) {\n existing.lastUsed = logDate;\n }\n } else {\n keyMap.set(log.APIKeyID, {\n requests: 1,\n lastUsed: logDate\n });\n }\n }\n\n this.TopKeys = Array.from(keyMap.entries())\n .map(([keyId, stats]) => ({\n keyId,\n label: this.KeyMap.get(keyId) || 'Unknown Key',\n requests: stats.requests,\n lastUsed: stats.lastUsed\n }))\n .sort((a, b) => b.requests - a.requests)\n .slice(0, 10);\n }\n\n /**\n * Build status code groups\n */\n private buildStatusGroups(logs: MJAPIKeyUsageLogEntity[]): void {\n const groups: Record<string, { count: number; label: string; color: string }> = {\n '2xx': { count: 0, label: 'Success (2xx)', color: '#10b981' },\n '3xx': { count: 0, label: 'Redirect (3xx)', color: '#3b82f6' },\n '4xx': { count: 0, label: 'Client Error (4xx)', color: '#f59e0b' },\n '5xx': { count: 0, label: 'Server Error (5xx)', color: '#ef4444' }\n };\n\n for (const log of logs) {\n const code = Math.floor(log.StatusCode / 100);\n const key = `${code}xx`;\n if (groups[key]) {\n groups[key].count++;\n }\n }\n\n this.StatusGroups = Object.entries(groups)\n .filter(([_, v]) => v.count > 0)\n .map(([code, v]) => ({\n code,\n label: v.label,\n count: v.count,\n percentage: this.TotalRequests > 0 ? Math.round((v.count / this.TotalRequests) * 100) : 0,\n color: v.color\n }));\n }\n\n /**\n * Map log entity to display item\n */\n private mapLogToItem(log: MJAPIKeyUsageLogEntity): UsageLogItem {\n return {\n id: log.ID,\n timestamp: new Date(log.__mj_CreatedAt),\n endpoint: log.Endpoint,\n method: log.Method,\n statusCode: log.StatusCode,\n responseTime: log.ResponseTimeMs || 0,\n keyLabel: this.KeyMap.get(log.APIKeyID) || 'Unknown',\n keyId: log.APIKeyID\n };\n }\n\n /**\n * Change time range and reload\n */\n public async setTimeRange(range: 'day' | 'week' | 'month' | 'all'): Promise<void> {\n this.TimeRange = range;\n await this.loadData();\n }\n\n /**\n * Get bar height percentage for chart\n */\n public getBarHeight(value: number): number {\n if (this.MaxRequests === 0) return 0;\n return Math.max(2, (value / this.MaxRequests) * 100);\n }\n\n /**\n * Get error bar height for chart\n */\n public getErrorBarHeight(bucket: TimeBucket): number {\n if (bucket.requests === 0) return 0;\n return (bucket.errors / bucket.requests) * 100;\n }\n\n /**\n * Drill down into endpoint\n */\n public drillDownEndpoint(endpoint: EndpointStats): void {\n this.LogsFilter = { endpoint: endpoint.endpoint };\n this.loadFilteredLogs();\n this.ShowLogsPanel = true;\n }\n\n /**\n * Drill down into key\n */\n public drillDownKey(key: KeyStats): void {\n this.LogsFilter = { keyId: key.keyId };\n this.loadFilteredLogs();\n this.ShowLogsPanel = true;\n }\n\n /**\n * Load filtered logs for drill-down\n */\n private async loadFilteredLogs(): Promise<void> {\n this.IsLoadingLogs = true;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n let filter = this.getTimeFilter();\n\n if (this.LogsFilter.endpoint) {\n filter += filter ? ' AND ' : '';\n filter += `Endpoint = '${this.LogsFilter.endpoint}'`;\n }\n if (this.LogsFilter.keyId) {\n filter += filter ? ' AND ' : '';\n filter += `APIKeyID = '${this.LogsFilter.keyId}'`;\n }\n\n const result = await rv.RunView<MJAPIKeyUsageLogEntity>({\n EntityName: 'MJ: API Key Usage Logs',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.RecentLogs = result.Results.map(log => this.mapLogToItem(log));\n }\n\n this.IsLoadingLogs = false;\n this.cdr.markForCheck();\n }\n\n /**\n * Close logs panel\n */\n public closeLogsPanel(): void {\n this.ShowLogsPanel = false;\n this.LogsFilter = {};\n }\n\n /**\n * Get status class for HTTP status code\n */\n public getStatusClass(statusCode: number): string {\n if (statusCode >= 200 && statusCode < 300) return 'status-success';\n if (statusCode >= 300 && statusCode < 400) return 'status-info';\n if (statusCode >= 400 && statusCode < 500) return 'status-warning';\n if (statusCode >= 500) return 'status-error';\n return '';\n }\n\n /**\n * Get method badge class\n */\n public getMethodClass(method: string): string {\n const m = method.toUpperCase();\n if (m === 'GET') return 'method-get';\n if (m === 'POST') return 'method-post';\n if (m === 'PUT' || m === 'PATCH') return 'method-put';\n if (m === 'DELETE') return 'method-delete';\n return 'method-other';\n }\n\n /**\n * Format date for display\n */\n public formatDate(date: Date | null): string {\n if (!date) return 'Never';\n const d = new Date(date);\n const now = new Date();\n const diff = now.getTime() - d.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\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\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n }\n\n /**\n * Format number with K/M suffix\n */\n public formatNumber(num: number): string {\n if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M';\n if (num >= 1000) return (num / 1000).toFixed(1) + 'K';\n return num.toString();\n }\n}\n","<div class=\"usage-panel\">\n @if (IsLoading) {\n <mj-loading text=\"Loading usage analytics...\"></mj-loading>\n }\n\n @if (!IsLoading) {\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-chart-line\"></i>\n API Usage Analytics\n </h3>\n <p class=\"panel-subtitle\">Monitor API key usage, performance, and trends</p>\n </div>\n <div class=\"time-filters\">\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'day'\"\n (click)=\"setTimeRange('day')\">24 Hours</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'week'\"\n (click)=\"setTimeRange('week')\">7 Days</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'month'\"\n (click)=\"setTimeRange('month')\">30 Days</button>\n <button class=\"time-btn\" [class.active]=\"TimeRange === 'all'\"\n (click)=\"setTimeRange('all')\">All Time</button>\n </div>\n </div>\n <!-- Summary KPIs -->\n <div class=\"kpi-grid\">\n <div class=\"kpi-card\">\n <div class=\"kpi-icon requests\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{formatNumber(TotalRequests)}}</div>\n <div class=\"kpi-label\">Total Requests</div>\n </div>\n </div>\n <div class=\"kpi-card\" [class.success]=\"SuccessRate >= 95\">\n <div class=\"kpi-icon success-rate\">\n <i class=\"fa-solid fa-check-circle\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{SuccessRate}}%</div>\n <div class=\"kpi-label\">Success Rate</div>\n </div>\n </div>\n <div class=\"kpi-card\" [class.warning]=\"TotalErrors > 0\">\n <div class=\"kpi-icon errors\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{formatNumber(TotalErrors)}}</div>\n <div class=\"kpi-label\">Errors</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon response-time\">\n <i class=\"fa-solid fa-gauge-high\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{AvgResponseTime}}ms</div>\n <div class=\"kpi-label\">Avg Response Time</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon keys\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{UniqueKeys}}</div>\n <div class=\"kpi-label\">Active Keys</div>\n </div>\n </div>\n <div class=\"kpi-card\">\n <div class=\"kpi-icon endpoints\">\n <i class=\"fa-solid fa-code-branch\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-value\">{{UniqueEndpoints}}</div>\n <div class=\"kpi-label\">Unique Endpoints</div>\n </div>\n </div>\n </div>\n <!-- Usage Chart -->\n <div class=\"chart-section\">\n <div class=\"chart-header\">\n <h4>Request Volume</h4>\n <div class=\"chart-legend\">\n <span class=\"legend-item\">\n <span class=\"legend-color requests\"></span> Requests\n </span>\n <span class=\"legend-item\">\n <span class=\"legend-color errors\"></span> Errors\n </span>\n </div>\n </div>\n @if (TimeBuckets.length > 0) {\n <div class=\"chart-container\">\n <div class=\"chart-bars\">\n @for (bucket of TimeBuckets; track bucket) {\n <div class=\"bar-group\" [title]=\"bucket.requests + ' requests, ' + bucket.errors + ' errors'\">\n <div class=\"bar-wrapper\">\n <div class=\"bar requests-bar\"\n [style.height.%]=\"getBarHeight(bucket.requests)\">\n @if (bucket.errors > 0) {\n <div class=\"bar errors-bar\"\n [style.height.%]=\"getErrorBarHeight(bucket)\"\n >\n </div>\n }\n </div>\n </div>\n <div class=\"bar-label\">{{bucket.label}}</div>\n </div>\n }\n </div>\n <div class=\"chart-y-axis\">\n <span>{{formatNumber(MaxRequests)}}</span>\n <span>{{formatNumber(Math.round(MaxRequests / 2))}}</span>\n <span>0</span>\n </div>\n </div>\n }\n @if (TimeBuckets.length === 0) {\n <div class=\"empty-chart\">\n <i class=\"fa-solid fa-chart-area\"></i>\n <span>No usage data available</span>\n </div>\n }\n </div>\n <!-- Breakdown Grid -->\n <div class=\"breakdown-grid\">\n <!-- Top Endpoints -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-code-branch\"></i>\n Top Endpoints\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (TopEndpoints.length > 0) {\n <div class=\"endpoint-list\">\n @for (ep of TopEndpoints; track ep) {\n <div class=\"endpoint-item\"\n (click)=\"drillDownEndpoint(ep)\">\n <div class=\"endpoint-info\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(ep.method)\">\n {{ep.method}}\n </span>\n <span class=\"endpoint-path\">{{ep.endpoint}}</span>\n </div>\n <div class=\"endpoint-stats\">\n <span class=\"endpoint-requests\">{{formatNumber(ep.requests)}}</span>\n <span class=\"endpoint-time\">{{ep.avgResponseTime}}ms</span>\n <span class=\"endpoint-error\" [class.has-errors]=\"ep.errorRate > 0\">\n {{ep.errorRate}}% err\n </span>\n </div>\n </div>\n }\n </div>\n }\n @if (TopEndpoints.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-code-branch\"></i>\n <span>No endpoint data</span>\n </div>\n }\n </div>\n </div>\n <!-- Top Keys -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-key\"></i>\n Most Active Keys\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (TopKeys.length > 0) {\n <div class=\"key-list\">\n @for (key of TopKeys; track key) {\n <div class=\"key-item\"\n (click)=\"drillDownKey(key)\">\n <div class=\"key-info\">\n <span class=\"key-label\">{{key.label}}</span>\n <span class=\"key-last-used\">{{formatDate(key.lastUsed)}}</span>\n </div>\n <div class=\"key-requests\">{{formatNumber(key.requests)}}</div>\n </div>\n }\n </div>\n }\n @if (TopKeys.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-key\"></i>\n <span>No key data</span>\n </div>\n }\n </div>\n </div>\n <!-- Status Distribution -->\n <div class=\"breakdown-card\">\n <div class=\"breakdown-header\">\n <h4>\n <i class=\"fa-solid fa-circle-half-stroke\"></i>\n Status Distribution\n </h4>\n </div>\n <div class=\"breakdown-content\">\n @if (StatusGroups.length > 0) {\n <div class=\"status-distribution\">\n <div class=\"status-bar\">\n @for (group of StatusGroups; track group) {\n <div class=\"status-segment\"\n [style.width.%]=\"group.percentage\"\n [style.backgroundColor]=\"group.color\"\n [title]=\"group.label + ': ' + group.count + ' (' + group.percentage + '%)'\">\n </div>\n }\n </div>\n <div class=\"status-legend\">\n @for (group of StatusGroups; track group) {\n <div class=\"status-legend-item\">\n <span class=\"status-color\" [style.backgroundColor]=\"group.color\"></span>\n <span class=\"status-label\">{{group.label}}</span>\n <span class=\"status-count\">{{formatNumber(group.count)}} ({{group.percentage}}%)</span>\n </div>\n }\n </div>\n </div>\n }\n @if (StatusGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-circle-half-stroke\"></i>\n <span>No status data</span>\n </div>\n }\n </div>\n </div>\n </div>\n <!-- Recent Logs -->\n <div class=\"logs-section\">\n <div class=\"logs-header\">\n <h4>\n <i class=\"fa-solid fa-list\"></i>\n Recent Requests\n </h4>\n </div>\n @if (RecentLogs.length > 0) {\n <div class=\"logs-table\">\n <div class=\"logs-table-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-key\">API Key</span>\n <span class=\"col-method\">Method</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n <div class=\"logs-table-body\">\n @for (log of RecentLogs; track log) {\n <div class=\"log-row\">\n <span class=\"col-time\">{{formatDate(log.timestamp)}}</span>\n <span class=\"col-key\">{{log.keyLabel}}</span>\n <span class=\"col-method\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(log.method)\">\n {{log.method}}\n </span>\n </span>\n <span class=\"col-endpoint\">{{log.endpoint}}</span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n </div>\n }\n @if (RecentLogs.length === 0) {\n <div class=\"empty-state large\">\n <i class=\"fa-solid fa-inbox\"></i>\n <span>No requests logged yet</span>\n <p>API usage will appear here once keys are used</p>\n </div>\n }\n </div>\n }\n\n <!-- Drill-down Panel -->\n @if (ShowLogsPanel) {\n <mj-window\n [Width]=\"800\"\n [MinWidth]=\"600\"\n [Height]=\"500\"\n [MinHeight]=\"400\"\n [Resizable]=\"true\"\n [Draggable]=\"true\"\n [Top]=\"80\"\n [Visible]=\"true\"\n (Close)=\"closeLogsPanel()\">\n <mj-window-titlebar>\n <div class=\"drilldown-title\">\n <i class=\"fa-solid fa-magnifying-glass-chart\"></i>\n <span>Request Details</span>\n @if (LogsFilter.endpoint) {\n <span class=\"filter-badge\">\n {{LogsFilter.endpoint}}\n </span>\n }\n @if (LogsFilter.keyId) {\n <span class=\"filter-badge\">\n Key: {{KeyMap.get(LogsFilter.keyId) || 'Unknown'}}\n </span>\n }\n </div>\n <button mjButton variant=\"flat\" (click)=\"closeLogsPanel()\" class=\"window-close-btn\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </mj-window-titlebar>\n <div class=\"drilldown-content\">\n @if (IsLoadingLogs) {\n <mj-loading text=\"Loading requests...\"></mj-loading>\n }\n @if (!IsLoadingLogs) {\n <div class=\"drilldown-logs\">\n <div class=\"logs-table\">\n <div class=\"logs-table-header\">\n <span class=\"col-time\">Time</span>\n <span class=\"col-key\">API Key</span>\n <span class=\"col-method\">Method</span>\n <span class=\"col-endpoint\">Endpoint</span>\n <span class=\"col-status\">Status</span>\n <span class=\"col-duration\">Duration</span>\n </div>\n <div class=\"logs-table-body scrollable\">\n @for (log of RecentLogs; track log) {\n <div class=\"log-row\">\n <span class=\"col-time\">{{formatDate(log.timestamp)}}</span>\n <span class=\"col-key\">{{log.keyLabel}}</span>\n <span class=\"col-method\">\n <span class=\"method-badge\" [ngClass]=\"getMethodClass(log.method)\">\n {{log.method}}\n </span>\n </span>\n <span class=\"col-endpoint\">{{log.endpoint}}</span>\n <span class=\"col-status\" [ngClass]=\"getStatusClass(log.statusCode)\">\n {{log.statusCode}}\n </span>\n <span class=\"col-duration\">{{log.responseTime}}ms</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </mj-window>\n }\n</div>\n"]}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { OnInit, OnDestroy, EventEmitter } from '@angular/core';
|
|
2
2
|
import { MJActionEntity, MJActionCategoryEntity } from '@memberjunction/core-entities';
|
|
3
3
|
import { BehaviorSubject } from 'rxjs';
|
|
4
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
interface CategoryTreeNode {
|
|
6
7
|
category: MJActionCategoryEntity;
|
|
7
8
|
children: CategoryTreeNode[];
|
|
8
9
|
level: number;
|
|
9
10
|
}
|
|
10
|
-
export declare class ActionsListViewComponent implements OnInit, OnDestroy {
|
|
11
|
+
export declare class ActionsListViewComponent extends BaseAngularComponent implements OnInit, OnDestroy {
|
|
11
12
|
openEntityRecord: EventEmitter<{
|
|
12
13
|
entityName: string;
|
|
13
14
|
recordId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions-list-view.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/actions-list-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAW,eAAe,EAAiB,MAAM,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"actions-list-view.component.d.ts","sourceRoot":"","sources":["../../../src/Actions/components/actions-list-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAW,eAAe,EAAiB,MAAM,MAAM,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAErE,UAAU,gBAAgB;IACxB,QAAQ,EAAE,sBAAsB,CAAC;IACjC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAMa,wBAAyB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IACnF,gBAAgB;oBAAiC,MAAM;kBAAY,MAAM;OAAK;IAEjF,SAAS,UAAQ;IACjB,OAAO,EAAE,cAAc,EAAE,CAAM;IAC/B,eAAe,EAAE,cAAc,EAAE,CAAM;IACvC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAa;IAC5D,YAAY,EAAE,gBAAgB,EAAE,CAAM;IACtC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAa;IAE1D,WAAW,0BAAmC;IAC9C,eAAe,0BAAsC;IACrD,aAAa,0BAAsC;IACnD,iBAAiB,0BAAsC;IACvD,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAE5C,aAAa;;;QAKlB;IAEK,WAAW;;;QAIhB;IAEK,eAAe,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAE1D;IAEF,OAAO,CAAC,QAAQ,CAAuB;;IAIvC,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAKnB,OAAO,CAAC,YAAY;YAaN,QAAQ;IA2CtB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,iBAAiB;IAmCzB,OAAO,CAAC,sBAAsB;IA6B9B,OAAO,CAAC,YAAY;IA0Cb,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1C,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAItC,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIhD,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAOxC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAKlD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM;IASxE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQxC;;;OAGG;IACI,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAK7C,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQhD,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI/C,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIxC,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IASlD,gBAAgB,UAAS;IAEzB,kBAAkB,IAAI,IAAI;yCAzTtB,wBAAwB;2CAAxB,wBAAwB;CA4TpC"}
|
|
@@ -2,6 +2,7 @@ import { Component, Output, EventEmitter } from '@angular/core';
|
|
|
2
2
|
import { RunView, LogError } from '@memberjunction/core';
|
|
3
3
|
import { Subject, BehaviorSubject, combineLatest } from 'rxjs';
|
|
4
4
|
import { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';
|
|
5
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "@angular/common";
|
|
7
8
|
import * as i2 from "@angular/forms";
|
|
@@ -223,7 +224,7 @@ function ActionsListViewComponent_Conditional_26_Template(rf, ctx) { if (rf & 1)
|
|
|
223
224
|
i0.ɵɵadvance();
|
|
224
225
|
i0.ɵɵproperty("showText", false);
|
|
225
226
|
} }
|
|
226
|
-
export class ActionsListViewComponent {
|
|
227
|
+
export class ActionsListViewComponent extends BaseAngularComponent {
|
|
227
228
|
openEntityRecord = new EventEmitter();
|
|
228
229
|
isLoading = true;
|
|
229
230
|
actions = [];
|
|
@@ -251,7 +252,7 @@ export class ActionsListViewComponent {
|
|
|
251
252
|
{ text: 'All Categories', value: 'all' }
|
|
252
253
|
];
|
|
253
254
|
destroy$ = new Subject();
|
|
254
|
-
constructor() { }
|
|
255
|
+
constructor() { super(); }
|
|
255
256
|
ngOnInit() {
|
|
256
257
|
this.setupFilters();
|
|
257
258
|
this.loadData();
|
|
@@ -273,7 +274,7 @@ export class ActionsListViewComponent {
|
|
|
273
274
|
async loadData() {
|
|
274
275
|
try {
|
|
275
276
|
this.isLoading = true;
|
|
276
|
-
const rv =
|
|
277
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
277
278
|
const [actionsResult, categoriesResult] = await rv.RunViews([
|
|
278
279
|
{
|
|
279
280
|
EntityName: 'MJ: Actions',
|
|
@@ -486,7 +487,7 @@ export class ActionsListViewComponent {
|
|
|
486
487
|
this.showCategoryTree = !this.showCategoryTree;
|
|
487
488
|
}
|
|
488
489
|
static ɵfac = function ActionsListViewComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ActionsListViewComponent)(); };
|
|
489
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActionsListViewComponent, selectors: [["mj-actions-list-view"]], outputs: { openEntityRecord: "openEntityRecord" }, standalone: false, decls: 27, vars: 14, consts: [["categoryTreeTemplate", ""], [1, "actions-list-view"], [1, "list-header"], [1, "header-title"], [1, "fa-solid", "fa-cogs"], [1, "results-count"], [1, "filters-row"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search actions...", 1, "mj-input", 3, "input", "value"], [1, "filter-group"], ["TextField", "text", "ValueField", "value", 3, "ValueChange", "Data", "ValuePrimitive", "ngModel"], ["mjButton", "", "variant", "outline", 1, "category-filter-button", 3, "click"], [1, "fa-solid", "fa-folder-tree"], [1, "badge"], [1, "category-tree-panel"], [1, "actions-list"], [1, "empty-state"], [1, "loading-overlay"], [1, "tree-header"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "fa-solid", "fa-times"], [1, "tree-actions"], [1, "fa-solid", "fa-folder-open"], [1, "tree-content"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "tree-node", 3, "padding-left"], [1, "tree-node"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "tree-node-button", 3, "click"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "expand-button"], [1, "no-expand"], [1, "fa-solid", "fa-folder"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "expand-button", 3, "click"], [1, "fa-solid", "fa-chevron-down"], [1, "fa-solid", "fa-chevron-right"], [1, "action-card"], [1, "action-card", 3, "click"], [1, "action-icon"], [1, "action-main"], [1, "action-header"], [1, "action-name"], [1, "action-badges"], [1, "status-chip"], ["data-color", "info", 1, "status-chip"], [1, "action-description"], [1, "action-details"], [1, "detail-item"], [1, "action-actions"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fa-solid", "fa-ellipsis-vertical"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-search"], ["size", "medium", 3, "showText"]], template: function ActionsListViewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
490
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActionsListViewComponent, selectors: [["mj-actions-list-view"]], outputs: { openEntityRecord: "openEntityRecord" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 27, vars: 14, consts: [["categoryTreeTemplate", ""], [1, "actions-list-view"], [1, "list-header"], [1, "header-title"], [1, "fa-solid", "fa-cogs"], [1, "results-count"], [1, "filters-row"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search actions...", 1, "mj-input", 3, "input", "value"], [1, "filter-group"], ["TextField", "text", "ValueField", "value", 3, "ValueChange", "Data", "ValuePrimitive", "ngModel"], ["mjButton", "", "variant", "outline", 1, "category-filter-button", 3, "click"], [1, "fa-solid", "fa-folder-tree"], [1, "badge"], [1, "category-tree-panel"], [1, "actions-list"], [1, "empty-state"], [1, "loading-overlay"], [1, "tree-header"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "fa-solid", "fa-times"], [1, "tree-actions"], [1, "fa-solid", "fa-folder-open"], [1, "tree-content"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "tree-node", 3, "padding-left"], [1, "tree-node"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "tree-node-button", 3, "click"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "expand-button"], [1, "no-expand"], [1, "fa-solid", "fa-folder"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "expand-button", 3, "click"], [1, "fa-solid", "fa-chevron-down"], [1, "fa-solid", "fa-chevron-right"], [1, "action-card"], [1, "action-card", 3, "click"], [1, "action-icon"], [1, "action-main"], [1, "action-header"], [1, "action-name"], [1, "action-badges"], [1, "status-chip"], ["data-color", "info", 1, "status-chip"], [1, "action-description"], [1, "action-details"], [1, "detail-item"], [1, "action-actions"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fa-solid", "fa-ellipsis-vertical"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-search"], ["size", "medium", 3, "showText"]], template: function ActionsListViewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
490
491
|
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "div", 3)(3, "h2");
|
|
491
492
|
i0.ɵɵelement(4, "i", 4);
|
|
492
493
|
i0.ɵɵtext(5, " Actions");
|
|
@@ -545,5 +546,5 @@ export class ActionsListViewComponent {
|
|
|
545
546
|
}], () => [], { openEntityRecord: [{
|
|
546
547
|
type: Output
|
|
547
548
|
}] }); })();
|
|
548
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActionsListViewComponent, { className: "ActionsListViewComponent", filePath: "src/Actions/components/actions-list-view.component.ts", lineNumber:
|
|
549
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActionsListViewComponent, { className: "ActionsListViewComponent", filePath: "src/Actions/components/actions-list-view.component.ts", lineNumber: 20 }); })();
|
|
549
550
|
//# sourceMappingURL=actions-list-view.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions-list-view.component.js","sourceRoot":"","sources":["../../../src/Actions/components/actions-list-view.component.ts","../../../src/Actions/components/actions-list-view.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { RunView, LogError } from '@memberjunction/core';\nimport { MJActionEntity, MJActionCategoryEntity } from '@memberjunction/core-entities';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\n\ninterface CategoryTreeNode {\n category: MJActionCategoryEntity;\n children: CategoryTreeNode[];\n level: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-actions-list-view',\n templateUrl: './actions-list-view.component.html',\n styleUrls: ['./actions-list-view.component.css']\n})\nexport class ActionsListViewComponent implements OnInit, OnDestroy {\n @Output() openEntityRecord = new EventEmitter<{entityName: string; recordId: string}>();\n\n public isLoading = true;\n public actions: MJActionEntity[] = [];\n public filteredActions: MJActionEntity[] = [];\n public categories: Map<string, MJActionCategoryEntity> = new Map();\n public categoryTree: CategoryTreeNode[] = [];\n public categoryDescendants: Map<string, Set<string>> = new Map();\n\n public searchTerm$ = new BehaviorSubject<string>('');\n public selectedStatus$ = new BehaviorSubject<string>('all');\n public selectedType$ = new BehaviorSubject<string>('all');\n public selectedCategory$ = new BehaviorSubject<string>('all');\n public expandedCategories: Set<string> = new Set();\n\n public statusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Pending', value: 'Pending' },\n { text: 'Disabled', value: 'Disabled' }\n ];\n\n public typeOptions = [\n { text: 'All Types', value: 'all' },\n { text: 'AI Generated', value: 'Generated' },\n { text: 'Custom', value: 'Custom' }\n ];\n\n public categoryOptions: Array<{text: string; value: string}> = [\n { text: 'All Categories', value: 'all' }\n ];\n\n private destroy$ = new Subject<void>();\n\n constructor() {}\n\n ngOnInit(): void {\n this.setupFilters();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupFilters(): void {\n combineLatest([\n this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),\n this.selectedStatus$.pipe(distinctUntilChanged()),\n this.selectedType$.pipe(distinctUntilChanged()),\n this.selectedCategory$.pipe(distinctUntilChanged())\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.applyFilters();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n \n const rv = new RunView();\n \n const [actionsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions',\n OrderBy: 'Name'\n },\n {\n EntityName: 'MJ: Action Categories',\n OrderBy: 'Name'\n }\n ]);\n \n if (!actionsResult.Success || !categoriesResult.Success) {\n const errors = [];\n if (!actionsResult.Success) \n errors.push('Actions: ' + actionsResult.ErrorMessage);\n if (!categoriesResult.Success) \n errors.push('Categories: ' + categoriesResult.ErrorMessage);\n throw new Error('Failed to load data: ' + errors.join(', '));\n }\n \n const actions = (actionsResult.Results || []) as MJActionEntity[];\n const categories = (categoriesResult.Results || []) as MJActionCategoryEntity[];\n \n this.actions = actions;\n this.populateCategoriesMap(categories);\n this.buildCategoryOptions(categories);\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading actions list data:', error);\n LogError('Failed to load actions list data', undefined, error);\n } finally {\n this.isLoading = false;\n }\n }\n\n\n private populateCategoriesMap(categories: MJActionCategoryEntity[]): void {\n this.categories.clear();\n categories.forEach(category => {\n this.categories.set(category.ID, category);\n });\n \n // Build the category tree\n this.buildCategoryTree(categories);\n \n // Build descendant mapping for efficient filtering\n this.buildDescendantMapping(categories);\n }\n\n private buildCategoryOptions(categories: MJActionCategoryEntity[]): void {\n this.categoryOptions = [\n { text: 'All Categories', value: 'all' },\n ...categories.map(category => ({\n text: category.Name,\n value: category.ID\n }))\n ];\n }\n\n private buildCategoryTree(categories: MJActionCategoryEntity[]): void {\n const categoryMap = new Map<string, CategoryTreeNode>();\n \n // First pass: create all nodes\n categories.forEach(category => {\n categoryMap.set(category.ID, {\n category,\n children: [],\n level: 0\n });\n });\n \n // Second pass: build tree structure\n const rootNodes: CategoryTreeNode[] = [];\n categoryMap.forEach(node => {\n const parentId = node.category.ParentID;\n if (parentId && categoryMap.has(parentId)) {\n const parent = categoryMap.get(parentId)!;\n parent.children.push(node);\n node.level = parent.level + 1;\n } else {\n rootNodes.push(node);\n }\n });\n \n // Sort children at each level by name\n const sortChildren = (nodes: CategoryTreeNode[]) => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n nodes.forEach(node => sortChildren(node.children));\n };\n sortChildren(rootNodes);\n \n this.categoryTree = rootNodes;\n }\n\n private buildDescendantMapping(categories: MJActionCategoryEntity[]): void {\n this.categoryDescendants.clear();\n \n // Initialize each category with itself\n categories.forEach(category => {\n this.categoryDescendants.set(category.ID, new Set([category.ID]));\n });\n \n // Build descendant sets\n const addDescendants = (categoryId: string, descendantId: string) => {\n const descendants = this.categoryDescendants.get(categoryId);\n if (descendants) {\n descendants.add(descendantId);\n }\n };\n \n categories.forEach(category => {\n if (category.ParentID) {\n // Add this category as a descendant of all its ancestors\n let currentParentId: string | null = category.ParentID;\n while (currentParentId) {\n addDescendants(currentParentId, category.ID);\n const parent = this.categories.get(currentParentId);\n currentParentId = parent?.ParentID || null;\n }\n }\n });\n }\n\n private applyFilters(): void {\n let filtered = [...this.actions];\n\n // Apply search filter\n const searchTerm = this.searchTerm$.value.toLowerCase();\n if (searchTerm) {\n filtered = filtered.filter(action => \n action.Name.toLowerCase().includes(searchTerm) ||\n (action.Description || '').toLowerCase().includes(searchTerm)\n );\n }\n\n // Apply status filter\n const status = this.selectedStatus$.value;\n if (status !== 'all') {\n filtered = filtered.filter(action => action.Status === status);\n }\n\n // Apply type filter\n const type = this.selectedType$.value;\n if (type !== 'all') {\n filtered = filtered.filter(action => action.Type === type);\n }\n\n // Apply category filter (includes descendants)\n const categoryId = this.selectedCategory$.value;\n if (categoryId !== 'all') {\n const descendantIds = this.categoryDescendants.get(categoryId);\n if (descendantIds) {\n // Filter actions that belong to the selected category or any of its descendants\n filtered = filtered.filter(action => \n action.CategoryID && descendantIds.has(action.CategoryID)\n );\n } else {\n console.warn(`Category ID ${categoryId} not found in category hierarchy`);\n filtered = [];\n }\n }\n\n this.filteredActions = filtered;\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public onStatusFilterChange(status: string): void {\n this.selectedStatus$.next(status);\n }\n\n public onTypeFilterChange(type: string): void {\n this.selectedType$.next(type);\n }\n\n public onCategoryFilterChange(categoryId: string): void {\n this.selectedCategory$.next(categoryId);\n }\n\n public openAction(action: MJActionEntity): void {\n this.openEntityRecord.emit({\n entityName: 'MJ: Actions',\n recordId: action.ID\n });\n }\n\n public getCategoryName(categoryId: string | null): string {\n if (!categoryId) return 'No Category';\n return this.categories.get(categoryId)?.Name || 'Unknown Category';\n }\n\n public getStatusColor(status: string): 'success' | 'warning' | 'error' | 'info' {\n switch (status) {\n case 'Active': return 'success';\n case 'Pending': return 'warning';\n case 'Disabled': return 'error';\n default: return 'info';\n }\n }\n\n public getTypeIcon(type: string): string {\n switch (type) {\n case 'Generated': return 'fa-solid fa-robot';\n case 'Custom': return 'fa-solid fa-code';\n default: return 'fa-solid fa-cog';\n }\n }\n\n /**\n * Gets the icon class for an action\n * Falls back to type-based icon if no IconClass is set\n */\n public getActionIcon(action: MJActionEntity): string {\n return action?.IconClass || this.getTypeIcon(action.Type);\n }\n\n // Tree view methods\n public toggleCategoryExpanded(categoryId: string): void {\n if (this.expandedCategories.has(categoryId)) {\n this.expandedCategories.delete(categoryId);\n } else {\n this.expandedCategories.add(categoryId);\n }\n }\n\n public isCategoryExpanded(categoryId: string): boolean {\n return this.expandedCategories.has(categoryId);\n }\n\n public selectCategory(categoryId: string): void {\n this.selectedCategory$.next(categoryId);\n }\n\n public getCategoryActionCount(categoryId: string): number {\n const descendantIds = this.categoryDescendants.get(categoryId);\n if (!descendantIds) return 0;\n \n return this.actions.filter(action => \n action.CategoryID && descendantIds.has(action.CategoryID)\n ).length;\n }\n\n public showCategoryTree = false;\n\n public toggleCategoryTree(): void {\n this.showCategoryTree = !this.showCategoryTree;\n }\n}","<div class=\"actions-list-view\" >\n <!-- Header with filters -->\n <div class=\"list-header\">\n <div class=\"header-title\">\n <h2><i class=\"fa-solid fa-cogs\"></i> Actions</h2>\n <div class=\"results-count\">{{ filteredActions.length }} of {{ actions.length }} actions</div>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\" class=\"mj-input\"\n placeholder=\"Search actions...\"\n [value]=\"searchTerm$.value\"\n (input)=\"onSearchChange($any($event.target).value)\" />\n </div>\n </div>\n \n <div class=\"filter-group\">\n <mj-dropdown\n [Data]=\"statusOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedStatus$.value\"\n (ValueChange)=\"onStatusFilterChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"typeOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedType$.value\"\n (ValueChange)=\"onTypeFilterChange($any($event))\">\n </mj-dropdown>\n \n <button mjButton\n variant=\"outline\"\n (click)=\"toggleCategoryTree()\"\n class=\"category-filter-button\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n @if (selectedCategory$.value === 'all') {\n All Categories\n } @else {\n {{ getCategoryName(selectedCategory$.value) }}\n }\n <span class=\"badge\">{{ getCategoryActionCount(selectedCategory$.value) }}</span>\n </button>\n </div>\n </div>\n </div>\n \n <!-- Category Tree View Panel -->\n @if (showCategoryTree) {\n <div class=\"category-tree-panel\">\n <div class=\"tree-header\">\n <h3>Select Category</h3>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"toggleCategoryTree()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n \n <div class=\"tree-actions\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"selectCategory('all')\"\n [class.selected]=\"selectedCategory$.value === 'all'\">\n <i class=\"fa-solid fa-folder-open\"></i>\n All Categories\n <span class=\"badge\">{{ actions.length }}</span>\n </button>\n </div>\n \n <div class=\"tree-content\">\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: categoryTree }\"></ng-container>\n </div>\n \n <ng-template #categoryTreeTemplate let-nodes=\"nodes\">\n @for (node of nodes; track node.category.ID) {\n <div class=\"tree-node\" [style.padding-left.px]=\"node.level * 20\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n class=\"tree-node-button\"\n [class.selected]=\"selectedCategory$.value === node.category.ID\"\n (click)=\"selectCategory(node.category.ID)\">\n \n @if (node.children.length > 0) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n class=\"expand-button\"\n (click)=\"toggleCategoryExpanded(node.category.ID); $event.stopPropagation()\">\n @if (isCategoryExpanded(node.category.ID)) {\n <i class=\"fa-solid fa-chevron-down\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-right\"></i>\n }\n </button>\n } @else {\n <span class=\"no-expand\"></span>\n }\n \n <i class=\"fa-solid fa-folder\"></i>\n {{ node.category.Name }}\n <span class=\"badge\">{{ getCategoryActionCount(node.category.ID) }}</span>\n </button>\n \n @if (node.children.length > 0 && isCategoryExpanded(node.category.ID)) {\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: node.children }\"></ng-container>\n }\n </div>\n }\n </ng-template>\n </div>\n }\n\n <!-- Actions List -->\n <div class=\"actions-list\">\n @if (filteredActions.length > 0) {\n @for (action of filteredActions; track action.ID) {\n <div class=\"action-card\" (click)=\"openAction(action)\">\n <div class=\"action-icon\">\n <i [class]=\"getActionIcon(action)\"></i>\n </div>\n \n <div class=\"action-main\">\n <div class=\"action-header\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-badges\">\n <span class=\"status-chip\" [attr.data-color]=\"getStatusColor(action.Status)\">\n {{ action.Status }}\n </span>\n @if (action.Type === 'Generated') {\n <span class=\"status-chip\" data-color=\"info\">\n <i class=\"fa-solid fa-robot\"></i> AI Generated\n </span>\n }\n </div>\n </div>\n \n <div class=\"action-description\">\n {{ action.Description || 'No description available' }}\n </div>\n \n <div class=\"action-details\">\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ getCategoryName(action.CategoryID) }}</span>\n </div>\n @if (action.__mj_UpdatedAt) {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Updated {{ action.__mj_UpdatedAt | date:'MMM d, yyyy' }}</span>\n </div>\n }\n @if (action.CodeApprovalStatus && action.Type === 'Generated') {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ action.CodeApprovalStatus }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"action-actions\">\n <button mjButton\n variant=\"flat\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n </div>\n </div>\n }\n } @else if (!isLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h3>No actions found</h3>\n <p>Try adjusting your search or filter criteria</p>\n </div>\n }\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"medium\"></mj-loading>\n </div>\n }\n</div>"]}
|
|
1
|
+
{"version":3,"file":"actions-list-view.component.js","sourceRoot":"","sources":["../../../src/Actions/components/actions-list-view.component.ts","../../../src/Actions/components/actions-list-view.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport { RunView, LogError } from '@memberjunction/core';\nimport { MJActionEntity, MJActionCategoryEntity } from '@memberjunction/core-entities';\nimport { Subject, BehaviorSubject, combineLatest } from 'rxjs';\nimport { debounceTime, takeUntil, distinctUntilChanged } from 'rxjs/operators';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\ninterface CategoryTreeNode {\n category: MJActionCategoryEntity;\n children: CategoryTreeNode[];\n level: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-actions-list-view',\n templateUrl: './actions-list-view.component.html',\n styleUrls: ['./actions-list-view.component.css']\n})\nexport class ActionsListViewComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Output() openEntityRecord = new EventEmitter<{entityName: string; recordId: string}>();\n\n public isLoading = true;\n public actions: MJActionEntity[] = [];\n public filteredActions: MJActionEntity[] = [];\n public categories: Map<string, MJActionCategoryEntity> = new Map();\n public categoryTree: CategoryTreeNode[] = [];\n public categoryDescendants: Map<string, Set<string>> = new Map();\n\n public searchTerm$ = new BehaviorSubject<string>('');\n public selectedStatus$ = new BehaviorSubject<string>('all');\n public selectedType$ = new BehaviorSubject<string>('all');\n public selectedCategory$ = new BehaviorSubject<string>('all');\n public expandedCategories: Set<string> = new Set();\n\n public statusOptions = [\n { text: 'All Statuses', value: 'all' },\n { text: 'Active', value: 'Active' },\n { text: 'Pending', value: 'Pending' },\n { text: 'Disabled', value: 'Disabled' }\n ];\n\n public typeOptions = [\n { text: 'All Types', value: 'all' },\n { text: 'AI Generated', value: 'Generated' },\n { text: 'Custom', value: 'Custom' }\n ];\n\n public categoryOptions: Array<{text: string; value: string}> = [\n { text: 'All Categories', value: 'all' }\n ];\n\n private destroy$ = new Subject<void>();\n\n constructor() { super(); }\n\n ngOnInit(): void {\n this.setupFilters();\n this.loadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupFilters(): void {\n combineLatest([\n this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),\n this.selectedStatus$.pipe(distinctUntilChanged()),\n this.selectedType$.pipe(distinctUntilChanged()),\n this.selectedCategory$.pipe(distinctUntilChanged())\n ]).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.applyFilters();\n });\n }\n\n private async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n \n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n \n const [actionsResult, categoriesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Actions',\n OrderBy: 'Name'\n },\n {\n EntityName: 'MJ: Action Categories',\n OrderBy: 'Name'\n }\n ]);\n \n if (!actionsResult.Success || !categoriesResult.Success) {\n const errors = [];\n if (!actionsResult.Success) \n errors.push('Actions: ' + actionsResult.ErrorMessage);\n if (!categoriesResult.Success) \n errors.push('Categories: ' + categoriesResult.ErrorMessage);\n throw new Error('Failed to load data: ' + errors.join(', '));\n }\n \n const actions = (actionsResult.Results || []) as MJActionEntity[];\n const categories = (categoriesResult.Results || []) as MJActionCategoryEntity[];\n \n this.actions = actions;\n this.populateCategoriesMap(categories);\n this.buildCategoryOptions(categories);\n this.applyFilters();\n\n } catch (error) {\n console.error('Error loading actions list data:', error);\n LogError('Failed to load actions list data', undefined, error);\n } finally {\n this.isLoading = false;\n }\n }\n\n\n private populateCategoriesMap(categories: MJActionCategoryEntity[]): void {\n this.categories.clear();\n categories.forEach(category => {\n this.categories.set(category.ID, category);\n });\n \n // Build the category tree\n this.buildCategoryTree(categories);\n \n // Build descendant mapping for efficient filtering\n this.buildDescendantMapping(categories);\n }\n\n private buildCategoryOptions(categories: MJActionCategoryEntity[]): void {\n this.categoryOptions = [\n { text: 'All Categories', value: 'all' },\n ...categories.map(category => ({\n text: category.Name,\n value: category.ID\n }))\n ];\n }\n\n private buildCategoryTree(categories: MJActionCategoryEntity[]): void {\n const categoryMap = new Map<string, CategoryTreeNode>();\n \n // First pass: create all nodes\n categories.forEach(category => {\n categoryMap.set(category.ID, {\n category,\n children: [],\n level: 0\n });\n });\n \n // Second pass: build tree structure\n const rootNodes: CategoryTreeNode[] = [];\n categoryMap.forEach(node => {\n const parentId = node.category.ParentID;\n if (parentId && categoryMap.has(parentId)) {\n const parent = categoryMap.get(parentId)!;\n parent.children.push(node);\n node.level = parent.level + 1;\n } else {\n rootNodes.push(node);\n }\n });\n \n // Sort children at each level by name\n const sortChildren = (nodes: CategoryTreeNode[]) => {\n nodes.sort((a, b) => a.category.Name.localeCompare(b.category.Name));\n nodes.forEach(node => sortChildren(node.children));\n };\n sortChildren(rootNodes);\n \n this.categoryTree = rootNodes;\n }\n\n private buildDescendantMapping(categories: MJActionCategoryEntity[]): void {\n this.categoryDescendants.clear();\n \n // Initialize each category with itself\n categories.forEach(category => {\n this.categoryDescendants.set(category.ID, new Set([category.ID]));\n });\n \n // Build descendant sets\n const addDescendants = (categoryId: string, descendantId: string) => {\n const descendants = this.categoryDescendants.get(categoryId);\n if (descendants) {\n descendants.add(descendantId);\n }\n };\n \n categories.forEach(category => {\n if (category.ParentID) {\n // Add this category as a descendant of all its ancestors\n let currentParentId: string | null = category.ParentID;\n while (currentParentId) {\n addDescendants(currentParentId, category.ID);\n const parent = this.categories.get(currentParentId);\n currentParentId = parent?.ParentID || null;\n }\n }\n });\n }\n\n private applyFilters(): void {\n let filtered = [...this.actions];\n\n // Apply search filter\n const searchTerm = this.searchTerm$.value.toLowerCase();\n if (searchTerm) {\n filtered = filtered.filter(action => \n action.Name.toLowerCase().includes(searchTerm) ||\n (action.Description || '').toLowerCase().includes(searchTerm)\n );\n }\n\n // Apply status filter\n const status = this.selectedStatus$.value;\n if (status !== 'all') {\n filtered = filtered.filter(action => action.Status === status);\n }\n\n // Apply type filter\n const type = this.selectedType$.value;\n if (type !== 'all') {\n filtered = filtered.filter(action => action.Type === type);\n }\n\n // Apply category filter (includes descendants)\n const categoryId = this.selectedCategory$.value;\n if (categoryId !== 'all') {\n const descendantIds = this.categoryDescendants.get(categoryId);\n if (descendantIds) {\n // Filter actions that belong to the selected category or any of its descendants\n filtered = filtered.filter(action => \n action.CategoryID && descendantIds.has(action.CategoryID)\n );\n } else {\n console.warn(`Category ID ${categoryId} not found in category hierarchy`);\n filtered = [];\n }\n }\n\n this.filteredActions = filtered;\n }\n\n public onSearchChange(searchTerm: string): void {\n this.searchTerm$.next(searchTerm);\n }\n\n public onStatusFilterChange(status: string): void {\n this.selectedStatus$.next(status);\n }\n\n public onTypeFilterChange(type: string): void {\n this.selectedType$.next(type);\n }\n\n public onCategoryFilterChange(categoryId: string): void {\n this.selectedCategory$.next(categoryId);\n }\n\n public openAction(action: MJActionEntity): void {\n this.openEntityRecord.emit({\n entityName: 'MJ: Actions',\n recordId: action.ID\n });\n }\n\n public getCategoryName(categoryId: string | null): string {\n if (!categoryId) return 'No Category';\n return this.categories.get(categoryId)?.Name || 'Unknown Category';\n }\n\n public getStatusColor(status: string): 'success' | 'warning' | 'error' | 'info' {\n switch (status) {\n case 'Active': return 'success';\n case 'Pending': return 'warning';\n case 'Disabled': return 'error';\n default: return 'info';\n }\n }\n\n public getTypeIcon(type: string): string {\n switch (type) {\n case 'Generated': return 'fa-solid fa-robot';\n case 'Custom': return 'fa-solid fa-code';\n default: return 'fa-solid fa-cog';\n }\n }\n\n /**\n * Gets the icon class for an action\n * Falls back to type-based icon if no IconClass is set\n */\n public getActionIcon(action: MJActionEntity): string {\n return action?.IconClass || this.getTypeIcon(action.Type);\n }\n\n // Tree view methods\n public toggleCategoryExpanded(categoryId: string): void {\n if (this.expandedCategories.has(categoryId)) {\n this.expandedCategories.delete(categoryId);\n } else {\n this.expandedCategories.add(categoryId);\n }\n }\n\n public isCategoryExpanded(categoryId: string): boolean {\n return this.expandedCategories.has(categoryId);\n }\n\n public selectCategory(categoryId: string): void {\n this.selectedCategory$.next(categoryId);\n }\n\n public getCategoryActionCount(categoryId: string): number {\n const descendantIds = this.categoryDescendants.get(categoryId);\n if (!descendantIds) return 0;\n \n return this.actions.filter(action => \n action.CategoryID && descendantIds.has(action.CategoryID)\n ).length;\n }\n\n public showCategoryTree = false;\n\n public toggleCategoryTree(): void {\n this.showCategoryTree = !this.showCategoryTree;\n }\n}","<div class=\"actions-list-view\" >\n <!-- Header with filters -->\n <div class=\"list-header\">\n <div class=\"header-title\">\n <h2><i class=\"fa-solid fa-cogs\"></i> Actions</h2>\n <div class=\"results-count\">{{ filteredActions.length }} of {{ actions.length }} actions</div>\n </div>\n \n <div class=\"filters-row\">\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\" class=\"mj-input\"\n placeholder=\"Search actions...\"\n [value]=\"searchTerm$.value\"\n (input)=\"onSearchChange($any($event.target).value)\" />\n </div>\n </div>\n \n <div class=\"filter-group\">\n <mj-dropdown\n [Data]=\"statusOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedStatus$.value\"\n (ValueChange)=\"onStatusFilterChange($any($event))\">\n </mj-dropdown>\n\n <mj-dropdown\n [Data]=\"typeOptions\"\n TextField=\"text\"\n ValueField=\"value\"\n [ValuePrimitive]=\"true\"\n [ngModel]=\"selectedType$.value\"\n (ValueChange)=\"onTypeFilterChange($any($event))\">\n </mj-dropdown>\n \n <button mjButton\n variant=\"outline\"\n (click)=\"toggleCategoryTree()\"\n class=\"category-filter-button\">\n <i class=\"fa-solid fa-folder-tree\"></i>\n @if (selectedCategory$.value === 'all') {\n All Categories\n } @else {\n {{ getCategoryName(selectedCategory$.value) }}\n }\n <span class=\"badge\">{{ getCategoryActionCount(selectedCategory$.value) }}</span>\n </button>\n </div>\n </div>\n </div>\n \n <!-- Category Tree View Panel -->\n @if (showCategoryTree) {\n <div class=\"category-tree-panel\">\n <div class=\"tree-header\">\n <h3>Select Category</h3>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"toggleCategoryTree()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n \n <div class=\"tree-actions\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"selectCategory('all')\"\n [class.selected]=\"selectedCategory$.value === 'all'\">\n <i class=\"fa-solid fa-folder-open\"></i>\n All Categories\n <span class=\"badge\">{{ actions.length }}</span>\n </button>\n </div>\n \n <div class=\"tree-content\">\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: categoryTree }\"></ng-container>\n </div>\n \n <ng-template #categoryTreeTemplate let-nodes=\"nodes\">\n @for (node of nodes; track node.category.ID) {\n <div class=\"tree-node\" [style.padding-left.px]=\"node.level * 20\">\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n class=\"tree-node-button\"\n [class.selected]=\"selectedCategory$.value === node.category.ID\"\n (click)=\"selectCategory(node.category.ID)\">\n \n @if (node.children.length > 0) {\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n class=\"expand-button\"\n (click)=\"toggleCategoryExpanded(node.category.ID); $event.stopPropagation()\">\n @if (isCategoryExpanded(node.category.ID)) {\n <i class=\"fa-solid fa-chevron-down\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-right\"></i>\n }\n </button>\n } @else {\n <span class=\"no-expand\"></span>\n }\n \n <i class=\"fa-solid fa-folder\"></i>\n {{ node.category.Name }}\n <span class=\"badge\">{{ getCategoryActionCount(node.category.ID) }}</span>\n </button>\n \n @if (node.children.length > 0 && isCategoryExpanded(node.category.ID)) {\n <ng-container *ngTemplateOutlet=\"categoryTreeTemplate; context: { nodes: node.children }\"></ng-container>\n }\n </div>\n }\n </ng-template>\n </div>\n }\n\n <!-- Actions List -->\n <div class=\"actions-list\">\n @if (filteredActions.length > 0) {\n @for (action of filteredActions; track action.ID) {\n <div class=\"action-card\" (click)=\"openAction(action)\">\n <div class=\"action-icon\">\n <i [class]=\"getActionIcon(action)\"></i>\n </div>\n \n <div class=\"action-main\">\n <div class=\"action-header\">\n <h3 class=\"action-name\">{{ action.Name }}</h3>\n <div class=\"action-badges\">\n <span class=\"status-chip\" [attr.data-color]=\"getStatusColor(action.Status)\">\n {{ action.Status }}\n </span>\n @if (action.Type === 'Generated') {\n <span class=\"status-chip\" data-color=\"info\">\n <i class=\"fa-solid fa-robot\"></i> AI Generated\n </span>\n }\n </div>\n </div>\n \n <div class=\"action-description\">\n {{ action.Description || 'No description available' }}\n </div>\n \n <div class=\"action-details\">\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>{{ getCategoryName(action.CategoryID) }}</span>\n </div>\n @if (action.__mj_UpdatedAt) {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span>Updated {{ action.__mj_UpdatedAt | date:'MMM d, yyyy' }}</span>\n </div>\n }\n @if (action.CodeApprovalStatus && action.Type === 'Generated') {\n <div class=\"detail-item\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ action.CodeApprovalStatus }}</span>\n </div>\n }\n </div>\n </div>\n \n <div class=\"action-actions\">\n <button mjButton\n variant=\"flat\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n </div>\n </div>\n }\n } @else if (!isLoading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-search\"></i>\n <h3>No actions found</h3>\n <p>Try adjusting your search or filter criteria</p>\n </div>\n }\n </div>\n\n @if (isLoading) {\n <div class=\"loading-overlay\">\n <mj-loading [showText]=\"false\" size=\"medium\"></mj-loading>\n </div>\n }\n</div>"]}
|
|
@@ -259,7 +259,7 @@ let ActionsOverviewComponent = class ActionsOverviewComponent extends BaseResour
|
|
|
259
259
|
this.isLoading = true;
|
|
260
260
|
this.cdr.detectChanges();
|
|
261
261
|
// Load all data in a single batch using RunViews
|
|
262
|
-
const rv =
|
|
262
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
263
263
|
const [actionsResult, categoriesResult, executionsResult] = await rv.RunViews([
|
|
264
264
|
{
|
|
265
265
|
EntityName: 'MJ: Actions',
|
|
@@ -361,7 +361,7 @@ let ActionsOverviewComponent = class ActionsOverviewComponent extends BaseResour
|
|
|
361
361
|
extraFilter = filters.join(' AND ');
|
|
362
362
|
}
|
|
363
363
|
try {
|
|
364
|
-
const rv =
|
|
364
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
365
365
|
const result = await rv.RunView({
|
|
366
366
|
EntityName: 'MJ: Actions',
|
|
367
367
|
ExtraFilter: extraFilter,
|