@memberjunction/ng-dashboards 5.40.2 → 5.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +38 -4
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +148 -20
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-management-data.d.ts +216 -0
- package/dist/AI/components/analytics/realtime/realtime-management-data.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-management-data.js +313 -0
- package/dist/AI/components/analytics/realtime/realtime-management-data.js.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts +103 -0
- package/dist/AI/components/analytics/realtime/realtime-management.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-management.component.js +1060 -0
- package/dist/AI/components/analytics/realtime/realtime-management.component.js.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts +87 -0
- package/dist/AI/components/analytics/realtime/realtime-overview.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js +710 -0
- package/dist/AI/components/analytics/realtime/realtime-overview.component.js.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts +127 -0
- package/dist/AI/components/analytics/realtime/realtime-session-data.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-session-data.js +233 -0
- package/dist/AI/components/analytics/realtime/realtime-session-data.js.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-sessions.component.d.ts +94 -0
- package/dist/AI/components/analytics/realtime/realtime-sessions.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/realtime/realtime-sessions.component.js +728 -0
- package/dist/AI/components/analytics/realtime/realtime-sessions.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +2 -2
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +2 -2
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +2 -2
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/index.d.ts +5 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +7 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +12 -8
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +12 -0
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +419 -333
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +5 -5
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +16 -2
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +37 -5
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +22 -19
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +18 -0
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +3 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/package.json +55 -55
|
@@ -0,0 +1,1060 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Realtime management section — the whole realtime + bridge
|
|
3
|
+
* surface (§11b of the Realtime Bridges architecture) in one place.
|
|
4
|
+
*
|
|
5
|
+
* Hosts an internal sub-tab rail across seven surfaces:
|
|
6
|
+
* 1. Live Sessions — active session bridges (Connecting/Connected) joined
|
|
7
|
+
* with their session: agent, provider, turn mode,
|
|
8
|
+
* participant count, started-at.
|
|
9
|
+
* 2. Bridge Providers — the platform registry with a compact capability
|
|
10
|
+
* summary derived from `SupportedFeaturesObject`.
|
|
11
|
+
* 3. Agent Identities — which agents are reachable where (mailboxes, numbers).
|
|
12
|
+
* 4. Channels — the `MJ: AI Agent Channels` registry + which providers
|
|
13
|
+
* contribute them.
|
|
14
|
+
* 5. Co-Agents — the `MJ: AI Agent Co Agents` pairing registry.
|
|
15
|
+
* 6. Session History — closed/terminal session bridges with close reason.
|
|
16
|
+
* 7. Metrics — client-side aggregates (by provider / status / agent;
|
|
17
|
+
* bridges-over-time bucketed per day).
|
|
18
|
+
*
|
|
19
|
+
* Read-only for v1. Data loads once per `TimeRange` change via one batched
|
|
20
|
+
* `RunViews` in {@link LoadRealtimeManagementDataset}; everything else is
|
|
21
|
+
* in-memory aggregation. The selected sub-tab persists via `UserInfoEngine`
|
|
22
|
+
* under `mj.realtimeDashboard.subTab`.
|
|
23
|
+
*/
|
|
24
|
+
import { Component, Input, ChangeDetectorRef, inject } from '@angular/core';
|
|
25
|
+
import { CompositeKey } from '@memberjunction/core';
|
|
26
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
27
|
+
import { SharedService } from '@memberjunction/ng-shared';
|
|
28
|
+
import { UserInfoEngine } from '@memberjunction/core-entities';
|
|
29
|
+
import { LoadRealtimeManagementDataset, BucketSessionBridgesByDay, SummarizeBridgesByProvider, SummarizeBridgesByStatus, SummarizeBridgesByAgent, BuildCapabilityChips, BridgeTypeIcon, IdentityTypeIcon, TransportTypeIcon, FormatBridgeDuration, FormatBridgeStart } from './realtime-management-data';
|
|
30
|
+
import * as i0 from "@angular/core";
|
|
31
|
+
import * as i1 from "@memberjunction/ng-shared-generic";
|
|
32
|
+
import * as i2 from "@memberjunction/ng-ui-components";
|
|
33
|
+
const _forTrack0 = ($index, $item) => $item.Key;
|
|
34
|
+
const _forTrack1 = ($index, $item) => $item.Record.ID;
|
|
35
|
+
const _forTrack2 = ($index, $item) => $item.Label;
|
|
36
|
+
const _forTrack3 = ($index, $item) => $item.ID;
|
|
37
|
+
function RealtimeManagementComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
39
|
+
i0.ɵɵelement(1, "mj-loading", 1);
|
|
40
|
+
i0.ɵɵelementEnd();
|
|
41
|
+
} }
|
|
42
|
+
function RealtimeManagementComponent_Conditional_1_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
43
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
44
|
+
i0.ɵɵelementStart(0, "button", 8);
|
|
45
|
+
i0.ɵɵlistener("click", function RealtimeManagementComponent_Conditional_1_For_3_Template_button_click_0_listener() { const tab_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.SelectSubTab(tab_r3.Key)); });
|
|
46
|
+
i0.ɵɵelement(1, "i");
|
|
47
|
+
i0.ɵɵelementStart(2, "span");
|
|
48
|
+
i0.ɵɵtext(3);
|
|
49
|
+
i0.ɵɵelementEnd()();
|
|
50
|
+
} if (rf & 2) {
|
|
51
|
+
const tab_r3 = ctx.$implicit;
|
|
52
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
53
|
+
i0.ɵɵclassProp("subtab--active", ctx_r3.ActiveSubTab === tab_r3.Key);
|
|
54
|
+
i0.ɵɵadvance();
|
|
55
|
+
i0.ɵɵclassMap(tab_r3.Icon);
|
|
56
|
+
i0.ɵɵadvance(2);
|
|
57
|
+
i0.ɵɵtextInterpolate(tab_r3.Label);
|
|
58
|
+
} }
|
|
59
|
+
function RealtimeManagementComponent_Conditional_1_Case_6_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
60
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 16);
|
|
61
|
+
i0.ɵɵtext(2, "No live bridged sessions right now");
|
|
62
|
+
i0.ɵɵelementEnd()();
|
|
63
|
+
} }
|
|
64
|
+
function RealtimeManagementComponent_Conditional_1_Case_6_For_25_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
+
i0.ɵɵelement(0, "span", 22);
|
|
66
|
+
} }
|
|
67
|
+
function RealtimeManagementComponent_Conditional_1_Case_6_For_25_Template(rf, ctx) { if (rf & 1) {
|
|
68
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
69
|
+
i0.ɵɵelementStart(0, "tr", 17);
|
|
70
|
+
i0.ɵɵlistener("click", function RealtimeManagementComponent_Conditional_1_Case_6_For_25_Template_tr_click_0_listener() { const b_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.OpenSession(b_r6.Record.AgentSessionID)); });
|
|
71
|
+
i0.ɵɵelementStart(1, "td", 18);
|
|
72
|
+
i0.ɵɵtext(2);
|
|
73
|
+
i0.ɵɵelementEnd();
|
|
74
|
+
i0.ɵɵelementStart(3, "td");
|
|
75
|
+
i0.ɵɵtext(4);
|
|
76
|
+
i0.ɵɵelementEnd();
|
|
77
|
+
i0.ɵɵelementStart(5, "td")(6, "span", 19);
|
|
78
|
+
i0.ɵɵelement(7, "i", 20);
|
|
79
|
+
i0.ɵɵtext(8);
|
|
80
|
+
i0.ɵɵelementEnd()();
|
|
81
|
+
i0.ɵɵelementStart(9, "td");
|
|
82
|
+
i0.ɵɵtext(10);
|
|
83
|
+
i0.ɵɵelementEnd();
|
|
84
|
+
i0.ɵɵelementStart(11, "td", 21);
|
|
85
|
+
i0.ɵɵtext(12);
|
|
86
|
+
i0.ɵɵelementEnd();
|
|
87
|
+
i0.ɵɵelementStart(13, "td")(14, "span");
|
|
88
|
+
i0.ɵɵconditionalCreate(15, RealtimeManagementComponent_Conditional_1_Case_6_For_25_Conditional_15_Template, 1, 0, "span", 22);
|
|
89
|
+
i0.ɵɵtext(16);
|
|
90
|
+
i0.ɵɵelementEnd()();
|
|
91
|
+
i0.ɵɵelementStart(17, "td", 23);
|
|
92
|
+
i0.ɵɵtext(18);
|
|
93
|
+
i0.ɵɵelementEnd();
|
|
94
|
+
i0.ɵɵelementStart(19, "td", 24);
|
|
95
|
+
i0.ɵɵtext(20);
|
|
96
|
+
i0.ɵɵelementEnd();
|
|
97
|
+
i0.ɵɵelementStart(21, "td", 25)(22, "button", 26);
|
|
98
|
+
i0.ɵɵlistener("click", function RealtimeManagementComponent_Conditional_1_Case_6_For_25_Template_button_click_22_listener($event) { const b_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r3 = i0.ɵɵnextContext(3); ctx_r3.OpenSession(b_r6.Record.AgentSessionID); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
99
|
+
i0.ɵɵelement(23, "i", 27);
|
|
100
|
+
i0.ɵɵelementEnd()()();
|
|
101
|
+
} if (rf & 2) {
|
|
102
|
+
const b_r6 = ctx.$implicit;
|
|
103
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
104
|
+
i0.ɵɵadvance(2);
|
|
105
|
+
i0.ɵɵtextInterpolate(b_r6.AgentName);
|
|
106
|
+
i0.ɵɵadvance(2);
|
|
107
|
+
i0.ɵɵtextInterpolate(b_r6.Record.Provider);
|
|
108
|
+
i0.ɵɵadvance(3);
|
|
109
|
+
i0.ɵɵclassProp("fa-arrow-right-from-bracket", b_r6.Record.Direction === "Outbound")("fa-arrow-right-to-bracket", b_r6.Record.Direction === "Inbound");
|
|
110
|
+
i0.ɵɵadvance();
|
|
111
|
+
i0.ɵɵtextInterpolate1(" ", b_r6.Record.Direction, " ");
|
|
112
|
+
i0.ɵɵadvance(2);
|
|
113
|
+
i0.ɵɵtextInterpolate(b_r6.Record.TurnMode);
|
|
114
|
+
i0.ɵɵadvance(2);
|
|
115
|
+
i0.ɵɵtextInterpolate(b_r6.ParticipantCount);
|
|
116
|
+
i0.ɵɵadvance(2);
|
|
117
|
+
i0.ɵɵclassMap(ctx_r3.BridgeStatusClass(b_r6.Record.Status));
|
|
118
|
+
i0.ɵɵadvance();
|
|
119
|
+
i0.ɵɵconditional(b_r6.Record.Status === "Connected" ? 15 : -1);
|
|
120
|
+
i0.ɵɵadvance();
|
|
121
|
+
i0.ɵɵtextInterpolate1(" ", b_r6.Record.Status, " ");
|
|
122
|
+
i0.ɵɵadvance(2);
|
|
123
|
+
i0.ɵɵtextInterpolate(ctx_r3.FormatBridgeStart(b_r6.StartedAt));
|
|
124
|
+
i0.ɵɵadvance();
|
|
125
|
+
i0.ɵɵproperty("title", b_r6.Record.HostInstanceID || "");
|
|
126
|
+
i0.ɵɵadvance();
|
|
127
|
+
i0.ɵɵtextInterpolate(b_r6.Record.HostInstanceID || "\u2014");
|
|
128
|
+
} }
|
|
129
|
+
function RealtimeManagementComponent_Conditional_1_Case_6_Template(rf, ctx) { if (rf & 1) {
|
|
130
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "div", 10)(2, "table", 11)(3, "thead")(4, "tr")(5, "th");
|
|
131
|
+
i0.ɵɵtext(6, "Agent");
|
|
132
|
+
i0.ɵɵelementEnd();
|
|
133
|
+
i0.ɵɵelementStart(7, "th");
|
|
134
|
+
i0.ɵɵtext(8, "Provider");
|
|
135
|
+
i0.ɵɵelementEnd();
|
|
136
|
+
i0.ɵɵelementStart(9, "th");
|
|
137
|
+
i0.ɵɵtext(10, "Direction");
|
|
138
|
+
i0.ɵɵelementEnd();
|
|
139
|
+
i0.ɵɵelementStart(11, "th");
|
|
140
|
+
i0.ɵɵtext(12, "Turn mode");
|
|
141
|
+
i0.ɵɵelementEnd();
|
|
142
|
+
i0.ɵɵelementStart(13, "th", 12);
|
|
143
|
+
i0.ɵɵtext(14, "Participants");
|
|
144
|
+
i0.ɵɵelementEnd();
|
|
145
|
+
i0.ɵɵelementStart(15, "th");
|
|
146
|
+
i0.ɵɵtext(16, "Status");
|
|
147
|
+
i0.ɵɵelementEnd();
|
|
148
|
+
i0.ɵɵelementStart(17, "th");
|
|
149
|
+
i0.ɵɵtext(18, "Started");
|
|
150
|
+
i0.ɵɵelementEnd();
|
|
151
|
+
i0.ɵɵelementStart(19, "th");
|
|
152
|
+
i0.ɵɵtext(20, "Host instance");
|
|
153
|
+
i0.ɵɵelementEnd();
|
|
154
|
+
i0.ɵɵelement(21, "th");
|
|
155
|
+
i0.ɵɵelementEnd()();
|
|
156
|
+
i0.ɵɵelementStart(22, "tbody");
|
|
157
|
+
i0.ɵɵconditionalCreate(23, RealtimeManagementComponent_Conditional_1_Case_6_Conditional_23_Template, 3, 0, "tr");
|
|
158
|
+
i0.ɵɵrepeaterCreate(24, RealtimeManagementComponent_Conditional_1_Case_6_For_25_Template, 24, 16, "tr", 13, _forTrack1);
|
|
159
|
+
i0.ɵɵelementEnd()()()();
|
|
160
|
+
i0.ɵɵelementStart(26, "div", 14)(27, "span", 15);
|
|
161
|
+
i0.ɵɵtext(28);
|
|
162
|
+
i0.ɵɵelementEnd()();
|
|
163
|
+
} if (rf & 2) {
|
|
164
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
165
|
+
i0.ɵɵadvance(23);
|
|
166
|
+
i0.ɵɵconditional(ctx_r3.LiveBridges.length === 0 ? 23 : -1);
|
|
167
|
+
i0.ɵɵadvance();
|
|
168
|
+
i0.ɵɵrepeater(ctx_r3.LiveBridges);
|
|
169
|
+
i0.ɵɵadvance(4);
|
|
170
|
+
i0.ɵɵtextInterpolate2("", ctx_r3.LiveCount, " live bridge", ctx_r3.LiveCount === 1 ? "" : "s");
|
|
171
|
+
} }
|
|
172
|
+
function RealtimeManagementComponent_Conditional_1_Case_7_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
173
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 28);
|
|
174
|
+
i0.ɵɵtext(2, "No bridge providers registered");
|
|
175
|
+
i0.ɵɵelementEnd()();
|
|
176
|
+
} }
|
|
177
|
+
function RealtimeManagementComponent_Conditional_1_Case_7_For_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
178
|
+
i0.ɵɵelementStart(0, "div", 30);
|
|
179
|
+
i0.ɵɵtext(1);
|
|
180
|
+
i0.ɵɵelementEnd();
|
|
181
|
+
} if (rf & 2) {
|
|
182
|
+
const p_r8 = i0.ɵɵnextContext().$implicit;
|
|
183
|
+
i0.ɵɵadvance();
|
|
184
|
+
i0.ɵɵtextInterpolate(p_r8.Record.Description);
|
|
185
|
+
} }
|
|
186
|
+
function RealtimeManagementComponent_Conditional_1_Case_7_For_20_For_16_Template(rf, ctx) { if (rf & 1) {
|
|
187
|
+
i0.ɵɵelementStart(0, "span", 34);
|
|
188
|
+
i0.ɵɵelement(1, "i");
|
|
189
|
+
i0.ɵɵelementEnd();
|
|
190
|
+
} if (rf & 2) {
|
|
191
|
+
const chip_r9 = ctx.$implicit;
|
|
192
|
+
i0.ɵɵproperty("title", chip_r9.Label);
|
|
193
|
+
i0.ɵɵadvance();
|
|
194
|
+
i0.ɵɵclassMap(chip_r9.Icon);
|
|
195
|
+
} }
|
|
196
|
+
function RealtimeManagementComponent_Conditional_1_Case_7_For_20_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
197
|
+
i0.ɵɵelementStart(0, "span", 35);
|
|
198
|
+
i0.ɵɵtext(1);
|
|
199
|
+
i0.ɵɵelementEnd();
|
|
200
|
+
} if (rf & 2) {
|
|
201
|
+
const p_r8 = i0.ɵɵnextContext().$implicit;
|
|
202
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
203
|
+
i0.ɵɵadvance();
|
|
204
|
+
i0.ɵɵtextInterpolate1("+", ctx_r3.CapabilityOverflowFor(p_r8.Record.ID));
|
|
205
|
+
} }
|
|
206
|
+
function RealtimeManagementComponent_Conditional_1_Case_7_For_20_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
207
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
208
|
+
i0.ɵɵtext(1, "none declared");
|
|
209
|
+
i0.ɵɵelementEnd();
|
|
210
|
+
} }
|
|
211
|
+
function RealtimeManagementComponent_Conditional_1_Case_7_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
212
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
213
|
+
i0.ɵɵelementStart(0, "tr", 17);
|
|
214
|
+
i0.ɵɵlistener("click", function RealtimeManagementComponent_Conditional_1_Case_7_For_20_Template_tr_click_0_listener() { const p_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.OpenProvider(p_r8.Record.ID)); });
|
|
215
|
+
i0.ɵɵelementStart(1, "td")(2, "div", 18);
|
|
216
|
+
i0.ɵɵelement(3, "i", 29);
|
|
217
|
+
i0.ɵɵtext(4);
|
|
218
|
+
i0.ɵɵelementEnd();
|
|
219
|
+
i0.ɵɵconditionalCreate(5, RealtimeManagementComponent_Conditional_1_Case_7_For_20_Conditional_5_Template, 2, 1, "div", 30);
|
|
220
|
+
i0.ɵɵelementEnd();
|
|
221
|
+
i0.ɵɵelementStart(6, "td");
|
|
222
|
+
i0.ɵɵtext(7);
|
|
223
|
+
i0.ɵɵelementEnd();
|
|
224
|
+
i0.ɵɵelementStart(8, "td")(9, "span", 31);
|
|
225
|
+
i0.ɵɵtext(10);
|
|
226
|
+
i0.ɵɵelementEnd()();
|
|
227
|
+
i0.ɵɵelementStart(11, "td", 32);
|
|
228
|
+
i0.ɵɵtext(12);
|
|
229
|
+
i0.ɵɵelementEnd();
|
|
230
|
+
i0.ɵɵelementStart(13, "td")(14, "span", 33);
|
|
231
|
+
i0.ɵɵrepeaterCreate(15, RealtimeManagementComponent_Conditional_1_Case_7_For_20_For_16_Template, 2, 3, "span", 34, _forTrack2);
|
|
232
|
+
i0.ɵɵconditionalCreate(17, RealtimeManagementComponent_Conditional_1_Case_7_For_20_Conditional_17_Template, 2, 1, "span", 35);
|
|
233
|
+
i0.ɵɵconditionalCreate(18, RealtimeManagementComponent_Conditional_1_Case_7_For_20_Conditional_18_Template, 2, 0, "span", 36);
|
|
234
|
+
i0.ɵɵelementEnd()();
|
|
235
|
+
i0.ɵɵelementStart(19, "td", 21);
|
|
236
|
+
i0.ɵɵtext(20);
|
|
237
|
+
i0.ɵɵelementEnd()();
|
|
238
|
+
} if (rf & 2) {
|
|
239
|
+
const p_r8 = ctx.$implicit;
|
|
240
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
241
|
+
i0.ɵɵadvance(3);
|
|
242
|
+
i0.ɵɵclassMap(ctx_r3.BridgeTypeIcon(p_r8.Record.BridgeType));
|
|
243
|
+
i0.ɵɵadvance();
|
|
244
|
+
i0.ɵɵtextInterpolate1(" ", p_r8.Record.Name, " ");
|
|
245
|
+
i0.ɵɵadvance();
|
|
246
|
+
i0.ɵɵconditional(p_r8.Record.Description ? 5 : -1);
|
|
247
|
+
i0.ɵɵadvance(2);
|
|
248
|
+
i0.ɵɵtextInterpolate(p_r8.Record.BridgeType);
|
|
249
|
+
i0.ɵɵadvance(2);
|
|
250
|
+
i0.ɵɵclassProp("status-connected", p_r8.Record.Status === "Active")("status-closed", p_r8.Record.Status !== "Active");
|
|
251
|
+
i0.ɵɵadvance();
|
|
252
|
+
i0.ɵɵtextInterpolate1(" ", p_r8.Record.Status, " ");
|
|
253
|
+
i0.ɵɵadvance();
|
|
254
|
+
i0.ɵɵproperty("title", p_r8.Record.DriverClass);
|
|
255
|
+
i0.ɵɵadvance();
|
|
256
|
+
i0.ɵɵtextInterpolate(p_r8.Record.DriverClass);
|
|
257
|
+
i0.ɵɵadvance(3);
|
|
258
|
+
i0.ɵɵrepeater(ctx_r3.CapabilityChipsFor(p_r8.Record.ID));
|
|
259
|
+
i0.ɵɵadvance(2);
|
|
260
|
+
i0.ɵɵconditional(ctx_r3.CapabilityOverflowFor(p_r8.Record.ID) > 0 ? 17 : -1);
|
|
261
|
+
i0.ɵɵadvance();
|
|
262
|
+
i0.ɵɵconditional(p_r8.FeatureCount === 0 ? 18 : -1);
|
|
263
|
+
i0.ɵɵadvance(2);
|
|
264
|
+
i0.ɵɵtextInterpolate(p_r8.Channels.length);
|
|
265
|
+
} }
|
|
266
|
+
function RealtimeManagementComponent_Conditional_1_Case_7_Template(rf, ctx) { if (rf & 1) {
|
|
267
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "div", 10)(2, "table", 11)(3, "thead")(4, "tr")(5, "th");
|
|
268
|
+
i0.ɵɵtext(6, "Provider");
|
|
269
|
+
i0.ɵɵelementEnd();
|
|
270
|
+
i0.ɵɵelementStart(7, "th");
|
|
271
|
+
i0.ɵɵtext(8, "Type");
|
|
272
|
+
i0.ɵɵelementEnd();
|
|
273
|
+
i0.ɵɵelementStart(9, "th");
|
|
274
|
+
i0.ɵɵtext(10, "Status");
|
|
275
|
+
i0.ɵɵelementEnd();
|
|
276
|
+
i0.ɵɵelementStart(11, "th");
|
|
277
|
+
i0.ɵɵtext(12, "Driver class");
|
|
278
|
+
i0.ɵɵelementEnd();
|
|
279
|
+
i0.ɵɵelementStart(13, "th");
|
|
280
|
+
i0.ɵɵtext(14, "Capabilities");
|
|
281
|
+
i0.ɵɵelementEnd();
|
|
282
|
+
i0.ɵɵelementStart(15, "th", 12);
|
|
283
|
+
i0.ɵɵtext(16, "Channels");
|
|
284
|
+
i0.ɵɵelementEnd()()();
|
|
285
|
+
i0.ɵɵelementStart(17, "tbody");
|
|
286
|
+
i0.ɵɵconditionalCreate(18, RealtimeManagementComponent_Conditional_1_Case_7_Conditional_18_Template, 3, 0, "tr");
|
|
287
|
+
i0.ɵɵrepeaterCreate(19, RealtimeManagementComponent_Conditional_1_Case_7_For_20_Template, 21, 15, "tr", 13, _forTrack1);
|
|
288
|
+
i0.ɵɵelementEnd()()()();
|
|
289
|
+
i0.ɵɵelementStart(21, "div", 14)(22, "span", 15);
|
|
290
|
+
i0.ɵɵtext(23);
|
|
291
|
+
i0.ɵɵelementEnd()();
|
|
292
|
+
} if (rf & 2) {
|
|
293
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
294
|
+
i0.ɵɵadvance(18);
|
|
295
|
+
i0.ɵɵconditional(ctx_r3.Providers.length === 0 ? 18 : -1);
|
|
296
|
+
i0.ɵɵadvance();
|
|
297
|
+
i0.ɵɵrepeater(ctx_r3.Providers);
|
|
298
|
+
i0.ɵɵadvance(4);
|
|
299
|
+
i0.ɵɵtextInterpolate2("", ctx_r3.Providers.length, " providers \u00B7 ", ctx_r3.ActiveProviderCount, " active");
|
|
300
|
+
} }
|
|
301
|
+
function RealtimeManagementComponent_Conditional_1_Case_8_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
302
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 28);
|
|
303
|
+
i0.ɵɵtext(2, "No agent identities provisioned");
|
|
304
|
+
i0.ɵɵelementEnd()();
|
|
305
|
+
} }
|
|
306
|
+
function RealtimeManagementComponent_Conditional_1_Case_8_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
307
|
+
i0.ɵɵelementStart(0, "tr", 13)(1, "td", 18);
|
|
308
|
+
i0.ɵɵtext(2);
|
|
309
|
+
i0.ɵɵelementEnd();
|
|
310
|
+
i0.ɵɵelementStart(3, "td");
|
|
311
|
+
i0.ɵɵtext(4);
|
|
312
|
+
i0.ɵɵelementEnd();
|
|
313
|
+
i0.ɵɵelementStart(5, "td")(6, "span", 37);
|
|
314
|
+
i0.ɵɵelement(7, "i");
|
|
315
|
+
i0.ɵɵtext(8);
|
|
316
|
+
i0.ɵɵelementEnd()();
|
|
317
|
+
i0.ɵɵelementStart(9, "td", 38);
|
|
318
|
+
i0.ɵɵtext(10);
|
|
319
|
+
i0.ɵɵelementEnd();
|
|
320
|
+
i0.ɵɵelementStart(11, "td", 36);
|
|
321
|
+
i0.ɵɵtext(12);
|
|
322
|
+
i0.ɵɵelementEnd();
|
|
323
|
+
i0.ɵɵelementStart(13, "td")(14, "span", 31);
|
|
324
|
+
i0.ɵɵtext(15);
|
|
325
|
+
i0.ɵɵelementEnd()()();
|
|
326
|
+
} if (rf & 2) {
|
|
327
|
+
const id_r10 = ctx.$implicit;
|
|
328
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
329
|
+
i0.ɵɵadvance(2);
|
|
330
|
+
i0.ɵɵtextInterpolate(id_r10.Agent || "Unknown agent");
|
|
331
|
+
i0.ɵɵadvance(2);
|
|
332
|
+
i0.ɵɵtextInterpolate(id_r10.Provider);
|
|
333
|
+
i0.ɵɵadvance(3);
|
|
334
|
+
i0.ɵɵclassMap(ctx_r3.IdentityTypeIcon(id_r10.IdentityType));
|
|
335
|
+
i0.ɵɵadvance();
|
|
336
|
+
i0.ɵɵtextInterpolate1(" ", id_r10.IdentityType);
|
|
337
|
+
i0.ɵɵadvance(2);
|
|
338
|
+
i0.ɵɵtextInterpolate(id_r10.IdentityValue);
|
|
339
|
+
i0.ɵɵadvance(2);
|
|
340
|
+
i0.ɵɵtextInterpolate(id_r10.DisplayName || "\u2014");
|
|
341
|
+
i0.ɵɵadvance(2);
|
|
342
|
+
i0.ɵɵclassProp("status-connected", id_r10.IsActive)("status-closed", !id_r10.IsActive);
|
|
343
|
+
i0.ɵɵadvance();
|
|
344
|
+
i0.ɵɵtextInterpolate1(" ", id_r10.IsActive ? "Active" : "Inactive", " ");
|
|
345
|
+
} }
|
|
346
|
+
function RealtimeManagementComponent_Conditional_1_Case_8_Template(rf, ctx) { if (rf & 1) {
|
|
347
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "div", 10)(2, "table", 11)(3, "thead")(4, "tr")(5, "th");
|
|
348
|
+
i0.ɵɵtext(6, "Agent");
|
|
349
|
+
i0.ɵɵelementEnd();
|
|
350
|
+
i0.ɵɵelementStart(7, "th");
|
|
351
|
+
i0.ɵɵtext(8, "Provider");
|
|
352
|
+
i0.ɵɵelementEnd();
|
|
353
|
+
i0.ɵɵelementStart(9, "th");
|
|
354
|
+
i0.ɵɵtext(10, "Type");
|
|
355
|
+
i0.ɵɵelementEnd();
|
|
356
|
+
i0.ɵɵelementStart(11, "th");
|
|
357
|
+
i0.ɵɵtext(12, "Identity");
|
|
358
|
+
i0.ɵɵelementEnd();
|
|
359
|
+
i0.ɵɵelementStart(13, "th");
|
|
360
|
+
i0.ɵɵtext(14, "Display name");
|
|
361
|
+
i0.ɵɵelementEnd();
|
|
362
|
+
i0.ɵɵelementStart(15, "th");
|
|
363
|
+
i0.ɵɵtext(16, "Active");
|
|
364
|
+
i0.ɵɵelementEnd()()();
|
|
365
|
+
i0.ɵɵelementStart(17, "tbody");
|
|
366
|
+
i0.ɵɵconditionalCreate(18, RealtimeManagementComponent_Conditional_1_Case_8_Conditional_18_Template, 3, 0, "tr");
|
|
367
|
+
i0.ɵɵrepeaterCreate(19, RealtimeManagementComponent_Conditional_1_Case_8_For_20_Template, 16, 12, "tr", 13, _forTrack3);
|
|
368
|
+
i0.ɵɵelementEnd()()()();
|
|
369
|
+
i0.ɵɵelementStart(21, "div", 14)(22, "span", 15);
|
|
370
|
+
i0.ɵɵtext(23);
|
|
371
|
+
i0.ɵɵelementEnd()();
|
|
372
|
+
} if (rf & 2) {
|
|
373
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
374
|
+
i0.ɵɵadvance(18);
|
|
375
|
+
i0.ɵɵconditional(ctx_r3.Identities.length === 0 ? 18 : -1);
|
|
376
|
+
i0.ɵɵadvance();
|
|
377
|
+
i0.ɵɵrepeater(ctx_r3.Identities);
|
|
378
|
+
i0.ɵɵadvance(4);
|
|
379
|
+
i0.ɵɵtextInterpolate2("", ctx_r3.Identities.length, " identities \u00B7 ", ctx_r3.ActiveIdentityCount, " active");
|
|
380
|
+
} }
|
|
381
|
+
function RealtimeManagementComponent_Conditional_1_Case_9_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
382
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 39);
|
|
383
|
+
i0.ɵɵtext(2, "No channels registered");
|
|
384
|
+
i0.ɵɵelementEnd()();
|
|
385
|
+
} }
|
|
386
|
+
function RealtimeManagementComponent_Conditional_1_Case_9_For_16_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
387
|
+
i0.ɵɵelementStart(0, "div", 30);
|
|
388
|
+
i0.ɵɵtext(1);
|
|
389
|
+
i0.ɵɵelementEnd();
|
|
390
|
+
} if (rf & 2) {
|
|
391
|
+
const ch_r11 = i0.ɵɵnextContext().$implicit;
|
|
392
|
+
i0.ɵɵadvance();
|
|
393
|
+
i0.ɵɵtextInterpolate(ch_r11.Description);
|
|
394
|
+
} }
|
|
395
|
+
function RealtimeManagementComponent_Conditional_1_Case_9_For_16_For_15_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
396
|
+
i0.ɵɵelement(0, "i", 43);
|
|
397
|
+
} }
|
|
398
|
+
function RealtimeManagementComponent_Conditional_1_Case_9_For_16_For_15_Template(rf, ctx) { if (rf & 1) {
|
|
399
|
+
i0.ɵɵelementStart(0, "span", 42);
|
|
400
|
+
i0.ɵɵtext(1);
|
|
401
|
+
i0.ɵɵconditionalCreate(2, RealtimeManagementComponent_Conditional_1_Case_9_For_16_For_15_Conditional_2_Template, 1, 0, "i", 43);
|
|
402
|
+
i0.ɵɵelementEnd();
|
|
403
|
+
} if (rf & 2) {
|
|
404
|
+
const pc_r12 = ctx.$implicit;
|
|
405
|
+
i0.ɵɵclassProp("provider-tag--default", pc_r12.IsDefault);
|
|
406
|
+
i0.ɵɵproperty("title", pc_r12.IsDefault ? "Auto-attached by default" : "Available on demand");
|
|
407
|
+
i0.ɵɵadvance();
|
|
408
|
+
i0.ɵɵtextInterpolate1(" ", pc_r12.Provider, " ");
|
|
409
|
+
i0.ɵɵadvance();
|
|
410
|
+
i0.ɵɵconditional(pc_r12.IsDefault ? 2 : -1);
|
|
411
|
+
} }
|
|
412
|
+
function RealtimeManagementComponent_Conditional_1_Case_9_For_16_ForEmpty_16_Template(rf, ctx) { if (rf & 1) {
|
|
413
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
414
|
+
i0.ɵɵtext(1, "no provider contributions");
|
|
415
|
+
i0.ɵɵelementEnd();
|
|
416
|
+
} }
|
|
417
|
+
function RealtimeManagementComponent_Conditional_1_Case_9_For_16_Template(rf, ctx) { if (rf & 1) {
|
|
418
|
+
i0.ɵɵelementStart(0, "tr", 13)(1, "td")(2, "div", 18);
|
|
419
|
+
i0.ɵɵtext(3);
|
|
420
|
+
i0.ɵɵelementEnd();
|
|
421
|
+
i0.ɵɵconditionalCreate(4, RealtimeManagementComponent_Conditional_1_Case_9_For_16_Conditional_4_Template, 2, 1, "div", 30);
|
|
422
|
+
i0.ɵɵelementEnd();
|
|
423
|
+
i0.ɵɵelementStart(5, "td")(6, "span", 37);
|
|
424
|
+
i0.ɵɵelement(7, "i");
|
|
425
|
+
i0.ɵɵtext(8);
|
|
426
|
+
i0.ɵɵelementEnd()();
|
|
427
|
+
i0.ɵɵelementStart(9, "td")(10, "span", 31);
|
|
428
|
+
i0.ɵɵtext(11);
|
|
429
|
+
i0.ɵɵelementEnd()();
|
|
430
|
+
i0.ɵɵelementStart(12, "td")(13, "span", 40);
|
|
431
|
+
i0.ɵɵrepeaterCreate(14, RealtimeManagementComponent_Conditional_1_Case_9_For_16_For_15_Template, 3, 5, "span", 41, _forTrack3, false, RealtimeManagementComponent_Conditional_1_Case_9_For_16_ForEmpty_16_Template, 2, 0, "span", 36);
|
|
432
|
+
i0.ɵɵelementEnd()()();
|
|
433
|
+
} if (rf & 2) {
|
|
434
|
+
const ch_r11 = ctx.$implicit;
|
|
435
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
436
|
+
i0.ɵɵadvance(3);
|
|
437
|
+
i0.ɵɵtextInterpolate(ch_r11.Name);
|
|
438
|
+
i0.ɵɵadvance();
|
|
439
|
+
i0.ɵɵconditional(ch_r11.Description ? 4 : -1);
|
|
440
|
+
i0.ɵɵadvance(3);
|
|
441
|
+
i0.ɵɵclassMap(ctx_r3.TransportTypeIcon(ch_r11.TransportType));
|
|
442
|
+
i0.ɵɵadvance();
|
|
443
|
+
i0.ɵɵtextInterpolate1(" ", ch_r11.TransportType);
|
|
444
|
+
i0.ɵɵadvance(2);
|
|
445
|
+
i0.ɵɵclassProp("status-connected", ch_r11.IsActive)("status-closed", !ch_r11.IsActive);
|
|
446
|
+
i0.ɵɵadvance();
|
|
447
|
+
i0.ɵɵtextInterpolate1(" ", ch_r11.IsActive ? "Active" : "Inactive", " ");
|
|
448
|
+
i0.ɵɵadvance(3);
|
|
449
|
+
i0.ɵɵrepeater(ctx_r3.ProvidersForChannel(ch_r11.ID));
|
|
450
|
+
} }
|
|
451
|
+
function RealtimeManagementComponent_Conditional_1_Case_9_Template(rf, ctx) { if (rf & 1) {
|
|
452
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "div", 10)(2, "table", 11)(3, "thead")(4, "tr")(5, "th");
|
|
453
|
+
i0.ɵɵtext(6, "Channel");
|
|
454
|
+
i0.ɵɵelementEnd();
|
|
455
|
+
i0.ɵɵelementStart(7, "th");
|
|
456
|
+
i0.ɵɵtext(8, "Transport");
|
|
457
|
+
i0.ɵɵelementEnd();
|
|
458
|
+
i0.ɵɵelementStart(9, "th");
|
|
459
|
+
i0.ɵɵtext(10, "Active");
|
|
460
|
+
i0.ɵɵelementEnd();
|
|
461
|
+
i0.ɵɵelementStart(11, "th");
|
|
462
|
+
i0.ɵɵtext(12, "Contributed by");
|
|
463
|
+
i0.ɵɵelementEnd()()();
|
|
464
|
+
i0.ɵɵelementStart(13, "tbody");
|
|
465
|
+
i0.ɵɵconditionalCreate(14, RealtimeManagementComponent_Conditional_1_Case_9_Conditional_14_Template, 3, 0, "tr");
|
|
466
|
+
i0.ɵɵrepeaterCreate(15, RealtimeManagementComponent_Conditional_1_Case_9_For_16_Template, 17, 11, "tr", 13, _forTrack3);
|
|
467
|
+
i0.ɵɵelementEnd()()()();
|
|
468
|
+
i0.ɵɵelementStart(17, "div", 14)(18, "span", 15);
|
|
469
|
+
i0.ɵɵtext(19);
|
|
470
|
+
i0.ɵɵelementEnd()();
|
|
471
|
+
} if (rf & 2) {
|
|
472
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
473
|
+
i0.ɵɵadvance(14);
|
|
474
|
+
i0.ɵɵconditional(ctx_r3.Channels.length === 0 ? 14 : -1);
|
|
475
|
+
i0.ɵɵadvance();
|
|
476
|
+
i0.ɵɵrepeater(ctx_r3.Channels);
|
|
477
|
+
i0.ɵɵadvance(4);
|
|
478
|
+
i0.ɵɵtextInterpolate2("", ctx_r3.Channels.length, " channels \u00B7 ", ctx_r3.ProviderChannels.length, " provider contributions");
|
|
479
|
+
} }
|
|
480
|
+
function RealtimeManagementComponent_Conditional_1_Case_10_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
481
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 28);
|
|
482
|
+
i0.ɵɵtext(2, "No co-agent pairings configured");
|
|
483
|
+
i0.ɵɵelementEnd()();
|
|
484
|
+
} }
|
|
485
|
+
function RealtimeManagementComponent_Conditional_1_Case_10_For_20_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
486
|
+
i0.ɵɵelementStart(0, "span", 44);
|
|
487
|
+
i0.ɵɵelement(1, "i", 43);
|
|
488
|
+
i0.ɵɵtext(2, " default");
|
|
489
|
+
i0.ɵɵelementEnd();
|
|
490
|
+
} }
|
|
491
|
+
function RealtimeManagementComponent_Conditional_1_Case_10_For_20_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
492
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
493
|
+
i0.ɵɵtext(1, "\u2014");
|
|
494
|
+
i0.ɵɵelementEnd();
|
|
495
|
+
} }
|
|
496
|
+
function RealtimeManagementComponent_Conditional_1_Case_10_For_20_Template(rf, ctx) { if (rf & 1) {
|
|
497
|
+
i0.ɵɵelementStart(0, "tr", 13)(1, "td", 18);
|
|
498
|
+
i0.ɵɵtext(2);
|
|
499
|
+
i0.ɵɵelementEnd();
|
|
500
|
+
i0.ɵɵelementStart(3, "td");
|
|
501
|
+
i0.ɵɵtext(4);
|
|
502
|
+
i0.ɵɵelementEnd();
|
|
503
|
+
i0.ɵɵelementStart(5, "td")(6, "span", 37);
|
|
504
|
+
i0.ɵɵtext(7);
|
|
505
|
+
i0.ɵɵelementEnd()();
|
|
506
|
+
i0.ɵɵelementStart(8, "td");
|
|
507
|
+
i0.ɵɵconditionalCreate(9, RealtimeManagementComponent_Conditional_1_Case_10_For_20_Conditional_9_Template, 3, 0, "span", 44)(10, RealtimeManagementComponent_Conditional_1_Case_10_For_20_Conditional_10_Template, 2, 0, "span", 36);
|
|
508
|
+
i0.ɵɵelementEnd();
|
|
509
|
+
i0.ɵɵelementStart(11, "td", 21);
|
|
510
|
+
i0.ɵɵtext(12);
|
|
511
|
+
i0.ɵɵelementEnd();
|
|
512
|
+
i0.ɵɵelementStart(13, "td")(14, "span", 31);
|
|
513
|
+
i0.ɵɵtext(15);
|
|
514
|
+
i0.ɵɵelementEnd()()();
|
|
515
|
+
} if (rf & 2) {
|
|
516
|
+
const c_r13 = ctx.$implicit;
|
|
517
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
518
|
+
i0.ɵɵadvance(2);
|
|
519
|
+
i0.ɵɵtextInterpolate(c_r13.CoAgent || "Unknown");
|
|
520
|
+
i0.ɵɵadvance(2);
|
|
521
|
+
i0.ɵɵtextInterpolate(ctx_r3.CoAgentTargetLabel(c_r13));
|
|
522
|
+
i0.ɵɵadvance(3);
|
|
523
|
+
i0.ɵɵtextInterpolate(c_r13.Type);
|
|
524
|
+
i0.ɵɵadvance(2);
|
|
525
|
+
i0.ɵɵconditional(c_r13.IsDefault ? 9 : 10);
|
|
526
|
+
i0.ɵɵadvance(3);
|
|
527
|
+
i0.ɵɵtextInterpolate(c_r13.Sequence);
|
|
528
|
+
i0.ɵɵadvance(2);
|
|
529
|
+
i0.ɵɵclassProp("status-connected", c_r13.Status === "Active")("status-closed", c_r13.Status !== "Active");
|
|
530
|
+
i0.ɵɵadvance();
|
|
531
|
+
i0.ɵɵtextInterpolate1(" ", c_r13.Status, " ");
|
|
532
|
+
} }
|
|
533
|
+
function RealtimeManagementComponent_Conditional_1_Case_10_Template(rf, ctx) { if (rf & 1) {
|
|
534
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "div", 10)(2, "table", 11)(3, "thead")(4, "tr")(5, "th");
|
|
535
|
+
i0.ɵɵtext(6, "Co-Agent");
|
|
536
|
+
i0.ɵɵelementEnd();
|
|
537
|
+
i0.ɵɵelementStart(7, "th");
|
|
538
|
+
i0.ɵɵtext(8, "Pairs with");
|
|
539
|
+
i0.ɵɵelementEnd();
|
|
540
|
+
i0.ɵɵelementStart(9, "th");
|
|
541
|
+
i0.ɵɵtext(10, "Relationship");
|
|
542
|
+
i0.ɵɵelementEnd();
|
|
543
|
+
i0.ɵɵelementStart(11, "th");
|
|
544
|
+
i0.ɵɵtext(12, "Default");
|
|
545
|
+
i0.ɵɵelementEnd();
|
|
546
|
+
i0.ɵɵelementStart(13, "th", 12);
|
|
547
|
+
i0.ɵɵtext(14, "Seq");
|
|
548
|
+
i0.ɵɵelementEnd();
|
|
549
|
+
i0.ɵɵelementStart(15, "th");
|
|
550
|
+
i0.ɵɵtext(16, "Status");
|
|
551
|
+
i0.ɵɵelementEnd()()();
|
|
552
|
+
i0.ɵɵelementStart(17, "tbody");
|
|
553
|
+
i0.ɵɵconditionalCreate(18, RealtimeManagementComponent_Conditional_1_Case_10_Conditional_18_Template, 3, 0, "tr");
|
|
554
|
+
i0.ɵɵrepeaterCreate(19, RealtimeManagementComponent_Conditional_1_Case_10_For_20_Template, 16, 10, "tr", 13, _forTrack3);
|
|
555
|
+
i0.ɵɵelementEnd()()()();
|
|
556
|
+
i0.ɵɵelementStart(21, "div", 14)(22, "span", 15);
|
|
557
|
+
i0.ɵɵtext(23);
|
|
558
|
+
i0.ɵɵelementEnd()();
|
|
559
|
+
} if (rf & 2) {
|
|
560
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
561
|
+
i0.ɵɵadvance(18);
|
|
562
|
+
i0.ɵɵconditional(ctx_r3.CoAgents.length === 0 ? 18 : -1);
|
|
563
|
+
i0.ɵɵadvance();
|
|
564
|
+
i0.ɵɵrepeater(ctx_r3.CoAgents);
|
|
565
|
+
i0.ɵɵadvance(4);
|
|
566
|
+
i0.ɵɵtextInterpolate2("", ctx_r3.CoAgents.length, " pairings \u00B7 ", ctx_r3.ActiveCoAgentCount, " active");
|
|
567
|
+
} }
|
|
568
|
+
function RealtimeManagementComponent_Conditional_1_Case_11_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
569
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 45);
|
|
570
|
+
i0.ɵɵtext(2, "No closed bridges in this window");
|
|
571
|
+
i0.ɵɵelementEnd()();
|
|
572
|
+
} }
|
|
573
|
+
function RealtimeManagementComponent_Conditional_1_Case_11_For_23_Template(rf, ctx) { if (rf & 1) {
|
|
574
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
575
|
+
i0.ɵɵelementStart(0, "tr", 17);
|
|
576
|
+
i0.ɵɵlistener("click", function RealtimeManagementComponent_Conditional_1_Case_11_For_23_Template_tr_click_0_listener() { const b_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r3 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r3.OpenSession(b_r15.Record.AgentSessionID)); });
|
|
577
|
+
i0.ɵɵelementStart(1, "td", 18);
|
|
578
|
+
i0.ɵɵtext(2);
|
|
579
|
+
i0.ɵɵelementEnd();
|
|
580
|
+
i0.ɵɵelementStart(3, "td");
|
|
581
|
+
i0.ɵɵtext(4);
|
|
582
|
+
i0.ɵɵelementEnd();
|
|
583
|
+
i0.ɵɵelementStart(5, "td");
|
|
584
|
+
i0.ɵɵtext(6);
|
|
585
|
+
i0.ɵɵelementEnd();
|
|
586
|
+
i0.ɵɵelementStart(7, "td", 21);
|
|
587
|
+
i0.ɵɵtext(8);
|
|
588
|
+
i0.ɵɵelementEnd();
|
|
589
|
+
i0.ɵɵelementStart(9, "td", 46);
|
|
590
|
+
i0.ɵɵtext(10);
|
|
591
|
+
i0.ɵɵelementEnd();
|
|
592
|
+
i0.ɵɵelementStart(11, "td")(12, "span");
|
|
593
|
+
i0.ɵɵtext(13);
|
|
594
|
+
i0.ɵɵelementEnd()();
|
|
595
|
+
i0.ɵɵelementStart(14, "td", 23);
|
|
596
|
+
i0.ɵɵtext(15);
|
|
597
|
+
i0.ɵɵelementEnd();
|
|
598
|
+
i0.ɵɵelementStart(16, "td", 25)(17, "button", 26);
|
|
599
|
+
i0.ɵɵlistener("click", function RealtimeManagementComponent_Conditional_1_Case_11_For_23_Template_button_click_17_listener($event) { const b_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r3 = i0.ɵɵnextContext(3); ctx_r3.OpenSession(b_r15.Record.AgentSessionID); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
600
|
+
i0.ɵɵelement(18, "i", 27);
|
|
601
|
+
i0.ɵɵelementEnd()()();
|
|
602
|
+
} if (rf & 2) {
|
|
603
|
+
const b_r15 = ctx.$implicit;
|
|
604
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
605
|
+
i0.ɵɵadvance(2);
|
|
606
|
+
i0.ɵɵtextInterpolate(b_r15.AgentName);
|
|
607
|
+
i0.ɵɵadvance(2);
|
|
608
|
+
i0.ɵɵtextInterpolate(b_r15.Record.Provider);
|
|
609
|
+
i0.ɵɵadvance(2);
|
|
610
|
+
i0.ɵɵtextInterpolate(b_r15.Record.JoinMethod);
|
|
611
|
+
i0.ɵɵadvance(2);
|
|
612
|
+
i0.ɵɵtextInterpolate(b_r15.ParticipantCount);
|
|
613
|
+
i0.ɵɵadvance(2);
|
|
614
|
+
i0.ɵɵtextInterpolate(ctx_r3.FormatBridgeDuration(b_r15.DurationMs));
|
|
615
|
+
i0.ɵɵadvance(2);
|
|
616
|
+
i0.ɵɵclassMap(ctx_r3.CloseReasonClass(b_r15.Record.CloseReason));
|
|
617
|
+
i0.ɵɵadvance();
|
|
618
|
+
i0.ɵɵtextInterpolate1(" ", b_r15.Record.CloseReason || "unknown", " ");
|
|
619
|
+
i0.ɵɵadvance(2);
|
|
620
|
+
i0.ɵɵtextInterpolate(ctx_r3.FormatBridgeStart(b_r15.StartedAt));
|
|
621
|
+
} }
|
|
622
|
+
function RealtimeManagementComponent_Conditional_1_Case_11_Template(rf, ctx) { if (rf & 1) {
|
|
623
|
+
i0.ɵɵelementStart(0, "div", 9)(1, "div", 10)(2, "table", 11)(3, "thead")(4, "tr")(5, "th");
|
|
624
|
+
i0.ɵɵtext(6, "Agent");
|
|
625
|
+
i0.ɵɵelementEnd();
|
|
626
|
+
i0.ɵɵelementStart(7, "th");
|
|
627
|
+
i0.ɵɵtext(8, "Provider");
|
|
628
|
+
i0.ɵɵelementEnd();
|
|
629
|
+
i0.ɵɵelementStart(9, "th");
|
|
630
|
+
i0.ɵɵtext(10, "Join method");
|
|
631
|
+
i0.ɵɵelementEnd();
|
|
632
|
+
i0.ɵɵelementStart(11, "th", 12);
|
|
633
|
+
i0.ɵɵtext(12, "Participants");
|
|
634
|
+
i0.ɵɵelementEnd();
|
|
635
|
+
i0.ɵɵelementStart(13, "th", 12);
|
|
636
|
+
i0.ɵɵtext(14, "Duration");
|
|
637
|
+
i0.ɵɵelementEnd();
|
|
638
|
+
i0.ɵɵelementStart(15, "th");
|
|
639
|
+
i0.ɵɵtext(16, "Close reason");
|
|
640
|
+
i0.ɵɵelementEnd();
|
|
641
|
+
i0.ɵɵelementStart(17, "th");
|
|
642
|
+
i0.ɵɵtext(18, "Started");
|
|
643
|
+
i0.ɵɵelementEnd();
|
|
644
|
+
i0.ɵɵelement(19, "th");
|
|
645
|
+
i0.ɵɵelementEnd()();
|
|
646
|
+
i0.ɵɵelementStart(20, "tbody");
|
|
647
|
+
i0.ɵɵconditionalCreate(21, RealtimeManagementComponent_Conditional_1_Case_11_Conditional_21_Template, 3, 0, "tr");
|
|
648
|
+
i0.ɵɵrepeaterCreate(22, RealtimeManagementComponent_Conditional_1_Case_11_For_23_Template, 19, 9, "tr", 13, _forTrack1);
|
|
649
|
+
i0.ɵɵelementEnd()()()();
|
|
650
|
+
i0.ɵɵelementStart(24, "div", 14)(25, "span", 15);
|
|
651
|
+
i0.ɵɵtext(26);
|
|
652
|
+
i0.ɵɵelementEnd()();
|
|
653
|
+
} if (rf & 2) {
|
|
654
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
655
|
+
i0.ɵɵadvance(21);
|
|
656
|
+
i0.ɵɵconditional(ctx_r3.HistoryBridges.length === 0 ? 21 : -1);
|
|
657
|
+
i0.ɵɵadvance();
|
|
658
|
+
i0.ɵɵrepeater(ctx_r3.HistoryBridges);
|
|
659
|
+
i0.ɵɵadvance(4);
|
|
660
|
+
i0.ɵɵtextInterpolate3("", ctx_r3.HistoryCount, " closed bridge", ctx_r3.HistoryCount === 1 ? "" : "s", " (", ctx_r3.TimeRange, ")");
|
|
661
|
+
} }
|
|
662
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
663
|
+
i0.ɵɵelementStart(0, "div", 49);
|
|
664
|
+
i0.ɵɵtext(1, "No bridge activity in this window");
|
|
665
|
+
i0.ɵɵelementEnd();
|
|
666
|
+
} }
|
|
667
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_5_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
668
|
+
i0.ɵɵelementStart(0, "div", 52)(1, "div", 53);
|
|
669
|
+
i0.ɵɵelement(2, "div", 54);
|
|
670
|
+
i0.ɵɵelementEnd();
|
|
671
|
+
i0.ɵɵelementStart(3, "div", 55);
|
|
672
|
+
i0.ɵɵtext(4);
|
|
673
|
+
i0.ɵɵelementEnd()();
|
|
674
|
+
} if (rf & 2) {
|
|
675
|
+
const bucket_r16 = ctx.$implicit;
|
|
676
|
+
const ctx_r3 = i0.ɵɵnextContext(4);
|
|
677
|
+
i0.ɵɵproperty("title", bucket_r16.Label + ": " + bucket_r16.Count);
|
|
678
|
+
i0.ɵɵadvance(2);
|
|
679
|
+
i0.ɵɵstyleProp("height", ctx_r3.DayBarHeight(bucket_r16.Count), "%");
|
|
680
|
+
i0.ɵɵadvance(2);
|
|
681
|
+
i0.ɵɵtextInterpolate(bucket_r16.Count);
|
|
682
|
+
} }
|
|
683
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
684
|
+
i0.ɵɵelementStart(0, "div", 50);
|
|
685
|
+
i0.ɵɵrepeaterCreate(1, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_5_For_2_Template, 5, 4, "div", 52, _forTrack2);
|
|
686
|
+
i0.ɵɵelementEnd();
|
|
687
|
+
} if (rf & 2) {
|
|
688
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
689
|
+
i0.ɵɵadvance();
|
|
690
|
+
i0.ɵɵrepeater(ctx_r3.DayBuckets);
|
|
691
|
+
} }
|
|
692
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
693
|
+
i0.ɵɵelementStart(0, "div", 49);
|
|
694
|
+
i0.ɵɵtext(1, "No data");
|
|
695
|
+
i0.ɵɵelementEnd();
|
|
696
|
+
} }
|
|
697
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_10_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
698
|
+
i0.ɵɵelementStart(0, "div", 56)(1, "span", 57);
|
|
699
|
+
i0.ɵɵtext(2);
|
|
700
|
+
i0.ɵɵelementEnd();
|
|
701
|
+
i0.ɵɵelementStart(3, "div", 58);
|
|
702
|
+
i0.ɵɵelement(4, "div", 59);
|
|
703
|
+
i0.ɵɵelementEnd();
|
|
704
|
+
i0.ɵɵelementStart(5, "span", 60);
|
|
705
|
+
i0.ɵɵtext(6);
|
|
706
|
+
i0.ɵɵelementEnd()();
|
|
707
|
+
} if (rf & 2) {
|
|
708
|
+
const slice_r17 = ctx.$implicit;
|
|
709
|
+
const ctx_r3 = i0.ɵɵnextContext(4);
|
|
710
|
+
i0.ɵɵadvance();
|
|
711
|
+
i0.ɵɵproperty("title", slice_r17.Label);
|
|
712
|
+
i0.ɵɵadvance();
|
|
713
|
+
i0.ɵɵtextInterpolate(slice_r17.Label);
|
|
714
|
+
i0.ɵɵadvance(2);
|
|
715
|
+
i0.ɵɵstyleProp("width", ctx_r3.SliceBarWidth(ctx_r3.ByProvider, slice_r17.Count), "%");
|
|
716
|
+
i0.ɵɵadvance(2);
|
|
717
|
+
i0.ɵɵtextInterpolate(slice_r17.Count);
|
|
718
|
+
} }
|
|
719
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
720
|
+
i0.ɵɵrepeaterCreate(0, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_10_For_1_Template, 7, 5, "div", 56, _forTrack2);
|
|
721
|
+
} if (rf & 2) {
|
|
722
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
723
|
+
i0.ɵɵrepeater(ctx_r3.ByProvider);
|
|
724
|
+
} }
|
|
725
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
726
|
+
i0.ɵɵelementStart(0, "div", 49);
|
|
727
|
+
i0.ɵɵtext(1, "No data");
|
|
728
|
+
i0.ɵɵelementEnd();
|
|
729
|
+
} }
|
|
730
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_15_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
731
|
+
i0.ɵɵelementStart(0, "div", 56)(1, "span", 57);
|
|
732
|
+
i0.ɵɵtext(2);
|
|
733
|
+
i0.ɵɵelementEnd();
|
|
734
|
+
i0.ɵɵelementStart(3, "div", 58);
|
|
735
|
+
i0.ɵɵelement(4, "div", 59);
|
|
736
|
+
i0.ɵɵelementEnd();
|
|
737
|
+
i0.ɵɵelementStart(5, "span", 60);
|
|
738
|
+
i0.ɵɵtext(6);
|
|
739
|
+
i0.ɵɵelementEnd()();
|
|
740
|
+
} if (rf & 2) {
|
|
741
|
+
const slice_r18 = ctx.$implicit;
|
|
742
|
+
const ctx_r3 = i0.ɵɵnextContext(4);
|
|
743
|
+
i0.ɵɵadvance();
|
|
744
|
+
i0.ɵɵproperty("title", slice_r18.Label);
|
|
745
|
+
i0.ɵɵadvance();
|
|
746
|
+
i0.ɵɵtextInterpolate(slice_r18.Label);
|
|
747
|
+
i0.ɵɵadvance(2);
|
|
748
|
+
i0.ɵɵstyleProp("width", ctx_r3.SliceBarWidth(ctx_r3.ByStatus, slice_r18.Count), "%");
|
|
749
|
+
i0.ɵɵadvance(2);
|
|
750
|
+
i0.ɵɵtextInterpolate(slice_r18.Count);
|
|
751
|
+
} }
|
|
752
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
753
|
+
i0.ɵɵrepeaterCreate(0, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_15_For_1_Template, 7, 5, "div", 56, _forTrack2);
|
|
754
|
+
} if (rf & 2) {
|
|
755
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
756
|
+
i0.ɵɵrepeater(ctx_r3.ByStatus);
|
|
757
|
+
} }
|
|
758
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
759
|
+
i0.ɵɵelementStart(0, "div", 49);
|
|
760
|
+
i0.ɵɵtext(1, "No data");
|
|
761
|
+
i0.ɵɵelementEnd();
|
|
762
|
+
} }
|
|
763
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_20_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
764
|
+
i0.ɵɵelementStart(0, "div", 56)(1, "span", 57);
|
|
765
|
+
i0.ɵɵtext(2);
|
|
766
|
+
i0.ɵɵelementEnd();
|
|
767
|
+
i0.ɵɵelementStart(3, "div", 58);
|
|
768
|
+
i0.ɵɵelement(4, "div", 59);
|
|
769
|
+
i0.ɵɵelementEnd();
|
|
770
|
+
i0.ɵɵelementStart(5, "span", 60);
|
|
771
|
+
i0.ɵɵtext(6);
|
|
772
|
+
i0.ɵɵelementEnd()();
|
|
773
|
+
} if (rf & 2) {
|
|
774
|
+
const slice_r19 = ctx.$implicit;
|
|
775
|
+
const ctx_r3 = i0.ɵɵnextContext(4);
|
|
776
|
+
i0.ɵɵadvance();
|
|
777
|
+
i0.ɵɵproperty("title", slice_r19.Label);
|
|
778
|
+
i0.ɵɵadvance();
|
|
779
|
+
i0.ɵɵtextInterpolate(slice_r19.Label);
|
|
780
|
+
i0.ɵɵadvance(2);
|
|
781
|
+
i0.ɵɵstyleProp("width", ctx_r3.SliceBarWidth(ctx_r3.ByAgent, slice_r19.Count), "%");
|
|
782
|
+
i0.ɵɵadvance(2);
|
|
783
|
+
i0.ɵɵtextInterpolate(slice_r19.Count);
|
|
784
|
+
} }
|
|
785
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
786
|
+
i0.ɵɵrepeaterCreate(0, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_20_For_1_Template, 7, 5, "div", 56, _forTrack2);
|
|
787
|
+
} if (rf & 2) {
|
|
788
|
+
const ctx_r3 = i0.ɵɵnextContext(3);
|
|
789
|
+
i0.ɵɵrepeater(ctx_r3.ByAgent);
|
|
790
|
+
} }
|
|
791
|
+
function RealtimeManagementComponent_Conditional_1_Case_12_Template(rf, ctx) { if (rf & 1) {
|
|
792
|
+
i0.ɵɵelementStart(0, "div", 7)(1, "div", 47)(2, "div", 48);
|
|
793
|
+
i0.ɵɵtext(3, "Bridges over time");
|
|
794
|
+
i0.ɵɵelementEnd();
|
|
795
|
+
i0.ɵɵconditionalCreate(4, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_4_Template, 2, 0, "div", 49)(5, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_5_Template, 3, 0, "div", 50);
|
|
796
|
+
i0.ɵɵelementEnd();
|
|
797
|
+
i0.ɵɵelementStart(6, "div", 51)(7, "div", 48);
|
|
798
|
+
i0.ɵɵtext(8, "By provider");
|
|
799
|
+
i0.ɵɵelementEnd();
|
|
800
|
+
i0.ɵɵconditionalCreate(9, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_9_Template, 2, 0, "div", 49)(10, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_10_Template, 2, 0);
|
|
801
|
+
i0.ɵɵelementEnd();
|
|
802
|
+
i0.ɵɵelementStart(11, "div", 51)(12, "div", 48);
|
|
803
|
+
i0.ɵɵtext(13, "By status");
|
|
804
|
+
i0.ɵɵelementEnd();
|
|
805
|
+
i0.ɵɵconditionalCreate(14, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_14_Template, 2, 0, "div", 49)(15, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_15_Template, 2, 0);
|
|
806
|
+
i0.ɵɵelementEnd();
|
|
807
|
+
i0.ɵɵelementStart(16, "div", 51)(17, "div", 48);
|
|
808
|
+
i0.ɵɵtext(18, "By agent");
|
|
809
|
+
i0.ɵɵelementEnd();
|
|
810
|
+
i0.ɵɵconditionalCreate(19, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_19_Template, 2, 0, "div", 49)(20, RealtimeManagementComponent_Conditional_1_Case_12_Conditional_20_Template, 2, 0);
|
|
811
|
+
i0.ɵɵelementEnd()();
|
|
812
|
+
} if (rf & 2) {
|
|
813
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
814
|
+
i0.ɵɵadvance(4);
|
|
815
|
+
i0.ɵɵconditional(ctx_r3.DayBuckets.length === 0 ? 4 : 5);
|
|
816
|
+
i0.ɵɵadvance(5);
|
|
817
|
+
i0.ɵɵconditional(ctx_r3.ByProvider.length === 0 ? 9 : 10);
|
|
818
|
+
i0.ɵɵadvance(5);
|
|
819
|
+
i0.ɵɵconditional(ctx_r3.ByStatus.length === 0 ? 14 : 15);
|
|
820
|
+
i0.ɵɵadvance(5);
|
|
821
|
+
i0.ɵɵconditional(ctx_r3.ByAgent.length === 0 ? 19 : 20);
|
|
822
|
+
} }
|
|
823
|
+
function RealtimeManagementComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
824
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
825
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "div", 3);
|
|
826
|
+
i0.ɵɵrepeaterCreate(2, RealtimeManagementComponent_Conditional_1_For_3_Template, 4, 5, "button", 4, _forTrack0);
|
|
827
|
+
i0.ɵɵelementEnd();
|
|
828
|
+
i0.ɵɵelementStart(4, "button", 5);
|
|
829
|
+
i0.ɵɵlistener("click", function RealtimeManagementComponent_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.LoadData()); });
|
|
830
|
+
i0.ɵɵelement(5, "i", 6);
|
|
831
|
+
i0.ɵɵelementEnd()();
|
|
832
|
+
i0.ɵɵconditionalCreate(6, RealtimeManagementComponent_Conditional_1_Case_6_Template, 29, 3)(7, RealtimeManagementComponent_Conditional_1_Case_7_Template, 24, 3)(8, RealtimeManagementComponent_Conditional_1_Case_8_Template, 24, 3)(9, RealtimeManagementComponent_Conditional_1_Case_9_Template, 20, 3)(10, RealtimeManagementComponent_Conditional_1_Case_10_Template, 24, 3)(11, RealtimeManagementComponent_Conditional_1_Case_11_Template, 27, 4)(12, RealtimeManagementComponent_Conditional_1_Case_12_Template, 21, 4, "div", 7);
|
|
833
|
+
} if (rf & 2) {
|
|
834
|
+
let tmp_2_0;
|
|
835
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
836
|
+
i0.ɵɵadvance(2);
|
|
837
|
+
i0.ɵɵrepeater(ctx_r3.SubTabs);
|
|
838
|
+
i0.ɵɵadvance(4);
|
|
839
|
+
i0.ɵɵconditional((tmp_2_0 = ctx_r3.ActiveSubTab) === "live-sessions" ? 6 : tmp_2_0 === "providers" ? 7 : tmp_2_0 === "identities" ? 8 : tmp_2_0 === "channels" ? 9 : tmp_2_0 === "co-agents" ? 10 : tmp_2_0 === "history" ? 11 : tmp_2_0 === "metrics" ? 12 : -1);
|
|
840
|
+
} }
|
|
841
|
+
const SUB_TAB_PREF_KEY = 'mj.realtimeDashboard.subTab';
|
|
842
|
+
export class RealtimeManagementComponent extends BaseAngularComponent {
|
|
843
|
+
// ── Inputs ──
|
|
844
|
+
_timeRange = '7d';
|
|
845
|
+
set TimeRange(value) {
|
|
846
|
+
const prev = this._timeRange;
|
|
847
|
+
this._timeRange = value;
|
|
848
|
+
if (prev !== value && this.initialized)
|
|
849
|
+
this.LoadData();
|
|
850
|
+
}
|
|
851
|
+
get TimeRange() { return this._timeRange; }
|
|
852
|
+
// ── State ──
|
|
853
|
+
initialized = false;
|
|
854
|
+
cdr = inject(ChangeDetectorRef);
|
|
855
|
+
dataset = null;
|
|
856
|
+
IsLoading = false;
|
|
857
|
+
ActiveSubTab = 'live-sessions';
|
|
858
|
+
SubTabs = [
|
|
859
|
+
{ Key: 'live-sessions', Label: 'Live Sessions', Icon: 'fa-solid fa-tower-broadcast' },
|
|
860
|
+
{ Key: 'providers', Label: 'Bridge Providers', Icon: 'fa-solid fa-network-wired' },
|
|
861
|
+
{ Key: 'identities', Label: 'Agent Identities', Icon: 'fa-solid fa-id-badge' },
|
|
862
|
+
{ Key: 'channels', Label: 'Channels', Icon: 'fa-solid fa-satellite-dish' },
|
|
863
|
+
{ Key: 'co-agents', Label: 'Co-Agents', Icon: 'fa-solid fa-people-arrows' },
|
|
864
|
+
{ Key: 'history', Label: 'Session History', Icon: 'fa-solid fa-clock-rotate-left' },
|
|
865
|
+
{ Key: 'metrics', Label: 'Metrics', Icon: 'fa-solid fa-chart-column' }
|
|
866
|
+
];
|
|
867
|
+
// ── View models (rebuilt on load) ──
|
|
868
|
+
LiveBridges = [];
|
|
869
|
+
HistoryBridges = [];
|
|
870
|
+
Providers = [];
|
|
871
|
+
Identities = [];
|
|
872
|
+
Channels = [];
|
|
873
|
+
ProviderChannels = [];
|
|
874
|
+
CoAgents = [];
|
|
875
|
+
// Metrics
|
|
876
|
+
DayBuckets = [];
|
|
877
|
+
ByProvider = [];
|
|
878
|
+
ByStatus = [];
|
|
879
|
+
ByAgent = [];
|
|
880
|
+
// ── Provider capability summary cache (chips + remainder) ──
|
|
881
|
+
capabilityChips = new Map();
|
|
882
|
+
// ── Lifecycle ──
|
|
883
|
+
async ngOnInit() {
|
|
884
|
+
this.loadPrefs();
|
|
885
|
+
this.initialized = true;
|
|
886
|
+
await this.LoadData();
|
|
887
|
+
}
|
|
888
|
+
// ── Sub-tab navigation ──
|
|
889
|
+
SelectSubTab(key) {
|
|
890
|
+
if (key === this.ActiveSubTab)
|
|
891
|
+
return;
|
|
892
|
+
this.ActiveSubTab = key;
|
|
893
|
+
this.savePrefs();
|
|
894
|
+
this.cdr.detectChanges();
|
|
895
|
+
}
|
|
896
|
+
// ── Data loading ──
|
|
897
|
+
/** Reloads the whole management surface for the current time range. */
|
|
898
|
+
async LoadData() {
|
|
899
|
+
this.IsLoading = true;
|
|
900
|
+
this.cdr.detectChanges();
|
|
901
|
+
try {
|
|
902
|
+
this.dataset = await LoadRealtimeManagementDataset(this.ProviderToUse, this.TimeRange);
|
|
903
|
+
this.applyDataset(this.dataset);
|
|
904
|
+
}
|
|
905
|
+
catch (e) {
|
|
906
|
+
console.error('Realtime management load error:', e);
|
|
907
|
+
}
|
|
908
|
+
finally {
|
|
909
|
+
this.IsLoading = false;
|
|
910
|
+
this.cdr.detectChanges();
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
applyDataset(ds) {
|
|
914
|
+
this.LiveBridges = ds.LiveBridges;
|
|
915
|
+
this.HistoryBridges = ds.HistoryBridges;
|
|
916
|
+
this.Providers = ds.Providers;
|
|
917
|
+
this.Identities = ds.Identities;
|
|
918
|
+
this.Channels = ds.Channels;
|
|
919
|
+
this.ProviderChannels = ds.ProviderChannels;
|
|
920
|
+
this.CoAgents = ds.CoAgents;
|
|
921
|
+
this.capabilityChips.clear();
|
|
922
|
+
for (const p of ds.Providers) {
|
|
923
|
+
this.capabilityChips.set(p.Record.ID, BuildCapabilityChips(p.Features));
|
|
924
|
+
}
|
|
925
|
+
this.DayBuckets = BucketSessionBridgesByDay(ds.AllBridges, ds.WindowStart, new Date());
|
|
926
|
+
this.ByProvider = SummarizeBridgesByProvider(ds.AllBridges);
|
|
927
|
+
this.ByStatus = SummarizeBridgesByStatus(ds.AllBridges);
|
|
928
|
+
this.ByAgent = SummarizeBridgesByAgent(ds.AllBridges);
|
|
929
|
+
}
|
|
930
|
+
// ── Drill-in ──
|
|
931
|
+
/** Opens the AIAgentSession record behind a bridge via the shared record-open path. */
|
|
932
|
+
OpenSession(sessionId) {
|
|
933
|
+
const key = new CompositeKey();
|
|
934
|
+
key.LoadFromSingleKeyValuePair('ID', sessionId);
|
|
935
|
+
SharedService.Instance.OpenEntityRecord('MJ: AI Agent Sessions', key);
|
|
936
|
+
}
|
|
937
|
+
/** Opens a bridge provider record. */
|
|
938
|
+
OpenProvider(providerId) {
|
|
939
|
+
const key = new CompositeKey();
|
|
940
|
+
key.LoadFromSingleKeyValuePair('ID', providerId);
|
|
941
|
+
SharedService.Instance.OpenEntityRecord('MJ: AI Bridge Providers', key);
|
|
942
|
+
}
|
|
943
|
+
// ── Capability summary accessors (template helpers) ──
|
|
944
|
+
/** First N capability chips for a provider (kept compact in the grid). */
|
|
945
|
+
CapabilityChipsFor(providerId, limit = 4) {
|
|
946
|
+
return (this.capabilityChips.get(providerId) ?? []).slice(0, limit);
|
|
947
|
+
}
|
|
948
|
+
/** Count of capability chips beyond the displayed `limit` (for a "+N" pill). */
|
|
949
|
+
CapabilityOverflowFor(providerId, limit = 4) {
|
|
950
|
+
const total = this.capabilityChips.get(providerId)?.length ?? 0;
|
|
951
|
+
return Math.max(0, total - limit);
|
|
952
|
+
}
|
|
953
|
+
// ── Channel surface helpers ──
|
|
954
|
+
/** Providers contributing a given channel (for the Channels grid). */
|
|
955
|
+
ProvidersForChannel(channelId) {
|
|
956
|
+
const target = channelId.toLowerCase();
|
|
957
|
+
return this.ProviderChannels.filter(pc => pc.ChannelID.toLowerCase() === target);
|
|
958
|
+
}
|
|
959
|
+
// ── Co-agent helpers ──
|
|
960
|
+
/** Human-readable pairing target — a specific agent or a whole agent type. */
|
|
961
|
+
CoAgentTargetLabel(row) {
|
|
962
|
+
if (row.TargetAgent)
|
|
963
|
+
return row.TargetAgent;
|
|
964
|
+
if (row.TargetAgentType)
|
|
965
|
+
return `Type: ${row.TargetAgentType}`;
|
|
966
|
+
return '—';
|
|
967
|
+
}
|
|
968
|
+
// ── Metric rendering helpers ──
|
|
969
|
+
/** Max count across day buckets (for bar height scaling); min 1 to avoid /0. */
|
|
970
|
+
get MaxDayCount() {
|
|
971
|
+
return Math.max(1, ...this.DayBuckets.map(b => b.Count));
|
|
972
|
+
}
|
|
973
|
+
/** Bar height percentage for a day bucket. */
|
|
974
|
+
DayBarHeight(count) {
|
|
975
|
+
return Math.round((count / this.MaxDayCount) * 100);
|
|
976
|
+
}
|
|
977
|
+
/** Max slice count (for horizontal bar scaling); min 1. */
|
|
978
|
+
maxSlice(slices) {
|
|
979
|
+
return Math.max(1, ...slices.map(s => s.Count));
|
|
980
|
+
}
|
|
981
|
+
/** Bar width percentage for a metric slice. */
|
|
982
|
+
SliceBarWidth(slices, count) {
|
|
983
|
+
return Math.round((count / this.maxSlice(slices)) * 100);
|
|
984
|
+
}
|
|
985
|
+
// ── Summary getters ──
|
|
986
|
+
get LiveCount() { return this.LiveBridges.length; }
|
|
987
|
+
get HistoryCount() { return this.HistoryBridges.length; }
|
|
988
|
+
get ActiveProviderCount() {
|
|
989
|
+
return this.Providers.filter(p => p.Record.Status === 'Active').length;
|
|
990
|
+
}
|
|
991
|
+
get ActiveIdentityCount() {
|
|
992
|
+
return this.Identities.filter(i => i.IsActive).length;
|
|
993
|
+
}
|
|
994
|
+
get ActiveCoAgentCount() {
|
|
995
|
+
return this.CoAgents.filter(c => c.Status === 'Active').length;
|
|
996
|
+
}
|
|
997
|
+
// ── Pure presentation helpers (delegated to the data module) ──
|
|
998
|
+
BridgeTypeIcon = BridgeTypeIcon;
|
|
999
|
+
IdentityTypeIcon = IdentityTypeIcon;
|
|
1000
|
+
TransportTypeIcon = TransportTypeIcon;
|
|
1001
|
+
FormatBridgeDuration = FormatBridgeDuration;
|
|
1002
|
+
FormatBridgeStart = FormatBridgeStart;
|
|
1003
|
+
/** CSS class for a bridge status pill. */
|
|
1004
|
+
BridgeStatusClass(status) {
|
|
1005
|
+
switch (status) {
|
|
1006
|
+
case 'Connected': return 'status-pill status-connected';
|
|
1007
|
+
case 'Connecting':
|
|
1008
|
+
case 'Pending':
|
|
1009
|
+
case 'Scheduled': return 'status-pill status-pending';
|
|
1010
|
+
case 'Disconnecting': return 'status-pill status-pending';
|
|
1011
|
+
case 'Failed': return 'status-pill status-failed';
|
|
1012
|
+
default: return 'status-pill status-closed';
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
/** CSS class for a session-bridge close-reason pill. */
|
|
1016
|
+
CloseReasonClass(reason) {
|
|
1017
|
+
switch (reason) {
|
|
1018
|
+
case 'Error': return 'reason-pill reason-error';
|
|
1019
|
+
case 'Janitor': return 'reason-pill reason-janitor';
|
|
1020
|
+
case 'HostEnded': return 'reason-pill reason-hostended';
|
|
1021
|
+
case 'Shutdown': return 'reason-pill reason-shutdown';
|
|
1022
|
+
case 'Explicit': return 'reason-pill reason-explicit';
|
|
1023
|
+
default: return 'reason-pill reason-unknown';
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
// ── Preferences ──
|
|
1027
|
+
loadPrefs() {
|
|
1028
|
+
try {
|
|
1029
|
+
const raw = UserInfoEngine.Instance.GetSetting(SUB_TAB_PREF_KEY);
|
|
1030
|
+
if (raw) {
|
|
1031
|
+
const prefs = JSON.parse(raw);
|
|
1032
|
+
if (prefs.subTab && this.SubTabs.some(t => t.Key === prefs.subTab)) {
|
|
1033
|
+
this.ActiveSubTab = prefs.subTab;
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
catch {
|
|
1038
|
+
// Use defaults on parse failure.
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
savePrefs() {
|
|
1042
|
+
const prefs = { subTab: this.ActiveSubTab };
|
|
1043
|
+
UserInfoEngine.Instance.SetSettingDebounced(SUB_TAB_PREF_KEY, JSON.stringify(prefs));
|
|
1044
|
+
}
|
|
1045
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵRealtimeManagementComponent_BaseFactory; return function RealtimeManagementComponent_Factory(__ngFactoryType__) { return (ɵRealtimeManagementComponent_BaseFactory || (ɵRealtimeManagementComponent_BaseFactory = i0.ɵɵgetInheritedFactory(RealtimeManagementComponent)))(__ngFactoryType__ || RealtimeManagementComponent); }; })();
|
|
1046
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeManagementComponent, selectors: [["app-realtime-management"]], inputs: { TimeRange: "TimeRange" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "loading-container"], ["text", "Loading realtime surface..."], [1, "subtab-bar"], [1, "subtabs"], [1, "subtab", 3, "subtab--active"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Refresh", 3, "click"], [1, "fa-solid", "fa-rotate"], [1, "metrics-grid"], [1, "subtab", 3, "click"], [1, "panel"], [1, "table-wrapper"], [1, "data-table"], [1, "th-numeric"], [1, "data-row"], [1, "grid-footer"], [1, "grid-summary"], ["colspan", "9", 1, "empty-row"], [1, "data-row", 3, "click"], [1, "cell-strong"], [1, "dir-pill"], [1, "fa-solid"], [1, "cell-numeric"], [1, "dot", "dot--live"], [1, "cell-time"], [1, "cell-host", "mono", 3, "title"], [1, "cell-action"], ["mjButton", "", "variant", "icon", "size", "sm", "title", "Open session record", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], ["colspan", "6", 1, "empty-row"], [1, "type-icon"], [1, "cell-sub"], [1, "status-pill"], [1, "mono", "cell-host", 3, "title"], [1, "cap-chips"], [1, "cap-chip", 3, "title"], [1, "cap-more"], [1, "cell-muted"], [1, "type-chip"], [1, "mono"], ["colspan", "4", 1, "empty-row"], [1, "provider-tags"], [1, "provider-tag", 3, "provider-tag--default", "title"], [1, "provider-tag", 3, "title"], [1, "fa-solid", "fa-star"], [1, "default-pill"], ["colspan", "8", 1, "empty-row"], [1, "cell-numeric", "mono"], [1, "metric-card", "metric-card--wide"], [1, "metric-title"], [1, "metric-empty"], [1, "bar-chart"], [1, "metric-card"], [1, "bar-col", 3, "title"], [1, "bar-track"], [1, "bar-fill"], [1, "bar-value"], [1, "hbar-row"], [1, "hbar-label", 3, "title"], [1, "hbar-track"], [1, "hbar-fill"], [1, "hbar-count"]], template: function RealtimeManagementComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1047
|
+
i0.ɵɵconditionalCreate(0, RealtimeManagementComponent_Conditional_0_Template, 2, 0, "div", 0)(1, RealtimeManagementComponent_Conditional_1_Template, 13, 1);
|
|
1048
|
+
} if (rf & 2) {
|
|
1049
|
+
i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
|
|
1050
|
+
} }, dependencies: [i1.LoadingComponent, i2.MJButtonDirective], styles: ["[_nghost-%COMP%] { display: block; }\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n\n\n.subtab-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.subtabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n flex: 1;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 4px;\n}\n\n.subtab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n padding: 7px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n white-space: nowrap;\n}\n\n.subtab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.subtab--active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.subtab[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 12px; }\n\n\n\n.panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.table-wrapper[_ngcontent-%COMP%] { overflow-x: auto; }\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n}\n\n.th-numeric[_ngcontent-%COMP%] { text-align: right; }\n\n.data-row[_ngcontent-%COMP%] { transition: background 0.15s; }\n.data-row[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n\n.cell-strong[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.cell-sub[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n max-width: 360px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.cell-muted[_ngcontent-%COMP%] { color: var(--mj-text-muted); }\n\n.cell-numeric[_ngcontent-%COMP%] {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n}\n\n.cell-time[_ngcontent-%COMP%] {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.cell-host[_ngcontent-%COMP%] {\n max-width: 220px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--mj-text-muted);\n}\n\n.cell-action[_ngcontent-%COMP%] { text-align: right; white-space: nowrap; }\n\n.type-icon[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n.mono[_ngcontent-%COMP%] {\n font-family: var(--mj-font-mono, monospace);\n font-size: 12px;\n}\n\n.empty-row[_ngcontent-%COMP%] {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n}\n\n\n\n.status-pill[_ngcontent-%COMP%], \n.reason-pill[_ngcontent-%COMP%], \n.type-chip[_ngcontent-%COMP%], \n.dir-pill[_ngcontent-%COMP%], \n.default-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n white-space: nowrap;\n}\n\n.status-connected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-failed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-closed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 14%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n.dot--live[_ngcontent-%COMP%] {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: var(--mj-status-success);\n animation: _ngcontent-%COMP%_pulse-live 1.6s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse-live {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n\n.dir-pill[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.type-chip[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.default-pill[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n.reason-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n.reason-janitor[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n.reason-hostended[_ngcontent-%COMP%], \n.reason-explicit[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.reason-shutdown[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n.reason-unknown[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-disabled) 14%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n\n\n.cap-chips[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.cap-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 22px;\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n font-size: 11px;\n}\n\n.cap-more[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n\n\n.provider-tags[_ngcontent-%COMP%] {\n display: inline-flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.provider-tag[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n}\n\n.provider-tag--default[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.provider-tag[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 9px; }\n\n\n\n.grid-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-top: 14px;\n flex-wrap: wrap;\n}\n\n.grid-summary[_ngcontent-%COMP%] {\n font-size: 12.5px;\n color: var(--mj-text-muted);\n}\n\n\n\n.metrics-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n}\n\n.metric-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 18px;\n}\n\n.metric-card--wide[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.metric-title[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 14px;\n}\n\n.metric-empty[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-disabled);\n padding: 20px 0;\n text-align: center;\n}\n\n\n\n.bar-chart[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-end;\n gap: 6px;\n height: 160px;\n overflow-x: auto;\n}\n\n.bar-col[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n height: 100%;\n}\n\n.bar-track[_ngcontent-%COMP%] {\n flex: 1;\n width: 100%;\n display: flex;\n align-items: flex-end;\n}\n\n.bar-fill[_ngcontent-%COMP%] {\n width: 100%;\n min-height: 2px;\n border-radius: 4px 4px 0 0;\n background: var(--mj-brand-primary);\n transition: height 0.3s ease;\n}\n\n.bar-value[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums;\n}\n\n\n\n.hbar-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n}\n\n.hbar-label[_ngcontent-%COMP%] {\n flex: 0 0 110px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.hbar-track[_ngcontent-%COMP%] {\n flex: 1;\n height: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.hbar-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n transition: width 0.3s ease;\n}\n\n.hbar-count[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n min-width: 24px;\n text-align: right;\n}"] });
|
|
1051
|
+
}
|
|
1052
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeManagementComponent, [{
|
|
1053
|
+
type: Component,
|
|
1054
|
+
args: [{ standalone: false, selector: 'app-realtime-management', template: "@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading realtime surface...\"></mj-loading>\n </div>\n} @else {\n <!-- Sub-tab rail + refresh -->\n <div class=\"subtab-bar\">\n <div class=\"subtabs\">\n @for (tab of SubTabs; track tab.Key) {\n <button class=\"subtab\" [class.subtab--active]=\"ActiveSubTab === tab.Key\"\n (click)=\"SelectSubTab(tab.Key)\">\n <i [class]=\"tab.Icon\"></i>\n <span>{{ tab.Label }}</span>\n </button>\n }\n </div>\n <button mjButton variant=\"secondary\" size=\"sm\" title=\"Refresh\" (click)=\"LoadData()\">\n <i class=\"fa-solid fa-rotate\"></i>\n </button>\n </div>\n\n @switch (ActiveSubTab) {\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 LIVE SESSIONS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @case ('live-sessions') {\n <div class=\"panel\">\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Agent</th>\n <th>Provider</th>\n <th>Direction</th>\n <th>Turn mode</th>\n <th class=\"th-numeric\">Participants</th>\n <th>Status</th>\n <th>Started</th>\n <th>Host instance</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @if (LiveBridges.length === 0) {\n <tr><td colspan=\"9\" class=\"empty-row\">No live bridged sessions right now</td></tr>\n }\n @for (b of LiveBridges; track b.Record.ID) {\n <tr class=\"data-row\" (click)=\"OpenSession(b.Record.AgentSessionID)\">\n <td class=\"cell-strong\">{{ b.AgentName }}</td>\n <td>{{ b.Record.Provider }}</td>\n <td>\n <span class=\"dir-pill\">\n <i class=\"fa-solid\"\n [class.fa-arrow-right-from-bracket]=\"b.Record.Direction === 'Outbound'\"\n [class.fa-arrow-right-to-bracket]=\"b.Record.Direction === 'Inbound'\"></i>\n {{ b.Record.Direction }}\n </span>\n </td>\n <td>{{ b.Record.TurnMode }}</td>\n <td class=\"cell-numeric\">{{ b.ParticipantCount }}</td>\n <td>\n <span [class]=\"BridgeStatusClass(b.Record.Status)\">\n @if (b.Record.Status === 'Connected') { <span class=\"dot dot--live\"></span> }\n {{ b.Record.Status }}\n </span>\n </td>\n <td class=\"cell-time\">{{ FormatBridgeStart(b.StartedAt) }}</td>\n <td class=\"cell-host mono\" [title]=\"b.Record.HostInstanceID || ''\">{{ b.Record.HostInstanceID || '\u2014' }}</td>\n <td class=\"cell-action\">\n <!-- TODO(v1+): replace with the observer-console deep link (\u00A71 read-only monitor). -->\n <button mjButton variant=\"icon\" size=\"sm\" title=\"Open session record\"\n (click)=\"OpenSession(b.Record.AgentSessionID); $event.stopPropagation()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"grid-footer\">\n <span class=\"grid-summary\">{{ LiveCount }} live bridge{{ LiveCount === 1 ? '' : 's' }}</span>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 BRIDGE PROVIDERS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @case ('providers') {\n <div class=\"panel\">\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Provider</th>\n <th>Type</th>\n <th>Status</th>\n <th>Driver class</th>\n <th>Capabilities</th>\n <th class=\"th-numeric\">Channels</th>\n </tr>\n </thead>\n <tbody>\n @if (Providers.length === 0) {\n <tr><td colspan=\"6\" class=\"empty-row\">No bridge providers registered</td></tr>\n }\n @for (p of Providers; track p.Record.ID) {\n <tr class=\"data-row\" (click)=\"OpenProvider(p.Record.ID)\">\n <td>\n <div class=\"cell-strong\">\n <i [class]=\"BridgeTypeIcon(p.Record.BridgeType)\" class=\"type-icon\"></i>\n {{ p.Record.Name }}\n </div>\n @if (p.Record.Description) {\n <div class=\"cell-sub\">{{ p.Record.Description }}</div>\n }\n </td>\n <td>{{ p.Record.BridgeType }}</td>\n <td>\n <span class=\"status-pill\" [class.status-connected]=\"p.Record.Status === 'Active'\"\n [class.status-closed]=\"p.Record.Status !== 'Active'\">\n {{ p.Record.Status }}\n </span>\n </td>\n <td class=\"mono cell-host\" [title]=\"p.Record.DriverClass\">{{ p.Record.DriverClass }}</td>\n <td>\n <span class=\"cap-chips\">\n @for (chip of CapabilityChipsFor(p.Record.ID); track chip.Label) {\n <span class=\"cap-chip\" [title]=\"chip.Label\"><i [class]=\"chip.Icon\"></i></span>\n }\n @if (CapabilityOverflowFor(p.Record.ID) > 0) {\n <span class=\"cap-more\">+{{ CapabilityOverflowFor(p.Record.ID) }}</span>\n }\n @if (p.FeatureCount === 0) {\n <span class=\"cell-muted\">none declared</span>\n }\n </span>\n </td>\n <td class=\"cell-numeric\">{{ p.Channels.length }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"grid-footer\">\n <span class=\"grid-summary\">{{ Providers.length }} providers \u00B7 {{ ActiveProviderCount }} active</span>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 AGENT IDENTITIES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @case ('identities') {\n <div class=\"panel\">\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Agent</th>\n <th>Provider</th>\n <th>Type</th>\n <th>Identity</th>\n <th>Display name</th>\n <th>Active</th>\n </tr>\n </thead>\n <tbody>\n @if (Identities.length === 0) {\n <tr><td colspan=\"6\" class=\"empty-row\">No agent identities provisioned</td></tr>\n }\n @for (id of Identities; track id.ID) {\n <tr class=\"data-row\">\n <td class=\"cell-strong\">{{ id.Agent || 'Unknown agent' }}</td>\n <td>{{ id.Provider }}</td>\n <td>\n <span class=\"type-chip\"><i [class]=\"IdentityTypeIcon(id.IdentityType)\"></i> {{ id.IdentityType }}</span>\n </td>\n <td class=\"mono\">{{ id.IdentityValue }}</td>\n <td class=\"cell-muted\">{{ id.DisplayName || '\u2014' }}</td>\n <td>\n <span class=\"status-pill\" [class.status-connected]=\"id.IsActive\"\n [class.status-closed]=\"!id.IsActive\">\n {{ id.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"grid-footer\">\n <span class=\"grid-summary\">{{ Identities.length }} identities \u00B7 {{ ActiveIdentityCount }} active</span>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CHANNELS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @case ('channels') {\n <div class=\"panel\">\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Channel</th>\n <th>Transport</th>\n <th>Active</th>\n <th>Contributed by</th>\n </tr>\n </thead>\n <tbody>\n @if (Channels.length === 0) {\n <tr><td colspan=\"4\" class=\"empty-row\">No channels registered</td></tr>\n }\n @for (ch of Channels; track ch.ID) {\n <tr class=\"data-row\">\n <td>\n <div class=\"cell-strong\">{{ ch.Name }}</div>\n @if (ch.Description) { <div class=\"cell-sub\">{{ ch.Description }}</div> }\n </td>\n <td>\n <span class=\"type-chip\"><i [class]=\"TransportTypeIcon(ch.TransportType)\"></i> {{ ch.TransportType }}</span>\n </td>\n <td>\n <span class=\"status-pill\" [class.status-connected]=\"ch.IsActive\"\n [class.status-closed]=\"!ch.IsActive\">\n {{ ch.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </td>\n <td>\n <span class=\"provider-tags\">\n @for (pc of ProvidersForChannel(ch.ID); track pc.ID) {\n <span class=\"provider-tag\" [class.provider-tag--default]=\"pc.IsDefault\"\n [title]=\"pc.IsDefault ? 'Auto-attached by default' : 'Available on demand'\">\n {{ pc.Provider }}\n @if (pc.IsDefault) { <i class=\"fa-solid fa-star\"></i> }\n </span>\n } @empty {\n <span class=\"cell-muted\">no provider contributions</span>\n }\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"grid-footer\">\n <span class=\"grid-summary\">{{ Channels.length }} channels \u00B7 {{ ProviderChannels.length }} provider contributions</span>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CO-AGENTS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @case ('co-agents') {\n <div class=\"panel\">\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Co-Agent</th>\n <th>Pairs with</th>\n <th>Relationship</th>\n <th>Default</th>\n <th class=\"th-numeric\">Seq</th>\n <th>Status</th>\n </tr>\n </thead>\n <tbody>\n @if (CoAgents.length === 0) {\n <tr><td colspan=\"6\" class=\"empty-row\">No co-agent pairings configured</td></tr>\n }\n @for (c of CoAgents; track c.ID) {\n <tr class=\"data-row\">\n <td class=\"cell-strong\">{{ c.CoAgent || 'Unknown' }}</td>\n <td>{{ CoAgentTargetLabel(c) }}</td>\n <td><span class=\"type-chip\">{{ c.Type }}</span></td>\n <td>\n @if (c.IsDefault) {\n <span class=\"default-pill\"><i class=\"fa-solid fa-star\"></i> default</span>\n } @else { <span class=\"cell-muted\">\u2014</span> }\n </td>\n <td class=\"cell-numeric\">{{ c.Sequence }}</td>\n <td>\n <span class=\"status-pill\" [class.status-connected]=\"c.Status === 'Active'\"\n [class.status-closed]=\"c.Status !== 'Active'\">\n {{ c.Status }}\n </span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"grid-footer\">\n <span class=\"grid-summary\">{{ CoAgents.length }} pairings \u00B7 {{ ActiveCoAgentCount }} active</span>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SESSION HISTORY \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @case ('history') {\n <div class=\"panel\">\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Agent</th>\n <th>Provider</th>\n <th>Join method</th>\n <th class=\"th-numeric\">Participants</th>\n <th class=\"th-numeric\">Duration</th>\n <th>Close reason</th>\n <th>Started</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @if (HistoryBridges.length === 0) {\n <tr><td colspan=\"8\" class=\"empty-row\">No closed bridges in this window</td></tr>\n }\n @for (b of HistoryBridges; track b.Record.ID) {\n <tr class=\"data-row\" (click)=\"OpenSession(b.Record.AgentSessionID)\">\n <td class=\"cell-strong\">{{ b.AgentName }}</td>\n <td>{{ b.Record.Provider }}</td>\n <td>{{ b.Record.JoinMethod }}</td>\n <td class=\"cell-numeric\">{{ b.ParticipantCount }}</td>\n <td class=\"cell-numeric mono\">{{ FormatBridgeDuration(b.DurationMs) }}</td>\n <td>\n <span [class]=\"CloseReasonClass(b.Record.CloseReason)\">\n {{ b.Record.CloseReason || 'unknown' }}\n </span>\n </td>\n <td class=\"cell-time\">{{ FormatBridgeStart(b.StartedAt) }}</td>\n <td class=\"cell-action\">\n <!-- TODO(v1+): transcript / recording review launch (\u00A77 review reuse). -->\n <button mjButton variant=\"icon\" size=\"sm\" title=\"Open session record\"\n (click)=\"OpenSession(b.Record.AgentSessionID); $event.stopPropagation()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"grid-footer\">\n <span class=\"grid-summary\">{{ HistoryCount }} closed bridge{{ HistoryCount === 1 ? '' : 's' }} ({{ TimeRange }})</span>\n </div>\n }\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 METRICS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n @case ('metrics') {\n <div class=\"metrics-grid\">\n <!-- Bridges over time (per-day bars) -->\n <div class=\"metric-card metric-card--wide\">\n <div class=\"metric-title\">Bridges over time</div>\n @if (DayBuckets.length === 0) {\n <div class=\"metric-empty\">No bridge activity in this window</div>\n } @else {\n <div class=\"bar-chart\">\n @for (bucket of DayBuckets; track bucket.Label) {\n <div class=\"bar-col\" [title]=\"bucket.Label + ': ' + bucket.Count\">\n <div class=\"bar-track\">\n <div class=\"bar-fill\" [style.height.%]=\"DayBarHeight(bucket.Count)\"></div>\n </div>\n <div class=\"bar-value\">{{ bucket.Count }}</div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- By provider -->\n <div class=\"metric-card\">\n <div class=\"metric-title\">By provider</div>\n @if (ByProvider.length === 0) {\n <div class=\"metric-empty\">No data</div>\n } @else {\n @for (slice of ByProvider; track slice.Label) {\n <div class=\"hbar-row\">\n <span class=\"hbar-label\" [title]=\"slice.Label\">{{ slice.Label }}</span>\n <div class=\"hbar-track\">\n <div class=\"hbar-fill\" [style.width.%]=\"SliceBarWidth(ByProvider, slice.Count)\"></div>\n </div>\n <span class=\"hbar-count\">{{ slice.Count }}</span>\n </div>\n }\n }\n </div>\n\n <!-- By status -->\n <div class=\"metric-card\">\n <div class=\"metric-title\">By status</div>\n @if (ByStatus.length === 0) {\n <div class=\"metric-empty\">No data</div>\n } @else {\n @for (slice of ByStatus; track slice.Label) {\n <div class=\"hbar-row\">\n <span class=\"hbar-label\" [title]=\"slice.Label\">{{ slice.Label }}</span>\n <div class=\"hbar-track\">\n <div class=\"hbar-fill\" [style.width.%]=\"SliceBarWidth(ByStatus, slice.Count)\"></div>\n </div>\n <span class=\"hbar-count\">{{ slice.Count }}</span>\n </div>\n }\n }\n </div>\n\n <!-- By agent -->\n <div class=\"metric-card\">\n <div class=\"metric-title\">By agent</div>\n @if (ByAgent.length === 0) {\n <div class=\"metric-empty\">No data</div>\n } @else {\n @for (slice of ByAgent; track slice.Label) {\n <div class=\"hbar-row\">\n <span class=\"hbar-label\" [title]=\"slice.Label\">{{ slice.Label }}</span>\n <div class=\"hbar-track\">\n <div class=\"hbar-fill\" [style.width.%]=\"SliceBarWidth(ByAgent, slice.Count)\"></div>\n </div>\n <span class=\"hbar-count\">{{ slice.Count }}</span>\n </div>\n }\n }\n </div>\n </div>\n }\n }\n}\n", styles: [":host { display: block; }\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n}\n\n/* \u2500\u2500 Sub-tab rail \u2500\u2500 */\n.subtab-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n flex-wrap: wrap;\n}\n\n.subtabs {\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n flex: 1;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 4px;\n}\n\n.subtab {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n padding: 7px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n white-space: nowrap;\n}\n\n.subtab:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.subtab--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.subtab i { font-size: 12px; }\n\n/* \u2500\u2500 Panel + table (matches sibling analytics sections) \u2500\u2500 */\n.panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.table-wrapper { overflow-x: auto; }\n\n.data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.data-table th,\n.data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n}\n\n.th-numeric { text-align: right; }\n\n.data-row { transition: background 0.15s; }\n.data-row:hover { background: var(--mj-bg-surface-hover); }\n\n.cell-strong {\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.cell-sub {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n max-width: 360px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.cell-muted { color: var(--mj-text-muted); }\n\n.cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n}\n\n.cell-time {\n white-space: nowrap;\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n\n.cell-host {\n max-width: 220px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--mj-text-muted);\n}\n\n.cell-action { text-align: right; white-space: nowrap; }\n\n.type-icon { color: var(--mj-brand-primary); }\n\n.mono {\n font-family: var(--mj-font-mono, monospace);\n font-size: 12px;\n}\n\n.empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n}\n\n/* \u2500\u2500 Pills \u2500\u2500 */\n.status-pill,\n.reason-pill,\n.type-chip,\n.dir-pill,\n.default-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.3px;\n white-space: nowrap;\n}\n\n.status-connected {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.status-failed {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-closed {\n background: color-mix(in srgb, var(--mj-text-disabled) 14%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n.dot--live {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: var(--mj-status-success);\n animation: pulse-live 1.6s ease-in-out infinite;\n}\n\n@keyframes pulse-live {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n\n.dir-pill {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.type-chip {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n}\n\n.default-pill {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* Close-reason pills */\n.reason-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n.reason-janitor {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n.reason-hostended,\n.reason-explicit {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.reason-shutdown {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n.reason-unknown {\n background: color-mix(in srgb, var(--mj-text-disabled) 14%, var(--mj-bg-surface));\n color: var(--mj-text-muted);\n}\n\n/* \u2500\u2500 Capability chips \u2500\u2500 */\n.cap-chips {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.cap-chip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 22px;\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n font-size: 11px;\n}\n\n.cap-more {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n}\n\n/* \u2500\u2500 Provider tags (Channels surface) \u2500\u2500 */\n.provider-tags {\n display: inline-flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.provider-tag {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-secondary);\n}\n\n.provider-tag--default {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n color: var(--mj-brand-primary);\n}\n\n.provider-tag i { font-size: 9px; }\n\n/* \u2500\u2500 Footer \u2500\u2500 */\n.grid-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-top: 14px;\n flex-wrap: wrap;\n}\n\n.grid-summary {\n font-size: 12.5px;\n color: var(--mj-text-muted);\n}\n\n/* \u2500\u2500 Metrics \u2500\u2500 */\n.metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n}\n\n.metric-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 18px;\n}\n\n.metric-card--wide {\n grid-column: 1 / -1;\n}\n\n.metric-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 14px;\n}\n\n.metric-empty {\n font-size: 13px;\n color: var(--mj-text-disabled);\n padding: 20px 0;\n text-align: center;\n}\n\n/* Vertical bar chart (bridges over time) */\n.bar-chart {\n display: flex;\n align-items: flex-end;\n gap: 6px;\n height: 160px;\n overflow-x: auto;\n}\n\n.bar-col {\n flex: 1;\n min-width: 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n height: 100%;\n}\n\n.bar-track {\n flex: 1;\n width: 100%;\n display: flex;\n align-items: flex-end;\n}\n\n.bar-fill {\n width: 100%;\n min-height: 2px;\n border-radius: 4px 4px 0 0;\n background: var(--mj-brand-primary);\n transition: height 0.3s ease;\n}\n\n.bar-value {\n font-size: 10px;\n color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums;\n}\n\n/* Horizontal bars (distributions) */\n.hbar-row {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n}\n\n.hbar-label {\n flex: 0 0 110px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.hbar-track {\n flex: 1;\n height: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.hbar-fill {\n height: 100%;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n transition: width 0.3s ease;\n}\n\n.hbar-count {\n flex: 0 0 auto;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-variant-numeric: tabular-nums;\n min-width: 24px;\n text-align: right;\n}\n"] }]
|
|
1055
|
+
}], null, { TimeRange: [{
|
|
1056
|
+
type: Input
|
|
1057
|
+
}] }); })();
|
|
1058
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeManagementComponent, { className: "RealtimeManagementComponent", filePath: "src/AI/components/analytics/realtime/realtime-management.component.ts", lineNumber: 65 }); })();
|
|
1059
|
+
export function LoadRealtimeManagement() { }
|
|
1060
|
+
//# sourceMappingURL=realtime-management.component.js.map
|