@memberjunction/ng-dashboards 5.38.0 → 5.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -7
- package/dist/AI/components/agents/agent-configuration.component.js +199 -198
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
- 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 +166 -58
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
- 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 +1 -0
- 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 +55 -36
- 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 +9 -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 +158 -117
- 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 +1 -0
- 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 +22 -8
- 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 +217 -860
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1717 -7802
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +333 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +2125 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +58 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.js +260 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +319 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +77 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +519 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +131 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +813 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +177 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1465 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +78 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +492 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +56 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +271 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +306 -290
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +1 -1
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +209 -208
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +130 -128
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +17 -17
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +578 -538
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -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 +331 -303
- package/dist/AI/components/vectors/vector-management-resource.component.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 +14 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/AI/services/cache-metrics.d.ts +50 -0
- package/dist/AI/services/cache-metrics.d.ts.map +1 -0
- package/dist/AI/services/cache-metrics.js +43 -0
- package/dist/AI/services/cache-metrics.js.map +1 -0
- package/dist/APIKeys/api-applications-panel.component.js +2 -2
- package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
- package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js +132 -131
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +141 -141
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +15 -15
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +2 -2
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +2 -2
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +2 -2
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +72 -50
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +103 -102
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +52 -51
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +39 -38
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +92 -89
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +18 -17
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -85
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +155 -150
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +245 -243
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +18 -17
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +236 -229
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +390 -389
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +14 -11
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -119
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +3 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +3 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +525 -566
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +135 -134
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/mcp-dashboard.component.js +443 -438
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +436 -427
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +1 -1
- package/dist/Testing/components/testing-runs.component.js +116 -115
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +6 -7
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +173 -172
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +116 -92
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +57 -35
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +80 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +1 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +7 -1
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +12 -14
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +5 -14
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +4 -5
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +7 -5
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +57 -54
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
|
@@ -12,18 +12,18 @@ import * as i0 from "@angular/core";
|
|
|
12
12
|
import * as i1 from "@angular/common";
|
|
13
13
|
import * as i2 from "../AI/components/charts/time-series-chart.component";
|
|
14
14
|
import * as i3 from "@memberjunction/ng-ui-components";
|
|
15
|
-
function
|
|
16
|
-
i0.ɵɵelementStart(0, "div",
|
|
15
|
+
function CommunicationMonitorResourceComponent_For_71_Template(rf, ctx) { if (rf & 1) {
|
|
16
|
+
i0.ɵɵelementStart(0, "div", 33)(1, "div", 41);
|
|
17
17
|
i0.ɵɵelement(2, "i");
|
|
18
18
|
i0.ɵɵelementEnd();
|
|
19
|
-
i0.ɵɵelementStart(3, "div",
|
|
19
|
+
i0.ɵɵelementStart(3, "div", 42)(4, "span", 43);
|
|
20
20
|
i0.ɵɵtext(5);
|
|
21
21
|
i0.ɵɵelementEnd();
|
|
22
|
-
i0.ɵɵelementStart(6, "span",
|
|
22
|
+
i0.ɵɵelementStart(6, "span", 44);
|
|
23
23
|
i0.ɵɵtext(7);
|
|
24
24
|
i0.ɵɵpipe(8, "date");
|
|
25
25
|
i0.ɵɵelementEnd()();
|
|
26
|
-
i0.ɵɵelementStart(9, "span",
|
|
26
|
+
i0.ɵɵelementStart(9, "span", 45);
|
|
27
27
|
i0.ɵɵtext(10);
|
|
28
28
|
i0.ɵɵelementEnd()();
|
|
29
29
|
} if (rf & 2) {
|
|
@@ -42,29 +42,29 @@ function CommunicationMonitorResourceComponent_For_70_Template(rf, ctx) { if (rf
|
|
|
42
42
|
i0.ɵɵadvance();
|
|
43
43
|
i0.ɵɵtextInterpolate1(" ", log_r1.Status, " ");
|
|
44
44
|
} }
|
|
45
|
-
function
|
|
46
|
-
i0.ɵɵelementStart(0, "div",
|
|
47
|
-
i0.ɵɵelement(1, "i",
|
|
45
|
+
function CommunicationMonitorResourceComponent_Conditional_72_Template(rf, ctx) { if (rf & 1) {
|
|
46
|
+
i0.ɵɵelementStart(0, "div", 34);
|
|
47
|
+
i0.ɵɵelement(1, "i", 46);
|
|
48
48
|
i0.ɵɵelementStart(2, "p");
|
|
49
49
|
i0.ɵɵtext(3, "No recent activity");
|
|
50
50
|
i0.ɵɵelementEnd()();
|
|
51
51
|
} }
|
|
52
|
-
function
|
|
53
|
-
i0.ɵɵelementStart(0, "div",
|
|
54
|
-
i0.ɵɵelement(1, "div",
|
|
55
|
-
i0.ɵɵelementStart(2, "div",
|
|
52
|
+
function CommunicationMonitorResourceComponent_For_82_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
+
i0.ɵɵelementStart(0, "div", 37);
|
|
54
|
+
i0.ɵɵelement(1, "div", 47);
|
|
55
|
+
i0.ɵɵelementStart(2, "div", 48);
|
|
56
56
|
i0.ɵɵelement(3, "i");
|
|
57
57
|
i0.ɵɵelementEnd();
|
|
58
|
-
i0.ɵɵelementStart(4, "div",
|
|
58
|
+
i0.ɵɵelementStart(4, "div", 49)(5, "div", 50);
|
|
59
59
|
i0.ɵɵtext(6);
|
|
60
60
|
i0.ɵɵelementEnd();
|
|
61
|
-
i0.ɵɵelementStart(7, "div",
|
|
61
|
+
i0.ɵɵelementStart(7, "div", 51);
|
|
62
62
|
i0.ɵɵtext(8);
|
|
63
63
|
i0.ɵɵelementEnd()();
|
|
64
|
-
i0.ɵɵelementStart(9, "div",
|
|
65
|
-
i0.ɵɵelement(10, "div",
|
|
64
|
+
i0.ɵɵelementStart(9, "div", 52);
|
|
65
|
+
i0.ɵɵelement(10, "div", 53);
|
|
66
66
|
i0.ɵɵelementEnd();
|
|
67
|
-
i0.ɵɵelementStart(11, "span",
|
|
67
|
+
i0.ɵɵelementStart(11, "span", 54);
|
|
68
68
|
i0.ɵɵtext(12);
|
|
69
69
|
i0.ɵɵelementEnd()();
|
|
70
70
|
} if (rf & 2) {
|
|
@@ -88,28 +88,28 @@ function CommunicationMonitorResourceComponent_For_81_Template(rf, ctx) { if (rf
|
|
|
88
88
|
i0.ɵɵadvance();
|
|
89
89
|
i0.ɵɵtextInterpolate1("", provider_r3.SuccessRate, "%");
|
|
90
90
|
} }
|
|
91
|
-
function
|
|
92
|
-
i0.ɵɵelementStart(0, "div",
|
|
93
|
-
i0.ɵɵelement(1, "i",
|
|
91
|
+
function CommunicationMonitorResourceComponent_Conditional_83_Template(rf, ctx) { if (rf & 1) {
|
|
92
|
+
i0.ɵɵelementStart(0, "div", 34);
|
|
93
|
+
i0.ɵɵelement(1, "i", 55);
|
|
94
94
|
i0.ɵɵelementStart(2, "p");
|
|
95
95
|
i0.ɵɵtext(3, "No providers configured");
|
|
96
96
|
i0.ɵɵelementEnd()();
|
|
97
97
|
} }
|
|
98
|
-
function
|
|
99
|
-
i0.ɵɵelementStart(0, "div",
|
|
98
|
+
function CommunicationMonitorResourceComponent_For_92_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
+
i0.ɵɵelementStart(0, "div", 40)(1, "div", 56);
|
|
100
100
|
i0.ɵɵelement(2, "i");
|
|
101
101
|
i0.ɵɵelementEnd();
|
|
102
|
-
i0.ɵɵelementStart(3, "div",
|
|
102
|
+
i0.ɵɵelementStart(3, "div", 57)(4, "div", 58);
|
|
103
103
|
i0.ɵɵtext(5);
|
|
104
104
|
i0.ɵɵelementEnd();
|
|
105
|
-
i0.ɵɵelementStart(6, "div",
|
|
105
|
+
i0.ɵɵelementStart(6, "div", 59);
|
|
106
106
|
i0.ɵɵtext(7);
|
|
107
107
|
i0.ɵɵpipe(8, "number");
|
|
108
108
|
i0.ɵɵelementEnd()();
|
|
109
|
-
i0.ɵɵelementStart(9, "div",
|
|
110
|
-
i0.ɵɵelement(10, "div",
|
|
109
|
+
i0.ɵɵelementStart(9, "div", 60);
|
|
110
|
+
i0.ɵɵelement(10, "div", 61);
|
|
111
111
|
i0.ɵɵelementEnd();
|
|
112
|
-
i0.ɵɵelementStart(11, "span",
|
|
112
|
+
i0.ɵɵelementStart(11, "span", 62);
|
|
113
113
|
i0.ɵɵtext(12);
|
|
114
114
|
i0.ɵɵelementEnd()();
|
|
115
115
|
} if (rf & 2) {
|
|
@@ -127,9 +127,9 @@ function CommunicationMonitorResourceComponent_For_91_Template(rf, ctx) { if (rf
|
|
|
127
127
|
i0.ɵɵadvance(2);
|
|
128
128
|
i0.ɵɵtextInterpolate1("", channel_r4.Percentage, "%");
|
|
129
129
|
} }
|
|
130
|
-
function
|
|
131
|
-
i0.ɵɵelementStart(0, "div",
|
|
132
|
-
i0.ɵɵelement(1, "i",
|
|
130
|
+
function CommunicationMonitorResourceComponent_Conditional_93_Template(rf, ctx) { if (rf & 1) {
|
|
131
|
+
i0.ɵɵelementStart(0, "div", 34);
|
|
132
|
+
i0.ɵɵelement(1, "i", 38);
|
|
133
133
|
i0.ɵɵelementStart(2, "p");
|
|
134
134
|
i0.ɵɵtext(3, "No channel data available");
|
|
135
135
|
i0.ɵɵelementEnd()();
|
|
@@ -371,104 +371,105 @@ let CommunicationMonitorResourceComponent = class CommunicationMonitorResourceCo
|
|
|
371
371
|
return 'fa-solid fa-chart-line';
|
|
372
372
|
}
|
|
373
373
|
static ɵfac = function CommunicationMonitorResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CommunicationMonitorResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
374
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CommunicationMonitorResourceComponent, selectors: [["mj-communication-monitor-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
374
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CommunicationMonitorResourceComponent, selectors: [["mj-communication-monitor-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 94, vars: 35, consts: [["Title", "Monitor", "Icon", "fa-solid fa-chart-line", "Subtitle", "Live delivery health, provider status, and channel breakdown"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Refresh", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate"], [1, "action-btn-label"], [1, "kpi-strip"], [1, "kpi-card", "sent"], [1, "kpi-icon"], [1, "fa-solid", "fa-paper-plane"], [1, "kpi-body"], [1, "kpi-label"], [1, "kpi-value"], [1, "kpi-delta"], [1, "fa-solid"], [1, "kpi-card", "delivered"], [1, "fa-solid", "fa-check-double"], [1, "delivery-bar"], [1, "delivery-fill"], [1, "kpi-card", "pending"], [1, "fa-solid", "fa-clock"], [1, "kpi-delta", "neutral"], [1, "fa-solid", "fa-minus"], [1, "kpi-card", "failed"], [1, "fa-solid", "fa-circle-exclamation"], [1, "content-grid"], [1, "card"], [1, "card-header"], [1, "fa-solid", "fa-chart-bar"], [1, "chart-container-inner"], [3, "data", "showLegend", "showControls", "config"], [1, "fa-solid", "fa-bolt"], [1, "card-body", "no-padding"], [1, "activity-feed"], [1, "activity-item"], [1, "empty-state"], [1, "fa-solid", "fa-heart-pulse"], [1, "provider-health-list"], [1, "provider-row"], [1, "fa-solid", "fa-layer-group"], [1, "channel-breakdown"], [1, "channel-row"], [1, "activity-icon", 3, "ngClass"], [1, "activity-body"], [1, "activity-title"], [1, "activity-meta"], [1, "activity-status", 3, "ngClass"], [1, "fa-solid", "fa-inbox"], [1, "provider-status-dot"], [1, "provider-logo", 3, "ngClass"], [1, "provider-info"], [1, "provider-name"], [1, "provider-type"], [1, "provider-health-bar"], [1, "provider-health-fill", 3, "ngClass"], [1, "provider-rate", 3, "ngClass"], [1, "fa-solid", "fa-server"], [1, "channel-icon", 3, "ngClass"], [1, "channel-info"], [1, "channel-name"], [1, "channel-count"], [1, "channel-bar-wrapper"], [1, "channel-bar-fill"], [1, "channel-pct"]], template: function CommunicationMonitorResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
375
375
|
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1)(3, "button", 2);
|
|
376
376
|
i0.ɵɵlistener("click", function CommunicationMonitorResourceComponent_Template_button_click_3_listener() { return ctx.loadData(); });
|
|
377
377
|
i0.ɵɵelement(4, "i", 3);
|
|
378
|
-
i0.ɵɵ
|
|
379
|
-
i0.ɵɵ
|
|
380
|
-
i0.ɵɵ
|
|
381
|
-
i0.ɵɵ
|
|
378
|
+
i0.ɵɵelementStart(5, "span", 4);
|
|
379
|
+
i0.ɵɵtext(6, "Refresh");
|
|
380
|
+
i0.ɵɵelementEnd()()()();
|
|
381
|
+
i0.ɵɵelementStart(7, "mj-page-body")(8, "div", 5)(9, "div", 6)(10, "div", 7);
|
|
382
|
+
i0.ɵɵelement(11, "i", 8);
|
|
382
383
|
i0.ɵɵelementEnd();
|
|
383
|
-
i0.ɵɵelementStart(
|
|
384
|
-
i0.ɵɵtext(
|
|
384
|
+
i0.ɵɵelementStart(12, "div", 9)(13, "span", 10);
|
|
385
|
+
i0.ɵɵtext(14, "Total Sent");
|
|
385
386
|
i0.ɵɵelementEnd();
|
|
386
|
-
i0.ɵɵelementStart(
|
|
387
|
-
i0.ɵɵtext(
|
|
388
|
-
i0.ɵɵpipe(
|
|
387
|
+
i0.ɵɵelementStart(15, "span", 11);
|
|
388
|
+
i0.ɵɵtext(16);
|
|
389
|
+
i0.ɵɵpipe(17, "number");
|
|
389
390
|
i0.ɵɵelementEnd();
|
|
390
|
-
i0.ɵɵelementStart(
|
|
391
|
-
i0.ɵɵelement(
|
|
392
|
-
i0.ɵɵtext(
|
|
391
|
+
i0.ɵɵelementStart(18, "span", 12);
|
|
392
|
+
i0.ɵɵelement(19, "i", 13);
|
|
393
|
+
i0.ɵɵtext(20, " Last 24 hours ");
|
|
393
394
|
i0.ɵɵelementEnd()()();
|
|
394
|
-
i0.ɵɵelementStart(
|
|
395
|
-
i0.ɵɵelement(
|
|
395
|
+
i0.ɵɵelementStart(21, "div", 14)(22, "div", 7);
|
|
396
|
+
i0.ɵɵelement(23, "i", 15);
|
|
396
397
|
i0.ɵɵelementEnd();
|
|
397
|
-
i0.ɵɵelementStart(
|
|
398
|
-
i0.ɵɵtext(
|
|
398
|
+
i0.ɵɵelementStart(24, "div", 9)(25, "span", 10);
|
|
399
|
+
i0.ɵɵtext(26, "Delivery Rate");
|
|
399
400
|
i0.ɵɵelementEnd();
|
|
400
|
-
i0.ɵɵelementStart(
|
|
401
|
-
i0.ɵɵtext(
|
|
401
|
+
i0.ɵɵelementStart(27, "span", 11);
|
|
402
|
+
i0.ɵɵtext(28);
|
|
402
403
|
i0.ɵɵelementEnd();
|
|
403
|
-
i0.ɵɵelementStart(
|
|
404
|
-
i0.ɵɵelement(
|
|
404
|
+
i0.ɵɵelementStart(29, "div", 16);
|
|
405
|
+
i0.ɵɵelement(30, "div", 17);
|
|
405
406
|
i0.ɵɵelementEnd()()();
|
|
406
|
-
i0.ɵɵelementStart(
|
|
407
|
-
i0.ɵɵelement(
|
|
407
|
+
i0.ɵɵelementStart(31, "div", 18)(32, "div", 7);
|
|
408
|
+
i0.ɵɵelement(33, "i", 19);
|
|
408
409
|
i0.ɵɵelementEnd();
|
|
409
|
-
i0.ɵɵelementStart(
|
|
410
|
-
i0.ɵɵtext(
|
|
410
|
+
i0.ɵɵelementStart(34, "div", 9)(35, "span", 10);
|
|
411
|
+
i0.ɵɵtext(36, "Pending");
|
|
411
412
|
i0.ɵɵelementEnd();
|
|
412
|
-
i0.ɵɵelementStart(
|
|
413
|
-
i0.ɵɵtext(
|
|
414
|
-
i0.ɵɵpipe(
|
|
413
|
+
i0.ɵɵelementStart(37, "span", 11);
|
|
414
|
+
i0.ɵɵtext(38);
|
|
415
|
+
i0.ɵɵpipe(39, "number");
|
|
415
416
|
i0.ɵɵelementEnd();
|
|
416
|
-
i0.ɵɵelementStart(
|
|
417
|
-
i0.ɵɵelement(
|
|
418
|
-
i0.ɵɵtext(
|
|
417
|
+
i0.ɵɵelementStart(40, "span", 20);
|
|
418
|
+
i0.ɵɵelement(41, "i", 21);
|
|
419
|
+
i0.ɵɵtext(42, " Awaiting provider ");
|
|
419
420
|
i0.ɵɵelementEnd()()();
|
|
420
|
-
i0.ɵɵelementStart(
|
|
421
|
-
i0.ɵɵelement(
|
|
421
|
+
i0.ɵɵelementStart(43, "div", 22)(44, "div", 7);
|
|
422
|
+
i0.ɵɵelement(45, "i", 23);
|
|
422
423
|
i0.ɵɵelementEnd();
|
|
423
|
-
i0.ɵɵelementStart(
|
|
424
|
-
i0.ɵɵtext(
|
|
424
|
+
i0.ɵɵelementStart(46, "div", 9)(47, "span", 10);
|
|
425
|
+
i0.ɵɵtext(48, "Failed");
|
|
425
426
|
i0.ɵɵelementEnd();
|
|
426
|
-
i0.ɵɵelementStart(
|
|
427
|
-
i0.ɵɵtext(
|
|
428
|
-
i0.ɵɵpipe(
|
|
427
|
+
i0.ɵɵelementStart(49, "span", 11);
|
|
428
|
+
i0.ɵɵtext(50);
|
|
429
|
+
i0.ɵɵpipe(51, "number");
|
|
429
430
|
i0.ɵɵelementEnd();
|
|
430
|
-
i0.ɵɵelementStart(
|
|
431
|
-
i0.ɵɵelement(
|
|
432
|
-
i0.ɵɵtext(
|
|
431
|
+
i0.ɵɵelementStart(52, "span", 12);
|
|
432
|
+
i0.ɵɵelement(53, "i", 13);
|
|
433
|
+
i0.ɵɵtext(54);
|
|
433
434
|
i0.ɵɵelementEnd()()()();
|
|
434
|
-
i0.ɵɵelementStart(
|
|
435
|
-
i0.ɵɵelement(
|
|
436
|
-
i0.ɵɵtext(
|
|
435
|
+
i0.ɵɵelementStart(55, "div", 24)(56, "div", 25)(57, "div", 26)(58, "h3");
|
|
436
|
+
i0.ɵɵelement(59, "i", 27);
|
|
437
|
+
i0.ɵɵtext(60, " Delivery Volume");
|
|
437
438
|
i0.ɵɵelementEnd()();
|
|
438
|
-
i0.ɵɵelementStart(
|
|
439
|
-
i0.ɵɵelement(
|
|
439
|
+
i0.ɵɵelementStart(61, "div", 28);
|
|
440
|
+
i0.ɵɵelement(62, "app-time-series-chart", 29);
|
|
440
441
|
i0.ɵɵelementEnd()();
|
|
441
|
-
i0.ɵɵelementStart(
|
|
442
|
-
i0.ɵɵelement(
|
|
443
|
-
i0.ɵɵtext(
|
|
442
|
+
i0.ɵɵelementStart(63, "div", 25)(64, "div", 26)(65, "h3");
|
|
443
|
+
i0.ɵɵelement(66, "i", 30);
|
|
444
|
+
i0.ɵɵtext(67, " Recent Activity");
|
|
444
445
|
i0.ɵɵelementEnd()();
|
|
445
|
-
i0.ɵɵelementStart(
|
|
446
|
-
i0.ɵɵrepeaterCreate(
|
|
447
|
-
i0.ɵɵconditionalCreate(
|
|
446
|
+
i0.ɵɵelementStart(68, "div", 31)(69, "div", 32);
|
|
447
|
+
i0.ɵɵrepeaterCreate(70, CommunicationMonitorResourceComponent_For_71_Template, 11, 11, "div", 33, i0.ɵɵrepeaterTrackByIdentity);
|
|
448
|
+
i0.ɵɵconditionalCreate(72, CommunicationMonitorResourceComponent_Conditional_72_Template, 4, 0, "div", 34);
|
|
448
449
|
i0.ɵɵelementEnd()()()();
|
|
449
|
-
i0.ɵɵelementStart(
|
|
450
|
-
i0.ɵɵelement(
|
|
451
|
-
i0.ɵɵtext(
|
|
450
|
+
i0.ɵɵelementStart(73, "div", 24)(74, "div", 25)(75, "div", 26)(76, "h3");
|
|
451
|
+
i0.ɵɵelement(77, "i", 35);
|
|
452
|
+
i0.ɵɵtext(78, " Provider Health");
|
|
452
453
|
i0.ɵɵelementEnd()();
|
|
453
|
-
i0.ɵɵelementStart(
|
|
454
|
-
i0.ɵɵrepeaterCreate(
|
|
455
|
-
i0.ɵɵconditionalCreate(
|
|
454
|
+
i0.ɵɵelementStart(79, "div", 31)(80, "div", 36);
|
|
455
|
+
i0.ɵɵrepeaterCreate(81, CommunicationMonitorResourceComponent_For_82_Template, 13, 13, "div", 37, i0.ɵɵrepeaterTrackByIdentity);
|
|
456
|
+
i0.ɵɵconditionalCreate(83, CommunicationMonitorResourceComponent_Conditional_83_Template, 4, 0, "div", 34);
|
|
456
457
|
i0.ɵɵelementEnd()()();
|
|
457
|
-
i0.ɵɵelementStart(
|
|
458
|
-
i0.ɵɵelement(
|
|
459
|
-
i0.ɵɵtext(
|
|
458
|
+
i0.ɵɵelementStart(84, "div", 25)(85, "div", 26)(86, "h3");
|
|
459
|
+
i0.ɵɵelement(87, "i", 38);
|
|
460
|
+
i0.ɵɵtext(88, " Channel Breakdown");
|
|
460
461
|
i0.ɵɵelementEnd()();
|
|
461
|
-
i0.ɵɵelementStart(
|
|
462
|
-
i0.ɵɵrepeaterCreate(
|
|
463
|
-
i0.ɵɵconditionalCreate(
|
|
462
|
+
i0.ɵɵelementStart(89, "div", 31)(90, "div", 39);
|
|
463
|
+
i0.ɵɵrepeaterCreate(91, CommunicationMonitorResourceComponent_For_92_Template, 13, 12, "div", 40, i0.ɵɵrepeaterTrackByIdentity);
|
|
464
|
+
i0.ɵɵconditionalCreate(93, CommunicationMonitorResourceComponent_Conditional_93_Template, 4, 0, "div", 34);
|
|
464
465
|
i0.ɵɵelementEnd()()()()()();
|
|
465
466
|
} if (rf & 2) {
|
|
466
467
|
i0.ɵɵadvance(3);
|
|
467
468
|
i0.ɵɵproperty("disabled", ctx.isLoading);
|
|
468
469
|
i0.ɵɵadvance();
|
|
469
470
|
i0.ɵɵclassProp("spinning", ctx.isLoading);
|
|
470
|
-
i0.ɵɵadvance(
|
|
471
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(
|
|
471
|
+
i0.ɵɵadvance(12);
|
|
472
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(17, 29, ctx.stats.totalSent));
|
|
472
473
|
i0.ɵɵadvance(2);
|
|
473
474
|
i0.ɵɵclassMap(ctx.stats.totalSent > 0 ? "up" : "neutral");
|
|
474
475
|
i0.ɵɵadvance();
|
|
@@ -478,9 +479,9 @@ let CommunicationMonitorResourceComponent = class CommunicationMonitorResourceCo
|
|
|
478
479
|
i0.ɵɵadvance(2);
|
|
479
480
|
i0.ɵɵstyleProp("width", ctx.stats.deliveryRate, "%");
|
|
480
481
|
i0.ɵɵadvance(8);
|
|
481
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(
|
|
482
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(39, 31, ctx.stats.pending));
|
|
482
483
|
i0.ɵɵadvance(12);
|
|
483
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(
|
|
484
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(51, 33, ctx.stats.failed));
|
|
484
485
|
i0.ɵɵadvance(2);
|
|
485
486
|
i0.ɵɵclassMap(ctx.stats.failed > 0 ? "down" : "neutral");
|
|
486
487
|
i0.ɵɵadvance();
|
|
@@ -492,15 +493,15 @@ let CommunicationMonitorResourceComponent = class CommunicationMonitorResourceCo
|
|
|
492
493
|
i0.ɵɵadvance(8);
|
|
493
494
|
i0.ɵɵrepeater(ctx.recentLogs);
|
|
494
495
|
i0.ɵɵadvance(2);
|
|
495
|
-
i0.ɵɵconditional(ctx.recentLogs.length === 0 ?
|
|
496
|
+
i0.ɵɵconditional(ctx.recentLogs.length === 0 ? 72 : -1);
|
|
496
497
|
i0.ɵɵadvance(9);
|
|
497
498
|
i0.ɵɵrepeater(ctx.providerHealth);
|
|
498
499
|
i0.ɵɵadvance(2);
|
|
499
|
-
i0.ɵɵconditional(ctx.providerHealth.length === 0 ?
|
|
500
|
+
i0.ɵɵconditional(ctx.providerHealth.length === 0 ? 83 : -1);
|
|
500
501
|
i0.ɵɵadvance(8);
|
|
501
502
|
i0.ɵɵrepeater(ctx.channelBreakdown);
|
|
502
503
|
i0.ɵɵadvance(2);
|
|
503
|
-
i0.ɵɵconditional(ctx.channelBreakdown.length === 0 ?
|
|
504
|
+
i0.ɵɵconditional(ctx.channelBreakdown.length === 0 ? 93 : -1);
|
|
504
505
|
} }, dependencies: [i1.NgClass, i2.TimeSeriesChartComponent, i3.MJButtonDirective, i3.MJPageHeaderComponent, i3.MJPageLayoutComponent, i3.MJPageBodyComponent, i1.DecimalPipe, i1.DatePipe], styles: ["\n\n .kpi-strip[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n }\n .kpi-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n transition: all 0.15s ease;\n position: relative;\n overflow: hidden;\n }\n .kpi-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .kpi-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 3px;\n }\n .kpi-card.sent[_ngcontent-%COMP%]::before { background: var(--mj-brand-primary); }\n .kpi-card.delivered[_ngcontent-%COMP%]::before { background: var(--mj-status-success); }\n .kpi-card.pending[_ngcontent-%COMP%]::before { background: var(--mj-status-warning); }\n .kpi-card.failed[_ngcontent-%COMP%]::before { background: var(--mj-status-error); }\n\n .kpi-icon[_ngcontent-%COMP%] {\n width: 44px; height: 44px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .kpi-card.sent[_ngcontent-%COMP%] .kpi-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card.delivered[_ngcontent-%COMP%] .kpi-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card.pending[_ngcontent-%COMP%] .kpi-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card.failed[_ngcontent-%COMP%] .kpi-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .kpi-body[_ngcontent-%COMP%] { flex: 1; display: flex; flex-direction: column; gap: 2px; }\n .kpi-label[_ngcontent-%COMP%] {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n }\n .kpi-value[_ngcontent-%COMP%] {\n font-size: 28px; font-weight: 800;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em; line-height: 1.1;\n }\n .kpi-delta[_ngcontent-%COMP%] {\n display: inline-flex; align-items: center;\n gap: 4px; font-size: 11px; font-weight: 600;\n margin-top: 4px; padding: 2px 8px;\n border-radius: 10px; width: fit-content;\n }\n .kpi-delta.up[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-delta.down[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-delta.neutral[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .delivery-bar[_ngcontent-%COMP%] {\n height: 6px; margin-top: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .delivery-fill[_ngcontent-%COMP%] {\n height: 100%; border-radius: 3px;\n background: var(--mj-status-success); transition: width 0.6s ease;\n }\n\n \n\n .content-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1.6fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n .card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 13px; font-weight: 700;\n color: var(--mj-text-primary);\n display: flex; align-items: center; gap: 8px;\n margin: 0;\n }\n .card-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n .card-body[_ngcontent-%COMP%] { padding: 16px 20px; }\n .card-body.no-padding[_ngcontent-%COMP%] { padding: 0; }\n\n .chart-container-inner[_ngcontent-%COMP%] {\n padding: 16px 20px;\n min-height: 300px;\n }\n\n \n\n .activity-feed[_ngcontent-%COMP%] { max-height: 370px; overflow-y: auto; }\n .activity-item[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 12px;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease; cursor: pointer;\n }\n .activity-item[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n .activity-item[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-sunken); }\n\n .activity-icon[_ngcontent-%COMP%] {\n width: 34px; height: 34px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0;\n }\n .activity-icon.email[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .activity-icon.sms[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-icon.error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .activity-body[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n .activity-title[_ngcontent-%COMP%] {\n font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n display: block;\n }\n .activity-meta[_ngcontent-%COMP%] {\n font-size: 11px; color: var(--mj-text-muted); margin-top: 1px;\n display: block;\n }\n .activity-status[_ngcontent-%COMP%] {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n .activity-status.complete[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-status.failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .activity-status.pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n \n\n .provider-health-list[_ngcontent-%COMP%] { display: flex; flex-direction: column; }\n .provider-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease;\n }\n .provider-row[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n .provider-row[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-sunken); }\n\n .provider-status-dot[_ngcontent-%COMP%] {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--mj-border-strong);\n }\n .provider-status-dot.active[_ngcontent-%COMP%] { background: var(--mj-status-success); }\n\n .provider-logo[_ngcontent-%COMP%] {\n width: 36px; height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .provider-logo.sendgrid[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n .provider-logo.twilio[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n .provider-logo.gmail[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n .provider-logo.msgraph[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n .provider-info[_ngcontent-%COMP%] { flex: 1; }\n .provider-name[_ngcontent-%COMP%] { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n .provider-type[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-muted); }\n\n .provider-health-bar[_ngcontent-%COMP%] {\n width: 80px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .provider-health-fill[_ngcontent-%COMP%] {\n height: 100%; border-radius: 3px;\n transition: width 0.4s ease;\n }\n .provider-health-fill.excellent[_ngcontent-%COMP%] { background: var(--mj-status-success); }\n .provider-health-fill.good[_ngcontent-%COMP%] { background: var(--mj-status-success); }\n .provider-health-fill.warning[_ngcontent-%COMP%] { background: var(--mj-status-warning); }\n .provider-health-fill.critical[_ngcontent-%COMP%] { background: var(--mj-status-error); }\n\n .provider-rate[_ngcontent-%COMP%] {\n font-size: 12px; font-weight: 700;\n min-width: 44px; text-align: right;\n }\n .provider-rate.excellent[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n .provider-rate.good[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n .provider-rate.warning[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n .provider-rate.critical[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n\n \n\n .channel-breakdown[_ngcontent-%COMP%] { display: flex; flex-direction: column; }\n .channel-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .channel-row[_ngcontent-%COMP%]:last-child { border-bottom: none; }\n .channel-icon[_ngcontent-%COMP%] {\n width: 32px; height: 32px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px; flex-shrink: 0;\n }\n .channel-icon.email[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .channel-icon.sms[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .channel-info[_ngcontent-%COMP%] { flex: 1; }\n .channel-name[_ngcontent-%COMP%] { font-size: 12px; font-weight: 600; color: var(--mj-text-primary); }\n .channel-count[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-muted); }\n\n .channel-bar-wrapper[_ngcontent-%COMP%] {\n width: 100px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .channel-bar-fill[_ngcontent-%COMP%] { height: 100%; border-radius: 3px; }\n .channel-pct[_ngcontent-%COMP%] {\n font-size: 12px; font-weight: 700;\n color: var(--mj-text-primary);\n min-width: 36px; text-align: right;\n }\n\n \n\n .empty-state[_ngcontent-%COMP%] {\n display: flex; flex-direction: column;\n align-items: center; justify-content: center;\n padding: 40px 0; color: var(--mj-text-muted);\n }\n .empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 2rem; margin-bottom: 12px; opacity: 0.5; }\n .empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { margin: 0; font-size: 13px; }\n\n @media (max-width: 1200px) {\n .kpi-strip[_ngcontent-%COMP%] { grid-template-columns: repeat(2, 1fr); }\n .content-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n }"] });
|
|
505
506
|
};
|
|
506
507
|
CommunicationMonitorResourceComponent = __decorate([
|
|
@@ -517,7 +518,7 @@ export { CommunicationMonitorResourceComponent };
|
|
|
517
518
|
Subtitle="Live delivery health, provider status, and channel breakdown">
|
|
518
519
|
<div actions>
|
|
519
520
|
<button mjButton variant="secondary" size="sm" (click)="loadData()" [disabled]="isLoading" title="Refresh">
|
|
520
|
-
<i class="fa-solid fa-rotate" [class.spinning]="isLoading"></i> Refresh
|
|
521
|
+
<i class="fa-solid fa-rotate" [class.spinning]="isLoading"></i> <span class="action-btn-label">Refresh</span>
|
|
521
522
|
</button>
|
|
522
523
|
</div>
|
|
523
524
|
</mj-page-header>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication-monitor-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-monitor-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationLogEntity, MJCommunicationProviderEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView } from '@memberjunction/core';\n\ninterface ProviderHealth {\n Name: string;\n Type: string;\n SentCount: number;\n SuccessRate: number;\n IsActive: boolean;\n IconClass: string;\n ColorClass: string;\n}\n\ninterface ChannelBreakdown {\n Name: string;\n IconClass: string;\n Count: number;\n Percentage: number;\n ColorClass: string;\n}\n\ninterface HourlyBucket {\n timestamp: Date;\n executions: number;\n errors: number;\n cost: number;\n tokens: number;\n avgTime: number;\n}\n@RegisterClass(BaseResourceComponent, 'CommunicationMonitorResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-monitor-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"Monitor\"\n Icon=\"fa-solid fa-chart-line\"\n Subtitle=\"Live delivery health, provider status, and channel breakdown\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadData()\" [disabled]=\"isLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isLoading\"></i> Refresh\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n <!-- KPI STRIP -->\n <div class=\"kpi-strip\">\n <div class=\"kpi-card sent\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-paper-plane\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Total Sent</span>\n <span class=\"kpi-value\">{{stats.totalSent | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.totalSent > 0 ? 'up' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.totalSent > 0\" [class.fa-minus]=\"stats.totalSent === 0\"></i>\n Last 24 hours\n </span>\n </div>\n </div>\n <div class=\"kpi-card delivered\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-check-double\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Delivery Rate</span>\n <span class=\"kpi-value\">{{stats.deliveryRate}}%</span>\n <div class=\"delivery-bar\">\n <div class=\"delivery-fill\" [style.width.%]=\"stats.deliveryRate\"></div>\n </div>\n </div>\n </div>\n <div class=\"kpi-card pending\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-clock\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Pending</span>\n <span class=\"kpi-value\">{{stats.pending | number}}</span>\n <span class=\"kpi-delta neutral\">\n <i class=\"fa-solid fa-minus\"></i> Awaiting provider\n </span>\n </div>\n </div>\n <div class=\"kpi-card failed\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-circle-exclamation\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Failed</span>\n <span class=\"kpi-value\">{{stats.failed | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.failed > 0 ? 'down' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.failed > 0\" [class.fa-minus]=\"stats.failed === 0\"></i>\n {{stats.failed > 0 ? 'Requires attention' : 'No failures'}}\n </span>\n </div>\n </div>\n </div>\n \n <!-- CHARTS + ACTIVITY ROW -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Delivery Volume</h3>\n </div>\n <div class=\"chart-container-inner\">\n <app-time-series-chart\n [data]=\"chartData\"\n [showLegend]=\"true\"\n [showControls]=\"false\"\n [config]=\"chartConfig\">\n </app-time-series-chart>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-bolt\"></i> Recent Activity</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"activity-feed\">\n @for (log of recentLogs; track log) {\n <div class=\"activity-item\">\n <div class=\"activity-icon\" [ngClass]=\"getActivityIconClass(log)\">\n <i [class]=\"getActivityIcon(log)\"></i>\n </div>\n <div class=\"activity-body\">\n <span class=\"activity-title\">{{log.CommunicationProviderMessageType || 'Message'}}</span>\n <span class=\"activity-meta\">{{log.CommunicationProvider}} • {{log.MessageDate | date:'shortTime'}}</span>\n </div>\n <span class=\"activity-status\" [ngClass]=\"log.Status.toLowerCase()\">\n {{log.Status}}\n </span>\n </div>\n }\n @if (recentLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No recent activity</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n \n <!-- PROVIDER HEALTH + CHANNEL BREAKDOWN -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Provider Health</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"provider-health-list\">\n @for (provider of providerHealth; track provider) {\n <div class=\"provider-row\">\n <div class=\"provider-status-dot\" [class.active]=\"provider.IsActive\"></div>\n <div class=\"provider-logo\" [ngClass]=\"provider.ColorClass\">\n <i [class]=\"provider.IconClass\"></i>\n </div>\n <div class=\"provider-info\">\n <div class=\"provider-name\">{{provider.Name}}</div>\n <div class=\"provider-type\">{{provider.Type}} • {{provider.SentCount}} sent today</div>\n </div>\n <div class=\"provider-health-bar\">\n <div class=\"provider-health-fill\" [ngClass]=\"getHealthClass(provider.SuccessRate)\" [style.width.%]=\"provider.SuccessRate\"></div>\n </div>\n <span class=\"provider-rate\" [ngClass]=\"getHealthClass(provider.SuccessRate)\">{{provider.SuccessRate}}%</span>\n </div>\n }\n @if (providerHealth.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No providers configured</p>\n </div>\n }\n </div>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-layer-group\"></i> Channel Breakdown</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"channel-breakdown\">\n @for (channel of channelBreakdown; track channel) {\n <div class=\"channel-row\">\n <div class=\"channel-icon\" [ngClass]=\"channel.ColorClass\">\n <i [class]=\"channel.IconClass\"></i>\n </div>\n <div class=\"channel-info\">\n <div class=\"channel-name\">{{channel.Name}}</div>\n <div class=\"channel-count\">{{channel.Count | number}} messages</div>\n </div>\n <div class=\"channel-bar-wrapper\">\n <div class=\"channel-bar-fill\" [style.width.%]=\"channel.Percentage\" [style.background]=\"channel.ColorClass === 'email' ? 'var(--mj-brand-primary)' : 'var(--mj-status-success)'\"></div>\n </div>\n <span class=\"channel-pct\">{{channel.Percentage}}%</span>\n </div>\n }\n @if (channelBreakdown.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <p>No channel data available</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n /* KPI STRIP */\n .kpi-strip {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n }\n .kpi-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n transition: all 0.15s ease;\n position: relative;\n overflow: hidden;\n }\n .kpi-card:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .kpi-card::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 3px;\n }\n .kpi-card.sent::before { background: var(--mj-brand-primary); }\n .kpi-card.delivered::before { background: var(--mj-status-success); }\n .kpi-card.pending::before { background: var(--mj-status-warning); }\n .kpi-card.failed::before { background: var(--mj-status-error); }\n\n .kpi-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .kpi-card.sent .kpi-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card.delivered .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card.pending .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card.failed .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .kpi-body { flex: 1; display: flex; flex-direction: column; gap: 2px; }\n .kpi-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n }\n .kpi-value {\n font-size: 28px; font-weight: 800;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em; line-height: 1.1;\n }\n .kpi-delta {\n display: inline-flex; align-items: center;\n gap: 4px; font-size: 11px; font-weight: 600;\n margin-top: 4px; padding: 2px 8px;\n border-radius: 10px; width: fit-content;\n }\n .kpi-delta.up {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-delta.down {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-delta.neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .delivery-bar {\n height: 6px; margin-top: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .delivery-fill {\n height: 100%; border-radius: 3px;\n background: var(--mj-status-success); transition: width 0.6s ease;\n }\n\n /* CONTENT GRID */\n .content-grid {\n display: grid;\n grid-template-columns: 1.6fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .card-header h3 {\n font-size: 13px; font-weight: 700;\n color: var(--mj-text-primary);\n display: flex; align-items: center; gap: 8px;\n margin: 0;\n }\n .card-header h3 i {\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n .card-body { padding: 16px 20px; }\n .card-body.no-padding { padding: 0; }\n\n .chart-container-inner {\n padding: 16px 20px;\n min-height: 300px;\n }\n\n /* ACTIVITY FEED */\n .activity-feed { max-height: 370px; overflow-y: auto; }\n .activity-item {\n display: flex; align-items: center; gap: 12px;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease; cursor: pointer;\n }\n .activity-item:last-child { border-bottom: none; }\n .activity-item:hover { background: var(--mj-bg-surface-sunken); }\n\n .activity-icon {\n width: 34px; height: 34px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0;\n }\n .activity-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .activity-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-icon.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .activity-body { flex: 1; min-width: 0; }\n .activity-title {\n font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n display: block;\n }\n .activity-meta {\n font-size: 11px; color: var(--mj-text-muted); margin-top: 1px;\n display: block;\n }\n .activity-status {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n .activity-status.complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-status.failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .activity-status.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n /* PROVIDER HEALTH */\n .provider-health-list { display: flex; flex-direction: column; }\n .provider-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease;\n }\n .provider-row:last-child { border-bottom: none; }\n .provider-row:hover { background: var(--mj-bg-surface-sunken); }\n\n .provider-status-dot {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--mj-border-strong);\n }\n .provider-status-dot.active { background: var(--mj-status-success); }\n\n .provider-logo {\n width: 36px; height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .provider-logo.sendgrid { color: var(--mj-brand-primary); }\n .provider-logo.twilio { color: var(--mj-status-error); }\n .provider-logo.gmail { color: var(--mj-status-error); }\n .provider-logo.msgraph { color: var(--mj-brand-primary); }\n\n .provider-info { flex: 1; }\n .provider-name { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n .provider-type { font-size: 11px; color: var(--mj-text-muted); }\n\n .provider-health-bar {\n width: 80px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .provider-health-fill {\n height: 100%; border-radius: 3px;\n transition: width 0.4s ease;\n }\n .provider-health-fill.excellent { background: var(--mj-status-success); }\n .provider-health-fill.good { background: var(--mj-status-success); }\n .provider-health-fill.warning { background: var(--mj-status-warning); }\n .provider-health-fill.critical { background: var(--mj-status-error); }\n\n .provider-rate {\n font-size: 12px; font-weight: 700;\n min-width: 44px; text-align: right;\n }\n .provider-rate.excellent { color: var(--mj-status-success); }\n .provider-rate.good { color: var(--mj-status-success); }\n .provider-rate.warning { color: var(--mj-status-warning); }\n .provider-rate.critical { color: var(--mj-status-error); }\n\n /* CHANNEL BREAKDOWN */\n .channel-breakdown { display: flex; flex-direction: column; }\n .channel-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .channel-row:last-child { border-bottom: none; }\n .channel-icon {\n width: 32px; height: 32px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px; flex-shrink: 0;\n }\n .channel-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .channel-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .channel-info { flex: 1; }\n .channel-name { font-size: 12px; font-weight: 600; color: var(--mj-text-primary); }\n .channel-count { font-size: 11px; color: var(--mj-text-muted); }\n\n .channel-bar-wrapper {\n width: 100px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .channel-bar-fill { height: 100%; border-radius: 3px; }\n .channel-pct {\n font-size: 12px; font-weight: 700;\n color: var(--mj-text-primary);\n min-width: 36px; text-align: right;\n }\n\n /* EMPTY STATE */\n .empty-state {\n display: flex; flex-direction: column;\n align-items: center; justify-content: center;\n padding: 40px 0; color: var(--mj-text-muted);\n }\n .empty-state i { font-size: 2rem; margin-bottom: 12px; opacity: 0.5; }\n .empty-state p { margin: 0; font-size: 13px; }\n\n @media (max-width: 1200px) {\n .kpi-strip { grid-template-columns: repeat(2, 1fr); }\n .content-grid { grid-template-columns: 1fr; }\n }\n `]\n})\nexport class CommunicationMonitorResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = false;\n public stats = {\n totalSent: 0,\n deliveryRate: 0,\n pending: 0,\n failed: 0\n };\n public recentLogs: MJCommunicationLogEntity[] = [];\n public chartData: HourlyBucket[] = [];\n public chartConfig = {\n useDualAxis: false,\n showGrid: true,\n showTooltip: true,\n colors: ['#4f6bed', '#cf222e']\n };\n public providerHealth: ProviderHealth[] = [];\n public channelBreakdown: ChannelBreakdown[] = [];\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n public async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n const yesterdayIso = yesterday.toISOString();\n\n const [totalResult, failedResult, pendingResult, recentResult, allLogsResult, providersResult] = await Promise.all([\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}' AND Status = 'Failed'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `Status = 'Pending'`,\n ResultType: 'count_only'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n OrderBy: 'MessageDate DESC',\n MaxRows: 8,\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n OrderBy: 'MessageDate ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationProviderEntity>({\n EntityName: 'MJ: Communication Providers',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n })\n ]);\n\n if (totalResult.Success) this.stats.totalSent = totalResult.TotalRowCount;\n if (failedResult.Success) this.stats.failed = failedResult.TotalRowCount;\n if (pendingResult.Success) this.stats.pending = pendingResult.TotalRowCount;\n\n this.stats.deliveryRate = this.stats.totalSent > 0\n ? parseFloat(((this.stats.totalSent - this.stats.failed) / this.stats.totalSent * 100).toFixed(1))\n : 100;\n\n if (recentResult.Success) {\n this.recentLogs = recentResult.Results;\n }\n\n if (allLogsResult.Success) {\n this.chartData = this.processTrendData(allLogsResult.Results, yesterday);\n this.channelBreakdown = this.buildChannelBreakdown(allLogsResult.Results);\n }\n\n if (providersResult.Success && allLogsResult.Success) {\n this.providerHealth = this.buildProviderHealth(providersResult.Results, allLogsResult.Results);\n }\n\n } catch (error) {\n console.error('Error loading monitor data:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public getActivityIconClass(log: MJCommunicationLogEntity): string {\n if (log.Status === 'Failed') return 'error';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'sms';\n return 'email';\n }\n\n public getActivityIcon(log: MJCommunicationLogEntity): string {\n if (log.Direction === 'Receiving') return 'fa-solid fa-arrow-down';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'fa-solid fa-comment-sms';\n return 'fa-solid fa-envelope';\n }\n\n public getHealthClass(rate: number): string {\n if (rate >= 98) return 'excellent';\n if (rate >= 95) return 'good';\n if (rate >= 85) return 'warning';\n return 'critical';\n }\n\n private processTrendData(logs: MJCommunicationLogEntity[], startTime: Date): HourlyBucket[] {\n const buckets: HourlyBucket[] = [];\n const now = new Date();\n const current = new Date(startTime);\n current.setMinutes(0, 0, 0);\n\n while (current <= now) {\n const bucketStart = new Date(current);\n const bucketEnd = new Date(current.getTime() + 60 * 60 * 1000);\n const bucketLogs = logs.filter(l => {\n const d = new Date(l.MessageDate);\n return d >= bucketStart && d < bucketEnd;\n });\n\n buckets.push({\n timestamp: bucketStart,\n executions: bucketLogs.length,\n errors: bucketLogs.filter(l => l.Status === 'Failed').length,\n cost: 0,\n tokens: 0,\n avgTime: 0\n });\n current.setHours(current.getHours() + 1);\n }\n return buckets;\n }\n\n private buildProviderHealth(providers: MJCommunicationProviderEntity[], logs: MJCommunicationLogEntity[]): ProviderHealth[] {\n return providers.map(p => {\n const providerLogs = logs.filter(l => l.CommunicationProvider === p.Name);\n const sent = providerLogs.length;\n const failed = providerLogs.filter(l => l.Status === 'Failed').length;\n const rate = sent > 0 ? parseFloat(((sent - failed) / sent * 100).toFixed(1)) : 100;\n\n return {\n Name: p.Name,\n Type: this.getProviderType(p.Name),\n SentCount: sent,\n SuccessRate: rate,\n IsActive: p.Status === 'Active',\n IconClass: this.getProviderIconClass(p.Name),\n ColorClass: this.getProviderColorClass(p.Name)\n };\n });\n }\n\n private buildChannelBreakdown(logs: MJCommunicationLogEntity[]): ChannelBreakdown[] {\n const total = logs.length;\n if (total === 0) return [];\n\n const emailLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('email') || (!type.includes('sms'));\n });\n const smsLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('sms');\n });\n\n const channels: ChannelBreakdown[] = [];\n if (emailLogs.length > 0) {\n channels.push({\n Name: 'Email',\n IconClass: 'fa-solid fa-envelope',\n Count: emailLogs.length,\n Percentage: Math.round((emailLogs.length / total) * 100),\n ColorClass: 'email'\n });\n }\n if (smsLogs.length > 0) {\n channels.push({\n Name: 'SMS',\n IconClass: 'fa-solid fa-comment-sms',\n Count: smsLogs.length,\n Percentage: Math.round((smsLogs.length / total) * 100),\n ColorClass: 'sms'\n });\n }\n return channels;\n }\n\n private getProviderType(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('twilio')) return 'SMS';\n return 'Email';\n }\n\n private getProviderIconClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'fa-solid fa-envelope';\n if (n.includes('twilio')) return 'fa-solid fa-comment-sms';\n if (n.includes('gmail') || n.includes('google')) return 'fa-brands fa-google';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-server';\n }\n\n private getProviderColorClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'sendgrid';\n if (n.includes('twilio')) return 'twilio';\n if (n.includes('gmail') || n.includes('google')) return 'gmail';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'msgraph';\n return '';\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"communication-monitor-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-monitor-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationLogEntity, MJCommunicationProviderEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView } from '@memberjunction/core';\n\ninterface ProviderHealth {\n Name: string;\n Type: string;\n SentCount: number;\n SuccessRate: number;\n IsActive: boolean;\n IconClass: string;\n ColorClass: string;\n}\n\ninterface ChannelBreakdown {\n Name: string;\n IconClass: string;\n Count: number;\n Percentage: number;\n ColorClass: string;\n}\n\ninterface HourlyBucket {\n timestamp: Date;\n executions: number;\n errors: number;\n cost: number;\n tokens: number;\n avgTime: number;\n}\n@RegisterClass(BaseResourceComponent, 'CommunicationMonitorResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-monitor-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"Monitor\"\n Icon=\"fa-solid fa-chart-line\"\n Subtitle=\"Live delivery health, provider status, and channel breakdown\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadData()\" [disabled]=\"isLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isLoading\"></i> <span class=\"action-btn-label\">Refresh</span>\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n <!-- KPI STRIP -->\n <div class=\"kpi-strip\">\n <div class=\"kpi-card sent\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-paper-plane\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Total Sent</span>\n <span class=\"kpi-value\">{{stats.totalSent | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.totalSent > 0 ? 'up' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.totalSent > 0\" [class.fa-minus]=\"stats.totalSent === 0\"></i>\n Last 24 hours\n </span>\n </div>\n </div>\n <div class=\"kpi-card delivered\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-check-double\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Delivery Rate</span>\n <span class=\"kpi-value\">{{stats.deliveryRate}}%</span>\n <div class=\"delivery-bar\">\n <div class=\"delivery-fill\" [style.width.%]=\"stats.deliveryRate\"></div>\n </div>\n </div>\n </div>\n <div class=\"kpi-card pending\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-clock\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Pending</span>\n <span class=\"kpi-value\">{{stats.pending | number}}</span>\n <span class=\"kpi-delta neutral\">\n <i class=\"fa-solid fa-minus\"></i> Awaiting provider\n </span>\n </div>\n </div>\n <div class=\"kpi-card failed\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-circle-exclamation\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Failed</span>\n <span class=\"kpi-value\">{{stats.failed | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.failed > 0 ? 'down' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.failed > 0\" [class.fa-minus]=\"stats.failed === 0\"></i>\n {{stats.failed > 0 ? 'Requires attention' : 'No failures'}}\n </span>\n </div>\n </div>\n </div>\n \n <!-- CHARTS + ACTIVITY ROW -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Delivery Volume</h3>\n </div>\n <div class=\"chart-container-inner\">\n <app-time-series-chart\n [data]=\"chartData\"\n [showLegend]=\"true\"\n [showControls]=\"false\"\n [config]=\"chartConfig\">\n </app-time-series-chart>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-bolt\"></i> Recent Activity</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"activity-feed\">\n @for (log of recentLogs; track log) {\n <div class=\"activity-item\">\n <div class=\"activity-icon\" [ngClass]=\"getActivityIconClass(log)\">\n <i [class]=\"getActivityIcon(log)\"></i>\n </div>\n <div class=\"activity-body\">\n <span class=\"activity-title\">{{log.CommunicationProviderMessageType || 'Message'}}</span>\n <span class=\"activity-meta\">{{log.CommunicationProvider}} • {{log.MessageDate | date:'shortTime'}}</span>\n </div>\n <span class=\"activity-status\" [ngClass]=\"log.Status.toLowerCase()\">\n {{log.Status}}\n </span>\n </div>\n }\n @if (recentLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No recent activity</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n \n <!-- PROVIDER HEALTH + CHANNEL BREAKDOWN -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Provider Health</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"provider-health-list\">\n @for (provider of providerHealth; track provider) {\n <div class=\"provider-row\">\n <div class=\"provider-status-dot\" [class.active]=\"provider.IsActive\"></div>\n <div class=\"provider-logo\" [ngClass]=\"provider.ColorClass\">\n <i [class]=\"provider.IconClass\"></i>\n </div>\n <div class=\"provider-info\">\n <div class=\"provider-name\">{{provider.Name}}</div>\n <div class=\"provider-type\">{{provider.Type}} • {{provider.SentCount}} sent today</div>\n </div>\n <div class=\"provider-health-bar\">\n <div class=\"provider-health-fill\" [ngClass]=\"getHealthClass(provider.SuccessRate)\" [style.width.%]=\"provider.SuccessRate\"></div>\n </div>\n <span class=\"provider-rate\" [ngClass]=\"getHealthClass(provider.SuccessRate)\">{{provider.SuccessRate}}%</span>\n </div>\n }\n @if (providerHealth.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No providers configured</p>\n </div>\n }\n </div>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-layer-group\"></i> Channel Breakdown</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"channel-breakdown\">\n @for (channel of channelBreakdown; track channel) {\n <div class=\"channel-row\">\n <div class=\"channel-icon\" [ngClass]=\"channel.ColorClass\">\n <i [class]=\"channel.IconClass\"></i>\n </div>\n <div class=\"channel-info\">\n <div class=\"channel-name\">{{channel.Name}}</div>\n <div class=\"channel-count\">{{channel.Count | number}} messages</div>\n </div>\n <div class=\"channel-bar-wrapper\">\n <div class=\"channel-bar-fill\" [style.width.%]=\"channel.Percentage\" [style.background]=\"channel.ColorClass === 'email' ? 'var(--mj-brand-primary)' : 'var(--mj-status-success)'\"></div>\n </div>\n <span class=\"channel-pct\">{{channel.Percentage}}%</span>\n </div>\n }\n @if (channelBreakdown.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <p>No channel data available</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n /* KPI STRIP */\n .kpi-strip {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n }\n .kpi-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n transition: all 0.15s ease;\n position: relative;\n overflow: hidden;\n }\n .kpi-card:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .kpi-card::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 3px;\n }\n .kpi-card.sent::before { background: var(--mj-brand-primary); }\n .kpi-card.delivered::before { background: var(--mj-status-success); }\n .kpi-card.pending::before { background: var(--mj-status-warning); }\n .kpi-card.failed::before { background: var(--mj-status-error); }\n\n .kpi-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .kpi-card.sent .kpi-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card.delivered .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card.pending .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card.failed .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .kpi-body { flex: 1; display: flex; flex-direction: column; gap: 2px; }\n .kpi-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n }\n .kpi-value {\n font-size: 28px; font-weight: 800;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em; line-height: 1.1;\n }\n .kpi-delta {\n display: inline-flex; align-items: center;\n gap: 4px; font-size: 11px; font-weight: 600;\n margin-top: 4px; padding: 2px 8px;\n border-radius: 10px; width: fit-content;\n }\n .kpi-delta.up {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-delta.down {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-delta.neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .delivery-bar {\n height: 6px; margin-top: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .delivery-fill {\n height: 100%; border-radius: 3px;\n background: var(--mj-status-success); transition: width 0.6s ease;\n }\n\n /* CONTENT GRID */\n .content-grid {\n display: grid;\n grid-template-columns: 1.6fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .card-header h3 {\n font-size: 13px; font-weight: 700;\n color: var(--mj-text-primary);\n display: flex; align-items: center; gap: 8px;\n margin: 0;\n }\n .card-header h3 i {\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n .card-body { padding: 16px 20px; }\n .card-body.no-padding { padding: 0; }\n\n .chart-container-inner {\n padding: 16px 20px;\n min-height: 300px;\n }\n\n /* ACTIVITY FEED */\n .activity-feed { max-height: 370px; overflow-y: auto; }\n .activity-item {\n display: flex; align-items: center; gap: 12px;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease; cursor: pointer;\n }\n .activity-item:last-child { border-bottom: none; }\n .activity-item:hover { background: var(--mj-bg-surface-sunken); }\n\n .activity-icon {\n width: 34px; height: 34px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0;\n }\n .activity-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .activity-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-icon.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .activity-body { flex: 1; min-width: 0; }\n .activity-title {\n font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n display: block;\n }\n .activity-meta {\n font-size: 11px; color: var(--mj-text-muted); margin-top: 1px;\n display: block;\n }\n .activity-status {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n .activity-status.complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-status.failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .activity-status.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n /* PROVIDER HEALTH */\n .provider-health-list { display: flex; flex-direction: column; }\n .provider-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease;\n }\n .provider-row:last-child { border-bottom: none; }\n .provider-row:hover { background: var(--mj-bg-surface-sunken); }\n\n .provider-status-dot {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--mj-border-strong);\n }\n .provider-status-dot.active { background: var(--mj-status-success); }\n\n .provider-logo {\n width: 36px; height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .provider-logo.sendgrid { color: var(--mj-brand-primary); }\n .provider-logo.twilio { color: var(--mj-status-error); }\n .provider-logo.gmail { color: var(--mj-status-error); }\n .provider-logo.msgraph { color: var(--mj-brand-primary); }\n\n .provider-info { flex: 1; }\n .provider-name { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n .provider-type { font-size: 11px; color: var(--mj-text-muted); }\n\n .provider-health-bar {\n width: 80px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .provider-health-fill {\n height: 100%; border-radius: 3px;\n transition: width 0.4s ease;\n }\n .provider-health-fill.excellent { background: var(--mj-status-success); }\n .provider-health-fill.good { background: var(--mj-status-success); }\n .provider-health-fill.warning { background: var(--mj-status-warning); }\n .provider-health-fill.critical { background: var(--mj-status-error); }\n\n .provider-rate {\n font-size: 12px; font-weight: 700;\n min-width: 44px; text-align: right;\n }\n .provider-rate.excellent { color: var(--mj-status-success); }\n .provider-rate.good { color: var(--mj-status-success); }\n .provider-rate.warning { color: var(--mj-status-warning); }\n .provider-rate.critical { color: var(--mj-status-error); }\n\n /* CHANNEL BREAKDOWN */\n .channel-breakdown { display: flex; flex-direction: column; }\n .channel-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .channel-row:last-child { border-bottom: none; }\n .channel-icon {\n width: 32px; height: 32px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px; flex-shrink: 0;\n }\n .channel-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .channel-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .channel-info { flex: 1; }\n .channel-name { font-size: 12px; font-weight: 600; color: var(--mj-text-primary); }\n .channel-count { font-size: 11px; color: var(--mj-text-muted); }\n\n .channel-bar-wrapper {\n width: 100px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .channel-bar-fill { height: 100%; border-radius: 3px; }\n .channel-pct {\n font-size: 12px; font-weight: 700;\n color: var(--mj-text-primary);\n min-width: 36px; text-align: right;\n }\n\n /* EMPTY STATE */\n .empty-state {\n display: flex; flex-direction: column;\n align-items: center; justify-content: center;\n padding: 40px 0; color: var(--mj-text-muted);\n }\n .empty-state i { font-size: 2rem; margin-bottom: 12px; opacity: 0.5; }\n .empty-state p { margin: 0; font-size: 13px; }\n\n @media (max-width: 1200px) {\n .kpi-strip { grid-template-columns: repeat(2, 1fr); }\n .content-grid { grid-template-columns: 1fr; }\n }\n `]\n})\nexport class CommunicationMonitorResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = false;\n public stats = {\n totalSent: 0,\n deliveryRate: 0,\n pending: 0,\n failed: 0\n };\n public recentLogs: MJCommunicationLogEntity[] = [];\n public chartData: HourlyBucket[] = [];\n public chartConfig = {\n useDualAxis: false,\n showGrid: true,\n showTooltip: true,\n colors: ['#4f6bed', '#cf222e']\n };\n public providerHealth: ProviderHealth[] = [];\n public channelBreakdown: ChannelBreakdown[] = [];\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n public async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n const yesterdayIso = yesterday.toISOString();\n\n const [totalResult, failedResult, pendingResult, recentResult, allLogsResult, providersResult] = await Promise.all([\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}' AND Status = 'Failed'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `Status = 'Pending'`,\n ResultType: 'count_only'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n OrderBy: 'MessageDate DESC',\n MaxRows: 8,\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n OrderBy: 'MessageDate ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationProviderEntity>({\n EntityName: 'MJ: Communication Providers',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n })\n ]);\n\n if (totalResult.Success) this.stats.totalSent = totalResult.TotalRowCount;\n if (failedResult.Success) this.stats.failed = failedResult.TotalRowCount;\n if (pendingResult.Success) this.stats.pending = pendingResult.TotalRowCount;\n\n this.stats.deliveryRate = this.stats.totalSent > 0\n ? parseFloat(((this.stats.totalSent - this.stats.failed) / this.stats.totalSent * 100).toFixed(1))\n : 100;\n\n if (recentResult.Success) {\n this.recentLogs = recentResult.Results;\n }\n\n if (allLogsResult.Success) {\n this.chartData = this.processTrendData(allLogsResult.Results, yesterday);\n this.channelBreakdown = this.buildChannelBreakdown(allLogsResult.Results);\n }\n\n if (providersResult.Success && allLogsResult.Success) {\n this.providerHealth = this.buildProviderHealth(providersResult.Results, allLogsResult.Results);\n }\n\n } catch (error) {\n console.error('Error loading monitor data:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public getActivityIconClass(log: MJCommunicationLogEntity): string {\n if (log.Status === 'Failed') return 'error';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'sms';\n return 'email';\n }\n\n public getActivityIcon(log: MJCommunicationLogEntity): string {\n if (log.Direction === 'Receiving') return 'fa-solid fa-arrow-down';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'fa-solid fa-comment-sms';\n return 'fa-solid fa-envelope';\n }\n\n public getHealthClass(rate: number): string {\n if (rate >= 98) return 'excellent';\n if (rate >= 95) return 'good';\n if (rate >= 85) return 'warning';\n return 'critical';\n }\n\n private processTrendData(logs: MJCommunicationLogEntity[], startTime: Date): HourlyBucket[] {\n const buckets: HourlyBucket[] = [];\n const now = new Date();\n const current = new Date(startTime);\n current.setMinutes(0, 0, 0);\n\n while (current <= now) {\n const bucketStart = new Date(current);\n const bucketEnd = new Date(current.getTime() + 60 * 60 * 1000);\n const bucketLogs = logs.filter(l => {\n const d = new Date(l.MessageDate);\n return d >= bucketStart && d < bucketEnd;\n });\n\n buckets.push({\n timestamp: bucketStart,\n executions: bucketLogs.length,\n errors: bucketLogs.filter(l => l.Status === 'Failed').length,\n cost: 0,\n tokens: 0,\n avgTime: 0\n });\n current.setHours(current.getHours() + 1);\n }\n return buckets;\n }\n\n private buildProviderHealth(providers: MJCommunicationProviderEntity[], logs: MJCommunicationLogEntity[]): ProviderHealth[] {\n return providers.map(p => {\n const providerLogs = logs.filter(l => l.CommunicationProvider === p.Name);\n const sent = providerLogs.length;\n const failed = providerLogs.filter(l => l.Status === 'Failed').length;\n const rate = sent > 0 ? parseFloat(((sent - failed) / sent * 100).toFixed(1)) : 100;\n\n return {\n Name: p.Name,\n Type: this.getProviderType(p.Name),\n SentCount: sent,\n SuccessRate: rate,\n IsActive: p.Status === 'Active',\n IconClass: this.getProviderIconClass(p.Name),\n ColorClass: this.getProviderColorClass(p.Name)\n };\n });\n }\n\n private buildChannelBreakdown(logs: MJCommunicationLogEntity[]): ChannelBreakdown[] {\n const total = logs.length;\n if (total === 0) return [];\n\n const emailLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('email') || (!type.includes('sms'));\n });\n const smsLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('sms');\n });\n\n const channels: ChannelBreakdown[] = [];\n if (emailLogs.length > 0) {\n channels.push({\n Name: 'Email',\n IconClass: 'fa-solid fa-envelope',\n Count: emailLogs.length,\n Percentage: Math.round((emailLogs.length / total) * 100),\n ColorClass: 'email'\n });\n }\n if (smsLogs.length > 0) {\n channels.push({\n Name: 'SMS',\n IconClass: 'fa-solid fa-comment-sms',\n Count: smsLogs.length,\n Percentage: Math.round((smsLogs.length / total) * 100),\n ColorClass: 'sms'\n });\n }\n return channels;\n }\n\n private getProviderType(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('twilio')) return 'SMS';\n return 'Email';\n }\n\n private getProviderIconClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'fa-solid fa-envelope';\n if (n.includes('twilio')) return 'fa-solid fa-comment-sms';\n if (n.includes('gmail') || n.includes('google')) return 'fa-brands fa-google';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-server';\n }\n\n private getProviderColorClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'sendgrid';\n if (n.includes('twilio')) return 'twilio';\n if (n.includes('gmail') || n.includes('google')) return 'gmail';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'msgraph';\n return '';\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}\n"]}
|