@edvak99/voice-receptionist-widget 1.1.2 → 1.1.3
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/README.md +3 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-analytics-page.component-CW5OKmik.mjs → edvak99-voice-receptionist-widget-analytics-page.component-Dsujn5az.mjs} +4 -4
- package/fesm2022/{edvak99-voice-receptionist-widget-analytics-page.component-CW5OKmik.mjs.map → edvak99-voice-receptionist-widget-analytics-page.component-Dsujn5az.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-xoLlHj8K.mjs +67 -0
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-xoLlHj8K.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-history-detail-page.component-CTwfUHUf.mjs → edvak99-voice-receptionist-widget-call-history-detail-page.component-2K9W77As.mjs} +11 -11
- package/fesm2022/{edvak99-voice-receptionist-widget-call-history-detail-page.component-CTwfUHUf.mjs.map → edvak99-voice-receptionist-widget-call-history-detail-page.component-2K9W77As.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs → edvak99-voice-receptionist-widget-call-history-page.component-B5AnEjoh.mjs} +62 -26
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-B5AnEjoh.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-AN6GcSDq.mjs → edvak99-voice-receptionist-widget-call-recording-player.component-B8_qp7Fe.mjs} +4 -4
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-AN6GcSDq.mjs.map → edvak99-voice-receptionist-widget-call-recording-player.component-B8_qp7Fe.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-Cy_Bf7AO.mjs → edvak99-voice-receptionist-widget-call-review.service-Cj2XTeK4.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-Cy_Bf7AO.mjs.map → edvak99-voice-receptionist-widget-call-review.service-Cj2XTeK4.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.util-DQLIw7xb.mjs → edvak99-voice-receptionist-widget-call-review.util-BgsBCKgZ.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.util-DQLIw7xb.mjs.map → edvak99-voice-receptionist-widget-call-review.util-BgsBCKgZ.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-dashboard-page.component-DzdIt2A7.mjs → edvak99-voice-receptionist-widget-dashboard-page.component-BNdnbAVM.mjs} +10 -10
- package/fesm2022/{edvak99-voice-receptionist-widget-dashboard-page.component-DzdIt2A7.mjs.map → edvak99-voice-receptionist-widget-dashboard-page.component-BNdnbAVM.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-avatar.component-PCnIWeOA.mjs → edvak99-voice-receptionist-widget-eds-avatar.component-CbphhP6o.mjs} +3 -3
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-avatar.component-PCnIWeOA.mjs.map → edvak99-voice-receptionist-widget-eds-avatar.component-CbphhP6o.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-elapsed.pipe-ouRlPpwT.mjs → edvak99-voice-receptionist-widget-eds-elapsed.pipe-BgLsnq6A.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-elapsed.pipe-ouRlPpwT.mjs.map → edvak99-voice-receptionist-widget-eds-elapsed.pipe-BgLsnq6A.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMhknpGf.mjs → edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-Dn0GrZ6_.mjs} +106 -48
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-Dn0GrZ6_.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-knowledge-hub.page-cZqBuull.mjs → edvak99-voice-receptionist-widget-knowledge-hub.page-BngGx_Lc.mjs} +70 -36
- package/fesm2022/edvak99-voice-receptionist-widget-knowledge-hub.page-BngGx_Lc.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-list.service-CDtFRW8w.mjs → edvak99-voice-receptionist-widget-live-calls-list.service-0kGWO6sh.mjs} +3 -3
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-list.service-CDtFRW8w.mjs.map → edvak99-voice-receptionist-widget-live-calls-list.service-0kGWO6sh.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-DrYzXJQW.mjs → edvak99-voice-receptionist-widget-live-calls-page.component-DfLmK89M.mjs} +7 -7
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-DrYzXJQW.mjs.map → edvak99-voice-receptionist-widget-live-calls-page.component-DfLmK89M.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-D7dlk0y2.mjs → edvak99-voice-receptionist-widget-live-monitor-page.component-DNpLFqBw.mjs} +11 -11
- package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-D7dlk0y2.mjs.map → edvak99-voice-receptionist-widget-live-monitor-page.component-DNpLFqBw.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-outbound-purposes-page.component-CJ8NEjcj.mjs → edvak99-voice-receptionist-widget-outbound-purposes-page.component-CYSZ832p.mjs} +6 -6
- package/fesm2022/{edvak99-voice-receptionist-widget-outbound-purposes-page.component-CJ8NEjcj.mjs.map → edvak99-voice-receptionist-widget-outbound-purposes-page.component-CYSZ832p.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-settings-page.component-Bo3XNK3b.mjs → edvak99-voice-receptionist-widget-settings-page.component-B9nv6wtB.mjs} +4 -4
- package/fesm2022/{edvak99-voice-receptionist-widget-settings-page.component-Bo3XNK3b.mjs.map → edvak99-voice-receptionist-widget-settings-page.component-B9nv6wtB.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-tasks-page.component-CBwl15NP.mjs → edvak99-voice-receptionist-widget-tasks-page.component-DXxjMVUv.mjs} +40 -11
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-DXxjMVUv.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-CJLa5pia.mjs → edvak99-voice-receptionist-widget-wizard-page.component-C1Z6yC0q.mjs} +4 -4
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-CJLa5pia.mjs.map → edvak99-voice-receptionist-widget-wizard-page.component-C1Z6yC0q.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget.mjs +1 -1
- package/lib/knowledge/models/practice-faq.model.d.ts +3 -0
- package/lib/knowledge/pages/knowledge-hub.page.d.ts +8 -1
- package/lib/knowledge/services/practice-faq-api.service.d.ts +6 -2
- package/lib/models/ai-receptionist.types.d.ts +1 -0
- package/lib/models/pagination.d.ts +11 -0
- package/lib/pages/audit-page/audit-page.component.d.ts +7 -0
- package/lib/pages/call-history-page/call-history-page.component.d.ts +7 -3
- package/lib/pages/tasks-page/tasks-page.component.d.ts +6 -0
- package/lib/services/ai-receptionist-api.mock.d.ts +10 -9
- package/lib/services/ai-receptionist-api.service.d.ts +9 -9
- package/package.json +1 -1
- package/styles/_index.scss +5 -40
- package/styles/chat-ui.scss +18 -18
- package/styles/eds.scss +135 -95
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs +0 -35
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMhknpGf.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-knowledge-hub.page-cZqBuull.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-CBwl15NP.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edvak99-voice-receptionist-widget-tasks-page.component-DXxjMVUv.mjs","sources":["../../../projects/voice-receptionist-widget/src/lib/shared/copy-button.component.ts","../../../projects/voice-receptionist-widget/src/lib/components/task-detail-drawer/task-detail-drawer.component.ts","../../../projects/voice-receptionist-widget/src/lib/components/task-detail-drawer/task-detail-drawer.component.html","../../../projects/voice-receptionist-widget/src/lib/pages/tasks-page/tasks-page.component.ts","../../../projects/voice-receptionist-widget/src/lib/pages/tasks-page/tasks-page.component.html"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Input,\n inject,\n signal,\n} from '@angular/core';\n\nimport { ToastService } from './toast.service';\n\n@Component({\n selector: 'app-copy-btn',\n standalone: true,\n template: `\n @if (copyValue) {\n <button\n type=\"button\"\n class=\"copy-btn\"\n (click)=\"onCopy($event)\"\n [attr.aria-label]=\"ariaLabel\"\n [title]=\"copied() ? 'Copied' : 'Copy to clipboard'\"\n >\n @if (copied()) {\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n } @else {\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n }\n </button>\n }\n `,\n styleUrl: './copy-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CopyButtonComponent {\n /** Raw value to copy (full ID / phone / etc.) */\n @Input() value: string | null | undefined = '';\n /** Accessible label, e.g. \"patient ID\" */\n @Input() label = 'value';\n\n private readonly toast = inject(ToastService);\n\n protected readonly copied = signal(false);\n\n protected get copyValue(): string {\n const v = this.value?.trim();\n return v && v !== '—' ? v : '';\n }\n\n protected get ariaLabel(): string {\n return this.copied() ? 'Copied' : `Copy ${this.label}`;\n }\n\n async onCopy(event: MouseEvent): Promise<void> {\n event.stopPropagation();\n const text = this.copyValue;\n if (!text) return;\n\n try {\n await navigator.clipboard.writeText(text);\n this.copied.set(true);\n setTimeout(() => this.copied.set(false), 1500);\n } catch {\n this.toast.show('Could not copy — clipboard unavailable', 'error', 2500);\n }\n }\n}\n","import { DatePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nimport { TaskItem, TaskStatus } from '../../models/ai-receptionist.types';\nimport { CopyButtonComponent } from '../../shared/copy-button.component';\nimport { EdsBadgeComponent } from '../../ui/eds-badge.component';\nimport { EdsButtonComponent } from '../../ui/eds-button.component';\nimport { EdsIconComponent } from '../../ui/eds-icon.component';\nimport {\n taskCallRoute,\n taskPriorityLabel,\n taskPriorityTone,\n taskSourceLabel,\n taskStatusLabel,\n taskStatusTone,\n taskTypeTone,\n} from '../../utils/task.util';\n\n@Component({\n selector: 'eds-task-detail-drawer',\n imports: [\n DatePipe,\n RouterLink,\n CopyButtonComponent,\n EdsBadgeComponent,\n EdsButtonComponent,\n EdsIconComponent,\n ],\n templateUrl: './task-detail-drawer.component.html',\n styleUrl: './task-detail-drawer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TaskDetailDrawerComponent {\n readonly task = input.required<TaskItem>();\n\n readonly closed = output<void>();\n readonly statusChange = output<TaskStatus>();\n\n protected readonly taskStatusLabel = taskStatusLabel;\n protected readonly taskStatusTone = taskStatusTone;\n protected readonly taskPriorityLabel = taskPriorityLabel;\n protected readonly taskPriorityTone = taskPriorityTone;\n protected readonly taskSourceLabel = taskSourceLabel;\n protected readonly taskTypeTone = taskTypeTone;\n protected readonly taskCallRoute = taskCallRoute;\n\n protected close(): void {\n this.closed.emit();\n }\n\n protected markDone(): void {\n const t = this.task();\n this.statusChange.emit(t.status === 'done' ? 'open' : 'done');\n }\n\n protected onBackdropClick(event: MouseEvent): void {\n if (event.target === event.currentTarget) this.close();\n }\n}\n","<div class=\"task-drawer__backdrop\" (click)=\"onBackdropClick($event)\">\n <aside class=\"task-drawer\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"task().title\">\n <header class=\"task-drawer__head\">\n <div>\n <eds-badge [tone]=\"taskTypeTone(task().type)\">{{ task().type }}</eds-badge>\n <h2 class=\"task-drawer__title\">{{ task().title }}</h2>\n </div>\n <button type=\"button\" class=\"task-drawer__close\" (click)=\"close()\" aria-label=\"Close\">\n <eds-icon name=\"close\" [size]=\"22\" />\n </button>\n </header>\n\n <div class=\"task-drawer__body\">\n <section class=\"task-drawer__section\">\n <h3 class=\"eds-label\">Description</h3>\n <p class=\"task-drawer__description\">{{ task().description || '—' }}</p>\n </section>\n\n <dl class=\"task-drawer__meta\">\n <div>\n <dt class=\"eds-label\">Patient</dt>\n <dd>{{ task().patient }}</dd>\n </div>\n <div>\n <dt class=\"eds-label\">Assignee</dt>\n <dd>{{ task().assignee }}</dd>\n </div>\n <div>\n <dt class=\"eds-label\">Status</dt>\n <dd><eds-badge [tone]=\"taskStatusTone(task().status)\">{{ taskStatusLabel(task().status) }}</eds-badge></dd>\n </div>\n <div>\n <dt class=\"eds-label\">Priority</dt>\n <dd><eds-badge [tone]=\"taskPriorityTone(task().priority)\">{{ taskPriorityLabel(task().priority) }}</eds-badge></dd>\n </div>\n <div>\n <dt class=\"eds-label\">Source</dt>\n <dd>{{ taskSourceLabel(task().source) }}</dd>\n </div>\n <div>\n <dt class=\"eds-label\">Created</dt>\n <dd>{{ task().created | date: 'medium' }}</dd>\n </div>\n <div>\n <dt class=\"eds-label\">Call</dt>\n <dd>\n @if (task().callId) {\n <a [routerLink]=\"taskCallRoute(task().callId!)\" class=\"task-drawer__link\">{{ task().callId }}</a>\n } @else {\n —\n }\n </dd>\n </div>\n </dl>\n\n @if (task().edvakTaskId || task().edvakStatus || task().medicationName || task().medicationId) {\n <section class=\"task-drawer__section task-drawer__section--edvak\">\n <h3 class=\"eds-label\">Edvak / refill details</h3>\n <dl class=\"task-drawer__meta\">\n @if (task().edvakTaskId) {\n <div>\n <dt class=\"eds-label\">Edvak task ID</dt>\n <dd class=\"task-drawer__copy-row\">\n <code>{{ task().edvakTaskId }}</code>\n <app-copy-btn [value]=\"task().edvakTaskId\" label=\"Edvak task ID\" />\n </dd>\n </div>\n }\n @if (task().edvakStatus) {\n <div>\n <dt class=\"eds-label\">Edvak status</dt>\n <dd><eds-badge tone=\"brand\">{{ task().edvakStatus }}</eds-badge></dd>\n </div>\n }\n @if (task().medicationName) {\n <div>\n <dt class=\"eds-label\">Medication</dt>\n <dd>{{ task().medicationName }}</dd>\n </div>\n }\n @if (task().medicationId) {\n <div>\n <dt class=\"eds-label\">Medication ID</dt>\n <dd class=\"task-drawer__copy-row\">\n <code>{{ task().medicationId }}</code>\n <app-copy-btn [value]=\"task().medicationId\" label=\"medication ID\" />\n </dd>\n </div>\n }\n </dl>\n </section>\n }\n </div>\n\n <footer class=\"task-drawer__foot\">\n <eds-button variant=\"secondary\" type=\"button\" (click)=\"markDone()\">\n {{ task().status === 'done' ? 'Reopen task' : 'Mark done' }}\n </eds-button>\n </footer>\n </aside>\n</div>\n","import { DatePipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n OnInit,\n signal,\n} from '@angular/core';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\n\nimport { TaskDetailDrawerComponent } from '../../components/task-detail-drawer/task-detail-drawer.component';\nimport {\n TaskFilters,\n TaskItem,\n TaskSource,\n TaskStatus,\n} from '../../models/ai-receptionist.types';\nimport { DEFAULT_PAGE_SIZE, totalPages as calcTotalPages } from '../../models/pagination';\nimport { AiReceptionistApiService } from '../../services/ai-receptionist-api.service';\nimport { EdsBadgeComponent } from '../../ui/eds-badge.component';\nimport { EdsButtonComponent } from '../../ui/eds-button.component';\nimport {\n TASK_TYPE_OPTIONS,\n taskCallRoute,\n taskPriorityTone,\n taskSourceLabel,\n taskStatusLabel,\n taskStatusTone,\n taskTypeTone,\n} from '../../utils/task.util';\n\n@Component({\n selector: 'eds-tasks-page',\n imports: [\n DatePipe,\n RouterLink,\n EdsBadgeComponent,\n EdsButtonComponent,\n TaskDetailDrawerComponent,\n ],\n templateUrl: './tasks-page.component.html',\n styleUrl: './tasks-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TasksPageComponent implements OnInit {\n private readonly api = inject(AiReceptionistApiService);\n private readonly route = inject(ActivatedRoute);\n\n protected readonly pageSize = DEFAULT_PAGE_SIZE;\n protected readonly tasks = signal<TaskItem[]>([]);\n protected readonly total = signal(0);\n protected readonly page = signal(1);\n protected readonly loading = signal(true);\n protected readonly selectedTask = signal<TaskItem | null>(null);\n\n protected readonly statusFilter = signal<'' | TaskStatus>('');\n protected readonly typeFilter = signal('');\n protected readonly sourceFilter = signal<'' | TaskSource>('');\n protected readonly callIdFilter = signal('');\n\n protected readonly typeOptions = TASK_TYPE_OPTIONS;\n protected readonly taskStatusLabel = taskStatusLabel;\n protected readonly taskStatusTone = taskStatusTone;\n protected readonly taskPriorityTone = taskPriorityTone;\n protected readonly taskSourceLabel = taskSourceLabel;\n protected readonly taskTypeTone = taskTypeTone;\n protected readonly taskCallRoute = taskCallRoute;\n\n protected readonly hasActiveFilters = computed(\n () =>\n !!this.statusFilter() ||\n !!this.typeFilter() ||\n !!this.sourceFilter() ||\n !!this.callIdFilter(),\n );\n\n ngOnInit(): void {\n const callId = this.route.snapshot.queryParamMap.get('callId') ?? '';\n if (callId) this.callIdFilter.set(callId);\n this.load();\n }\n\n protected setStatusFilter(value: string): void {\n this.statusFilter.set(value as '' | TaskStatus);\n this.page.set(1);\n this.load();\n }\n\n protected setTypeFilter(value: string): void {\n this.typeFilter.set(value);\n this.page.set(1);\n this.load();\n }\n\n protected setSourceFilter(value: string): void {\n this.sourceFilter.set(value as '' | TaskSource);\n this.page.set(1);\n this.load();\n }\n\n protected setCallIdFilter(value: string): void {\n this.callIdFilter.set(value);\n this.page.set(1);\n this.load();\n }\n\n protected clearFilters(): void {\n this.statusFilter.set('');\n this.typeFilter.set('');\n this.sourceFilter.set('');\n this.callIdFilter.set('');\n this.page.set(1);\n this.load();\n }\n\n protected openTask(task: TaskItem): void {\n this.selectedTask.set(task);\n }\n\n protected closeDrawer(): void {\n this.selectedTask.set(null);\n }\n\n protected onStatusChange(status: TaskStatus): void {\n const task = this.selectedTask();\n if (!task) return;\n this.api.patchTask(task.id, status).subscribe(({ data }) => {\n if (data) {\n this.selectedTask.set(data);\n this.tasks.update((rows) => rows.map((r) => (r.id === data.id ? data : r)));\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 private load(): void {\n this.loading.set(true);\n const filters: TaskFilters = {\n page: this.page(),\n limit: DEFAULT_PAGE_SIZE,\n };\n if (this.statusFilter()) filters.status = this.statusFilter() as TaskStatus;\n if (this.typeFilter()) filters.type = this.typeFilter();\n if (this.sourceFilter()) filters.source = this.sourceFilter() as TaskSource;\n if (this.callIdFilter().trim()) filters.callId = this.callIdFilter().trim();\n\n this.api.getTasks(filters).subscribe({\n next: ({ items, total, page }) => {\n this.tasks.set(items);\n this.total.set(total);\n this.page.set(page);\n this.loading.set(false);\n },\n error: () => this.loading.set(false),\n });\n }\n}\n","<div class=\"eds-page tasks-page\">\n <header class=\"tasks-page__header\">\n <div>\n <h1 class=\"eds-h1\">Tasks & follow-ups</h1>\n <p class=\"eds-body-sm\">Action items from calls — all types, not just refills</p>\n </div>\n </header>\n\n <section class=\"list-section\">\n <div class=\"list-toolbar\">\n <div class=\"filter-group\">\n <label for=\"task-status\">Status</label>\n <select\n id=\"task-status\"\n class=\"filter-input\"\n [value]=\"statusFilter()\"\n (change)=\"setStatusFilter($any($event.target).value)\"\n >\n <option value=\"\">All</option>\n <option value=\"open\">Open</option>\n <option value=\"in_progress\">In progress</option>\n <option value=\"done\">Done</option>\n </select>\n </div>\n <div class=\"filter-group\">\n <label for=\"task-type\">Type</label>\n <select\n id=\"task-type\"\n class=\"filter-input\"\n [value]=\"typeFilter()\"\n (change)=\"setTypeFilter($any($event.target).value)\"\n >\n <option value=\"\">All types</option>\n @for (t of typeOptions; track t) {\n <option [value]=\"t\">{{ t }}</option>\n }\n </select>\n </div>\n <div class=\"filter-group\">\n <label for=\"task-source\">Source</label>\n <select\n id=\"task-source\"\n class=\"filter-input\"\n [value]=\"sourceFilter()\"\n (change)=\"setSourceFilter($any($event.target).value)\"\n >\n <option value=\"\">All sources</option>\n <option value=\"voice\">Voice</option>\n <option value=\"sync\">Sync</option>\n <option value=\"manual\">Manual</option>\n </select>\n </div>\n <div class=\"filter-group\">\n <label for=\"task-call\">Call ID</label>\n <input\n id=\"task-call\"\n type=\"text\"\n class=\"filter-input\"\n [value]=\"callIdFilter()\"\n placeholder=\"Filter by call\"\n (change)=\"setCallIdFilter($any($event.target).value)\"\n />\n </div>\n @if (hasActiveFilters()) {\n <button type=\"button\" class=\"link-btn\" (click)=\"clearFilters()\">Clear filters</button>\n }\n </div>\n\n @if (loading()) {\n <p class=\"eds-body-sm tasks-page__loading\">Loading tasks…</p>\n } @else {\n <div class=\"table-wrap\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Created</th>\n <th>Title</th>\n <th>Type</th>\n <th>Patient</th>\n <th>Priority</th>\n <th>Status</th>\n <th>Source</th>\n <th>Call</th>\n </tr>\n </thead>\n <tbody>\n @for (task of tasks(); track task.id) {\n <tr class=\"tasks-page__row\" (click)=\"openTask(task)\">\n <td class=\"cell-muted\">{{ task.created | date: 'MM/dd/yy, h:mm a' }}</td>\n <td class=\"tasks-page__title-cell\">{{ task.title }}</td>\n <td><eds-badge [tone]=\"taskTypeTone(task.type)\">{{ task.type }}</eds-badge></td>\n <td>{{ task.patient }}</td>\n <td>\n <eds-badge [tone]=\"taskPriorityTone(task.priority)\">\n {{ task.priority === 'urgent' ? 'Urgent' : 'Normal' }}\n </eds-badge>\n </td>\n <td><eds-badge [tone]=\"taskStatusTone(task.status)\">{{ taskStatusLabel(task.status) }}</eds-badge></td>\n <td class=\"cell-muted\">{{ taskSourceLabel(task.source) }}</td>\n <td (click)=\"$event.stopPropagation()\">\n @if (task.callId) {\n <a [routerLink]=\"taskCallRoute(task.callId)\" class=\"link-btn\">{{ task.callId }}</a>\n } @else {\n <span class=\"cell-muted\">—</span>\n }\n </td>\n </tr>\n } @empty {\n <tr>\n <td colspan=\"8\" class=\"empty-state\">No tasks match these filters.</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <footer class=\"pagination\">\n <span>Page {{ page() }} of {{ totalPages() }} · {{ total() }} total</span>\n <div class=\"pagination-btns\">\n <eds-button variant=\"secondary\" [disabled]=\"page() <= 1\" (click)=\"prevPage()\">Previous</eds-button>\n <eds-button variant=\"secondary\" [disabled]=\"page() >= totalPages()\" (click)=\"nextPage()\">Next</eds-button>\n </div>\n </footer>\n </section>\n</div>\n\n@if (selectedTask(); as task) {\n <eds-task-detail-drawer\n [task]=\"task\"\n (closed)=\"closeDrawer()\"\n (statusChange)=\"onStatusChange($event)\"\n />\n}"],"names":["calcTotalPages"],"mappings":";;;;;;;MAwCa,mBAAmB,CAAA;AA9BhC,IAAA,WAAA,GAAA;;QAgCW,IAAA,CAAA,KAAK,GAA8B,EAAE;;QAErC,IAAA,CAAA,KAAK,GAAG,OAAO;AAEP,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAE1B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AAwB1C,IAAA;AAtBC,IAAA,IAAc,SAAS,GAAA;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC5B,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE;IAChC;AAEA,IAAA,IAAc,SAAS,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAC,KAAK,EAAE;IACxD;IAEA,MAAM,MAAM,CAAC,KAAiB,EAAA;QAC5B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS;AAC3B,QAAA,IAAI,CAAC,IAAI;YAAE;AAEX,QAAA,IAAI;YACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;AACzC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QAChD;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,EAAE,OAAO,EAAE,IAAI,CAAC;QAC1E;IACF;+GA/BW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3BpB;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wiBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAIU,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBA9B/B,SAAS;+BACE,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,QAAA,EACN;;;;;;;;;;;;;;;;;;;;;;;GAuBT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,wiBAAA,CAAA,EAAA;8BAItC,KAAK,EAAA,CAAA;sBAAb;gBAEQ,KAAK,EAAA,CAAA;sBAAb;;;MCNU,yBAAyB,CAAA;AAdtC,IAAA,WAAA,GAAA;AAeW,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAY;QAEjC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QACvB,IAAA,CAAA,YAAY,GAAG,MAAM,EAAc;QAEzB,IAAA,CAAA,eAAe,GAAG,eAAe;QACjC,IAAA,CAAA,cAAc,GAAG,cAAc;QAC/B,IAAA,CAAA,iBAAiB,GAAG,iBAAiB;QACrC,IAAA,CAAA,gBAAgB,GAAG,gBAAgB;QACnC,IAAA,CAAA,eAAe,GAAG,eAAe;QACjC,IAAA,CAAA,YAAY,GAAG,YAAY;QAC3B,IAAA,CAAA,aAAa,GAAG,aAAa;AAcjD,IAAA;IAZW,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEU,QAAQ,GAAA;AAChB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/D;AAEU,IAAA,eAAe,CAAC,KAAiB,EAAA;AACzC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa;YAAE,IAAI,CAAC,KAAK,EAAE;IACxD;+GAzBW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtCtC,s3HAqGA,EAAA,MAAA,EAAA,CAAA,04DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,ED1EQ,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,kBAAkB,gGAClB,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAMX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAdrC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,OAAA,EACzB;wBACL,QAAQ;wBACR,UAAU;wBACV,mBAAmB;wBACnB,iBAAiB;wBACjB,kBAAkB;wBAClB,gBAAgB;qBACnB,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,s3HAAA,EAAA,MAAA,EAAA,CAAA,04DAAA,CAAA,EAAA;;;MEStC,kBAAkB,CAAA;AAb/B,IAAA,WAAA,GAAA;AAcmB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,wBAAwB,CAAC;AACtC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;QAE5B,IAAA,CAAA,QAAQ,GAAG,iBAAiB;AAC5B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAa,EAAE,CAAC;AAC9B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;AACjB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;AAChB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;AACtB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAkB,IAAI,CAAC;AAE5C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAkB,EAAE,CAAC;AAC1C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;AACvB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAkB,EAAE,CAAC;AAC1C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC;QAEzB,IAAA,CAAA,WAAW,GAAG,iBAAiB;QAC/B,IAAA,CAAA,eAAe,GAAG,eAAe;QACjC,IAAA,CAAA,cAAc,GAAG,cAAc;QAC/B,IAAA,CAAA,gBAAgB,GAAG,gBAAgB;QACnC,IAAA,CAAA,eAAe,GAAG,eAAe;QACjC,IAAA,CAAA,YAAY,GAAG,YAAY;QAC3B,IAAA,CAAA,aAAa,GAAG,aAAa;QAE7B,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAC5C,MACE,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CACxB;AAiGF,IAAA;IA/FC,QAAQ,GAAA;AACN,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpE,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE;IACb;AAEU,IAAA,eAAe,CAAC,KAAa,EAAA;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAwB,CAAC;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE;IACb;AAEU,IAAA,aAAa,CAAC,KAAa,EAAA;AACnC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE;IACb;AAEU,IAAA,eAAe,CAAC,KAAa,EAAA;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAwB,CAAC;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE;IACb;AAEU,IAAA,eAAe,CAAC,KAAa,EAAA;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE;IACb;AAEU,IAAA,QAAQ,CAAC,IAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEU,IAAA,cAAc,CAAC,MAAkB,EAAA;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;AAChC,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,KAAI;YACzD,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7E;AACF,QAAA,CAAC,CAAC;IACJ;IAEU,UAAU,GAAA;QAClB,OAAOA,UAAc,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,iBAAiB,CAAC;IACxD;IAEU,QAAQ,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,QAAQ,GAAA;QAChB,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE;IACb;IAEQ,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,MAAM,OAAO,GAAgB;AAC3B,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,KAAK,EAAE,iBAAiB;SACzB;QACD,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAgB;QAC3E,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;QACvD,IAAI,IAAI,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAgB;AAC3E,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE;QAE3E,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;YACnC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAI;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,CAAC;YACD,KAAK,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACrC,SAAA,CAAC;IACJ;+GA9HW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7C/B,62JAqIC,EAAA,MAAA,EAAA,CAAA,g3FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EDlGG,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,yBAAyB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAMhB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAb9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EACjB;wBACP,QAAQ;wBACR,UAAU;wBACV,iBAAiB;wBACjB,kBAAkB;wBAClB,yBAAyB;qBAC1B,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,62JAAA,EAAA,MAAA,EAAA,CAAA,g3FAAA,CAAA,EAAA;;;;;"}
|
|
@@ -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, a as EdsBadgeComponent, E as EdsButtonComponent, b as EdsIconComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-
|
|
3
|
+
import { A as AiReceptionistApiService, a as EdsBadgeComponent, E as EdsButtonComponent, b as EdsIconComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-Dn0GrZ6_.mjs';
|
|
4
4
|
|
|
5
5
|
class WizardPageComponent {
|
|
6
6
|
constructor() {
|
|
@@ -34,12 +34,12 @@ class WizardPageComponent {
|
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: WizardPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
37
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: WizardPageComponent, isStandalone: true, selector: "eds-wizard-page", ngImport: i0, template: "<div class=\"eds-page wizard-page\">\n <header class=\"wizard-page__header\">\n <div>\n <h1 class=\"eds-h1\">Setup wizard</h1>\n <p class=\"eds-body-sm\">Configure and activate your AI receptionist</p>\n </div>\n <div class=\"wizard-page__progress-wrap\">\n <span class=\"eds-label\">Readiness</span>\n <div class=\"wizard-page__progress\">\n <span class=\"wizard-page__progress-fill\" [style.width.%]=\"progressPercent()\"></span>\n </div>\n <span class=\"eds-body-sm-bold\">{{ progressPercent() }}%</span>\n </div>\n </header>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading setup\u2026</p>\n } @else if (setup()) {\n <div class=\"wizard-page__layout\">\n <nav class=\"eds-card wizard-page__steps\">\n @for (step of setup()!.steps; track step.id) {\n <button\n type=\"button\"\n class=\"wizard-page__step\"\n [class.wizard-page__step--active]=\"activeStep() === step.id\"\n [class.wizard-page__step--done]=\"step.complete\"\n (click)=\"selectStep(step)\"\n >\n <span class=\"wizard-page__step-num\">\n @if (step.complete) {\n <eds-icon name=\"check\" [size]=\"16\" />\n } @else {\n {{ step.id }}\n }\n </span>\n <div>\n <span class=\"eds-body-sm-bold\">{{ step.title }}</span>\n <span class=\"eds-body-sm\">{{ step.description }}</span>\n </div>\n </button>\n }\n </nav>\n\n <article class=\"eds-card wizard-page__content\">\n @for (step of setup()!.steps; track step.id) {\n @if (activeStep() === step.id) {\n <header class=\"wizard-page__content-head\">\n <h2 class=\"eds-h2\">Step {{ step.id }}: {{ step.title }}</h2>\n <eds-badge [tone]=\"step.complete ? 'pos' : 'notice'\">\n {{ step.complete ? 'Complete' : 'Incomplete' }}\n </eds-badge>\n </header>\n <p class=\"eds-body\">{{ step.description }}</p>\n }\n }\n\n <section class=\"wizard-page__test\">\n <h3 class=\"eds-h3\">Test transcript preview</h3>\n <div class=\"wizard-page__transcript\">\n @for (line of setup()!.testTranscript; track $index) {\n <div class=\"wizard-page__line\" [attr.data-who]=\"line.who\">\n <span class=\"eds-label\">{{ line.who }}</span>\n <p>{{ line.text }}</p>\n </div>\n }\n </div>\n </section>\n\n <footer class=\"wizard-page__footer\">\n <p class=\"eds-body-sm\">\n {{ completedCount() }} of {{ setup()!.steps.length }} steps complete\n </p>\n @if (activated()) {\n <eds-badge tone=\"pos\">Agent activated</eds-badge>\n } @else {\n <eds-button variant=\"primary\" (click)=\"activate()\">\n <eds-icon name=\"rocket_launch\" [size]=\"18\" /> Activate AI receptionist\n </eds-button>\n }\n </footer>\n </article>\n </div>\n }\n</div>\n", styles: [".wizard-page__header{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:20px}.wizard-page__progress-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:6px;min-width:200px}.wizard-page__progress{width:200px;height:8px;background:var(--surface-l2);border-radius:4px;overflow:hidden}.wizard-page__progress-fill{display:block;height:100%;background:linear-gradient(90deg,var(--brand-500),var(--violet-500));border-radius:4px;transition:width .3s ease}.wizard-page__layout{display:grid;grid-template-columns:300px 1fr;gap:16px;align-items:start}.wizard-page__steps{padding:8px;display:flex;flex-direction:column;gap:4px;max-height:600px;overflow-y:auto}.wizard-page__step{display:flex;gap:10px;align-items:flex-start;padding:10px;border:none;background:none;border-radius:var(--eds-radius-md);text-align:left;cursor:pointer;width:100%}.wizard-page__step:hover{background:var(--surface-l1)}.wizard-page__step--active{background:#3681f41a;outline:1px solid rgba(54,129,244,.25)}.wizard-page__step--done .wizard-page__step-num{background:var(--green-500);color:#fff}.wizard-page__step div{display:flex;flex-direction:column;gap:2px}.wizard-page__step-num{width:28px;height:28px;border-radius:50%;background:var(--surface-l2);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0}.wizard-page__content{padding:20px}.wizard-page__content-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.wizard-page__test{margin-top:24px;padding-top:20px;border-top:1px solid var(--border-default)}.wizard-page__transcript{display:flex;flex-direction:column;gap:10px;margin-top:12px}.wizard-page__line{padding:10px 12px;border-radius:var(--eds-radius-md);background:var(--surface-l1)}.wizard-page__line[data-who=ai]{border-left:3px solid var(--brand-500)}.wizard-page__line p{margin:4px 0 0;font-size:14px}.wizard-page__footer{display:flex;align-items:center;justify-content:space-between;margin-top:24px;padding-top:16px;border-top:1px solid var(--border-default)}@media(max-width:900px){.wizard-page__layout{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "component", type: EdsBadgeComponent, selector: "eds-badge", inputs: ["tone"] }, { kind: "component", type: EdsButtonComponent, selector: "eds-button", inputs: ["variant", "type", "disabled"] }, { kind: "component", type: EdsIconComponent, selector: "eds-icon", inputs: ["name", "size", "fill", "weight"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
37
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: WizardPageComponent, isStandalone: true, selector: "eds-wizard-page", ngImport: i0, template: "<div class=\"eds-page wizard-page\">\n <header class=\"wizard-page__header\">\n <div>\n <h1 class=\"eds-h1\">Setup wizard</h1>\n <p class=\"eds-body-sm\">Configure and activate your AI receptionist</p>\n </div>\n <div class=\"wizard-page__progress-wrap\">\n <span class=\"eds-label\">Readiness</span>\n <div class=\"wizard-page__progress\">\n <span class=\"wizard-page__progress-fill\" [style.width.%]=\"progressPercent()\"></span>\n </div>\n <span class=\"eds-body-sm-bold\">{{ progressPercent() }}%</span>\n </div>\n </header>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading setup\u2026</p>\n } @else if (setup()) {\n <div class=\"wizard-page__layout\">\n <nav class=\"eds-card wizard-page__steps\">\n @for (step of setup()!.steps; track step.id) {\n <button\n type=\"button\"\n class=\"wizard-page__step\"\n [class.wizard-page__step--active]=\"activeStep() === step.id\"\n [class.wizard-page__step--done]=\"step.complete\"\n (click)=\"selectStep(step)\"\n >\n <span class=\"wizard-page__step-num\">\n @if (step.complete) {\n <eds-icon name=\"check\" [size]=\"16\" />\n } @else {\n {{ step.id }}\n }\n </span>\n <div>\n <span class=\"eds-body-sm-bold\">{{ step.title }}</span>\n <span class=\"eds-body-sm\">{{ step.description }}</span>\n </div>\n </button>\n }\n </nav>\n\n <article class=\"eds-card wizard-page__content\">\n @for (step of setup()!.steps; track step.id) {\n @if (activeStep() === step.id) {\n <header class=\"wizard-page__content-head\">\n <h2 class=\"eds-h2\">Step {{ step.id }}: {{ step.title }}</h2>\n <eds-badge [tone]=\"step.complete ? 'pos' : 'notice'\">\n {{ step.complete ? 'Complete' : 'Incomplete' }}\n </eds-badge>\n </header>\n <p class=\"eds-body\">{{ step.description }}</p>\n }\n }\n\n <section class=\"wizard-page__test\">\n <h3 class=\"eds-h3\">Test transcript preview</h3>\n <div class=\"wizard-page__transcript\">\n @for (line of setup()!.testTranscript; track $index) {\n <div class=\"wizard-page__line\" [attr.data-who]=\"line.who\">\n <span class=\"eds-label\">{{ line.who }}</span>\n <p>{{ line.text }}</p>\n </div>\n }\n </div>\n </section>\n\n <footer class=\"wizard-page__footer\">\n <p class=\"eds-body-sm\">\n {{ completedCount() }} of {{ setup()!.steps.length }} steps complete\n </p>\n @if (activated()) {\n <eds-badge tone=\"pos\">Agent activated</eds-badge>\n } @else {\n <eds-button variant=\"primary\" (click)=\"activate()\">\n <eds-icon name=\"rocket_launch\" [size]=\"18\" /> Activate AI receptionist\n </eds-button>\n }\n </footer>\n </article>\n </div>\n }\n</div>\n", styles: [".wizard-page__header{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:20px}.wizard-page__progress-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:6px;min-width:200px}.wizard-page__progress{width:200px;height:8px;background:var(--eds-surface-l2);border-radius:4px;overflow:hidden}.wizard-page__progress-fill{display:block;height:100%;background:linear-gradient(90deg,var(--eds-brand-500),var(--eds-violet-500));border-radius:4px;transition:width .3s ease}.wizard-page__layout{display:grid;grid-template-columns:300px 1fr;gap:16px;align-items:start}.wizard-page__steps{padding:8px;display:flex;flex-direction:column;gap:4px;max-height:600px;overflow-y:auto}.wizard-page__step{display:flex;gap:10px;align-items:flex-start;padding:10px;border:none;background:none;border-radius:var(--eds-radius-md);text-align:left;cursor:pointer;width:100%}.wizard-page__step:hover{background:var(--eds-surface-l1)}.wizard-page__step--active{background:#3681f41a;outline:1px solid rgba(54,129,244,.25)}.wizard-page__step--done .wizard-page__step-num{background:var(--eds-green-500);color:#fff}.wizard-page__step div{display:flex;flex-direction:column;gap:2px}.wizard-page__step-num{width:28px;height:28px;border-radius:50%;background:var(--eds-surface-l2);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0}.wizard-page__content{padding:20px}.wizard-page__content-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.wizard-page__test{margin-top:24px;padding-top:20px;border-top:1px solid var(--eds-border-default)}.wizard-page__transcript{display:flex;flex-direction:column;gap:10px;margin-top:12px}.wizard-page__line{padding:10px 12px;border-radius:var(--eds-radius-md);background:var(--eds-surface-l1)}.wizard-page__line[data-who=ai]{border-left:3px solid var(--eds-brand-500)}.wizard-page__line p{margin:4px 0 0;font-size:14px}.wizard-page__footer{display:flex;align-items:center;justify-content:space-between;margin-top:24px;padding-top:16px;border-top:1px solid var(--eds-border-default)}@media(max-width:900px){.wizard-page__layout{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "component", type: EdsBadgeComponent, selector: "eds-badge", inputs: ["tone"] }, { kind: "component", type: EdsButtonComponent, selector: "eds-button", inputs: ["variant", "type", "disabled"] }, { kind: "component", type: EdsIconComponent, selector: "eds-icon", inputs: ["name", "size", "fill", "weight"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
38
38
|
}
|
|
39
39
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: WizardPageComponent, decorators: [{
|
|
40
40
|
type: Component,
|
|
41
|
-
args: [{ selector: 'eds-wizard-page', imports: [EdsBadgeComponent, EdsButtonComponent, EdsIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"eds-page wizard-page\">\n <header class=\"wizard-page__header\">\n <div>\n <h1 class=\"eds-h1\">Setup wizard</h1>\n <p class=\"eds-body-sm\">Configure and activate your AI receptionist</p>\n </div>\n <div class=\"wizard-page__progress-wrap\">\n <span class=\"eds-label\">Readiness</span>\n <div class=\"wizard-page__progress\">\n <span class=\"wizard-page__progress-fill\" [style.width.%]=\"progressPercent()\"></span>\n </div>\n <span class=\"eds-body-sm-bold\">{{ progressPercent() }}%</span>\n </div>\n </header>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading setup\u2026</p>\n } @else if (setup()) {\n <div class=\"wizard-page__layout\">\n <nav class=\"eds-card wizard-page__steps\">\n @for (step of setup()!.steps; track step.id) {\n <button\n type=\"button\"\n class=\"wizard-page__step\"\n [class.wizard-page__step--active]=\"activeStep() === step.id\"\n [class.wizard-page__step--done]=\"step.complete\"\n (click)=\"selectStep(step)\"\n >\n <span class=\"wizard-page__step-num\">\n @if (step.complete) {\n <eds-icon name=\"check\" [size]=\"16\" />\n } @else {\n {{ step.id }}\n }\n </span>\n <div>\n <span class=\"eds-body-sm-bold\">{{ step.title }}</span>\n <span class=\"eds-body-sm\">{{ step.description }}</span>\n </div>\n </button>\n }\n </nav>\n\n <article class=\"eds-card wizard-page__content\">\n @for (step of setup()!.steps; track step.id) {\n @if (activeStep() === step.id) {\n <header class=\"wizard-page__content-head\">\n <h2 class=\"eds-h2\">Step {{ step.id }}: {{ step.title }}</h2>\n <eds-badge [tone]=\"step.complete ? 'pos' : 'notice'\">\n {{ step.complete ? 'Complete' : 'Incomplete' }}\n </eds-badge>\n </header>\n <p class=\"eds-body\">{{ step.description }}</p>\n }\n }\n\n <section class=\"wizard-page__test\">\n <h3 class=\"eds-h3\">Test transcript preview</h3>\n <div class=\"wizard-page__transcript\">\n @for (line of setup()!.testTranscript; track $index) {\n <div class=\"wizard-page__line\" [attr.data-who]=\"line.who\">\n <span class=\"eds-label\">{{ line.who }}</span>\n <p>{{ line.text }}</p>\n </div>\n }\n </div>\n </section>\n\n <footer class=\"wizard-page__footer\">\n <p class=\"eds-body-sm\">\n {{ completedCount() }} of {{ setup()!.steps.length }} steps complete\n </p>\n @if (activated()) {\n <eds-badge tone=\"pos\">Agent activated</eds-badge>\n } @else {\n <eds-button variant=\"primary\" (click)=\"activate()\">\n <eds-icon name=\"rocket_launch\" [size]=\"18\" /> Activate AI receptionist\n </eds-button>\n }\n </footer>\n </article>\n </div>\n }\n</div>\n", styles: [".wizard-page__header{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:20px}.wizard-page__progress-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:6px;min-width:200px}.wizard-page__progress{width:200px;height:8px;background:var(--surface-l2);border-radius:4px;overflow:hidden}.wizard-page__progress-fill{display:block;height:100%;background:linear-gradient(90deg,var(--brand-500),var(--violet-500));border-radius:4px;transition:width .3s ease}.wizard-page__layout{display:grid;grid-template-columns:300px 1fr;gap:16px;align-items:start}.wizard-page__steps{padding:8px;display:flex;flex-direction:column;gap:4px;max-height:600px;overflow-y:auto}.wizard-page__step{display:flex;gap:10px;align-items:flex-start;padding:10px;border:none;background:none;border-radius:var(--eds-radius-md);text-align:left;cursor:pointer;width:100%}.wizard-page__step:hover{background:var(--surface-l1)}.wizard-page__step--active{background:#3681f41a;outline:1px solid rgba(54,129,244,.25)}.wizard-page__step--done .wizard-page__step-num{background:var(--green-500);color:#fff}.wizard-page__step div{display:flex;flex-direction:column;gap:2px}.wizard-page__step-num{width:28px;height:28px;border-radius:50%;background:var(--surface-l2);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0}.wizard-page__content{padding:20px}.wizard-page__content-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.wizard-page__test{margin-top:24px;padding-top:20px;border-top:1px solid var(--border-default)}.wizard-page__transcript{display:flex;flex-direction:column;gap:10px;margin-top:12px}.wizard-page__line{padding:10px 12px;border-radius:var(--eds-radius-md);background:var(--surface-l1)}.wizard-page__line[data-who=ai]{border-left:3px solid var(--brand-500)}.wizard-page__line p{margin:4px 0 0;font-size:14px}.wizard-page__footer{display:flex;align-items:center;justify-content:space-between;margin-top:24px;padding-top:16px;border-top:1px solid var(--border-default)}@media(max-width:900px){.wizard-page__layout{grid-template-columns:1fr}}\n"] }]
|
|
41
|
+
args: [{ selector: 'eds-wizard-page', imports: [EdsBadgeComponent, EdsButtonComponent, EdsIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"eds-page wizard-page\">\n <header class=\"wizard-page__header\">\n <div>\n <h1 class=\"eds-h1\">Setup wizard</h1>\n <p class=\"eds-body-sm\">Configure and activate your AI receptionist</p>\n </div>\n <div class=\"wizard-page__progress-wrap\">\n <span class=\"eds-label\">Readiness</span>\n <div class=\"wizard-page__progress\">\n <span class=\"wizard-page__progress-fill\" [style.width.%]=\"progressPercent()\"></span>\n </div>\n <span class=\"eds-body-sm-bold\">{{ progressPercent() }}%</span>\n </div>\n </header>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading setup\u2026</p>\n } @else if (setup()) {\n <div class=\"wizard-page__layout\">\n <nav class=\"eds-card wizard-page__steps\">\n @for (step of setup()!.steps; track step.id) {\n <button\n type=\"button\"\n class=\"wizard-page__step\"\n [class.wizard-page__step--active]=\"activeStep() === step.id\"\n [class.wizard-page__step--done]=\"step.complete\"\n (click)=\"selectStep(step)\"\n >\n <span class=\"wizard-page__step-num\">\n @if (step.complete) {\n <eds-icon name=\"check\" [size]=\"16\" />\n } @else {\n {{ step.id }}\n }\n </span>\n <div>\n <span class=\"eds-body-sm-bold\">{{ step.title }}</span>\n <span class=\"eds-body-sm\">{{ step.description }}</span>\n </div>\n </button>\n }\n </nav>\n\n <article class=\"eds-card wizard-page__content\">\n @for (step of setup()!.steps; track step.id) {\n @if (activeStep() === step.id) {\n <header class=\"wizard-page__content-head\">\n <h2 class=\"eds-h2\">Step {{ step.id }}: {{ step.title }}</h2>\n <eds-badge [tone]=\"step.complete ? 'pos' : 'notice'\">\n {{ step.complete ? 'Complete' : 'Incomplete' }}\n </eds-badge>\n </header>\n <p class=\"eds-body\">{{ step.description }}</p>\n }\n }\n\n <section class=\"wizard-page__test\">\n <h3 class=\"eds-h3\">Test transcript preview</h3>\n <div class=\"wizard-page__transcript\">\n @for (line of setup()!.testTranscript; track $index) {\n <div class=\"wizard-page__line\" [attr.data-who]=\"line.who\">\n <span class=\"eds-label\">{{ line.who }}</span>\n <p>{{ line.text }}</p>\n </div>\n }\n </div>\n </section>\n\n <footer class=\"wizard-page__footer\">\n <p class=\"eds-body-sm\">\n {{ completedCount() }} of {{ setup()!.steps.length }} steps complete\n </p>\n @if (activated()) {\n <eds-badge tone=\"pos\">Agent activated</eds-badge>\n } @else {\n <eds-button variant=\"primary\" (click)=\"activate()\">\n <eds-icon name=\"rocket_launch\" [size]=\"18\" /> Activate AI receptionist\n </eds-button>\n }\n </footer>\n </article>\n </div>\n }\n</div>\n", styles: [".wizard-page__header{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:20px}.wizard-page__progress-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:6px;min-width:200px}.wizard-page__progress{width:200px;height:8px;background:var(--eds-surface-l2);border-radius:4px;overflow:hidden}.wizard-page__progress-fill{display:block;height:100%;background:linear-gradient(90deg,var(--eds-brand-500),var(--eds-violet-500));border-radius:4px;transition:width .3s ease}.wizard-page__layout{display:grid;grid-template-columns:300px 1fr;gap:16px;align-items:start}.wizard-page__steps{padding:8px;display:flex;flex-direction:column;gap:4px;max-height:600px;overflow-y:auto}.wizard-page__step{display:flex;gap:10px;align-items:flex-start;padding:10px;border:none;background:none;border-radius:var(--eds-radius-md);text-align:left;cursor:pointer;width:100%}.wizard-page__step:hover{background:var(--eds-surface-l1)}.wizard-page__step--active{background:#3681f41a;outline:1px solid rgba(54,129,244,.25)}.wizard-page__step--done .wizard-page__step-num{background:var(--eds-green-500);color:#fff}.wizard-page__step div{display:flex;flex-direction:column;gap:2px}.wizard-page__step-num{width:28px;height:28px;border-radius:50%;background:var(--eds-surface-l2);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0}.wizard-page__content{padding:20px}.wizard-page__content-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.wizard-page__test{margin-top:24px;padding-top:20px;border-top:1px solid var(--eds-border-default)}.wizard-page__transcript{display:flex;flex-direction:column;gap:10px;margin-top:12px}.wizard-page__line{padding:10px 12px;border-radius:var(--eds-radius-md);background:var(--eds-surface-l1)}.wizard-page__line[data-who=ai]{border-left:3px solid var(--eds-brand-500)}.wizard-page__line p{margin:4px 0 0;font-size:14px}.wizard-page__footer{display:flex;align-items:center;justify-content:space-between;margin-top:24px;padding-top:16px;border-top:1px solid var(--eds-border-default)}@media(max-width:900px){.wizard-page__layout{grid-template-columns:1fr}}\n"] }]
|
|
42
42
|
}] });
|
|
43
43
|
|
|
44
44
|
export { WizardPageComponent };
|
|
45
|
-
//# sourceMappingURL=edvak99-voice-receptionist-widget-wizard-page.component-
|
|
45
|
+
//# sourceMappingURL=edvak99-voice-receptionist-widget-wizard-page.component-C1Z6yC0q.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edvak99-voice-receptionist-widget-wizard-page.component-
|
|
1
|
+
{"version":3,"file":"edvak99-voice-receptionist-widget-wizard-page.component-C1Z6yC0q.mjs","sources":["../../../projects/voice-receptionist-widget/src/lib/pages/wizard-page/wizard-page.component.ts","../../../projects/voice-receptionist-widget/src/lib/pages/wizard-page/wizard-page.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, OnInit, signal } from '@angular/core';\n\nimport { SetupData, SetupStep } from '../../models/ai-receptionist.types';\nimport { AiReceptionistApiService } from '../../services/ai-receptionist-api.service';\nimport { EdsBadgeComponent } from '../../ui/eds-badge.component';\nimport { EdsButtonComponent } from '../../ui/eds-button.component';\nimport { EdsIconComponent } from '../../ui/eds-icon.component';\n\n@Component({\n selector: 'eds-wizard-page',\n imports: [EdsBadgeComponent, EdsButtonComponent, EdsIconComponent],\n templateUrl: './wizard-page.component.html',\n styleUrl: './wizard-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class WizardPageComponent implements OnInit {\n private readonly api = inject(AiReceptionistApiService);\n\n protected readonly setup = signal<SetupData | null>(null);\n protected readonly activeStep = signal(1);\n protected readonly loading = signal(true);\n protected readonly activated = signal(false);\n\n protected readonly completedCount = computed(() => {\n return this.setup()?.steps.filter((s) => s.complete).length ?? 0;\n });\n\n ngOnInit(): void {\n this.api.getSetup().subscribe(({ data }) => {\n this.setup.set(data);\n const firstIncomplete = data.steps.find((s) => !s.complete);\n this.activeStep.set(firstIncomplete?.id ?? 1);\n this.loading.set(false);\n });\n }\n\n protected selectStep(step: SetupStep): void {\n this.activeStep.set(step.id);\n }\n\n protected progressPercent(): number {\n return this.setup()?.readiness ?? 0;\n }\n\n protected activate(): void {\n this.api.activateSetup().subscribe(() => {\n this.api.setAgentOn(true);\n this.activated.set(true);\n });\n }\n}\n","<div class=\"eds-page wizard-page\">\n <header class=\"wizard-page__header\">\n <div>\n <h1 class=\"eds-h1\">Setup wizard</h1>\n <p class=\"eds-body-sm\">Configure and activate your AI receptionist</p>\n </div>\n <div class=\"wizard-page__progress-wrap\">\n <span class=\"eds-label\">Readiness</span>\n <div class=\"wizard-page__progress\">\n <span class=\"wizard-page__progress-fill\" [style.width.%]=\"progressPercent()\"></span>\n </div>\n <span class=\"eds-body-sm-bold\">{{ progressPercent() }}%</span>\n </div>\n </header>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading setup…</p>\n } @else if (setup()) {\n <div class=\"wizard-page__layout\">\n <nav class=\"eds-card wizard-page__steps\">\n @for (step of setup()!.steps; track step.id) {\n <button\n type=\"button\"\n class=\"wizard-page__step\"\n [class.wizard-page__step--active]=\"activeStep() === step.id\"\n [class.wizard-page__step--done]=\"step.complete\"\n (click)=\"selectStep(step)\"\n >\n <span class=\"wizard-page__step-num\">\n @if (step.complete) {\n <eds-icon name=\"check\" [size]=\"16\" />\n } @else {\n {{ step.id }}\n }\n </span>\n <div>\n <span class=\"eds-body-sm-bold\">{{ step.title }}</span>\n <span class=\"eds-body-sm\">{{ step.description }}</span>\n </div>\n </button>\n }\n </nav>\n\n <article class=\"eds-card wizard-page__content\">\n @for (step of setup()!.steps; track step.id) {\n @if (activeStep() === step.id) {\n <header class=\"wizard-page__content-head\">\n <h2 class=\"eds-h2\">Step {{ step.id }}: {{ step.title }}</h2>\n <eds-badge [tone]=\"step.complete ? 'pos' : 'notice'\">\n {{ step.complete ? 'Complete' : 'Incomplete' }}\n </eds-badge>\n </header>\n <p class=\"eds-body\">{{ step.description }}</p>\n }\n }\n\n <section class=\"wizard-page__test\">\n <h3 class=\"eds-h3\">Test transcript preview</h3>\n <div class=\"wizard-page__transcript\">\n @for (line of setup()!.testTranscript; track $index) {\n <div class=\"wizard-page__line\" [attr.data-who]=\"line.who\">\n <span class=\"eds-label\">{{ line.who }}</span>\n <p>{{ line.text }}</p>\n </div>\n }\n </div>\n </section>\n\n <footer class=\"wizard-page__footer\">\n <p class=\"eds-body-sm\">\n {{ completedCount() }} of {{ setup()!.steps.length }} steps complete\n </p>\n @if (activated()) {\n <eds-badge tone=\"pos\">Agent activated</eds-badge>\n } @else {\n <eds-button variant=\"primary\" (click)=\"activate()\">\n <eds-icon name=\"rocket_launch\" [size]=\"18\" /> Activate AI receptionist\n </eds-button>\n }\n </footer>\n </article>\n </div>\n }\n</div>\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { k as EdsAppShellComponent, a as EdsBadgeComponent, T as ToastService, V as VOICE_RECEPTIONIST_CONFIG, l as VOICE_RECEPTIONIST_FEATURE_ROUTES, m as VOICE_RECEPTIONIST_ROUTES, n as VOICE_RECEPTIONIST_SESSION, p as provideVoiceReceptionist } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-Dn0GrZ6_.mjs';
|
|
2
2
|
//# sourceMappingURL=edvak99-voice-receptionist-widget.mjs.map
|
|
@@ -36,6 +36,9 @@ export interface PracticeFaqSearchItem {
|
|
|
36
36
|
}
|
|
37
37
|
export interface PracticeFaqListResponse {
|
|
38
38
|
items: PracticeFaq[];
|
|
39
|
+
total?: number;
|
|
40
|
+
page?: number;
|
|
41
|
+
limit?: number;
|
|
39
42
|
}
|
|
40
43
|
export type FaqActiveFilter = 'all' | 'active' | 'inactive';
|
|
41
44
|
export declare const FAQ_CATEGORY_PRESETS: readonly ["hours", "location", "parking", "insurance", "services", "policies", "general"];
|
|
@@ -5,7 +5,10 @@ import * as i0 from "@angular/core";
|
|
|
5
5
|
export declare class KnowledgeHubPageComponent implements OnInit {
|
|
6
6
|
private readonly api;
|
|
7
7
|
private readonly toast;
|
|
8
|
-
protected readonly
|
|
8
|
+
protected readonly pageSize = 50;
|
|
9
|
+
protected readonly pageFaqs: import("@angular/core").WritableSignal<PracticeFaq[]>;
|
|
10
|
+
protected readonly total: import("@angular/core").WritableSignal<number>;
|
|
11
|
+
protected readonly page: import("@angular/core").WritableSignal<number>;
|
|
9
12
|
protected readonly loading: import("@angular/core").WritableSignal<boolean>;
|
|
10
13
|
protected readonly error: import("@angular/core").WritableSignal<string | null>;
|
|
11
14
|
protected readonly activeFilter: import("@angular/core").WritableSignal<FaqActiveFilter>;
|
|
@@ -23,6 +26,7 @@ export declare class KnowledgeHubPageComponent implements OnInit {
|
|
|
23
26
|
id: FaqActiveFilter;
|
|
24
27
|
label: string;
|
|
25
28
|
}[];
|
|
29
|
+
/** Client filters still applied on the current page (category / local search / inactive). */
|
|
26
30
|
protected readonly faqs: import("@angular/core").Signal<PracticeFaq[]>;
|
|
27
31
|
protected categoryClass: typeof categoryBadgeClass;
|
|
28
32
|
protected truncate: typeof truncateText;
|
|
@@ -31,6 +35,9 @@ export declare class KnowledgeHubPageComponent implements OnInit {
|
|
|
31
35
|
protected setActiveFilter(id: FaqActiveFilter): void;
|
|
32
36
|
protected toggleCategory(cat: string): void;
|
|
33
37
|
protected isCategorySelected(cat: string): boolean;
|
|
38
|
+
protected totalPages(): number;
|
|
39
|
+
protected prevPage(): void;
|
|
40
|
+
protected nextPage(): void;
|
|
34
41
|
protected openCreate(): void;
|
|
35
42
|
protected openEdit(faq: PracticeFaq): void;
|
|
36
43
|
protected closeForm(): void;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
+
import { type PaginatedResult } from '../../models/pagination';
|
|
2
3
|
import { CreatePracticeFaqRequest, PracticeFaq, PracticeFaqSearchResult, UpdatePracticeFaqRequest } from '../models/practice-faq.model';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
export declare class PracticeFaqApiService {
|
|
@@ -8,7 +9,11 @@ export declare class PracticeFaqApiService {
|
|
|
8
9
|
private readonly paths;
|
|
9
10
|
private readonly base;
|
|
10
11
|
private get useMock();
|
|
11
|
-
list(
|
|
12
|
+
list(opts?: {
|
|
13
|
+
activeOnly?: boolean;
|
|
14
|
+
page?: number;
|
|
15
|
+
limit?: number;
|
|
16
|
+
}): Observable<PaginatedResult<PracticeFaq>>;
|
|
12
17
|
get(faqId: string): Observable<PracticeFaq | null>;
|
|
13
18
|
create(body: CreatePracticeFaqRequest): Observable<PracticeFaq>;
|
|
14
19
|
update(faqId: string, body: UpdatePracticeFaqRequest): Observable<PracticeFaq>;
|
|
@@ -16,7 +21,6 @@ export declare class PracticeFaqApiService {
|
|
|
16
21
|
success: boolean;
|
|
17
22
|
}>;
|
|
18
23
|
search(q: string, limit?: number): Observable<PracticeFaqSearchResult>;
|
|
19
|
-
private asList;
|
|
20
24
|
static ɵfac: i0.ɵɵFactoryDeclaration<PracticeFaqApiService, never>;
|
|
21
25
|
static ɵprov: i0.ɵɵInjectableDeclaration<PracticeFaqApiService>;
|
|
22
26
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Standard list pagination envelope from AI Receptionist APIs. */
|
|
2
|
+
export interface PaginatedResult<T> {
|
|
3
|
+
items: T[];
|
|
4
|
+
total: number;
|
|
5
|
+
page: number;
|
|
6
|
+
limit: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const DEFAULT_PAGE_SIZE = 50;
|
|
9
|
+
/** Parse `{ items, total, page, limit }` or a bare array (legacy). */
|
|
10
|
+
export declare function asPaginatedResult<T>(body: unknown, fallbackPage?: number, fallbackLimit?: number): PaginatedResult<T>;
|
|
11
|
+
export declare function totalPages(total: number, pageSize: number): number;
|
|
@@ -3,12 +3,19 @@ import { AuditEvent } from '../../models/ai-receptionist.types';
|
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class AuditPageComponent implements OnInit {
|
|
5
5
|
private readonly api;
|
|
6
|
+
protected readonly pageSize = 50;
|
|
6
7
|
protected readonly events: import("@angular/core").WritableSignal<AuditEvent[]>;
|
|
8
|
+
protected readonly total: import("@angular/core").WritableSignal<number>;
|
|
9
|
+
protected readonly page: import("@angular/core").WritableSignal<number>;
|
|
7
10
|
protected readonly search: import("@angular/core").WritableSignal<string>;
|
|
8
11
|
protected readonly actor: import("@angular/core").WritableSignal<string>;
|
|
9
12
|
protected readonly loading: import("@angular/core").WritableSignal<boolean>;
|
|
10
13
|
ngOnInit(): void;
|
|
11
14
|
protected load(): void;
|
|
15
|
+
protected searchSubmit(): void;
|
|
16
|
+
protected totalPages(): number;
|
|
17
|
+
protected prevPage(): void;
|
|
18
|
+
protected nextPage(): void;
|
|
12
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<AuditPageComponent, never>;
|
|
13
20
|
static ɵcmp: i0.ɵɵComponentDeclaration<AuditPageComponent, "eds-audit-page", never, {}, {}, never, never, true, never>;
|
|
14
21
|
}
|
|
@@ -9,7 +9,10 @@ export declare class CallHistoryPageComponent implements OnInit {
|
|
|
9
9
|
private readonly toast;
|
|
10
10
|
private readonly route;
|
|
11
11
|
private readonly router;
|
|
12
|
-
protected readonly
|
|
12
|
+
protected readonly pageSize = 50;
|
|
13
|
+
protected readonly rows: import("@angular/core").WritableSignal<HistoryCall[]>;
|
|
14
|
+
protected readonly total: import("@angular/core").WritableSignal<number>;
|
|
15
|
+
protected readonly page: import("@angular/core").WritableSignal<number>;
|
|
13
16
|
protected readonly loading: import("@angular/core").WritableSignal<boolean>;
|
|
14
17
|
protected readonly reviewingId: import("@angular/core").WritableSignal<string | null>;
|
|
15
18
|
protected readonly search: import("@angular/core").WritableSignal<string>;
|
|
@@ -21,8 +24,6 @@ export declare class CallHistoryPageComponent implements OnInit {
|
|
|
21
24
|
id: ReviewFilterTab;
|
|
22
25
|
label: string;
|
|
23
26
|
}[];
|
|
24
|
-
protected readonly rows: import("@angular/core").Signal<HistoryCall[]>;
|
|
25
|
-
protected readonly needsReviewCount: import("@angular/core").Signal<number>;
|
|
26
27
|
protected reviewLabel: typeof reviewLabel;
|
|
27
28
|
protected reviewTone: typeof reviewBadgeTone;
|
|
28
29
|
protected isNeedsReview: typeof isNeedsReview;
|
|
@@ -33,6 +34,9 @@ export declare class CallHistoryPageComponent implements OnInit {
|
|
|
33
34
|
protected applyFilters(): void;
|
|
34
35
|
protected setReviewTab(tab: ReviewFilterTab): void;
|
|
35
36
|
protected tabBadgeCount(tab: ReviewFilterTab): number | null;
|
|
37
|
+
protected totalPages(): number;
|
|
38
|
+
protected prevPage(): void;
|
|
39
|
+
protected nextPage(): void;
|
|
36
40
|
protected markReviewed(row: HistoryCall, event: Event): void;
|
|
37
41
|
protected formatDuration(sec: number): string;
|
|
38
42
|
protected openCallDetail(id: string): void;
|
|
@@ -5,7 +5,10 @@ import * as i0 from "@angular/core";
|
|
|
5
5
|
export declare class TasksPageComponent implements OnInit {
|
|
6
6
|
private readonly api;
|
|
7
7
|
private readonly route;
|
|
8
|
+
protected readonly pageSize = 50;
|
|
8
9
|
protected readonly tasks: import("@angular/core").WritableSignal<TaskItem[]>;
|
|
10
|
+
protected readonly total: import("@angular/core").WritableSignal<number>;
|
|
11
|
+
protected readonly page: import("@angular/core").WritableSignal<number>;
|
|
9
12
|
protected readonly loading: import("@angular/core").WritableSignal<boolean>;
|
|
10
13
|
protected readonly selectedTask: import("@angular/core").WritableSignal<TaskItem | null>;
|
|
11
14
|
protected readonly statusFilter: import("@angular/core").WritableSignal<"" | TaskStatus>;
|
|
@@ -29,6 +32,9 @@ export declare class TasksPageComponent implements OnInit {
|
|
|
29
32
|
protected openTask(task: TaskItem): void;
|
|
30
33
|
protected closeDrawer(): void;
|
|
31
34
|
protected onStatusChange(status: TaskStatus): void;
|
|
35
|
+
protected totalPages(): number;
|
|
36
|
+
protected prevPage(): void;
|
|
37
|
+
protected nextPage(): void;
|
|
32
38
|
private load;
|
|
33
39
|
static ɵfac: i0.ɵɵFactoryDeclaration<TasksPageComponent, never>;
|
|
34
40
|
static ɵcmp: i0.ɵɵComponentDeclaration<TasksPageComponent, "eds-tasks-page", never, {}, {}, never, never, true, never>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import { AgentSettings, AiReceptionistStatus, AnalyticsData, AuditEvent, DashboardData, CallRecordingMeta, HistoryCall, HistoryDetail, LiveCall, LocationOption, ProviderOption, SetupData, TaskItem, CreateTaskRequest, TaskFilters, RegenerateSummaryResult, ToolEvent, TranscriptLine } from '../models/ai-receptionist.types';
|
|
3
|
+
import { type PaginatedResult } from '../models/pagination';
|
|
3
4
|
import { ApiLogDetail, ApiLogFilters, ApiLogListResponse, ApiLogStats } from '../models/api-log.types';
|
|
4
5
|
import { CreateOutboundPurposeRequest, OutboundPurpose, OutboundPurposesResponse, PlaceOutboundCallRequest, PlaceOutboundCallResponse, UpdateOutboundPurposeRequest } from '../models/outbound-purpose.types';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
@@ -11,6 +12,7 @@ export declare class AiReceptionistApiMockService {
|
|
|
11
12
|
private readonly status;
|
|
12
13
|
private readonly outboundPurposes;
|
|
13
14
|
private mock;
|
|
15
|
+
private paginate;
|
|
14
16
|
getStatus(): Observable<{
|
|
15
17
|
data: AiReceptionistStatus;
|
|
16
18
|
}>;
|
|
@@ -42,9 +44,9 @@ export declare class AiReceptionistApiMockService {
|
|
|
42
44
|
outcome?: string;
|
|
43
45
|
location?: string;
|
|
44
46
|
review?: 'needs' | 'reviewed';
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
47
|
+
page?: number;
|
|
48
|
+
limit?: number;
|
|
49
|
+
}): Observable<PaginatedResult<HistoryCall>>;
|
|
48
50
|
getCallDetail(id: string): Observable<{
|
|
49
51
|
data: HistoryDetail | null;
|
|
50
52
|
}>;
|
|
@@ -86,9 +88,7 @@ export declare class AiReceptionistApiMockService {
|
|
|
86
88
|
review: string;
|
|
87
89
|
};
|
|
88
90
|
}>;
|
|
89
|
-
getTasks(filters?: TaskFilters): Observable<
|
|
90
|
-
data: TaskItem[];
|
|
91
|
-
}>;
|
|
91
|
+
getTasks(filters?: TaskFilters): Observable<PaginatedResult<TaskItem>>;
|
|
92
92
|
getCallTasks(callId: string): Observable<{
|
|
93
93
|
data: TaskItem[];
|
|
94
94
|
}>;
|
|
@@ -109,9 +109,10 @@ export declare class AiReceptionistApiMockService {
|
|
|
109
109
|
}>;
|
|
110
110
|
previewVoice(_voiceId: string): Observable<Blob>;
|
|
111
111
|
private withEffectiveWelcome;
|
|
112
|
-
getAudit(q?: string, actor?: string
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
getAudit(q?: string, actor?: string, opts?: {
|
|
113
|
+
page?: number;
|
|
114
|
+
limit?: number;
|
|
115
|
+
}): Observable<PaginatedResult<AuditEvent>>;
|
|
115
116
|
getSetup(): Observable<{
|
|
116
117
|
data: SetupData;
|
|
117
118
|
}>;
|
|
@@ -2,6 +2,7 @@ import { Observable } from 'rxjs';
|
|
|
2
2
|
import { ApiLogDetail, ApiLogFilters, ApiLogListResponse, ApiLogStats } from '../models/api-log.types';
|
|
3
3
|
import { CreateOutboundPurposeRequest, OutboundPurpose, OutboundPurposesResponse, PlaceOutboundCallRequest, PlaceOutboundCallResponse, UpdateOutboundPurposeRequest } from '../models/outbound-purpose.types';
|
|
4
4
|
import { AgentSettings, AiReceptionistStatus, AnalyticsData, AuditEvent, DashboardData, HistoryCall, HistoryDetail, LiveCall, RegenerateSummaryResult, LocationOption, ProviderOption, SetupData, TaskItem, CreateTaskRequest, TaskFilters, ToolEvent, TranscriptLine, CallRecordingMeta } from '../models/ai-receptionist.types';
|
|
5
|
+
import { type PaginatedResult } from '../models/pagination';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
export declare class AiReceptionistApiService {
|
|
7
8
|
private readonly http;
|
|
@@ -47,9 +48,9 @@ export declare class AiReceptionistApiService {
|
|
|
47
48
|
outcome?: string;
|
|
48
49
|
location?: string;
|
|
49
50
|
review?: 'needs' | 'reviewed';
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
51
|
+
page?: number;
|
|
52
|
+
limit?: number;
|
|
53
|
+
}): Observable<PaginatedResult<HistoryCall>>;
|
|
53
54
|
getCallDetail(id: string): Observable<{
|
|
54
55
|
data: HistoryDetail | null;
|
|
55
56
|
}>;
|
|
@@ -91,9 +92,7 @@ export declare class AiReceptionistApiService {
|
|
|
91
92
|
review: string;
|
|
92
93
|
};
|
|
93
94
|
}>;
|
|
94
|
-
getTasks(filters?: TaskFilters): Observable<
|
|
95
|
-
data: TaskItem[];
|
|
96
|
-
}>;
|
|
95
|
+
getTasks(filters?: TaskFilters): Observable<PaginatedResult<TaskItem>>;
|
|
97
96
|
getCallTasks(callId: string): Observable<{
|
|
98
97
|
data: TaskItem[];
|
|
99
98
|
}>;
|
|
@@ -114,9 +113,10 @@ export declare class AiReceptionistApiService {
|
|
|
114
113
|
}>;
|
|
115
114
|
/** ElevenLabs spoken sample for Agent Settings voice picker. */
|
|
116
115
|
previewVoice(voiceId: string): Observable<Blob>;
|
|
117
|
-
getAudit(q?: string
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
getAudit(q?: string, opts?: {
|
|
117
|
+
page?: number;
|
|
118
|
+
limit?: number;
|
|
119
|
+
}): Observable<PaginatedResult<AuditEvent>>;
|
|
120
120
|
getSetup(): Observable<{
|
|
121
121
|
data: SetupData;
|
|
122
122
|
}>;
|
package/package.json
CHANGED
package/styles/_index.scss
CHANGED
|
@@ -1,47 +1,12 @@
|
|
|
1
|
-
/* @edvak99/voice-receptionist-widget styles — import in host global styles
|
|
1
|
+
/* @edvak99/voice-receptionist-widget styles — import in host global styles.
|
|
2
|
+
*
|
|
3
|
+
* Tokens live on eds-app-shell / .voice-receptionist-host only (see eds.scss).
|
|
4
|
+
* This entry must NOT set unprefixed --color-primary (etc.) on :root.
|
|
5
|
+
*/
|
|
2
6
|
|
|
3
7
|
@use './eds';
|
|
4
8
|
@use './chat-ui';
|
|
5
9
|
|
|
6
|
-
:root {
|
|
7
|
-
--color-primary: #3681f4;
|
|
8
|
-
--color-primary-hover: #2f6de0;
|
|
9
|
-
--color-primary-light: #eaf2ff;
|
|
10
|
-
--color-accent: #5aa2ff;
|
|
11
|
-
--color-accent-light: #d6e8ff;
|
|
12
|
-
--color-bg: #f7faff;
|
|
13
|
-
--color-surface: #ffffff;
|
|
14
|
-
--color-surface-alt: #f8fafc;
|
|
15
|
-
--color-sidebar-bg: #0f172a;
|
|
16
|
-
--color-chat-ai: #f1f5f9;
|
|
17
|
-
--color-text: #0f172a;
|
|
18
|
-
--color-text-muted: #64748b;
|
|
19
|
-
--color-text-soft: #94a3b8;
|
|
20
|
-
--color-border: #e2e8f0;
|
|
21
|
-
--color-border-strong: #cbd5e1;
|
|
22
|
-
--color-success: #22c55e;
|
|
23
|
-
--color-success-soft: #ecfdf3;
|
|
24
|
-
--color-warning: #f59e0b;
|
|
25
|
-
--color-warning-soft: #fffbeb;
|
|
26
|
-
--color-danger: #ef4444;
|
|
27
|
-
--color-danger-soft: #fef2f2;
|
|
28
|
-
--color-info: #3b82f6;
|
|
29
|
-
--color-info-soft: #eff6ff;
|
|
30
|
-
--color-primary-soft: var(--color-primary-light);
|
|
31
|
-
--shadow-sm: 0 2px 6px rgba(0, 0, 0, 0.05);
|
|
32
|
-
--shadow-md: 0 6px 16px rgba(0, 0, 0, 0.08);
|
|
33
|
-
--shadow-card: var(--shadow-sm);
|
|
34
|
-
--shadow-modal: var(--shadow-md);
|
|
35
|
-
--radius-sm: 8px;
|
|
36
|
-
--radius-md: 10px;
|
|
37
|
-
--radius-lg: 12px;
|
|
38
|
-
--radius-xl: 16px;
|
|
39
|
-
--sidebar-width: 240px;
|
|
40
|
-
--space-sm: 16px;
|
|
41
|
-
--space-md: 24px;
|
|
42
|
-
--space-lg: 32px;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
10
|
.visually-hidden {
|
|
46
11
|
position: absolute;
|
|
47
12
|
width: 1px;
|
package/styles/chat-ui.scss
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
flex-direction: column;
|
|
6
6
|
gap: 12px;
|
|
7
7
|
padding: 16px;
|
|
8
|
-
background: var(--color-bg);
|
|
9
|
-
border: 1px solid var(--color-border);
|
|
10
|
-
border-radius: var(--radius-lg);
|
|
8
|
+
background: var(--eds-color-bg);
|
|
9
|
+
border: 1px solid var(--eds-color-border);
|
|
10
|
+
border-radius: var(--eds-radius-lg);
|
|
11
11
|
scroll-behavior: smooth;
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -36,31 +36,31 @@
|
|
|
36
36
|
gap: 4px;
|
|
37
37
|
max-width: min(78%, 520px);
|
|
38
38
|
padding: 10px 14px;
|
|
39
|
-
border-radius: var(--radius-lg);
|
|
39
|
+
border-radius: var(--eds-radius-lg);
|
|
40
40
|
transition: background 150ms ease, box-shadow 150ms ease;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
.chat-bubble--agent,
|
|
44
44
|
.chat-bubble--ai {
|
|
45
|
-
background: var(--color-chat-ai);
|
|
46
|
-
border: 1px solid var(--color-border);
|
|
47
|
-
border-bottom-left-radius: var(--radius-sm);
|
|
48
|
-
box-shadow: var(--shadow-sm);
|
|
45
|
+
background: var(--eds-color-chat-ai);
|
|
46
|
+
border: 1px solid var(--eds-color-border);
|
|
47
|
+
border-bottom-left-radius: var(--eds-radius-sm);
|
|
48
|
+
box-shadow: var(--eds-shadow-sm);
|
|
49
49
|
|
|
50
50
|
.chat-label {
|
|
51
|
-
color: var(--color-accent);
|
|
51
|
+
color: var(--eds-color-accent);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
.chat-content {
|
|
55
|
-
color: var(--color-text);
|
|
55
|
+
color: var(--eds-color-text);
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
.chat-bubble--caller,
|
|
60
60
|
.chat-bubble--user {
|
|
61
|
-
background: var(--color-primary);
|
|
61
|
+
background: var(--eds-color-primary);
|
|
62
62
|
color: #fff;
|
|
63
|
-
border-bottom-right-radius: var(--radius-sm);
|
|
63
|
+
border-bottom-right-radius: var(--eds-radius-sm);
|
|
64
64
|
box-shadow: 0 4px 12px rgba(54, 129, 244, 0.22);
|
|
65
65
|
|
|
66
66
|
.chat-label {
|
|
@@ -80,21 +80,21 @@
|
|
|
80
80
|
.chat-bubble--tool {
|
|
81
81
|
max-width: min(92%, 640px);
|
|
82
82
|
padding: 8px 14px;
|
|
83
|
-
background: var(--color-primary-light);
|
|
84
|
-
border: 1px dashed var(--color-accent-light);
|
|
85
|
-
border-radius: var(--radius-md);
|
|
83
|
+
background: var(--eds-color-primary-light);
|
|
84
|
+
border: 1px dashed var(--eds-color-accent-light);
|
|
85
|
+
border-radius: var(--eds-radius-md);
|
|
86
86
|
text-align: center;
|
|
87
87
|
|
|
88
88
|
.chat-label {
|
|
89
89
|
justify-content: center;
|
|
90
|
-
color: var(--color-text-muted);
|
|
90
|
+
color: var(--eds-color-text-muted);
|
|
91
91
|
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
92
92
|
font-size: 11.5px;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
.chat-content {
|
|
96
96
|
font-size: 12.5px;
|
|
97
|
-
color: var(--color-text-muted);
|
|
97
|
+
color: var(--eds-color-text-muted);
|
|
98
98
|
text-align: left;
|
|
99
99
|
}
|
|
100
100
|
}
|
|
@@ -128,6 +128,6 @@
|
|
|
128
128
|
|
|
129
129
|
.chat-time {
|
|
130
130
|
font-size: 10.5px;
|
|
131
|
-
color: var(--color-text-soft);
|
|
131
|
+
color: var(--eds-color-text-soft);
|
|
132
132
|
margin-top: 2px;
|
|
133
133
|
}
|