@edvak99/voice-receptionist-widget 1.1.16 → 1.1.18

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.
Files changed (48) hide show
  1. package/README.md +35 -6
  2. package/fesm2022/{edvak99-voice-receptionist-widget-activities-page.component-Bm214HFw.mjs → edvak99-voice-receptionist-widget-activities-page.component-DXbsWGi5.mjs} +3 -3
  3. package/fesm2022/{edvak99-voice-receptionist-widget-activities-page.component-Bm214HFw.mjs.map → edvak99-voice-receptionist-widget-activities-page.component-DXbsWGi5.mjs.map} +1 -1
  4. package/fesm2022/{edvak99-voice-receptionist-widget-analytics-page.component-CzXfb14B.mjs → edvak99-voice-receptionist-widget-analytics-page.component-h8RlfARS.mjs} +2 -2
  5. package/fesm2022/{edvak99-voice-receptionist-widget-analytics-page.component-CzXfb14B.mjs.map → edvak99-voice-receptionist-widget-analytics-page.component-h8RlfARS.mjs.map} +1 -1
  6. package/fesm2022/{edvak99-voice-receptionist-widget-audit-page.component-Bi0j2GuP.mjs → edvak99-voice-receptionist-widget-audit-page.component-uAxvMScI.mjs} +2 -2
  7. package/fesm2022/{edvak99-voice-receptionist-widget-audit-page.component-Bi0j2GuP.mjs.map → edvak99-voice-receptionist-widget-audit-page.component-uAxvMScI.mjs.map} +1 -1
  8. package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-CALjdnGA.mjs +421 -0
  9. package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-CALjdnGA.mjs.map +1 -0
  10. package/fesm2022/{edvak99-voice-receptionist-widget-call-history-page.component-DidCHII_.mjs → edvak99-voice-receptionist-widget-call-history-page.component-DdT68am3.mjs} +3 -3
  11. package/fesm2022/{edvak99-voice-receptionist-widget-call-history-page.component-DidCHII_.mjs.map → edvak99-voice-receptionist-widget-call-history-page.component-DdT68am3.mjs.map} +1 -1
  12. package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-B5Yj11op.mjs → edvak99-voice-receptionist-widget-call-recording-player.component-Bc2Gs6Ja.mjs} +2 -2
  13. package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-B5Yj11op.mjs.map → edvak99-voice-receptionist-widget-call-recording-player.component-Bc2Gs6Ja.mjs.map} +1 -1
  14. package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-COZuwD1x.mjs → edvak99-voice-receptionist-widget-call-review.service-Ba6KmQ1Z.mjs} +2 -2
  15. package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-COZuwD1x.mjs.map → edvak99-voice-receptionist-widget-call-review.service-Ba6KmQ1Z.mjs.map} +1 -1
  16. package/fesm2022/{edvak99-voice-receptionist-widget-dashboard-page.component-AVQ51v58.mjs → edvak99-voice-receptionist-widget-dashboard-page.component-BVGlZi0N.mjs} +2 -2
  17. package/fesm2022/{edvak99-voice-receptionist-widget-dashboard-page.component-AVQ51v58.mjs.map → edvak99-voice-receptionist-widget-dashboard-page.component-BVGlZi0N.mjs.map} +1 -1
  18. package/fesm2022/{edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-0o1j7Y29.mjs → edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMDPJ_FP.mjs} +64 -26
  19. package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMDPJ_FP.mjs.map +1 -0
  20. package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-0owsmmRn.mjs → edvak99-voice-receptionist-widget-live-calls-page.component-Cx97MUaj.mjs} +2 -2
  21. package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-0owsmmRn.mjs.map → edvak99-voice-receptionist-widget-live-calls-page.component-Cx97MUaj.mjs.map} +1 -1
  22. package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-Dz7gSC71.mjs → edvak99-voice-receptionist-widget-live-monitor-page.component-BhuYJShf.mjs} +7 -28
  23. package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-BhuYJShf.mjs.map +1 -0
  24. package/fesm2022/{edvak99-voice-receptionist-widget-outbound-purposes-page.component-CqKM1bnx.mjs → edvak99-voice-receptionist-widget-outbound-purposes-page.component-DZN6vs2I.mjs} +2 -2
  25. package/fesm2022/{edvak99-voice-receptionist-widget-outbound-purposes-page.component-CqKM1bnx.mjs.map → edvak99-voice-receptionist-widget-outbound-purposes-page.component-DZN6vs2I.mjs.map} +1 -1
  26. package/fesm2022/{edvak99-voice-receptionist-widget-task-detail-drawer.component-DjgxIQ-I.mjs → edvak99-voice-receptionist-widget-task-detail-drawer.component-snajggxV.mjs} +2 -2
  27. package/fesm2022/{edvak99-voice-receptionist-widget-task-detail-drawer.component-DjgxIQ-I.mjs.map → edvak99-voice-receptionist-widget-task-detail-drawer.component-snajggxV.mjs.map} +1 -1
  28. package/fesm2022/{edvak99-voice-receptionist-widget-tasks-page.component-WlFkE3X2.mjs → edvak99-voice-receptionist-widget-tasks-page.component-B_Cj4GoK.mjs} +3 -3
  29. package/fesm2022/{edvak99-voice-receptionist-widget-tasks-page.component-WlFkE3X2.mjs.map → edvak99-voice-receptionist-widget-tasks-page.component-B_Cj4GoK.mjs.map} +1 -1
  30. package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-l-GeQGr_.mjs → edvak99-voice-receptionist-widget-wizard-page.component-DNOsMY-3.mjs} +2 -2
  31. package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-l-GeQGr_.mjs.map → edvak99-voice-receptionist-widget-wizard-page.component-DNOsMY-3.mjs.map} +1 -1
  32. package/fesm2022/edvak99-voice-receptionist-widget.mjs +1 -1
  33. package/lib/components/live-transcript-panel/live-transcript-panel.component.d.ts +1 -5
  34. package/lib/layout/eds-module-nav.component.d.ts +2 -0
  35. package/lib/models/ai-receptionist.types.d.ts +2 -0
  36. package/lib/pages/live-monitor-page/live-monitor-page.component.d.ts +0 -2
  37. package/lib/services/ai-receptionist-api.mappers.d.ts +7 -1
  38. package/package.json +3 -1
  39. package/src/assets/css/Ed_style.scss +0 -202
  40. package/src/assets/icons/phone_disabled.svg +6 -0
  41. package/src/styles.scss +7 -56
  42. package/styles/_index.scss +8 -4
  43. package/styles/embed.scss +297 -0
  44. package/styles/standalone.scss +4 -0
  45. package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-KwlQsTMk.mjs +0 -421
  46. package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-KwlQsTMk.mjs.map +0 -1
  47. package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-0o1j7Y29.mjs.map +0 -1
  48. package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-Dz7gSC71.mjs.map +0 -1
