@edvak99/voice-receptionist-widget 1.1.7 → 1.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-CtaPoY1k.mjs +344 -0
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-CtaPoY1k.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-ai-receptionist-api.service-DokIb-9r.mjs → edvak99-voice-receptionist-widget-ai-receptionist-api.service-CK6tM862.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-ai-receptionist-api.service-DokIb-9r.mjs.map → edvak99-voice-receptionist-widget-ai-receptionist-api.service-CK6tM862.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-CM5-vgzu.mjs +277 -0
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-CM5-vgzu.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-history-detail-page.component-A-vx_M3l.mjs → edvak99-voice-receptionist-widget-call-history-detail-page.component-BuNyPmhn.mjs} +11 -8
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-BuNyPmhn.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-B-99E9Rs.mjs +193 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-B-99E9Rs.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-Pla2UgeZ.mjs → edvak99-voice-receptionist-widget-call-recording-player.component-Cy9DGRci.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-Pla2UgeZ.mjs.map → edvak99-voice-receptionist-widget-call-recording-player.component-Cy9DGRci.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-Di7GLG9k.mjs → edvak99-voice-receptionist-widget-call-review.service-BAjx3n3v.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-Di7GLG9k.mjs.map → edvak99-voice-receptionist-widget-call-review.service-BAjx3n3v.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-9ao09dEd.mjs +113 -0
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-9ao09dEd.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-dashboard-socket.service-D2pelzu4.mjs → edvak99-voice-receptionist-widget-dashboard-socket.service-BuFQz1lN.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-dashboard-socket.service-D2pelzu4.mjs.map → edvak99-voice-receptionist-widget-dashboard-socket.service-BuFQz1lN.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-pulse-dot.component-Ig0Eoq1z.mjs → edvak99-voice-receptionist-widget-eds-pulse-dot.component-CQIqnrcs.mjs} +3 -3
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-pulse-dot.component-Ig0Eoq1z.mjs.map → edvak99-voice-receptionist-widget-eds-pulse-dot.component-CQIqnrcs.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-BDtAQSyF.mjs → edvak99-voice-receptionist-widget-live-calls-page.component-4LJuMn28.mjs} +3 -3
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-BDtAQSyF.mjs.map → edvak99-voice-receptionist-widget-live-calls-page.component-4LJuMn28.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-7e1HY6sB.mjs → edvak99-voice-receptionist-widget-live-monitor-page.component-CJ7N-Jq6.mjs} +6 -6
- package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-7e1HY6sB.mjs.map → edvak99-voice-receptionist-widget-live-monitor-page.component-CJ7N-Jq6.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-outbound-purposes-page.component-2GHT8NT9.mjs → edvak99-voice-receptionist-widget-outbound-purposes-page.component-HJmMq0b6.mjs} +127 -3
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-HJmMq0b6.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-settings-page.component-BwCz1dlx.mjs → edvak99-voice-receptionist-widget-settings-page.component-CspheAr8.mjs} +31 -6
- package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-CspheAr8.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-tasks-page.component-Mqo1UmfK.mjs → edvak99-voice-receptionist-widget-tasks-page.component-Dfz-_0Jz.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-tasks-page.component-Mqo1UmfK.mjs.map → edvak99-voice-receptionist-widget-tasks-page.component-Dfz-_0Jz.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-DskeqJwB.mjs → edvak99-voice-receptionist-widget-wizard-page.component-BD4Zhp0Y.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-DskeqJwB.mjs.map → edvak99-voice-receptionist-widget-wizard-page.component-BD4Zhp0Y.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget.mjs +12 -12
- package/lib/pages/activities-page/activities-page.component.d.ts +2 -0
- package/lib/pages/call-history-detail-page/call-history-detail-page.component.d.ts +4 -0
- package/lib/pages/dashboard-page/dashboard-page.component.d.ts +0 -3
- package/lib/pages/settings-page/settings-page.component.d.ts +4 -0
- package/package.json +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-4UrqnTE3.mjs +0 -306
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-4UrqnTE3.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-DUR5f5nc.mjs +0 -277
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-DUR5f5nc.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-A-vx_M3l.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-gROZVIt-.mjs +0 -193
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-gROZVIt-.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-E30a8p3d.mjs +0 -439
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-E30a8p3d.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-Bdh4QfFe.mjs +0 -127
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-Bdh4QfFe.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-2GHT8NT9.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-BwCz1dlx.mjs.map +0 -1
- package/lib/components/outbound-dial-modal/outbound-dial-modal.component.d.ts +0 -63
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
4
|
+
import { A as AiReceptionistApiService, D as DEFAULT_PAGE_SIZE, j as totalPages, d as ageFromDob, l as initialsFromName } from './edvak99-voice-receptionist-widget-ai-receptionist-api.service-CK6tM862.mjs';
|
|
5
|
+
import { E as EdsAvatarComponent } from './edvak99-voice-receptionist-widget-eds-avatar.component-BJs_TH8X.mjs';
|
|
6
|
+
import { EdsButtonComponent, EdsIconComponent } from './edvak99-voice-receptionist-widget.mjs';
|
|
7
|
+
|
|
8
|
+
const TABS = [
|
|
9
|
+
{ id: 'task_created', label: 'Tasks' },
|
|
10
|
+
{ id: 'appointment_booked', label: 'Appointments' },
|
|
11
|
+
{ id: 'patient_created', label: 'Registrations' },
|
|
12
|
+
];
|
|
13
|
+
const AVATAR_TONES = ['green', 'amber', 'brand', 'violet', 'rose'];
|
|
14
|
+
class ActivitiesPageComponent {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.api = inject(AiReceptionistApiService);
|
|
17
|
+
this.route = inject(ActivatedRoute);
|
|
18
|
+
this.router = inject(Router);
|
|
19
|
+
this.tabs = TABS;
|
|
20
|
+
this.pageSize = DEFAULT_PAGE_SIZE;
|
|
21
|
+
this.items = signal([]);
|
|
22
|
+
this.total = signal(0);
|
|
23
|
+
this.page = signal(1);
|
|
24
|
+
this.activeTab = signal('appointment_booked');
|
|
25
|
+
this.callIdFilter = signal(null);
|
|
26
|
+
this.loading = signal(true);
|
|
27
|
+
this.loadError = signal(null);
|
|
28
|
+
}
|
|
29
|
+
ngOnInit() {
|
|
30
|
+
const callId = this.route.snapshot.queryParamMap.get('callId')?.trim() || null;
|
|
31
|
+
if (callId)
|
|
32
|
+
this.callIdFilter.set(callId);
|
|
33
|
+
const tabParam = (this.route.snapshot.queryParamMap.get('tab') || '').trim().toLowerCase();
|
|
34
|
+
const tabFromQuery = this.tabFromQuery(tabParam);
|
|
35
|
+
if (tabFromQuery)
|
|
36
|
+
this.activeTab.set(tabFromQuery);
|
|
37
|
+
this.load();
|
|
38
|
+
}
|
|
39
|
+
setTab(tab) {
|
|
40
|
+
if (this.activeTab() === tab)
|
|
41
|
+
return;
|
|
42
|
+
this.activeTab.set(tab);
|
|
43
|
+
this.page.set(1);
|
|
44
|
+
void this.router.navigate([], {
|
|
45
|
+
relativeTo: this.route,
|
|
46
|
+
queryParams: { tab: this.tabQueryValue(tab) },
|
|
47
|
+
queryParamsHandling: 'merge',
|
|
48
|
+
replaceUrl: true,
|
|
49
|
+
});
|
|
50
|
+
this.load();
|
|
51
|
+
}
|
|
52
|
+
tabFromQuery(raw) {
|
|
53
|
+
switch (raw) {
|
|
54
|
+
case 'tasks':
|
|
55
|
+
case 'task':
|
|
56
|
+
case 'task_created':
|
|
57
|
+
return 'task_created';
|
|
58
|
+
case 'appointments':
|
|
59
|
+
case 'appointment':
|
|
60
|
+
case 'appointment_booked':
|
|
61
|
+
return 'appointment_booked';
|
|
62
|
+
case 'registrations':
|
|
63
|
+
case 'registration':
|
|
64
|
+
case 'patient_created':
|
|
65
|
+
return 'patient_created';
|
|
66
|
+
default:
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
tabQueryValue(tab) {
|
|
71
|
+
switch (tab) {
|
|
72
|
+
case 'task_created':
|
|
73
|
+
return 'tasks';
|
|
74
|
+
case 'patient_created':
|
|
75
|
+
return 'registrations';
|
|
76
|
+
default:
|
|
77
|
+
return 'appointments';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
clearCallFilter() {
|
|
81
|
+
this.callIdFilter.set(null);
|
|
82
|
+
this.page.set(1);
|
|
83
|
+
this.load();
|
|
84
|
+
}
|
|
85
|
+
load() {
|
|
86
|
+
this.loading.set(true);
|
|
87
|
+
this.loadError.set(null);
|
|
88
|
+
const tab = this.activeTab();
|
|
89
|
+
this.api
|
|
90
|
+
.getActivities({
|
|
91
|
+
page: this.page(),
|
|
92
|
+
limit: DEFAULT_PAGE_SIZE,
|
|
93
|
+
types: tab,
|
|
94
|
+
callId: this.callIdFilter() || undefined,
|
|
95
|
+
})
|
|
96
|
+
.subscribe({
|
|
97
|
+
next: ({ items, total, page }) => {
|
|
98
|
+
this.items.set(items);
|
|
99
|
+
this.total.set(total);
|
|
100
|
+
this.page.set(page);
|
|
101
|
+
this.loading.set(false);
|
|
102
|
+
},
|
|
103
|
+
error: () => {
|
|
104
|
+
this.loading.set(false);
|
|
105
|
+
this.items.set([]);
|
|
106
|
+
this.total.set(0);
|
|
107
|
+
this.loadError.set('Activities feed is unavailable. Confirm GET /api/ai-receptionist/activities is deployed.');
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
totalPages() {
|
|
112
|
+
return totalPages(this.total(), DEFAULT_PAGE_SIZE);
|
|
113
|
+
}
|
|
114
|
+
prevPage() {
|
|
115
|
+
if (this.page() <= 1)
|
|
116
|
+
return;
|
|
117
|
+
this.page.update((p) => p - 1);
|
|
118
|
+
this.load();
|
|
119
|
+
}
|
|
120
|
+
nextPage() {
|
|
121
|
+
if (this.page() >= this.totalPages())
|
|
122
|
+
return;
|
|
123
|
+
this.page.update((p) => p + 1);
|
|
124
|
+
this.load();
|
|
125
|
+
}
|
|
126
|
+
historyLink(callId) {
|
|
127
|
+
return callId ? ['../history', callId] : null;
|
|
128
|
+
}
|
|
129
|
+
openCallHistory(callId, ev) {
|
|
130
|
+
if (!callId)
|
|
131
|
+
return;
|
|
132
|
+
if (ev && ev.target.closest('a,button'))
|
|
133
|
+
return;
|
|
134
|
+
void this.router.navigate(['../history', callId], { relativeTo: this.route });
|
|
135
|
+
}
|
|
136
|
+
displayMrn(item) {
|
|
137
|
+
return item.patientMrn?.trim() || '—';
|
|
138
|
+
}
|
|
139
|
+
providerSpecialtyLabel(item) {
|
|
140
|
+
const s = item.providerSpecialty?.trim();
|
|
141
|
+
if (!s)
|
|
142
|
+
return null;
|
|
143
|
+
// Hide stray numeric IDs that sometimes land in specialty.
|
|
144
|
+
if (/^\d+(\.\d+)?$/.test(s))
|
|
145
|
+
return null;
|
|
146
|
+
return s;
|
|
147
|
+
}
|
|
148
|
+
/** Day-anchored stamp — a bare clock time gave no idea which day a row belonged to. */
|
|
149
|
+
timestampLabel(item) {
|
|
150
|
+
const start = this.parseDate(item.startAt || item.occurredAt);
|
|
151
|
+
if (!start)
|
|
152
|
+
return '—';
|
|
153
|
+
const stamp = `${this.formatDay(start)}, ${this.formatClock(start)}`;
|
|
154
|
+
const end = this.parseDate(item.endAt);
|
|
155
|
+
if (end && end.getTime() > start.getTime()) {
|
|
156
|
+
return `${stamp} – ${this.formatClock(end)}`;
|
|
157
|
+
}
|
|
158
|
+
return stamp;
|
|
159
|
+
}
|
|
160
|
+
durationLabel(item) {
|
|
161
|
+
const mins = item.durationMinutes;
|
|
162
|
+
if (mins == null || mins <= 0) {
|
|
163
|
+
if (item.startAt && item.endAt) {
|
|
164
|
+
const ms = Date.parse(item.endAt) - Date.parse(item.startAt);
|
|
165
|
+
if (Number.isFinite(ms) && ms > 0) {
|
|
166
|
+
return `${Math.round(ms / 60000)} MIN`;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
return `${mins} MIN`;
|
|
172
|
+
}
|
|
173
|
+
categoryLabel(item) {
|
|
174
|
+
if (item.visitType)
|
|
175
|
+
return item.visitType;
|
|
176
|
+
switch (item.type) {
|
|
177
|
+
case 'appointment_booked':
|
|
178
|
+
return 'Appointment';
|
|
179
|
+
case 'patient_created':
|
|
180
|
+
return 'Registration';
|
|
181
|
+
case 'task_created':
|
|
182
|
+
return item.title && !/^task created$/i.test(item.title) ? item.title : 'Task';
|
|
183
|
+
default:
|
|
184
|
+
return item.title || 'Activity';
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
patientMeta(item) {
|
|
188
|
+
const parts = [];
|
|
189
|
+
const dob = item.patientDob;
|
|
190
|
+
const age = item.patientAge ?? (dob ? ageFromDob(dob) : null);
|
|
191
|
+
if (dob && age != null)
|
|
192
|
+
parts.push(`DOB: ${this.formatDob(dob)} · ${age}Y`);
|
|
193
|
+
else if (dob)
|
|
194
|
+
parts.push(`DOB: ${this.formatDob(dob)}`);
|
|
195
|
+
else if (age != null)
|
|
196
|
+
parts.push(`${age}Y`);
|
|
197
|
+
if (item.patientGender)
|
|
198
|
+
parts.push(item.patientGender);
|
|
199
|
+
return parts.length ? parts.join(' | ') : null;
|
|
200
|
+
}
|
|
201
|
+
patientInitials(item) {
|
|
202
|
+
return item.patientInitials || initialsFromName(item.patientName) || '?';
|
|
203
|
+
}
|
|
204
|
+
providerInitials(item) {
|
|
205
|
+
return item.providerInitials || initialsFromName(item.providerName) || '?';
|
|
206
|
+
}
|
|
207
|
+
avatarTone(key, salt) {
|
|
208
|
+
const raw = `${key || 'x'}:${salt}`;
|
|
209
|
+
let hash = 0;
|
|
210
|
+
for (let i = 0; i < raw.length; i++)
|
|
211
|
+
hash = (hash + raw.charCodeAt(i) * (i + 1)) % 997;
|
|
212
|
+
return AVATAR_TONES[hash % AVATAR_TONES.length];
|
|
213
|
+
}
|
|
214
|
+
insuranceState(item) {
|
|
215
|
+
if (item.hasInsurance === true)
|
|
216
|
+
return 'covered';
|
|
217
|
+
if (item.hasInsurance === false)
|
|
218
|
+
return 'none';
|
|
219
|
+
return 'unknown';
|
|
220
|
+
}
|
|
221
|
+
insuranceIcon(item) {
|
|
222
|
+
switch (this.insuranceState(item)) {
|
|
223
|
+
case 'covered':
|
|
224
|
+
return 'verified_user';
|
|
225
|
+
case 'none':
|
|
226
|
+
return 'gpp_bad';
|
|
227
|
+
default:
|
|
228
|
+
return 'gpp_maybe';
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
insuranceLabel(item) {
|
|
232
|
+
switch (this.insuranceState(item)) {
|
|
233
|
+
case 'covered':
|
|
234
|
+
return 'Insured';
|
|
235
|
+
case 'none':
|
|
236
|
+
return 'No insurance';
|
|
237
|
+
default:
|
|
238
|
+
return 'Unverified';
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
insuranceTitle(item) {
|
|
242
|
+
switch (this.insuranceState(item)) {
|
|
243
|
+
case 'covered':
|
|
244
|
+
return item.insuranceName ? `Insured — ${item.insuranceName}` : 'Insured';
|
|
245
|
+
case 'none':
|
|
246
|
+
return 'No insurance on file';
|
|
247
|
+
default:
|
|
248
|
+
return 'Insurance not verified';
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
isTaskRow(item) {
|
|
252
|
+
return item.type === 'task_created';
|
|
253
|
+
}
|
|
254
|
+
taskTitle(item) {
|
|
255
|
+
const title = (item.title || '').trim();
|
|
256
|
+
if (title && !/^task created$/i.test(title))
|
|
257
|
+
return title;
|
|
258
|
+
return item.visitType || 'Task';
|
|
259
|
+
}
|
|
260
|
+
priorityLabel(item) {
|
|
261
|
+
switch (item.priority) {
|
|
262
|
+
case 'urgent':
|
|
263
|
+
return 'Urgent';
|
|
264
|
+
case 'high':
|
|
265
|
+
return 'High';
|
|
266
|
+
case 'low':
|
|
267
|
+
return 'Low';
|
|
268
|
+
case 'medium':
|
|
269
|
+
case 'normal':
|
|
270
|
+
default:
|
|
271
|
+
return 'Medium';
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
priorityTone(item) {
|
|
275
|
+
switch (item.priority) {
|
|
276
|
+
case 'urgent':
|
|
277
|
+
return 'urgent';
|
|
278
|
+
case 'high':
|
|
279
|
+
return 'high';
|
|
280
|
+
case 'low':
|
|
281
|
+
return 'low';
|
|
282
|
+
default:
|
|
283
|
+
return 'medium';
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
isRegistrationTab() {
|
|
287
|
+
return this.activeTab() === 'patient_created';
|
|
288
|
+
}
|
|
289
|
+
emptyLabel() {
|
|
290
|
+
if (this.callIdFilter())
|
|
291
|
+
return 'No activities found for this call.';
|
|
292
|
+
switch (this.activeTab()) {
|
|
293
|
+
case 'task_created':
|
|
294
|
+
return 'No tasks created by the AI yet.';
|
|
295
|
+
case 'patient_created':
|
|
296
|
+
return 'No patient registrations yet.';
|
|
297
|
+
default:
|
|
298
|
+
return 'No appointments booked by the AI yet.';
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
parseDate(iso) {
|
|
302
|
+
if (!iso)
|
|
303
|
+
return null;
|
|
304
|
+
const d = new Date(iso);
|
|
305
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
306
|
+
}
|
|
307
|
+
formatDay(d) {
|
|
308
|
+
const midnight = (x) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();
|
|
309
|
+
const now = new Date();
|
|
310
|
+
const days = Math.round((midnight(d) - midnight(now)) / 86_400_000);
|
|
311
|
+
if (days === 0)
|
|
312
|
+
return 'Today';
|
|
313
|
+
if (days === 1)
|
|
314
|
+
return 'Tomorrow';
|
|
315
|
+
if (days === -1)
|
|
316
|
+
return 'Yesterday';
|
|
317
|
+
return d.toLocaleDateString(undefined, d.getFullYear() === now.getFullYear()
|
|
318
|
+
? { weekday: 'short', month: 'short', day: 'numeric' }
|
|
319
|
+
: { month: 'short', day: 'numeric', year: 'numeric' });
|
|
320
|
+
}
|
|
321
|
+
formatClock(d) {
|
|
322
|
+
return d.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });
|
|
323
|
+
}
|
|
324
|
+
formatDob(iso) {
|
|
325
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(iso.trim());
|
|
326
|
+
if (m)
|
|
327
|
+
return `${m[2]}-${m[3]}-${m[1]}`;
|
|
328
|
+
const d = new Date(iso);
|
|
329
|
+
if (Number.isNaN(d.getTime()))
|
|
330
|
+
return iso;
|
|
331
|
+
const mm = String(d.getMonth() + 1).padStart(2, '0');
|
|
332
|
+
const dd = String(d.getDate()).padStart(2, '0');
|
|
333
|
+
return `${mm}-${dd}-${d.getFullYear()}`;
|
|
334
|
+
}
|
|
335
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ActivitiesPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
336
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ActivitiesPageComponent, isStandalone: true, selector: "eds-activities-page", ngImport: i0, template: "<div class=\"eds-page activities-page\">\n <header class=\"mb-5\">\n <div>\n <h1 class=\"eds-h1\">Activities</h1>\n <p class=\"eds-body-sm\">Review all the activities done by the AI at one place</p>\n </div>\n </header>\n\n @if (callIdFilter(); as callId) {\n <div\n class=\"mb-4 flex flex-wrap items-center justify-between gap-3 rounded-lg bg-blue-50 px-4 py-3 text-sm font-normal leading-snug text-zinc-600\"\n role=\"status\"\n >\n <span>Showing activities for call <strong class=\"font-medium text-zinc-700\">{{ callId }}</strong></span>\n <button\n type=\"button\"\n class=\"cursor-pointer border-none bg-transparent px-0 py-1 text-sm font-medium text-blue-600 hover:underline\"\n (click)=\"clearCallFilter()\"\n >\n Clear filter\n </button>\n </div>\n }\n\n <nav class=\"mb-5 flex flex-wrap gap-2\" aria-label=\"Activity type\">\n @for (tab of tabs; track tab.id) {\n <button\n type=\"button\"\n [class]=\"\n activeTab() === tab.id\n ? 'cursor-pointer rounded-full border-none bg-blue-50 px-4 py-2 text-sm font-medium text-blue-600 transition-colors'\n : 'cursor-pointer rounded-full border-none bg-transparent px-4 py-2 text-sm font-medium text-zinc-500 transition-colors hover:bg-white hover:text-zinc-700'\n \"\n (click)=\"setTab(tab.id)\"\n >\n {{ tab.label }}\n </button>\n }\n </nav>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading activities\u2026</p>\n } @else if (loadError()) {\n <p class=\"text-sm text-red-700\" role=\"alert\">{{ loadError() }}</p>\n } @else {\n @if (activeTab() === 'task_created') {\n <div\n class=\"activities-page__col-head activities-page__col-head--tasks grid gap-x-7 gap-y-4 pb-2 text-sm font-semibold leading-tight text-zinc-600 max-lg:hidden\"\n aria-hidden=\"true\"\n >\n <span>Priority</span>\n <span>Task</span>\n <span>Patient / Caller</span>\n </div>\n } @else if (activeTab() === 'appointment_booked') {\n <div\n class=\"activities-page__col-head activities-page__col-head--appointments grid gap-x-7 gap-y-4 pb-2 text-sm font-semibold leading-tight text-zinc-600 max-lg:hidden\"\n aria-hidden=\"true\"\n >\n <span>When</span>\n <span>Patient</span>\n <span>Provider</span>\n <span class=\"justify-self-end text-right\">Insurance</span>\n </div>\n } @else if (activeTab() === 'patient_created') {\n <div\n class=\"activities-page__col-head activities-page__col-head--registration grid gap-x-7 gap-y-4 pb-2 text-sm font-semibold leading-tight text-zinc-600 max-lg:hidden\"\n aria-hidden=\"true\"\n >\n <span>When</span>\n <span>Patient</span>\n <span>MRN</span>\n <span class=\"justify-self-end text-right\">Insurance</span>\n </div>\n }\n\n <ul class=\"m-0 flex list-none flex-col gap-3 p-0\">\n @for (item of items(); track item.id; let i = $index) {\n @if (isTaskRow(item)) {\n <li\n class=\"activities-page__card activities-page__card--task grid items-center gap-x-7 gap-y-4 rounded-xl border border-zinc-200 bg-white px-4 py-4 max-lg:gap-x-4 max-lg:gap-y-4\"\n >\n <div class=\"inline-flex items-center gap-2 text-sm font-medium leading-snug text-zinc-700\" [attr.data-tone]=\"priorityTone(item)\">\n <span class=\"activities-page__priority-mark h-2.5 w-2.5 shrink-0 rotate-45 rounded-sm\" aria-hidden=\"true\"></span>\n <span class=\"capitalize\">{{ priorityLabel(item) }}</span>\n </div>\n\n <div class=\"text-sm font-medium leading-snug text-zinc-700 max-lg:col-span-full\">{{ taskTitle(item) }}</div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n <eds-avatar\n shape=\"box\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ meta }}</span>\n }\n </div>\n </div>\n </li>\n } @else if (isRegistrationTab()) {\n <li\n class=\"activities-page__card activities-page__card--registration grid items-center gap-x-7 gap-y-4 rounded-xl border border-zinc-200 bg-white px-4 py-4 max-lg:gap-x-4 max-lg:gap-y-4\"\n >\n <div class=\"min-w-0\">\n <div class=\"mb-1 flex flex-wrap items-center gap-2\">\n <span class=\"whitespace-nowrap text-base font-medium leading-snug text-zinc-700 max-md:whitespace-normal\">{{ timestampLabel(item) }}</span>\n </div>\n <p class=\"m-0 text-sm leading-snug text-zinc-500\">{{ categoryLabel(item) }}</p>\n </div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n <eds-avatar\n shape=\"box\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ meta }}</span>\n }\n </div>\n </div>\n\n <div class=\"text-sm font-normal leading-snug text-zinc-600\">{{ displayMrn(item) }}</div>\n\n <div class=\"flex items-center justify-end gap-2.5\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent max-md:px-1.5\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <eds-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </li>\n } @else {\n <li\n [class]=\"\n 'activities-page__card grid items-center gap-x-7 gap-y-4 rounded-xl border border-zinc-200 bg-white px-4 py-4 max-lg:gap-x-4 max-lg:gap-y-4' +\n (item.callId\n ? ' cursor-pointer hover:border-blue-200 hover:shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600'\n : '')\n \"\n [attr.role]=\"item.callId ? 'link' : null\"\n [attr.tabindex]=\"item.callId ? 0 : null\"\n (click)=\"openCallHistory(item.callId, $event)\"\n (keyup.enter)=\"openCallHistory(item.callId)\"\n >\n <div class=\"min-w-0\">\n <div class=\"mb-1 flex flex-wrap items-center gap-2\">\n <span class=\"whitespace-nowrap text-base font-medium leading-snug text-zinc-700 max-md:whitespace-normal\">{{ timestampLabel(item) }}</span>\n </div>\n <p class=\"m-0 text-sm leading-snug text-zinc-500\">{{ categoryLabel(item) }}</p>\n </div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n <eds-avatar\n shape=\"box\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ meta }}</span>\n }\n </div>\n </div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n @if (item.providerName) {\n <eds-avatar\n shape=\"circle\"\n [initials]=\"providerInitials(item)\"\n [tone]=\"avatarTone(item.providerId || item.providerName, i + 3)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.providerName }}</span>\n @if (providerSpecialtyLabel(item); as specialty) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ specialty }}</span>\n }\n </div>\n } @else {\n <div class=\"flex min-h-9 items-center\">\n <span class=\"truncate text-xs leading-snug text-zinc-500\">No provider assigned</span>\n </div>\n }\n </div>\n\n <div class=\"flex items-center justify-end gap-3\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent max-md:px-2\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <eds-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </li>\n }\n } @empty {\n <li class=\"rounded-xl border border-dashed border-zinc-200 bg-white px-4 py-10 text-center text-sm leading-snug text-zinc-500\">\n {{ emptyLabel() }}\n </li>\n }\n </ul>\n\n @if (total() > pageSize) {\n <footer class=\"mt-4 flex flex-wrap items-center justify-between gap-3\">\n <span class=\"eds-body-sm\">\n Page {{ page() }} of {{ totalPages() }} \u00B7 {{ total() }} total\n </span>\n <div class=\"flex gap-2\">\n <eds-button variant=\"secondary\" [disabled]=\"page() <= 1\" (click)=\"prevPage()\">Previous</eds-button>\n <eds-button variant=\"secondary\" [disabled]=\"page() >= totalPages()\" (click)=\"nextPage()\">Next</eds-button>\n </div>\n </footer>\n }\n }\n</div>\n", styles: [".activities-page__card{grid-template-columns:minmax(180px,1.1fr) minmax(200px,1.2fr) minmax(200px,1.2fr) auto}.activities-page__card--task{grid-template-columns:minmax(120px,.7fr) minmax(220px,1.4fr) minmax(240px,1.3fr)}.activities-page__card--registration{grid-template-columns:minmax(180px,1.1fr) minmax(240px,1.4fr) minmax(120px,.8fr) auto}.activities-page__col-head{box-sizing:border-box;border:1px solid transparent;padding-left:1rem;padding-right:1rem;padding-bottom:.5rem;column-gap:1.75rem}.activities-page__col-head--tasks{grid-template-columns:minmax(120px,.7fr) minmax(220px,1.4fr) minmax(240px,1.3fr)}.activities-page__col-head--appointments{grid-template-columns:minmax(180px,1.1fr) minmax(200px,1.2fr) minmax(200px,1.2fr) auto}.activities-page__col-head--registration{grid-template-columns:minmax(180px,1.1fr) minmax(240px,1.4fr) minmax(120px,.8fr) auto}.activities-page__priority-mark{background:#f59e0b}[data-tone=urgent] .activities-page__priority-mark{background:#dc2626}[data-tone=high] .activities-page__priority-mark{background:#ea580c}[data-tone=medium] .activities-page__priority-mark{background:#f59e0b}[data-tone=low] .activities-page__priority-mark{background:#94a3b8}.activities-page__insurance[data-state=covered]{background:#ecfdf5;border-color:#bbf7d0;color:#15803d}.activities-page__insurance[data-state=none]{background:#fef2f2;border-color:#fecaca;color:#b91c1c}.activities-page__insurance[data-state=unknown]{background:#f4f4f5;border-color:#e4e4e7;color:#71717a}@media(max-width:1023px){.activities-page__card,.activities-page__card--task{grid-template-columns:1fr auto}}\n"], dependencies: [{ kind: "component", type: EdsAvatarComponent, selector: "eds-avatar", inputs: ["initials", "tone", "shape", "gradient"] }, { kind: "component", type: EdsButtonComponent, selector: "eds-button", inputs: ["variant", "type", "disabled"] }, { kind: "component", type: EdsIconComponent, selector: "eds-icon", inputs: ["name", "size", "fill", "weight"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
337
|
+
}
|
|
338
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ActivitiesPageComponent, decorators: [{
|
|
339
|
+
type: Component,
|
|
340
|
+
args: [{ selector: 'eds-activities-page', imports: [EdsAvatarComponent, EdsButtonComponent, EdsIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"eds-page activities-page\">\n <header class=\"mb-5\">\n <div>\n <h1 class=\"eds-h1\">Activities</h1>\n <p class=\"eds-body-sm\">Review all the activities done by the AI at one place</p>\n </div>\n </header>\n\n @if (callIdFilter(); as callId) {\n <div\n class=\"mb-4 flex flex-wrap items-center justify-between gap-3 rounded-lg bg-blue-50 px-4 py-3 text-sm font-normal leading-snug text-zinc-600\"\n role=\"status\"\n >\n <span>Showing activities for call <strong class=\"font-medium text-zinc-700\">{{ callId }}</strong></span>\n <button\n type=\"button\"\n class=\"cursor-pointer border-none bg-transparent px-0 py-1 text-sm font-medium text-blue-600 hover:underline\"\n (click)=\"clearCallFilter()\"\n >\n Clear filter\n </button>\n </div>\n }\n\n <nav class=\"mb-5 flex flex-wrap gap-2\" aria-label=\"Activity type\">\n @for (tab of tabs; track tab.id) {\n <button\n type=\"button\"\n [class]=\"\n activeTab() === tab.id\n ? 'cursor-pointer rounded-full border-none bg-blue-50 px-4 py-2 text-sm font-medium text-blue-600 transition-colors'\n : 'cursor-pointer rounded-full border-none bg-transparent px-4 py-2 text-sm font-medium text-zinc-500 transition-colors hover:bg-white hover:text-zinc-700'\n \"\n (click)=\"setTab(tab.id)\"\n >\n {{ tab.label }}\n </button>\n }\n </nav>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading activities\u2026</p>\n } @else if (loadError()) {\n <p class=\"text-sm text-red-700\" role=\"alert\">{{ loadError() }}</p>\n } @else {\n @if (activeTab() === 'task_created') {\n <div\n class=\"activities-page__col-head activities-page__col-head--tasks grid gap-x-7 gap-y-4 pb-2 text-sm font-semibold leading-tight text-zinc-600 max-lg:hidden\"\n aria-hidden=\"true\"\n >\n <span>Priority</span>\n <span>Task</span>\n <span>Patient / Caller</span>\n </div>\n } @else if (activeTab() === 'appointment_booked') {\n <div\n class=\"activities-page__col-head activities-page__col-head--appointments grid gap-x-7 gap-y-4 pb-2 text-sm font-semibold leading-tight text-zinc-600 max-lg:hidden\"\n aria-hidden=\"true\"\n >\n <span>When</span>\n <span>Patient</span>\n <span>Provider</span>\n <span class=\"justify-self-end text-right\">Insurance</span>\n </div>\n } @else if (activeTab() === 'patient_created') {\n <div\n class=\"activities-page__col-head activities-page__col-head--registration grid gap-x-7 gap-y-4 pb-2 text-sm font-semibold leading-tight text-zinc-600 max-lg:hidden\"\n aria-hidden=\"true\"\n >\n <span>When</span>\n <span>Patient</span>\n <span>MRN</span>\n <span class=\"justify-self-end text-right\">Insurance</span>\n </div>\n }\n\n <ul class=\"m-0 flex list-none flex-col gap-3 p-0\">\n @for (item of items(); track item.id; let i = $index) {\n @if (isTaskRow(item)) {\n <li\n class=\"activities-page__card activities-page__card--task grid items-center gap-x-7 gap-y-4 rounded-xl border border-zinc-200 bg-white px-4 py-4 max-lg:gap-x-4 max-lg:gap-y-4\"\n >\n <div class=\"inline-flex items-center gap-2 text-sm font-medium leading-snug text-zinc-700\" [attr.data-tone]=\"priorityTone(item)\">\n <span class=\"activities-page__priority-mark h-2.5 w-2.5 shrink-0 rotate-45 rounded-sm\" aria-hidden=\"true\"></span>\n <span class=\"capitalize\">{{ priorityLabel(item) }}</span>\n </div>\n\n <div class=\"text-sm font-medium leading-snug text-zinc-700 max-lg:col-span-full\">{{ taskTitle(item) }}</div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n <eds-avatar\n shape=\"box\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ meta }}</span>\n }\n </div>\n </div>\n </li>\n } @else if (isRegistrationTab()) {\n <li\n class=\"activities-page__card activities-page__card--registration grid items-center gap-x-7 gap-y-4 rounded-xl border border-zinc-200 bg-white px-4 py-4 max-lg:gap-x-4 max-lg:gap-y-4\"\n >\n <div class=\"min-w-0\">\n <div class=\"mb-1 flex flex-wrap items-center gap-2\">\n <span class=\"whitespace-nowrap text-base font-medium leading-snug text-zinc-700 max-md:whitespace-normal\">{{ timestampLabel(item) }}</span>\n </div>\n <p class=\"m-0 text-sm leading-snug text-zinc-500\">{{ categoryLabel(item) }}</p>\n </div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n <eds-avatar\n shape=\"box\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ meta }}</span>\n }\n </div>\n </div>\n\n <div class=\"text-sm font-normal leading-snug text-zinc-600\">{{ displayMrn(item) }}</div>\n\n <div class=\"flex items-center justify-end gap-2.5\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent max-md:px-1.5\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <eds-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </li>\n } @else {\n <li\n [class]=\"\n 'activities-page__card grid items-center gap-x-7 gap-y-4 rounded-xl border border-zinc-200 bg-white px-4 py-4 max-lg:gap-x-4 max-lg:gap-y-4' +\n (item.callId\n ? ' cursor-pointer hover:border-blue-200 hover:shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600'\n : '')\n \"\n [attr.role]=\"item.callId ? 'link' : null\"\n [attr.tabindex]=\"item.callId ? 0 : null\"\n (click)=\"openCallHistory(item.callId, $event)\"\n (keyup.enter)=\"openCallHistory(item.callId)\"\n >\n <div class=\"min-w-0\">\n <div class=\"mb-1 flex flex-wrap items-center gap-2\">\n <span class=\"whitespace-nowrap text-base font-medium leading-snug text-zinc-700 max-md:whitespace-normal\">{{ timestampLabel(item) }}</span>\n </div>\n <p class=\"m-0 text-sm leading-snug text-zinc-500\">{{ categoryLabel(item) }}</p>\n </div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n <eds-avatar\n shape=\"box\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ meta }}</span>\n }\n </div>\n </div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n @if (item.providerName) {\n <eds-avatar\n shape=\"circle\"\n [initials]=\"providerInitials(item)\"\n [tone]=\"avatarTone(item.providerId || item.providerName, i + 3)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.providerName }}</span>\n @if (providerSpecialtyLabel(item); as specialty) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ specialty }}</span>\n }\n </div>\n } @else {\n <div class=\"flex min-h-9 items-center\">\n <span class=\"truncate text-xs leading-snug text-zinc-500\">No provider assigned</span>\n </div>\n }\n </div>\n\n <div class=\"flex items-center justify-end gap-3\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent max-md:px-2\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <eds-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </li>\n }\n } @empty {\n <li class=\"rounded-xl border border-dashed border-zinc-200 bg-white px-4 py-10 text-center text-sm leading-snug text-zinc-500\">\n {{ emptyLabel() }}\n </li>\n }\n </ul>\n\n @if (total() > pageSize) {\n <footer class=\"mt-4 flex flex-wrap items-center justify-between gap-3\">\n <span class=\"eds-body-sm\">\n Page {{ page() }} of {{ totalPages() }} \u00B7 {{ total() }} total\n </span>\n <div class=\"flex gap-2\">\n <eds-button variant=\"secondary\" [disabled]=\"page() <= 1\" (click)=\"prevPage()\">Previous</eds-button>\n <eds-button variant=\"secondary\" [disabled]=\"page() >= totalPages()\" (click)=\"nextPage()\">Next</eds-button>\n </div>\n </footer>\n }\n }\n</div>\n", styles: [".activities-page__card{grid-template-columns:minmax(180px,1.1fr) minmax(200px,1.2fr) minmax(200px,1.2fr) auto}.activities-page__card--task{grid-template-columns:minmax(120px,.7fr) minmax(220px,1.4fr) minmax(240px,1.3fr)}.activities-page__card--registration{grid-template-columns:minmax(180px,1.1fr) minmax(240px,1.4fr) minmax(120px,.8fr) auto}.activities-page__col-head{box-sizing:border-box;border:1px solid transparent;padding-left:1rem;padding-right:1rem;padding-bottom:.5rem;column-gap:1.75rem}.activities-page__col-head--tasks{grid-template-columns:minmax(120px,.7fr) minmax(220px,1.4fr) minmax(240px,1.3fr)}.activities-page__col-head--appointments{grid-template-columns:minmax(180px,1.1fr) minmax(200px,1.2fr) minmax(200px,1.2fr) auto}.activities-page__col-head--registration{grid-template-columns:minmax(180px,1.1fr) minmax(240px,1.4fr) minmax(120px,.8fr) auto}.activities-page__priority-mark{background:#f59e0b}[data-tone=urgent] .activities-page__priority-mark{background:#dc2626}[data-tone=high] .activities-page__priority-mark{background:#ea580c}[data-tone=medium] .activities-page__priority-mark{background:#f59e0b}[data-tone=low] .activities-page__priority-mark{background:#94a3b8}.activities-page__insurance[data-state=covered]{background:#ecfdf5;border-color:#bbf7d0;color:#15803d}.activities-page__insurance[data-state=none]{background:#fef2f2;border-color:#fecaca;color:#b91c1c}.activities-page__insurance[data-state=unknown]{background:#f4f4f5;border-color:#e4e4e7;color:#71717a}@media(max-width:1023px){.activities-page__card,.activities-page__card--task{grid-template-columns:1fr auto}}\n"] }]
|
|
341
|
+
}] });
|
|
342
|
+
|
|
343
|
+
export { ActivitiesPageComponent };
|
|
344
|
+
//# sourceMappingURL=edvak99-voice-receptionist-widget-activities-page.component-CtaPoY1k.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edvak99-voice-receptionist-widget-activities-page.component-CtaPoY1k.mjs","sources":["../../../projects/voice-receptionist-widget/src/lib/pages/activities-page/activities-page.component.ts","../../../projects/voice-receptionist-widget/src/lib/pages/activities-page/activities-page.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, OnInit, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport {\n ActivitiesTab,\n AgentActivity,\n initialsFromName,\n} from '../../models/agent-activity.types';\nimport { DEFAULT_PAGE_SIZE, totalPages as calcTotalPages } from '../../models/pagination';\nimport { AiReceptionistApiService } from '../../services/ai-receptionist-api.service';\nimport { ageFromDob } from '../../utils/call-history-display.util';\nimport { EdsAvatarComponent } from '../../ui/eds-avatar.component';\nimport { EdsButtonComponent } from '../../ui/eds-button.component';\nimport { EdsIconComponent } from '../../ui/eds-icon.component';\n\ntype TabId = ActivitiesTab;\n\nconst TABS: { id: TabId; label: string }[] = [\n { id: 'task_created', label: 'Tasks' },\n { id: 'appointment_booked', label: 'Appointments' },\n { id: 'patient_created', label: 'Registrations' },\n];\n\nconst AVATAR_TONES = ['green', 'amber', 'brand', 'violet', 'rose'] as const;\n\n@Component({\n selector: 'eds-activities-page',\n imports: [EdsAvatarComponent, EdsButtonComponent, EdsIconComponent],\n templateUrl: './activities-page.component.html',\n styleUrl: './activities-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ActivitiesPageComponent implements OnInit {\n private readonly api = inject(AiReceptionistApiService);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n protected readonly tabs = TABS;\n protected readonly pageSize = DEFAULT_PAGE_SIZE;\n protected readonly items = signal<AgentActivity[]>([]);\n protected readonly total = signal(0);\n protected readonly page = signal(1);\n protected readonly activeTab = signal<TabId>('appointment_booked');\n protected readonly callIdFilter = signal<string | null>(null);\n protected readonly loading = signal(true);\n protected readonly loadError = signal<string | null>(null);\n\n ngOnInit(): void {\n const callId = this.route.snapshot.queryParamMap.get('callId')?.trim() || null;\n if (callId) this.callIdFilter.set(callId);\n\n const tabParam = (this.route.snapshot.queryParamMap.get('tab') || '').trim().toLowerCase();\n const tabFromQuery = this.tabFromQuery(tabParam);\n if (tabFromQuery) this.activeTab.set(tabFromQuery);\n\n this.load();\n }\n\n protected setTab(tab: TabId): void {\n if (this.activeTab() === tab) return;\n this.activeTab.set(tab);\n this.page.set(1);\n void this.router.navigate([], {\n relativeTo: this.route,\n queryParams: { tab: this.tabQueryValue(tab) },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n this.load();\n }\n\n private tabFromQuery(raw: string): TabId | null {\n switch (raw) {\n case 'tasks':\n case 'task':\n case 'task_created':\n return 'task_created';\n case 'appointments':\n case 'appointment':\n case 'appointment_booked':\n return 'appointment_booked';\n case 'registrations':\n case 'registration':\n case 'patient_created':\n return 'patient_created';\n default:\n return null;\n }\n }\n\n private tabQueryValue(tab: TabId): string {\n switch (tab) {\n case 'task_created':\n return 'tasks';\n case 'patient_created':\n return 'registrations';\n default:\n return 'appointments';\n }\n }\n\n protected clearCallFilter(): void {\n this.callIdFilter.set(null);\n this.page.set(1);\n this.load();\n }\n\n protected load(): void {\n this.loading.set(true);\n this.loadError.set(null);\n const tab = this.activeTab();\n this.api\n .getActivities({\n page: this.page(),\n limit: DEFAULT_PAGE_SIZE,\n types: tab,\n callId: this.callIdFilter() || undefined,\n })\n .subscribe({\n next: ({ items, total, page }) => {\n this.items.set(items);\n this.total.set(total);\n this.page.set(page);\n this.loading.set(false);\n },\n error: () => {\n this.loading.set(false);\n this.items.set([]);\n this.total.set(0);\n this.loadError.set(\n 'Activities feed is unavailable. Confirm GET /api/ai-receptionist/activities is deployed.',\n );\n },\n });\n }\n\n protected totalPages(): number {\n return calcTotalPages(this.total(), DEFAULT_PAGE_SIZE);\n }\n\n protected prevPage(): void {\n if (this.page() <= 1) return;\n this.page.update((p) => p - 1);\n this.load();\n }\n\n protected nextPage(): void {\n if (this.page() >= this.totalPages()) return;\n this.page.update((p) => p + 1);\n this.load();\n }\n\n protected historyLink(callId: string | null | undefined): string[] | null {\n return callId ? ['../history', callId] : null;\n }\n\n protected openCallHistory(callId: string | null | undefined, ev?: Event): void {\n if (!callId) return;\n if (ev && (ev.target as HTMLElement).closest('a,button')) return;\n void this.router.navigate(['../history', callId], { relativeTo: this.route });\n }\n\n protected displayMrn(item: AgentActivity): string {\n return item.patientMrn?.trim() || '—';\n }\n\n protected providerSpecialtyLabel(item: AgentActivity): string | null {\n const s = item.providerSpecialty?.trim();\n if (!s) return null;\n // Hide stray numeric IDs that sometimes land in specialty.\n if (/^\\d+(\\.\\d+)?$/.test(s)) return null;\n return s;\n }\n\n /** Day-anchored stamp — a bare clock time gave no idea which day a row belonged to. */\n protected timestampLabel(item: AgentActivity): string {\n const start = this.parseDate(item.startAt || item.occurredAt);\n if (!start) return '—';\n const stamp = `${this.formatDay(start)}, ${this.formatClock(start)}`;\n const end = this.parseDate(item.endAt);\n if (end && end.getTime() > start.getTime()) {\n return `${stamp} – ${this.formatClock(end)}`;\n }\n return stamp;\n }\n\n protected durationLabel(item: AgentActivity): string | null {\n const mins = item.durationMinutes;\n if (mins == null || mins <= 0) {\n if (item.startAt && item.endAt) {\n const ms = Date.parse(item.endAt) - Date.parse(item.startAt);\n if (Number.isFinite(ms) && ms > 0) {\n return `${Math.round(ms / 60000)} MIN`;\n }\n }\n return null;\n }\n return `${mins} MIN`;\n }\n\n protected categoryLabel(item: AgentActivity): string {\n if (item.visitType) return item.visitType;\n switch (item.type) {\n case 'appointment_booked':\n return 'Appointment';\n case 'patient_created':\n return 'Registration';\n case 'task_created':\n return item.title && !/^task created$/i.test(item.title) ? item.title : 'Task';\n default:\n return item.title || 'Activity';\n }\n }\n\n protected patientMeta(item: AgentActivity): string | null {\n const parts: string[] = [];\n const dob = item.patientDob;\n const age = item.patientAge ?? (dob ? ageFromDob(dob) : null);\n if (dob && age != null) parts.push(`DOB: ${this.formatDob(dob)} · ${age}Y`);\n else if (dob) parts.push(`DOB: ${this.formatDob(dob)}`);\n else if (age != null) parts.push(`${age}Y`);\n if (item.patientGender) parts.push(item.patientGender);\n return parts.length ? parts.join(' | ') : null;\n }\n\n protected patientInitials(item: AgentActivity): string {\n return item.patientInitials || initialsFromName(item.patientName) || '?';\n }\n\n protected providerInitials(item: AgentActivity): string {\n return item.providerInitials || initialsFromName(item.providerName) || '?';\n }\n\n protected avatarTone(key: string | null | undefined, salt: number): string {\n const raw = `${key || 'x'}:${salt}`;\n let hash = 0;\n for (let i = 0; i < raw.length; i++) hash = (hash + raw.charCodeAt(i) * (i + 1)) % 997;\n return AVATAR_TONES[hash % AVATAR_TONES.length];\n }\n\n protected insuranceState(item: AgentActivity): 'covered' | 'none' | 'unknown' {\n if (item.hasInsurance === true) return 'covered';\n if (item.hasInsurance === false) return 'none';\n return 'unknown';\n }\n\n protected insuranceIcon(item: AgentActivity): string {\n switch (this.insuranceState(item)) {\n case 'covered':\n return 'verified_user';\n case 'none':\n return 'gpp_bad';\n default:\n return 'gpp_maybe';\n }\n }\n\n protected insuranceLabel(item: AgentActivity): string {\n switch (this.insuranceState(item)) {\n case 'covered':\n return 'Insured';\n case 'none':\n return 'No insurance';\n default:\n return 'Unverified';\n }\n }\n\n protected insuranceTitle(item: AgentActivity): string {\n switch (this.insuranceState(item)) {\n case 'covered':\n return item.insuranceName ? `Insured — ${item.insuranceName}` : 'Insured';\n case 'none':\n return 'No insurance on file';\n default:\n return 'Insurance not verified';\n }\n }\n\n protected isTaskRow(item: AgentActivity): boolean {\n return item.type === 'task_created';\n }\n\n protected taskTitle(item: AgentActivity): string {\n const title = (item.title || '').trim();\n if (title && !/^task created$/i.test(title)) return title;\n return item.visitType || 'Task';\n }\n\n protected priorityLabel(item: AgentActivity): string {\n switch (item.priority) {\n case 'urgent':\n return 'Urgent';\n case 'high':\n return 'High';\n case 'low':\n return 'Low';\n case 'medium':\n case 'normal':\n default:\n return 'Medium';\n }\n }\n\n protected priorityTone(item: AgentActivity): string {\n switch (item.priority) {\n case 'urgent':\n return 'urgent';\n case 'high':\n return 'high';\n case 'low':\n return 'low';\n default:\n return 'medium';\n }\n }\n\n protected isRegistrationTab(): boolean {\n return this.activeTab() === 'patient_created';\n }\n\n protected emptyLabel(): string {\n if (this.callIdFilter()) return 'No activities found for this call.';\n switch (this.activeTab()) {\n case 'task_created':\n return 'No tasks created by the AI yet.';\n case 'patient_created':\n return 'No patient registrations yet.';\n default:\n return 'No appointments booked by the AI yet.';\n }\n }\n\n private parseDate(iso: string | null | undefined): Date | null {\n if (!iso) return null;\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n\n private formatDay(d: Date): string {\n const midnight = (x: Date) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();\n const now = new Date();\n const days = Math.round((midnight(d) - midnight(now)) / 86_400_000);\n if (days === 0) return 'Today';\n if (days === 1) return 'Tomorrow';\n if (days === -1) return 'Yesterday';\n return d.toLocaleDateString(\n undefined,\n d.getFullYear() === now.getFullYear()\n ? { weekday: 'short', month: 'short', day: 'numeric' }\n : { month: 'short', day: 'numeric', year: 'numeric' },\n );\n }\n\n private formatClock(d: Date): string {\n return d.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n }\n\n private formatDob(iso: string): string {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(iso.trim());\n if (m) return `${m[2]}-${m[3]}-${m[1]}`;\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n return `${mm}-${dd}-${d.getFullYear()}`;\n }\n}\n","<div class=\"eds-page activities-page\">\n <header class=\"mb-5\">\n <div>\n <h1 class=\"eds-h1\">Activities</h1>\n <p class=\"eds-body-sm\">Review all the activities done by the AI at one place</p>\n </div>\n </header>\n\n @if (callIdFilter(); as callId) {\n <div\n class=\"mb-4 flex flex-wrap items-center justify-between gap-3 rounded-lg bg-blue-50 px-4 py-3 text-sm font-normal leading-snug text-zinc-600\"\n role=\"status\"\n >\n <span>Showing activities for call <strong class=\"font-medium text-zinc-700\">{{ callId }}</strong></span>\n <button\n type=\"button\"\n class=\"cursor-pointer border-none bg-transparent px-0 py-1 text-sm font-medium text-blue-600 hover:underline\"\n (click)=\"clearCallFilter()\"\n >\n Clear filter\n </button>\n </div>\n }\n\n <nav class=\"mb-5 flex flex-wrap gap-2\" aria-label=\"Activity type\">\n @for (tab of tabs; track tab.id) {\n <button\n type=\"button\"\n [class]=\"\n activeTab() === tab.id\n ? 'cursor-pointer rounded-full border-none bg-blue-50 px-4 py-2 text-sm font-medium text-blue-600 transition-colors'\n : 'cursor-pointer rounded-full border-none bg-transparent px-4 py-2 text-sm font-medium text-zinc-500 transition-colors hover:bg-white hover:text-zinc-700'\n \"\n (click)=\"setTab(tab.id)\"\n >\n {{ tab.label }}\n </button>\n }\n </nav>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading activities…</p>\n } @else if (loadError()) {\n <p class=\"text-sm text-red-700\" role=\"alert\">{{ loadError() }}</p>\n } @else {\n @if (activeTab() === 'task_created') {\n <div\n class=\"activities-page__col-head activities-page__col-head--tasks grid gap-x-7 gap-y-4 pb-2 text-sm font-semibold leading-tight text-zinc-600 max-lg:hidden\"\n aria-hidden=\"true\"\n >\n <span>Priority</span>\n <span>Task</span>\n <span>Patient / Caller</span>\n </div>\n } @else if (activeTab() === 'appointment_booked') {\n <div\n class=\"activities-page__col-head activities-page__col-head--appointments grid gap-x-7 gap-y-4 pb-2 text-sm font-semibold leading-tight text-zinc-600 max-lg:hidden\"\n aria-hidden=\"true\"\n >\n <span>When</span>\n <span>Patient</span>\n <span>Provider</span>\n <span class=\"justify-self-end text-right\">Insurance</span>\n </div>\n } @else if (activeTab() === 'patient_created') {\n <div\n class=\"activities-page__col-head activities-page__col-head--registration grid gap-x-7 gap-y-4 pb-2 text-sm font-semibold leading-tight text-zinc-600 max-lg:hidden\"\n aria-hidden=\"true\"\n >\n <span>When</span>\n <span>Patient</span>\n <span>MRN</span>\n <span class=\"justify-self-end text-right\">Insurance</span>\n </div>\n }\n\n <ul class=\"m-0 flex list-none flex-col gap-3 p-0\">\n @for (item of items(); track item.id; let i = $index) {\n @if (isTaskRow(item)) {\n <li\n class=\"activities-page__card activities-page__card--task grid items-center gap-x-7 gap-y-4 rounded-xl border border-zinc-200 bg-white px-4 py-4 max-lg:gap-x-4 max-lg:gap-y-4\"\n >\n <div class=\"inline-flex items-center gap-2 text-sm font-medium leading-snug text-zinc-700\" [attr.data-tone]=\"priorityTone(item)\">\n <span class=\"activities-page__priority-mark h-2.5 w-2.5 shrink-0 rotate-45 rounded-sm\" aria-hidden=\"true\"></span>\n <span class=\"capitalize\">{{ priorityLabel(item) }}</span>\n </div>\n\n <div class=\"text-sm font-medium leading-snug text-zinc-700 max-lg:col-span-full\">{{ taskTitle(item) }}</div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n <eds-avatar\n shape=\"box\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ meta }}</span>\n }\n </div>\n </div>\n </li>\n } @else if (isRegistrationTab()) {\n <li\n class=\"activities-page__card activities-page__card--registration grid items-center gap-x-7 gap-y-4 rounded-xl border border-zinc-200 bg-white px-4 py-4 max-lg:gap-x-4 max-lg:gap-y-4\"\n >\n <div class=\"min-w-0\">\n <div class=\"mb-1 flex flex-wrap items-center gap-2\">\n <span class=\"whitespace-nowrap text-base font-medium leading-snug text-zinc-700 max-md:whitespace-normal\">{{ timestampLabel(item) }}</span>\n </div>\n <p class=\"m-0 text-sm leading-snug text-zinc-500\">{{ categoryLabel(item) }}</p>\n </div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n <eds-avatar\n shape=\"box\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ meta }}</span>\n }\n </div>\n </div>\n\n <div class=\"text-sm font-normal leading-snug text-zinc-600\">{{ displayMrn(item) }}</div>\n\n <div class=\"flex items-center justify-end gap-2.5\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent max-md:px-1.5\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <eds-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </li>\n } @else {\n <li\n [class]=\"\n 'activities-page__card grid items-center gap-x-7 gap-y-4 rounded-xl border border-zinc-200 bg-white px-4 py-4 max-lg:gap-x-4 max-lg:gap-y-4' +\n (item.callId\n ? ' cursor-pointer hover:border-blue-200 hover:shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600'\n : '')\n \"\n [attr.role]=\"item.callId ? 'link' : null\"\n [attr.tabindex]=\"item.callId ? 0 : null\"\n (click)=\"openCallHistory(item.callId, $event)\"\n (keyup.enter)=\"openCallHistory(item.callId)\"\n >\n <div class=\"min-w-0\">\n <div class=\"mb-1 flex flex-wrap items-center gap-2\">\n <span class=\"whitespace-nowrap text-base font-medium leading-snug text-zinc-700 max-md:whitespace-normal\">{{ timestampLabel(item) }}</span>\n </div>\n <p class=\"m-0 text-sm leading-snug text-zinc-500\">{{ categoryLabel(item) }}</p>\n </div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n <eds-avatar\n shape=\"box\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ meta }}</span>\n }\n </div>\n </div>\n\n <div class=\"flex min-w-0 items-center gap-3 max-lg:col-span-full\">\n @if (item.providerName) {\n <eds-avatar\n shape=\"circle\"\n [initials]=\"providerInitials(item)\"\n [tone]=\"avatarTone(item.providerId || item.providerName, i + 3)\"\n />\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"truncate text-sm font-medium leading-snug text-zinc-700\">{{ item.providerName }}</span>\n @if (providerSpecialtyLabel(item); as specialty) {\n <span class=\"truncate text-xs leading-snug text-zinc-500\">{{ specialty }}</span>\n }\n </div>\n } @else {\n <div class=\"flex min-h-9 items-center\">\n <span class=\"truncate text-xs leading-snug text-zinc-500\">No provider assigned</span>\n </div>\n }\n </div>\n\n <div class=\"flex items-center justify-end gap-3\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent max-md:px-2\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <eds-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </li>\n }\n } @empty {\n <li class=\"rounded-xl border border-dashed border-zinc-200 bg-white px-4 py-10 text-center text-sm leading-snug text-zinc-500\">\n {{ emptyLabel() }}\n </li>\n }\n </ul>\n\n @if (total() > pageSize) {\n <footer class=\"mt-4 flex flex-wrap items-center justify-between gap-3\">\n <span class=\"eds-body-sm\">\n Page {{ page() }} of {{ totalPages() }} · {{ total() }} total\n </span>\n <div class=\"flex gap-2\">\n <eds-button variant=\"secondary\" [disabled]=\"page() <= 1\" (click)=\"prevPage()\">Previous</eds-button>\n <eds-button variant=\"secondary\" [disabled]=\"page() >= totalPages()\" (click)=\"nextPage()\">Next</eds-button>\n </div>\n </footer>\n }\n }\n</div>\n"],"names":["calcTotalPages"],"mappings":";;;;;;;AAiBA,MAAM,IAAI,GAAmC;AAC3C,IAAA,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE;AACtC,IAAA,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,cAAc,EAAE;AACnD,IAAA,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,eAAe,EAAE;CAClD;AAED,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAU;MAS9D,uBAAuB,CAAA;AAPpC,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,wBAAwB,CAAC;AACtC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAErB,IAAA,CAAA,IAAI,GAAG,IAAI;QACX,IAAA,CAAA,QAAQ,GAAG,iBAAiB;AAC5B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAkB,EAAE,CAAC;AACnC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;AACjB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;AAChB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAQ,oBAAoB,CAAC;AAC/C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,CAAC;AAC1C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;AACtB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,CAAC;AAkU3D,IAAA;IAhUC,QAAQ,GAAA;AACN,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI;AAC9E,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;QAEzC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;QAC1F,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AAChD,QAAA,IAAI,YAAY;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;QAElD,IAAI,CAAC,IAAI,EAAE;IACb;AAEU,IAAA,MAAM,CAAC,GAAU,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG;YAAE;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChB,QAAA,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;YAC5B,UAAU,EAAE,IAAI,CAAC,KAAK;YACtB,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;AAC7C,YAAA,mBAAmB,EAAE,OAAO;AAC5B,YAAA,UAAU,EAAE,IAAI;AACjB,SAAA,CAAC;QACF,IAAI,CAAC,IAAI,EAAE;IACb;AAEQ,IAAA,YAAY,CAAC,GAAW,EAAA;QAC9B,QAAQ,GAAG;AACT,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,cAAc;AACvB,YAAA,KAAK,cAAc;AACnB,YAAA,KAAK,aAAa;AAClB,YAAA,KAAK,oBAAoB;AACvB,gBAAA,OAAO,oBAAoB;AAC7B,YAAA,KAAK,eAAe;AACpB,YAAA,KAAK,cAAc;AACnB,YAAA,KAAK,iBAAiB;AACpB,gBAAA,OAAO,iBAAiB;AAC1B,YAAA;AACE,gBAAA,OAAO,IAAI;;IAEjB;AAEQ,IAAA,aAAa,CAAC,GAAU,EAAA;QAC9B,QAAQ,GAAG;AACT,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,iBAAiB;AACpB,gBAAA,OAAO,eAAe;AACxB,YAAA;AACE,gBAAA,OAAO,cAAc;;IAE3B;IAEU,eAAe,GAAA;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;AAC5B,QAAA,IAAI,CAAC;AACF,aAAA,aAAa,CAAC;AACb,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,KAAK,EAAE,iBAAiB;AACxB,YAAA,KAAK,EAAE,GAAG;AACV,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,SAAS;SACzC;AACA,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAI;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACjB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAChB,0FAA0F,CAC3F;YACH,CAAC;AACF,SAAA,CAAC;IACN;IAEU,UAAU,GAAA;QAClB,OAAOA,UAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,iBAAiB,CAAC;IACxD;IAEU,QAAQ,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,QAAQ,GAAA;QAChB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE;IACb;AAEU,IAAA,WAAW,CAAC,MAAiC,EAAA;AACrD,QAAA,OAAO,MAAM,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,IAAI;IAC/C;IAEU,eAAe,CAAC,MAAiC,EAAE,EAAU,EAAA;AACrE,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,IAAI,EAAE,IAAK,EAAE,CAAC,MAAsB,CAAC,OAAO,CAAC,UAAU,CAAC;YAAE;QAC1D,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/E;AAEU,IAAA,UAAU,CAAC,IAAmB,EAAA;QACtC,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG;IACvC;AAEU,IAAA,sBAAsB,CAAC,IAAmB,EAAA;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE;AACxC,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;;AAEnB,QAAA,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;AACxC,QAAA,OAAO,CAAC;IACV;;AAGU,IAAA,cAAc,CAAC,IAAmB,EAAA;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC;AAC7D,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,GAAG;AACtB,QAAA,MAAM,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE;YAC1C,OAAO,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA,CAAE;QAC9C;AACA,QAAA,OAAO,KAAK;IACd;AAEU,IAAA,aAAa,CAAC,IAAmB,EAAA;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe;QACjC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE;YAC7B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE;AAC9B,gBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC5D,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;oBACjC,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA,IAAA,CAAM;gBACxC;YACF;AACA,YAAA,OAAO,IAAI;QACb;QACA,OAAO,CAAA,EAAG,IAAI,CAAA,IAAA,CAAM;IACtB;AAEU,IAAA,aAAa,CAAC,IAAmB,EAAA;QACzC,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS;AACzC,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,oBAAoB;AACvB,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,iBAAiB;AACpB,gBAAA,OAAO,cAAc;AACvB,YAAA,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,MAAM;AAChF,YAAA;AACE,gBAAA,OAAO,IAAI,CAAC,KAAK,IAAI,UAAU;;IAErC;AAEU,IAAA,WAAW,CAAC,IAAmB,EAAA;QACvC,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,KAAK,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AAC7D,QAAA,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,CAAG,CAAC;AACtE,aAAA,IAAI,GAAG;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;aAClD,IAAI,GAAG,IAAI,IAAI;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAA,CAAA,CAAG,CAAC;QAC3C,IAAI,IAAI,CAAC,aAAa;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AACtD,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;IAChD;AAEU,IAAA,eAAe,CAAC,IAAmB,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,eAAe,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG;IAC1E;AAEU,IAAA,gBAAgB,CAAC,IAAmB,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG;IAC5E;IAEU,UAAU,CAAC,GAA8B,EAAE,IAAY,EAAA;QAC/D,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;QACnC,IAAI,IAAI,GAAG,CAAC;AACZ,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,YAAA,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG;QACtF,OAAO,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;IACjD;AAEU,IAAA,cAAc,CAAC,IAAmB,EAAA;AAC1C,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;AAAE,YAAA,OAAO,SAAS;AAChD,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK;AAAE,YAAA,OAAO,MAAM;AAC9C,QAAA,OAAO,SAAS;IAClB;AAEU,IAAA,aAAa,CAAC,IAAmB,EAAA;AACzC,QAAA,QAAQ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAC/B,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,SAAS;AAClB,YAAA;AACE,gBAAA,OAAO,WAAW;;IAExB;AAEU,IAAA,cAAc,CAAC,IAAmB,EAAA;AAC1C,QAAA,QAAQ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAC/B,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,SAAS;AAClB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,cAAc;AACvB,YAAA;AACE,gBAAA,OAAO,YAAY;;IAEzB;AAEU,IAAA,cAAc,CAAC,IAAmB,EAAA;AAC1C,QAAA,QAAQ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AAC/B,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,IAAI,CAAC,aAAa,GAAG,CAAA,UAAA,EAAa,IAAI,CAAC,aAAa,CAAA,CAAE,GAAG,SAAS;AAC3E,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,sBAAsB;AAC/B,YAAA;AACE,gBAAA,OAAO,wBAAwB;;IAErC;AAEU,IAAA,SAAS,CAAC,IAAmB,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,cAAc;IACrC;AAEU,IAAA,SAAS,CAAC,IAAmB,EAAA;AACrC,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE;QACvC,IAAI,KAAK,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AACzD,QAAA,OAAO,IAAI,CAAC,SAAS,IAAI,MAAM;IACjC;AAEU,IAAA,aAAa,CAAC,IAAmB,EAAA;AACzC,QAAA,QAAQ,IAAI,CAAC,QAAQ;AACnB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,KAAK;AACd,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,QAAQ;AACb,YAAA;AACE,gBAAA,OAAO,QAAQ;;IAErB;AAEU,IAAA,YAAY,CAAC,IAAmB,EAAA;AACxC,QAAA,QAAQ,IAAI,CAAC,QAAQ;AACnB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,KAAK;AACd,YAAA;AACE,gBAAA,OAAO,QAAQ;;IAErB;IAEU,iBAAiB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,iBAAiB;IAC/C;IAEU,UAAU,GAAA;QAClB,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,oCAAoC;AACpE,QAAA,QAAQ,IAAI,CAAC,SAAS,EAAE;AACtB,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,iCAAiC;AAC1C,YAAA,KAAK,iBAAiB;AACpB,gBAAA,OAAO,+BAA+B;AACxC,YAAA;AACE,gBAAA,OAAO,uCAAuC;;IAEpD;AAEQ,IAAA,SAAS,CAAC,GAA8B,EAAA;AAC9C,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;AACvB,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC;IAC7C;AAEQ,IAAA,SAAS,CAAC,CAAO,EAAA;AACvB,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;AAC5F,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC;QACnE,IAAI,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,OAAO;QAC9B,IAAI,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,UAAU;QACjC,IAAI,IAAI,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,WAAW;AACnC,QAAA,OAAO,CAAC,CAAC,kBAAkB,CACzB,SAAS,EACT,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW;AACjC,cAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS;AACpD,cAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CACxD;IACH;AAEQ,IAAA,WAAW,CAAC,CAAO,EAAA;AACzB,QAAA,OAAO,CAAC,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAChF;AAEQ,IAAA,SAAS,CAAC,GAAW,EAAA;QAC3B,MAAM,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC;AAAE,YAAA,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;AACvC,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACvB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAAE,YAAA,OAAO,GAAG;AACzC,QAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACpD,QAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC/C,OAAO,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,CAAC,CAAC,WAAW,EAAE,CAAA,CAAE;IACzC;+GA9UW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,+EChCpC,klVAmOA,EAAA,MAAA,EAAA,CAAA,0kDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxMY,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,gGAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKvD,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;+BACE,qBAAqB,EAAA,OAAA,EACtB,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAGlD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,klVAAA,EAAA,MAAA,EAAA,CAAA,0kDAAA,CAAA,EAAA;;;;;"}
|
|
@@ -3425,5 +3425,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
|
|
|
3425
3425
|
args: [{ providedIn: 'root' }]
|
|
3426
3426
|
}] });
|
|
3427
3427
|
|
|
3428
|
-
export { AiReceptionistApiService as A, DEFAULT_PAGE_SIZE as D, WELCOME_MESSAGE_MAX as W, historyResolutionLabel as a, historyResolution as b, callerMetaLine as c, ageFromDob as d, resolveToolKey as e, resolveToolDisplayName as f,
|
|
3429
|
-
//# sourceMappingURL=edvak99-voice-receptionist-widget-ai-receptionist-api.service-
|
|
3428
|
+
export { AiReceptionistApiService as A, DEFAULT_PAGE_SIZE as D, WELCOME_MESSAGE_MAX as W, historyResolutionLabel as a, historyResolution as b, callerMetaLine as c, ageFromDob as d, resolveToolKey as e, resolveToolDisplayName as f, createVoiceReceptionistPaths as g, historyResultChips as h, isUnknownCaller as i, totalPages as j, activityTypeLabel as k, initialsFromName as l, buildAutoWelcomeTemplate as m, resolveWelcomePreview as n, DEFAULT_PLACEHOLDERS as o, resultChipIcon as r, toolEventTrackKey as t };
|
|
3429
|
+
//# sourceMappingURL=edvak99-voice-receptionist-widget-ai-receptionist-api.service-CK6tM862.mjs.map
|