@memberjunction/ng-dashboards 6.2.0-edge.6 → 6.2.0-edge.8
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 +23 -16
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +2 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js +3 -1
- package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +1 -1
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js +3 -3
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +6 -4
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-session-data.js +8 -2
- package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +31 -10
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +1 -1
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -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 +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +14 -24
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +14 -7
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +4 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/Actions/action-result-code.d.ts +80 -0
- package/dist/Actions/action-result-code.d.ts.map +1 -0
- package/dist/Actions/action-result-code.js +163 -0
- package/dist/Actions/action-result-code.js.map +1 -0
- package/dist/Actions/components/actions-overview.component.d.ts +8 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +12 -9
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +29 -9
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +65 -42
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +5 -4
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +92 -130
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +189 -274
- package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -1
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts +29 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js +666 -0
- package/dist/ChiefOfStaff/chief-of-staff-approvals.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts +56 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js +515 -0
- package/dist/ChiefOfStaff/chief-of-staff-governance.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts +14 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js +39 -0
- package/dist/ChiefOfStaff/chief-of-staff-live-refresh.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts +17 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js +485 -0
- package/dist/ChiefOfStaff/chief-of-staff-overview.component.js.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts +139 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.d.ts.map +1 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js +602 -0
- package/dist/ChiefOfStaff/chief-of-staff-page-base.js.map +1 -0
- package/dist/ChiefOfStaff/index.d.ts +4 -1
- package/dist/ChiefOfStaff/index.d.ts.map +1 -1
- package/dist/ChiefOfStaff/index.js +4 -1
- package/dist/ChiefOfStaff/index.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +3 -3
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +3 -3
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.d.ts.map +1 -1
- package/dist/ComponentStudio/services/component-version.service.js +3 -0
- package/dist/ComponentStudio/services/component-version.service.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +21 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +32 -5
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +2 -2
- package/dist/DevTools/lazy-module-status.component.js +2 -2
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +5 -0
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -2
- package/dist/Integration/services/integration-data.service.d.ts +1 -1
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +4 -3
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +11 -3
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +16 -16
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts +113 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js +1184 -0
- package/dist/KnowledgeHub/components/visualize/semantic-graph/semantic-graph-explorer.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-agent-context.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +21 -10
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
- package/dist/LoginStudio/login-studio-resource.component.js +1 -0
- package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-experiments.component.js +1 -0
- package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +2 -2
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +3 -0
- package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js +1 -0
- package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +1 -0
- package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +26 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +375 -252
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts +8 -1
- package/dist/UserRoutines/user-routines-resource.component.d.ts.map +1 -1
- package/dist/UserRoutines/user-routines-resource.component.js +22 -4
- package/dist/UserRoutines/user-routines-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +1 -0
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts +162 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js +1105 -0
- package/dist/VideoStudio/components/vs-archetype-editor.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts +27 -0
- package/dist/VideoStudio/components/vs-audio-options.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js +119 -0
- package/dist/VideoStudio/components/vs-audio-options.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts +105 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js +560 -0
- package/dist/VideoStudio/components/vs-copilot-panel.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts +163 -0
- package/dist/VideoStudio/components/vs-production-brief.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js +1054 -0
- package/dist/VideoStudio/components/vs-production-brief.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts +43 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js +412 -0
- package/dist/VideoStudio/components/vs-setup-health-card.component.js.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts +73 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.d.ts.map +1 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js +271 -0
- package/dist/VideoStudio/components/vs-studio-slide-in.component.js.map +1 -0
- package/dist/VideoStudio/index.d.ts +12 -0
- package/dist/VideoStudio/index.d.ts.map +1 -0
- package/dist/VideoStudio/index.js +12 -0
- package/dist/VideoStudio/index.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts +118 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js +964 -0
- package/dist/VideoStudio/resources/video-studio-archetypes-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts +70 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js +600 -0
- package/dist/VideoStudio/resources/video-studio-brand-kits-resource.component.js.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts +182 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.d.ts.map +1 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js +1481 -0
- package/dist/VideoStudio/resources/video-studio-productions-resource.component.js.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts +102 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.d.ts.map +1 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js +240 -0
- package/dist/VideoStudio/services/vs-studio-slide-in-state.service.js.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts +495 -0
- package/dist/VideoStudio/video-studio-agent-context.d.ts.map +1 -0
- package/dist/VideoStudio/video-studio-agent-context.js +992 -0
- package/dist/VideoStudio/video-studio-agent-context.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +46 -41
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +33 -7
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +13 -12
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +8 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +10 -2
- package/dist/public-api.js.map +1 -1
- package/dist/shared/action-scheduled-job.d.ts.map +1 -1
- package/dist/shared/action-scheduled-job.js +2 -0
- package/dist/shared/action-scheduled-job.js.map +1 -1
- package/dist/video-studio-dashboards.module.d.ts +40 -0
- package/dist/video-studio-dashboards.module.d.ts.map +1 -0
- package/dist/video-studio-dashboards.module.js +159 -0
- package/dist/video-studio-dashboards.module.js.map +1 -0
- package/package.json +78 -71
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +0 -195
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +0 -1
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +0 -2910
- package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chief-of-staff-page-base.js","sourceRoot":"","sources":["../../src/ChiefOfStaff/chief-of-staff-page-base.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Directive, OnDestroy, OnInit, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime, filter, takeUntil } from 'rxjs/operators';\nimport { CompositeKey, LogError, RunView, RunViewParams } from '@memberjunction/core';\nimport {\n MJAIAgentRequestEntity,\n MJAIAgentUserPolicyEntity,\n MJConversationEntity,\n MJEnvironmentEntityExtended,\n MJUserRoutineEntity,\n ResourceData,\n} from '@memberjunction/core-entities';\nimport { UUIDMap, MJGlobal, EscapeSQLString } from '@memberjunction/global';\nimport { ActionParam } from '@memberjunction/actions-base';\nimport { GraphQLActionClient, GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AgentRequestPanelResult } from '@memberjunction/ng-agent-requests';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport {\n BuildChiefOfStaffAgentContext,\n BuildChiefOfStaffScopeFilters,\n BuildGovernanceSummary,\n BuildPolicyDraftFromEntity,\n CalculateChiefOfStaffMetrics,\n CHIEF_OF_STAFF_AGENT_NAME,\n CHIEF_OF_STAFF_APP_NAME,\n CHIEF_OF_STAFF_PAGE_ICONS,\n CHIEF_OF_STAFF_PAGE_LABELS,\n CHIEF_OF_STAFF_PAGES,\n ChiefOfStaffDisplayName,\n ChiefOfStaffMetrics,\n ChiefOfStaffPage,\n FormatEmailDraftForClipboard,\n GovernancePolicyDraft,\n IsApprovalRequest,\n IsSpentOneShotRoutine,\n ParseEmailApprovalPayload,\n RequestSummaryItem,\n RoutineDisplayStatus,\n RoutineSummaryItem,\n SortRoutinesForDisplay,\n ValidateChiefOfStaffPageParam,\n type EmailApprovalDraft,\n type RoutineDisplayStatusValue,\n} from './chief-of-staff-agent-context';\nimport { IsChiefOfStaffEntityChange } from './chief-of-staff-live-refresh';\n\n/** A client tool a Chief of Staff page registers for the co-agent. */\nexport interface ChiefOfStaffClientTool {\n Name: string;\n Description: string;\n ParameterSchema: Record<string, unknown>;\n Handler: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Shared base of the Chief of Staff application's pages. Each page is its own nav item\n * (Overview, Approvals & Wakes, Governance) and its own resource component; this class holds\n * what they share: the user's policy, wake routines and approval requests, the request and\n * routine actions, the briefing reader, live reload and the agent context.\n *\n * Other apps add pages to the Chief of Staff application as nav items, through `NavItem.*`\n * application settings; they do not extend this class.\n */\n@Directive()\nexport abstract class BaseChiefOfStaffPage extends BaseResourceComponent implements OnInit, OnDestroy {\n protected cdr = inject(ChangeDetectorRef);\n protected appManager = inject(ApplicationManager);\n protected override destroy$ = new Subject<void>();\n\n /** Which page this component is. */\n protected abstract readonly Page: ChiefOfStaffPage;\n\n public IsLoading = true;\n public BusyRequestID: string | null = null;\n public BusyRoutineID: string | null = null;\n public FeedbackBanner: { Type: 'success' | 'error'; Message: string } | null = null;\n\n /** Filters requests and routines on pages that show a search box. */\n public SearchText = '';\n\n public PolicyEntity: MJAIAgentUserPolicyEntity | null = null;\n /** The policy as the pages show it; the Governance page edits it. */\n public DraftPolicy: GovernancePolicyDraft = BuildPolicyDraftFromEntity(null);\n\n public Routines: MJUserRoutineEntity[] = [];\n public Requests: MJAIAgentRequestEntity[] = [];\n public Metrics: ChiefOfStaffMetrics = CalculateChiefOfStaffMetrics([], []);\n\n public SelectedRequest: MJAIAgentRequestEntity | null = null;\n public ShowRequestDialog = false;\n\n // ── Briefing reader: a wake routine's conversation, read without leaving the page ────\n /** The routine whose briefings the reader shows; null while the reader is closed. */\n public BriefingRoutine: MJUserRoutineEntity | null = null;\n /** The routine's conversation ID, bound to the embedded chat area. */\n public BriefingConversationId: string | null = null;\n /** The conversation entity when it could be loaded (title, pinned agent); the chat area loads messages by ID either way. */\n public BriefingConversation: MJConversationEntity | null = null;\n\n /** Resolved once per load from the agent's metadata name; null until LoadChiefOfStaffData has run. */\n protected chiefOfStaffAgentId: string | null = null;\n\n public get ChiefOfStaffDisplayName(): string {\n return ChiefOfStaffDisplayName(this.DraftPolicy);\n }\n\n /** Approval requests awaiting a decision, filtered by the search text. */\n public get PendingRequests(): MJAIAgentRequestEntity[] {\n const search = this.SearchText.trim().toLowerCase();\n return this.Requests.filter((r) => {\n if (r.Status !== 'Requested' || !IsApprovalRequest(r)) {\n return false;\n }\n if (!search) {\n return true;\n }\n return (r.Request ?? '').toLowerCase().includes(search);\n });\n }\n\n /** Routines in display order: next wake first, unscheduled next, spent one-shots last. */\n public get SortedRoutines(): MJUserRoutineEntity[] {\n return SortRoutinesForDisplay(this.Routines);\n }\n\n /** Routines that still have something ahead of them: everything but spent one-shots. */\n public get UpcomingRoutines(): MJUserRoutineEntity[] {\n return this.SortedRoutines.filter((r) => !IsSpentOneShotRoutine(r));\n }\n\n /** 'Fired' for a spent one-shot, otherwise the routine's Status. */\n public RoutineStatusLabel(routine: MJUserRoutineEntity): RoutineDisplayStatusValue {\n return RoutineDisplayStatus(routine);\n }\n\n public IsSpentRoutine(routine: MJUserRoutineEntity): boolean {\n return IsSpentOneShotRoutine(routine);\n }\n\n async ngOnInit(): Promise<void> {\n super.ngOnInit();\n this.OnPageInit();\n\n await this.LoadChiefOfStaffData();\n this.navigationService.SetAgentClientTools(this, [...this.coreAgentTools(), ...this.PageAgentTools()]);\n\n this.navigationService.ResourceReattached$.pipe(\n filter((c) => c === this),\n takeUntil(this.destroy$),\n ).subscribe(() => this.publishAgentContext());\n this.subscribeToLiveEntityChanges();\n\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return CHIEF_OF_STAFF_PAGE_LABELS[this.Page];\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return CHIEF_OF_STAFF_PAGE_ICONS[this.Page];\n }\n\n /** Runs before the first load; a page reads its query params here. */\n protected OnPageInit(): void {\n // default: nothing\n }\n\n /** Runs after every load, before the agent context is published. */\n protected OnDataLoaded(): void {\n // default: nothing\n }\n\n /** Client tools only this page offers, added to the shared ones. */\n protected PageAgentTools(): ChiefOfStaffClientTool[] {\n return [];\n }\n\n /** A change arrived while the tab was detached; reload once when it is shown again. */\n private liveReloadPending = false;\n\n /**\n * Reloads the page when an entity it shows changes anywhere. MJAPI broadcasts every save\n * and delete to browsers, including saves made by server-side code (a wake run creating an\n * approval request or a run row), and the client raises each as a `remote-invalidate`\n * BaseEntity event. A burst of events is one reload. A detached tab does not reload in the\n * background; it reloads once when it is shown again.\n */\n private subscribeToLiveEntityChanges(): void {\n MJGlobal.Instance.GetEventListener(false).pipe(\n filter((event) => IsChiefOfStaffEntityChange(event)),\n debounceTime(750),\n takeUntil(this.destroy$),\n ).subscribe(() => {\n if (this.navigationService.IsResourceDetached(this)) {\n this.liveReloadPending = true;\n return;\n }\n void this.LoadChiefOfStaffData();\n });\n\n this.navigationService.ResourceReattached$.pipe(\n filter((c) => c === this && this.liveReloadPending),\n takeUntil(this.destroy$),\n ).subscribe(() => {\n this.liveReloadPending = false;\n void this.LoadChiefOfStaffData();\n });\n }\n\n public async LoadChiefOfStaffData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const currentUserId = this.ProviderToUse.CurrentUser?.ID;\n if (!currentUserId) {\n // Every query is user-scoped; without a user there is nothing safe to show.\n this.showBanner('error', 'No signed-in user is available; the Chief of Staff cannot load.');\n return;\n }\n\n const chiefOfStaffAgentId = await this.resolveChiefOfStaffAgentId();\n if (!chiefOfStaffAgentId) {\n this.showBanner('error', `The \"${CHIEF_OF_STAFF_AGENT_NAME}\" agent is not installed in this environment.`);\n return;\n }\n this.chiefOfStaffAgentId = chiefOfStaffAgentId;\n\n const scope = BuildChiefOfStaffScopeFilters(currentUserId, chiefOfStaffAgentId);\n\n const viewParams: RunViewParams[] = [\n {\n EntityName: 'MJ: AI Agent User Policies',\n ExtraFilter: scope.Policy,\n OrderBy: '__mj_UpdatedAt DESC',\n ResultType: 'entity_object',\n },\n {\n EntityName: 'MJ: User Routines',\n ExtraFilter: scope.Routines,\n OrderBy: 'NextRunAt ASC, Name ASC',\n ResultType: 'entity_object',\n },\n {\n EntityName: 'MJ: AI Agent Requests',\n ExtraFilter: scope.Requests,\n OrderBy: 'Priority DESC, RequestedAt DESC',\n MaxRows: 100,\n ResultType: 'entity_object',\n },\n ];\n\n const [policyRes, routineRes, requestRes] = await rv.RunViews(viewParams);\n\n const policies = policyRes?.Success\n ? (policyRes.Results as MJAIAgentUserPolicyEntity[])\n : [];\n this.PolicyEntity = policies.length > 0 ? policies[0] : null;\n this.DraftPolicy = BuildPolicyDraftFromEntity(this.PolicyEntity);\n\n this.Routines = routineRes?.Success\n ? (routineRes.Results as MJUserRoutineEntity[])\n : [];\n\n this.emailDraftsByRequest.Clear();\n this.Requests = requestRes?.Success\n ? (requestRes.Results as MJAIAgentRequestEntity[])\n : [];\n\n this.recalculateMetrics();\n this.OnDataLoaded();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.showBanner('error', `Failed to load Chief of Staff data: ${msg}`);\n } finally {\n this.IsLoading = false;\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n }\n\n protected recalculateMetrics(): void {\n this.Metrics = CalculateChiefOfStaffMetrics(\n this.Routines.map((r) => this.toRoutineSummary(r)),\n this.Requests.map((r) => this.toRequestSummary(r)),\n );\n }\n\n private toRoutineSummary(r: MJUserRoutineEntity): RoutineSummaryItem {\n return {\n ID: r.ID,\n Name: r.Name,\n Status: r.Status,\n ScheduleMode: r.ScheduleMode,\n CronExpression: r.CronExpression,\n NextRunAt: r.NextRunAt,\n LastRunAt: r.LastRunAt,\n LastRunStatus: r.LastRunStatus,\n };\n }\n\n private toRequestSummary(req: MJAIAgentRequestEntity): RequestSummaryItem {\n return {\n ID: req.ID,\n Request: req.Request,\n Status: req.Status,\n Priority: req.Priority,\n RequestedAt: req.RequestedAt,\n ExpiresAt: req.ExpiresAt,\n RequestType: req.RequestType,\n RequestTypeID: req.RequestTypeID,\n };\n }\n\n /**\n * Looks the Chief of Staff agent up by name through the AI engine's cached agents, so the\n * pages carry no hardcoded agent id and follow whichever provider they are embedded under.\n */\n private async resolveChiefOfStaffAgentId(): Promise<string | null> {\n const engine = <AIEngineBase>AIEngineBase.GetProviderInstance(this.ProviderToUse, AIEngineBase);\n await engine.EnsureLoaded(this.ProviderToUse.CurrentUser, this.ProviderToUse);\n const agent = engine.GetAgentByName(CHIEF_OF_STAFF_AGENT_NAME);\n return agent?.ID ?? null;\n }\n\n private readonly actionIdsByName = new Map<string, string>();\n /** The ID of a core action, looked up by name once per page instance. */\n private async resolveActionIdByName(actionName: string): Promise<string | null> {\n const cached = this.actionIdsByName.get(actionName);\n if (cached) {\n return cached;\n }\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Actions',\n ExtraFilter: `Name = '${EscapeSQLString(actionName)}'`,\n Fields: ['ID'],\n MaxRows: 1,\n SkipTotalRowCount: true,\n ResultType: 'simple',\n });\n if (result.Success && result.Results && result.Results.length > 0) {\n this.actionIdsByName.set(actionName, result.Results[0].ID);\n return result.Results[0].ID;\n }\n return null;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n LogError(`Chief of Staff: failed to resolve '${actionName}' action: ${msg}`);\n return null;\n }\n }\n\n // =========================================================================\n // Navigation between the Chief of Staff pages\n // =========================================================================\n\n /** Opens another Chief of Staff page through its nav item. */\n public OpenPage(page: ChiefOfStaffPage): void {\n const app = this.appManager.GetAppByName(CHIEF_OF_STAFF_APP_NAME);\n void this.navigationService.OpenNavItemByName(CHIEF_OF_STAFF_PAGE_LABELS[page], undefined, app?.ID);\n }\n\n // =========================================================================\n // Briefings: where a wake routine's replies live\n // =========================================================================\n //\n // A wake writes its reply into the routine's own conversation, which is application-scoped\n // and therefore never in the chat sidebar. The conversation is created on the routine's first\n // run, so a routine that has not run yet has nothing to open.\n\n /** True when the routine has run at least once and so has a conversation to read. */\n public CanOpenBriefing(routine: MJUserRoutineEntity): boolean {\n return !!routine.ConversationID;\n }\n\n /**\n * Opens the routine's conversation in the Chat app. The ID goes in the query params as well\n * as the nav item configuration: an already-open Chat tab is reused and reacts only to a\n * query-param change.\n */\n public OpenRoutineBriefing(routine: MJUserRoutineEntity, event?: Event): void {\n event?.stopPropagation();\n const conversationId = routine.ConversationID;\n if (!conversationId) {\n return;\n }\n const chatApp = this.appManager.GetAppByName('Chat');\n if (!chatApp) {\n MJNotificationService.Instance.CreateSimpleNotification('The Chat app is not installed, so this briefing cannot be opened there', 'error', 4000);\n return;\n }\n void this.navigationService.OpenNavItemByName(\n 'Conversations',\n { conversationId },\n chatApp.ID,\n { queryParams: { conversationId } },\n );\n }\n\n /** Opens the slide-in reader on the routine's conversation without leaving the page. */\n public async OpenBriefingReader(routine: MJUserRoutineEntity, event?: Event): Promise<void> {\n event?.stopPropagation();\n const conversationId = routine.ConversationID;\n if (!conversationId) {\n return;\n }\n this.BriefingRoutine = routine;\n this.BriefingConversationId = conversationId;\n this.BriefingConversation = await this.loadBriefingConversation(conversationId);\n this.cdr.markForCheck();\n }\n\n public CloseBriefingReader(): void {\n this.BriefingRoutine = null;\n this.BriefingConversationId = null;\n this.BriefingConversation = null;\n this.cdr.markForCheck();\n }\n\n public get IsBriefingReaderOpen(): boolean {\n return this.BriefingConversationId != null;\n }\n\n /** The environment the embedded chat area reads under. */\n public get BriefingEnvironmentId(): string {\n return this.BriefingConversation?.EnvironmentID ?? MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /** The application the routine conversation is filed under, so the chat area stays in that scope. */\n public get BriefingApplicationId(): string | null {\n return this.BriefingConversation?.ApplicationID ?? null;\n }\n\n /** The conversation entity, or null when it cannot be read; the reader still works by ID. */\n private async loadBriefingConversation(conversationId: string): Promise<MJConversationEntity | null> {\n const p = this.ProviderToUse;\n const conversation = await p.GetEntityObject<MJConversationEntity>('MJ: Conversations', p.CurrentUser);\n return await conversation.Load(conversationId) ? conversation : null;\n }\n\n public OpenRoutineEntityRecord(routineId: string, event?: Event): void {\n event?.stopPropagation();\n this.navigationService.OpenEntityRecord(\n 'MJ: User Routines',\n CompositeKey.FromID(routineId),\n );\n }\n\n // =========================================================================\n // Approvals & Requests Actions\n // =========================================================================\n\n public OpenRequestDetail(request: MJAIAgentRequestEntity): void {\n this.SelectedRequest = request;\n this.ShowRequestDialog = true;\n this.cdr.markForCheck();\n }\n\n private readonly emailDraftsByRequest = new UUIDMap<EmailApprovalDraft | null>();\n\n /** The outbound email an approval request carries, or null when the request is not an email. */\n public EmailDraftFor(request: MJAIAgentRequestEntity): EmailApprovalDraft | null {\n const cached = this.emailDraftsByRequest.Get(request.ID);\n if (cached !== undefined) {\n return cached;\n }\n const draft = ParseEmailApprovalPayload(request.Comments);\n this.emailDraftsByRequest.Set(request.ID, draft);\n return draft;\n }\n\n /** Copies the draft as plain text (headers, blank line, body) for pasting into a mail client. */\n public async CopyEmailDraft(request: MJAIAgentRequestEntity, event?: Event): Promise<void> {\n event?.stopPropagation();\n const draft = this.EmailDraftFor(request);\n if (!draft) {\n return;\n }\n const text = FormatEmailDraftForClipboard(draft);\n try {\n await navigator.clipboard.writeText(text);\n this.showBanner('success', `Copied the email to ${draft.To} to the clipboard.`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.showBanner('error', `Could not copy to the clipboard: ${msg}`);\n }\n }\n\n public OnRequestDialogClose(result: AgentRequestPanelResult): void {\n this.ShowRequestDialog = false;\n this.SelectedRequest = null;\n if (result.Success) {\n void this.LoadChiefOfStaffData();\n } else {\n this.cdr.markForCheck();\n }\n }\n\n public async QuickRespondToRequest(\n request: MJAIAgentRequestEntity,\n decision: 'Approved' | 'Rejected',\n event: Event,\n ): Promise<void> {\n event.stopPropagation();\n if (this.BusyRequestID) {\n return;\n }\n this.BusyRequestID = request.ID;\n this.cdr.markForCheck();\n\n try {\n const currentUserId = this.ProviderToUse.CurrentUser?.ID ?? null;\n request.Status = decision;\n request.RespondedAt = new Date();\n request.ResponseSource = 'Dashboard';\n if (currentUserId) {\n request.ResponseByUserID = currentUserId;\n }\n request.Response = `${decision} via the Chief of Staff app`;\n\n const saved = await request.Save();\n if (saved) {\n this.showBanner('success', `Request marked as ${decision}.`);\n this.recalculateMetrics();\n this.publishAgentContext();\n } else {\n const errText =\n request.LatestResult?.CompleteMessage ?? 'Failed to save request decision.';\n this.showBanner('error', errText);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.showBanner('error', `Failed to update request: ${msg}`);\n } finally {\n this.BusyRequestID = null;\n this.cdr.markForCheck();\n }\n }\n\n // =========================================================================\n // Wake Routines Actions\n // =========================================================================\n\n public async TriggerWakeNow(routine: MJUserRoutineEntity, event?: Event): Promise<void> {\n event?.stopPropagation();\n if (this.BusyRoutineID) {\n return;\n }\n this.BusyRoutineID = routine.ID;\n this.cdr.markForCheck();\n\n try {\n // Run the routine out of schedule. Setting NextRunAt to now would make the dispatcher\n // CLAIM it, and a claimed one-shot (a reminder) is spent: it fires now and never again.\n // The action runs it without touching the schedule; the run row and the routine's\n // conversation then update through the live refresh.\n const actionId = await this.resolveActionIdByName('Run User Routine Now');\n if (!actionId) {\n this.showBanner('error', \"The 'Run User Routine Now' action is not installed; push metadata/actions and restart MJAPI.\");\n return;\n }\n const actionClient = new GraphQLActionClient(this.ProviderToUse as GraphQLDataProvider);\n const result = await actionClient.RunAction(actionId, [\n { Name: 'RoutineID', Value: routine.ID, Type: 'Input' } as ActionParam,\n ]);\n if (result.Success) {\n const keeps = routine.NextRunAt ? ' Its scheduled wake is unchanged.' : '';\n this.showBanner('success', `Running \"${routine.Name}\" now. The result lands in its conversation and a notification.${keeps}`);\n } else {\n this.showBanner('error', result.Message || `Could not run \"${routine.Name}\".`);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.showBanner('error', `Failed to trigger wake: ${msg}`);\n } finally {\n this.BusyRoutineID = null;\n this.cdr.markForCheck();\n }\n }\n\n public async ToggleRoutineStatus(routine: MJUserRoutineEntity, event?: Event): Promise<void> {\n event?.stopPropagation();\n if (this.BusyRoutineID) {\n return;\n }\n this.BusyRoutineID = routine.ID;\n this.cdr.markForCheck();\n\n try {\n const nextStatus: MJUserRoutineEntity['Status'] =\n routine.Status === 'Active' ? 'Paused' : 'Active';\n routine.Status = nextStatus;\n const saved = await routine.Save();\n if (saved) {\n this.showBanner(\n 'success',\n `Routine \"${routine.Name}\" is now ${nextStatus}.`,\n );\n this.recalculateMetrics();\n this.publishAgentContext();\n } else {\n const errText =\n routine.LatestResult?.CompleteMessage ?? 'Failed to update routine status.';\n this.showBanner('error', errText);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.showBanner('error', `Failed to update routine: ${msg}`);\n } finally {\n this.BusyRoutineID = null;\n this.cdr.markForCheck();\n }\n }\n\n // =========================================================================\n // Banner\n // =========================================================================\n\n public DismissBanner(): void {\n this.FeedbackBanner = null;\n this.cdr.markForCheck();\n }\n\n protected showBanner(type: 'success' | 'error', message: string): void {\n this.FeedbackBanner = { Type: type, Message: message };\n this.cdr.markForCheck();\n }\n\n // =========================================================================\n // UI Formatting Helpers\n // =========================================================================\n\n public GetPriorityTierLabel(priority: number): string {\n if (priority >= 76) return 'Critical';\n if (priority >= 51) return 'High';\n if (priority >= 26) return 'Normal';\n return 'Low';\n }\n\n public GetPriorityTierClass(priority: number): string {\n if (priority >= 76) return 'priority-critical';\n if (priority >= 51) return 'priority-high';\n if (priority >= 26) return 'priority-normal';\n return 'priority-low';\n }\n\n public IsRequestExpired(request: MJAIAgentRequestEntity): boolean {\n if (!request.ExpiresAt) return false;\n const expires =\n request.ExpiresAt instanceof Date ? request.ExpiresAt : new Date(request.ExpiresAt);\n return expires.getTime() < Date.now();\n }\n\n // =========================================================================\n // Agent Context & Client Tools\n // =========================================================================\n\n protected publishAgentContext(): void {\n if (this.navigationService.IsResourceDetached(this)) {\n return;\n }\n const context = BuildChiefOfStaffAgentContext({\n Page: this.Page,\n SearchText: this.SearchText,\n Metrics: this.Metrics,\n Governance: BuildGovernanceSummary(this.DraftPolicy, this.PolicyEntity !== null),\n Routines: this.Routines.map((r) => this.toRoutineSummary(r)),\n PendingRequests: this.PendingRequests.map((r) => this.toRequestSummary(r)),\n });\n this.navigationService.SetAgentContext(this, context);\n }\n\n private coreAgentTools(): ChiefOfStaffClientTool[] {\n return [\n {\n Name: 'OpenChiefOfStaffPage',\n Description:\n \"Open one of the Chief of Staff app's pages: 'overview', 'approvals-wakes' or 'governance'.\",\n ParameterSchema: {\n type: 'object',\n properties: {\n page: {\n type: 'string',\n enum: [...CHIEF_OF_STAFF_PAGES],\n description: 'Target page',\n },\n },\n required: ['page'],\n },\n Handler: async (params) => {\n const check = ValidateChiefOfStaffPageParam(params['page'] as string | undefined);\n if (!check.ok) {\n return check.result;\n }\n this.OpenPage(check.value);\n return { Success: true, Data: { Page: check.value } };\n },\n },\n {\n Name: 'RefreshChiefOfStaff',\n Description:\n 'Reload pending approvals, wake routines and the governance policy from the server.',\n ParameterSchema: {\n type: 'object',\n properties: {},\n },\n Handler: async () => {\n await this.LoadChiefOfStaffData();\n return {\n Success: true,\n Data: {\n PendingApprovalCount: this.Metrics.PendingApprovalCount,\n ActiveWakeRoutineCount: this.Metrics.ActiveWakeRoutineCount,\n },\n };\n },\n },\n ];\n }\n}\n"]}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export * from './chief-of-staff-agent-context';
|
|
2
|
-
export * from './chief-of-staff-
|
|
2
|
+
export * from './chief-of-staff-page-base';
|
|
3
|
+
export * from './chief-of-staff-overview.component';
|
|
4
|
+
export * from './chief-of-staff-approvals.component';
|
|
5
|
+
export * from './chief-of-staff-governance.component';
|
|
3
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ChiefOfStaff/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ChiefOfStaff/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
export * from './chief-of-staff-agent-context';
|
|
2
|
-
export * from './chief-of-staff-
|
|
2
|
+
export * from './chief-of-staff-page-base';
|
|
3
|
+
export * from './chief-of-staff-overview.component';
|
|
4
|
+
export * from './chief-of-staff-approvals.component';
|
|
5
|
+
export * from './chief-of-staff-governance.component';
|
|
3
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ChiefOfStaff/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC","sourcesContent":["export * from './chief-of-staff-agent-context';\nexport * from './chief-of-staff-
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ChiefOfStaff/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC","sourcesContent":["export * from './chief-of-staff-agent-context';\nexport * from './chief-of-staff-page-base';\nexport * from './chief-of-staff-overview.component';\nexport * from './chief-of-staff-approvals.component';\nexport * from './chief-of-staff-governance.component';\n"]}
|
|
@@ -248,11 +248,11 @@ let CommunicationMonitorResourceComponent = class CommunicationMonitorResourceCo
|
|
|
248
248
|
}
|
|
249
249
|
]);
|
|
250
250
|
if (totalResult.Success)
|
|
251
|
-
this.Stats.totalSent = totalResult.TotalRowCount;
|
|
251
|
+
this.Stats.totalSent = totalResult.TotalRowCount ?? 0;
|
|
252
252
|
if (failedResult.Success)
|
|
253
|
-
this.Stats.failed = failedResult.TotalRowCount;
|
|
253
|
+
this.Stats.failed = failedResult.TotalRowCount ?? 0;
|
|
254
254
|
if (pendingResult.Success)
|
|
255
|
-
this.Stats.pending = pendingResult.TotalRowCount;
|
|
255
|
+
this.Stats.pending = pendingResult.TotalRowCount ?? 0;
|
|
256
256
|
this.Stats.deliveryRate = this.Stats.totalSent > 0
|
|
257
257
|
? parseFloat(((this.Stats.totalSent - this.Stats.failed) / this.Stats.totalSent * 100).toFixed(1))
|
|
258
258
|
: 100;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication-monitor-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-monitor-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationLogEntity, MJCommunicationProviderEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView } from '@memberjunction/core';\n\ninterface ProviderHealth {\n Name: string;\n Type: string;\n SentCount: number;\n SuccessRate: number;\n IsActive: boolean;\n IconClass: string;\n ColorClass: string;\n}\n\ninterface ChannelBreakdown {\n Name: string;\n IconClass: string;\n Count: number;\n Percentage: number;\n ColorClass: string;\n}\n\ninterface HourlyBucket {\n timestamp: Date;\n executions: number;\n errors: number;\n cost: number;\n tokens: number;\n avgTime: number;\n}\n@RegisterClass(BaseResourceComponent, 'CommunicationMonitorResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-monitor-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"Monitor\"\n Icon=\"fa-solid fa-chart-line\"\n Subtitle=\"Live delivery health, provider status, and channel breakdown\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadData()\" [disabled]=\"isLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isLoading\"></i> <span class=\"action-btn-label\">Refresh</span>\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n <!-- KPI STRIP -->\n <div class=\"kpi-strip\">\n <div class=\"kpi-card sent\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-paper-plane\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Total Sent</span>\n <span class=\"kpi-value\">{{stats.totalSent | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.totalSent > 0 ? 'up' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.totalSent > 0\" [class.fa-minus]=\"stats.totalSent === 0\"></i>\n Last 24 hours\n </span>\n </div>\n </div>\n <div class=\"kpi-card delivered\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-check-double\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Delivery Rate</span>\n <span class=\"kpi-value\">{{stats.deliveryRate}}%</span>\n <div class=\"delivery-bar\">\n <div class=\"delivery-fill\" [style.width.%]=\"stats.deliveryRate\"></div>\n </div>\n </div>\n </div>\n <div class=\"kpi-card pending\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-clock\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Pending</span>\n <span class=\"kpi-value\">{{stats.pending | number}}</span>\n <span class=\"kpi-delta neutral\">\n <i class=\"fa-solid fa-minus\"></i> Awaiting provider\n </span>\n </div>\n </div>\n <div class=\"kpi-card failed\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-circle-exclamation\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Failed</span>\n <span class=\"kpi-value\">{{stats.failed | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.failed > 0 ? 'down' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.failed > 0\" [class.fa-minus]=\"stats.failed === 0\"></i>\n {{stats.failed > 0 ? 'Requires attention' : 'No failures'}}\n </span>\n </div>\n </div>\n </div>\n \n <!-- CHARTS + ACTIVITY ROW -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Delivery Volume</h3>\n </div>\n <div class=\"chart-container-inner\">\n <app-time-series-chart\n [data]=\"chartData\"\n [showLegend]=\"true\"\n [showControls]=\"false\"\n [config]=\"chartConfig\">\n </app-time-series-chart>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-bolt\"></i> Recent Activity</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"activity-feed\">\n @for (log of recentLogs; track log) {\n <div class=\"activity-item\">\n <div class=\"activity-icon\" [ngClass]=\"getActivityIconClass(log)\">\n <i [class]=\"getActivityIcon(log)\"></i>\n </div>\n <div class=\"activity-body\">\n <span class=\"activity-title\">{{log.CommunicationProviderMessageType || 'Message'}}</span>\n <span class=\"activity-meta\">{{log.CommunicationProvider}} • {{log.MessageDate | date:'shortTime'}}</span>\n </div>\n <span class=\"activity-status\" [ngClass]=\"log.Status.toLowerCase()\">\n {{log.Status}}\n </span>\n </div>\n }\n @if (recentLogs.length === 0) {\n <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-inbox\"\n Title=\"No recent activity\" />\n }\n </div>\n </div>\n </div>\n </div>\n \n <!-- PROVIDER HEALTH + CHANNEL BREAKDOWN -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Provider Health</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"provider-health-list\">\n @for (provider of providerHealth; track provider) {\n <div class=\"provider-row\">\n <div class=\"provider-status-dot\" [class.active]=\"provider.IsActive\"></div>\n <div class=\"provider-logo\" [ngClass]=\"provider.ColorClass\">\n <i [class]=\"provider.IconClass\"></i>\n </div>\n <div class=\"provider-info\">\n <div class=\"provider-name\">{{provider.Name}}</div>\n <div class=\"provider-type\">{{provider.Type}} • {{provider.SentCount}} sent today</div>\n </div>\n <div class=\"provider-health-bar\">\n <div class=\"provider-health-fill\" [ngClass]=\"getHealthClass(provider.SuccessRate)\" [style.width.%]=\"provider.SuccessRate\"></div>\n </div>\n <span class=\"provider-rate\" [ngClass]=\"getHealthClass(provider.SuccessRate)\">{{provider.SuccessRate}}%</span>\n </div>\n }\n @if (providerHealth.length === 0) {\n <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-server\"\n Title=\"No providers configured\" />\n }\n </div>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-layer-group\"></i> Channel Breakdown</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"channel-breakdown\">\n @for (channel of channelBreakdown; track channel) {\n <div class=\"channel-row\">\n <div class=\"channel-icon\" [ngClass]=\"channel.ColorClass\">\n <i [class]=\"channel.IconClass\"></i>\n </div>\n <div class=\"channel-info\">\n <div class=\"channel-name\">{{channel.Name}}</div>\n <div class=\"channel-count\">{{channel.Count | number}} messages</div>\n </div>\n <div class=\"channel-bar-wrapper\">\n <div class=\"channel-bar-fill\" [style.width.%]=\"channel.Percentage\" [style.background]=\"channel.ColorClass === 'email' ? 'var(--mj-brand-primary)' : 'var(--mj-status-success)'\"></div>\n </div>\n <span class=\"channel-pct\">{{channel.Percentage}}%</span>\n </div>\n }\n @if (channelBreakdown.length === 0) {\n <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-layer-group\"\n Title=\"No channel data available\" />\n }\n </div>\n </div>\n </div>\n </div>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n /* KPI STRIP */\n .kpi-strip {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n }\n .kpi-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n transition: all 0.15s ease;\n position: relative;\n overflow: hidden;\n }\n .kpi-card:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .kpi-card::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 3px;\n }\n .kpi-card.sent::before { background: var(--mj-brand-primary); }\n .kpi-card.delivered::before { background: var(--mj-status-success); }\n .kpi-card.pending::before { background: var(--mj-status-warning); }\n .kpi-card.failed::before { background: var(--mj-status-error); }\n\n .kpi-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .kpi-card.sent .kpi-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card.delivered .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card.pending .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card.failed .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .kpi-body { flex: 1; display: flex; flex-direction: column; gap: 2px; }\n .kpi-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n }\n .kpi-value {\n font-size: 28px; font-weight: 800;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em; line-height: 1.1;\n }\n .kpi-delta {\n display: inline-flex; align-items: center;\n gap: 4px; font-size: 11px; font-weight: 600;\n margin-top: 4px; padding: 2px 8px;\n border-radius: 10px; width: fit-content;\n }\n .kpi-delta.up {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-delta.down {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-delta.neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .delivery-bar {\n height: 6px; margin-top: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .delivery-fill {\n height: 100%; border-radius: 3px;\n background: var(--mj-status-success); transition: width 0.6s ease;\n }\n\n /* CONTENT GRID */\n .content-grid {\n display: grid;\n grid-template-columns: 1.6fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .card-header h3 {\n font-size: 13px; font-weight: 700;\n color: var(--mj-text-primary);\n display: flex; align-items: center; gap: 8px;\n margin: 0;\n }\n .card-header h3 i {\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n .card-body { padding: 16px 20px; }\n .card-body.no-padding { padding: 0; }\n\n .chart-container-inner {\n padding: 16px 20px;\n min-height: 300px;\n }\n\n /* ACTIVITY FEED */\n .activity-feed { max-height: 370px; overflow-y: auto; }\n .activity-item {\n display: flex; align-items: center; gap: 12px;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease; cursor: pointer;\n }\n .activity-item:last-child { border-bottom: none; }\n .activity-item:hover { background: var(--mj-bg-surface-sunken); }\n\n .activity-icon {\n width: 34px; height: 34px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0;\n }\n .activity-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .activity-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-icon.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .activity-body { flex: 1; min-width: 0; }\n .activity-title {\n font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n display: block;\n }\n .activity-meta {\n font-size: 11px; color: var(--mj-text-muted); margin-top: 1px;\n display: block;\n }\n .activity-status {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n .activity-status.complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-status.failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .activity-status.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n /* PROVIDER HEALTH */\n .provider-health-list { display: flex; flex-direction: column; }\n .provider-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease;\n }\n .provider-row:last-child { border-bottom: none; }\n .provider-row:hover { background: var(--mj-bg-surface-sunken); }\n\n .provider-status-dot {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--mj-border-strong);\n }\n .provider-status-dot.active { background: var(--mj-status-success); }\n\n .provider-logo {\n width: 36px; height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .provider-logo.sendgrid { color: var(--mj-brand-primary); }\n .provider-logo.twilio { color: var(--mj-status-error); }\n .provider-logo.gmail { color: var(--mj-status-error); }\n .provider-logo.msgraph { color: var(--mj-brand-primary); }\n\n .provider-info { flex: 1; }\n .provider-name { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n .provider-type { font-size: 11px; color: var(--mj-text-muted); }\n\n .provider-health-bar {\n width: 80px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .provider-health-fill {\n height: 100%; border-radius: 3px;\n transition: width 0.4s ease;\n }\n .provider-health-fill.excellent { background: var(--mj-status-success); }\n .provider-health-fill.good { background: var(--mj-status-success); }\n .provider-health-fill.warning { background: var(--mj-status-warning); }\n .provider-health-fill.critical { background: var(--mj-status-error); }\n\n .provider-rate {\n font-size: 12px; font-weight: 700;\n min-width: 44px; text-align: right;\n }\n .provider-rate.excellent { color: var(--mj-status-success); }\n .provider-rate.good { color: var(--mj-status-success); }\n .provider-rate.warning { color: var(--mj-status-warning); }\n .provider-rate.critical { color: var(--mj-status-error); }\n\n /* CHANNEL BREAKDOWN */\n .channel-breakdown { display: flex; flex-direction: column; }\n .channel-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .channel-row:last-child { border-bottom: none; }\n .channel-icon {\n width: 32px; height: 32px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px; flex-shrink: 0;\n }\n .channel-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .channel-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .channel-info { flex: 1; }\n .channel-name { font-size: 12px; font-weight: 600; color: var(--mj-text-primary); }\n .channel-count { font-size: 11px; color: var(--mj-text-muted); }\n\n .channel-bar-wrapper {\n width: 100px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .channel-bar-fill { height: 100%; border-radius: 3px; }\n .channel-pct {\n font-size: 12px; font-weight: 700;\n color: var(--mj-text-primary);\n min-width: 36px; text-align: right;\n }\n\n /* EMPTY STATE */\n\n @media (max-width: 1200px) {\n .kpi-strip { grid-template-columns: repeat(2, 1fr); }\n .content-grid { grid-template-columns: 1fr; }\n }\n `]\n})\nexport class CommunicationMonitorResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = false;\n public Stats = {\n totalSent: 0,\n deliveryRate: 0,\n pending: 0,\n failed: 0\n };\n\n /** @deprecated Use {@link Stats}. */\n public get stats() {\n return this.Stats;\n }\n /** @deprecated Use {@link Stats}. */\n public set stats(value) {\n this.Stats = value;\n }\n public RecentLogs: MJCommunicationLogEntity[] = [];\n\n /** @deprecated Use {@link RecentLogs}. */\n public get recentLogs(): MJCommunicationLogEntity[] {\n return this.RecentLogs;\n }\n /** @deprecated Use {@link RecentLogs}. */\n public set recentLogs(value: MJCommunicationLogEntity[]) {\n this.RecentLogs = value;\n }\n public ChartData: HourlyBucket[] = [];\n\n /** @deprecated Use {@link ChartData}. */\n public get chartData(): HourlyBucket[] {\n return this.ChartData;\n }\n /** @deprecated Use {@link ChartData}. */\n public set chartData(value: HourlyBucket[]) {\n this.ChartData = value;\n }\n public ChartConfig = {\n useDualAxis: false,\n showGrid: true,\n showTooltip: true,\n colors: ['#4f6bed', '#cf222e']\n };\n\n /** @deprecated Use {@link ChartConfig}. */\n public get chartConfig() {\n return this.ChartConfig;\n }\n /** @deprecated Use {@link ChartConfig}. */\n public set chartConfig(value) {\n this.ChartConfig = value;\n }\n public ProviderHealth: ProviderHealth[] = [];\n\n /** @deprecated Use {@link ProviderHealth}. */\n public get providerHealth(): ProviderHealth[] {\n return this.ProviderHealth;\n }\n /** @deprecated Use {@link ProviderHealth}. */\n public set providerHealth(value: ProviderHealth[]) {\n this.ProviderHealth = value;\n }\n public ChannelBreakdown: ChannelBreakdown[] = [];\n\n /** @deprecated Use {@link ChannelBreakdown}. */\n public get channelBreakdown(): ChannelBreakdown[] {\n return this.ChannelBreakdown;\n }\n /** @deprecated Use {@link ChannelBreakdown}. */\n public set channelBreakdown(value: ChannelBreakdown[]) {\n this.ChannelBreakdown = 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 logFields = ['ID', 'MessageDate', 'Status', 'Direction', 'CommunicationProvider', 'CommunicationProviderMessageType'];\n const [totalResult, failedResult, pendingResult, recentResult, allLogsResult, providersResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n ResultType: 'count_only'\n },\n {\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}' AND Status = 'Failed'`,\n ResultType: 'count_only'\n },\n {\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `Status = 'Pending'`,\n ResultType: 'count_only'\n },\n {\n EntityName: 'MJ: Communication Logs',\n OrderBy: 'MessageDate DESC',\n MaxRows: 8,\n Fields: logFields,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n OrderBy: 'MessageDate ASC',\n Fields: logFields,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Communication Providers',\n OrderBy: 'Name ASC',\n Fields: ['ID', 'Name', 'Status'],\n ResultType: 'simple'\n }\n ]);\n\n if (totalResult.Success) this.Stats.totalSent = totalResult.TotalRowCount;\n if (failedResult.Success) this.Stats.failed = failedResult.TotalRowCount;\n if (pendingResult.Success) this.Stats.pending = pendingResult.TotalRowCount;\n\n this.Stats.deliveryRate = this.Stats.totalSent > 0\n ? parseFloat(((this.Stats.totalSent - this.Stats.failed) / this.Stats.totalSent * 100).toFixed(1))\n : 100;\n\n if (recentResult.Success) {\n this.RecentLogs = recentResult.Results as MJCommunicationLogEntity[];\n }\n\n if (allLogsResult.Success) {\n const allLogs = allLogsResult.Results as MJCommunicationLogEntity[];\n this.ChartData = this.processTrendData(allLogs, yesterday);\n this.ChannelBreakdown = this.buildChannelBreakdown(allLogs);\n }\n\n if (providersResult.Success && allLogsResult.Success) {\n this.ProviderHealth = this.buildProviderHealth(\n providersResult.Results as MJCommunicationProviderEntity[],\n allLogsResult.Results as MJCommunicationLogEntity[]\n );\n }\n\n } catch (error) {\n console.error('Error loading monitor data:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public GetActivityIconClass(log: MJCommunicationLogEntity): string {\n if (log.Status === 'Failed') return 'error';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'sms';\n return 'email';\n }\n\n /** @deprecated Use {@link GetActivityIconClass}. */\n public getActivityIconClass(log: MJCommunicationLogEntity): string {\n return this.GetActivityIconClass(log);\n }\n\n public GetActivityIcon(log: MJCommunicationLogEntity): string {\n if (log.Direction === 'Receiving') return 'fa-solid fa-arrow-down';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'fa-solid fa-comment-sms';\n return 'fa-solid fa-envelope';\n }\n\n /** @deprecated Use {@link GetActivityIcon}. */\n public getActivityIcon(log: MJCommunicationLogEntity): string {\n return this.GetActivityIcon(log);\n }\n\n public GetHealthClass(rate: number): string {\n if (rate >= 98) return 'excellent';\n if (rate >= 95) return 'good';\n if (rate >= 85) return 'warning';\n return 'critical';\n }\n\n /** @deprecated Use {@link GetHealthClass}. */\n public getHealthClass(rate: number): string {\n return this.GetHealthClass(rate);\n }\n\n private processTrendData(logs: MJCommunicationLogEntity[], startTime: Date): HourlyBucket[] {\n const buckets: HourlyBucket[] = [];\n const now = new Date();\n const current = new Date(startTime);\n current.setMinutes(0, 0, 0);\n\n while (current <= now) {\n const bucketStart = new Date(current);\n const bucketEnd = new Date(current.getTime() + 60 * 60 * 1000);\n const bucketLogs = logs.filter(l => {\n const d = new Date(l.MessageDate);\n return d >= bucketStart && d < bucketEnd;\n });\n\n buckets.push({\n timestamp: bucketStart,\n executions: bucketLogs.length,\n errors: bucketLogs.filter(l => l.Status === 'Failed').length,\n cost: 0,\n tokens: 0,\n avgTime: 0\n });\n current.setHours(current.getHours() + 1);\n }\n return buckets;\n }\n\n private buildProviderHealth(providers: MJCommunicationProviderEntity[], logs: MJCommunicationLogEntity[]): ProviderHealth[] {\n return providers.map(p => {\n const providerLogs = logs.filter(l => l.CommunicationProvider === p.Name);\n const sent = providerLogs.length;\n const failed = providerLogs.filter(l => l.Status === 'Failed').length;\n const rate = sent > 0 ? parseFloat(((sent - failed) / sent * 100).toFixed(1)) : 100;\n\n return {\n Name: p.Name,\n Type: this.getProviderType(p.Name),\n SentCount: sent,\n SuccessRate: rate,\n IsActive: p.Status === 'Active',\n IconClass: this.getProviderIconClass(p.Name),\n ColorClass: this.getProviderColorClass(p.Name)\n };\n });\n }\n\n private buildChannelBreakdown(logs: MJCommunicationLogEntity[]): ChannelBreakdown[] {\n const total = logs.length;\n if (total === 0) return [];\n\n const emailLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('email') || (!type.includes('sms'));\n });\n const smsLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('sms');\n });\n\n const channels: ChannelBreakdown[] = [];\n if (emailLogs.length > 0) {\n channels.push({\n Name: 'Email',\n IconClass: 'fa-solid fa-envelope',\n Count: emailLogs.length,\n Percentage: Math.round((emailLogs.length / total) * 100),\n ColorClass: 'email'\n });\n }\n if (smsLogs.length > 0) {\n channels.push({\n Name: 'SMS',\n IconClass: 'fa-solid fa-comment-sms',\n Count: smsLogs.length,\n Percentage: Math.round((smsLogs.length / total) * 100),\n ColorClass: 'sms'\n });\n }\n return channels;\n }\n\n private getProviderType(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('twilio')) return 'SMS';\n return 'Email';\n }\n\n private getProviderIconClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'fa-solid fa-envelope';\n if (n.includes('twilio')) return 'fa-solid fa-comment-sms';\n if (n.includes('gmail') || n.includes('google')) return 'fa-brands fa-google';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-server';\n }\n\n private getProviderColorClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'sendgrid';\n if (n.includes('twilio')) return 'twilio';\n if (n.includes('gmail') || n.includes('google')) return 'gmail';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'msgraph';\n return '';\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"communication-monitor-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-monitor-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { ResourceData, MJCommunicationLogEntity, MJCommunicationProviderEntity } from '@memberjunction/core-entities';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RunView } from '@memberjunction/core';\n\ninterface ProviderHealth {\n Name: string;\n Type: string;\n SentCount: number;\n SuccessRate: number;\n IsActive: boolean;\n IconClass: string;\n ColorClass: string;\n}\n\ninterface ChannelBreakdown {\n Name: string;\n IconClass: string;\n Count: number;\n Percentage: number;\n ColorClass: string;\n}\n\ninterface HourlyBucket {\n timestamp: Date;\n executions: number;\n errors: number;\n cost: number;\n tokens: number;\n avgTime: number;\n}\n@RegisterClass(BaseResourceComponent, 'CommunicationMonitorResource')\n@Component({\n standalone: false,\n selector: 'mj-communication-monitor-resource',\n template: `\n <mj-page-layout>\n <mj-page-header\n Title=\"Monitor\"\n Icon=\"fa-solid fa-chart-line\"\n Subtitle=\"Live delivery health, provider status, and channel breakdown\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"loadData()\" [disabled]=\"isLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\" [class.spinning]=\"isLoading\"></i> <span class=\"action-btn-label\">Refresh</span>\n </button>\n </div>\n </mj-page-header>\n\n <mj-page-body>\n <!-- KPI STRIP -->\n <div class=\"kpi-strip\">\n <div class=\"kpi-card sent\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-paper-plane\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Total Sent</span>\n <span class=\"kpi-value\">{{stats.totalSent | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.totalSent > 0 ? 'up' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.totalSent > 0\" [class.fa-minus]=\"stats.totalSent === 0\"></i>\n Last 24 hours\n </span>\n </div>\n </div>\n <div class=\"kpi-card delivered\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-check-double\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Delivery Rate</span>\n <span class=\"kpi-value\">{{stats.deliveryRate}}%</span>\n <div class=\"delivery-bar\">\n <div class=\"delivery-fill\" [style.width.%]=\"stats.deliveryRate\"></div>\n </div>\n </div>\n </div>\n <div class=\"kpi-card pending\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-clock\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Pending</span>\n <span class=\"kpi-value\">{{stats.pending | number}}</span>\n <span class=\"kpi-delta neutral\">\n <i class=\"fa-solid fa-minus\"></i> Awaiting provider\n </span>\n </div>\n </div>\n <div class=\"kpi-card failed\">\n <div class=\"kpi-icon\"><i class=\"fa-solid fa-circle-exclamation\"></i></div>\n <div class=\"kpi-body\">\n <span class=\"kpi-label\">Failed</span>\n <span class=\"kpi-value\">{{stats.failed | number}}</span>\n <span class=\"kpi-delta\" [class]=\"stats.failed > 0 ? 'down' : 'neutral'\">\n <i class=\"fa-solid\" [class.fa-arrow-up]=\"stats.failed > 0\" [class.fa-minus]=\"stats.failed === 0\"></i>\n {{stats.failed > 0 ? 'Requires attention' : 'No failures'}}\n </span>\n </div>\n </div>\n </div>\n \n <!-- CHARTS + ACTIVITY ROW -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-chart-bar\"></i> Delivery Volume</h3>\n </div>\n <div class=\"chart-container-inner\">\n <app-time-series-chart\n [data]=\"chartData\"\n [showLegend]=\"true\"\n [showControls]=\"false\"\n [config]=\"chartConfig\">\n </app-time-series-chart>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-bolt\"></i> Recent Activity</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"activity-feed\">\n @for (log of recentLogs; track log) {\n <div class=\"activity-item\">\n <div class=\"activity-icon\" [ngClass]=\"getActivityIconClass(log)\">\n <i [class]=\"getActivityIcon(log)\"></i>\n </div>\n <div class=\"activity-body\">\n <span class=\"activity-title\">{{log.CommunicationProviderMessageType || 'Message'}}</span>\n <span class=\"activity-meta\">{{log.CommunicationProvider}} • {{log.MessageDate | date:'shortTime'}}</span>\n </div>\n <span class=\"activity-status\" [ngClass]=\"log.Status.toLowerCase()\">\n {{log.Status}}\n </span>\n </div>\n }\n @if (recentLogs.length === 0) {\n <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-inbox\"\n Title=\"No recent activity\" />\n }\n </div>\n </div>\n </div>\n </div>\n \n <!-- PROVIDER HEALTH + CHANNEL BREAKDOWN -->\n <div class=\"content-grid\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-heart-pulse\"></i> Provider Health</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"provider-health-list\">\n @for (provider of providerHealth; track provider) {\n <div class=\"provider-row\">\n <div class=\"provider-status-dot\" [class.active]=\"provider.IsActive\"></div>\n <div class=\"provider-logo\" [ngClass]=\"provider.ColorClass\">\n <i [class]=\"provider.IconClass\"></i>\n </div>\n <div class=\"provider-info\">\n <div class=\"provider-name\">{{provider.Name}}</div>\n <div class=\"provider-type\">{{provider.Type}} • {{provider.SentCount}} sent today</div>\n </div>\n <div class=\"provider-health-bar\">\n <div class=\"provider-health-fill\" [ngClass]=\"getHealthClass(provider.SuccessRate)\" [style.width.%]=\"provider.SuccessRate\"></div>\n </div>\n <span class=\"provider-rate\" [ngClass]=\"getHealthClass(provider.SuccessRate)\">{{provider.SuccessRate}}%</span>\n </div>\n }\n @if (providerHealth.length === 0) {\n <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-server\"\n Title=\"No providers configured\" />\n }\n </div>\n </div>\n </div>\n \n <div class=\"card\">\n <div class=\"card-header\">\n <h3><i class=\"fa-solid fa-layer-group\"></i> Channel Breakdown</h3>\n </div>\n <div class=\"card-body no-padding\">\n <div class=\"channel-breakdown\">\n @for (channel of channelBreakdown; track channel) {\n <div class=\"channel-row\">\n <div class=\"channel-icon\" [ngClass]=\"channel.ColorClass\">\n <i [class]=\"channel.IconClass\"></i>\n </div>\n <div class=\"channel-info\">\n <div class=\"channel-name\">{{channel.Name}}</div>\n <div class=\"channel-count\">{{channel.Count | number}} messages</div>\n </div>\n <div class=\"channel-bar-wrapper\">\n <div class=\"channel-bar-fill\" [style.width.%]=\"channel.Percentage\" [style.background]=\"channel.ColorClass === 'email' ? 'var(--mj-brand-primary)' : 'var(--mj-status-success)'\"></div>\n </div>\n <span class=\"channel-pct\">{{channel.Percentage}}%</span>\n </div>\n }\n @if (channelBreakdown.length === 0) {\n <mj-empty-state Size=\"compact\" Icon=\"fa-solid fa-layer-group\"\n Title=\"No channel data available\" />\n }\n </div>\n </div>\n </div>\n </div>\n </mj-page-body>\n </mj-page-layout>\n `,\n styles: [`\n /* KPI STRIP */\n .kpi-strip {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n }\n .kpi-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 20px;\n display: flex;\n align-items: flex-start;\n gap: 16px;\n transition: all 0.15s ease;\n position: relative;\n overflow: hidden;\n }\n .kpi-card:hover {\n box-shadow: 0 2px 8px var(--mj-shadow-md);\n border-color: var(--mj-border-strong);\n }\n .kpi-card::before {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 3px;\n }\n .kpi-card.sent::before { background: var(--mj-brand-primary); }\n .kpi-card.delivered::before { background: var(--mj-status-success); }\n .kpi-card.pending::before { background: var(--mj-status-warning); }\n .kpi-card.failed::before { background: var(--mj-status-error); }\n\n .kpi-icon {\n width: 44px; height: 44px;\n border-radius: 12px;\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .kpi-card.sent .kpi-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .kpi-card.delivered .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-card.pending .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n .kpi-card.failed .kpi-icon {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .kpi-body { flex: 1; display: flex; flex-direction: column; gap: 2px; }\n .kpi-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n }\n .kpi-value {\n font-size: 28px; font-weight: 800;\n color: var(--mj-text-primary);\n letter-spacing: -0.02em; line-height: 1.1;\n }\n .kpi-delta {\n display: inline-flex; align-items: center;\n gap: 4px; font-size: 11px; font-weight: 600;\n margin-top: 4px; padding: 2px 8px;\n border-radius: 10px; width: fit-content;\n }\n .kpi-delta.up {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .kpi-delta.down {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .kpi-delta.neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n }\n\n .delivery-bar {\n height: 6px; margin-top: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .delivery-fill {\n height: 100%; border-radius: 3px;\n background: var(--mj-status-success); transition: width 0.6s ease;\n }\n\n /* CONTENT GRID */\n .content-grid {\n display: grid;\n grid-template-columns: 1.6fr 1fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n .card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n }\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .card-header h3 {\n font-size: 13px; font-weight: 700;\n color: var(--mj-text-primary);\n display: flex; align-items: center; gap: 8px;\n margin: 0;\n }\n .card-header h3 i {\n color: var(--mj-text-muted);\n font-size: 12px;\n }\n .card-body { padding: 16px 20px; }\n .card-body.no-padding { padding: 0; }\n\n .chart-container-inner {\n padding: 16px 20px;\n min-height: 300px;\n }\n\n /* ACTIVITY FEED */\n .activity-feed { max-height: 370px; overflow-y: auto; }\n .activity-item {\n display: flex; align-items: center; gap: 12px;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease; cursor: pointer;\n }\n .activity-item:last-child { border-bottom: none; }\n .activity-item:hover { background: var(--mj-bg-surface-sunken); }\n\n .activity-icon {\n width: 34px; height: 34px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 12px; flex-shrink: 0;\n }\n .activity-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .activity-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-icon.error {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n\n .activity-body { flex: 1; min-width: 0; }\n .activity-title {\n font-size: 12px; font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n display: block;\n }\n .activity-meta {\n font-size: 11px; color: var(--mj-text-muted); margin-top: 1px;\n display: block;\n }\n .activity-status {\n font-size: 10px; font-weight: 700;\n text-transform: uppercase; letter-spacing: 0.3px;\n padding: 3px 8px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n .activity-status.complete {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n .activity-status.failed {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n }\n .activity-status.pending {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n }\n\n /* PROVIDER HEALTH */\n .provider-health-list { display: flex; flex-direction: column; }\n .provider-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n transition: background 0.15s ease;\n }\n .provider-row:last-child { border-bottom: none; }\n .provider-row:hover { background: var(--mj-bg-surface-sunken); }\n\n .provider-status-dot {\n width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;\n background: var(--mj-border-strong);\n }\n .provider-status-dot.active { background: var(--mj-status-success); }\n\n .provider-logo {\n width: 36px; height: 36px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px; flex-shrink: 0;\n }\n .provider-logo.sendgrid { color: var(--mj-brand-primary); }\n .provider-logo.twilio { color: var(--mj-status-error); }\n .provider-logo.gmail { color: var(--mj-status-error); }\n .provider-logo.msgraph { color: var(--mj-brand-primary); }\n\n .provider-info { flex: 1; }\n .provider-name { font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n .provider-type { font-size: 11px; color: var(--mj-text-muted); }\n\n .provider-health-bar {\n width: 80px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .provider-health-fill {\n height: 100%; border-radius: 3px;\n transition: width 0.4s ease;\n }\n .provider-health-fill.excellent { background: var(--mj-status-success); }\n .provider-health-fill.good { background: var(--mj-status-success); }\n .provider-health-fill.warning { background: var(--mj-status-warning); }\n .provider-health-fill.critical { background: var(--mj-status-error); }\n\n .provider-rate {\n font-size: 12px; font-weight: 700;\n min-width: 44px; text-align: right;\n }\n .provider-rate.excellent { color: var(--mj-status-success); }\n .provider-rate.good { color: var(--mj-status-success); }\n .provider-rate.warning { color: var(--mj-status-warning); }\n .provider-rate.critical { color: var(--mj-status-error); }\n\n /* CHANNEL BREAKDOWN */\n .channel-breakdown { display: flex; flex-direction: column; }\n .channel-row {\n display: flex; align-items: center; gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n }\n .channel-row:last-child { border-bottom: none; }\n .channel-icon {\n width: 32px; height: 32px;\n border-radius: 8px;\n display: flex; align-items: center; justify-content: center;\n font-size: 13px; flex-shrink: 0;\n }\n .channel-icon.email {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n }\n .channel-icon.sms {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n }\n\n .channel-info { flex: 1; }\n .channel-name { font-size: 12px; font-weight: 600; color: var(--mj-text-primary); }\n .channel-count { font-size: 11px; color: var(--mj-text-muted); }\n\n .channel-bar-wrapper {\n width: 100px; height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px; overflow: hidden;\n }\n .channel-bar-fill { height: 100%; border-radius: 3px; }\n .channel-pct {\n font-size: 12px; font-weight: 700;\n color: var(--mj-text-primary);\n min-width: 36px; text-align: right;\n }\n\n /* EMPTY STATE */\n\n @media (max-width: 1200px) {\n .kpi-strip { grid-template-columns: repeat(2, 1fr); }\n .content-grid { grid-template-columns: 1fr; }\n }\n `]\n})\nexport class CommunicationMonitorResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n public isLoading = false;\n public Stats = {\n totalSent: 0,\n deliveryRate: 0,\n pending: 0,\n failed: 0\n };\n\n /** @deprecated Use {@link Stats}. */\n public get stats() {\n return this.Stats;\n }\n /** @deprecated Use {@link Stats}. */\n public set stats(value) {\n this.Stats = value;\n }\n public RecentLogs: MJCommunicationLogEntity[] = [];\n\n /** @deprecated Use {@link RecentLogs}. */\n public get recentLogs(): MJCommunicationLogEntity[] {\n return this.RecentLogs;\n }\n /** @deprecated Use {@link RecentLogs}. */\n public set recentLogs(value: MJCommunicationLogEntity[]) {\n this.RecentLogs = value;\n }\n public ChartData: HourlyBucket[] = [];\n\n /** @deprecated Use {@link ChartData}. */\n public get chartData(): HourlyBucket[] {\n return this.ChartData;\n }\n /** @deprecated Use {@link ChartData}. */\n public set chartData(value: HourlyBucket[]) {\n this.ChartData = value;\n }\n public ChartConfig = {\n useDualAxis: false,\n showGrid: true,\n showTooltip: true,\n colors: ['#4f6bed', '#cf222e']\n };\n\n /** @deprecated Use {@link ChartConfig}. */\n public get chartConfig() {\n return this.ChartConfig;\n }\n /** @deprecated Use {@link ChartConfig}. */\n public set chartConfig(value) {\n this.ChartConfig = value;\n }\n public ProviderHealth: ProviderHealth[] = [];\n\n /** @deprecated Use {@link ProviderHealth}. */\n public get providerHealth(): ProviderHealth[] {\n return this.ProviderHealth;\n }\n /** @deprecated Use {@link ProviderHealth}. */\n public set providerHealth(value: ProviderHealth[]) {\n this.ProviderHealth = value;\n }\n public ChannelBreakdown: ChannelBreakdown[] = [];\n\n /** @deprecated Use {@link ChannelBreakdown}. */\n public get channelBreakdown(): ChannelBreakdown[] {\n return this.ChannelBreakdown;\n }\n /** @deprecated Use {@link ChannelBreakdown}. */\n public set channelBreakdown(value: ChannelBreakdown[]) {\n this.ChannelBreakdown = 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 logFields = ['ID', 'MessageDate', 'Status', 'Direction', 'CommunicationProvider', 'CommunicationProviderMessageType'];\n const [totalResult, failedResult, pendingResult, recentResult, allLogsResult, providersResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n ResultType: 'count_only'\n },\n {\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}' AND Status = 'Failed'`,\n ResultType: 'count_only'\n },\n {\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `Status = 'Pending'`,\n ResultType: 'count_only'\n },\n {\n EntityName: 'MJ: Communication Logs',\n OrderBy: 'MessageDate DESC',\n MaxRows: 8,\n Fields: logFields,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Communication Logs',\n ExtraFilter: `MessageDate >= '${yesterdayIso}'`,\n OrderBy: 'MessageDate ASC',\n Fields: logFields,\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: Communication Providers',\n OrderBy: 'Name ASC',\n Fields: ['ID', 'Name', 'Status'],\n ResultType: 'simple'\n }\n ]);\n\n if (totalResult.Success) this.Stats.totalSent = totalResult.TotalRowCount ?? 0;\n if (failedResult.Success) this.Stats.failed = failedResult.TotalRowCount ?? 0;\n if (pendingResult.Success) this.Stats.pending = pendingResult.TotalRowCount ?? 0;\n\n this.Stats.deliveryRate = this.Stats.totalSent > 0\n ? parseFloat(((this.Stats.totalSent - this.Stats.failed) / this.Stats.totalSent * 100).toFixed(1))\n : 100;\n\n if (recentResult.Success) {\n this.RecentLogs = recentResult.Results as MJCommunicationLogEntity[];\n }\n\n if (allLogsResult.Success) {\n const allLogs = allLogsResult.Results as MJCommunicationLogEntity[];\n this.ChartData = this.processTrendData(allLogs, yesterday);\n this.ChannelBreakdown = this.buildChannelBreakdown(allLogs);\n }\n\n if (providersResult.Success && allLogsResult.Success) {\n this.ProviderHealth = this.buildProviderHealth(\n providersResult.Results as MJCommunicationProviderEntity[],\n allLogsResult.Results as MJCommunicationLogEntity[]\n );\n }\n\n } catch (error) {\n console.error('Error loading monitor data:', error);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public GetActivityIconClass(log: MJCommunicationLogEntity): string {\n if (log.Status === 'Failed') return 'error';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'sms';\n return 'email';\n }\n\n /** @deprecated Use {@link GetActivityIconClass}. */\n public getActivityIconClass(log: MJCommunicationLogEntity): string {\n return this.GetActivityIconClass(log);\n }\n\n public GetActivityIcon(log: MJCommunicationLogEntity): string {\n if (log.Direction === 'Receiving') return 'fa-solid fa-arrow-down';\n const type = (log.CommunicationProviderMessageType || '').toLowerCase();\n if (type.includes('sms')) return 'fa-solid fa-comment-sms';\n return 'fa-solid fa-envelope';\n }\n\n /** @deprecated Use {@link GetActivityIcon}. */\n public getActivityIcon(log: MJCommunicationLogEntity): string {\n return this.GetActivityIcon(log);\n }\n\n public GetHealthClass(rate: number): string {\n if (rate >= 98) return 'excellent';\n if (rate >= 95) return 'good';\n if (rate >= 85) return 'warning';\n return 'critical';\n }\n\n /** @deprecated Use {@link GetHealthClass}. */\n public getHealthClass(rate: number): string {\n return this.GetHealthClass(rate);\n }\n\n private processTrendData(logs: MJCommunicationLogEntity[], startTime: Date): HourlyBucket[] {\n const buckets: HourlyBucket[] = [];\n const now = new Date();\n const current = new Date(startTime);\n current.setMinutes(0, 0, 0);\n\n while (current <= now) {\n const bucketStart = new Date(current);\n const bucketEnd = new Date(current.getTime() + 60 * 60 * 1000);\n const bucketLogs = logs.filter(l => {\n const d = new Date(l.MessageDate);\n return d >= bucketStart && d < bucketEnd;\n });\n\n buckets.push({\n timestamp: bucketStart,\n executions: bucketLogs.length,\n errors: bucketLogs.filter(l => l.Status === 'Failed').length,\n cost: 0,\n tokens: 0,\n avgTime: 0\n });\n current.setHours(current.getHours() + 1);\n }\n return buckets;\n }\n\n private buildProviderHealth(providers: MJCommunicationProviderEntity[], logs: MJCommunicationLogEntity[]): ProviderHealth[] {\n return providers.map(p => {\n const providerLogs = logs.filter(l => l.CommunicationProvider === p.Name);\n const sent = providerLogs.length;\n const failed = providerLogs.filter(l => l.Status === 'Failed').length;\n const rate = sent > 0 ? parseFloat(((sent - failed) / sent * 100).toFixed(1)) : 100;\n\n return {\n Name: p.Name,\n Type: this.getProviderType(p.Name),\n SentCount: sent,\n SuccessRate: rate,\n IsActive: p.Status === 'Active',\n IconClass: this.getProviderIconClass(p.Name),\n ColorClass: this.getProviderColorClass(p.Name)\n };\n });\n }\n\n private buildChannelBreakdown(logs: MJCommunicationLogEntity[]): ChannelBreakdown[] {\n const total = logs.length;\n if (total === 0) return [];\n\n const emailLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('email') || (!type.includes('sms'));\n });\n const smsLogs = logs.filter(l => {\n const type = (l.CommunicationProviderMessageType || '').toLowerCase();\n return type.includes('sms');\n });\n\n const channels: ChannelBreakdown[] = [];\n if (emailLogs.length > 0) {\n channels.push({\n Name: 'Email',\n IconClass: 'fa-solid fa-envelope',\n Count: emailLogs.length,\n Percentage: Math.round((emailLogs.length / total) * 100),\n ColorClass: 'email'\n });\n }\n if (smsLogs.length > 0) {\n channels.push({\n Name: 'SMS',\n IconClass: 'fa-solid fa-comment-sms',\n Count: smsLogs.length,\n Percentage: Math.round((smsLogs.length / total) * 100),\n ColorClass: 'sms'\n });\n }\n return channels;\n }\n\n private getProviderType(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('twilio')) return 'SMS';\n return 'Email';\n }\n\n private getProviderIconClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'fa-solid fa-envelope';\n if (n.includes('twilio')) return 'fa-solid fa-comment-sms';\n if (n.includes('gmail') || n.includes('google')) return 'fa-brands fa-google';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-server';\n }\n\n private getProviderColorClass(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('sendgrid')) return 'sendgrid';\n if (n.includes('twilio')) return 'twilio';\n if (n.includes('gmail') || n.includes('google')) return 'gmail';\n if (n.includes('microsoft') || n.includes('graph') || n.includes('outlook')) return 'msgraph';\n return '';\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Monitor';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-chart-line';\n }\n}\n"]}
|
|
@@ -149,10 +149,10 @@ let CommunicationRunsResourceComponent = class CommunicationRunsResourceComponen
|
|
|
149
149
|
this.Runs = runsResult.Results;
|
|
150
150
|
}
|
|
151
151
|
if (activeResult.Success)
|
|
152
|
-
this.Summary.active = activeResult.TotalRowCount;
|
|
152
|
+
this.Summary.active = activeResult.TotalRowCount ?? 0;
|
|
153
153
|
if (completedResult.Success)
|
|
154
|
-
this.Summary.completed = completedResult.TotalRowCount;
|
|
155
|
-
const totalCompleted = this.Summary.completed + (failedResult.Success ? failedResult.TotalRowCount : 0);
|
|
154
|
+
this.Summary.completed = completedResult.TotalRowCount ?? 0;
|
|
155
|
+
const totalCompleted = this.Summary.completed + (failedResult.Success ? failedResult.TotalRowCount ?? 0 : 0);
|
|
156
156
|
this.Summary.successRate = totalCompleted > 0
|
|
157
157
|
? Math.round((this.Summary.completed / totalCompleted) * 100)
|
|
158
158
|
: 100;
|
|
@@ -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 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
|
+
{"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 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 ?? 0;\n if (completedResult.Success) this.Summary.completed = completedResult.TotalRowCount ?? 0;\n\n const totalCompleted = this.Summary.completed + (failedResult.Success ? failedResult.TotalRowCount ?? 0 : 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-studio-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/ComponentStudio/component-studio-dashboard.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"component-studio-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/ComponentStudio/component-studio-dashboard.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -1254,6 +1254,7 @@ let ComponentStudioDashboardComponent = class ComponentStudioDashboardComponent
|
|
|
1254
1254
|
ExtraFilter: `ArtifactID = '${artifact.ID}'`,
|
|
1255
1255
|
OrderBy: 'VersionNumber DESC',
|
|
1256
1256
|
MaxRows: 1,
|
|
1257
|
+
SkipTotalRowCount: true,
|
|
1257
1258
|
ResultType: 'entity_object'
|
|
1258
1259
|
});
|
|
1259
1260
|
version.VersionNumber = (versionsResult.Success && versionsResult.Results?.length > 0)
|