@memberjunction/ng-explorer-core 5.41.0 → 5.43.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/generated/lazy-feature-config.d.ts +1 -1
- package/dist/generated/lazy-feature-config.d.ts.map +1 -1
- package/dist/generated/lazy-feature-config.js +5 -2
- package/dist/generated/lazy-feature-config.js.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +7 -0
- package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js +42 -22
- package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +179 -0
- package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -0
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js +1197 -0
- package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -0
- package/dist/lib/shell/components/header/app-nav.component.js +7 -4
- package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-switcher.component.js +11 -6
- package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
- package/dist/lib/shell/shell.module.d.ts +1 -1
- package/dist/lib/shell/shell.module.d.ts.map +1 -1
- package/dist/lib/shell/shell.module.js +3 -1
- package/dist/lib/shell/shell.module.js.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.d.ts +6 -0
- package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
- package/dist/lib/user-notifications/user-notifications.component.js +32 -1
- package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
- package/dist/module.d.ts +33 -31
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +11 -4
- package/dist/module.js.map +1 -1
- package/package.json +47 -46
|
@@ -0,0 +1,1197 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Component, ChangeDetectorRef, inject } from '@angular/core';
|
|
8
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
9
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
10
|
+
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
11
|
+
import { RunView } from '@memberjunction/core';
|
|
12
|
+
import { GraphQLLiveKitClient } from '@memberjunction/graphql-dataprovider';
|
|
13
|
+
import { UserHoldsAuthorization, REALTIME_ADVANCED_SESSION_CONTROLS } from '@memberjunction/ng-conversations';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@angular/forms";
|
|
16
|
+
import * as i2 from "@memberjunction/ng-ui-components";
|
|
17
|
+
import * as i3 from "@memberjunction/ng-mj-livekit-room";
|
|
18
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
19
|
+
const _forTrack1 = ($index, $item) => $item.ModelID;
|
|
20
|
+
const _forTrack2 = ($index, $item) => $item.RoomName;
|
|
21
|
+
const _forTrack3 = ($index, $item) => $item.ConversationID;
|
|
22
|
+
function LiveKitRoomResource_Case_0_Template(rf, ctx) { if (rf & 1) {
|
|
23
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
24
|
+
i0.ɵɵelementStart(0, "mj-livekit-agent-room", 4);
|
|
25
|
+
i0.ɵɵlistener("Connected", function LiveKitRoomResource_Case_0_Template_mj_livekit_agent_room_Connected_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.NotifyLoadComplete()); })("Disconnected", function LiveKitRoomResource_Case_0_Template_mj_livekit_agent_room_Disconnected_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRoomLeft()); })("ErrorOccurred", function LiveKitRoomResource_Case_0_Template_mj_livekit_agent_room_ErrorOccurred_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.NotifyLoadComplete()); })("InvitePeopleRequested", function LiveKitRoomResource_Case_0_Template_mj_livekit_agent_room_InvitePeopleRequested_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openInvite($event)); });
|
|
26
|
+
i0.ɵɵelementEnd();
|
|
27
|
+
} if (rf & 2) {
|
|
28
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
29
|
+
i0.ɵɵproperty("Mode", ctx_r1.roomMode)("RoomName", ctx_r1.joinRoomName)("AgentID", ctx_r1.agentId)("TargetAgentID", ctx_r1.targetAgentId)("AgentName", ctx_r1.targetAgentName)("AvailableAgents", ctx_r1.agents)("RealtimeModelID", ctx_r1.selectedModelId)("RealtimeVoice", ctx_r1.selectedVoice)("CanPickModelVoice", ctx_r1.canPickModelVoice)("AvailableModels", ctx_r1.realtimeModels)("Provider", ctx_r1.ProviderToUse)("ShowAgentState", true)("ShowWhiteboard", true)("EnableLayoutSwitcher", true)("EnablePinning", true);
|
|
30
|
+
} }
|
|
31
|
+
function LiveKitRoomResource_Case_1_For_15_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
+
i0.ɵɵelementStart(0, "option", 14);
|
|
33
|
+
i0.ɵɵtext(1);
|
|
34
|
+
i0.ɵɵelementEnd();
|
|
35
|
+
} if (rf & 2) {
|
|
36
|
+
const a_r4 = ctx.$implicit;
|
|
37
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
38
|
+
i0.ɵɵproperty("value", a_r4.ID)("selected", ctx_r1.UUIDsEqual(a_r4.ID, ctx_r1.selectedTargetId));
|
|
39
|
+
i0.ɵɵadvance();
|
|
40
|
+
i0.ɵɵtextInterpolate(a_r4.Name);
|
|
41
|
+
} }
|
|
42
|
+
function LiveKitRoomResource_Case_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
43
|
+
i0.ɵɵelementStart(0, "p", 15);
|
|
44
|
+
i0.ɵɵtext(1);
|
|
45
|
+
i0.ɵɵelementEnd();
|
|
46
|
+
} if (rf & 2) {
|
|
47
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
48
|
+
i0.ɵɵadvance();
|
|
49
|
+
i0.ɵɵtextInterpolate(ctx_r1.selectedDescription);
|
|
50
|
+
} }
|
|
51
|
+
function LiveKitRoomResource_Case_1_Conditional_17_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
52
|
+
i0.ɵɵelementStart(0, "option", 14);
|
|
53
|
+
i0.ɵɵtext(1);
|
|
54
|
+
i0.ɵɵelementEnd();
|
|
55
|
+
} if (rf & 2) {
|
|
56
|
+
const m_r6 = ctx.$implicit;
|
|
57
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
58
|
+
i0.ɵɵproperty("value", m_r6.ModelID)("selected", ctx_r1.UUIDsEqual(m_r6.ModelID, ctx_r1.selectedModelId));
|
|
59
|
+
i0.ɵɵadvance();
|
|
60
|
+
i0.ɵɵtextInterpolate(m_r6.ModelName);
|
|
61
|
+
} }
|
|
62
|
+
function LiveKitRoomResource_Case_1_Conditional_17_Conditional_9_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
63
|
+
i0.ɵɵelementStart(0, "option", 14);
|
|
64
|
+
i0.ɵɵtext(1);
|
|
65
|
+
i0.ɵɵelementEnd();
|
|
66
|
+
} if (rf & 2) {
|
|
67
|
+
const v_r8 = ctx.$implicit;
|
|
68
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
69
|
+
i0.ɵɵproperty("value", v_r8.ID)("selected", v_r8.ID === ctx_r1.selectedVoice);
|
|
70
|
+
i0.ɵɵadvance();
|
|
71
|
+
i0.ɵɵtextInterpolate(v_r8.Name);
|
|
72
|
+
} }
|
|
73
|
+
function LiveKitRoomResource_Case_1_Conditional_17_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
74
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
75
|
+
i0.ɵɵelementStart(0, "label", 22);
|
|
76
|
+
i0.ɵɵtext(1, "Voice ");
|
|
77
|
+
i0.ɵɵelementStart(2, "span", 19);
|
|
78
|
+
i0.ɵɵtext(3, "dev");
|
|
79
|
+
i0.ɵɵelementEnd()();
|
|
80
|
+
i0.ɵɵelementStart(4, "select", 23);
|
|
81
|
+
i0.ɵɵlistener("change", function LiveKitRoomResource_Case_1_Conditional_17_Conditional_9_Template_select_change_4_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onVoiceChange($event)); });
|
|
82
|
+
i0.ɵɵelementStart(5, "option", 21);
|
|
83
|
+
i0.ɵɵtext(6, "Default voice");
|
|
84
|
+
i0.ɵɵelementEnd();
|
|
85
|
+
i0.ɵɵrepeaterCreate(7, LiveKitRoomResource_Case_1_Conditional_17_Conditional_9_For_8_Template, 2, 3, "option", 14, _forTrack0);
|
|
86
|
+
i0.ɵɵelementEnd();
|
|
87
|
+
} if (rf & 2) {
|
|
88
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
89
|
+
i0.ɵɵadvance(7);
|
|
90
|
+
i0.ɵɵrepeater(ctx_r1.selectedModelVoices);
|
|
91
|
+
} }
|
|
92
|
+
function LiveKitRoomResource_Case_1_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
93
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
94
|
+
i0.ɵɵelementStart(0, "label", 18);
|
|
95
|
+
i0.ɵɵtext(1, "Model ");
|
|
96
|
+
i0.ɵɵelementStart(2, "span", 19);
|
|
97
|
+
i0.ɵɵtext(3, "dev");
|
|
98
|
+
i0.ɵɵelementEnd()();
|
|
99
|
+
i0.ɵɵelementStart(4, "select", 20);
|
|
100
|
+
i0.ɵɵlistener("change", function LiveKitRoomResource_Case_1_Conditional_17_Template_select_change_4_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onModelChange($event)); });
|
|
101
|
+
i0.ɵɵelementStart(5, "option", 21);
|
|
102
|
+
i0.ɵɵtext(6, "Default model");
|
|
103
|
+
i0.ɵɵelementEnd();
|
|
104
|
+
i0.ɵɵrepeaterCreate(7, LiveKitRoomResource_Case_1_Conditional_17_For_8_Template, 2, 3, "option", 14, _forTrack1);
|
|
105
|
+
i0.ɵɵelementEnd();
|
|
106
|
+
i0.ɵɵconditionalCreate(9, LiveKitRoomResource_Case_1_Conditional_17_Conditional_9_Template, 9, 0);
|
|
107
|
+
} if (rf & 2) {
|
|
108
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
109
|
+
i0.ɵɵadvance(7);
|
|
110
|
+
i0.ɵɵrepeater(ctx_r1.realtimeModels);
|
|
111
|
+
i0.ɵɵadvance(2);
|
|
112
|
+
i0.ɵɵconditional(ctx_r1.selectedModelVoices.length ? 9 : -1);
|
|
113
|
+
} }
|
|
114
|
+
function LiveKitRoomResource_Case_1_Template(rf, ctx) { if (rf & 1) {
|
|
115
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
116
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 5)(2, "button", 6);
|
|
117
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_1_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.backToLanding()); });
|
|
118
|
+
i0.ɵɵelement(3, "i", 7);
|
|
119
|
+
i0.ɵɵtext(4, " Back");
|
|
120
|
+
i0.ɵɵelementEnd();
|
|
121
|
+
i0.ɵɵelementStart(5, "div", 8);
|
|
122
|
+
i0.ɵɵelement(6, "i", 9);
|
|
123
|
+
i0.ɵɵelementEnd();
|
|
124
|
+
i0.ɵɵelementStart(7, "h2", 10);
|
|
125
|
+
i0.ɵɵtext(8, "Start a call");
|
|
126
|
+
i0.ɵɵelementEnd();
|
|
127
|
+
i0.ɵɵelementStart(9, "p", 11);
|
|
128
|
+
i0.ɵɵtext(10, " Choose the agent you want to talk to. You can add more agents (and invite people) once you're in the room. ");
|
|
129
|
+
i0.ɵɵelementEnd();
|
|
130
|
+
i0.ɵɵelementStart(11, "label", 12);
|
|
131
|
+
i0.ɵɵtext(12, "Agent");
|
|
132
|
+
i0.ɵɵelementEnd();
|
|
133
|
+
i0.ɵɵelementStart(13, "select", 13);
|
|
134
|
+
i0.ɵɵlistener("change", function LiveKitRoomResource_Case_1_Template_select_change_13_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTargetChange($event)); });
|
|
135
|
+
i0.ɵɵrepeaterCreate(14, LiveKitRoomResource_Case_1_For_15_Template, 2, 3, "option", 14, _forTrack0);
|
|
136
|
+
i0.ɵɵelementEnd();
|
|
137
|
+
i0.ɵɵconditionalCreate(16, LiveKitRoomResource_Case_1_Conditional_16_Template, 2, 1, "p", 15);
|
|
138
|
+
i0.ɵɵconditionalCreate(17, LiveKitRoomResource_Case_1_Conditional_17_Template, 10, 1);
|
|
139
|
+
i0.ɵɵelementStart(18, "button", 16);
|
|
140
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_1_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.startCall()); });
|
|
141
|
+
i0.ɵɵelement(19, "i", 17);
|
|
142
|
+
i0.ɵɵtext(20, " Start call ");
|
|
143
|
+
i0.ɵɵelementEnd()()();
|
|
144
|
+
} if (rf & 2) {
|
|
145
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
146
|
+
i0.ɵɵadvance(14);
|
|
147
|
+
i0.ɵɵrepeater(ctx_r1.agents);
|
|
148
|
+
i0.ɵɵadvance(2);
|
|
149
|
+
i0.ɵɵconditional(ctx_r1.selectedDescription ? 16 : -1);
|
|
150
|
+
i0.ɵɵadvance();
|
|
151
|
+
i0.ɵɵconditional(ctx_r1.canPickModelVoice && ctx_r1.realtimeModels.length ? 17 : -1);
|
|
152
|
+
i0.ɵɵadvance();
|
|
153
|
+
i0.ɵɵproperty("disabled", !ctx_r1.selectedTargetId);
|
|
154
|
+
} }
|
|
155
|
+
function LiveKitRoomResource_Case_2_Template(rf, ctx) { if (rf & 1) {
|
|
156
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
157
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 24)(2, "div", 8);
|
|
158
|
+
i0.ɵɵelement(3, "i", 9);
|
|
159
|
+
i0.ɵɵelementEnd();
|
|
160
|
+
i0.ɵɵelementStart(4, "h2", 10);
|
|
161
|
+
i0.ɵɵtext(5, "Meet");
|
|
162
|
+
i0.ɵɵelementEnd();
|
|
163
|
+
i0.ɵɵelementStart(6, "p", 11);
|
|
164
|
+
i0.ɵɵtext(7, "Start a live room with agents and people, join one that's in progress, or review a past meeting.");
|
|
165
|
+
i0.ɵɵelementEnd();
|
|
166
|
+
i0.ɵɵelementStart(8, "div", 25)(9, "button", 26);
|
|
167
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_2_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.startNewRoom()); });
|
|
168
|
+
i0.ɵɵelement(10, "i", 27);
|
|
169
|
+
i0.ɵɵelementStart(11, "span", 28);
|
|
170
|
+
i0.ɵɵtext(12, "New room");
|
|
171
|
+
i0.ɵɵelementEnd();
|
|
172
|
+
i0.ɵɵelementStart(13, "span", 29);
|
|
173
|
+
i0.ɵɵtext(14, "Pick an agent and start a fresh call.");
|
|
174
|
+
i0.ɵɵelementEnd()();
|
|
175
|
+
i0.ɵɵelementStart(15, "button", 26);
|
|
176
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openExisting()); });
|
|
177
|
+
i0.ɵɵelement(16, "i", 30);
|
|
178
|
+
i0.ɵɵelementStart(17, "span", 28);
|
|
179
|
+
i0.ɵɵtext(18, "Join existing");
|
|
180
|
+
i0.ɵɵelementEnd();
|
|
181
|
+
i0.ɵɵelementStart(19, "span", 29);
|
|
182
|
+
i0.ɵɵtext(20, "Hop into a room that's live right now.");
|
|
183
|
+
i0.ɵɵelementEnd()();
|
|
184
|
+
i0.ɵɵelementStart(21, "button", 26);
|
|
185
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_2_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openHistory()); });
|
|
186
|
+
i0.ɵɵelement(22, "i", 31);
|
|
187
|
+
i0.ɵɵelementStart(23, "span", 28);
|
|
188
|
+
i0.ɵɵtext(24, "History");
|
|
189
|
+
i0.ɵɵelementEnd();
|
|
190
|
+
i0.ɵɵelementStart(25, "span", 29);
|
|
191
|
+
i0.ɵɵtext(26, "Read transcripts of past meetings.");
|
|
192
|
+
i0.ɵɵelementEnd()()()()();
|
|
193
|
+
} }
|
|
194
|
+
function LiveKitRoomResource_Case_3_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
195
|
+
i0.ɵɵelementStart(0, "div", 32);
|
|
196
|
+
i0.ɵɵelement(1, "i", 38);
|
|
197
|
+
i0.ɵɵtext(2, " Finding active rooms\u2026");
|
|
198
|
+
i0.ɵɵelementEnd();
|
|
199
|
+
} }
|
|
200
|
+
function LiveKitRoomResource_Case_3_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
201
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
202
|
+
i0.ɵɵelementStart(0, "button", 40);
|
|
203
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_3_Conditional_8_For_2_Template_button_click_0_listener() { const r_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.joinExistingRoom(r_r12.RoomName)); });
|
|
204
|
+
i0.ɵɵelementStart(1, "span", 41);
|
|
205
|
+
i0.ɵɵelement(2, "i", 42);
|
|
206
|
+
i0.ɵɵtext(3);
|
|
207
|
+
i0.ɵɵelementEnd();
|
|
208
|
+
i0.ɵɵelementStart(4, "span", 43);
|
|
209
|
+
i0.ɵɵtext(5);
|
|
210
|
+
i0.ɵɵelementEnd()();
|
|
211
|
+
} if (rf & 2) {
|
|
212
|
+
const r_r12 = ctx.$implicit;
|
|
213
|
+
i0.ɵɵadvance(3);
|
|
214
|
+
i0.ɵɵtextInterpolate1(" ", r_r12.Label);
|
|
215
|
+
i0.ɵɵadvance(2);
|
|
216
|
+
i0.ɵɵtextInterpolate2("", r_r12.AgentCount, " agent", r_r12.AgentCount === 1 ? "" : "s", " \u00B7 Join");
|
|
217
|
+
} }
|
|
218
|
+
function LiveKitRoomResource_Case_3_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
219
|
+
i0.ɵɵelementStart(0, "div", 33);
|
|
220
|
+
i0.ɵɵrepeaterCreate(1, LiveKitRoomResource_Case_3_Conditional_8_For_2_Template, 6, 3, "button", 39, _forTrack2);
|
|
221
|
+
i0.ɵɵelementEnd();
|
|
222
|
+
} if (rf & 2) {
|
|
223
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
224
|
+
i0.ɵɵadvance();
|
|
225
|
+
i0.ɵɵrepeater(ctx_r1.activeRooms);
|
|
226
|
+
} }
|
|
227
|
+
function LiveKitRoomResource_Case_3_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
228
|
+
i0.ɵɵelementStart(0, "p", 15);
|
|
229
|
+
i0.ɵɵtext(1, "No rooms are active right now.");
|
|
230
|
+
i0.ɵɵelementEnd();
|
|
231
|
+
} }
|
|
232
|
+
function LiveKitRoomResource_Case_3_Template(rf, ctx) { if (rf & 1) {
|
|
233
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
234
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 24)(2, "button", 6);
|
|
235
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_3_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.backToLanding()); });
|
|
236
|
+
i0.ɵɵelement(3, "i", 7);
|
|
237
|
+
i0.ɵɵtext(4, " Back");
|
|
238
|
+
i0.ɵɵelementEnd();
|
|
239
|
+
i0.ɵɵelementStart(5, "h2", 10);
|
|
240
|
+
i0.ɵɵtext(6, "Join a room");
|
|
241
|
+
i0.ɵɵelementEnd();
|
|
242
|
+
i0.ɵɵconditionalCreate(7, LiveKitRoomResource_Case_3_Conditional_7_Template, 3, 0, "div", 32)(8, LiveKitRoomResource_Case_3_Conditional_8_Template, 3, 0, "div", 33)(9, LiveKitRoomResource_Case_3_Conditional_9_Template, 2, 0, "p", 15);
|
|
243
|
+
i0.ɵɵelementStart(10, "label", 34);
|
|
244
|
+
i0.ɵɵtext(11, "Or join by name");
|
|
245
|
+
i0.ɵɵelementEnd();
|
|
246
|
+
i0.ɵɵelementStart(12, "div", 35)(13, "input", 36);
|
|
247
|
+
i0.ɵɵlistener("input", function LiveKitRoomResource_Case_3_Template_input_input_13_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.manualRoomName = $event.target.value); })("keydown.enter", function LiveKitRoomResource_Case_3_Template_input_keydown_enter_13_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.joinExistingRoom(ctx_r1.manualRoomName)); });
|
|
248
|
+
i0.ɵɵelementEnd();
|
|
249
|
+
i0.ɵɵelementStart(14, "button", 37);
|
|
250
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_3_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.joinExistingRoom(ctx_r1.manualRoomName)); });
|
|
251
|
+
i0.ɵɵtext(15, "Join");
|
|
252
|
+
i0.ɵɵelementEnd()()()();
|
|
253
|
+
} if (rf & 2) {
|
|
254
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
255
|
+
i0.ɵɵadvance(7);
|
|
256
|
+
i0.ɵɵconditional(ctx_r1.loadingActive ? 7 : ctx_r1.activeRooms.length ? 8 : 9);
|
|
257
|
+
i0.ɵɵadvance(6);
|
|
258
|
+
i0.ɵɵproperty("value", ctx_r1.manualRoomName);
|
|
259
|
+
i0.ɵɵadvance();
|
|
260
|
+
i0.ɵɵproperty("disabled", !ctx_r1.manualRoomName.trim());
|
|
261
|
+
} }
|
|
262
|
+
function LiveKitRoomResource_Case_4_Conditional_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
+
i0.ɵɵelementStart(0, "div", 32);
|
|
264
|
+
i0.ɵɵelement(1, "i", 38);
|
|
265
|
+
i0.ɵɵtext(2, " Loading\u2026");
|
|
266
|
+
i0.ɵɵelementEnd();
|
|
267
|
+
} }
|
|
268
|
+
function LiveKitRoomResource_Case_4_Conditional_2_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
269
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
270
|
+
i0.ɵɵelementStart(0, "button", 40);
|
|
271
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_4_Conditional_2_Conditional_6_For_2_Template_button_click_0_listener() { const h_r15 = i0.ɵɵrestoreView(_r14).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.openTranscript(h_r15)); });
|
|
272
|
+
i0.ɵɵelementStart(1, "span", 41);
|
|
273
|
+
i0.ɵɵelement(2, "i", 44);
|
|
274
|
+
i0.ɵɵtext(3);
|
|
275
|
+
i0.ɵɵelementEnd();
|
|
276
|
+
i0.ɵɵelementStart(4, "span", 43);
|
|
277
|
+
i0.ɵɵtext(5);
|
|
278
|
+
i0.ɵɵelementEnd()();
|
|
279
|
+
} if (rf & 2) {
|
|
280
|
+
const h_r15 = ctx.$implicit;
|
|
281
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
282
|
+
i0.ɵɵadvance(3);
|
|
283
|
+
i0.ɵɵtextInterpolate1(" ", h_r15.Name);
|
|
284
|
+
i0.ɵɵadvance(2);
|
|
285
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatTime(h_r15.At));
|
|
286
|
+
} }
|
|
287
|
+
function LiveKitRoomResource_Case_4_Conditional_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
288
|
+
i0.ɵɵelementStart(0, "div", 33);
|
|
289
|
+
i0.ɵɵrepeaterCreate(1, LiveKitRoomResource_Case_4_Conditional_2_Conditional_6_For_2_Template, 6, 2, "button", 39, _forTrack3);
|
|
290
|
+
i0.ɵɵelementEnd();
|
|
291
|
+
} if (rf & 2) {
|
|
292
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
293
|
+
i0.ɵɵadvance();
|
|
294
|
+
i0.ɵɵrepeater(ctx_r1.historyRooms);
|
|
295
|
+
} }
|
|
296
|
+
function LiveKitRoomResource_Case_4_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
297
|
+
i0.ɵɵelementStart(0, "p", 15);
|
|
298
|
+
i0.ɵɵtext(1, "No past meetings yet.");
|
|
299
|
+
i0.ɵɵelementEnd();
|
|
300
|
+
} }
|
|
301
|
+
function LiveKitRoomResource_Case_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
302
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
303
|
+
i0.ɵɵelementStart(0, "button", 6);
|
|
304
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_4_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.backToLanding()); });
|
|
305
|
+
i0.ɵɵelement(1, "i", 7);
|
|
306
|
+
i0.ɵɵtext(2, " Back");
|
|
307
|
+
i0.ɵɵelementEnd();
|
|
308
|
+
i0.ɵɵelementStart(3, "h2", 10);
|
|
309
|
+
i0.ɵɵtext(4, "Past meetings");
|
|
310
|
+
i0.ɵɵelementEnd();
|
|
311
|
+
i0.ɵɵconditionalCreate(5, LiveKitRoomResource_Case_4_Conditional_2_Conditional_5_Template, 3, 0, "div", 32)(6, LiveKitRoomResource_Case_4_Conditional_2_Conditional_6_Template, 3, 0, "div", 33)(7, LiveKitRoomResource_Case_4_Conditional_2_Conditional_7_Template, 2, 0, "p", 15);
|
|
312
|
+
} if (rf & 2) {
|
|
313
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
314
|
+
i0.ɵɵadvance(5);
|
|
315
|
+
i0.ɵɵconditional(ctx_r1.loadingHistory ? 5 : ctx_r1.historyRooms.length ? 6 : 7);
|
|
316
|
+
} }
|
|
317
|
+
function LiveKitRoomResource_Case_4_Conditional_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
318
|
+
i0.ɵɵelementStart(0, "div", 32);
|
|
319
|
+
i0.ɵɵelement(1, "i", 38);
|
|
320
|
+
i0.ɵɵtext(2, " Loading transcript\u2026");
|
|
321
|
+
i0.ɵɵelementEnd();
|
|
322
|
+
} }
|
|
323
|
+
function LiveKitRoomResource_Case_4_Conditional_3_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
324
|
+
i0.ɵɵelementStart(0, "div", 47)(1, "span", 48);
|
|
325
|
+
i0.ɵɵtext(2);
|
|
326
|
+
i0.ɵɵelementEnd();
|
|
327
|
+
i0.ɵɵelementStart(3, "span", 49);
|
|
328
|
+
i0.ɵɵtext(4);
|
|
329
|
+
i0.ɵɵelementEnd()();
|
|
330
|
+
} if (rf & 2) {
|
|
331
|
+
const line_r17 = ctx.$implicit;
|
|
332
|
+
i0.ɵɵclassProp("mj-lk-tline--agent", line_r17.Kind === "agent")("mj-lk-tline--error", line_r17.Kind === "error");
|
|
333
|
+
i0.ɵɵadvance(2);
|
|
334
|
+
i0.ɵɵtextInterpolate(line_r17.Speaker);
|
|
335
|
+
i0.ɵɵadvance(2);
|
|
336
|
+
i0.ɵɵtextInterpolate(line_r17.Message);
|
|
337
|
+
} }
|
|
338
|
+
function LiveKitRoomResource_Case_4_Conditional_3_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
339
|
+
i0.ɵɵelementStart(0, "div", 45);
|
|
340
|
+
i0.ɵɵrepeaterCreate(1, LiveKitRoomResource_Case_4_Conditional_3_Conditional_6_For_2_Template, 5, 6, "div", 46, i0.ɵɵrepeaterTrackByIndex);
|
|
341
|
+
i0.ɵɵelementEnd();
|
|
342
|
+
} if (rf & 2) {
|
|
343
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
344
|
+
i0.ɵɵadvance();
|
|
345
|
+
i0.ɵɵrepeater(ctx_r1.historyTranscript);
|
|
346
|
+
} }
|
|
347
|
+
function LiveKitRoomResource_Case_4_Conditional_3_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
348
|
+
i0.ɵɵelementStart(0, "p", 15);
|
|
349
|
+
i0.ɵɵtext(1, "No transcript was captured for this meeting.");
|
|
350
|
+
i0.ɵɵelementEnd();
|
|
351
|
+
} }
|
|
352
|
+
function LiveKitRoomResource_Case_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
353
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
354
|
+
i0.ɵɵelementStart(0, "button", 6);
|
|
355
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Case_4_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeTranscript()); });
|
|
356
|
+
i0.ɵɵelement(1, "i", 7);
|
|
357
|
+
i0.ɵɵtext(2, " All meetings");
|
|
358
|
+
i0.ɵɵelementEnd();
|
|
359
|
+
i0.ɵɵelementStart(3, "h2", 10);
|
|
360
|
+
i0.ɵɵtext(4);
|
|
361
|
+
i0.ɵɵelementEnd();
|
|
362
|
+
i0.ɵɵconditionalCreate(5, LiveKitRoomResource_Case_4_Conditional_3_Conditional_5_Template, 3, 0, "div", 32)(6, LiveKitRoomResource_Case_4_Conditional_3_Conditional_6_Template, 3, 0, "div", 45)(7, LiveKitRoomResource_Case_4_Conditional_3_Conditional_7_Template, 2, 0, "p", 15);
|
|
363
|
+
} if (rf & 2) {
|
|
364
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
365
|
+
i0.ɵɵadvance(4);
|
|
366
|
+
i0.ɵɵtextInterpolate(ctx_r1.openHistoryRoom.Name);
|
|
367
|
+
i0.ɵɵadvance();
|
|
368
|
+
i0.ɵɵconditional(ctx_r1.loadingTranscript ? 5 : ctx_r1.historyTranscript.length ? 6 : 7);
|
|
369
|
+
} }
|
|
370
|
+
function LiveKitRoomResource_Case_4_Template(rf, ctx) { if (rf & 1) {
|
|
371
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 24);
|
|
372
|
+
i0.ɵɵconditionalCreate(2, LiveKitRoomResource_Case_4_Conditional_2_Template, 8, 1)(3, LiveKitRoomResource_Case_4_Conditional_3_Template, 8, 2);
|
|
373
|
+
i0.ɵɵelementEnd()();
|
|
374
|
+
} if (rf & 2) {
|
|
375
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
376
|
+
i0.ɵɵadvance(2);
|
|
377
|
+
i0.ɵɵconditional(!ctx_r1.openHistoryRoom ? 2 : 3);
|
|
378
|
+
} }
|
|
379
|
+
function LiveKitRoomResource_Case_5_Template(rf, ctx) { if (rf & 1) {
|
|
380
|
+
i0.ɵɵelementStart(0, "div", 2);
|
|
381
|
+
i0.ɵɵelement(1, "i", 50);
|
|
382
|
+
i0.ɵɵelementStart(2, "span");
|
|
383
|
+
i0.ɵɵtext(3);
|
|
384
|
+
i0.ɵɵelementEnd()();
|
|
385
|
+
} if (rf & 2) {
|
|
386
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
387
|
+
i0.ɵɵadvance(3);
|
|
388
|
+
i0.ɵɵtextInterpolate(ctx_r1.resolveError);
|
|
389
|
+
} }
|
|
390
|
+
function LiveKitRoomResource_Case_6_Template(rf, ctx) { if (rf & 1) {
|
|
391
|
+
i0.ɵɵelementStart(0, "div", 2);
|
|
392
|
+
i0.ɵɵtext(1, "Preparing room\u2026");
|
|
393
|
+
i0.ɵɵelementEnd();
|
|
394
|
+
} }
|
|
395
|
+
function LiveKitRoomResource_Conditional_7_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
396
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
397
|
+
i0.ɵɵelementStart(0, "span", 65);
|
|
398
|
+
i0.ɵɵtext(1);
|
|
399
|
+
i0.ɵɵelementStart(2, "button", 66);
|
|
400
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Conditional_7_Conditional_8_For_2_Template_button_click_2_listener() { const u_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.removeInvitee(u_r20.ID)); });
|
|
401
|
+
i0.ɵɵelement(3, "i", 67);
|
|
402
|
+
i0.ɵɵelementEnd()();
|
|
403
|
+
} if (rf & 2) {
|
|
404
|
+
const u_r20 = ctx.$implicit;
|
|
405
|
+
i0.ɵɵadvance();
|
|
406
|
+
i0.ɵɵtextInterpolate1(" ", u_r20.Name, " ");
|
|
407
|
+
} }
|
|
408
|
+
function LiveKitRoomResource_Conditional_7_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
409
|
+
i0.ɵɵelementStart(0, "div", 58);
|
|
410
|
+
i0.ɵɵrepeaterCreate(1, LiveKitRoomResource_Conditional_7_Conditional_8_For_2_Template, 4, 1, "span", 65, _forTrack0);
|
|
411
|
+
i0.ɵɵelementEnd();
|
|
412
|
+
} if (rf & 2) {
|
|
413
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
414
|
+
i0.ɵɵadvance();
|
|
415
|
+
i0.ɵɵrepeater(ctx_r1.selectedInvitees);
|
|
416
|
+
} }
|
|
417
|
+
function LiveKitRoomResource_Conditional_7_Conditional_9_For_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
418
|
+
i0.ɵɵelementStart(0, "span", 71);
|
|
419
|
+
i0.ɵɵtext(1);
|
|
420
|
+
i0.ɵɵelementEnd();
|
|
421
|
+
} if (rf & 2) {
|
|
422
|
+
const u_r22 = i0.ɵɵnextContext().$implicit;
|
|
423
|
+
i0.ɵɵadvance();
|
|
424
|
+
i0.ɵɵtextInterpolate(u_r22.Email);
|
|
425
|
+
} }
|
|
426
|
+
function LiveKitRoomResource_Conditional_7_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
427
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
428
|
+
i0.ɵɵelementStart(0, "button", 69);
|
|
429
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Conditional_7_Conditional_9_For_2_Template_button_click_0_listener() { const u_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.addInvitee(u_r22)); });
|
|
430
|
+
i0.ɵɵelementStart(1, "span", 70);
|
|
431
|
+
i0.ɵɵtext(2);
|
|
432
|
+
i0.ɵɵelementEnd();
|
|
433
|
+
i0.ɵɵconditionalCreate(3, LiveKitRoomResource_Conditional_7_Conditional_9_For_2_Conditional_3_Template, 2, 1, "span", 71);
|
|
434
|
+
i0.ɵɵelementEnd();
|
|
435
|
+
} if (rf & 2) {
|
|
436
|
+
const u_r22 = ctx.$implicit;
|
|
437
|
+
i0.ɵɵadvance(2);
|
|
438
|
+
i0.ɵɵtextInterpolate(u_r22.Name);
|
|
439
|
+
i0.ɵɵadvance();
|
|
440
|
+
i0.ɵɵconditional(u_r22.Email ? 3 : -1);
|
|
441
|
+
} }
|
|
442
|
+
function LiveKitRoomResource_Conditional_7_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
443
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
444
|
+
i0.ɵɵrepeaterCreate(1, LiveKitRoomResource_Conditional_7_Conditional_9_For_2_Template, 4, 2, "button", 68, _forTrack0);
|
|
445
|
+
i0.ɵɵelementEnd();
|
|
446
|
+
} if (rf & 2) {
|
|
447
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
448
|
+
i0.ɵɵadvance();
|
|
449
|
+
i0.ɵɵrepeater(ctx_r1.userResults);
|
|
450
|
+
} }
|
|
451
|
+
function LiveKitRoomResource_Conditional_7_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
452
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
453
|
+
i0.ɵɵtext(1, "No matching people.");
|
|
454
|
+
i0.ɵɵelementEnd();
|
|
455
|
+
} }
|
|
456
|
+
function LiveKitRoomResource_Conditional_7_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
457
|
+
i0.ɵɵelementStart(0, "div", 61);
|
|
458
|
+
i0.ɵɵtext(1);
|
|
459
|
+
i0.ɵɵelementEnd();
|
|
460
|
+
} if (rf & 2) {
|
|
461
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
462
|
+
i0.ɵɵadvance();
|
|
463
|
+
i0.ɵɵtextInterpolate(ctx_r1.inviteMessage);
|
|
464
|
+
} }
|
|
465
|
+
function LiveKitRoomResource_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
466
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
467
|
+
i0.ɵɵelementStart(0, "mj-dialog", 51);
|
|
468
|
+
i0.ɵɵlistener("Close", function LiveKitRoomResource_Conditional_7_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showInvite = false); });
|
|
469
|
+
i0.ɵɵelementStart(1, "div", 52)(2, "p", 53);
|
|
470
|
+
i0.ɵɵtext(3, "They'll get an in-app notification (and an email if Comms is set up) to join this room.");
|
|
471
|
+
i0.ɵɵelementEnd();
|
|
472
|
+
i0.ɵɵelementStart(4, "div", 54)(5, "input", 55);
|
|
473
|
+
i0.ɵɵlistener("input", function LiveKitRoomResource_Conditional_7_Template_input_input_5_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.userSearch = $event.target.value); })("keydown.enter", function LiveKitRoomResource_Conditional_7_Template_input_keydown_enter_5_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.searchUsers()); });
|
|
474
|
+
i0.ɵɵelementEnd();
|
|
475
|
+
i0.ɵɵelementStart(6, "button", 56);
|
|
476
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Conditional_7_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.searchUsers()); });
|
|
477
|
+
i0.ɵɵelement(7, "i", 57);
|
|
478
|
+
i0.ɵɵelementEnd()();
|
|
479
|
+
i0.ɵɵconditionalCreate(8, LiveKitRoomResource_Conditional_7_Conditional_8_Template, 3, 0, "div", 58);
|
|
480
|
+
i0.ɵɵconditionalCreate(9, LiveKitRoomResource_Conditional_7_Conditional_9_Template, 3, 0, "div", 59)(10, LiveKitRoomResource_Conditional_7_Conditional_10_Template, 2, 0, "div", 60);
|
|
481
|
+
i0.ɵɵconditionalCreate(11, LiveKitRoomResource_Conditional_7_Conditional_11_Template, 2, 1, "div", 61);
|
|
482
|
+
i0.ɵɵelementStart(12, "div", 62)(13, "button", 63);
|
|
483
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Conditional_7_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.sendInvites()); });
|
|
484
|
+
i0.ɵɵelement(14, "i", 57);
|
|
485
|
+
i0.ɵɵtext(15);
|
|
486
|
+
i0.ɵɵelementEnd();
|
|
487
|
+
i0.ɵɵelementStart(16, "button", 64);
|
|
488
|
+
i0.ɵɵlistener("click", function LiveKitRoomResource_Conditional_7_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showInvite = false); });
|
|
489
|
+
i0.ɵɵtext(17, "Cancel");
|
|
490
|
+
i0.ɵɵelementEnd()()()();
|
|
491
|
+
} if (rf & 2) {
|
|
492
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
493
|
+
i0.ɵɵproperty("Visible", ctx_r1.showInvite)("Width", 440);
|
|
494
|
+
i0.ɵɵadvance(5);
|
|
495
|
+
i0.ɵɵproperty("value", ctx_r1.userSearch);
|
|
496
|
+
i0.ɵɵadvance();
|
|
497
|
+
i0.ɵɵproperty("disabled", ctx_r1.searching);
|
|
498
|
+
i0.ɵɵadvance();
|
|
499
|
+
i0.ɵɵclassProp("fa-magnifying-glass", !ctx_r1.searching)("fa-spinner", ctx_r1.searching)("fa-spin", ctx_r1.searching);
|
|
500
|
+
i0.ɵɵadvance();
|
|
501
|
+
i0.ɵɵconditional(ctx_r1.selectedInvitees.length ? 8 : -1);
|
|
502
|
+
i0.ɵɵadvance();
|
|
503
|
+
i0.ɵɵconditional(ctx_r1.userResults.length ? 9 : ctx_r1.searched && !ctx_r1.searching ? 10 : -1);
|
|
504
|
+
i0.ɵɵadvance(2);
|
|
505
|
+
i0.ɵɵconditional(ctx_r1.inviteMessage ? 11 : -1);
|
|
506
|
+
i0.ɵɵadvance(2);
|
|
507
|
+
i0.ɵɵproperty("disabled", !ctx_r1.selectedInvitees.length || ctx_r1.inviting);
|
|
508
|
+
i0.ɵɵadvance();
|
|
509
|
+
i0.ɵɵclassProp("fa-paper-plane", !ctx_r1.inviting)("fa-spinner", ctx_r1.inviting)("fa-spin", ctx_r1.inviting);
|
|
510
|
+
i0.ɵɵadvance();
|
|
511
|
+
i0.ɵɵtextInterpolate1(" Invite ", ctx_r1.selectedInvitees.length || "", " ");
|
|
512
|
+
} }
|
|
513
|
+
/**
|
|
514
|
+
* LiveKit Room Resource — hosts the MJ-native LiveKit room (`mj-livekit-agent-room`) as an Explorer tab
|
|
515
|
+
* (the **Meet** app's "Live Room").
|
|
516
|
+
*
|
|
517
|
+
* Flow: resolve the Realtime **co-agent** (voice front-end), then show a **pre-join picker** to choose
|
|
518
|
+
* the **target** agent you're "calling" (the co-agent voices it via `invoke-target-agent` — without a
|
|
519
|
+
* target it sits idle). "Start call" joins the room. An explicit `ResourceRecordID` skips the picker and
|
|
520
|
+
* calls that agent directly.
|
|
521
|
+
*
|
|
522
|
+
* Registered via `@RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')`.
|
|
523
|
+
*/
|
|
524
|
+
let LiveKitRoomResource = class LiveKitRoomResource extends BaseResourceComponent {
|
|
525
|
+
/** Render phase: spinner while resolving → landing (new/existing/history) → picker/existing/history → live room. */
|
|
526
|
+
phase = 'loading';
|
|
527
|
+
// ── "Join existing" state ─────────────────────────────────────────────────────────
|
|
528
|
+
/** Currently-active rooms (a distinct `ExternalConnectionID` with ≥1 connected agent bridge). */
|
|
529
|
+
activeRooms = [];
|
|
530
|
+
/** True while loading the active-rooms list. */
|
|
531
|
+
loadingActive = false;
|
|
532
|
+
/** Free-text room name to join directly (the "join by name/code" path). */
|
|
533
|
+
manualRoomName = '';
|
|
534
|
+
// ── "History" (past meetings) state ───────────────────────────────────────────────
|
|
535
|
+
/** Past meeting rooms (the `MJ: Conversations` of Type='Meeting Room' the bridge recorded). */
|
|
536
|
+
historyRooms = [];
|
|
537
|
+
/** True while loading the history list. */
|
|
538
|
+
loadingHistory = false;
|
|
539
|
+
/** The history room whose transcript is open (drill-in), or null for the list. */
|
|
540
|
+
openHistoryRoom = null;
|
|
541
|
+
/** The opened room's transcript lines. */
|
|
542
|
+
historyTranscript = [];
|
|
543
|
+
/** True while loading a room's transcript. */
|
|
544
|
+
loadingTranscript = false;
|
|
545
|
+
/** `'agent'` to start/voice an agent (the default), or `'join'` when opened from an invite link. */
|
|
546
|
+
roomMode = 'agent';
|
|
547
|
+
/** The room to JOIN when opened via an invite link (`?room=…`); null in agent mode. */
|
|
548
|
+
joinRoomName = null;
|
|
549
|
+
/** The Realtime co-agent (voice front-end) id — the resolved default Realtime-type agent. */
|
|
550
|
+
agentId = null;
|
|
551
|
+
/** The TARGET agent the co-agent voices (the one being "called"); the bot is named after it. */
|
|
552
|
+
targetAgentId = null;
|
|
553
|
+
/** The target agent's display name — used as the bot name + addressing word ("Sage, …"). */
|
|
554
|
+
targetAgentName = null;
|
|
555
|
+
/** The agents offered in the pre-join picker (active, excluding the Realtime co-agent itself). */
|
|
556
|
+
agents = [];
|
|
557
|
+
/** The currently-selected target in the picker (defaults to "Sage" when present). */
|
|
558
|
+
selectedTargetId = null;
|
|
559
|
+
// ── Dev model/voice override (gated by the `Realtime: Advanced Session Controls` authorization) ──────
|
|
560
|
+
/** Whether the current user may override the realtime model/voice (drives the dev pickers). */
|
|
561
|
+
canPickModelVoice = false;
|
|
562
|
+
/** Active Realtime models + their voices (loaded once when the user can override). */
|
|
563
|
+
realtimeModels = [];
|
|
564
|
+
/** The MODEL override chosen for the FIRST agent in the pre-join picker (null = default). */
|
|
565
|
+
selectedModelId = null;
|
|
566
|
+
/** The VOICE override chosen for the FIRST agent in the pre-join picker (null = default). */
|
|
567
|
+
selectedVoice = null;
|
|
568
|
+
/** Voices for the model chosen in the pre-join picker. */
|
|
569
|
+
get selectedModelVoices() {
|
|
570
|
+
return this.realtimeModels.find((m) => UUIDsEqual(m.ModelID, this.selectedModelId))?.Voices ?? [];
|
|
571
|
+
}
|
|
572
|
+
/** Records the pre-join MODEL choice; clears the voice so it can't outlive a model switch. */
|
|
573
|
+
onModelChange(event) {
|
|
574
|
+
this.selectedModelId = event.target.value || null;
|
|
575
|
+
this.selectedVoice = null;
|
|
576
|
+
}
|
|
577
|
+
/** Records the pre-join VOICE choice. */
|
|
578
|
+
onVoiceChange(event) {
|
|
579
|
+
this.selectedVoice = event.target.value || null;
|
|
580
|
+
}
|
|
581
|
+
/** Exposed for template use — platform-safe UUID equality (SQL upper vs PG lower). */
|
|
582
|
+
UUIDsEqual = UUIDsEqual;
|
|
583
|
+
/** Set when no co-agent could be resolved — shown instead of the room. */
|
|
584
|
+
resolveError = null;
|
|
585
|
+
// ── "Invite people" dialog state ─────────────────────────────────────────────────
|
|
586
|
+
/** Whether the invite-people dialog is open. */
|
|
587
|
+
showInvite = false;
|
|
588
|
+
/** The room the invite targets (the live room name). */
|
|
589
|
+
inviteRoomName = null;
|
|
590
|
+
/** Current search text in the people search box. */
|
|
591
|
+
userSearch = '';
|
|
592
|
+
/** People matching the last search (minus already-selected + the current user). */
|
|
593
|
+
userResults = [];
|
|
594
|
+
/** People chosen to invite. */
|
|
595
|
+
selectedInvitees = [];
|
|
596
|
+
/** True while a people search is running. */
|
|
597
|
+
searching = false;
|
|
598
|
+
/** True once a search has run (drives the "no matches" empty state). */
|
|
599
|
+
searched = false;
|
|
600
|
+
/** True while invites are being sent. */
|
|
601
|
+
inviting = false;
|
|
602
|
+
/** Result/status message under the dialog. */
|
|
603
|
+
inviteMessage = null;
|
|
604
|
+
cdr = inject(ChangeDetectorRef);
|
|
605
|
+
/** Description of the selected target, shown under the picker. */
|
|
606
|
+
get selectedDescription() {
|
|
607
|
+
return this.agents.find((a) => UUIDsEqual(a.ID, this.selectedTargetId))?.Description ?? null;
|
|
608
|
+
}
|
|
609
|
+
ngOnInit() {
|
|
610
|
+
super.ngOnInit();
|
|
611
|
+
this.resolve();
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Resolves the co-agent + target choices. Synchronous when the AI engine is already loaded (the common
|
|
615
|
+
* case — it bootstraps at startup) so the first render is settled (avoids NG0100 from an async branch
|
|
616
|
+
* flip under the app's frequent change-detection); a cold engine takes the async path and flushes.
|
|
617
|
+
*/
|
|
618
|
+
resolve() {
|
|
619
|
+
// Invite link (?room=…): join that existing room directly — no agent resolution / picker needed.
|
|
620
|
+
const invitedRoom = this.GetQueryParams()?.['room']?.trim();
|
|
621
|
+
if (invitedRoom) {
|
|
622
|
+
this.roomMode = 'join';
|
|
623
|
+
this.joinRoomName = invitedRoom;
|
|
624
|
+
this.phase = 'live';
|
|
625
|
+
this.NotifyLoadComplete();
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
if (AIEngineBase.Instance.Loaded) {
|
|
629
|
+
this.applyResolution();
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
void AIEngineBase.Instance.Config(false, undefined, this.ProviderToUse).then(() => {
|
|
633
|
+
this.applyResolution();
|
|
634
|
+
this.cdr.detectChanges();
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
/** Resolves the co-agent, builds the target list, and chooses the next phase (live for an explicit record, else picker). */
|
|
638
|
+
applyResolution() {
|
|
639
|
+
const realtimeType = AIEngineBase.Instance.AgentTypes.find((t) => t.Name?.trim().toLowerCase() === 'realtime');
|
|
640
|
+
const coAgent = realtimeType
|
|
641
|
+
? AIEngineBase.Instance.Agents.find((a) => a.Status === 'Active' && UUIDsEqual(a.TypeID, realtimeType.ID))
|
|
642
|
+
: undefined;
|
|
643
|
+
if (!coAgent) {
|
|
644
|
+
this.resolveError =
|
|
645
|
+
'No active Realtime agent is configured, so the Live Room has no voice to bring in. ' +
|
|
646
|
+
'Create a Realtime-type AI Agent (e.g. "Realtime Co-Agent") and try again.';
|
|
647
|
+
this.phase = 'error';
|
|
648
|
+
this.NotifyLoadComplete();
|
|
649
|
+
return;
|
|
650
|
+
}
|
|
651
|
+
this.agentId = coAgent.ID;
|
|
652
|
+
// Dev model/voice override: gate on the `Realtime: Advanced Session Controls` authorization and, when
|
|
653
|
+
// held, load the active models + their voices for the pickers (here and the in-room add-agent control).
|
|
654
|
+
this.canPickModelVoice = UserHoldsAuthorization(this.ProviderToUse?.CurrentUser, REALTIME_ADVANCED_SESSION_CONTROLS, this.ProviderToUse);
|
|
655
|
+
if (this.canPickModelVoice) {
|
|
656
|
+
void this.loadRealtimeModels();
|
|
657
|
+
}
|
|
658
|
+
// Target candidates: every active agent EXCEPT the Realtime co-agents (they voice a target, not themselves).
|
|
659
|
+
this.agents = AIEngineBase.Instance.Agents
|
|
660
|
+
.filter((a) => a.Status === 'Active' && (!realtimeType || !UUIDsEqual(a.TypeID, realtimeType.ID)))
|
|
661
|
+
.map((a) => ({ ID: a.ID, Name: a.Name ?? '(unnamed)', Description: a.Description ?? null }))
|
|
662
|
+
.sort((a, b) => a.Name.localeCompare(b.Name));
|
|
663
|
+
// An explicit record id (deep link to a specific agent) skips the picker and calls it directly.
|
|
664
|
+
const explicit = this.Data?.ResourceRecordID ? String(this.Data.ResourceRecordID) : null;
|
|
665
|
+
if (explicit) {
|
|
666
|
+
this.selectedTargetId = explicit;
|
|
667
|
+
this.startCall();
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
// Default the picker to the general assistant "Sage" when present, else the first candidate.
|
|
671
|
+
this.selectedTargetId =
|
|
672
|
+
this.agents.find((a) => a.Name.trim().toLowerCase() === 'sage')?.ID ?? this.agents[0]?.ID ?? null;
|
|
673
|
+
// Land on the Meet home (start new / join existing / history) rather than jumping straight into the picker.
|
|
674
|
+
this.phase = 'landing';
|
|
675
|
+
this.NotifyLoadComplete();
|
|
676
|
+
}
|
|
677
|
+
// ── Meet landing navigation ─────────────────────────────────────────────────────────
|
|
678
|
+
/**
|
|
679
|
+
* The room disconnected (the user clicked **Leave** or **End meeting**, or the room dropped). Return to the
|
|
680
|
+
* Meet landing so they can start a new room, join another, or review history — rather than being stranded
|
|
681
|
+
* on a dead room. Resets the join state so the next "New room" / "Join existing" starts clean.
|
|
682
|
+
*/
|
|
683
|
+
onRoomLeft() {
|
|
684
|
+
this.roomMode = 'agent';
|
|
685
|
+
this.joinRoomName = null;
|
|
686
|
+
this.phase = 'landing';
|
|
687
|
+
this.cdr.detectChanges();
|
|
688
|
+
}
|
|
689
|
+
/** Go to the "start a new room" picker. */
|
|
690
|
+
startNewRoom() {
|
|
691
|
+
this.phase = 'picking';
|
|
692
|
+
}
|
|
693
|
+
/** Open the "join existing room" view and load the active rooms. */
|
|
694
|
+
openExisting() {
|
|
695
|
+
this.phase = 'existing';
|
|
696
|
+
void this.loadActiveRooms();
|
|
697
|
+
}
|
|
698
|
+
/** Open the "past meetings" history view and load the list. */
|
|
699
|
+
openHistory() {
|
|
700
|
+
this.phase = 'history';
|
|
701
|
+
this.openHistoryRoom = null;
|
|
702
|
+
void this.loadHistory();
|
|
703
|
+
}
|
|
704
|
+
/** Back to the Meet home. */
|
|
705
|
+
backToLanding() {
|
|
706
|
+
this.phase = 'landing';
|
|
707
|
+
}
|
|
708
|
+
/** Joins an existing room by its LiveKit room name (the bridge `ExternalConnectionID`). */
|
|
709
|
+
joinExistingRoom(roomName) {
|
|
710
|
+
const name = roomName.trim();
|
|
711
|
+
if (!name) {
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
714
|
+
this.roomMode = 'join';
|
|
715
|
+
this.joinRoomName = name;
|
|
716
|
+
this.phase = 'live';
|
|
717
|
+
}
|
|
718
|
+
/** Loads currently-active rooms: distinct rooms that have a Connected/Connecting agent bridge. */
|
|
719
|
+
async loadActiveRooms() {
|
|
720
|
+
this.loadingActive = true;
|
|
721
|
+
this.activeRooms = [];
|
|
722
|
+
try {
|
|
723
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
724
|
+
const res = await rv.RunView({
|
|
725
|
+
EntityName: 'MJ: AI Agent Session Bridges',
|
|
726
|
+
ExtraFilter: `Status IN ('Connected','Connecting') AND ExternalConnectionID IS NOT NULL`,
|
|
727
|
+
Fields: ['ExternalConnectionID', 'Agent'],
|
|
728
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
729
|
+
MaxRows: 500,
|
|
730
|
+
ResultType: 'simple',
|
|
731
|
+
}, this.ProviderToUse.CurrentUser);
|
|
732
|
+
if (res.Success) {
|
|
733
|
+
const byRoom = new Map();
|
|
734
|
+
for (const r of res.Results) {
|
|
735
|
+
const room = String(r['ExternalConnectionID'] ?? '');
|
|
736
|
+
if (!room) {
|
|
737
|
+
continue;
|
|
738
|
+
}
|
|
739
|
+
const entry = byRoom.get(room) ?? { count: 0, agents: new Set() };
|
|
740
|
+
entry.count += 1;
|
|
741
|
+
if (r['Agent']) {
|
|
742
|
+
entry.agents.add(String(r['Agent']));
|
|
743
|
+
}
|
|
744
|
+
byRoom.set(room, entry);
|
|
745
|
+
}
|
|
746
|
+
this.activeRooms = [...byRoom.entries()].map(([room, info]) => ({
|
|
747
|
+
RoomName: room,
|
|
748
|
+
Label: info.agents.size ? [...info.agents].join(', ') : room,
|
|
749
|
+
AgentCount: info.count,
|
|
750
|
+
}));
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
finally {
|
|
754
|
+
this.loadingActive = false;
|
|
755
|
+
this.cdr.detectChanges();
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
/** Loads past meetings: the `Meeting Room` conversations the bridge recorded, newest first. */
|
|
759
|
+
async loadHistory() {
|
|
760
|
+
this.loadingHistory = true;
|
|
761
|
+
this.historyRooms = [];
|
|
762
|
+
try {
|
|
763
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
764
|
+
const res = await rv.RunView({
|
|
765
|
+
EntityName: 'MJ: Conversations',
|
|
766
|
+
ExtraFilter: `Type='Meeting Room'`,
|
|
767
|
+
Fields: ['ID', 'Name', '__mj_UpdatedAt'],
|
|
768
|
+
OrderBy: '__mj_UpdatedAt DESC',
|
|
769
|
+
MaxRows: 200,
|
|
770
|
+
ResultType: 'simple',
|
|
771
|
+
}, this.ProviderToUse.CurrentUser);
|
|
772
|
+
if (res.Success) {
|
|
773
|
+
this.historyRooms = res.Results.map((r) => ({
|
|
774
|
+
ConversationID: String(r['ID']),
|
|
775
|
+
Name: String(r['Name'] ?? 'Meeting'),
|
|
776
|
+
At: new Date(String(r['__mj_UpdatedAt'] ?? '')),
|
|
777
|
+
}));
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
finally {
|
|
781
|
+
this.loadingHistory = false;
|
|
782
|
+
this.cdr.detectChanges();
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
/** Opens a past meeting's transcript (drill-in). */
|
|
786
|
+
async openTranscript(room) {
|
|
787
|
+
this.openHistoryRoom = room;
|
|
788
|
+
this.historyTranscript = [];
|
|
789
|
+
this.loadingTranscript = true;
|
|
790
|
+
this.cdr.detectChanges();
|
|
791
|
+
try {
|
|
792
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
793
|
+
const res = await rv.RunView({
|
|
794
|
+
EntityName: 'MJ: Conversation Details',
|
|
795
|
+
ExtraFilter: `ConversationID='${room.ConversationID.replace(/'/g, "''")}'`,
|
|
796
|
+
Fields: ['Role', 'Message', 'AgentID', 'Error', '__mj_CreatedAt'],
|
|
797
|
+
OrderBy: '__mj_CreatedAt ASC',
|
|
798
|
+
MaxRows: 5000,
|
|
799
|
+
ResultType: 'simple',
|
|
800
|
+
}, this.ProviderToUse.CurrentUser);
|
|
801
|
+
if (res.Success) {
|
|
802
|
+
this.historyTranscript = res.Results.map((d) => {
|
|
803
|
+
const role = String(d['Role'] ?? 'User');
|
|
804
|
+
if (role === 'Error') {
|
|
805
|
+
return { Kind: 'error', Speaker: 'Error', Message: String(d['Error'] ?? d['Message'] ?? '') };
|
|
806
|
+
}
|
|
807
|
+
if (role === 'AI') {
|
|
808
|
+
const agentId = String(d['AgentID'] ?? '').toLowerCase();
|
|
809
|
+
const name = AIEngineBase.Instance.Agents.find((a) => a.ID.toLowerCase() === agentId)?.Name ?? 'Agent';
|
|
810
|
+
return { Kind: 'agent', Speaker: name, Message: String(d['Message'] ?? '') };
|
|
811
|
+
}
|
|
812
|
+
return { Kind: 'human', Speaker: 'Participant', Message: String(d['Message'] ?? '') };
|
|
813
|
+
});
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
finally {
|
|
817
|
+
this.loadingTranscript = false;
|
|
818
|
+
this.cdr.detectChanges();
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
/** Back to the history list from a transcript drill-in. */
|
|
822
|
+
closeTranscript() {
|
|
823
|
+
this.openHistoryRoom = null;
|
|
824
|
+
}
|
|
825
|
+
/** Formats a meeting timestamp for the history list (avoids a `date` pipe / CommonModule dependency). */
|
|
826
|
+
formatTime(d) {
|
|
827
|
+
return d && !isNaN(d.getTime()) ? d.toLocaleString() : '';
|
|
828
|
+
}
|
|
829
|
+
/** Picker selection handler (native select; avoids a FormsModule dependency). */
|
|
830
|
+
onTargetChange(event) {
|
|
831
|
+
this.selectedTargetId = event.target.value || null;
|
|
832
|
+
}
|
|
833
|
+
/** Loads active Realtime models + their voices for the dev pickers (best-effort; empty on failure). */
|
|
834
|
+
async loadRealtimeModels() {
|
|
835
|
+
try {
|
|
836
|
+
const client = new GraphQLLiveKitClient(this.ProviderToUse);
|
|
837
|
+
this.realtimeModels = await client.GetRealtimeModelVoices();
|
|
838
|
+
}
|
|
839
|
+
catch {
|
|
840
|
+
this.realtimeModels = [];
|
|
841
|
+
}
|
|
842
|
+
this.cdr.markForCheck();
|
|
843
|
+
}
|
|
844
|
+
/** Commits the chosen target and switches to the live room. */
|
|
845
|
+
startCall() {
|
|
846
|
+
if (!this.selectedTargetId) {
|
|
847
|
+
return;
|
|
848
|
+
}
|
|
849
|
+
this.targetAgentId = this.selectedTargetId;
|
|
850
|
+
this.targetAgentName = this.agents.find((a) => UUIDsEqual(a.ID, this.selectedTargetId))?.Name ?? null;
|
|
851
|
+
this.phase = 'live';
|
|
852
|
+
}
|
|
853
|
+
/** Opens the invite-people dialog for the given room. */
|
|
854
|
+
openInvite(roomName) {
|
|
855
|
+
this.inviteRoomName = roomName || null;
|
|
856
|
+
this.userSearch = '';
|
|
857
|
+
this.userResults = [];
|
|
858
|
+
this.selectedInvitees = [];
|
|
859
|
+
this.searched = false;
|
|
860
|
+
this.inviteMessage = null;
|
|
861
|
+
this.showInvite = true;
|
|
862
|
+
}
|
|
863
|
+
/** Searches `MJ: Users` by name/email, excluding the current user + already-selected people. */
|
|
864
|
+
async searchUsers() {
|
|
865
|
+
const term = this.userSearch.trim();
|
|
866
|
+
if (!term) {
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
this.searching = true;
|
|
870
|
+
this.cdr.markForCheck();
|
|
871
|
+
try {
|
|
872
|
+
const p = this.ProviderToUse;
|
|
873
|
+
const escaped = term.replace(/'/g, "''");
|
|
874
|
+
const excluded = [p.CurrentUser?.ID, ...this.selectedInvitees.map((u) => u.ID)].filter(Boolean);
|
|
875
|
+
const excludeFilter = excluded.length ? ` AND ID NOT IN (${excluded.map((id) => `'${id}'`).join(',')})` : '';
|
|
876
|
+
const result = await RunView.FromMetadataProvider(p).RunView({
|
|
877
|
+
EntityName: 'Users',
|
|
878
|
+
ExtraFilter: `IsActive = 1 AND (Name LIKE '%${escaped}%' OR Email LIKE '%${escaped}%')${excludeFilter}`,
|
|
879
|
+
OrderBy: 'Name',
|
|
880
|
+
Fields: ['ID', 'Name', 'Email'],
|
|
881
|
+
MaxRows: 20,
|
|
882
|
+
ResultType: 'simple',
|
|
883
|
+
});
|
|
884
|
+
this.userResults = (result.Success ? result.Results : []).map((u) => ({
|
|
885
|
+
ID: u.ID,
|
|
886
|
+
Name: u.Name || u.Email || '(unnamed)',
|
|
887
|
+
Email: u.Email ?? null,
|
|
888
|
+
}));
|
|
889
|
+
}
|
|
890
|
+
finally {
|
|
891
|
+
this.searching = false;
|
|
892
|
+
this.searched = true;
|
|
893
|
+
this.cdr.markForCheck();
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
/** Adds a person to the invite list (and out of the results). */
|
|
897
|
+
addInvitee(user) {
|
|
898
|
+
if (!this.selectedInvitees.some((u) => UUIDsEqual(u.ID, user.ID))) {
|
|
899
|
+
this.selectedInvitees = [...this.selectedInvitees, user];
|
|
900
|
+
}
|
|
901
|
+
this.userResults = this.userResults.filter((u) => !UUIDsEqual(u.ID, user.ID));
|
|
902
|
+
}
|
|
903
|
+
/** Removes a person from the invite list. */
|
|
904
|
+
removeInvitee(userId) {
|
|
905
|
+
this.selectedInvitees = this.selectedInvitees.filter((u) => !UUIDsEqual(u.ID, userId));
|
|
906
|
+
}
|
|
907
|
+
/** Sends the invites — the server notifies each person (in-app + Comms when configured). */
|
|
908
|
+
async sendInvites() {
|
|
909
|
+
if (!this.selectedInvitees.length || !this.inviteRoomName || this.inviting) {
|
|
910
|
+
return;
|
|
911
|
+
}
|
|
912
|
+
this.inviting = true;
|
|
913
|
+
this.inviteMessage = null;
|
|
914
|
+
this.cdr.markForCheck();
|
|
915
|
+
try {
|
|
916
|
+
const client = new GraphQLLiveKitClient(this.ProviderToUse);
|
|
917
|
+
const ok = await client.InviteUsers(this.inviteRoomName, this.selectedInvitees.map((u) => u.ID));
|
|
918
|
+
if (ok) {
|
|
919
|
+
this.inviteMessage = `Invited ${this.selectedInvitees.length} ${this.selectedInvitees.length === 1 ? 'person' : 'people'}.`;
|
|
920
|
+
this.selectedInvitees = [];
|
|
921
|
+
setTimeout(() => {
|
|
922
|
+
this.showInvite = false;
|
|
923
|
+
this.cdr.markForCheck();
|
|
924
|
+
}, 900);
|
|
925
|
+
}
|
|
926
|
+
else {
|
|
927
|
+
this.inviteMessage = 'Could not send the invites. Please try again.';
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
catch (err) {
|
|
931
|
+
this.inviteMessage = err instanceof Error ? err.message : String(err);
|
|
932
|
+
}
|
|
933
|
+
finally {
|
|
934
|
+
this.inviting = false;
|
|
935
|
+
this.cdr.markForCheck();
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
ngAfterViewInit() {
|
|
939
|
+
// Clear the shell loading screen even if resolution is slow — the picker/room/message shows its own
|
|
940
|
+
// state, so the loader must not hang on direct URL navigation.
|
|
941
|
+
this.NotifyLoadComplete();
|
|
942
|
+
}
|
|
943
|
+
ngOnDestroy() {
|
|
944
|
+
super.ngOnDestroy();
|
|
945
|
+
}
|
|
946
|
+
async GetResourceDisplayName(_data) {
|
|
947
|
+
return 'Live Room';
|
|
948
|
+
}
|
|
949
|
+
async GetResourceIconClass(_data) {
|
|
950
|
+
return 'fa-solid fa-video';
|
|
951
|
+
}
|
|
952
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵLiveKitRoomResource_BaseFactory; return function LiveKitRoomResource_Factory(__ngFactoryType__) { return (ɵLiveKitRoomResource_BaseFactory || (ɵLiveKitRoomResource_BaseFactory = i0.ɵɵgetInheritedFactory(LiveKitRoomResource)))(__ngFactoryType__ || LiveKitRoomResource); }; })();
|
|
953
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LiveKitRoomResource, selectors: [["mj-livekit-room-resource"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 2, consts: [[1, "mj-livekit-room-resource", 3, "Mode", "RoomName", "AgentID", "TargetAgentID", "AgentName", "AvailableAgents", "RealtimeModelID", "RealtimeVoice", "CanPickModelVoice", "AvailableModels", "Provider", "ShowAgentState", "ShowWhiteboard", "EnableLayoutSwitcher", "EnablePinning"], [1, "mj-lk-prejoin"], [1, "mj-livekit-room-resource__message"], ["Title", "Invite people", "Size", "auto", 3, "Visible", "Width"], [1, "mj-livekit-room-resource", 3, "Connected", "Disconnected", "ErrorOccurred", "InvitePeopleRequested", "Mode", "RoomName", "AgentID", "TargetAgentID", "AgentName", "AvailableAgents", "RealtimeModelID", "RealtimeVoice", "CanPickModelVoice", "AvailableModels", "Provider", "ShowAgentState", "ShowWhiteboard", "EnableLayoutSwitcher", "EnablePinning"], [1, "mj-lk-prejoin__card"], ["type", "button", 1, "mj-lk-back", 3, "click"], [1, "fa-solid", "fa-arrow-left"], [1, "mj-lk-prejoin__icon"], [1, "fa-solid", "fa-video"], [1, "mj-lk-prejoin__title"], [1, "mj-lk-prejoin__subtitle"], ["for", "mj-lk-target", 1, "mj-lk-prejoin__label"], ["id", "mj-lk-target", 1, "mj-input", "mj-lk-prejoin__select", 3, "change"], [3, "value", "selected"], [1, "mj-lk-prejoin__desc"], ["type", "button", 1, "mj-lk-prejoin__start", 3, "click", "disabled"], [1, "fa-solid", "fa-phone"], ["for", "mj-lk-model", 1, "mj-lk-prejoin__label"], [1, "mj-lk-prejoin__dev"], ["id", "mj-lk-model", 1, "mj-input", "mj-lk-prejoin__select", 3, "change"], ["value", ""], ["for", "mj-lk-voice", 1, "mj-lk-prejoin__label"], ["id", "mj-lk-voice", 1, "mj-input", "mj-lk-prejoin__select", 3, "change"], [1, "mj-lk-prejoin__card", "mj-lk-prejoin__card--wide"], [1, "mj-lk-cards"], ["type", "button", 1, "mj-lk-card", 3, "click"], [1, "fa-solid", "fa-circle-plus"], [1, "mj-lk-card__t"], [1, "mj-lk-card__d"], [1, "fa-solid", "fa-door-open"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "mj-lk-listmsg"], [1, "mj-lk-list"], ["for", "mj-lk-room", 1, "mj-lk-prejoin__label"], [1, "mj-lk-joinrow"], ["id", "mj-lk-room", "type", "text", "placeholder", "Room name\u2026", 1, "mj-input", "mj-lk-joinrow__input", 3, "input", "keydown.enter", "value"], ["type", "button", 1, "mj-lk-prejoin__start", "mj-lk-joinrow__btn", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["type", "button", 1, "mj-lk-list__row"], ["type", "button", 1, "mj-lk-list__row", 3, "click"], [1, "mj-lk-list__name"], [1, "fa-solid", "fa-circle", "mj-lk-livedot"], [1, "mj-lk-list__meta"], [1, "fa-solid", "fa-comments"], [1, "mj-lk-transcript"], [1, "mj-lk-tline", 3, "mj-lk-tline--agent", "mj-lk-tline--error"], [1, "mj-lk-tline"], [1, "mj-lk-tline__who"], [1, "mj-lk-tline__msg"], [1, "fa-solid", "fa-circle-exclamation"], ["Title", "Invite people", "Size", "auto", 3, "Close", "Visible", "Width"], [1, "mj-lk-invite"], [1, "mj-lk-invite__hint"], [1, "mj-lk-invite__search"], ["type", "text", "placeholder", "Search people by name or email\u2026", 1, "mj-input", 3, "input", "keydown.enter", "value"], ["type", "button", 1, "mj-lk-invite__searchbtn", 3, "click", "disabled"], [1, "fa-solid"], [1, "mj-lk-invite__chips"], [1, "mj-lk-invite__results"], [1, "mj-lk-invite__empty"], [1, "mj-lk-invite__msg"], [1, "mj-lk-invite__actions"], ["type", "button", 1, "mj-lk-invite__send", 3, "click", "disabled"], ["type", "button", 1, "mj-lk-invite__cancel", 3, "click"], [1, "mj-lk-invite__chip"], ["type", "button", 1, "mj-lk-invite__chipx", 3, "click"], [1, "fa-solid", "fa-xmark"], ["type", "button", 1, "mj-lk-invite__result"], ["type", "button", 1, "mj-lk-invite__result", 3, "click"], [1, "mj-lk-invite__rname"], [1, "mj-lk-invite__remail"]], template: function LiveKitRoomResource_Template(rf, ctx) { if (rf & 1) {
|
|
954
|
+
i0.ɵɵconditionalCreate(0, LiveKitRoomResource_Case_0_Template, 1, 15, "mj-livekit-agent-room", 0)(1, LiveKitRoomResource_Case_1_Template, 21, 3, "div", 1)(2, LiveKitRoomResource_Case_2_Template, 27, 0, "div", 1)(3, LiveKitRoomResource_Case_3_Template, 16, 3, "div", 1)(4, LiveKitRoomResource_Case_4_Template, 4, 1, "div", 1)(5, LiveKitRoomResource_Case_5_Template, 4, 1, "div", 2)(6, LiveKitRoomResource_Case_6_Template, 2, 0, "div", 2);
|
|
955
|
+
i0.ɵɵconditionalCreate(7, LiveKitRoomResource_Conditional_7_Template, 18, 21, "mj-dialog", 3);
|
|
956
|
+
} if (rf & 2) {
|
|
957
|
+
let tmp_0_0;
|
|
958
|
+
i0.ɵɵconditional((tmp_0_0 = ctx.phase) === "live" ? 0 : tmp_0_0 === "picking" ? 1 : tmp_0_0 === "landing" ? 2 : tmp_0_0 === "existing" ? 3 : tmp_0_0 === "history" ? 4 : tmp_0_0 === "error" ? 5 : 6);
|
|
959
|
+
i0.ɵɵadvance(7);
|
|
960
|
+
i0.ɵɵconditional(ctx.showInvite ? 7 : -1);
|
|
961
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i2.MJDialogComponent, i3.MJLiveKitRoomComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource[_ngcontent-%COMP%] {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource__message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n height: 100%;\n padding: 1.5rem;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .mj-livekit-room-resource__message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n }\n .mj-lk-prejoin[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 1.5rem;\n background: var(--mj-bg-page);\n }\n .mj-lk-prejoin__card[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 440px;\n padding: 2rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md, 0 4px 16px rgba(0, 0, 0, 0.12));\n text-align: center;\n }\n .mj-lk-prejoin__icon[_ngcontent-%COMP%] {\n font-size: 1.75rem;\n color: var(--mj-brand-primary);\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__title[_ngcontent-%COMP%] {\n margin: 0 0 0.5rem;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n }\n .mj-lk-prejoin__subtitle[_ngcontent-%COMP%] {\n margin: 0 0 1.5rem;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__label[_ngcontent-%COMP%] {\n display: block;\n text-align: left;\n margin-bottom: 0.35rem;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n font-weight: 600;\n }\n .mj-lk-prejoin__dev[_ngcontent-%COMP%] {\n margin-left: 0.35rem;\n padding: 0 0.35rem;\n border-radius: 999px;\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n vertical-align: middle;\n }\n .mj-lk-prejoin__select[_ngcontent-%COMP%] {\n width: 100%;\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__desc[_ngcontent-%COMP%] {\n text-align: left;\n margin: 0 0 1.25rem;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__start[_ngcontent-%COMP%] {\n width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.625rem 1rem;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.9375rem;\n font-weight: 600;\n cursor: pointer;\n }\n .mj-lk-prejoin__start[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n .mj-lk-prejoin__start[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-prejoin__card--wide[_ngcontent-%COMP%] {\n max-width: 560px;\n text-align: left;\n }\n .mj-lk-back[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 0.75rem;\n padding: 4px 8px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-back[_ngcontent-%COMP%]:hover { color: var(--mj-text-primary); }\n .mj-lk-cards[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.75rem;\n margin-top: 1.25rem;\n }\n .mj-lk-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 1.25rem 0.75rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: center;\n }\n .mj-lk-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card));\n }\n .mj-lk-card[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] { font-size: 1.4rem; color: var(--mj-brand-primary); }\n .mj-lk-card__t[_ngcontent-%COMP%] { font-weight: 600; color: var(--mj-text-primary); font-size: 0.9rem; }\n .mj-lk-card__d[_ngcontent-%COMP%] { color: var(--mj-text-muted); font-size: 0.78rem; line-height: 1.3; }\n .mj-lk-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0.5rem 0 1rem;\n max-height: 320px;\n overflow-y: auto;\n }\n .mj-lk-list__row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-list__row[_ngcontent-%COMP%]:hover { border-color: var(--mj-brand-primary); background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card)); }\n .mj-lk-list__name[_ngcontent-%COMP%] { color: var(--mj-text-primary); font-size: 0.875rem; display: inline-flex; align-items: center; gap: 8px; }\n .mj-lk-list__meta[_ngcontent-%COMP%] { color: var(--mj-text-muted); font-size: 0.78rem; white-space: nowrap; }\n .mj-lk-livedot[_ngcontent-%COMP%] { color: var(--mj-status-success); font-size: 0.5rem; }\n .mj-lk-listmsg[_ngcontent-%COMP%] { padding: 1rem; color: var(--mj-text-secondary); text-align: center; }\n .mj-lk-joinrow[_ngcontent-%COMP%] { display: flex; gap: 8px; }\n .mj-lk-joinrow__input[_ngcontent-%COMP%] { flex: 1; }\n .mj-lk-joinrow__btn[_ngcontent-%COMP%] { white-space: nowrap; }\n .mj-lk-transcript[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 0.5rem;\n max-height: 60vh;\n overflow-y: auto;\n }\n .mj-lk-tline[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 10px;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n }\n .mj-lk-tline--agent[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)); }\n .mj-lk-tline--error[_ngcontent-%COMP%] { background: var(--mj-status-error-bg, color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface))); }\n .mj-lk-tline__who[_ngcontent-%COMP%] { font-size: 0.72rem; font-weight: 600; color: var(--mj-text-secondary); }\n .mj-lk-tline__msg[_ngcontent-%COMP%] { font-size: 0.875rem; color: var(--mj-text-primary); }\n .mj-lk-invite[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n min-width: 360px;\n padding: 0.25rem;\n }\n .mj-lk-invite__hint[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__search[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n }\n .mj-lk-invite__search[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n flex: 1;\n }\n .mj-lk-invite__searchbtn[_ngcontent-%COMP%], \n .mj-lk-invite__send[_ngcontent-%COMP%], \n .mj-lk-invite__cancel[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n padding: 0.5rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n cursor: pointer;\n font-size: 0.875rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n .mj-lk-invite__send[_ngcontent-%COMP%] {\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n .mj-lk-invite__send[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-invite__chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n }\n .mj-lk-invite__chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.5rem;\n border-radius: 999px;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n }\n .mj-lk-invite__chipx[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 0;\n }\n .mj-lk-invite__results[_ngcontent-%COMP%] {\n max-height: 220px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n }\n .mj-lk-invite__result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.1rem;\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: none;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n background: transparent;\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-invite__result[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n }\n .mj-lk-invite__rname[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n }\n .mj-lk-invite__remail[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n }\n .mj-lk-invite__empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n padding: 0.25rem;\n }\n .mj-lk-invite__msg[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.25rem;\n }"] });
|
|
962
|
+
};
|
|
963
|
+
LiveKitRoomResource = __decorate([
|
|
964
|
+
RegisterClass(BaseResourceComponent, 'LiveKitRoomResource')
|
|
965
|
+
], LiveKitRoomResource);
|
|
966
|
+
export { LiveKitRoomResource };
|
|
967
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LiveKitRoomResource, [{
|
|
968
|
+
type: Component,
|
|
969
|
+
args: [{ standalone: false, selector: 'mj-livekit-room-resource', template: `
|
|
970
|
+
@switch (phase) {
|
|
971
|
+
@case ('live') {
|
|
972
|
+
<mj-livekit-agent-room
|
|
973
|
+
class="mj-livekit-room-resource"
|
|
974
|
+
[Mode]="roomMode"
|
|
975
|
+
[RoomName]="joinRoomName"
|
|
976
|
+
[AgentID]="agentId"
|
|
977
|
+
[TargetAgentID]="targetAgentId"
|
|
978
|
+
[AgentName]="targetAgentName"
|
|
979
|
+
[AvailableAgents]="agents"
|
|
980
|
+
[RealtimeModelID]="selectedModelId"
|
|
981
|
+
[RealtimeVoice]="selectedVoice"
|
|
982
|
+
[CanPickModelVoice]="canPickModelVoice"
|
|
983
|
+
[AvailableModels]="realtimeModels"
|
|
984
|
+
[Provider]="ProviderToUse"
|
|
985
|
+
[ShowAgentState]="true"
|
|
986
|
+
[ShowWhiteboard]="true"
|
|
987
|
+
[EnableLayoutSwitcher]="true"
|
|
988
|
+
[EnablePinning]="true"
|
|
989
|
+
(Connected)="NotifyLoadComplete()"
|
|
990
|
+
(Disconnected)="onRoomLeft()"
|
|
991
|
+
(ErrorOccurred)="NotifyLoadComplete()"
|
|
992
|
+
(InvitePeopleRequested)="openInvite($event)"
|
|
993
|
+
></mj-livekit-agent-room>
|
|
994
|
+
}
|
|
995
|
+
@case ('picking') {
|
|
996
|
+
<div class="mj-lk-prejoin">
|
|
997
|
+
<div class="mj-lk-prejoin__card">
|
|
998
|
+
<button type="button" class="mj-lk-back" (click)="backToLanding()"><i class="fa-solid fa-arrow-left"></i> Back</button>
|
|
999
|
+
<div class="mj-lk-prejoin__icon"><i class="fa-solid fa-video"></i></div>
|
|
1000
|
+
<h2 class="mj-lk-prejoin__title">Start a call</h2>
|
|
1001
|
+
<p class="mj-lk-prejoin__subtitle">
|
|
1002
|
+
Choose the agent you want to talk to. You can add more agents (and invite people) once
|
|
1003
|
+
you're in the room.
|
|
1004
|
+
</p>
|
|
1005
|
+
<label class="mj-lk-prejoin__label" for="mj-lk-target">Agent</label>
|
|
1006
|
+
<select id="mj-lk-target" class="mj-input mj-lk-prejoin__select" (change)="onTargetChange($event)">
|
|
1007
|
+
@for (a of agents; track a.ID) {
|
|
1008
|
+
<option [value]="a.ID" [selected]="UUIDsEqual(a.ID, selectedTargetId)">{{ a.Name }}</option>
|
|
1009
|
+
}
|
|
1010
|
+
</select>
|
|
1011
|
+
@if (selectedDescription) {
|
|
1012
|
+
<p class="mj-lk-prejoin__desc">{{ selectedDescription }}</p>
|
|
1013
|
+
}
|
|
1014
|
+
@if (canPickModelVoice && realtimeModels.length) {
|
|
1015
|
+
<label class="mj-lk-prejoin__label" for="mj-lk-model">Model <span class="mj-lk-prejoin__dev">dev</span></label>
|
|
1016
|
+
<select id="mj-lk-model" class="mj-input mj-lk-prejoin__select" (change)="onModelChange($event)">
|
|
1017
|
+
<option value="">Default model</option>
|
|
1018
|
+
@for (m of realtimeModels; track m.ModelID) {
|
|
1019
|
+
<option [value]="m.ModelID" [selected]="UUIDsEqual(m.ModelID, selectedModelId)">{{ m.ModelName }}</option>
|
|
1020
|
+
}
|
|
1021
|
+
</select>
|
|
1022
|
+
@if (selectedModelVoices.length) {
|
|
1023
|
+
<label class="mj-lk-prejoin__label" for="mj-lk-voice">Voice <span class="mj-lk-prejoin__dev">dev</span></label>
|
|
1024
|
+
<select id="mj-lk-voice" class="mj-input mj-lk-prejoin__select" (change)="onVoiceChange($event)">
|
|
1025
|
+
<option value="">Default voice</option>
|
|
1026
|
+
@for (v of selectedModelVoices; track v.ID) {
|
|
1027
|
+
<option [value]="v.ID" [selected]="v.ID === selectedVoice">{{ v.Name }}</option>
|
|
1028
|
+
}
|
|
1029
|
+
</select>
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
<button type="button" class="mj-lk-prejoin__start" [disabled]="!selectedTargetId" (click)="startCall()">
|
|
1033
|
+
<i class="fa-solid fa-phone"></i> Start call
|
|
1034
|
+
</button>
|
|
1035
|
+
</div>
|
|
1036
|
+
</div>
|
|
1037
|
+
}
|
|
1038
|
+
@case ('landing') {
|
|
1039
|
+
<div class="mj-lk-prejoin">
|
|
1040
|
+
<div class="mj-lk-prejoin__card mj-lk-prejoin__card--wide">
|
|
1041
|
+
<div class="mj-lk-prejoin__icon"><i class="fa-solid fa-video"></i></div>
|
|
1042
|
+
<h2 class="mj-lk-prejoin__title">Meet</h2>
|
|
1043
|
+
<p class="mj-lk-prejoin__subtitle">Start a live room with agents and people, join one that's in progress, or review a past meeting.</p>
|
|
1044
|
+
<div class="mj-lk-cards">
|
|
1045
|
+
<button type="button" class="mj-lk-card" (click)="startNewRoom()">
|
|
1046
|
+
<i class="fa-solid fa-circle-plus"></i>
|
|
1047
|
+
<span class="mj-lk-card__t">New room</span>
|
|
1048
|
+
<span class="mj-lk-card__d">Pick an agent and start a fresh call.</span>
|
|
1049
|
+
</button>
|
|
1050
|
+
<button type="button" class="mj-lk-card" (click)="openExisting()">
|
|
1051
|
+
<i class="fa-solid fa-door-open"></i>
|
|
1052
|
+
<span class="mj-lk-card__t">Join existing</span>
|
|
1053
|
+
<span class="mj-lk-card__d">Hop into a room that's live right now.</span>
|
|
1054
|
+
</button>
|
|
1055
|
+
<button type="button" class="mj-lk-card" (click)="openHistory()">
|
|
1056
|
+
<i class="fa-solid fa-clock-rotate-left"></i>
|
|
1057
|
+
<span class="mj-lk-card__t">History</span>
|
|
1058
|
+
<span class="mj-lk-card__d">Read transcripts of past meetings.</span>
|
|
1059
|
+
</button>
|
|
1060
|
+
</div>
|
|
1061
|
+
</div>
|
|
1062
|
+
</div>
|
|
1063
|
+
}
|
|
1064
|
+
@case ('existing') {
|
|
1065
|
+
<div class="mj-lk-prejoin">
|
|
1066
|
+
<div class="mj-lk-prejoin__card mj-lk-prejoin__card--wide">
|
|
1067
|
+
<button type="button" class="mj-lk-back" (click)="backToLanding()"><i class="fa-solid fa-arrow-left"></i> Back</button>
|
|
1068
|
+
<h2 class="mj-lk-prejoin__title">Join a room</h2>
|
|
1069
|
+
@if (loadingActive) {
|
|
1070
|
+
<div class="mj-lk-listmsg"><i class="fa-solid fa-spinner fa-spin"></i> Finding active rooms…</div>
|
|
1071
|
+
} @else if (activeRooms.length) {
|
|
1072
|
+
<div class="mj-lk-list">
|
|
1073
|
+
@for (r of activeRooms; track r.RoomName) {
|
|
1074
|
+
<button type="button" class="mj-lk-list__row" (click)="joinExistingRoom(r.RoomName)">
|
|
1075
|
+
<span class="mj-lk-list__name"><i class="fa-solid fa-circle mj-lk-livedot"></i> {{ r.Label }}</span>
|
|
1076
|
+
<span class="mj-lk-list__meta">{{ r.AgentCount }} agent{{ r.AgentCount === 1 ? '' : 's' }} · Join</span>
|
|
1077
|
+
</button>
|
|
1078
|
+
}
|
|
1079
|
+
</div>
|
|
1080
|
+
} @else {
|
|
1081
|
+
<p class="mj-lk-prejoin__desc">No rooms are active right now.</p>
|
|
1082
|
+
}
|
|
1083
|
+
<label class="mj-lk-prejoin__label" for="mj-lk-room">Or join by name</label>
|
|
1084
|
+
<div class="mj-lk-joinrow">
|
|
1085
|
+
<input id="mj-lk-room" class="mj-input mj-lk-joinrow__input" type="text" placeholder="Room name…" [value]="manualRoomName"
|
|
1086
|
+
(input)="manualRoomName = $any($event.target).value" (keydown.enter)="joinExistingRoom(manualRoomName)" />
|
|
1087
|
+
<button type="button" class="mj-lk-prejoin__start mj-lk-joinrow__btn" [disabled]="!manualRoomName.trim()" (click)="joinExistingRoom(manualRoomName)">Join</button>
|
|
1088
|
+
</div>
|
|
1089
|
+
</div>
|
|
1090
|
+
</div>
|
|
1091
|
+
}
|
|
1092
|
+
@case ('history') {
|
|
1093
|
+
<div class="mj-lk-prejoin">
|
|
1094
|
+
<div class="mj-lk-prejoin__card mj-lk-prejoin__card--wide">
|
|
1095
|
+
@if (!openHistoryRoom) {
|
|
1096
|
+
<button type="button" class="mj-lk-back" (click)="backToLanding()"><i class="fa-solid fa-arrow-left"></i> Back</button>
|
|
1097
|
+
<h2 class="mj-lk-prejoin__title">Past meetings</h2>
|
|
1098
|
+
@if (loadingHistory) {
|
|
1099
|
+
<div class="mj-lk-listmsg"><i class="fa-solid fa-spinner fa-spin"></i> Loading…</div>
|
|
1100
|
+
} @else if (historyRooms.length) {
|
|
1101
|
+
<div class="mj-lk-list">
|
|
1102
|
+
@for (h of historyRooms; track h.ConversationID) {
|
|
1103
|
+
<button type="button" class="mj-lk-list__row" (click)="openTranscript(h)">
|
|
1104
|
+
<span class="mj-lk-list__name"><i class="fa-solid fa-comments"></i> {{ h.Name }}</span>
|
|
1105
|
+
<span class="mj-lk-list__meta">{{ formatTime(h.At) }}</span>
|
|
1106
|
+
</button>
|
|
1107
|
+
}
|
|
1108
|
+
</div>
|
|
1109
|
+
} @else {
|
|
1110
|
+
<p class="mj-lk-prejoin__desc">No past meetings yet.</p>
|
|
1111
|
+
}
|
|
1112
|
+
} @else {
|
|
1113
|
+
<button type="button" class="mj-lk-back" (click)="closeTranscript()"><i class="fa-solid fa-arrow-left"></i> All meetings</button>
|
|
1114
|
+
<h2 class="mj-lk-prejoin__title">{{ openHistoryRoom.Name }}</h2>
|
|
1115
|
+
@if (loadingTranscript) {
|
|
1116
|
+
<div class="mj-lk-listmsg"><i class="fa-solid fa-spinner fa-spin"></i> Loading transcript…</div>
|
|
1117
|
+
} @else if (historyTranscript.length) {
|
|
1118
|
+
<div class="mj-lk-transcript">
|
|
1119
|
+
@for (line of historyTranscript; track $index) {
|
|
1120
|
+
<div class="mj-lk-tline" [class.mj-lk-tline--agent]="line.Kind === 'agent'" [class.mj-lk-tline--error]="line.Kind === 'error'">
|
|
1121
|
+
<span class="mj-lk-tline__who">{{ line.Speaker }}</span>
|
|
1122
|
+
<span class="mj-lk-tline__msg">{{ line.Message }}</span>
|
|
1123
|
+
</div>
|
|
1124
|
+
}
|
|
1125
|
+
</div>
|
|
1126
|
+
} @else {
|
|
1127
|
+
<p class="mj-lk-prejoin__desc">No transcript was captured for this meeting.</p>
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
</div>
|
|
1131
|
+
</div>
|
|
1132
|
+
}
|
|
1133
|
+
@case ('error') {
|
|
1134
|
+
<div class="mj-livekit-room-resource__message">
|
|
1135
|
+
<i class="fa-solid fa-circle-exclamation"></i>
|
|
1136
|
+
<span>{{ resolveError }}</span>
|
|
1137
|
+
</div>
|
|
1138
|
+
}
|
|
1139
|
+
@default {
|
|
1140
|
+
<div class="mj-livekit-room-resource__message">Preparing room…</div>
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
@if (showInvite) {
|
|
1145
|
+
<mj-dialog [Visible]="showInvite" (Close)="showInvite = false" Title="Invite people" Size="auto" [Width]="440">
|
|
1146
|
+
<div class="mj-lk-invite">
|
|
1147
|
+
<p class="mj-lk-invite__hint">They'll get an in-app notification (and an email if Comms is set up) to join this room.</p>
|
|
1148
|
+
<div class="mj-lk-invite__search">
|
|
1149
|
+
<input class="mj-input" type="text" [value]="userSearch" placeholder="Search people by name or email…"
|
|
1150
|
+
(input)="userSearch = $any($event.target).value" (keydown.enter)="searchUsers()" />
|
|
1151
|
+
<button type="button" class="mj-lk-invite__searchbtn" [disabled]="searching" (click)="searchUsers()">
|
|
1152
|
+
<i class="fa-solid" [class.fa-magnifying-glass]="!searching" [class.fa-spinner]="searching" [class.fa-spin]="searching"></i>
|
|
1153
|
+
</button>
|
|
1154
|
+
</div>
|
|
1155
|
+
|
|
1156
|
+
@if (selectedInvitees.length) {
|
|
1157
|
+
<div class="mj-lk-invite__chips">
|
|
1158
|
+
@for (u of selectedInvitees; track u.ID) {
|
|
1159
|
+
<span class="mj-lk-invite__chip">
|
|
1160
|
+
{{ u.Name }}
|
|
1161
|
+
<button type="button" class="mj-lk-invite__chipx" (click)="removeInvitee(u.ID)"><i class="fa-solid fa-xmark"></i></button>
|
|
1162
|
+
</span>
|
|
1163
|
+
}
|
|
1164
|
+
</div>
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
@if (userResults.length) {
|
|
1168
|
+
<div class="mj-lk-invite__results">
|
|
1169
|
+
@for (u of userResults; track u.ID) {
|
|
1170
|
+
<button type="button" class="mj-lk-invite__result" (click)="addInvitee(u)">
|
|
1171
|
+
<span class="mj-lk-invite__rname">{{ u.Name }}</span>
|
|
1172
|
+
@if (u.Email) { <span class="mj-lk-invite__remail">{{ u.Email }}</span> }
|
|
1173
|
+
</button>
|
|
1174
|
+
}
|
|
1175
|
+
</div>
|
|
1176
|
+
} @else if (searched && !searching) {
|
|
1177
|
+
<div class="mj-lk-invite__empty">No matching people.</div>
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
@if (inviteMessage) {
|
|
1181
|
+
<div class="mj-lk-invite__msg">{{ inviteMessage }}</div>
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
<div class="mj-lk-invite__actions">
|
|
1185
|
+
<button type="button" class="mj-lk-invite__send" [disabled]="!selectedInvitees.length || inviting" (click)="sendInvites()">
|
|
1186
|
+
<i class="fa-solid" [class.fa-paper-plane]="!inviting" [class.fa-spinner]="inviting" [class.fa-spin]="inviting"></i>
|
|
1187
|
+
Invite {{ selectedInvitees.length || '' }}
|
|
1188
|
+
</button>
|
|
1189
|
+
<button type="button" class="mj-lk-invite__cancel" (click)="showInvite = false">Cancel</button>
|
|
1190
|
+
</div>
|
|
1191
|
+
</div>
|
|
1192
|
+
</mj-dialog>
|
|
1193
|
+
}
|
|
1194
|
+
`, styles: ["\n :host {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource {\n display: block;\n height: 100%;\n }\n .mj-livekit-room-resource__message {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n height: 100%;\n padding: 1.5rem;\n text-align: center;\n color: var(--mj-text-secondary);\n }\n .mj-livekit-room-resource__message i {\n color: var(--mj-status-warning);\n }\n .mj-lk-prejoin {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 1.5rem;\n background: var(--mj-bg-page);\n }\n .mj-lk-prejoin__card {\n width: 100%;\n max-width: 440px;\n padding: 2rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-md, 0 4px 16px rgba(0, 0, 0, 0.12));\n text-align: center;\n }\n .mj-lk-prejoin__icon {\n font-size: 1.75rem;\n color: var(--mj-brand-primary);\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__title {\n margin: 0 0 0.5rem;\n color: var(--mj-text-primary);\n font-size: 1.25rem;\n }\n .mj-lk-prejoin__subtitle {\n margin: 0 0 1.5rem;\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__label {\n display: block;\n text-align: left;\n margin-bottom: 0.35rem;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n font-weight: 600;\n }\n .mj-lk-prejoin__dev {\n margin-left: 0.35rem;\n padding: 0 0.35rem;\n border-radius: 999px;\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n vertical-align: middle;\n }\n .mj-lk-prejoin__select {\n width: 100%;\n margin-bottom: 0.75rem;\n }\n .mj-lk-prejoin__desc {\n text-align: left;\n margin: 0 0 1.25rem;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n line-height: 1.4;\n }\n .mj-lk-prejoin__start {\n width: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.625rem 1rem;\n border: none;\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.9375rem;\n font-weight: 600;\n cursor: pointer;\n }\n .mj-lk-prejoin__start:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n .mj-lk-prejoin__start:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-prejoin__card--wide {\n max-width: 560px;\n text-align: left;\n }\n .mj-lk-back {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 0.75rem;\n padding: 4px 8px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-back:hover { color: var(--mj-text-primary); }\n .mj-lk-cards {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 0.75rem;\n margin-top: 1.25rem;\n }\n .mj-lk-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 1.25rem 0.75rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: center;\n }\n .mj-lk-card:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card));\n }\n .mj-lk-card > i { font-size: 1.4rem; color: var(--mj-brand-primary); }\n .mj-lk-card__t { font-weight: 600; color: var(--mj-text-primary); font-size: 0.9rem; }\n .mj-lk-card__d { color: var(--mj-text-muted); font-size: 0.78rem; line-height: 1.3; }\n .mj-lk-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0.5rem 0 1rem;\n max-height: 320px;\n overflow-y: auto;\n }\n .mj-lk-list__row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.75rem;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-list__row:hover { border-color: var(--mj-brand-primary); background: var(--mj-bg-surface-hover, var(--mj-bg-surface-card)); }\n .mj-lk-list__name { color: var(--mj-text-primary); font-size: 0.875rem; display: inline-flex; align-items: center; gap: 8px; }\n .mj-lk-list__meta { color: var(--mj-text-muted); font-size: 0.78rem; white-space: nowrap; }\n .mj-lk-livedot { color: var(--mj-status-success); font-size: 0.5rem; }\n .mj-lk-listmsg { padding: 1rem; color: var(--mj-text-secondary); text-align: center; }\n .mj-lk-joinrow { display: flex; gap: 8px; }\n .mj-lk-joinrow__input { flex: 1; }\n .mj-lk-joinrow__btn { white-space: nowrap; }\n .mj-lk-transcript {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 0.5rem;\n max-height: 60vh;\n overflow-y: auto;\n }\n .mj-lk-tline {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 10px;\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n }\n .mj-lk-tline--agent { background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface)); }\n .mj-lk-tline--error { background: var(--mj-status-error-bg, color-mix(in srgb, var(--mj-status-error) 8%, var(--mj-bg-surface))); }\n .mj-lk-tline__who { font-size: 0.72rem; font-weight: 600; color: var(--mj-text-secondary); }\n .mj-lk-tline__msg { font-size: 0.875rem; color: var(--mj-text-primary); }\n .mj-lk-invite {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n min-width: 360px;\n padding: 0.25rem;\n }\n .mj-lk-invite__hint {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__search {\n display: flex;\n gap: 0.5rem;\n }\n .mj-lk-invite__search .mj-input {\n flex: 1;\n }\n .mj-lk-invite__searchbtn,\n .mj-lk-invite__send,\n .mj-lk-invite__cancel {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n padding: 0.5rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n cursor: pointer;\n font-size: 0.875rem;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n }\n .mj-lk-invite__send {\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n }\n .mj-lk-invite__send:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-invite__chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n }\n .mj-lk-invite__chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.5rem;\n border-radius: 999px;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n }\n .mj-lk-invite__chipx {\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--mj-text-muted);\n padding: 0;\n }\n .mj-lk-invite__results {\n max-height: 220px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n }\n .mj-lk-invite__result {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.1rem;\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: none;\n border-bottom: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n background: transparent;\n cursor: pointer;\n text-align: left;\n }\n .mj-lk-invite__result:hover {\n background: var(--mj-bg-surface-hover);\n }\n .mj-lk-invite__rname {\n color: var(--mj-text-primary);\n font-size: 0.875rem;\n }\n .mj-lk-invite__remail {\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n }\n .mj-lk-invite__empty {\n color: var(--mj-text-muted);\n font-size: 0.8125rem;\n padding: 0.25rem;\n }\n .mj-lk-invite__msg {\n color: var(--mj-text-secondary);\n font-size: 0.8125rem;\n }\n .mj-lk-invite__actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.25rem;\n }\n "] }]
|
|
1195
|
+
}], null, null); })();
|
|
1196
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LiveKitRoomResource, { className: "LiveKitRoomResource", filePath: "src/lib/resource-wrappers/livekit-room-resource.component.ts", lineNumber: 577 }); })();
|
|
1197
|
+
//# sourceMappingURL=livekit-room-resource.component.js.map
|