package/README.md CHANGED
@@ -61,20 +61,45 @@ provideVoiceReceptionist({
61
61
 
62
62
  ## Styles & fonts
63
63
 
64
- Load styles **once** in the host global stylesheet (not in individual components):
64
+ Load styles **once** in the host global stylesheet (not in individual components). Pick the entry that matches the host:
65
+
66
+ **EHR / embed** — widget-only CSS. Do **not** import the full styles entry; it re-imports Tailwind utilities and an EHR design-system clone (`_input`, buttons, tables, fonts, `body` rules) and will override host utilities such as `.pl-7`.
67
+
68
+ ```scss
69
+ @use '@edvak99/voice-receptionist-widget/styles/embed';
70
+ ```
71
+
72
+ That file (`styles/embed.scss`) has the EHR `#content-area` shell bridge, overlay/drawer helpers, and `vr-*` / live-monitor classes only.
73
+
74
+ **Standalone Voice Hub / demo** — full design system (Tailwind + EHR asset CSS + embed extras):
65
75
 
66
76
  ```scss
67
77
  @use '@edvak99/voice-receptionist-widget/styles';
78
+ // or: @use '@edvak99/voice-receptionist-widget/styles/standalone';
79
+ ```
80
+
81
+ **Tailwind:** the host must include this package’s templates in `content` so utilities used only in the widget (overlays, `z-[100100]`, spacing) are generated:
82
+
83
+ ```js
84
+ content: [
85
+ // …host paths
86
+ './node_modules/@edvak99/voice-receptionist-widget/**/*.{html,ts,js,scss}',
87
+ ],
68
88
  ```
69
89
 
70
- That package entry (`styles/_index.scss`) loads [`src/styles.scss`](src/styles.scss), which pulls:
90
+ **Icons:** `<ed-icon name="…">` loads `/assets/icons/{name}.svg`. EHR already serves its own icon set; add a mapping if a widget icon is missing from the host (for example `phone_disabled`):
71
91
 
72
- 1. Tailwind base/components/utilities (host or this package must process Tailwind)
73
- 2. Design-system assets under `src/assets/` (fonts, `_root` tokens, forms, buttons, badges, layout, icons, …)
92
+ ```json
93
+ {
94
+ "glob": "**/*",
95
+ "input": "node_modules/@edvak99/voice-receptionist-widget/src/assets/icons",
96
+ "output": "/assets/icons"
97
+ }
98
+ ```
74
99
 
75
100
  Also load **Material Symbols** in the host `index.html` if icons fall back to that font (ehr_frontend already does this).
76
101
 
77
- **Custom Elements / Shoelace:** CE styles (`custom-elements`, `shoelace-edit`, `badge`, `_root`) ship in this package. The host must provide Shoelace base theme the same way as ehr_frontend (`<html class="sl-theme-default">` + Shoelace `light.css` CDN in `index.html`). EHR embed already has this; standalone demo mirrors it in `projects/demo/src/index.html`. Use `CUSTOM_ELEMENTS_SCHEMA` on components that render `ed-*` or `sl-*` tags (ehr_frontend `app.component.ts` pattern).
102
+ **Custom Elements / Shoelace:** CE styles (`custom-elements`, `shoelace-edit`, `badge`, `_root`) ship in the **standalone** styles entry. The host must provide Shoelace base theme the same way as ehr_frontend (`<html class="sl-theme-default">` + Shoelace `light.css` CDN in `index.html`). EHR embed already has this; standalone demo mirrors it in `projects/demo/src/index.html`. Use `CUSTOM_ELEMENTS_SCHEMA` on components that render `ed-*` or `sl-*` tags (ehr_frontend `app.component.ts` pattern).
78
103
 
79
104
  ### Local scripts
80
105
 
@@ -102,9 +127,13 @@ For active widget development against an EHR or Voice Hub host, point the host `
102
127
 
103
128
  Adjust `../` so it resolves from the host app root.
104
129
 
105
- **Styles (required):** TypeScript `paths` do not apply to Sass. Use npm styles after publish:
130
+ **Styles (required):** TypeScript `paths` do not apply to Sass. Use the npm style entry after publish:
106
131
 
107
132
  ```scss
133
+ // EHR / embed
134
+ @use '@edvak99/voice-receptionist-widget/styles/embed';
135
+
136
+ // Standalone Voice Hub
108
137
  @use '@edvak99/voice-receptionist-widget/styles';
109
138
  ```
110
139
 
@@ -2,8 +2,8 @@ import * as i0 from '@angular/core';
2
2
  import { input, output, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';
3
3
  import { RouterLink, ActivatedRoute, Router } from '@angular/router';
4
4
  import { DatePipe } from '@angular/common';
5
- import { E as EdAvatarComponent, o as EdIconButtonComponent, q as ViewportPortalDirective, I as IconComponent, A as AiReceptionistApiService, m as DEFAULT_PAGE_SIZE, n as totalPages, b as ageFromDob, s as initialsFromName, f as EdButtonComponent, g as EdSkeletonComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-0o1j7Y29.mjs';
6
- import { T as TaskDetailDrawerComponent } from './edvak99-voice-receptionist-widget-task-detail-drawer.component-DjgxIQ-I.mjs';
5
+ import { E as EdAvatarComponent, o as EdIconButtonComponent, q as ViewportPortalDirective, I as IconComponent, A as AiReceptionistApiService, m as DEFAULT_PAGE_SIZE, n as totalPages, b as ageFromDob, s as initialsFromName, f as EdButtonComponent, g as EdSkeletonComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMDPJ_FP.mjs';
6
+ import { T as TaskDetailDrawerComponent } from './edvak99-voice-receptionist-widget-task-detail-drawer.component-snajggxV.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';
@@ -507,4 +507,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
507
507
  }] });
508
508
 
509
509
  export { ActivitiesPageComponent };
510
- //# sourceMappingURL=edvak99-voice-receptionist-widget-activities-page.component-Bm214HFw.mjs.map
510
+ //# sourceMappingURL=edvak99-voice-receptionist-widget-activities-page.component-DXbsWGi5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"edvak99-voice-receptionist-widget-activities-page.component-Bm214HFw.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 input,\n output,\n} from '@angular/core';\nimport { RouterLink } 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 RouterLink,\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 readonly patient = input.required<AgentActivity>();\n\n readonly closed = output<void>();\n\n protected close(): void {\n this.closed.emit();\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 <a\n [routerLink]=\"['../history', patient().callId]\"\n class=\"text-sm font-medium text-blue-600 no-underline hover:underline\"\n (click)=\"close()\"\n >\n {{ patient().callId }}\n </a>\n </div>\n </section>\n }\n </ed-drawer-body>\n </ed-drawer>\n</div>\n","import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, 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 { EdIconButtonComponent } from '../../ui/ed-icon-button.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 EdIconButtonComponent,\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 {\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\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 protected applySearch(): void {\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 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=\"flex items-start justify-between gap-base\">\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)=\"search.set($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 <ed-icon-button\n name=\"filter_alt\"\n label=\"Filters\"\n outline\n (click)=\"applySearch()\"/>\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 p-base\">\n <div class=\"min-h-0 min-w-0 flex-1 overflow-auto\">\n @if (activeTab() === 'task_created') {\n <table class=\"table-default relative min-w-5xl w-full\" aria-label=\"Tasks\">\n <thead class=\"sticky top-0 z-[1] bg-light\">\n <tr>\n <th class=\"bg-light\">Priority</th>\n <th class=\"bg-light\">Task</th>\n <th class=\"bg-light\">Assigned to</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Due</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=\"primary\" pill uppercase class=\"max-w-full\">\n <span class=\"block truncate\">{{ 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 relative min-w-5xl w-full\" aria-label=\"Appointments\">\n <thead class=\"sticky top-0 z-[1] bg-light\">\n <tr>\n <th class=\"bg-light\">When</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 ? 'link' : 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 relative min-w-5xl w-full\" aria-label=\"Registrations\">\n <thead class=\"sticky top-0 z-[1] bg-light\">\n <tr>\n <th class=\"bg-light\">When</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-primary\">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() }} · {{ 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
+ {"version":3,"file":"edvak99-voice-receptionist-widget-activities-page.component-DXbsWGi5.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 input,\n output,\n} from '@angular/core';\nimport { RouterLink } 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 RouterLink,\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 readonly patient = input.required<AgentActivity>();\n\n readonly closed = output<void>();\n\n protected close(): void {\n this.closed.emit();\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 <a\n [routerLink]=\"['../history', patient().callId]\"\n class=\"text-sm font-medium text-blue-600 no-underline hover:underline\"\n (click)=\"close()\"\n >\n {{ patient().callId }}\n </a>\n </div>\n </section>\n }\n </ed-drawer-body>\n </ed-drawer>\n</div>\n","import { ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, 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 { EdIconButtonComponent } from '../../ui/ed-icon-button.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 EdIconButtonComponent,\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 {\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\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 protected applySearch(): void {\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 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=\"flex items-start justify-between gap-base\">\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)=\"search.set($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 <ed-icon-button\n name=\"filter_alt\"\n label=\"Filters\"\n outline\n (click)=\"applySearch()\"/>\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 p-base\">\n <div class=\"min-h-0 min-w-0 flex-1 overflow-auto\">\n @if (activeTab() === 'task_created') {\n <table class=\"table-default relative min-w-5xl w-full\" aria-label=\"Tasks\">\n <thead class=\"sticky top-0 z-[1] bg-light\">\n <tr>\n <th class=\"bg-light\">Priority</th>\n <th class=\"bg-light\">Task</th>\n <th class=\"bg-light\">Assigned to</th>\n <th class=\"bg-light\">Patient / Caller</th>\n <th class=\"bg-light\">Due</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=\"primary\" pill uppercase class=\"max-w-full\">\n <span class=\"block truncate\">{{ 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 relative min-w-5xl w-full\" aria-label=\"Appointments\">\n <thead class=\"sticky top-0 z-[1] bg-light\">\n <tr>\n <th class=\"bg-light\">When</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 ? 'link' : 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 relative min-w-5xl w-full\" aria-label=\"Registrations\">\n <thead class=\"sticky top-0 z-[1] bg-light\">\n <tr>\n <th class=\"bg-light\">When</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-primary\">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() }} · {{ 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, I as IconComponent, f as EdButtonComponent, o as EdIconButtonComponent, g as EdSkeletonComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-0o1j7Y29.mjs';
3
+ import { A as AiReceptionistApiService, I as IconComponent, f as EdButtonComponent, o as EdIconButtonComponent, g as EdSkeletonComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMDPJ_FP.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'];
@@ -360,4 +360,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
360
360
  }] });
361
361
 
362
362
  export { AnalyticsPageComponent };
363
- //# sourceMappingURL=edvak99-voice-receptionist-widget-analytics-page.component-CzXfb14B.mjs.map
363
+ //# sourceMappingURL=edvak99-voice-receptionist-widget-analytics-page.component-h8RlfARS.mjs.map