@edvak99/voice-receptionist-widget 1.1.22 → 1.1.23
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-dcDXT2KG.mjs → edvak99-voice-receptionist-widget-activities-page.component-D16UQWsH.mjs} +11 -5
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-D16UQWsH.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-analytics-page.component-B25yZJZz.mjs → edvak99-voice-receptionist-widget-analytics-page.component-DEXdD1mB.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-analytics-page.component-B25yZJZz.mjs.map → edvak99-voice-receptionist-widget-analytics-page.component-DEXdD1mB.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-D-uAGYwd.mjs +89 -0
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-D-uAGYwd.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-history-detail-page.component-BJGzgVxG.mjs → edvak99-voice-receptionist-widget-call-history-detail-page.component-D3GAw7pk.mjs} +30 -11
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-D3GAw7pk.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-history-page.component-CcwwO5SO.mjs → edvak99-voice-receptionist-widget-call-history-page.component-krL6GnMf.mjs} +5 -5
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-krL6GnMf.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-BepxNLNQ.mjs → edvak99-voice-receptionist-widget-call-recording-player.component-C-iLpJhH.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-BepxNLNQ.mjs.map → edvak99-voice-receptionist-widget-call-recording-player.component-C-iLpJhH.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-nFqc30t3.mjs → edvak99-voice-receptionist-widget-call-review.service-DmvSPr-I.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-nFqc30t3.mjs.map → edvak99-voice-receptionist-widget-call-review.service-DmvSPr-I.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-CcphzJ4N.mjs +311 -0
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-CcphzJ4N.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CJ1L6QeE.mjs → edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CGbyYMbi.mjs} +14 -14
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CGbyYMbi.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-MnBMu8iA.mjs → edvak99-voice-receptionist-widget-live-calls-page.component-gTy7IynR.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-MnBMu8iA.mjs.map → edvak99-voice-receptionist-widget-live-calls-page.component-gTy7IynR.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-BzvMkbC4.mjs → edvak99-voice-receptionist-widget-live-monitor-page.component-C-sDCE3S.mjs} +3 -3
- package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-BzvMkbC4.mjs.map → edvak99-voice-receptionist-widget-live-monitor-page.component-C-sDCE3S.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-outbound-purposes-page.component-Aws6TaaE.mjs → edvak99-voice-receptionist-widget-outbound-purposes-page.component-87FxvbsK.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-outbound-purposes-page.component-Aws6TaaE.mjs.map → edvak99-voice-receptionist-widget-outbound-purposes-page.component-87FxvbsK.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-task-detail-drawer.component-DVWdArqj.mjs → edvak99-voice-receptionist-widget-task-detail-drawer.component-BNbjcoA2.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-task-detail-drawer.component-DVWdArqj.mjs.map → edvak99-voice-receptionist-widget-task-detail-drawer.component-BNbjcoA2.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-tasks-page.component-CBDmGLol.mjs → edvak99-voice-receptionist-widget-tasks-page.component-OP77Shm4.mjs} +3 -3
- package/fesm2022/{edvak99-voice-receptionist-widget-tasks-page.component-CBDmGLol.mjs.map → edvak99-voice-receptionist-widget-tasks-page.component-OP77Shm4.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-C-hdBQIV.mjs → edvak99-voice-receptionist-widget-wizard-page.component-CefGWtVL.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-C-hdBQIV.mjs.map → edvak99-voice-receptionist-widget-wizard-page.component-CefGWtVL.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget.mjs +1 -1
- package/lib/components/call-tasks-panel/call-tasks-panel.component.d.ts +4 -3
- package/lib/pages/activities-page/activities-page.component.d.ts +1 -0
- package/lib/pages/audit-page/audit-page.component.d.ts +0 -2
- package/package.json +1 -1
- package/styles/embed.scss +38 -0
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-dcDXT2KG.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-Df-dtgR3.mjs +0 -96
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-Df-dtgR3.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-BJGzgVxG.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-CcwwO5SO.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-CMgOu0aw.mjs +0 -311
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-CMgOu0aw.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CJ1L6QeE.mjs.map +0 -1
|
@@ -2,8 +2,8 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { inject, input, output, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
3
3
|
import { Router, ActivatedRoute } from '@angular/router';
|
|
4
4
|
import { DatePipe } from '@angular/common';
|
|
5
|
-
import { E as EdAvatarComponent, p as EdIconButtonComponent, s as ViewportPortalDirective, I as IconComponent, A as AiReceptionistApiService, n as DEFAULT_PAGE_SIZE, o as totalPages, b as ageFromDob, u as initialsFromName, f as EdButtonComponent, g as EdSkeletonComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-
|
|
6
|
-
import { T as TaskDetailDrawerComponent } from './edvak99-voice-receptionist-widget-task-detail-drawer.component-
|
|
5
|
+
import { E as EdAvatarComponent, p as EdIconButtonComponent, s as ViewportPortalDirective, I as IconComponent, A as AiReceptionistApiService, n as DEFAULT_PAGE_SIZE, o as totalPages, b as ageFromDob, u as initialsFromName, f as EdButtonComponent, g as EdSkeletonComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CGbyYMbi.mjs';
|
|
6
|
+
import { T as TaskDetailDrawerComponent } from './edvak99-voice-receptionist-widget-task-detail-drawer.component-BNbjcoA2.mjs';
|
|
7
7
|
import { S as SmartTooltipDirective } from './edvak99-voice-receptionist-widget-smart-tooltip.directive-ChEdIem3.mjs';
|
|
8
8
|
import { T as TABLE_SKELETON_ROWS } from './edvak99-voice-receptionist-widget-table-skeleton.constants-C1Dg9Z_2.mjs';
|
|
9
9
|
import { E as EdsSearchFieldComponent } from './edvak99-voice-receptionist-widget-eds-search-field.component-BDGCmkoP.mjs';
|
|
@@ -280,6 +280,12 @@ class ActivitiesPageComponent {
|
|
|
280
280
|
displayMrn(item) {
|
|
281
281
|
return item.patientMrn?.trim() || '—';
|
|
282
282
|
}
|
|
283
|
+
displayPersonName(name) {
|
|
284
|
+
const raw = String(name ?? '').trim();
|
|
285
|
+
if (!raw)
|
|
286
|
+
return '';
|
|
287
|
+
return raw.toLowerCase().replace(/\b\w/g, (ch) => ch.toUpperCase());
|
|
288
|
+
}
|
|
283
289
|
providerSpecialtyLabel(item) {
|
|
284
290
|
const s = item.providerSpecialty?.trim();
|
|
285
291
|
if (!s)
|
|
@@ -513,7 +519,7 @@ class ActivitiesPageComponent {
|
|
|
513
519
|
return `${mm}-${dd}-${d.getFullYear()}`;
|
|
514
520
|
}
|
|
515
521
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ActivitiesPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
516
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ActivitiesPageComponent, isStandalone: true, selector: "eds-activities-page", host: { classAttribute: "block h-full min-h-0" }, ngImport: i0, template: "<div class=\"activities-page flex h-full min-h-0 min-w-0 max-w-full flex-col overflow-hidden bg-lighter p-base\">\n <div class=\"mb-sm flex shrink-0 flex-col gap-sm\">\n <header class=\"relative z-10 flex items-start justify-between gap-base bg-lighter\">\n <div class=\"grid gap-2xs\">\n <h4>Activities</h4>\n <p class=\"fs-sm text-light\">All activities done by the AI at one place</p>\n </div>\n <div class=\"flex shrink-0 items-center gap-base\">\n <div class=\"relative w-60\">\n <eds-search-field\n inputClass=\"form-input w-full pr-10\"\n placeholder=\"Search here\"\n ariaLabel=\"Search activities\"\n [value]=\"search()\"\n (valueChange)=\"onSearchInput($event)\"\n (enter)=\"applySearch()\" />\n <span class=\"pointer-events-none absolute inset-y-0 right-3 inline-flex items-center text-lighter\">\n <ed-icon name=\"search\" [size]=\"20\" color=\"currentColor\" />\n </span>\n </div>\n </div>\n </header>\n\n @if (callIdFilter(); as callId) {\n <div class=\"flex flex-wrap items-center justify-between gap-sm rounded-lg bg-primary-50 px-base py-sm fs-sm text-body\"\n role=\"status\">\n <span>Showing activities for call <strong class=\"text-dark\">{{ callId }}</strong></span>\n <button\n type=\"button\"\n class=\"cursor-pointer border-none bg-transparent px-0 py-2xs fs-sm text-primary hover:underline\"\n (click)=\"clearCallFilter()\">\n Clear filter\n </button>\n </div>\n }\n\n <nav class=\"flex flex-wrap gap-xs bg-white rounded-md px-xs py-xs\" 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-primary-50 px-base py-xs text-primary transition-colors'\n : 'cursor-pointer rounded-full border-none bg-transparent px-base py-xs text-light transition-colors hover:bg-white hover:text-dark'\"\n (click)=\"setTab(tab.id)\">\n {{ tab.label }}\n </button>\n }\n </nav>\n </div>\n\n @if (loadError()) {\n <p class=\"fs-sm text-danger\" role=\"alert\">{{ loadError() }}</p>\n } @else {\n <div class=\"flex min-h-0 min-w-0 max-w-full flex-1 flex-col overflow-hidden rounded-md bg-white\">\n <div class=\"eds-table-scroll min-h-0 min-w-0 flex-1\">\n @if (activeTab() === 'task_created') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Tasks\">\n <thead>\n <tr>\n <th class=\"bg-light\">Priority</th>\n <th class=\"bg-light\">Task</th>\n <th class=\"bg-light\">Assigned by</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Created date</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-2.5 w-2.5 !rounded-sm\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-14\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-44\"></ed-skeleton>\n <ed-skeleton class=\"h-5 w-24 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-16\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View task: ' + taskTitle(item)\"\n (click)=\"openTask(item)\"\n (keyup.enter)=\"openTask(item)\"\n >\n <td>\n <div\n class=\"inline-flex items-center gap-xs text-dark\"\n [attr.data-tone]=\"priorityTone(item)\"\n >\n <span\n class=\"activities-page__priority-mark h-2.5 w-2.5 shrink-0 rotate-45 rounded-sm\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"fs-sm capitalize\">{{ priorityLabel(item) }}</span>\n </div>\n </td>\n <td>\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-72 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"taskTitle(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ taskTitle(item) }}</span>\n <span\n class=\"inline-block min-w-0 max-w-72\"\n [smartTooltip]=\"categoryLabel(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >\n <ed-badge-2 variant=\"light\" pill uppercase class=\"max-w-full\">\n <span class=\"block truncate text-dark\">{{ categoryLabel(item) }}</span>\n </ed-badge-2>\n </span>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar shape=\"circle\" size=\"base\" initials=\"AI\" tone=\"brand\" />\n <div class=\"grid min-w-0 gap-2xs\">\n <span class=\"fs-sm font-semibold text-dark\">AI Receptionist</span>\n <span class=\"fs-xs text-light\">Voice agent</span>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-56 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span\n class=\"inline-block min-w-0 max-w-64 truncate fs-xs text-light\"\n [smartTooltip]=\"meta\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"whitespace-nowrap fs-sm text-light\">{{ dueLabel(item) }}</td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else if (activeTab() === 'appointment_booked') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Appointments\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Patient</th>\n <th class=\"bg-light\">Provider</th>\n <th class=\"bg-light text-right\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-40\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative\"\n [class.cursor-pointer]=\"!!item.callId\"\n [attr.role]=\"item.callId ? 'button' : null\"\n [attr.tabindex]=\"item.callId ? (i === 0 ? 0 : -1) : null\"\n [attr.aria-label]=\"item.callId ? 'Open call history' : null\"\n (click)=\"openCallHistory(item.callId, $event)\"\n (keyup.enter)=\"openCallHistory(item.callId)\"\n >\n <td>\n <div class=\"grid min-w-0 gap-2xs\">\n <div class=\"flex flex-wrap items-center gap-2xs\">\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ appointmentTimeRange(item) }}</span>\n @if (durationLabel(item); as duration) {\n <span class=\"inline-flex h-5 items-center rounded bg-light px-2xs fs-xs font-medium text-dark\">\n {{ duration }}\n </span>\n }\n </div>\n <span class=\"fs-sm text-light\">{{ categoryLabel(item) }}</span>\n <span class=\"fs-xs text-light\">{{ appointmentDayLabel(item) }}</span>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-56 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown patient'\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span\n class=\"inline-block min-w-0 max-w-64 truncate fs-xs text-light\"\n [smartTooltip]=\"meta\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td>\n @if (item.providerName) {\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar\n shape=\"circle\"\n size=\"base\"\n [initials]=\"providerInitials(item)\"\n [tone]=\"avatarTone(item.providerId || item.providerName, i + 3)\"\n />\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-56 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.providerName\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ item.providerName }}</span>\n @if (providerSpecialtyLabel(item); as specialty) {\n <span\n class=\"inline-block min-w-0 max-w-64 truncate fs-xs text-light\"\n [smartTooltip]=\"specialty\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ specialty }}</span>\n }\n </div>\n </div>\n } @else {\n <span class=\"fs-xs text-light\">No provider assigned</span>\n }\n </td>\n <td>\n <div class=\"flex items-center justify-end\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"4\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Registrations\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Name</th>\n <th class=\"bg-light\">MRN</th>\n <th class=\"bg-light\">Payer</th>\n <th class=\"bg-light text-right\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-16\"></ed-skeleton></td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View patient: ' + (item.patientName || 'Unknown patient')\"\n (click)=\"openPatient(item)\"\n (keyup.enter)=\"openPatient(item)\"\n >\n <td>\n <div class=\"grid min-w-0 gap-2xs\">\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ timestampLabel(item) }}</span>\n <span class=\"fs-sm text-light\">{{ categoryLabel(item) }}</span>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-56 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown patient'\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span\n class=\"inline-block min-w-0 max-w-64 truncate fs-xs text-light\"\n [smartTooltip]=\"meta\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"fs-sm text-body\">{{ displayMrn(item) }}</td>\n <td>\n @if (insuranceState(item) === 'covered') {\n <span class=\"fs-sm text-dark\">{{ item.insuranceName || 'Insured' }}</span>\n } @else {\n <span class=\"fs-sm text-dark\">Add Insurance</span>\n }\n </td>\n <td>\n <div class=\"flex items-center justify-end\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n }\n </div>\n\n @if (!loading() && total() > pageSize) {\n <footer class=\"mt-sm flex shrink-0 flex-wrap items-center justify-between gap-sm border-t border-light pt-sm\">\n <span class=\"fs-sm text-light\">\n Page {{ page() }} of {{ totalPages() }} \u00B7 {{ total() }} total\n </span>\n <div class=\"flex gap-xs\">\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() <= 1\"\n (click$)=\"prevPage()\"\n >\n Previous\n </ed-button>\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() >= totalPages()\"\n (click$)=\"nextPage()\"\n >\n Next\n </ed-button>\n </div>\n </footer>\n }\n </div>\n }\n</div>\n\n@if (selectedTask(); as task) {\n <eds-task-detail-drawer\n [task]=\"task\"\n (closed)=\"closeTaskDrawer()\"\n (statusChange)=\"onTaskStatusChange($event)\"\n />\n}\n\n@if (selectedPatient(); as patient) {\n <eds-patient-profile-drawer\n [patient]=\"patient\"\n (closed)=\"closePatientDrawer()\"\n />\n}\n", styles: [".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}\n"], dependencies: [{ kind: "component", type: EdAvatarComponent, selector: "ed-avatar", inputs: ["initials", "tone", "shape", "size", "gradient"] }, { kind: "component", type: IconComponent, selector: "ed-icon", inputs: ["name", "size", "color", "cssClass", "decorative", "ariaHidden", "ariaLabel", "title", "desc", "focusable", "tabIndex"] }, { kind: "component", type: EdButtonComponent, selector: "ed-button", inputs: ["variant", "size", "disabled", "ghost", "outline", "subtle", "fill", "loading", "block", "elevated", "shape", "type", "href", "routerLink", "rel", "target", "download", "ariaLabel"], outputs: ["click$"] }, { kind: "component", type: EdsSearchFieldComponent, selector: "eds-search-field", inputs: ["value", "inputId", "type", "placeholder", "ariaLabel", "inputClass"], outputs: ["valueChange", "enter"] }, { kind: "directive", type: SmartTooltipDirective, selector: "[smartTooltip]", inputs: ["smartTooltip", "tooltipAllowHtml", "tooltipTemplate", "tooltipTemplateContext", "tooltipPlacement", "tooltipTrigger", "tooltipDelayShow", "tooltipDelayHide", "tooltipOffset", "tooltipMaxWidth", "tooltipZIndex", "tooltipClass", "tooltipDisabled", "tooltipArrow", "tooltipHoverIntentMs", "tooltipHoverIntentRadius", "tooltipId", "tooltipRole", "tooltipAnimEnterMs", "tooltipAnimExitMs", "tooltipAnimEasing", "tooltipHoverable", "tooltipHandoffMs", "tooltipOpen", "tooltipOnlyWhenTruncated"] }, { kind: "component", type: EdSkeletonComponent, selector: "ed-skeleton", inputs: ["class"] }, { kind: "component", type: TaskDetailDrawerComponent, selector: "eds-task-detail-drawer", inputs: ["task"], outputs: ["closed", "statusChange"] }, { kind: "component", type: PatientProfileDrawerComponent, selector: "eds-patient-profile-drawer", inputs: ["patient"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
522
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ActivitiesPageComponent, isStandalone: true, selector: "eds-activities-page", host: { classAttribute: "block h-full min-h-0" }, ngImport: i0, template: "<div class=\"activities-page flex h-full min-h-0 min-w-0 max-w-full flex-col overflow-hidden bg-lighter p-base\">\n <div class=\"mb-sm flex shrink-0 flex-col gap-sm\">\n <header class=\"relative z-10 flex items-start justify-between gap-base bg-lighter\">\n <div class=\"grid gap-2xs\">\n <h4>Activities</h4>\n <p class=\"fs-sm text-light\">All activities done by the AI at one place</p>\n </div>\n <div class=\"flex shrink-0 items-center gap-base\">\n <div class=\"relative w-60\">\n <eds-search-field\n inputClass=\"form-input w-full pr-10\"\n placeholder=\"Search here\"\n ariaLabel=\"Search activities\"\n [value]=\"search()\"\n (valueChange)=\"onSearchInput($event)\"\n (enter)=\"applySearch()\" />\n <span class=\"pointer-events-none absolute inset-y-0 right-3 inline-flex items-center text-lighter\">\n <ed-icon name=\"search\" [size]=\"20\" color=\"currentColor\" />\n </span>\n </div>\n </div>\n </header>\n\n @if (callIdFilter(); as callId) {\n <div class=\"flex flex-wrap items-center justify-between gap-sm rounded-lg bg-primary-50 px-base py-sm fs-sm text-body\"\n role=\"status\">\n <span>Showing activities for call <strong class=\"text-dark\">{{ callId }}</strong></span>\n <button\n type=\"button\"\n class=\"cursor-pointer border-none bg-transparent px-0 py-2xs fs-sm text-primary hover:underline\"\n (click)=\"clearCallFilter()\">\n Clear filter\n </button>\n </div>\n }\n\n <nav class=\"flex flex-wrap gap-xs bg-white rounded-md px-xs py-xs\" 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-primary-50 px-base py-xs text-primary transition-colors'\n : 'cursor-pointer rounded-full border-none bg-transparent px-base py-xs text-light transition-colors hover:bg-white hover:text-dark'\"\n (click)=\"setTab(tab.id)\">\n {{ tab.label }}\n </button>\n }\n </nav>\n </div>\n\n @if (loadError()) {\n <p class=\"fs-sm text-danger\" role=\"alert\">{{ loadError() }}</p>\n } @else {\n <div class=\"flex min-h-0 min-w-0 max-w-full flex-1 flex-col overflow-hidden rounded-md bg-white\">\n <div class=\"eds-table-scroll min-h-0 min-w-0 flex-1\">\n @if (activeTab() === 'task_created') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Tasks\">\n <thead>\n <tr>\n <th class=\"bg-light\">Priority</th>\n <th class=\"bg-light\">Task</th>\n <th class=\"bg-light\">Assigned By</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Created Date</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-2.5 w-2.5 !rounded-sm\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-14\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-44\"></ed-skeleton>\n <ed-skeleton class=\"h-5 w-24 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-16\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View task: ' + taskTitle(item)\"\n (click)=\"openTask(item)\"\n (keyup.enter)=\"openTask(item)\"\n >\n <td>\n <div\n class=\"inline-flex items-center gap-xs text-dark\"\n [attr.data-tone]=\"priorityTone(item)\"\n >\n <span\n class=\"activities-page__priority-mark h-2.5 w-2.5 shrink-0 rotate-45 rounded-sm\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"fs-sm capitalize\">{{ priorityLabel(item) }}</span>\n </div>\n </td>\n <td>\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-72 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"taskTitle(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ taskTitle(item) }}</span>\n <span\n class=\"inline-block min-w-0 max-w-72\"\n [smartTooltip]=\"categoryLabel(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >\n <ed-badge-2 variant=\"light\" pill uppercase class=\"max-w-full\">\n <span class=\"block truncate text-dark\">{{ categoryLabel(item) }}</span>\n </ed-badge-2>\n </span>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar shape=\"circle\" size=\"base\" initials=\"AI\" tone=\"brand\" />\n <div class=\"grid min-w-0 gap-2xs\">\n <span class=\"fs-sm font-semibold text-dark\">AI Receptionist</span>\n <span class=\"fs-xs text-light\">Voice agent</span>\n </div>\n </div>\n </td>\n <td>\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"meta\">{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"whitespace-nowrap fs-sm text-light\">{{ dueLabel(item) }}</td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else if (activeTab() === 'appointment_booked') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Appointments\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Provider</th>\n <th class=\"bg-light\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-40\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative\"\n [class.cursor-pointer]=\"!!item.callId\"\n [attr.role]=\"item.callId ? 'button' : null\"\n [attr.tabindex]=\"item.callId ? (i === 0 ? 0 : -1) : null\"\n [attr.aria-label]=\"item.callId ? 'Open call history' : null\"\n (click)=\"openCallHistory(item.callId, $event)\"\n (keyup.enter)=\"openCallHistory(item.callId)\"\n >\n <td>\n <div class=\"grid min-w-0 justify-items-center gap-2xs\">\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ appointmentDayLabel(item) }}</span>\n <span class=\"fs-xs text-light\">{{ appointmentTimeRange(item) }}</span>\n @if (durationLabel(item); as duration) {\n <ed-badge-2 variant=\"light\" pill uppercase>{{ duration }}</ed-badge-2>\n }\n </div>\n </td>\n <td>\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"meta\">{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td>\n @if (item.providerName) {\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"circle\"\n size=\"base\"\n [initials]=\"providerInitials(item)\"\n [tone]=\"avatarTone(item.providerId || item.providerName, i + 3)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"displayPersonName(item.providerName)\"\n >{{ displayPersonName(item.providerName) }}</span>\n @if (providerSpecialtyLabel(item); as specialty) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"specialty\">{{ specialty }}</span>\n }\n </div>\n </div>\n } @else {\n <span class=\"fs-xs text-light\">No provider assigned</span>\n }\n </td>\n <td>\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"4\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Registrations\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">MRN</th>\n <th class=\"bg-light\">Payer</th>\n <th class=\"bg-light\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-16\"></ed-skeleton></td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View patient: ' + (item.patientName || 'Unknown patient')\"\n (click)=\"openPatient(item)\"\n (keyup.enter)=\"openPatient(item)\"\n >\n <td>\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ timestampLabel(item) }}</span>\n </td>\n <td>\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"meta\">{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"fs-sm text-body\">{{ displayMrn(item) }}</td>\n <td>\n <span class=\"fs-sm text-dark\">{{ insuranceState(item) === 'covered' ? (item.insuranceName || 'Insured') : '\u2014' }}</span>\n </td>\n <td>\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n }\n </div>\n\n @if (!loading() && total() > pageSize) {\n <footer class=\"mt-sm flex shrink-0 flex-wrap items-center justify-between gap-sm border-t border-light pt-sm\">\n <span class=\"fs-sm text-light\">\n Page {{ page() }} of {{ totalPages() }} \u00B7 {{ total() }} total\n </span>\n <div class=\"flex gap-xs\">\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() <= 1\"\n (click$)=\"prevPage()\"\n >\n Previous\n </ed-button>\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() >= totalPages()\"\n (click$)=\"nextPage()\"\n >\n Next\n </ed-button>\n </div>\n </footer>\n }\n </div>\n }\n</div>\n\n@if (selectedTask(); as task) {\n <eds-task-detail-drawer\n [task]=\"task\"\n (closed)=\"closeTaskDrawer()\"\n (statusChange)=\"onTaskStatusChange($event)\"\n />\n}\n\n@if (selectedPatient(); as patient) {\n <eds-patient-profile-drawer\n [patient]=\"patient\"\n (closed)=\"closePatientDrawer()\"\n />\n}\n", styles: [".eds-caller-cell{display:flex;width:13.5rem;max-width:13.5rem;align-items:center;gap:.5rem;margin-inline:auto;text-align:left}.eds-caller-cell__text{min-width:0;flex:1}.eds-caller-cell__name,.eds-caller-cell__meta{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}\n"], dependencies: [{ kind: "component", type: EdAvatarComponent, selector: "ed-avatar", inputs: ["initials", "tone", "shape", "size", "gradient"] }, { kind: "component", type: IconComponent, selector: "ed-icon", inputs: ["name", "size", "color", "cssClass", "decorative", "ariaHidden", "ariaLabel", "title", "desc", "focusable", "tabIndex"] }, { kind: "component", type: EdButtonComponent, selector: "ed-button", inputs: ["variant", "size", "disabled", "ghost", "outline", "subtle", "fill", "loading", "block", "elevated", "shape", "type", "href", "routerLink", "rel", "target", "download", "ariaLabel"], outputs: ["click$"] }, { kind: "component", type: EdsSearchFieldComponent, selector: "eds-search-field", inputs: ["value", "inputId", "type", "placeholder", "ariaLabel", "inputClass"], outputs: ["valueChange", "enter"] }, { kind: "directive", type: SmartTooltipDirective, selector: "[smartTooltip]", inputs: ["smartTooltip", "tooltipAllowHtml", "tooltipTemplate", "tooltipTemplateContext", "tooltipPlacement", "tooltipTrigger", "tooltipDelayShow", "tooltipDelayHide", "tooltipOffset", "tooltipMaxWidth", "tooltipZIndex", "tooltipClass", "tooltipDisabled", "tooltipArrow", "tooltipHoverIntentMs", "tooltipHoverIntentRadius", "tooltipId", "tooltipRole", "tooltipAnimEnterMs", "tooltipAnimExitMs", "tooltipAnimEasing", "tooltipHoverable", "tooltipHandoffMs", "tooltipOpen", "tooltipOnlyWhenTruncated"] }, { kind: "component", type: EdSkeletonComponent, selector: "ed-skeleton", inputs: ["class"] }, { kind: "component", type: TaskDetailDrawerComponent, selector: "eds-task-detail-drawer", inputs: ["task"], outputs: ["closed", "statusChange"] }, { kind: "component", type: PatientProfileDrawerComponent, selector: "eds-patient-profile-drawer", inputs: ["patient"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
517
523
|
}
|
|
518
524
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ActivitiesPageComponent, decorators: [{
|
|
519
525
|
type: Component,
|
|
@@ -526,8 +532,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
|
|
|
526
532
|
EdSkeletonComponent,
|
|
527
533
|
TaskDetailDrawerComponent,
|
|
528
534
|
PatientProfileDrawerComponent,
|
|
529
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, schemas: [CUSTOM_ELEMENTS_SCHEMA], host: { class: 'block h-full min-h-0' }, template: "<div class=\"activities-page flex h-full min-h-0 min-w-0 max-w-full flex-col overflow-hidden bg-lighter p-base\">\n <div class=\"mb-sm flex shrink-0 flex-col gap-sm\">\n <header class=\"relative z-10 flex items-start justify-between gap-base bg-lighter\">\n <div class=\"grid gap-2xs\">\n <h4>Activities</h4>\n <p class=\"fs-sm text-light\">All activities done by the AI at one place</p>\n </div>\n <div class=\"flex shrink-0 items-center gap-base\">\n <div class=\"relative w-60\">\n <eds-search-field\n inputClass=\"form-input w-full pr-10\"\n placeholder=\"Search here\"\n ariaLabel=\"Search activities\"\n [value]=\"search()\"\n (valueChange)=\"onSearchInput($event)\"\n (enter)=\"applySearch()\" />\n <span class=\"pointer-events-none absolute inset-y-0 right-3 inline-flex items-center text-lighter\">\n <ed-icon name=\"search\" [size]=\"20\" color=\"currentColor\" />\n </span>\n </div>\n </div>\n </header>\n\n @if (callIdFilter(); as callId) {\n <div class=\"flex flex-wrap items-center justify-between gap-sm rounded-lg bg-primary-50 px-base py-sm fs-sm text-body\"\n role=\"status\">\n <span>Showing activities for call <strong class=\"text-dark\">{{ callId }}</strong></span>\n <button\n type=\"button\"\n class=\"cursor-pointer border-none bg-transparent px-0 py-2xs fs-sm text-primary hover:underline\"\n (click)=\"clearCallFilter()\">\n Clear filter\n </button>\n </div>\n }\n\n <nav class=\"flex flex-wrap gap-xs bg-white rounded-md px-xs py-xs\" 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-primary-50 px-base py-xs text-primary transition-colors'\n : 'cursor-pointer rounded-full border-none bg-transparent px-base py-xs text-light transition-colors hover:bg-white hover:text-dark'\"\n (click)=\"setTab(tab.id)\">\n {{ tab.label }}\n </button>\n }\n </nav>\n </div>\n\n @if (loadError()) {\n <p class=\"fs-sm text-danger\" role=\"alert\">{{ loadError() }}</p>\n } @else {\n <div class=\"flex min-h-0 min-w-0 max-w-full flex-1 flex-col overflow-hidden rounded-md bg-white\">\n <div class=\"eds-table-scroll min-h-0 min-w-0 flex-1\">\n @if (activeTab() === 'task_created') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Tasks\">\n <thead>\n <tr>\n <th class=\"bg-light\">Priority</th>\n <th class=\"bg-light\">Task</th>\n <th class=\"bg-light\">Assigned by</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Created date</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-2.5 w-2.5 !rounded-sm\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-14\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-44\"></ed-skeleton>\n <ed-skeleton class=\"h-5 w-24 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-16\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View task: ' + taskTitle(item)\"\n (click)=\"openTask(item)\"\n (keyup.enter)=\"openTask(item)\"\n >\n <td>\n <div\n class=\"inline-flex items-center gap-xs text-dark\"\n [attr.data-tone]=\"priorityTone(item)\"\n >\n <span\n class=\"activities-page__priority-mark h-2.5 w-2.5 shrink-0 rotate-45 rounded-sm\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"fs-sm capitalize\">{{ priorityLabel(item) }}</span>\n </div>\n </td>\n <td>\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-72 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"taskTitle(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ taskTitle(item) }}</span>\n <span\n class=\"inline-block min-w-0 max-w-72\"\n [smartTooltip]=\"categoryLabel(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >\n <ed-badge-2 variant=\"light\" pill uppercase class=\"max-w-full\">\n <span class=\"block truncate text-dark\">{{ categoryLabel(item) }}</span>\n </ed-badge-2>\n </span>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar shape=\"circle\" size=\"base\" initials=\"AI\" tone=\"brand\" />\n <div class=\"grid min-w-0 gap-2xs\">\n <span class=\"fs-sm font-semibold text-dark\">AI Receptionist</span>\n <span class=\"fs-xs text-light\">Voice agent</span>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-56 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span\n class=\"inline-block min-w-0 max-w-64 truncate fs-xs text-light\"\n [smartTooltip]=\"meta\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"whitespace-nowrap fs-sm text-light\">{{ dueLabel(item) }}</td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else if (activeTab() === 'appointment_booked') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Appointments\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Patient</th>\n <th class=\"bg-light\">Provider</th>\n <th class=\"bg-light text-right\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-40\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative\"\n [class.cursor-pointer]=\"!!item.callId\"\n [attr.role]=\"item.callId ? 'button' : null\"\n [attr.tabindex]=\"item.callId ? (i === 0 ? 0 : -1) : null\"\n [attr.aria-label]=\"item.callId ? 'Open call history' : null\"\n (click)=\"openCallHistory(item.callId, $event)\"\n (keyup.enter)=\"openCallHistory(item.callId)\"\n >\n <td>\n <div class=\"grid min-w-0 gap-2xs\">\n <div class=\"flex flex-wrap items-center gap-2xs\">\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ appointmentTimeRange(item) }}</span>\n @if (durationLabel(item); as duration) {\n <span class=\"inline-flex h-5 items-center rounded bg-light px-2xs fs-xs font-medium text-dark\">\n {{ duration }}\n </span>\n }\n </div>\n <span class=\"fs-sm text-light\">{{ categoryLabel(item) }}</span>\n <span class=\"fs-xs text-light\">{{ appointmentDayLabel(item) }}</span>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-56 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown patient'\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span\n class=\"inline-block min-w-0 max-w-64 truncate fs-xs text-light\"\n [smartTooltip]=\"meta\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td>\n @if (item.providerName) {\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar\n shape=\"circle\"\n size=\"base\"\n [initials]=\"providerInitials(item)\"\n [tone]=\"avatarTone(item.providerId || item.providerName, i + 3)\"\n />\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-56 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.providerName\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ item.providerName }}</span>\n @if (providerSpecialtyLabel(item); as specialty) {\n <span\n class=\"inline-block min-w-0 max-w-64 truncate fs-xs text-light\"\n [smartTooltip]=\"specialty\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ specialty }}</span>\n }\n </div>\n </div>\n } @else {\n <span class=\"fs-xs text-light\">No provider assigned</span>\n }\n </td>\n <td>\n <div class=\"flex items-center justify-end\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"4\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Registrations\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Name</th>\n <th class=\"bg-light\">MRN</th>\n <th class=\"bg-light\">Payer</th>\n <th class=\"bg-light text-right\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-16\"></ed-skeleton></td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View patient: ' + (item.patientName || 'Unknown patient')\"\n (click)=\"openPatient(item)\"\n (keyup.enter)=\"openPatient(item)\"\n >\n <td>\n <div class=\"grid min-w-0 gap-2xs\">\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ timestampLabel(item) }}</span>\n <span class=\"fs-sm text-light\">{{ categoryLabel(item) }}</span>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-56 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown patient'\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ item.patientName || 'Unknown patient' }}</span>\n @if (patientMeta(item); as meta) {\n <span\n class=\"inline-block min-w-0 max-w-64 truncate fs-xs text-light\"\n [smartTooltip]=\"meta\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"fs-sm text-body\">{{ displayMrn(item) }}</td>\n <td>\n @if (insuranceState(item) === 'covered') {\n <span class=\"fs-sm text-dark\">{{ item.insuranceName || 'Insured' }}</span>\n } @else {\n <span class=\"fs-sm text-dark\">Add Insurance</span>\n }\n </td>\n <td>\n <div class=\"flex items-center justify-end\">\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </div>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n }\n </div>\n\n @if (!loading() && total() > pageSize) {\n <footer class=\"mt-sm flex shrink-0 flex-wrap items-center justify-between gap-sm border-t border-light pt-sm\">\n <span class=\"fs-sm text-light\">\n Page {{ page() }} of {{ totalPages() }} \u00B7 {{ total() }} total\n </span>\n <div class=\"flex gap-xs\">\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() <= 1\"\n (click$)=\"prevPage()\"\n >\n Previous\n </ed-button>\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() >= totalPages()\"\n (click$)=\"nextPage()\"\n >\n Next\n </ed-button>\n </div>\n </footer>\n }\n </div>\n }\n</div>\n\n@if (selectedTask(); as task) {\n <eds-task-detail-drawer\n [task]=\"task\"\n (closed)=\"closeTaskDrawer()\"\n (statusChange)=\"onTaskStatusChange($event)\"\n />\n}\n\n@if (selectedPatient(); as patient) {\n <eds-patient-profile-drawer\n [patient]=\"patient\"\n (closed)=\"closePatientDrawer()\"\n />\n}\n", styles: [".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}\n"] }]
|
|
535
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, schemas: [CUSTOM_ELEMENTS_SCHEMA], host: { class: 'block h-full min-h-0' }, template: "<div class=\"activities-page flex h-full min-h-0 min-w-0 max-w-full flex-col overflow-hidden bg-lighter p-base\">\n <div class=\"mb-sm flex shrink-0 flex-col gap-sm\">\n <header class=\"relative z-10 flex items-start justify-between gap-base bg-lighter\">\n <div class=\"grid gap-2xs\">\n <h4>Activities</h4>\n <p class=\"fs-sm text-light\">All activities done by the AI at one place</p>\n </div>\n <div class=\"flex shrink-0 items-center gap-base\">\n <div class=\"relative w-60\">\n <eds-search-field\n inputClass=\"form-input w-full pr-10\"\n placeholder=\"Search here\"\n ariaLabel=\"Search activities\"\n [value]=\"search()\"\n (valueChange)=\"onSearchInput($event)\"\n (enter)=\"applySearch()\" />\n <span class=\"pointer-events-none absolute inset-y-0 right-3 inline-flex items-center text-lighter\">\n <ed-icon name=\"search\" [size]=\"20\" color=\"currentColor\" />\n </span>\n </div>\n </div>\n </header>\n\n @if (callIdFilter(); as callId) {\n <div class=\"flex flex-wrap items-center justify-between gap-sm rounded-lg bg-primary-50 px-base py-sm fs-sm text-body\"\n role=\"status\">\n <span>Showing activities for call <strong class=\"text-dark\">{{ callId }}</strong></span>\n <button\n type=\"button\"\n class=\"cursor-pointer border-none bg-transparent px-0 py-2xs fs-sm text-primary hover:underline\"\n (click)=\"clearCallFilter()\">\n Clear filter\n </button>\n </div>\n }\n\n <nav class=\"flex flex-wrap gap-xs bg-white rounded-md px-xs py-xs\" 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-primary-50 px-base py-xs text-primary transition-colors'\n : 'cursor-pointer rounded-full border-none bg-transparent px-base py-xs text-light transition-colors hover:bg-white hover:text-dark'\"\n (click)=\"setTab(tab.id)\">\n {{ tab.label }}\n </button>\n }\n </nav>\n </div>\n\n @if (loadError()) {\n <p class=\"fs-sm text-danger\" role=\"alert\">{{ loadError() }}</p>\n } @else {\n <div class=\"flex min-h-0 min-w-0 max-w-full flex-1 flex-col overflow-hidden rounded-md bg-white\">\n <div class=\"eds-table-scroll min-h-0 min-w-0 flex-1\">\n @if (activeTab() === 'task_created') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Tasks\">\n <thead>\n <tr>\n <th class=\"bg-light\">Priority</th>\n <th class=\"bg-light\">Task</th>\n <th class=\"bg-light\">Assigned By</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Created Date</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-2.5 w-2.5 !rounded-sm\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-14\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-44\"></ed-skeleton>\n <ed-skeleton class=\"h-5 w-24 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-16\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View task: ' + taskTitle(item)\"\n (click)=\"openTask(item)\"\n (keyup.enter)=\"openTask(item)\"\n >\n <td>\n <div\n class=\"inline-flex items-center gap-xs text-dark\"\n [attr.data-tone]=\"priorityTone(item)\"\n >\n <span\n class=\"activities-page__priority-mark h-2.5 w-2.5 shrink-0 rotate-45 rounded-sm\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"fs-sm capitalize\">{{ priorityLabel(item) }}</span>\n </div>\n </td>\n <td>\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-72 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"taskTitle(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ taskTitle(item) }}</span>\n <span\n class=\"inline-block min-w-0 max-w-72\"\n [smartTooltip]=\"categoryLabel(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >\n <ed-badge-2 variant=\"light\" pill uppercase class=\"max-w-full\">\n <span class=\"block truncate text-dark\">{{ categoryLabel(item) }}</span>\n </ed-badge-2>\n </span>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar shape=\"circle\" size=\"base\" initials=\"AI\" tone=\"brand\" />\n <div class=\"grid min-w-0 gap-2xs\">\n <span class=\"fs-sm font-semibold text-dark\">AI Receptionist</span>\n <span class=\"fs-xs text-light\">Voice agent</span>\n </div>\n </div>\n </td>\n <td>\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"meta\">{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"whitespace-nowrap fs-sm text-light\">{{ dueLabel(item) }}</td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else if (activeTab() === 'appointment_booked') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Appointments\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Provider</th>\n <th class=\"bg-light\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-40\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative\"\n [class.cursor-pointer]=\"!!item.callId\"\n [attr.role]=\"item.callId ? 'button' : null\"\n [attr.tabindex]=\"item.callId ? (i === 0 ? 0 : -1) : null\"\n [attr.aria-label]=\"item.callId ? 'Open call history' : null\"\n (click)=\"openCallHistory(item.callId, $event)\"\n (keyup.enter)=\"openCallHistory(item.callId)\"\n >\n <td>\n <div class=\"grid min-w-0 justify-items-center gap-2xs\">\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ appointmentDayLabel(item) }}</span>\n <span class=\"fs-xs text-light\">{{ appointmentTimeRange(item) }}</span>\n @if (durationLabel(item); as duration) {\n <ed-badge-2 variant=\"light\" pill uppercase>{{ duration }}</ed-badge-2>\n }\n </div>\n </td>\n <td>\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"meta\">{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td>\n @if (item.providerName) {\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"circle\"\n size=\"base\"\n [initials]=\"providerInitials(item)\"\n [tone]=\"avatarTone(item.providerId || item.providerName, i + 3)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"displayPersonName(item.providerName)\"\n >{{ displayPersonName(item.providerName) }}</span>\n @if (providerSpecialtyLabel(item); as specialty) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"specialty\">{{ specialty }}</span>\n }\n </div>\n </div>\n } @else {\n <span class=\"fs-xs text-light\">No provider assigned</span>\n }\n </td>\n <td>\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"4\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Registrations\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">MRN</th>\n <th class=\"bg-light\">Payer</th>\n <th class=\"bg-light\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-16\"></ed-skeleton></td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View patient: ' + (item.patientName || 'Unknown patient')\"\n (click)=\"openPatient(item)\"\n (keyup.enter)=\"openPatient(item)\"\n >\n <td>\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ timestampLabel(item) }}</span>\n </td>\n <td>\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"meta\">{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"fs-sm text-body\">{{ displayMrn(item) }}</td>\n <td>\n <span class=\"fs-sm text-dark\">{{ insuranceState(item) === 'covered' ? (item.insuranceName || 'Insured') : '\u2014' }}</span>\n </td>\n <td>\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n }\n </div>\n\n @if (!loading() && total() > pageSize) {\n <footer class=\"mt-sm flex shrink-0 flex-wrap items-center justify-between gap-sm border-t border-light pt-sm\">\n <span class=\"fs-sm text-light\">\n Page {{ page() }} of {{ totalPages() }} \u00B7 {{ total() }} total\n </span>\n <div class=\"flex gap-xs\">\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() <= 1\"\n (click$)=\"prevPage()\"\n >\n Previous\n </ed-button>\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() >= totalPages()\"\n (click$)=\"nextPage()\"\n >\n Next\n </ed-button>\n </div>\n </footer>\n }\n </div>\n }\n</div>\n\n@if (selectedTask(); as task) {\n <eds-task-detail-drawer\n [task]=\"task\"\n (closed)=\"closeTaskDrawer()\"\n (statusChange)=\"onTaskStatusChange($event)\"\n />\n}\n\n@if (selectedPatient(); as patient) {\n <eds-patient-profile-drawer\n [patient]=\"patient\"\n (closed)=\"closePatientDrawer()\"\n />\n}\n", styles: [".eds-caller-cell{display:flex;width:13.5rem;max-width:13.5rem;align-items:center;gap:.5rem;margin-inline:auto;text-align:left}.eds-caller-cell__text{min-width:0;flex:1}.eds-caller-cell__name,.eds-caller-cell__meta{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}\n"] }]
|
|
530
536
|
}] });
|
|
531
537
|
|
|
532
538
|
export { ActivitiesPageComponent };
|
|
533
|
-
//# sourceMappingURL=edvak99-voice-receptionist-widget-activities-page.component-
|
|
539
|
+
//# sourceMappingURL=edvak99-voice-receptionist-widget-activities-page.component-D16UQWsH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edvak99-voice-receptionist-widget-activities-page.component-D16UQWsH.mjs","sources":["../../../src/lib/components/patient-profile-drawer/patient-profile-drawer.component.ts","../../../src/lib/components/patient-profile-drawer/patient-profile-drawer.component.html","../../../src/lib/pages/activities-page/activities-page.component.ts","../../../src/lib/pages/activities-page/activities-page.component.html"],"sourcesContent":["import { DatePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n CUSTOM_ELEMENTS_SCHEMA,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { AgentActivity } from '../../models/agent-activity.types';\nimport { EdAvatarComponent } from '../../ui/ed-avatar.component';\nimport { EdIconButtonComponent } from '../../ui/ed-icon-button.component';\nimport { IconComponent } from '../../ui/ed-icon.component';\nimport { ViewportPortalDirective } from '../../shared/viewport-portal.directive';\n\n@Component({\n selector: 'eds-patient-profile-drawer',\n imports: [\n DatePipe,\n EdAvatarComponent,\n EdIconButtonComponent,\n IconComponent,\n ViewportPortalDirective,\n ],\n templateUrl: './patient-profile-drawer.component.html',\n styleUrl: './patient-profile-drawer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class PatientProfileDrawerComponent {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n\n readonly patient = input.required<AgentActivity>();\n\n readonly closed = output<void>();\n\n protected close(): void {\n this.closed.emit();\n }\n\n protected openCallHistory(): void {\n const callId = this.patient().callId;\n if (!callId) return;\n this.close();\n void this.router.navigate(['../history', callId], { relativeTo: this.route });\n }\n\n protected onBackdropClick(event: MouseEvent): void {\n if (event.target === event.currentTarget) this.close();\n }\n\n protected display(value: string | null | undefined): string {\n const s = String(value ?? '').trim();\n return s || '—';\n }\n\n protected insuranceLabel(): string {\n const p = this.patient();\n if (p.hasInsurance === true) {\n return p.insuranceName ? `Insured — ${p.insuranceName}` : 'Insured';\n }\n if (p.hasInsurance === false) return 'No insurance on file';\n return p.insuranceName || 'Not verified';\n }\n\n protected insuranceTone(): 'covered' | 'none' | 'unknown' {\n const p = this.patient();\n if (p.hasInsurance === true) return 'covered';\n if (p.hasInsurance === false) return 'none';\n return 'unknown';\n }\n}\n","<div\n edsViewportPortal\n class=\"eds-drawer-backdrop fixed left-0 top-0 z-[100100] flex h-[100vh] w-[100vw] justify-end\"\n (click)=\"onBackdropClick($event)\"\n role=\"presentation\"\n>\n <ed-drawer\n size=\"base\"\n class=\"slide-in-rtl ed-main-sidepanel h-full bg-[#f7f8fa]\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"display(patient().patientName)\"\n >\n <ed-drawer-header class=\"border-b border-zinc-200 bg-white px-4 py-3 shadow-none\">\n <h6 class=\"m-0 text-base font-semibold text-zinc-900\">Patient profile</h6>\n <ed-icon-button\n name=\"close\"\n label=\"Close\"\n size=\"sm\"\n ghost\n (click$)=\"close()\"\n />\n </ed-drawer-header>\n\n <ed-drawer-body class=\"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto\">\n <section class=\"rounded-xl border border-zinc-200 bg-white p-4\">\n <div class=\"flex items-start gap-3\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patient().patientInitials || '?'\"\n tone=\"brand\"\n />\n <div class=\"min-w-0 flex-1\">\n <h4>\n {{ display(patient().patientName) }}\n </h4>\n @if (patient().patientDob || patient().patientAge != null || patient().patientGender) {\n <p class=\"mt-1 mb-0 text-sm text-zinc-500\">\n @if (patient().patientDob) {\n DOB: {{ patient().patientDob | date: 'MM/dd/yyyy' }}\n }\n @if (patient().patientAge != null) {\n · {{ patient().patientAge }}Y\n }\n @if (patient().patientGender) {\n · {{ patient().patientGender }}\n }\n </p>\n }\n </div>\n </div>\n </section>\n\n <section class=\"rounded-xl border border-zinc-200 bg-white px-4 py-3\">\n <div class=\"flex items-center justify-between gap-3\">\n <span class=\"text-sm font-medium text-zinc-800\">MRN</span>\n <span class=\"text-sm text-zinc-600\">{{ display(patient().patientMrn) }}</span>\n </div>\n </section>\n\n @if (patient().patientId) {\n <section class=\"rounded-xl border border-zinc-200 bg-white px-4 py-3\">\n <div class=\"flex items-center justify-between gap-3\">\n <span class=\"text-sm font-medium text-zinc-800\">Patient ID</span>\n <span class=\"font-mono text-sm text-zinc-600\">{{ patient().patientId }}</span>\n </div>\n </section>\n }\n\n <section class=\"rounded-xl border border-zinc-200 bg-white px-4 py-3\">\n <div class=\"flex items-center justify-between gap-3\">\n <span class=\"text-sm font-medium text-zinc-800\">Insurance</span>\n <span\n class=\"vr-insurance-badge inline-flex items-center rounded-full border px-2.5 py-1 text-xs font-medium\"\n [attr.data-state]=\"insuranceTone()\"\n >\n {{ insuranceLabel() }}\n </span>\n </div>\n </section>\n\n <section class=\"rounded-xl border border-zinc-200 bg-white px-4 py-3\">\n <div class=\"flex items-center justify-between gap-3\">\n <span class=\"text-sm font-medium text-zinc-800\">Registered</span>\n <span class=\"text-sm text-zinc-600\">\n @if (patient().occurredAt) {\n {{ patient().occurredAt | date: 'MMM d, y, h:mm a' }}\n } @else {\n —\n }\n </span>\n </div>\n </section>\n\n @if (patient().detail) {\n <section class=\"rounded-xl border border-zinc-200 bg-white p-4\">\n <h3 class=\"m-0 text-sm font-semibold text-zinc-800\">Details</h3>\n <p class=\"mt-2 mb-0 whitespace-pre-wrap text-sm leading-relaxed text-zinc-600\">\n {{ patient().detail }}\n </p>\n </section>\n }\n\n @if (patient().callId) {\n <section class=\"rounded-xl border border-zinc-200 bg-white px-4 py-3\">\n <div class=\"flex items-center justify-between gap-3\">\n <span class=\"text-sm font-medium text-zinc-800\">Call</span>\n <button\n type=\"button\"\n class=\"eds-plain-nav text-sm font-medium text-dark\"\n (click)=\"openCallHistory()\"\n >\n View call\n </button>\n </div>\n </section>\n }\n </ed-drawer-body>\n </ed-drawer>\n</div>\n","import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, OnDestroy, OnInit, inject, signal } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { PatientProfileDrawerComponent } from '../../components/patient-profile-drawer/patient-profile-drawer.component';\nimport { TaskDetailDrawerComponent } from '../../components/task-detail-drawer/task-detail-drawer.component';\nimport {\n ActivitiesTab,\n AgentActivity,\n initialsFromName,\n} from '../../models/agent-activity.types';\nimport { TaskItem, TaskStatus } from '../../models/ai-receptionist.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 { EdButtonComponent } from '../../ui/ed-button.component';\nimport { EdSkeletonComponent } from '../../ui/ed-skeleton.component';\n\nimport { SmartTooltipDirective } from '../../shared/smart-tooltip.directive';\nimport { TABLE_SKELETON_ROWS } from '../../shared/table-skeleton.constants';\nimport { EdAvatarComponent } from '../../ui/ed-avatar.component';\nimport { IconComponent } from '../../ui/ed-icon.component';\nimport { EdsSearchFieldComponent } from '../../ui/eds-search-field.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: [\n EdAvatarComponent,\n IconComponent,\n EdButtonComponent,\n EdsSearchFieldComponent,\n SmartTooltipDirective,\n EdSkeletonComponent,\n TaskDetailDrawerComponent,\n PatientProfileDrawerComponent,\n ],\n templateUrl: './activities-page.component.html',\n styleUrl: './activities-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n host: { class: 'block h-full min-h-0' },\n})\nexport class ActivitiesPageComponent implements OnInit, OnDestroy {\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>('task_created');\n protected readonly callIdFilter = signal<string | null>(null);\n protected readonly search = signal('');\n protected readonly loading = signal(true);\n protected readonly loadError = signal<string | null>(null);\n protected readonly skeletonRows = TABLE_SKELETON_ROWS;\n protected readonly selectedTask = signal<TaskItem | null>(null);\n protected readonly selectedPatient = signal<AgentActivity | null>(null);\n private searchTimer: ReturnType<typeof setTimeout> | 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) {\n this.activeTab.set(tabFromQuery);\n } else {\n this.activeTab.set('task_created');\n void this.router.navigate([], {\n relativeTo: this.route,\n queryParams: { tab: 'tasks' },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n }\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 ngOnDestroy(): void {\n if (this.searchTimer) clearTimeout(this.searchTimer);\n }\n\n protected onSearchInput(value: string): void {\n this.search.set(value);\n if (this.searchTimer) clearTimeout(this.searchTimer);\n this.searchTimer = setTimeout(() => {\n this.page.set(1);\n this.load();\n }, value.trim() ? 300 : 0);\n }\n\n protected applySearch(): void {\n if (this.searchTimer) clearTimeout(this.searchTimer);\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 search: this.search().trim() || 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 openTask(item: AgentActivity): void {\n this.selectedPatient.set(null);\n this.selectedTask.set(this.activityToTask(item));\n }\n\n protected openPatient(item: AgentActivity): void {\n this.selectedTask.set(null);\n this.selectedPatient.set(item);\n }\n\n protected closeTaskDrawer(): void {\n this.selectedTask.set(null);\n }\n\n protected closePatientDrawer(): void {\n this.selectedPatient.set(null);\n }\n\n protected onTaskStatusChange(status: TaskStatus): void {\n const task = this.selectedTask();\n if (!task) return;\n this.api.patchTask(task.id, status).subscribe({\n next: ({ data }) => {\n if (data) {\n this.selectedTask.set(data);\n } else {\n this.selectedTask.set({ ...task, status });\n }\n },\n error: () => {\n // Optimistic local update if patch fails (activity-sourced ids may not exist).\n this.selectedTask.set({ ...task, status });\n },\n });\n }\n\n private activityToTask(item: AgentActivity): TaskItem {\n const priority =\n item.priority === 'urgent' || item.priority === 'high' ? 'urgent' : 'normal';\n const created = this.parseDate(item.occurredAt)?.getTime() ?? Date.now();\n return {\n id: item.taskId || item.id,\n created,\n title: this.taskTitle(item),\n type: 'task',\n description: item.detail || '',\n patient: item.patientName || 'Unknown caller',\n priority,\n status: 'open',\n source: 'voice',\n assignee: 'AI Receptionist',\n callId: item.callId || undefined,\n };\n }\n\n protected displayMrn(item: AgentActivity): string {\n return item.patientMrn?.trim() || '—';\n }\n\n protected displayPersonName(name: string | null | undefined): string {\n const raw = String(name ?? '').trim();\n if (!raw) return '';\n return raw.toLowerCase().replace(/\\b\\w/g, (ch) => ch.toUpperCase());\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 appointmentTimeRange(item: AgentActivity): string {\n const start = this.parseDate(item.startAt || item.occurredAt);\n if (!start) return '—';\n const end = this.parseDate(item.endAt);\n if (end && end.getTime() > start.getTime()) {\n return `${this.formatClock(start)} - ${this.formatClock(end)}`;\n }\n return this.formatClock(start);\n }\n\n protected appointmentDayLabel(item: AgentActivity): string {\n const start = this.parseDate(item.startAt || item.occurredAt);\n return start ? this.formatDay(start) : '—';\n }\n\n protected dueLabel(item: AgentActivity): string {\n const d = this.parseDate(item.occurredAt || item.startAt);\n if (!d) return '—';\n return d.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\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 /** Subtitle under the task title; omitted when it duplicates the title. */\n protected taskDetail(item: AgentActivity): string | null {\n const detail = (item.detail || '').trim();\n if (!detail) return null;\n const title = this.taskTitle(item).trim().toLowerCase();\n if (detail.toLowerCase() === title) return null;\n if (/^task created$/i.test(detail)) return null;\n return detail;\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=\"activities-page flex h-full min-h-0 min-w-0 max-w-full flex-col overflow-hidden bg-lighter p-base\">\n <div class=\"mb-sm flex shrink-0 flex-col gap-sm\">\n <header class=\"relative z-10 flex items-start justify-between gap-base bg-lighter\">\n <div class=\"grid gap-2xs\">\n <h4>Activities</h4>\n <p class=\"fs-sm text-light\">All activities done by the AI at one place</p>\n </div>\n <div class=\"flex shrink-0 items-center gap-base\">\n <div class=\"relative w-60\">\n <eds-search-field\n inputClass=\"form-input w-full pr-10\"\n placeholder=\"Search here\"\n ariaLabel=\"Search activities\"\n [value]=\"search()\"\n (valueChange)=\"onSearchInput($event)\"\n (enter)=\"applySearch()\" />\n <span class=\"pointer-events-none absolute inset-y-0 right-3 inline-flex items-center text-lighter\">\n <ed-icon name=\"search\" [size]=\"20\" color=\"currentColor\" />\n </span>\n </div>\n </div>\n </header>\n\n @if (callIdFilter(); as callId) {\n <div class=\"flex flex-wrap items-center justify-between gap-sm rounded-lg bg-primary-50 px-base py-sm fs-sm text-body\"\n role=\"status\">\n <span>Showing activities for call <strong class=\"text-dark\">{{ callId }}</strong></span>\n <button\n type=\"button\"\n class=\"cursor-pointer border-none bg-transparent px-0 py-2xs fs-sm text-primary hover:underline\"\n (click)=\"clearCallFilter()\">\n Clear filter\n </button>\n </div>\n }\n\n <nav class=\"flex flex-wrap gap-xs bg-white rounded-md px-xs py-xs\" 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-primary-50 px-base py-xs text-primary transition-colors'\n : 'cursor-pointer rounded-full border-none bg-transparent px-base py-xs text-light transition-colors hover:bg-white hover:text-dark'\"\n (click)=\"setTab(tab.id)\">\n {{ tab.label }}\n </button>\n }\n </nav>\n </div>\n\n @if (loadError()) {\n <p class=\"fs-sm text-danger\" role=\"alert\">{{ loadError() }}</p>\n } @else {\n <div class=\"flex min-h-0 min-w-0 max-w-full flex-1 flex-col overflow-hidden rounded-md bg-white\">\n <div class=\"eds-table-scroll min-h-0 min-w-0 flex-1\">\n @if (activeTab() === 'task_created') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Tasks\">\n <thead>\n <tr>\n <th class=\"bg-light\">Priority</th>\n <th class=\"bg-light\">Task</th>\n <th class=\"bg-light\">Assigned By</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Created Date</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-2.5 w-2.5 !rounded-sm\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-14\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-44\"></ed-skeleton>\n <ed-skeleton class=\"h-5 w-24 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-16\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View task: ' + taskTitle(item)\"\n (click)=\"openTask(item)\"\n (keyup.enter)=\"openTask(item)\"\n >\n <td>\n <div\n class=\"inline-flex items-center gap-xs text-dark\"\n [attr.data-tone]=\"priorityTone(item)\"\n >\n <span\n class=\"activities-page__priority-mark h-2.5 w-2.5 shrink-0 rotate-45 rounded-sm\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"fs-sm capitalize\">{{ priorityLabel(item) }}</span>\n </div>\n </td>\n <td>\n <div class=\"grid min-w-0 gap-2xs\">\n <span\n class=\"inline-block min-w-0 max-w-72 truncate fs-sm font-semibold text-dark\"\n [smartTooltip]=\"taskTitle(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >{{ taskTitle(item) }}</span>\n <span\n class=\"inline-block min-w-0 max-w-72\"\n [smartTooltip]=\"categoryLabel(item)\"\n [tooltipOnlyWhenTruncated]=\"true\"\n >\n <ed-badge-2 variant=\"light\" pill uppercase class=\"max-w-full\">\n <span class=\"block truncate text-dark\">{{ categoryLabel(item) }}</span>\n </ed-badge-2>\n </span>\n </div>\n </td>\n <td>\n <div class=\"flex min-w-0 items-center gap-xs\">\n <ed-avatar shape=\"circle\" size=\"base\" initials=\"AI\" tone=\"brand\" />\n <div class=\"grid min-w-0 gap-2xs\">\n <span class=\"fs-sm font-semibold text-dark\">AI Receptionist</span>\n <span class=\"fs-xs text-light\">Voice agent</span>\n </div>\n </div>\n </td>\n <td>\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"meta\">{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"whitespace-nowrap fs-sm text-light\">{{ dueLabel(item) }}</td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else if (activeTab() === 'appointment_booked') {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Appointments\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Provider</th>\n <th class=\"bg-light\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-40\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-24\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative\"\n [class.cursor-pointer]=\"!!item.callId\"\n [attr.role]=\"item.callId ? 'button' : null\"\n [attr.tabindex]=\"item.callId ? (i === 0 ? 0 : -1) : null\"\n [attr.aria-label]=\"item.callId ? 'Open call history' : null\"\n (click)=\"openCallHistory(item.callId, $event)\"\n (keyup.enter)=\"openCallHistory(item.callId)\"\n >\n <td>\n <div class=\"grid min-w-0 justify-items-center gap-2xs\">\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ appointmentDayLabel(item) }}</span>\n <span class=\"fs-xs text-light\">{{ appointmentTimeRange(item) }}</span>\n @if (durationLabel(item); as duration) {\n <ed-badge-2 variant=\"light\" pill uppercase>{{ duration }}</ed-badge-2>\n }\n </div>\n </td>\n <td>\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"meta\">{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td>\n @if (item.providerName) {\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"circle\"\n size=\"base\"\n [initials]=\"providerInitials(item)\"\n [tone]=\"avatarTone(item.providerId || item.providerName, i + 3)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"displayPersonName(item.providerName)\"\n >{{ displayPersonName(item.providerName) }}</span>\n @if (providerSpecialtyLabel(item); as specialty) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"specialty\">{{ specialty }}</span>\n }\n </div>\n </div>\n } @else {\n <span class=\"fs-xs text-light\">No provider assigned</span>\n }\n </td>\n <td>\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"4\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n } @else {\n <table class=\"table-default eds-sticky-table eds-centered-table min-w-5xl w-full\" aria-label=\"Registrations\">\n <thead>\n <tr>\n <th class=\"bg-light\">Date</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">MRN</th>\n <th class=\"bg-light\">Payer</th>\n <th class=\"bg-light\">Insurance</th>\n </tr>\n </thead>\n @if (loading()) {\n <tbody aria-busy=\"true\">\n @for (_ of skeletonRows; track _) {\n <tr>\n <td>\n <div class=\"grid gap-2xs py-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-20\"></ed-skeleton>\n </div>\n </td>\n <td>\n <div class=\"flex items-center gap-xs py-2xs\">\n <ed-skeleton class=\"h-8 w-8 !rounded-md\"></ed-skeleton>\n <div class=\"grid gap-2xs\">\n <ed-skeleton class=\"h-3 w-28\"></ed-skeleton>\n <ed-skeleton class=\"h-3 w-36\"></ed-skeleton>\n </div>\n </div>\n </td>\n <td><ed-skeleton class=\"h-3 w-16\"></ed-skeleton></td>\n <td><ed-skeleton class=\"h-3 w-24\"></ed-skeleton></td>\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <ed-skeleton class=\"h-8 w-8 !rounded-full\"></ed-skeleton>\n </div>\n </td>\n </tr>\n }\n </tbody>\n } @else {\n <tbody>\n @for (item of items(); track item.id; let i = $index) {\n <tr\n class=\"hover-parent relative cursor-pointer\"\n role=\"button\"\n [attr.tabindex]=\"i === 0 ? 0 : -1\"\n [attr.aria-label]=\"'View patient: ' + (item.patientName || 'Unknown patient')\"\n (click)=\"openPatient(item)\"\n (keyup.enter)=\"openPatient(item)\"\n >\n <td>\n <span class=\"whitespace-nowrap fs-sm font-semibold text-dark\">{{ timestampLabel(item) }}</span>\n </td>\n <td>\n <div class=\"eds-caller-cell\">\n <ed-avatar\n shape=\"box\"\n size=\"base\"\n [initials]=\"patientInitials(item)\"\n [tone]=\"avatarTone(item.patientId || item.patientName || item.id, i)\"\n />\n <div class=\"eds-caller-cell__text\">\n <span\n class=\"eds-caller-cell__name fs-sm font-semibold text-dark\"\n [smartTooltip]=\"item.patientName || 'Unknown caller'\"\n >{{ item.patientName || 'Unknown caller' }}</span>\n @if (patientMeta(item); as meta) {\n <span class=\"eds-caller-cell__meta fs-xs text-light\" [smartTooltip]=\"meta\">{{ meta }}</span>\n }\n </div>\n </div>\n </td>\n <td class=\"fs-sm text-body\">{{ displayMrn(item) }}</td>\n <td>\n <span class=\"fs-sm text-dark\">{{ insuranceState(item) === 'covered' ? (item.insuranceName || 'Insured') : '—' }}</span>\n </td>\n <td>\n <span\n class=\"activities-page__insurance inline-flex h-8 w-8 items-center justify-center rounded-full border border-transparent\"\n [attr.data-state]=\"insuranceState(item)\"\n [title]=\"insuranceTitle(item)\"\n [attr.aria-label]=\"insuranceLabel(item)\"\n >\n <ed-icon [name]=\"insuranceIcon(item)\" [size]=\"18\" />\n </span>\n </td>\n </tr>\n } @empty {\n <tr class=\"empty-row\">\n <td colspan=\"5\" class=\"py-lg text-center fs-sm text-light\">{{ emptyLabel() }}</td>\n </tr>\n }\n </tbody>\n }\n </table>\n }\n </div>\n\n @if (!loading() && total() > pageSize) {\n <footer class=\"mt-sm flex shrink-0 flex-wrap items-center justify-between gap-sm border-t border-light pt-sm\">\n <span class=\"fs-sm text-light\">\n Page {{ page() }} of {{ totalPages() }} · {{ total() }} total\n </span>\n <div class=\"flex gap-xs\">\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() <= 1\"\n (click$)=\"prevPage()\"\n >\n Previous\n </ed-button>\n <ed-button\n variant=\"secondary\"\n outline\n size=\"sm\"\n [disabled]=\"page() >= totalPages()\"\n (click$)=\"nextPage()\"\n >\n Next\n </ed-button>\n </div>\n </footer>\n }\n </div>\n }\n</div>\n\n@if (selectedTask(); as task) {\n <eds-task-detail-drawer\n [task]=\"task\"\n (closed)=\"closeTaskDrawer()\"\n (statusChange)=\"onTaskStatusChange($event)\"\n />\n}\n\n@if (selectedPatient(); as patient) {\n <eds-patient-profile-drawer\n [patient]=\"patient\"\n (closed)=\"closePatientDrawer()\"\n />\n}\n"],"names":["calcTotalPages"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, signal, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
-
import { A as AiReceptionistApiService, T as ToastService, t as triggerBlobDownload, I as IconComponent, f as EdButtonComponent, p as EdIconButtonComponent, g as EdSkeletonComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-
|
|
3
|
+
import { A as AiReceptionistApiService, T as ToastService, t as triggerBlobDownload, I as IconComponent, f as EdButtonComponent, p as EdIconButtonComponent, g as EdSkeletonComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CGbyYMbi.mjs';
|
|
4
4
|
|
|
5
5
|
/** Figma pastel palette for horizontal reason bars */
|
|
6
6
|
const REASON_COLORS = ['#DAB2FF', '#A3B3FF', '#FFA1AD', '#74D4FF', 'rgba(255,32,86,0.2)', '#BBF451', '#FFD230'];
|
|
@@ -432,4 +432,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
|
|
|
432
432
|
}] });
|
|
433
433
|
|
|
434
434
|
export { AnalyticsPageComponent };
|
|
435
|
-
//# sourceMappingURL=edvak99-voice-receptionist-widget-analytics-page.component-
|
|
435
|
+
//# sourceMappingURL=edvak99-voice-receptionist-widget-analytics-page.component-DEXdD1mB.mjs.map
|