@memberjunction/ng-dashboards 6.2.0-edge.4 → 6.2.0-edge.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +15 -7
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +7 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +209 -57
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +12 -11
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +15 -15
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +28 -16
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +30 -6
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +15 -7
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/sensitive-fields.d.ts +58 -0
- package/dist/AI/components/vectors/sensitive-fields.d.ts.map +1 -0
- package/dist/AI/components/vectors/sensitive-fields.js +251 -0
- package/dist/AI/components/vectors/sensitive-fields.js.map +1 -0
- package/dist/AI/components/vectors/vector-document-rules.d.ts +139 -0
- package/dist/AI/components/vectors/vector-document-rules.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-document-rules.js +182 -0
- package/dist/AI/components/vectors/vector-document-rules.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +83 -14
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +546 -271
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-store-selection.d.ts +32 -0
- package/dist/AI/components/vectors/vector-store-selection.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-store-selection.js +57 -0
- package/dist/AI/components/vectors/vector-store-selection.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +236 -0
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +374 -0
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +195 -0
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +2910 -0
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +1 -0
- package/dist/ChiefOfStaff/index.d.ts +3 -0
- package/dist/ChiefOfStaff/index.d.ts.map +1 -0
- package/dist/ChiefOfStaff/index.js +3 -0
- package/dist/ChiefOfStaff/index.js.map +1 -0
- package/dist/Communication/communication-agent-context.d.ts +11 -1
- package/dist/Communication/communication-agent-context.d.ts.map +1 -1
- package/dist/Communication/communication-agent-context.js +15 -0
- package/dist/Communication/communication-agent-context.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +5 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +2 -1
- 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 +23 -18
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts +27 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +722 -78
- 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 +11 -10
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/DashboardEditor/dashboard-editor.component.d.ts +17 -2
- package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -1
- package/dist/DashboardEditor/dashboard-editor.component.js +94 -43
- package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +49 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +220 -55
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +2 -0
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +1 -0
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.d.ts.map +1 -1
- package/dist/DevTools/class-registry.component.js +1 -0
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.d.ts.map +1 -1
- package/dist/DevTools/event-monitor.component.js +2 -0
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.d.ts.map +1 -1
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/grid-width-lab.component.d.ts.map +1 -1
- package/dist/DevTools/grid-width-lab.component.js +1 -0
- package/dist/DevTools/grid-width-lab.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +1 -0
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.d.ts.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +1 -0
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.d.ts.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +1 -0
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/DevTools/tab-strip-lab.component.d.ts.map +1 -1
- package/dist/DevTools/tab-strip-lab.component.js +1 -0
- package/dist/DevTools/tab-strip-lab.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +5 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +8 -5
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +2 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts +11 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js +24 -2
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts +16 -2
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +87 -33
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
- package/dist/LoginStudio/login-studio-inspector.component.d.ts +130 -0
- package/dist/LoginStudio/login-studio-inspector.component.d.ts.map +1 -0
- package/dist/LoginStudio/login-studio-inspector.component.js +781 -0
- package/dist/LoginStudio/login-studio-inspector.component.js.map +1 -0
- package/dist/LoginStudio/login-studio-resource.component.d.ts +161 -0
- package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -0
- package/dist/LoginStudio/login-studio-resource.component.js +890 -0
- package/dist/LoginStudio/login-studio-resource.component.js.map +1 -0
- package/dist/MCP/mcp-dashboard.component.d.ts +24 -4
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +118 -65
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/PredictiveStudio/business-predictions.view-models.d.ts +1 -1
- package/dist/PredictiveStudio/business-predictions.view-models.d.ts.map +1 -1
- package/dist/PredictiveStudio/business-predictions.view-models.js +3 -3
- package/dist/PredictiveStudio/business-predictions.view-models.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +6 -63
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.js +256 -521
- package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +0 -18
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +122 -249
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +5 -9
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.js +98 -130
- package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +53 -4
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +335 -326
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts +19 -0
- package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts.map +1 -0
- package/dist/PredictiveStudio/components/ps-row-drivers.component.js +85 -0
- package/dist/PredictiveStudio/components/ps-row-drivers.component.js.map +1 -0
- package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts +19 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js +51 -2
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
- package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts +3 -1
- package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts.map +1 -1
- package/dist/PredictiveStudio/predictive-studio-agent-context.js +3 -0
- package/dist/PredictiveStudio/predictive-studio-agent-context.js.map +1 -1
- package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +27 -4
- package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -1
- package/dist/PredictiveStudio/predictive-studio-score-history.service.js +94 -61
- package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +29 -5
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +185 -103
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +1 -1
- package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
- package/dist/Workflows/components/workflow-runs-resource.component.js +4 -4
- package/dist/Workflows/components/workflow-runs-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +22 -21
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +8 -2
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +2 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +11 -3
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +72 -69
- package/dist/PredictiveStudio/at-risk.view-models.d.ts +0 -120
- package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +0 -1
- package/dist/PredictiveStudio/at-risk.view-models.js +0 -261
- package/dist/PredictiveStudio/at-risk.view-models.js.map +0 -1
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts +0 -109
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts.map +0 -1
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.js +0 -323
- package/dist/PredictiveStudio/components/ps-confirm-modal.component.js.map +0 -1
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +0 -137
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +0 -1
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +0 -826
- package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js.map +0 -1
|
@@ -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 <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> <span class=\"action-btn-label\">Add Provider</span>\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 /** @deprecated Use {@link ProviderCards}. */\n public get providerCards(): ProviderCardData[] {\n return this.ProviderCards;\n }\n /** @deprecated Use {@link ProviderCards}. */\n public set providerCards(value: ProviderCardData[]) {\n this.ProviderCards = value;\n }\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 /** @deprecated Use {@link ConfigureProvider}. */\n public configureProvider(provider: MJCommunicationProviderEntity): void {\n return this.ConfigureProvider(provider);\n }\n\n public ViewProviderLogs(provider: MJCommunicationProviderEntity): void {\n console.log('View analytics for provider:', provider.Name);\n }\n\n /** @deprecated Use {@link ViewProviderLogs}. */\n public viewProviderLogs(provider: MJCommunicationProviderEntity): void {\n return this.ViewProviderLogs(provider);\n }\n\n public AddNewProvider(): void {\n this.navService.OpenEntityRecord('MJ: Communication Providers', new CompositeKey());\n }\n\n /** @deprecated Use {@link AddNewProvider}. */\n public addNewProvider(): void {\n return this.AddNewProvider();\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 {\n ResourceData,\n MJCommunicationProviderEntity,\n MJCommunicationLogEntity,\n MJAIBridgeAgentIdentityEntity,\n} from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { RunView, CompositeKey } from '@memberjunction/core';\n\ntype ProviderEnterpriseScopeMode = MJCommunicationProviderEntity['EnterpriseScopeMode'];\n\ninterface EnterpriseScopeOption {\n Value: ProviderEnterpriseScopeMode;\n Label: string;\n Summary: string;\n}\n\ninterface ProviderCardData {\n Entity: MJCommunicationProviderEntity;\n SentCount: number;\n SuccessRate: number;\n FailedCount: number;\n IconClass: string;\n LogoClass: string;\n ScopeLabel: string;\n ScopeBadgeClass: string;\n}\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 & Enterprise Mailbox Governance\"\n Icon=\"fa-solid fa-server\"\n Subtitle=\"Manage messaging & calendar providers, enterprise mailbox scope boundaries, and dedicated Agent Utility Mailboxes\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"AddNewAgentIdentity()\">\n <i class=\"fa-solid fa-robot\"></i> <span class=\"action-btn-label\">Add Utility Mailbox</span>\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"addNewProvider()\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"action-btn-label\">Add Provider</span>\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 and mailbox governance...\"></mj-loading>\n </div>\n }\n\n @if (!isLoading) {\n <!-- PROVIDERS GRID -->\n <div class=\"section-heading\">\n <div class=\"section-heading-title\">\n <i class=\"fa-solid fa-plug\"></i> Configured Communication & Calendar Providers\n </div>\n <div class=\"section-heading-sub\">\n Enterprise credentials default to <strong>Utility Mailboxes Only</strong> so agents cannot read or send from arbitrary user inboxes unless explicitly scoped.\n </div>\n </div>\n\n <div class=\"providers-grid\">\n @for (card of providerCards; track card.Entity.ID) {\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 <span class=\"capability-chip\" [class.supported]=\"card.Entity.SupportsCalendar\" [class.unsupported]=\"!card.Entity.SupportsCalendar\">\n <i [class]=\"card.Entity.SupportsCalendar ? 'fa-regular fa-calendar-check' : 'fa-solid fa-xmark'\"></i> Calendar\n </span>\n <span class=\"capability-chip\" [class.supported]=\"card.Entity.SupportsFreeBusy\" [class.unsupported]=\"!card.Entity.SupportsFreeBusy\">\n <i [class]=\"card.Entity.SupportsFreeBusy ? 'fa-solid fa-user-clock' : 'fa-solid fa-xmark'\"></i> Free/Busy\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\n <!-- ENTERPRISE GOVERNANCE SUMMARY BANNER -->\n <div class=\"governance-banner\">\n <div class=\"governance-row\">\n <span class=\"governance-label\"><i class=\"fa-solid fa-shield-halved\"></i> Mailbox Scope</span>\n <span class=\"scope-badge\" [ngClass]=\"card.ScopeBadgeClass\">{{card.ScopeLabel}}</span>\n </div>\n <div class=\"governance-row\">\n <span class=\"governance-label\"><i class=\"fa-solid fa-globe\"></i> Allowed Domains</span>\n <span class=\"governance-domains\">{{card.Entity.AllowedEmailDomains || 'All domains (unrestricted)'}}</span>\n </div>\n </div>\n\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)=\"OpenGovernanceModal(card.Entity)\">\n <i class=\"fa-solid fa-shield-halved\"></i> Enterprise Scope\n </button>\n <button (click)=\"configureProvider(card.Entity)\">\n <i class=\"fa-solid fa-gear\"></i> Record\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 <!-- AGENT UTILITY MAILBOXES SECTION (MJ: AI Bridge Agent Identities) -->\n <div class=\"section-heading utility-mailboxes-heading\">\n <div class=\"section-heading-title\">\n <i class=\"fa-solid fa-envelope-circle-check\"></i> Agent Utility Mailboxes (MJ: AI Bridge Agent Identities)\n </div>\n <div class=\"section-heading-sub\">\n Dedicated agent and shared utility email identities that Chief of Staff and other AI agents can use in <code>UtilityMailboxesOnly</code> or <code>SendAsAgent</code> mode without exposing personal employee inboxes.\n </div>\n </div>\n\n @if (AgentUtilityMailboxes.length === 0) {\n <div class=\"utility-empty-card\">\n <div class=\"utility-empty-icon\"><i class=\"fa-solid fa-inbox\"></i></div>\n <div class=\"utility-empty-title\">No Agent Utility Mailboxes Registered</div>\n <div class=\"utility-empty-desc\">\n Register shared or per-user agent email addresses (e.g., <code>cos-exec@company.com</code> or <code>sage@company.com</code>) in <strong>MJ: AI Bridge Agent Identities</strong> so agents can send briefings and calendar invites safely when <code>EnterpriseScopeMode</code> is set to <code>UtilityMailboxesOnly</code>.\n </div>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"AddNewAgentIdentity()\">\n <i class=\"fa-solid fa-plus\"></i> Register Utility Mailbox\n </button>\n </div>\n } @else {\n <div class=\"utility-mailboxes-grid\">\n @for (identity of AgentUtilityMailboxes; track identity.ID) {\n <div class=\"utility-mailbox-card\" [class.inactive]=\"!identity.IsActive\">\n <div class=\"utility-mailbox-header\">\n <div class=\"utility-mailbox-icon\">\n <i class=\"fa-solid fa-at\"></i>\n </div>\n <div class=\"utility-mailbox-info\">\n <div class=\"utility-mailbox-title\">{{identity.DisplayName || identity.IdentityValue}}</div>\n <div class=\"utility-mailbox-address\">{{identity.IdentityValue}}</div>\n </div>\n <span class=\"provider-card-status\" [class.active]=\"identity.IsActive\" [class.disabled]=\"!identity.IsActive\">\n {{identity.IsActive ? 'Active' : 'Inactive'}}\n </span>\n </div>\n <div class=\"utility-mailbox-meta\">\n <div class=\"utility-meta-row\">\n <span class=\"utility-meta-label\">Agent:</span>\n <span class=\"utility-meta-val\">{{identity.Agent || 'Unassigned'}}</span>\n </div>\n <div class=\"utility-meta-row\">\n <span class=\"utility-meta-label\">Owner Scope:</span>\n <span class=\"utility-meta-val\">{{identity.User ? ('Dedicated: ' + identity.User) : 'Shared Org Utility Mailbox'}}</span>\n </div>\n <div class=\"utility-meta-row\">\n <span class=\"utility-meta-label\">Bridge Provider:</span>\n <span class=\"utility-meta-val\">{{identity.Provider}}</span>\n </div>\n </div>\n <div class=\"utility-mailbox-footer\">\n <button (click)=\"OpenAgentIdentity(identity)\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open Identity Record\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- ENTERPRISE GOVERNANCE EDITOR MODAL -->\n @if (ActiveGovernanceProvider) {\n <div class=\"governance-modal-backdrop\" (click)=\"CloseGovernanceModal()\">\n <div class=\"governance-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"governance-modal-header\">\n <div>\n <div class=\"governance-modal-title\">\n <i class=\"fa-solid fa-shield-halved\"></i> Enterprise Mailbox Governance — {{ActiveGovernanceProvider.Name}}\n </div>\n <div class=\"governance-modal-subtitle\">\n Configure which mailboxes and calendar scopes AI agents (including Chief of Staff) can access through this provider.\n </div>\n </div>\n <button class=\"modal-close-btn\" (click)=\"CloseGovernanceModal()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"governance-modal-body\">\n <div class=\"form-group\">\n <label class=\"form-label\">Enterprise Mailbox Scope Mode (<code>EnterpriseScopeMode</code>)</label>\n <div class=\"scope-options-list\">\n @for (opt of ScopeOptions; track opt.Value) {\n <label class=\"scope-option-card\" [class.selected]=\"DraftEnterpriseScopeMode === opt.Value\">\n <input\n type=\"radio\"\n name=\"enterpriseScopeMode\"\n [value]=\"opt.Value\"\n [checked]=\"DraftEnterpriseScopeMode === opt.Value\"\n (change)=\"OnScopeModeChange(opt.Value)\" />\n <div class=\"scope-option-content\">\n <div class=\"scope-option-title\">{{opt.Label}} (<code>{{opt.Value}}</code>)</div>\n <div class=\"scope-option-desc\">{{opt.Summary}}</div>\n </div>\n </label>\n }\n </div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Allowed Email Domains (<code>AllowedEmailDomains</code>)</label>\n <input\n type=\"text\"\n class=\"form-input\"\n placeholder=\"e.g. bluecypress.io, memberjunction.org (leave blank for any domain)\"\n [(ngModel)]=\"DraftAllowedEmailDomains\" />\n <div class=\"form-hint\">\n Comma-separated list of corporate email domains permitted for user-scoped inbox & calendar access. Users signed in with an email outside these domains will be blocked by the server-side security gate.\n </div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Calendar & Scheduling Capabilities</label>\n <div class=\"checkbox-row\">\n <label class=\"checkbox-item\">\n <input type=\"checkbox\" [(ngModel)]=\"DraftSupportsCalendar\" />\n <span><strong>Supports Calendar Events</strong> (<code>SupportsCalendar</code> — read/create/update/respond/cancel events)</span>\n </label>\n <label class=\"checkbox-item\">\n <input type=\"checkbox\" [(ngModel)]=\"DraftSupportsFreeBusy\" />\n <span><strong>Supports Free/Busy & Meeting Time Finder</strong> (<code>SupportsFreeBusy</code> — schedule availability & slot calculation)</span>\n </label>\n </div>\n </div>\n\n @if (GovernanceSaveError) {\n <div class=\"governance-alert error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> {{GovernanceSaveError}}\n </div>\n }\n @if (GovernanceSaveMessage) {\n <div class=\"governance-alert success\">\n <i class=\"fa-solid fa-circle-check\"></i> {{GovernanceSaveMessage}}\n </div>\n }\n </div>\n\n <div class=\"governance-modal-footer\">\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CloseGovernanceModal()\" [disabled]=\"IsSavingGovernance\">\n Cancel\n </button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"SaveGovernanceConfig()\" [disabled]=\"IsSavingGovernance\">\n <i class=\"fa-solid fa-floppy-disk\"></i> {{IsSavingGovernance ? 'Saving...' : 'Save Governance Settings'}}\n </button>\n </div>\n </div>\n </div>\n }\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 .section-heading {\n margin-bottom: 14px;\n }\n .utility-mailboxes-heading {\n margin-top: 32px;\n }\n .section-heading-title {\n font-size: 15px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .section-heading-sub {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n }\n\n /* GRID */\n .providers-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(360px, 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: 12px;\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 /* GOVERNANCE BANNER */\n .governance-banner {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 10px 12px;\n margin-bottom: 12px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .governance-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n font-size: 11px;\n }\n .governance-label {\n color: var(--mj-text-muted);\n font-weight: 600;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n }\n .governance-domains {\n color: var(--mj-text-primary);\n font-weight: 500;\n text-align: right;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 200px;\n }\n .scope-badge {\n font-size: 10px;\n font-weight: 700;\n padding: 2px 8px;\n border-radius: 8px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n }\n .scope-badge.utility {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .scope-badge.group {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .scope-badge.tenant {\n background: color-mix(in srgb, var(--mj-status-warning) 18%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\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 8px;\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 /* UTILITY MAILBOXES */\n .utility-empty-card {\n background: var(--mj-bg-surface-card);\n border: 1px dashed var(--mj-border-default);\n border-radius: 12px;\n padding: 28px 24px;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n }\n .utility-empty-icon {\n font-size: 26px;\n color: var(--mj-text-muted);\n }\n .utility-empty-title {\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n .utility-empty-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n max-width: 620px;\n line-height: 1.5;\n }\n .utility-mailboxes-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 14px;\n }\n .utility-mailbox-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n .utility-mailbox-card.inactive {\n opacity: 0.65;\n }\n .utility-mailbox-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n }\n .utility-mailbox-icon {\n width: 38px; height: 38px;\n border-radius: 10px;\n display: flex; align-items: center; justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 16px;\n }\n .utility-mailbox-info {\n flex: 1;\n min-width: 0;\n }\n .utility-mailbox-title {\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n .utility-mailbox-address {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n .utility-mailbox-meta {\n padding: 0 16px 14px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .utility-meta-row {\n display: flex;\n justify-content: space-between;\n font-size: 11px;\n }\n .utility-meta-label {\n color: var(--mj-text-muted);\n }\n .utility-meta-val {\n color: var(--mj-text-primary);\n font-weight: 600;\n }\n .utility-mailbox-footer {\n border-top: 1px solid var(--mj-border-default);\n }\n .utility-mailbox-footer button {\n width: 100%;\n padding: 10px;\n border: none;\n background: transparent;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n }\n .utility-mailbox-footer button:hover {\n background: var(--mj-bg-surface-sunken);\n }\n\n /* MODAL */\n .governance-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 20px;\n }\n .governance-modal {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 14px;\n width: 100%;\n max-width: 640px;\n box-shadow: 0 12px 32px var(--mj-shadow-lg);\n overflow: hidden;\n }\n .governance-modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .governance-modal-title {\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .governance-modal-subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n }\n .modal-close-btn {\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 16px;\n padding: 4px 8px;\n }\n .governance-modal-body {\n padding: 20px 24px;\n display: flex;\n flex-direction: column;\n gap: 18px;\n }\n .form-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .form-label {\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n .scope-options-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .scope-option-card {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n }\n .scope-option-card.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n }\n .scope-option-title {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n .scope-option-desc {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n line-height: 1.4;\n }\n .form-input {\n padding: 9px 12px;\n border-radius: 8px;\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 font-family: inherit;\n }\n .form-hint {\n font-size: 11px;\n color: var(--mj-text-muted);\n line-height: 1.4;\n }\n .checkbox-row {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n .checkbox-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--mj-text-primary);\n cursor: pointer;\n }\n .governance-alert {\n padding: 10px 12px;\n border-radius: 8px;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .governance-alert.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .governance-alert.success {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .governance-modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 14px 24px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n }\n `]\n})\nexport class CommunicationProvidersResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = false;\n public ProviderCards: ProviderCardData[] = [];\n public AgentUtilityMailboxes: MJAIBridgeAgentIdentityEntity[] = [];\n\n public readonly ScopeOptions: EnterpriseScopeOption[] = [\n {\n Value: 'UtilityMailboxesOnly',\n Label: 'Utility Mailboxes Only (Recommended Default)',\n Summary: 'Enterprise credentials only access dedicated Agent Utility Mailboxes registered in MJ: AI Bridge Agent Identities. Personal user inbox & calendar access is blocked at the server gate.',\n },\n {\n Value: 'SecurityGroupScoped',\n Label: 'Security Group / ApplicationAccessPolicy Scoped',\n Summary: 'Enterprise credentials are restricted by an Exchange Online ApplicationAccessPolicy or Google Workspace OU/Group. Live preflight verification (VerifyMailboxAccess) confirms each user mailbox before enabling personal inbox/calendar tools.',\n },\n {\n Value: 'TenantWide',\n Label: 'Tenant-Wide App Access',\n Summary: 'Enterprise app credentials can access any corporate mailbox matching AllowedEmailDomains (pinned strictly on the server to ContextUser.Email).',\n },\n ];\n\n public ActiveGovernanceProvider: MJCommunicationProviderEntity | null = null;\n public DraftEnterpriseScopeMode: ProviderEnterpriseScopeMode = 'UtilityMailboxesOnly';\n public DraftAllowedEmailDomains = '';\n public DraftSupportsCalendar = false;\n public DraftSupportsFreeBusy = false;\n public IsSavingGovernance = false;\n public GovernanceSaveMessage = '';\n public GovernanceSaveError = '';\n\n /** @deprecated Use {@link ProviderCards}. */\n public get providerCards(): ProviderCardData[] {\n return this.ProviderCards;\n }\n /** @deprecated Use {@link ProviderCards}. */\n public set providerCards(value: ProviderCardData[]) {\n this.ProviderCards = value;\n }\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, identitiesResult] = 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 rv.RunView<MJAIBridgeAgentIdentityEntity>({\n EntityName: 'MJ: AI Bridge Agent Identities',\n ExtraFilter: `IdentityType = 'Email'`,\n OrderBy: 'DisplayName ASC, IdentityValue ASC',\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 if (identitiesResult.Success) {\n this.AgentUtilityMailboxes = identitiesResult.Results;\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 ScopeLabel: this.getScopeLabel(provider.EnterpriseScopeMode),\n ScopeBadgeClass: this.getScopeBadgeClass(provider.EnterpriseScopeMode),\n };\n }\n\n private getScopeLabel(mode: ProviderEnterpriseScopeMode): string {\n switch (mode) {\n case 'UtilityMailboxesOnly':\n return 'Utility Mailboxes Only';\n case 'SecurityGroupScoped':\n return 'Security Group Scoped';\n case 'TenantWide':\n return 'Tenant-Wide';\n default:\n return mode;\n }\n }\n\n private getScopeBadgeClass(mode: ProviderEnterpriseScopeMode): string {\n switch (mode) {\n case 'UtilityMailboxesOnly':\n return 'utility';\n case 'SecurityGroupScoped':\n return 'group';\n case 'TenantWide':\n return 'tenant';\n default:\n return 'utility';\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 OpenGovernanceModal(provider: MJCommunicationProviderEntity): void {\n this.ActiveGovernanceProvider = provider;\n this.DraftEnterpriseScopeMode = provider.EnterpriseScopeMode || 'UtilityMailboxesOnly';\n this.DraftAllowedEmailDomains = provider.AllowedEmailDomains || '';\n this.DraftSupportsCalendar = provider.SupportsCalendar;\n this.DraftSupportsFreeBusy = provider.SupportsFreeBusy;\n this.GovernanceSaveMessage = '';\n this.GovernanceSaveError = '';\n this.cdr.detectChanges();\n }\n\n public CloseGovernanceModal(): void {\n this.ActiveGovernanceProvider = null;\n this.GovernanceSaveMessage = '';\n this.GovernanceSaveError = '';\n this.cdr.detectChanges();\n }\n\n public OnScopeModeChange(mode: ProviderEnterpriseScopeMode): void {\n this.DraftEnterpriseScopeMode = mode;\n this.cdr.detectChanges();\n }\n\n public async SaveGovernanceConfig(): Promise<void> {\n if (!this.ActiveGovernanceProvider) {\n return;\n }\n try {\n this.IsSavingGovernance = true;\n this.GovernanceSaveMessage = '';\n this.GovernanceSaveError = '';\n this.cdr.detectChanges();\n\n this.ActiveGovernanceProvider.EnterpriseScopeMode = this.DraftEnterpriseScopeMode;\n const trimmedDomains = this.DraftAllowedEmailDomains.trim();\n this.ActiveGovernanceProvider.AllowedEmailDomains = trimmedDomains.length > 0 ? trimmedDomains : null;\n this.ActiveGovernanceProvider.SupportsCalendar = this.DraftSupportsCalendar;\n this.ActiveGovernanceProvider.SupportsFreeBusy = this.DraftSupportsFreeBusy;\n\n const saved = await this.ActiveGovernanceProvider.Save();\n if (saved) {\n this.GovernanceSaveMessage = 'Enterprise governance and calendar capabilities saved.';\n await this.loadData();\n } else {\n const msg = this.ActiveGovernanceProvider.LatestResult?.Message || 'Failed to save provider settings.';\n this.GovernanceSaveError = msg;\n }\n } catch (err) {\n this.GovernanceSaveError = err instanceof Error ? err.message : String(err);\n } finally {\n this.IsSavingGovernance = false;\n this.cdr.detectChanges();\n }\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 /** @deprecated Use {@link ConfigureProvider}. */\n public configureProvider(provider: MJCommunicationProviderEntity): void {\n return this.ConfigureProvider(provider);\n }\n\n public ViewProviderLogs(provider: MJCommunicationProviderEntity): void {\n console.log('View analytics for provider:', provider.Name);\n }\n\n /** @deprecated Use {@link ViewProviderLogs}. */\n public viewProviderLogs(provider: MJCommunicationProviderEntity): void {\n return this.ViewProviderLogs(provider);\n }\n\n public AddNewProvider(): void {\n this.navService.OpenEntityRecord('MJ: Communication Providers', new CompositeKey());\n }\n\n /** @deprecated Use {@link AddNewProvider}. */\n public addNewProvider(): void {\n return this.AddNewProvider();\n }\n\n public AddNewAgentIdentity(): void {\n this.navService.OpenEntityRecord('MJ: AI Bridge Agent Identities', new CompositeKey());\n }\n\n public OpenAgentIdentity(identity: MJAIBridgeAgentIdentityEntity): void {\n const entityInfo = this.ProviderToUse.Entities.find(e => e.Name === 'MJ: AI Bridge Agent Identities');\n if (!entityInfo) {\n return;\n }\n const pk = new CompositeKey();\n pk.LoadFromEntityInfoAndRecord(entityInfo, identity);\n this.navService.OpenEntityRecord('MJ: AI Bridge Agent Identities', pk);\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\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,qBAgNa,kCAAmC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IA2B1F,OAAO,CAAC,GAAG;IA1BhB,IAAI,EAAE,wBAAwB,EAAE,CAAM;IAE7C,oCAAoC;IACpC,IAAW,IAAI,IAAI,wBAAwB,EAAE,CAE5C;IACD,oCAAoC;IACpC,IAAW,IAAI,CAAC,KAAK,EAAE,wBAAwB,EAAE,EAEhD;IACM,SAAS,UAAS;IAClB,OAAO;;;;MAIZ;IAEF,uCAAuC;IACvC,IAAW,OAAO;;;;MAEjB;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK;;;;KAAA,EAEvB;gBAEmB,GAAG,EAAE,iBAAiB;IAIpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW,IAAI,IAAI;IAIN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
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,qBAgNa,kCAAmC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IA2B1F,OAAO,CAAC,GAAG;IA1BhB,IAAI,EAAE,wBAAwB,EAAE,CAAM;IAE7C,oCAAoC;IACpC,IAAW,IAAI,IAAI,wBAAwB,EAAE,CAE5C;IACD,oCAAoC;IACpC,IAAW,IAAI,CAAC,KAAK,EAAE,wBAAwB,EAAE,EAEhD;IACM,SAAS,UAAS;IAClB,OAAO;;;;MAIZ;IAEF,uCAAuC;IACvC,IAAW,OAAO;;;;MAEjB;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK;;;;KAAA,EAEvB;gBAEmB,GAAG,EAAE,iBAAiB;IAIpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,WAAW,IAAI,IAAI;IAIN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD/B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAQ7C,8CAA8C;IACvC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAItC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAQ7C,8CAA8C;IACvC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIvC,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCA9HtD,kCAAkC;2CAAlC,kCAAkC;CAiI9C"}
|
|
@@ -121,28 +121,29 @@ let CommunicationRunsResourceComponent = class CommunicationRunsResourceComponen
|
|
|
121
121
|
const yesterday = new Date();
|
|
122
122
|
yesterday.setDate(yesterday.getDate() - 1);
|
|
123
123
|
const yesterdayIso = yesterday.toISOString();
|
|
124
|
-
const [runsResult, activeResult, completedResult, failedResult] = await
|
|
125
|
-
|
|
124
|
+
const [runsResult, activeResult, completedResult, failedResult] = await rv.RunViews([
|
|
125
|
+
{
|
|
126
126
|
EntityName: 'MJ: Communication Runs',
|
|
127
127
|
OrderBy: 'StartedAt DESC',
|
|
128
128
|
MaxRows: 50,
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
Fields: ['ID', 'Status', 'Direction', 'StartedAt', 'EndedAt', 'NumMessagesProcessed', 'Comments', 'User'],
|
|
130
|
+
ResultType: 'simple'
|
|
131
|
+
},
|
|
132
|
+
{
|
|
132
133
|
EntityName: 'MJ: Communication Runs',
|
|
133
134
|
ExtraFilter: `Status = 'In-Progress'`,
|
|
134
135
|
ResultType: 'count_only'
|
|
135
|
-
}
|
|
136
|
-
|
|
136
|
+
},
|
|
137
|
+
{
|
|
137
138
|
EntityName: 'MJ: Communication Runs',
|
|
138
139
|
ExtraFilter: `EndedAt >= '${yesterdayIso}' AND Status = 'Complete'`,
|
|
139
140
|
ResultType: 'count_only'
|
|
140
|
-
}
|
|
141
|
-
|
|
141
|
+
},
|
|
142
|
+
{
|
|
142
143
|
EntityName: 'MJ: Communication Runs',
|
|
143
144
|
ExtraFilter: `EndedAt >= '${yesterdayIso}' AND Status = 'Failed'`,
|
|
144
145
|
ResultType: 'count_only'
|
|
145
|
-
}
|
|
146
|
+
}
|
|
146
147
|
]);
|
|
147
148
|
if (runsResult.Success) {
|
|
148
149
|
this.Runs = runsResult.Results;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication-runs-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-runs-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationRunEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView } from '@memberjunction/core';\n@RegisterClass(BaseResourceComponent, 'CommunicationRunsResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-runs-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"Runs\"\n Icon=\"fa-solid fa-play-circle\"\n Subtitle=\"Bulk communication run history\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadData()\" [disabled]=\"isLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isLoading\"></i> <span class=\"action-btn-label\">Refresh</span>\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n <div class=\"card\">\n <!-- SUMMARY STATS -->\n <div class=\"runs-summary\">\n <div class=\"run-stat-card info\">\n <div class=\"run-stat-value\">{{summary.active}}</div>\n <div class=\"run-stat-label\">Active Runs</div>\n </div>\n <div class=\"run-stat-card success\">\n <div class=\"run-stat-value\">{{summary.completed}}</div>\n <div class=\"run-stat-label\">Completed (24h)</div>\n </div>\n <div class=\"run-stat-card neutral\">\n <div class=\"run-stat-value\">{{summary.successRate}}%</div>\n <div class=\"run-stat-label\">Success Rate</div>\n </div>\n </div>\n \n <!-- TIMELINE -->\n <div class=\"run-timeline\">\n @for (run of runs; track run) {\n <div class=\"run-entry\">\n <div class=\"run-timeline-dot\" [ngClass]=\"getRunDotClass(run.Status)\"></div>\n <div class=\"run-entry-content\">\n <div class=\"run-entry-header\">\n <span class=\"run-entry-title\">Run #{{run.ID.substring(0, 8)}}</span>\n <span class=\"run-status-badge\" [ngClass]=\"getStatusClass(run.Status)\">\n {{run.Status}}\n </span>\n </div>\n <div class=\"run-entry-meta\">\n <span><i class=\"fa-solid fa-user\"></i> {{run.User || 'System'}}</span>\n <span><i class=\"fa-solid fa-clock\"></i> {{run.StartedAt | date:'medium'}}</span>\n @if (run.EndedAt) {\n <span><i class=\"fa-solid fa-flag-checkered\"></i> {{run.EndedAt | date:'shortTime'}}</span>\n }\n </div>\n @if (run.Comments) {\n <div class=\"run-entry-comments\">\n {{run.Comments}}\n </div>\n }\n </div>\n </div>\n }\n \n @if (runs.length === 0 && !isLoading) {\n <mj-empty-state Icon=\"fa-solid fa-play-circle\"\n Title=\"No communication runs found\" />\n }\n </div>\n </div>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n .card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n padding: 16px 0 0;\n }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n .spinning { animation: spin 1s linear infinite; }\n\n /* SUMMARY */\n .runs-summary {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n padding: 20px;\n }\n .run-stat-card {\n border-radius: 12px;\n padding: 16px 20px;\n text-align: center;\n }\n .run-stat-card.info {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .run-stat-card.success {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, transparent);\n }\n .run-stat-card.neutral {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n }\n\n .run-stat-value {\n font-size: 24px; font-weight: 800;\n color: var(--mj-text-primary);\n }\n .run-stat-card.info .run-stat-value { color: var(--mj-brand-primary); }\n .run-stat-card.success .run-stat-value { color: var(--mj-status-success); }\n\n .run-stat-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n\n /* TIMELINE */\n .run-timeline { padding: 8px 20px 20px; }\n .run-entry {\n display: flex; gap: 16px;\n padding: 16px 0;\n border-bottom: 1px solid var(--mj-border-default);\n align-items: flex-start;\n }\n .run-entry:last-child { border-bottom: none; }\n\n .run-timeline-dot {\n width: 12px; height: 12px;\n border-radius: 50%;\n margin-top: 4px; flex-shrink: 0;\n }\n .run-timeline-dot.complete { background: var(--mj-status-success); }\n .run-timeline-dot.failed { background: var(--mj-status-error); }\n .run-timeline-dot.in-progress {\n background: var(--mj-brand-primary);\n animation: pulse-dot 1.5s ease-in-out infinite;\n }\n .run-timeline-dot.pending { background: var(--mj-status-warning); }\n\n @keyframes pulse-dot {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 40%, transparent); }\n 50% { box-shadow: 0 0 0 6px transparent; }\n }\n\n .run-entry-content { flex: 1; }\n .run-entry-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .run-entry-title {\n font-size: 13px; font-weight: 600;\n color: var(--mj-text-primary);\n }\n .run-status-badge {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n }\n .run-status-badge.complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, transparent);\n }\n .run-status-badge.failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n }\n .run-status-badge.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 30%, transparent);\n }\n .run-status-badge.in-progress {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .run-entry-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n display: flex; align-items: center; gap: 12px;\n }\n .run-entry-meta span {\n display: flex; align-items: center; gap: 4px;\n }\n .run-entry-meta i { font-size: 10px; }\n\n .run-entry-comments {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 6px;\n font-style: italic;\n }\n\n /* EMPTY STATE */\n `]\n})\nexport class CommunicationRunsResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public Runs: MJCommunicationRunEntity[] = [];\n\n /** @deprecated Use {@link Runs}. */\n public get runs(): MJCommunicationRunEntity[] {\n return this.Runs;\n }\n /** @deprecated Use {@link Runs}. */\n public set runs(value: MJCommunicationRunEntity[]) {\n this.Runs = value;\n }\n public isLoading = false;\n public Summary = {\n active: 0,\n completed: 0,\n successRate: 0\n };\n\n /** @deprecated Use {@link Summary}. */\n public get summary() {\n return this.Summary;\n }\n /** @deprecated Use {@link Summary}. */\n public set summary(value) {\n this.Summary = value;\n }\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n public async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n const yesterdayIso = yesterday.toISOString();\n\n const [runsResult, activeResult, completedResult, failedResult] = await Promise.all([\n rv.RunView<MJCommunicationRunEntity>({\n EntityName: 'MJ: Communication Runs',\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Runs',\n ExtraFilter: `Status = 'In-Progress'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Runs',\n ExtraFilter: `EndedAt >= '${yesterdayIso}' AND Status = 'Complete'`,\n ResultType: 'count_only'\n }),\n rv.RunView({\n EntityName: 'MJ: Communication Runs',\n ExtraFilter: `EndedAt >= '${yesterdayIso}' AND Status = 'Failed'`,\n ResultType: 'count_only'\n })\n ]);\n\n if (runsResult.Success) {\n this.Runs = runsResult.Results;\n }\n\n if (activeResult.Success) this.Summary.active = activeResult.TotalRowCount;\n if (completedResult.Success) this.Summary.completed = completedResult.TotalRowCount;\n\n const totalCompleted = this.Summary.completed + (failedResult.Success ? failedResult.TotalRowCount : 0);\n this.Summary.successRate = totalCompleted > 0\n ? Math.round((this.Summary.completed / totalCompleted) * 100)\n : 100;\n\n } catch (error) {\n console.error('Error loading runs:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public GetRunDotClass(status: string): string {\n const s = (status || '').toLowerCase();\n if (s === 'complete') return 'complete';\n if (s === 'failed') return 'failed';\n if (s === 'in-progress') return 'in-progress';\n return 'pending';\n }\n\n /** @deprecated Use {@link GetRunDotClass}. */\n public getRunDotClass(status: string): string {\n return this.GetRunDotClass(status);\n }\n\n public GetStatusClass(status: string): string {\n const s = (status || '').toLowerCase();\n if (s === 'complete') return 'complete';\n if (s === 'failed') return 'failed';\n if (s === 'in-progress') return 'in-progress';\n return 'pending';\n }\n\n /** @deprecated Use {@link GetStatusClass}. */\n public getStatusClass(status: string): string {\n return this.GetStatusClass(status);\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Bulk Runs';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-play-circle';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"communication-runs-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-runs-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;;;;;IAoDzB,4BAAM;IAAA,wBAA0C;IAAC,YAAkC;;IAAA,iBAAO;;;IAAzC,eAAkC;IAAlC,6EAAkC;;;IAIrF,+BAAgC;IAC9B,YACF;IAAA,iBAAM;;;IADJ,cACF;IADE,gDACF;;;IAnBN,+BAAuB;IACrB,0BAA2E;IAGvE,AADF,AADF,+BAA+B,cACC,eACE;IAAA,YAA+B;IAAA,iBAAO;IACpE,gCAAsE;IACpE,YACF;IACF,AADE,iBAAO,EACH;IAEJ,AADF,+BAA4B,WACpB;IAAA,yBAAgC;IAAC,aAAwB;IAAA,iBAAO;IACtE,6BAAM;IAAA,yBAAiC;IAAC,aAAiC;;IAAA,iBAAO;IAChF,2GAAmB;IAGrB,iBAAM;IACN,8GAAoB;IAMxB,AADE,iBAAM,EACF;;;;IArB0B,cAAsC;IAAtC,8DAAsC;IAGlC,eAA+B;IAA/B,yDAA+B;IAC9B,cAAsC;IAAtC,8DAAsC;IACnE,cACF;IADE,8CACF;IAGuC,eAAwB;IAAxB,mDAAwB;IACvB,eAAiC;IAAjC,6EAAiC;IACzE,eAEC;IAFD,0CAEC;IAEH,cAIC;IAJD,2CAIC;;;IAML,qCACwC;;AA+I/C,IAAM,kCAAkC,GAAxC,MAAM,kCAAmC,SAAQ,qBAAqB;IA2BrD;IA1Bb,IAAI,GAA+B,EAAE,CAAC;IAE7C,oCAAoC;IACpC,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,oCAAoC;IACpC,IAAW,IAAI,CAAC,KAAiC;QAC/C,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,CAAC;IACM,SAAS,GAAG,KAAK,CAAC;IAClB,OAAO,GAAG;QACb,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;KACjB,CAAC;IAEF,uCAAuC;IACvC,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK;QACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,YAAoB,GAAsB;QACtC,KAAK,EAAE,CAAC;QADQ,QAAG,GAAH,GAAG,CAAmB;IAE1C,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,WAAW;QACP,KAAK,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,QAAQ;QACjB,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAEzB,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YAE7C,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC;gBAChF;oBACI,UAAU,EAAE,wBAAwB;oBACpC,OAAO,EAAE,gBAAgB;oBACzB,OAAO,EAAE,EAAE;oBACX,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,CAAC;oBACzG,UAAU,EAAE,QAAQ;iBACvB;gBACD;oBACI,UAAU,EAAE,wBAAwB;oBACpC,WAAW,EAAE,wBAAwB;oBACrC,UAAU,EAAE,YAAY;iBAC3B;gBACD;oBACI,UAAU,EAAE,wBAAwB;oBACpC,WAAW,EAAE,eAAe,YAAY,2BAA2B;oBACnE,UAAU,EAAE,YAAY;iBAC3B;gBACD;oBACI,UAAU,EAAE,wBAAwB;oBACpC,WAAW,EAAE,eAAe,YAAY,yBAAyB;oBACjE,UAAU,EAAE,YAAY;iBAC3B;aACJ,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAqC,CAAC;YACjE,CAAC;YAED,IAAI,YAAY,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC;YAC3E,IAAI,eAAe,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC,aAAa,CAAC;YAEpF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxG,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,cAAc,GAAG,CAAC;gBACzC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC;gBAC7D,CAAC,CAAC,GAAG,CAAC;QAEd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,MAAc;QAChC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,UAAU;YAAE,OAAO,UAAU,CAAC;QACxC,IAAI,CAAC,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACpC,IAAI,CAAC,KAAK,aAAa;YAAE,OAAO,aAAa,CAAC;QAC9C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,8CAA8C;IACvC,cAAc,CAAC,MAAc;QAClC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAEM,cAAc,CAAC,MAAc;QAChC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,UAAU;YAAE,OAAO,UAAU,CAAC;QACxC,IAAI,CAAC,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACpC,IAAI,CAAC,KAAK,aAAa;YAAE,OAAO,aAAa,CAAC;QAC9C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,8CAA8C;IACvC,cAAc,CAAC,MAAc;QAClC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACzC,OAAO,yBAAyB,CAAC;IACrC,CAAC;4HAhIQ,kCAAkC;6DAAlC,kCAAkC;YArMrC,AADF,AAJF,AADF,sCAAgB,wBAI8B,aAC7B,gBACgG;YAA5D,+GAAS,cAAU,IAAC;YACjE,uBAA+D;YAAC,+BAA+B;YAAA,uBAAO;YAG5G,AADE,AADE,AADwG,iBAAO,EACtG,EACL,EACS;YAOT,AADF,AADF,AAFF,AADF,oCAAc,aACM,aAEU,cACQ,cACF;YAAA,aAAkB;YAAA,iBAAM;YACpD,+BAA4B;YAAA,4BAAW;YACzC,AADyC,iBAAM,EACzC;YAEJ,AADF,gCAAmC,cACL;YAAA,aAAqB;YAAA,iBAAM;YACvD,+BAA4B;YAAA,gCAAe;YAC7C,AAD6C,iBAAM,EAC7C;YAEJ,AADF,gCAAmC,cACL;YAAA,aAAwB;YAAA,iBAAM;YAC1D,+BAA4B;YAAA,6BAAY;YAE5C,AADE,AAD0C,iBAAM,EAC1C,EACF;YAGN,gCAA0B;YACxB,4HAwBC;YAED,kHAAuC;YAO/C,AADE,AADE,AADE,iBAAM,EACF,EACO,EACA;;YA3DyD,eAAsB;YAAtB,wCAAsB;YAC1D,cAA4B;YAA5B,yCAA4B;YAU5B,eAAkB;YAAlB,wCAAkB;YAIlB,eAAqB;YAArB,2CAAqB;YAIrB,eAAwB;YAAxB,uDAAwB;YAOtD,eAwBC;YAxBD,uBAwBC;YAED,eAGC;YAHD,mEAGC;;;AA8IA,kCAAkC;IAhN9C,aAAa,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;GAgNrD,kCAAkC,CAiI9C;;iFAjIY,kCAAkC;cA/M9C,SAAS;6BACI,KAAK,YACL,gCAAgC,YAChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmET;;kFAyIQ,kCAAkC","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationRunEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView } from '@memberjunction/core';\n@RegisterClass(BaseResourceComponent, 'CommunicationRunsResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-runs-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"Runs\"\n Icon=\"fa-solid fa-play-circle\"\n Subtitle=\"Bulk communication run history\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadData()\" [disabled]=\"isLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isLoading\"></i> <span class=\"action-btn-label\">Refresh</span>\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n <div class=\"card\">\n <!-- SUMMARY STATS -->\n <div class=\"runs-summary\">\n <div class=\"run-stat-card info\">\n <div class=\"run-stat-value\">{{summary.active}}</div>\n <div class=\"run-stat-label\">Active Runs</div>\n </div>\n <div class=\"run-stat-card success\">\n <div class=\"run-stat-value\">{{summary.completed}}</div>\n <div class=\"run-stat-label\">Completed (24h)</div>\n </div>\n <div class=\"run-stat-card neutral\">\n <div class=\"run-stat-value\">{{summary.successRate}}%</div>\n <div class=\"run-stat-label\">Success Rate</div>\n </div>\n </div>\n \n <!-- TIMELINE -->\n <div class=\"run-timeline\">\n @for (run of runs; track run) {\n <div class=\"run-entry\">\n <div class=\"run-timeline-dot\" [ngClass]=\"getRunDotClass(run.Status)\"></div>\n <div class=\"run-entry-content\">\n <div class=\"run-entry-header\">\n <span class=\"run-entry-title\">Run #{{run.ID.substring(0, 8)}}</span>\n <span class=\"run-status-badge\" [ngClass]=\"getStatusClass(run.Status)\">\n {{run.Status}}\n </span>\n </div>\n <div class=\"run-entry-meta\">\n <span><i class=\"fa-solid fa-user\"></i> {{run.User || 'System'}}</span>\n <span><i class=\"fa-solid fa-clock\"></i> {{run.StartedAt | date:'medium'}}</span>\n @if (run.EndedAt) {\n <span><i class=\"fa-solid fa-flag-checkered\"></i> {{run.EndedAt | date:'shortTime'}}</span>\n }\n </div>\n @if (run.Comments) {\n <div class=\"run-entry-comments\">\n {{run.Comments}}\n </div>\n }\n </div>\n </div>\n }\n \n @if (runs.length === 0 && !isLoading) {\n <mj-empty-state Icon=\"fa-solid fa-play-circle\"\n Title=\"No communication runs found\" />\n }\n </div>\n </div>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n .card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n padding: 16px 0 0;\n }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n .spinning { animation: spin 1s linear infinite; }\n\n /* SUMMARY */\n .runs-summary {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 16px;\n padding: 20px;\n }\n .run-stat-card {\n border-radius: 12px;\n padding: 16px 20px;\n text-align: center;\n }\n .run-stat-card.info {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n .run-stat-card.success {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, transparent);\n }\n .run-stat-card.neutral {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n }\n\n .run-stat-value {\n font-size: 24px; font-weight: 800;\n color: var(--mj-text-primary);\n }\n .run-stat-card.info .run-stat-value { color: var(--mj-brand-primary); }\n .run-stat-card.success .run-stat-value { color: var(--mj-status-success); }\n\n .run-stat-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n }\n\n /* TIMELINE */\n .run-timeline { padding: 8px 20px 20px; }\n .run-entry {\n display: flex; gap: 16px;\n padding: 16px 0;\n border-bottom: 1px solid var(--mj-border-default);\n align-items: flex-start;\n }\n .run-entry:last-child { border-bottom: none; }\n\n .run-timeline-dot {\n width: 12px; height: 12px;\n border-radius: 50%;\n margin-top: 4px; flex-shrink: 0;\n }\n .run-timeline-dot.complete { background: var(--mj-status-success); }\n .run-timeline-dot.failed { background: var(--mj-status-error); }\n .run-timeline-dot.in-progress {\n background: var(--mj-brand-primary);\n animation: pulse-dot 1.5s ease-in-out infinite;\n }\n .run-timeline-dot.pending { background: var(--mj-status-warning); }\n\n @keyframes pulse-dot {\n 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 40%, transparent); }\n 50% { box-shadow: 0 0 0 6px transparent; }\n }\n\n .run-entry-content { flex: 1; }\n .run-entry-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .run-entry-title {\n font-size: 13px; font-weight: 600;\n color: var(--mj-text-primary);\n }\n .run-status-badge {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n }\n .run-status-badge.complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 30%, transparent);\n }\n .run-status-badge.failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n }\n .run-status-badge.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 30%, transparent);\n }\n .run-status-badge.in-progress {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n }\n\n .run-entry-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n display: flex; align-items: center; gap: 12px;\n }\n .run-entry-meta span {\n display: flex; align-items: center; gap: 4px;\n }\n .run-entry-meta i { font-size: 10px; }\n\n .run-entry-comments {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 6px;\n font-style: italic;\n }\n\n /* EMPTY STATE */\n `]\n})\nexport class CommunicationRunsResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public Runs: MJCommunicationRunEntity[] = [];\n\n /** @deprecated Use {@link Runs}. */\n public get runs(): MJCommunicationRunEntity[] {\n return this.Runs;\n }\n /** @deprecated Use {@link Runs}. */\n public set runs(value: MJCommunicationRunEntity[]) {\n this.Runs = value;\n }\n public isLoading = false;\n public Summary = {\n active: 0,\n completed: 0,\n successRate: 0\n };\n\n /** @deprecated Use {@link Summary}. */\n public get summary() {\n return this.Summary;\n }\n /** @deprecated Use {@link Summary}. */\n public set summary(value) {\n this.Summary = value;\n }\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadData();\n this.NotifyLoadComplete();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n public async loadData(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n const yesterdayIso = yesterday.toISOString();\n\n const [runsResult, activeResult, completedResult, failedResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Communication Runs',\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n Fields: ['ID', 'Status', 'Direction', 'StartedAt', 'EndedAt', 'NumMessagesProcessed', 'Comments', 'User'],\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Communication Runs',\n ExtraFilter: `Status = 'In-Progress'`,\n ResultType: 'count_only'\n },\n {\n EntityName: 'MJ: Communication Runs',\n ExtraFilter: `EndedAt >= '${yesterdayIso}' AND Status = 'Complete'`,\n ResultType: 'count_only'\n },\n {\n EntityName: 'MJ: Communication Runs',\n ExtraFilter: `EndedAt >= '${yesterdayIso}' AND Status = 'Failed'`,\n ResultType: 'count_only'\n }\n ]);\n\n if (runsResult.Success) {\n this.Runs = runsResult.Results as MJCommunicationRunEntity[];\n }\n\n if (activeResult.Success) this.Summary.active = activeResult.TotalRowCount;\n if (completedResult.Success) this.Summary.completed = completedResult.TotalRowCount;\n\n const totalCompleted = this.Summary.completed + (failedResult.Success ? failedResult.TotalRowCount : 0);\n this.Summary.successRate = totalCompleted > 0\n ? Math.round((this.Summary.completed / totalCompleted) * 100)\n : 100;\n\n } catch (error) {\n console.error('Error loading runs:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public GetRunDotClass(status: string): string {\n const s = (status || '').toLowerCase();\n if (s === 'complete') return 'complete';\n if (s === 'failed') return 'failed';\n if (s === 'in-progress') return 'in-progress';\n return 'pending';\n }\n\n /** @deprecated Use {@link GetRunDotClass}. */\n public getRunDotClass(status: string): string {\n return this.GetRunDotClass(status);\n }\n\n public GetStatusClass(status: string): string {\n const s = (status || '').toLowerCase();\n if (s === 'complete') return 'complete';\n if (s === 'failed') return 'failed';\n if (s === 'in-progress') return 'in-progress';\n return 'pending';\n }\n\n /** @deprecated Use {@link GetStatusClass}. */\n public getStatusClass(status: string): string {\n return this.GetStatusClass(status);\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Bulk Runs';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-play-circle';\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AfterViewInit, EventEmitter, OnDestroy, TemplateRef } from '@angular/core';
|
|
2
2
|
import type { DashboardUserPermissions, MJDashboardEntity, MJDashboardPartTypeEntity } from '@memberjunction/core-entities';
|
|
3
3
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
4
|
-
import type { DashboardNavRequestEvent, DashboardPanel, DashboardPartDialogMode, DashboardPartDialogResult, DashboardViewerComponent } from '@memberjunction/ng-dashboard-viewer';
|
|
4
|
+
import type { DashboardNavRequestEvent, DashboardPanel, DashboardPartDialogMode, DashboardPartDialogResult, DashboardPropertiesDialogResult, DashboardProperty, DashboardViewerComponent, DashboardWire } from '@memberjunction/ng-dashboard-viewer';
|
|
5
5
|
import type { DashboardEditorBodyStyle, DashboardEditorLoadError, DashboardEditorTitleContext, DashboardSaveOverrides } from './dashboard-editor.types';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
/**
|
|
@@ -85,6 +85,10 @@ export declare class DashboardEditorComponent extends BaseAngularComponent imple
|
|
|
85
85
|
PartDialogMode: DashboardPartDialogMode | null;
|
|
86
86
|
/** The part the part dialog edits in edit mode. */
|
|
87
87
|
EditPartPanel: DashboardPanel | null;
|
|
88
|
+
/** True while the dashboard's Properties and wires dialog is open. */
|
|
89
|
+
PropertiesDialogOpen: boolean;
|
|
90
|
+
/** The dashboard's parts when the Properties and wires dialog opened. */
|
|
91
|
+
PropertiesDialogPanels: DashboardPanel[];
|
|
88
92
|
private _dashboard;
|
|
89
93
|
private viewer;
|
|
90
94
|
private viewerRef;
|
|
@@ -109,6 +113,10 @@ export declare class DashboardEditorComponent extends BaseAngularComponent imple
|
|
|
109
113
|
get CanEdit(): boolean;
|
|
110
114
|
/** The part types the part dialog offers: the viewer's part types. */
|
|
111
115
|
get PartTypes(): MJDashboardPartTypeEntity[];
|
|
116
|
+
/** The dashboard's properties, which the part dialog maps onto a part's inputs. */
|
|
117
|
+
get DashboardProperties(): DashboardProperty[];
|
|
118
|
+
/** The dashboard's wires. */
|
|
119
|
+
get DashboardWires(): DashboardWire[];
|
|
112
120
|
/** True when someone else owns the dashboard and shared it with the user. */
|
|
113
121
|
get IsSharedWithUser(): boolean;
|
|
114
122
|
/** True when the shown dashboard is one of the user's favorites. False when the favorites cannot be read. */
|
|
@@ -225,7 +233,10 @@ export declare class DashboardEditorComponent extends BaseAngularComponent imple
|
|
|
225
233
|
* Returns the message the user sees.
|
|
226
234
|
*/
|
|
227
235
|
private onSaveFailed;
|
|
228
|
-
/**
|
|
236
|
+
/**
|
|
237
|
+
* Why a save failed: the thrown error, else the viewer's refusal (a broken mapping or wire), else the
|
|
238
|
+
* dashboard's failed save result. Empty when none says.
|
|
239
|
+
*/
|
|
229
240
|
private saveFailureReason;
|
|
230
241
|
/** Passes a save of the viewer on to the host, with the new name when it changed. */
|
|
231
242
|
private onViewerSaved;
|
|
@@ -274,6 +285,10 @@ export declare class DashboardEditorComponent extends BaseAngularComponent imple
|
|
|
274
285
|
ClosePartDialog(): void;
|
|
275
286
|
/** Closes every part dialog. A part dialog belongs to one edit session. */
|
|
276
287
|
private closePartDialogs;
|
|
288
|
+
/** Opens the dashboard's Properties and wires dialog. Only while editing and not saving. */
|
|
289
|
+
OpenPropertiesDialog(): void;
|
|
290
|
+
/** Applies the dialog's properties and wires to the viewer. They are saved with the dashboard's Save. */
|
|
291
|
+
OnPropertiesDialogSaved(result: DashboardPropertiesDialogResult): Promise<void>;
|
|
277
292
|
/**
|
|
278
293
|
* Asks the user to confirm removing a part, then removes it. Changes nothing when the user cancels, or when the
|
|
279
294
|
* edit session, the viewer or the part changed while the confirm was open.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-editor.component.d.ts","sourceRoot":"","sources":["../../src/DashboardEditor/dashboard-editor.component.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EAA0D,YAAY,EAC5E,SAAS,EAAU,WAAW,EACxC,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE5H,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAKrE,OAAO,KAAK,EACR,wBAAwB,EAAE,cAAc,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"dashboard-editor.component.d.ts","sourceRoot":"","sources":["../../src/DashboardEditor/dashboard-editor.component.ts"],"names":[],"mappings":"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"}
|