@memberjunction/ng-dashboards 5.34.1 → 5.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +96 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +453 -122
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- 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 +104 -103
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
- 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 +12 -19
- 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 +96 -203
- 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.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- 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.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- 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 +28 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2084 -2079
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +1423 -1438
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +329 -371
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +202 -158
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +191 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +19 -79
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +19 -79
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +19 -79
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +19 -79
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/Admin/base-admin-container.component.d.ts +9 -7
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
- package/dist/Admin/base-admin-container.component.js +26 -17
- package/dist/Admin/base-admin-container.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +92 -91
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +127 -106
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
- package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-new-message-resource.component.js +661 -0
- package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +44 -45
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +238 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +290 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +41 -21
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +148 -155
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +25 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +46 -72
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -100
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +158 -168
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +257 -264
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts +5 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +46 -64
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +75 -84
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +76 -85
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +24 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +307 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +654 -648
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +595 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +230 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1138 -1147
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +684 -697
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +120 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1239 -610
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +1460 -272
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +1 -0
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +1 -0
- package/dist/Lists/index.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +236 -10
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +259 -103
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1009 -1264
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +38 -6
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +679 -786
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +114 -99
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +51 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +9 -6
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +37 -7
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +46 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +10 -9
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +40 -2
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +42 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +53 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication-new-message-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-new-message-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport {\n ResourceData,\n MJCommunicationProviderEntity,\n MJCommunicationProviderMessageTypeEntity,\n} from '@memberjunction/core-entities';\nimport { RunView } from '@memberjunction/core';\nimport { ActionEngineBase } from '@memberjunction/actions-base';\nimport type { AudienceSource } from '@memberjunction/lists-base';\nimport type { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * \"New Communication\" — implements mockup 21. Composes an outbound\n * message against an `AudienceSource` (List / View / ad-hoc filter):\n *\n * - Channel = MJ Communication Provider + Provider Message Type\n * - Audience = picked via `<mj-audience-source-picker>`\n * - Field mapping = which entity field carries the recipient address\n *\n * Server work happens via two existing Actions (no new GraphQL endpoint\n * needed):\n *\n * - \"Resolve Audience\" — used by the \"Preview\" panel to show counts\n * (TotalAudienceSize / WillReceive / Skipped) before sending.\n * - \"Send To Audience\" — actually sends. Supports `PreviewOnly: true`\n * to re-resolve + report counts with field-mapping applied without\n * dispatching.\n *\n * Action invocation goes through the `RunAction` mutation (same path the\n * Action Test Harness uses).\n */\n\ninterface AudienceSummary {\n TotalAudienceSize: number;\n WillReceiveCount: number;\n SkippedCount: number;\n EntityName: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'CommunicationsNewMessageResource')\n@Component({\n standalone: false,\n selector: 'mj-communications-new-message-resource',\n template: `\n <div class=\"new-message-resource\">\n <div class=\"page-header\">\n <div class=\"title-block\">\n <i class=\"fa-solid fa-message\"></i>\n <h2>New Communication</h2>\n </div>\n <div class=\"header-actions\">\n <button\n class=\"action-btn\"\n (click)=\"onPreviewAudience()\"\n [disabled]=\"!canPreview || isResolvingAudience || isSending\">\n @if (isResolvingAudience) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Previewing…\n } @else {\n <i class=\"fa-solid fa-eye\"></i> Preview Audience\n }\n </button>\n <button\n class=\"action-btn action-btn--primary\"\n (click)=\"onSend()\"\n [disabled]=\"!canSend || isResolvingAudience || isSending\">\n @if (isSending) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Sending…\n } @else {\n <i class=\"fa-solid fa-paper-plane\"></i> Send\n }\n </button>\n </div>\n </div>\n\n <div class=\"layout-grid\">\n <!-- Message panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <i class=\"fa-solid fa-envelope\"></i>\n <h3>Message</h3>\n </div>\n <div class=\"panel-body\">\n @if (loadingProviders) {\n <mj-loading text=\"Loading channels...\" size=\"small\"></mj-loading>\n } @else {\n <label class=\"field-label\">Channel</label>\n <select\n class=\"mj-input mj-select\"\n [(ngModel)]=\"selectedProviderID\"\n (ngModelChange)=\"onProviderChange()\">\n <option [ngValue]=\"null\">Select a channel…</option>\n @for (p of providers; track p.ID) {\n <option [ngValue]=\"p.ID\">{{ p.Name }}</option>\n }\n </select>\n\n @if (filteredMessageTypes.length > 0) {\n <label class=\"field-label\">Message type</label>\n <select class=\"mj-input mj-select\" [(ngModel)]=\"selectedMessageTypeID\">\n <option [ngValue]=\"null\">Select a message type…</option>\n @for (mt of filteredMessageTypes; track mt.ID) {\n <option [ngValue]=\"mt.ID\">{{ mt.Name }}</option>\n }\n </select>\n }\n\n <label class=\"field-label\">From</label>\n <input\n class=\"mj-input\"\n type=\"text\"\n [(ngModel)]=\"fromAddress\"\n placeholder=\"sender@example.com\" />\n\n <label class=\"field-label\">Subject</label>\n <input\n class=\"mj-input\"\n type=\"text\"\n [(ngModel)]=\"subject\"\n placeholder=\"Message subject\" />\n\n <label class=\"field-label\">Body</label>\n <textarea\n class=\"mj-input mj-textarea\"\n [(ngModel)]=\"body\"\n rows=\"10\"\n placeholder=\"Hi {{ '{{FirstName}}' }},...\"></textarea>\n }\n </div>\n </div>\n\n <!-- Audience panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <i class=\"fa-solid fa-bullseye\"></i>\n <h3>Audience</h3>\n </div>\n <div class=\"panel-body\">\n <mj-audience-source-picker\n [Provider]=\"Provider\"\n [Source]=\"audienceSource\"\n (SourceChange)=\"onAudienceSourceChange($event)\">\n </mj-audience-source-picker>\n\n @if (audienceSource) {\n <label class=\"field-label field-label--spaced\">Recipient field</label>\n <input\n class=\"mj-input\"\n type=\"text\"\n [(ngModel)]=\"recipientField\"\n placeholder=\"e.g. Email\" />\n <p class=\"field-hint\">\n Field on the audience entity that holds the recipient address.\n Records with no value will be skipped.\n </p>\n }\n\n @if (audienceSummary) {\n <div class=\"summary-block\" [class.summary-block--has-skips]=\"audienceSummary.SkippedCount > 0\">\n <div class=\"summary-row\">\n <span class=\"summary-label\">Total audience</span>\n <span class=\"summary-value\">{{ audienceSummary.TotalAudienceSize }}</span>\n </div>\n <div class=\"summary-row summary-row--will-receive\">\n <span class=\"summary-label\">Will receive</span>\n <span class=\"summary-value\">{{ audienceSummary.WillReceiveCount }}</span>\n </div>\n @if (audienceSummary.SkippedCount > 0) {\n <div class=\"summary-row summary-row--skipped\">\n <span class=\"summary-label\">Skipped (missing {{ recipientField || 'recipient' }})</span>\n <span class=\"summary-value\">{{ audienceSummary.SkippedCount }}</span>\n </div>\n }\n <div class=\"summary-row summary-row--entity\">\n <span class=\"summary-label\">Entity</span>\n <span class=\"summary-value\">{{ audienceSummary.EntityName }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .new-message-resource {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px 24px;\n height: 100%;\n overflow: auto;\n }\n .page-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n }\n .title-block { display: flex; align-items: center; gap: 12px; }\n .title-block i { font-size: 20px; color: var(--mj-brand-primary); }\n .title-block h2 { margin: 0; font-size: 18px; font-weight: 600; color: var(--mj-text-primary); }\n .header-actions { display: flex; gap: 8px; }\n .action-btn {\n padding: 8px 14px;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .action-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n }\n .action-btn:disabled { opacity: 0.55; cursor: not-allowed; }\n .action-btn--primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, white);\n }\n .action-btn--primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .layout-grid {\n display: grid;\n grid-template-columns: 1fr 380px;\n gap: 16px;\n align-items: start;\n }\n @media (max-width: 1024px) {\n .layout-grid { grid-template-columns: 1fr; }\n }\n\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n .panel-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n }\n .panel-header i { color: var(--mj-text-secondary); }\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .panel-body { padding: 16px; }\n\n .field-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin: 12px 0 6px;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n }\n .field-label--spaced { margin-top: 20px; }\n .field-hint {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin: 6px 0 0;\n }\n\n .summary-block {\n margin-top: 20px;\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n .summary-block--has-skips {\n border-color: var(--mj-status-warning);\n background: color-mix(in srgb, var(--mj-status-warning) 6%, var(--mj-bg-surface-card));\n }\n .summary-row {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n font-size: 13px;\n padding: 4px 0;\n }\n .summary-row + .summary-row { border-top: 1px solid var(--mj-border-subtle); }\n .summary-label { color: var(--mj-text-secondary); }\n .summary-value { font-weight: 600; color: var(--mj-text-primary); }\n .summary-row--will-receive .summary-value { color: var(--mj-status-success); }\n .summary-row--skipped .summary-value { color: var(--mj-status-warning); }\n .summary-row--entity .summary-label,\n .summary-row--entity .summary-value {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n `],\n})\nexport class CommunicationsNewMessageResource extends BaseResourceComponent implements OnInit, OnDestroy {\n // BaseResourceComponent already exposes a protected `destroy$` Subject.\n // Don't re-declare it here — the import is kept only for the rxjs type.\n // (See base class comment.)\n // Local lifecycle goes through super.ngOnDestroy().\n\n // Channel state\n public loadingProviders = true;\n public providers: MJCommunicationProviderEntity[] = [];\n public messageTypes: MJCommunicationProviderMessageTypeEntity[] = [];\n public selectedProviderID: string | null = null;\n public selectedMessageTypeID: string | null = null;\n\n // Message state\n public fromAddress = '';\n public subject = '';\n public body = '';\n\n // Audience state\n public audienceSource: AudienceSource | null = null;\n public recipientField = '';\n public audienceSummary: AudienceSummary | null = null;\n\n // Action IDs — looked up lazily on first use to avoid an extra RunView\n // on every page open. Cached for the session.\n private resolveAudienceActionID: string | null = null;\n private sendToAudienceActionID: string | null = null;\n\n public isResolvingAudience = false;\n public isSending = false;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService,\n ) {\n super();\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadChannelMetadata();\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n public get filteredMessageTypes(): MJCommunicationProviderMessageTypeEntity[] {\n if (!this.selectedProviderID) return [];\n return this.messageTypes.filter(\n (mt) => mt.CommunicationProviderID === this.selectedProviderID,\n );\n }\n\n public get selectedProvider(): MJCommunicationProviderEntity | null {\n return this.providers.find((p) => UUIDsEqual(p.ID, this.selectedProviderID)) ?? null;\n }\n\n public get selectedMessageType(): MJCommunicationProviderMessageTypeEntity | null {\n return this.messageTypes.find((mt) => UUIDsEqual(mt.ID, this.selectedMessageTypeID)) ?? null;\n }\n\n public get canPreview(): boolean {\n return !!this.audienceSource && this.recipientField.trim().length > 0;\n }\n\n public get canSend(): boolean {\n return this.canPreview\n && !!this.selectedProviderID\n && !!this.selectedMessageTypeID\n && this.fromAddress.trim().length > 0;\n }\n\n public onProviderChange(): void {\n this.selectedMessageTypeID = null;\n }\n\n public onAudienceSourceChange(source: AudienceSource | null): void {\n this.audienceSource = source;\n this.audienceSummary = null;\n }\n\n /**\n * Preview the audience without sending — calls \"Send To Audience\" with\n * PreviewOnly=true. Surfaces the same total/will-receive/skipped tile\n * mockup 21 shows. Cheaper than `Resolve Audience` for our purposes\n * because it also evaluates the recipient-field skip rule.\n */\n public async onPreviewAudience(): Promise<void> {\n if (!this.canPreview) return;\n this.isResolvingAudience = true;\n this.audienceSummary = null;\n this.cdr.detectChanges();\n try {\n const actionID = await this.getSendToAudienceActionID();\n if (!actionID) {\n this.notificationService.CreateSimpleNotification(\n \"Couldn't find the 'Send To Audience' action — make sure CodeGen has run.\",\n 'error', 5000,\n );\n return;\n }\n const result = await this.invokeAction(actionID, {\n Source: JSON.stringify(this.audienceSource!),\n RecipientField: this.recipientField.trim(),\n ProviderName: this.selectedProvider?.Name ?? 'Preview',\n ProviderMessageTypeName: this.selectedMessageType?.Name ?? 'Preview',\n From: this.fromAddress || 'preview@local',\n Subject: this.subject,\n Body: this.body,\n PreviewOnly: 'true',\n });\n\n const data = this.parseResultData(result);\n this.audienceSummary = {\n TotalAudienceSize: this.coerceNumber(data['TotalAudienceSize']),\n WillReceiveCount: this.coerceNumber(data['WillReceiveCount']),\n SkippedCount: this.coerceNumber(data['SkippedCount']),\n EntityName: this.audienceSource ? this.describeSource(this.audienceSource) : '',\n };\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.notificationService.CreateSimpleNotification(`Preview failed: ${message}`, 'error', 5000);\n } finally {\n this.isResolvingAudience = false;\n this.cdr.detectChanges();\n }\n }\n\n public async onSend(): Promise<void> {\n if (!this.canSend) return;\n this.isSending = true;\n this.cdr.detectChanges();\n try {\n const actionID = await this.getSendToAudienceActionID();\n if (!actionID) {\n this.notificationService.CreateSimpleNotification(\n \"Couldn't find the 'Send To Audience' action — make sure CodeGen has run.\",\n 'error', 5000,\n );\n return;\n }\n const result = await this.invokeAction(actionID, {\n Source: JSON.stringify(this.audienceSource!),\n RecipientField: this.recipientField.trim(),\n ProviderName: this.selectedProvider!.Name,\n ProviderMessageTypeName: this.selectedMessageType!.Name,\n From: this.fromAddress,\n Subject: this.subject,\n Body: this.body,\n PreviewOnly: 'false',\n });\n\n const data = this.parseResultData(result);\n const sent = this.coerceNumber(data['WillReceiveCount']) - this.coerceNumber(data['FailedCount']);\n const failed = this.coerceNumber(data['FailedCount']);\n const skipped = this.coerceNumber(data['SkippedCount']);\n const okOverall = (result.Success as boolean) === true && failed === 0;\n this.notificationService.CreateSimpleNotification(\n okOverall\n ? `Sent ${sent} message(s)${skipped > 0 ? ` (${skipped} skipped)` : ''}`\n : `Sent with errors: ${sent} sent, ${failed} failed, ${skipped} skipped`,\n okOverall ? 'success' : 'warning',\n okOverall ? 3000 : 7000,\n );\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.notificationService.CreateSimpleNotification(`Send failed: ${message}`, 'error', 5000);\n } finally {\n this.isSending = false;\n this.cdr.detectChanges();\n }\n }\n\n // -----------------------------------------------------------------\n // Internals\n // -----------------------------------------------------------------\n\n /**\n * One RunView pair on init: providers + their message types. Cached on\n * the component for the session — we don't go back to the DB on every\n * channel selection. Use RunViews (plural) so it's a single round trip.\n */\n private async loadChannelMetadata(): Promise<void> {\n this.loadingProviders = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [providersResult, messageTypesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Communication Providers',\n ExtraFilter: \"Status='Active'\",\n OrderBy: 'Name',\n ResultType: 'simple',\n },\n {\n EntityName: 'MJ: Communication Provider Message Types',\n ExtraFilter: \"Status='Active'\",\n OrderBy: 'Name',\n ResultType: 'simple',\n },\n ]);\n this.providers = (providersResult.Success ? providersResult.Results ?? [] : []) as MJCommunicationProviderEntity[];\n this.messageTypes = (messageTypesResult.Success ? messageTypesResult.Results ?? [] : []) as MJCommunicationProviderMessageTypeEntity[];\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.notificationService.CreateSimpleNotification(`Failed to load channels: ${message}`, 'error', 5000);\n } finally {\n this.loadingProviders = false;\n this.cdr.detectChanges();\n }\n }\n\n private async getSendToAudienceActionID(): Promise<string | null> {\n if (this.sendToAudienceActionID) return this.sendToAudienceActionID;\n // Read from the cached ActionEngineBase singleton rather than a\n // fresh RunView. Config() is idempotent — short-circuits if the\n // engine has already loaded — so calling it on every Preview/Send\n // is effectively free after the first invocation.\n const engine = ActionEngineBase.Instance;\n await engine.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse);\n const match = engine.Actions?.find((a) => a.Name === 'Send To Audience');\n this.sendToAudienceActionID = match?.ID ?? null;\n return this.sendToAudienceActionID;\n }\n\n /**\n * Invoke an Action via the RunAction GraphQL mutation. Same pattern as\n * the Action Test Harness — kept inline here so the resource component\n * stays self-contained.\n */\n private async invokeAction(\n actionID: string,\n params: Record<string, string>,\n ): Promise<{ Success: boolean; Message: string; ResultCode: string; ResultData?: string }> {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const query = `\n mutation RunAction($input: RunActionInput!) {\n RunAction(input: $input) {\n Success\n Message\n ResultCode\n ResultData\n }\n }\n `;\n const actionParams = Object.entries(params).map(([Name, Value]) => ({\n Name, Value, Type: 'string',\n }));\n const variables = { input: { ActionID: actionID, Params: actionParams, SkipActionLog: false } };\n const gqlResult = await provider.ExecuteGQL(query, variables);\n if (!gqlResult?.RunAction) {\n throw new Error('RunAction returned no result');\n }\n return gqlResult.RunAction;\n }\n\n private parseResultData(result: { ResultData?: string }): Record<string, unknown> {\n if (!result.ResultData) return {};\n try {\n const parsed = JSON.parse(result.ResultData);\n // RunAction returns either an object or an array of {Name,Value}.\n if (Array.isArray(parsed)) {\n const out: Record<string, unknown> = {};\n for (const item of parsed) {\n if (item && typeof item === 'object' && 'Name' in item && 'Value' in item) {\n out[String((item as { Name: unknown }).Name)] = (item as { Value: unknown }).Value;\n }\n }\n return out;\n }\n return parsed as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n\n private coerceNumber(v: unknown): number {\n if (typeof v === 'number') return v;\n if (typeof v === 'string') { const n = Number(v); return isNaN(n) ? 0 : n; }\n return 0;\n }\n\n private describeSource(s: AudienceSource): string {\n switch (s.kind) {\n case 'list': return 'List';\n case 'view': return 'User View';\n case 'adhoc': return s.entityName;\n }\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> { return 'New Communication'; }\n async GetResourceIconClass(_data: ResourceData): Promise<string> { return 'fa-solid fa-pen-to-square'; }\n}\n\n/** Tree-shaking prevention */\nexport function LoadCommunicationsNewMessageResource() {}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication-providers-resource.component.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-providers-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,6BAA6B,EAA4B,MAAM,+BAA+B,CAAC;AAEtH,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;;AAGrF,UAAU,gBAAgB;IACtB,MAAM,EAAE,6BAA6B,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AACD,
|
|
1
|
+
{"version":3,"file":"communication-providers-resource.component.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-providers-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,6BAA6B,EAA4B,MAAM,+BAA+B,CAAC;AAEtH,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;;AAGrF,UAAU,gBAAgB;IACtB,MAAM,EAAE,6BAA6B,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AACD,qBAmPa,uCAAwC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAI/F,OAAO,CAAC,GAAG;IAAqB,OAAO,CAAC,UAAU;IAHvD,SAAS,UAAS;IAClB,aAAa,EAAE,gBAAgB,EAAE,CAAM;gBAE1B,GAAG,EAAE,iBAAiB,EAAU,UAAU,EAAE,iBAAiB;IAI3E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW,IAAI,IAAI;IAIN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmCtC,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,oBAAoB;IASrB,iBAAiB,CAAC,QAAQ,EAAE,6BAA6B,GAAG,IAAI;IAMhE,gBAAgB,CAAC,QAAQ,EAAE,6BAA6B,GAAG,IAAI;IAI/D,cAAc,IAAI,IAAI;IAIvB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCA3GtD,uCAAuC;2CAAvC,uCAAuC;CA8GnD"}
|
|
@@ -12,36 +12,37 @@ import * as i0 from "@angular/core";
|
|
|
12
12
|
import * as i1 from "@memberjunction/ng-shared";
|
|
13
13
|
import * as i2 from "@angular/common";
|
|
14
14
|
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
15
|
-
|
|
15
|
+
import * as i4 from "@memberjunction/ng-ui-components";
|
|
16
|
+
function CommunicationProvidersResourceComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
16
17
|
i0.ɵɵelementStart(0, "div", 4);
|
|
17
18
|
i0.ɵɵelement(1, "mj-loading", 6);
|
|
18
19
|
i0.ɵɵelementEnd();
|
|
19
20
|
} }
|
|
20
|
-
function
|
|
21
|
+
function CommunicationProvidersResourceComponent_Conditional_8_For_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
21
22
|
i0.ɵɵelementStart(0, "span", 18);
|
|
22
23
|
i0.ɵɵelement(1, "i", 27);
|
|
23
24
|
i0.ɵɵtext(2, " Scheduled ");
|
|
24
25
|
i0.ɵɵelementEnd();
|
|
25
26
|
} }
|
|
26
|
-
function
|
|
27
|
+
function CommunicationProvidersResourceComponent_Conditional_8_For_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
27
28
|
i0.ɵɵelementStart(0, "span", 18);
|
|
28
29
|
i0.ɵɵelement(1, "i", 27);
|
|
29
30
|
i0.ɵɵtext(2, " Drafts ");
|
|
30
31
|
i0.ɵɵelementEnd();
|
|
31
32
|
} }
|
|
32
|
-
function
|
|
33
|
+
function CommunicationProvidersResourceComponent_Conditional_8_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
33
34
|
i0.ɵɵelementStart(0, "span", 18);
|
|
34
35
|
i0.ɵɵelement(1, "i", 27);
|
|
35
36
|
i0.ɵɵtext(2, " Forward ");
|
|
36
37
|
i0.ɵɵelementEnd();
|
|
37
38
|
} }
|
|
38
|
-
function
|
|
39
|
+
function CommunicationProvidersResourceComponent_Conditional_8_For_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
39
40
|
i0.ɵɵelementStart(0, "span", 18);
|
|
40
41
|
i0.ɵɵelement(1, "i", 27);
|
|
41
42
|
i0.ɵɵtext(2, " Reply ");
|
|
42
43
|
i0.ɵɵelementEnd();
|
|
43
44
|
} }
|
|
44
|
-
function
|
|
45
|
+
function CommunicationProvidersResourceComponent_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
45
46
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
46
47
|
i0.ɵɵelementStart(0, "div", 8)(1, "div", 9)(2, "div", 10);
|
|
47
48
|
i0.ɵɵelement(3, "i");
|
|
@@ -63,10 +64,10 @@ function CommunicationProvidersResourceComponent_Conditional_11_For_2_Template(r
|
|
|
63
64
|
i0.ɵɵelement(17, "i");
|
|
64
65
|
i0.ɵɵtext(18, " Receiving ");
|
|
65
66
|
i0.ɵɵelementEnd();
|
|
66
|
-
i0.ɵɵconditionalCreate(19,
|
|
67
|
-
i0.ɵɵconditionalCreate(20,
|
|
68
|
-
i0.ɵɵconditionalCreate(21,
|
|
69
|
-
i0.ɵɵconditionalCreate(22,
|
|
67
|
+
i0.ɵɵconditionalCreate(19, CommunicationProvidersResourceComponent_Conditional_8_For_2_Conditional_19_Template, 3, 0, "span", 18);
|
|
68
|
+
i0.ɵɵconditionalCreate(20, CommunicationProvidersResourceComponent_Conditional_8_For_2_Conditional_20_Template, 3, 0, "span", 18);
|
|
69
|
+
i0.ɵɵconditionalCreate(21, CommunicationProvidersResourceComponent_Conditional_8_For_2_Conditional_21_Template, 3, 0, "span", 18);
|
|
70
|
+
i0.ɵɵconditionalCreate(22, CommunicationProvidersResourceComponent_Conditional_8_For_2_Conditional_22_Template, 3, 0, "span", 18);
|
|
70
71
|
i0.ɵɵelementEnd();
|
|
71
72
|
i0.ɵɵelementStart(23, "div", 19)(24, "div", 20)(25, "div", 21);
|
|
72
73
|
i0.ɵɵtext(26);
|
|
@@ -87,12 +88,12 @@ function CommunicationProvidersResourceComponent_Conditional_11_For_2_Template(r
|
|
|
87
88
|
i0.ɵɵtext(38, "Failed");
|
|
88
89
|
i0.ɵɵelementEnd()()()();
|
|
89
90
|
i0.ɵɵelementStart(39, "div", 23)(40, "button", 24);
|
|
90
|
-
i0.ɵɵlistener("click", function
|
|
91
|
+
i0.ɵɵlistener("click", function CommunicationProvidersResourceComponent_Conditional_8_For_2_Template_button_click_40_listener() { const card_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.configureProvider(card_r2.Entity)); });
|
|
91
92
|
i0.ɵɵelement(41, "i", 25);
|
|
92
93
|
i0.ɵɵtext(42, " Configure ");
|
|
93
94
|
i0.ɵɵelementEnd();
|
|
94
95
|
i0.ɵɵelementStart(43, "button", 24);
|
|
95
|
-
i0.ɵɵlistener("click", function
|
|
96
|
+
i0.ɵɵlistener("click", function CommunicationProvidersResourceComponent_Conditional_8_For_2_Template_button_click_43_listener() { const card_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.viewProviderLogs(card_r2.Entity)); });
|
|
96
97
|
i0.ɵɵelement(44, "i", 26);
|
|
97
98
|
i0.ɵɵtext(45, " Analytics ");
|
|
98
99
|
i0.ɵɵelementEnd()()();
|
|
@@ -134,9 +135,9 @@ function CommunicationProvidersResourceComponent_Conditional_11_For_2_Template(r
|
|
|
134
135
|
i0.ɵɵadvance(5);
|
|
135
136
|
i0.ɵɵtextInterpolate(card_r2.FailedCount);
|
|
136
137
|
} }
|
|
137
|
-
function
|
|
138
|
+
function CommunicationProvidersResourceComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
138
139
|
i0.ɵɵelementStart(0, "div", 5);
|
|
139
|
-
i0.ɵɵrepeaterCreate(1,
|
|
140
|
+
i0.ɵɵrepeaterCreate(1, CommunicationProvidersResourceComponent_Conditional_8_For_2_Template, 46, 28, "div", 7, i0.ɵɵrepeaterTrackByIdentity);
|
|
140
141
|
i0.ɵɵelementEnd();
|
|
141
142
|
} if (rf & 2) {
|
|
142
143
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
@@ -254,27 +255,22 @@ let CommunicationProvidersResourceComponent = class CommunicationProvidersResour
|
|
|
254
255
|
return 'fa-solid fa-server';
|
|
255
256
|
}
|
|
256
257
|
static ɵfac = function CommunicationProvidersResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CommunicationProvidersResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.NavigationService)); };
|
|
257
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CommunicationProvidersResourceComponent, selectors: [["mj-communication-providers-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
258
|
-
i0.ɵɵelementStart(0, "
|
|
259
|
-
i0.ɵɵ
|
|
260
|
-
i0.ɵɵ
|
|
261
|
-
i0.ɵɵ
|
|
262
|
-
i0.ɵɵ
|
|
258
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CommunicationProvidersResourceComponent, selectors: [["mj-communication-providers-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 2, consts: [["Title", "Providers", "Icon", "fa-solid fa-server", "Subtitle", "Manage your messaging service integrations"], ["actions", ""], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "loading-state"], [1, "providers-grid"], ["text", "Loading providers..."], [1, "provider-card", 3, "disabled"], [1, "provider-card"], [1, "provider-card-header"], [1, "provider-card-logo", 3, "ngClass"], [1, "provider-card-title"], [1, "provider-card-name"], [1, "provider-card-desc"], [1, "provider-card-status", 3, "ngClass"], [1, "provider-card-body"], [1, "provider-capabilities"], [1, "capability-chip"], [1, "capability-chip", "supported"], [1, "provider-card-stats"], [1, "provider-stat"], [1, "provider-stat-value"], [1, "provider-stat-label"], [1, "provider-card-footer"], [3, "click"], [1, "fa-solid", "fa-gear"], [1, "fa-solid", "fa-chart-line"], [1, "fa-solid", "fa-check"]], template: function CommunicationProvidersResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
259
|
+
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1)(3, "button", 2);
|
|
260
|
+
i0.ɵɵlistener("click", function CommunicationProvidersResourceComponent_Template_button_click_3_listener() { return ctx.addNewProvider(); });
|
|
261
|
+
i0.ɵɵelement(4, "i", 3);
|
|
262
|
+
i0.ɵɵtext(5, " Add Provider ");
|
|
263
|
+
i0.ɵɵelementEnd()()();
|
|
264
|
+
i0.ɵɵelementStart(6, "mj-page-body");
|
|
265
|
+
i0.ɵɵconditionalCreate(7, CommunicationProvidersResourceComponent_Conditional_7_Template, 2, 0, "div", 4);
|
|
266
|
+
i0.ɵɵconditionalCreate(8, CommunicationProvidersResourceComponent_Conditional_8_Template, 3, 0, "div", 5);
|
|
263
267
|
i0.ɵɵelementEnd()();
|
|
264
|
-
i0.ɵɵelementStart(7, "button", 2);
|
|
265
|
-
i0.ɵɵlistener("click", function CommunicationProvidersResourceComponent_Template_button_click_7_listener() { return ctx.addNewProvider(); });
|
|
266
|
-
i0.ɵɵelement(8, "i", 3);
|
|
267
|
-
i0.ɵɵtext(9, " Add Provider ");
|
|
268
|
-
i0.ɵɵelementEnd()();
|
|
269
|
-
i0.ɵɵconditionalCreate(10, CommunicationProvidersResourceComponent_Conditional_10_Template, 2, 0, "div", 4);
|
|
270
|
-
i0.ɵɵconditionalCreate(11, CommunicationProvidersResourceComponent_Conditional_11_Template, 3, 0, "div", 5);
|
|
271
|
-
i0.ɵɵelementEnd();
|
|
272
268
|
} if (rf & 2) {
|
|
273
|
-
i0.ɵɵadvance(
|
|
274
|
-
i0.ɵɵconditional(ctx.isLoading ?
|
|
269
|
+
i0.ɵɵadvance(7);
|
|
270
|
+
i0.ɵɵconditional(ctx.isLoading ? 7 : -1);
|
|
275
271
|
i0.ɵɵadvance();
|
|
276
|
-
i0.ɵɵconditional(!ctx.isLoading ?
|
|
277
|
-
} }, dependencies: [i2.NgClass, i3.LoadingComponent
|
|
272
|
+
i0.ɵɵconditional(!ctx.isLoading ? 8 : -1);
|
|
273
|
+
} }, dependencies: [i2.NgClass, i3.LoadingComponent, i4.MJButtonDirective, i4.MJPageHeaderComponent, i4.MJPageLayoutComponent, i4.MJPageBodyComponent], styles: [".loading-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 0;\n }\n\n \n\n .providers-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));\n gap: 16px;\n }\n .provider-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 transition: all 0.15s ease;\n }\n .provider-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .provider-card.disabled[_ngcontent-%COMP%] { opacity: 0.65; }\n\n .provider-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 20px 20px 16px;\n }\n .provider-card-logo[_ngcontent-%COMP%] {\n width: 48px; height: 48px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 22px; flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n }\n .provider-card-logo.sendgrid[_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 .provider-card-logo.twilio[_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 .provider-card-logo.gmail[_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 .provider-card-logo.msgraph[_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\n .provider-card-title[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n .provider-card-name[_ngcontent-%COMP%] {\n font-size: 15px; font-weight: 700;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .provider-card-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n .provider-card-status[_ngcontent-%COMP%] {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.5px;\n padding: 3px 10px; border-radius: 10px;\n flex-shrink: 0;\n }\n .provider-card-status.active[_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 .provider-card-status.disabled[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .provider-card-body[_ngcontent-%COMP%] { padding: 0 20px 16px; }\n\n .provider-capabilities[_ngcontent-%COMP%] {\n display: flex; flex-wrap: wrap;\n gap: 6px; margin-bottom: 16px;\n }\n .capability-chip[_ngcontent-%COMP%] {\n display: inline-flex; align-items: center;\n gap: 4px; padding: 4px 10px;\n border-radius: 12px; font-size: 11px; font-weight: 500;\n }\n .capability-chip.supported[_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 .capability-chip.unsupported[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n }\n\n .provider-card-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px; padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n }\n .provider-stat[_ngcontent-%COMP%] { text-align: center; }\n .provider-stat-value[_ngcontent-%COMP%] {\n font-size: 16px; font-weight: 800;\n color: var(--mj-text-primary);\n }\n .provider-stat-label[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n text-transform: uppercase; letter-spacing: 0.3px;\n }\n\n .provider-card-footer[_ngcontent-%COMP%] {\n display: flex;\n border-top: 1px solid var(--mj-border-default);\n }\n .provider-card-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1; padding: 12px;\n border: none; background: transparent;\n font-size: 12px; font-weight: 600;\n color: var(--mj-brand-primary);\n cursor: pointer; transition: background 0.15s;\n font-family: inherit;\n display: flex; align-items: center;\n justify-content: center; gap: 6px;\n }\n .provider-card-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n }\n .provider-card-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] + button[_ngcontent-%COMP%] {\n border-left: 1px solid var(--mj-border-default);\n }"] });
|
|
278
274
|
};
|
|
279
275
|
CommunicationProvidersResourceComponent = __decorate([
|
|
280
276
|
RegisterClass(BaseResourceComponent, 'CommunicationProvidersResource')
|
|
@@ -283,17 +279,19 @@ export { CommunicationProvidersResourceComponent };
|
|
|
283
279
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CommunicationProvidersResourceComponent, [{
|
|
284
280
|
type: Component,
|
|
285
281
|
args: [{ standalone: false, selector: 'mj-communication-providers-resource', template: `
|
|
286
|
-
<
|
|
287
|
-
<
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
282
|
+
<mj-page-layout>
|
|
283
|
+
<mj-page-header
|
|
284
|
+
Title="Providers"
|
|
285
|
+
Icon="fa-solid fa-server"
|
|
286
|
+
Subtitle="Manage your messaging service integrations">
|
|
287
|
+
<div actions>
|
|
288
|
+
<button mjButton variant="primary" size="sm" (click)="addNewProvider()">
|
|
289
|
+
<i class="fa-solid fa-plus"></i> Add Provider
|
|
290
|
+
</button>
|
|
291
291
|
</div>
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
</div>
|
|
296
|
-
|
|
292
|
+
</mj-page-header>
|
|
293
|
+
|
|
294
|
+
<mj-page-body>
|
|
297
295
|
@if (isLoading) {
|
|
298
296
|
<div class="loading-state">
|
|
299
297
|
<mj-loading text="Loading providers..."></mj-loading>
|
|
@@ -372,8 +370,9 @@ export { CommunicationProvidersResourceComponent };
|
|
|
372
370
|
}
|
|
373
371
|
</div>
|
|
374
372
|
}
|
|
375
|
-
|
|
376
|
-
|
|
373
|
+
</mj-page-body>
|
|
374
|
+
</mj-page-layout>
|
|
375
|
+
`, styles: ["\n .loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 0;\n }\n\n /* GRID */\n .providers-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));\n gap: 16px;\n }\n .provider-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n transition: all 0.15s ease;\n }\n .provider-card:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .provider-card.disabled { opacity: 0.65; }\n\n .provider-card-header {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 20px 20px 16px;\n }\n .provider-card-logo {\n width: 48px; height: 48px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 22px; flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n }\n .provider-card-logo.sendgrid {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .provider-card-logo.twilio {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .provider-card-logo.gmail {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .provider-card-logo.msgraph {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .provider-card-title { flex: 1; min-width: 0; }\n .provider-card-name {\n font-size: 15px; font-weight: 700;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .provider-card-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n .provider-card-status {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.5px;\n padding: 3px 10px; border-radius: 10px;\n flex-shrink: 0;\n }\n .provider-card-status.active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .provider-card-status.disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .provider-card-body { padding: 0 20px 16px; }\n\n .provider-capabilities {\n display: flex; flex-wrap: wrap;\n gap: 6px; margin-bottom: 16px;\n }\n .capability-chip {\n display: inline-flex; align-items: center;\n gap: 4px; padding: 4px 10px;\n border-radius: 12px; font-size: 11px; font-weight: 500;\n }\n .capability-chip.supported {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .capability-chip.unsupported {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n }\n\n .provider-card-stats {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px; padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n }\n .provider-stat { text-align: center; }\n .provider-stat-value {\n font-size: 16px; font-weight: 800;\n color: var(--mj-text-primary);\n }\n .provider-stat-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n text-transform: uppercase; letter-spacing: 0.3px;\n }\n\n .provider-card-footer {\n display: flex;\n border-top: 1px solid var(--mj-border-default);\n }\n .provider-card-footer button {\n flex: 1; padding: 12px;\n border: none; background: transparent;\n font-size: 12px; font-weight: 600;\n color: var(--mj-brand-primary);\n cursor: pointer; transition: background 0.15s;\n font-family: inherit;\n display: flex; align-items: center;\n justify-content: center; gap: 6px;\n }\n .provider-card-footer button:hover {\n background: var(--mj-bg-surface-sunken);\n }\n .provider-card-footer button + button {\n border-left: 1px solid var(--mj-border-default);\n }\n "] }]
|
|
377
376
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.NavigationService }], null); })();
|
|
378
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CommunicationProvidersResourceComponent, { className: "CommunicationProvidersResourceComponent", filePath: "src/Communication/communication-providers-resource.component.ts", lineNumber:
|
|
377
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CommunicationProvidersResourceComponent, { className: "CommunicationProvidersResourceComponent", filePath: "src/Communication/communication-providers-resource.component.ts", lineNumber: 258 }); })();
|
|
379
378
|
//# sourceMappingURL=communication-providers-resource.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication-providers-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-providers-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationProviderEntity, MJCommunicationLogEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { Metadata, RunView, CompositeKey } from '@memberjunction/core';\n\ninterface ProviderCardData {\n Entity: MJCommunicationProviderEntity;\n SentCount: number;\n SuccessRate: number;\n FailedCount: number;\n IconClass: string;\n LogoClass: string;\n}\n@RegisterClass(BaseResourceComponent, 'CommunicationProvidersResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-providers-resource',\n template: `\n <div class=\"providers-wrapper\">\n <div class=\"providers-header\">\n <div>\n <h2>Communication Providers</h2>\n <p>Manage your messaging service integrations</p>\n </div>\n <button class=\"tb-btn primary\" (click)=\"addNewProvider()\">\n <i class=\"fa-solid fa-plus\"></i> Add Provider\n </button>\n </div>\n \n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading providers...\"></mj-loading>\n </div>\n }\n \n @if (!isLoading) {\n <div class=\"providers-grid\">\n @for (card of providerCards; track card) {\n <div class=\"provider-card\" [class.disabled]=\"card.Entity.Status === 'Disabled'\">\n <div class=\"provider-card-header\">\n <div class=\"provider-card-logo\" [ngClass]=\"card.LogoClass\">\n <i [class]=\"card.IconClass\"></i>\n </div>\n <div class=\"provider-card-title\">\n <div class=\"provider-card-name\">{{card.Entity.Name}}</div>\n <div class=\"provider-card-desc\">{{card.Entity.Description || 'No description'}}</div>\n </div>\n <span class=\"provider-card-status\" [ngClass]=\"card.Entity.Status.toLowerCase()\">\n {{card.Entity.Status}}\n </span>\n </div>\n <div class=\"provider-card-body\">\n <div class=\"provider-capabilities\">\n <span class=\"capability-chip\" [class.supported]=\"card.Entity.SupportsSending\" [class.unsupported]=\"!card.Entity.SupportsSending\">\n <i [class]=\"card.Entity.SupportsSending ? 'fa-solid fa-check' : 'fa-solid fa-xmark'\"></i> Sending\n </span>\n <span class=\"capability-chip\" [class.supported]=\"card.Entity.SupportsReceiving\" [class.unsupported]=\"!card.Entity.SupportsReceiving\">\n <i [class]=\"card.Entity.SupportsReceiving ? 'fa-solid fa-check' : 'fa-solid fa-xmark'\"></i> Receiving\n </span>\n @if (card.Entity.SupportsScheduledSending) {\n <span class=\"capability-chip supported\">\n <i class=\"fa-solid fa-check\"></i> Scheduled\n </span>\n }\n @if (card.Entity.SupportsDrafts) {\n <span class=\"capability-chip supported\">\n <i class=\"fa-solid fa-check\"></i> Drafts\n </span>\n }\n @if (card.Entity.SupportsForwarding) {\n <span class=\"capability-chip supported\">\n <i class=\"fa-solid fa-check\"></i> Forward\n </span>\n }\n @if (card.Entity.SupportsReplying) {\n <span class=\"capability-chip supported\">\n <i class=\"fa-solid fa-check\"></i> Reply\n </span>\n }\n </div>\n <div class=\"provider-card-stats\">\n <div class=\"provider-stat\">\n <div class=\"provider-stat-value\">{{card.SentCount}}</div>\n <div class=\"provider-stat-label\">Sent (24h)</div>\n </div>\n <div class=\"provider-stat\">\n <div class=\"provider-stat-value\">{{card.SuccessRate}}%</div>\n <div class=\"provider-stat-label\">Success</div>\n </div>\n <div class=\"provider-stat\">\n <div class=\"provider-stat-value\">{{card.FailedCount}}</div>\n <div class=\"provider-stat-label\">Failed</div>\n </div>\n </div>\n </div>\n <div class=\"provider-card-footer\">\n <button (click)=\"configureProvider(card.Entity)\">\n <i class=\"fa-solid fa-gear\"></i> Configure\n </button>\n <button (click)=\"viewProviderLogs(card.Entity)\">\n <i class=\"fa-solid fa-chart-line\"></i> Analytics\n </button>\n </div>\n </div>\n }\n </div>\n }\n </div>\n `,\n styles: [`\n .providers-wrapper {\n height: 100%;\n padding: 24px;\n overflow-y: auto;\n background: var(--mj-bg-surface);\n }\n .providers-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n }\n .providers-header h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 800;\n color: var(--mj-text-primary);\n }\n .providers-header p {\n margin: 4px 0 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n }\n\n .tb-btn {\n display: inline-flex; align-items: center;\n gap: 6px; padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n font-size: 12px; font-weight: 600;\n cursor: pointer; transition: all 0.15s ease;\n font-family: inherit;\n }\n .tb-btn.primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n }\n .tb-btn.primary:hover { background: var(--mj-brand-primary-hover); }\n\n .loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 0;\n }\n\n /* GRID */\n .providers-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));\n gap: 16px;\n }\n .provider-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n transition: all 0.15s ease;\n }\n .provider-card:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .provider-card.disabled { opacity: 0.65; }\n\n .provider-card-header {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 20px 20px 16px;\n }\n .provider-card-logo {\n width: 48px; height: 48px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 22px; flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n }\n .provider-card-logo.sendgrid {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .provider-card-logo.twilio {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .provider-card-logo.gmail {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .provider-card-logo.msgraph {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .provider-card-title { flex: 1; min-width: 0; }\n .provider-card-name {\n font-size: 15px; font-weight: 700;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .provider-card-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n .provider-card-status {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.5px;\n padding: 3px 10px; border-radius: 10px;\n flex-shrink: 0;\n }\n .provider-card-status.active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .provider-card-status.disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .provider-card-body { padding: 0 20px 16px; }\n\n .provider-capabilities {\n display: flex; flex-wrap: wrap;\n gap: 6px; margin-bottom: 16px;\n }\n .capability-chip {\n display: inline-flex; align-items: center;\n gap: 4px; padding: 4px 10px;\n border-radius: 12px; font-size: 11px; font-weight: 500;\n }\n .capability-chip.supported {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .capability-chip.unsupported {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n }\n\n .provider-card-stats {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px; padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n }\n .provider-stat { text-align: center; }\n .provider-stat-value {\n font-size: 16px; font-weight: 800;\n color: var(--mj-text-primary);\n }\n .provider-stat-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n text-transform: uppercase; letter-spacing: 0.3px;\n }\n\n .provider-card-footer {\n display: flex;\n border-top: 1px solid var(--mj-border-default);\n }\n .provider-card-footer button {\n flex: 1; padding: 12px;\n border: none; background: transparent;\n font-size: 12px; font-weight: 600;\n color: var(--mj-brand-primary);\n cursor: pointer; transition: background 0.15s;\n font-family: inherit;\n display: flex; align-items: center;\n justify-content: center; gap: 6px;\n }\n .provider-card-footer button:hover {\n background: var(--mj-bg-surface-sunken);\n }\n .provider-card-footer button + button {\n border-left: 1px solid var(--mj-border-default);\n }\n `]\n})\nexport class CommunicationProvidersResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = false;\n public providerCards: ProviderCardData[] = [];\n\n constructor(private cdr: ChangeDetectorRef, private navService: NavigationService) {\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 [providersResult, logsResult] = await Promise.all([\n rv.RunView<MJCommunicationProviderEntity>({\n EntityName: 'MJ: Communication Providers',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n ResultType: 'entity_object'\n })\n ]);\n\n if (providersResult.Success) {\n const logs = logsResult.Success ? logsResult.Results : [];\n this.providerCards = providersResult.Results.map(p => this.buildProviderCard(p, logs));\n }\n } catch (error) {\n console.error('Error loading providers:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildProviderCard(provider: MJCommunicationProviderEntity, logs: MJCommunicationLogEntity[]): ProviderCardData {\n const providerLogs = logs.filter(l => l.CommunicationProvider === provider.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 Entity: provider,\n SentCount: sent,\n SuccessRate: rate,\n FailedCount: failed,\n IconClass: this.getProviderIcon(provider.Name),\n LogoClass: this.getProviderLogoClass(provider.Name)\n };\n }\n\n private getProviderIcon(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 if (n.includes('aws') || n.includes('ses')) return 'fa-brands fa-aws';\n if (n.includes('slack')) return 'fa-brands fa-slack';\n return 'fa-solid fa-server';\n }\n\n private getProviderLogoClass(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 public configureProvider(provider: MJCommunicationProviderEntity): void {\n const pk = new CompositeKey();\n pk.LoadFromEntityInfoAndRecord(this.ProviderToUse.Entities.find(e => e.Name === 'MJ: Communication Providers')!, provider);\n this.navService.OpenEntityRecord('MJ: Communication Providers', pk);\n }\n\n public viewProviderLogs(provider: MJCommunicationProviderEntity): void {\n console.log('View analytics for provider:', provider.Name);\n }\n\n public addNewProvider(): void {\n this.navService.OpenEntityRecord('MJ: Communication Providers', new CompositeKey());\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Providers';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-server';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"communication-providers-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-providers-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationProviderEntity, MJCommunicationLogEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { Metadata, RunView, CompositeKey } from '@memberjunction/core';\n\ninterface ProviderCardData {\n Entity: MJCommunicationProviderEntity;\n SentCount: number;\n SuccessRate: number;\n FailedCount: number;\n IconClass: string;\n LogoClass: string;\n}\n@RegisterClass(BaseResourceComponent, 'CommunicationProvidersResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-providers-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"Providers\"\n Icon=\"fa-solid fa-server\"\n Subtitle=\"Manage your messaging service integrations\">\n <div actions>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"addNewProvider()\">\n <i class=\"fa-solid fa-plus\"></i> Add Provider\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n @if (isLoading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading providers...\"></mj-loading>\n </div>\n }\n \n @if (!isLoading) {\n <div class=\"providers-grid\">\n @for (card of providerCards; track card) {\n <div class=\"provider-card\" [class.disabled]=\"card.Entity.Status === 'Disabled'\">\n <div class=\"provider-card-header\">\n <div class=\"provider-card-logo\" [ngClass]=\"card.LogoClass\">\n <i [class]=\"card.IconClass\"></i>\n </div>\n <div class=\"provider-card-title\">\n <div class=\"provider-card-name\">{{card.Entity.Name}}</div>\n <div class=\"provider-card-desc\">{{card.Entity.Description || 'No description'}}</div>\n </div>\n <span class=\"provider-card-status\" [ngClass]=\"card.Entity.Status.toLowerCase()\">\n {{card.Entity.Status}}\n </span>\n </div>\n <div class=\"provider-card-body\">\n <div class=\"provider-capabilities\">\n <span class=\"capability-chip\" [class.supported]=\"card.Entity.SupportsSending\" [class.unsupported]=\"!card.Entity.SupportsSending\">\n <i [class]=\"card.Entity.SupportsSending ? 'fa-solid fa-check' : 'fa-solid fa-xmark'\"></i> Sending\n </span>\n <span class=\"capability-chip\" [class.supported]=\"card.Entity.SupportsReceiving\" [class.unsupported]=\"!card.Entity.SupportsReceiving\">\n <i [class]=\"card.Entity.SupportsReceiving ? 'fa-solid fa-check' : 'fa-solid fa-xmark'\"></i> Receiving\n </span>\n @if (card.Entity.SupportsScheduledSending) {\n <span class=\"capability-chip supported\">\n <i class=\"fa-solid fa-check\"></i> Scheduled\n </span>\n }\n @if (card.Entity.SupportsDrafts) {\n <span class=\"capability-chip supported\">\n <i class=\"fa-solid fa-check\"></i> Drafts\n </span>\n }\n @if (card.Entity.SupportsForwarding) {\n <span class=\"capability-chip supported\">\n <i class=\"fa-solid fa-check\"></i> Forward\n </span>\n }\n @if (card.Entity.SupportsReplying) {\n <span class=\"capability-chip supported\">\n <i class=\"fa-solid fa-check\"></i> Reply\n </span>\n }\n </div>\n <div class=\"provider-card-stats\">\n <div class=\"provider-stat\">\n <div class=\"provider-stat-value\">{{card.SentCount}}</div>\n <div class=\"provider-stat-label\">Sent (24h)</div>\n </div>\n <div class=\"provider-stat\">\n <div class=\"provider-stat-value\">{{card.SuccessRate}}%</div>\n <div class=\"provider-stat-label\">Success</div>\n </div>\n <div class=\"provider-stat\">\n <div class=\"provider-stat-value\">{{card.FailedCount}}</div>\n <div class=\"provider-stat-label\">Failed</div>\n </div>\n </div>\n </div>\n <div class=\"provider-card-footer\">\n <button (click)=\"configureProvider(card.Entity)\">\n <i class=\"fa-solid fa-gear\"></i> Configure\n </button>\n <button (click)=\"viewProviderLogs(card.Entity)\">\n <i class=\"fa-solid fa-chart-line\"></i> Analytics\n </button>\n </div>\n </div>\n }\n </div>\n }\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n .loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 0;\n }\n\n /* GRID */\n .providers-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));\n gap: 16px;\n }\n .provider-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n transition: all 0.15s ease;\n }\n .provider-card:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .provider-card.disabled { opacity: 0.65; }\n\n .provider-card-header {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 20px 20px 16px;\n }\n .provider-card-logo {\n width: 48px; height: 48px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 22px; flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n }\n .provider-card-logo.sendgrid {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .provider-card-logo.twilio {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .provider-card-logo.gmail {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .provider-card-logo.msgraph {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n\n .provider-card-title { flex: 1; min-width: 0; }\n .provider-card-name {\n font-size: 15px; font-weight: 700;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n }\n .provider-card-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n .provider-card-status {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.5px;\n padding: 3px 10px; border-radius: 10px;\n flex-shrink: 0;\n }\n .provider-card-status.active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .provider-card-status.disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .provider-card-body { padding: 0 20px 16px; }\n\n .provider-capabilities {\n display: flex; flex-wrap: wrap;\n gap: 6px; margin-bottom: 16px;\n }\n .capability-chip {\n display: inline-flex; align-items: center;\n gap: 4px; padding: 4px 10px;\n border-radius: 12px; font-size: 11px; font-weight: 500;\n }\n .capability-chip.supported {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .capability-chip.unsupported {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n }\n\n .provider-card-stats {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px; padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n }\n .provider-stat { text-align: center; }\n .provider-stat-value {\n font-size: 16px; font-weight: 800;\n color: var(--mj-text-primary);\n }\n .provider-stat-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n text-transform: uppercase; letter-spacing: 0.3px;\n }\n\n .provider-card-footer {\n display: flex;\n border-top: 1px solid var(--mj-border-default);\n }\n .provider-card-footer button {\n flex: 1; padding: 12px;\n border: none; background: transparent;\n font-size: 12px; font-weight: 600;\n color: var(--mj-brand-primary);\n cursor: pointer; transition: background 0.15s;\n font-family: inherit;\n display: flex; align-items: center;\n justify-content: center; gap: 6px;\n }\n .provider-card-footer button:hover {\n background: var(--mj-bg-surface-sunken);\n }\n .provider-card-footer button + button {\n border-left: 1px solid var(--mj-border-default);\n }\n `]\n})\nexport class CommunicationProvidersResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = false;\n public providerCards: ProviderCardData[] = [];\n\n constructor(private cdr: ChangeDetectorRef, private navService: NavigationService) {\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 [providersResult, logsResult] = await Promise.all([\n rv.RunView<MJCommunicationProviderEntity>({\n EntityName: 'MJ: Communication Providers',\n OrderBy: 'Name ASC',\n ResultType: 'entity_object'\n }),\n rv.RunView<MJCommunicationLogEntity>({\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n ResultType: 'entity_object'\n })\n ]);\n\n if (providersResult.Success) {\n const logs = logsResult.Success ? logsResult.Results : [];\n this.providerCards = providersResult.Results.map(p => this.buildProviderCard(p, logs));\n }\n } catch (error) {\n console.error('Error loading providers:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private buildProviderCard(provider: MJCommunicationProviderEntity, logs: MJCommunicationLogEntity[]): ProviderCardData {\n const providerLogs = logs.filter(l => l.CommunicationProvider === provider.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 Entity: provider,\n SentCount: sent,\n SuccessRate: rate,\n FailedCount: failed,\n IconClass: this.getProviderIcon(provider.Name),\n LogoClass: this.getProviderLogoClass(provider.Name)\n };\n }\n\n private getProviderIcon(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 if (n.includes('aws') || n.includes('ses')) return 'fa-brands fa-aws';\n if (n.includes('slack')) return 'fa-brands fa-slack';\n return 'fa-solid fa-server';\n }\n\n private getProviderLogoClass(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 public configureProvider(provider: MJCommunicationProviderEntity): void {\n const pk = new CompositeKey();\n pk.LoadFromEntityInfoAndRecord(this.ProviderToUse.Entities.find(e => e.Name === 'MJ: Communication Providers')!, provider);\n this.navService.OpenEntityRecord('MJ: Communication Providers', pk);\n }\n\n public viewProviderLogs(provider: MJCommunicationProviderEntity): void {\n console.log('View analytics for provider:', provider.Name);\n }\n\n public addNewProvider(): void {\n this.navService.OpenEntityRecord('MJ: Communication Providers', new CompositeKey());\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Providers';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-server';\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication-runs-resource.component.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-runs-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAElE,
|
|
1
|
+
{"version":3,"file":"communication-runs-resource.component.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-runs-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAElE,qBAyNa,kCAAmC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAS1F,OAAO,CAAC,GAAG;IARhB,IAAI,EAAE,wBAAwB,EAAE,CAAM;IACtC,SAAS,UAAS;IAClB,OAAO;;;;MAIZ;gBAEkB,GAAG,EAAE,iBAAiB;IAIpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW,IAAI,IAAI;IAIN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsD/B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAQtC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAQvC,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAjGtD,kCAAkC;2CAAlC,kCAAkC;CAoG9C"}
|