@edvak99/voice-receptionist-widget 1.1.13 → 1.1.14
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 +15 -4
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-DDzSBb6x.mjs +485 -0
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-DDzSBb6x.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-DPE4-h5L.mjs +346 -0
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-DPE4-h5L.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-api-log.util-C0TOKF1q.mjs → edvak99-voice-receptionist-widget-api-log.util-CBVDx4jk.mjs} +2 -2
- package/fesm2022/edvak99-voice-receptionist-widget-api-log.util-CBVDx4jk.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-api-logs-page.component-C3QOPro9.mjs +225 -0
- package/fesm2022/edvak99-voice-receptionist-widget-api-logs-page.component-C3QOPro9.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-api-logs-table.component-Bl7gMi0P.mjs +109 -0
- package/fesm2022/edvak99-voice-receptionist-widget-api-logs-table.component-Bl7gMi0P.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-dBl3Kj6s.mjs +67 -0
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-dBl3Kj6s.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-estyUMH9.mjs +509 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-estyUMH9.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-mBig2itE.mjs +242 -0
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-mBig2itE.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-GVg1g-Vq.mjs → edvak99-voice-receptionist-widget-call-recording-player.component-BqgXwDNi.mjs} +4 -4
- package/fesm2022/edvak99-voice-receptionist-widget-call-recording-player.component-BqgXwDNi.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-WG30w6Jl.mjs → edvak99-voice-receptionist-widget-call-review.service-ft4auA6j.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-WG30w6Jl.mjs.map → edvak99-voice-receptionist-widget-call-review.service-ft4auA6j.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.util-Deh3jPgo.mjs → edvak99-voice-receptionist-widget-call-review.util-rWIPxDtQ.mjs} +2 -2
- package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-rWIPxDtQ.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-_9K7CA1i.mjs +317 -0
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-_9K7CA1i.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-search-field.component-OGRDvYBp.mjs → edvak99-voice-receptionist-widget-eds-search-field.component-BDGCmkoP.mjs} +2 -2
- package/fesm2022/edvak99-voice-receptionist-widget-eds-search-field.component-BDGCmkoP.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-D5VJ5SkB.mjs +6120 -0
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-D5VJ5SkB.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-B4Co4hwp.mjs +432 -0
- package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-B4Co4hwp.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-ihwm1LNn.mjs → edvak99-voice-receptionist-widget-live-monitor-page.component-B23xn4Y_.mjs} +12 -13
- package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-B23xn4Y_.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-Bdh4QfFe.mjs +127 -0
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purpose.util-Bdh4QfFe.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-_lPkAdFS.mjs +263 -0
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-_lPkAdFS.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-task-detail-drawer.component-L5HY3Dxd.mjs +198 -0
- package/fesm2022/edvak99-voice-receptionist-widget-task-detail-drawer.component-L5HY3Dxd.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-DzSVVAM2.mjs +144 -0
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-DzSVVAM2.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget-wizard-page.component-BO6xu0wx.mjs +45 -0
- package/fesm2022/edvak99-voice-receptionist-widget-wizard-page.component-BO6xu0wx.mjs.map +1 -0
- package/fesm2022/edvak99-voice-receptionist-widget.mjs +1 -1
- package/lib/components/agent-settings-drawer/agent-settings-drawer.component.d.ts +10 -0
- package/lib/components/call-tasks-panel/call-tasks-panel.component.d.ts +2 -1
- package/lib/components/outbound-dial-modal/outbound-dial-modal.component.d.ts +63 -0
- package/lib/layout/eds-module-nav.component.d.ts +18 -0
- package/lib/layout/eds-topbar.component.d.ts +21 -0
- package/lib/pages/activities-page/activities-page.component.d.ts +5 -0
- package/lib/pages/analytics-page/analytics-page.component.d.ts +66 -34
- package/lib/pages/audit-page/audit-page.component.d.ts +21 -0
- package/lib/pages/call-history-page/call-history-page.component.d.ts +34 -12
- package/lib/pages/dashboard-page/dashboard-page.component.d.ts +81 -43
- package/lib/pages/live-calls-page/live-calls-page.component.d.ts +27 -6
- package/lib/pages/settings-page/settings-page.component.d.ts +36 -14
- package/lib/services/agent-settings-drawer.service.d.ts +9 -0
- package/lib/ui/ed-avatar.component.d.ts +18 -0
- package/lib/ui/ed-icon-button.component.d.ts +67 -0
- package/lib/ui/ed-icon.component.d.ts +101 -0
- package/lib/ui/eds-badge.component.d.ts +2 -1
- package/lib/ui/eds-button.component.d.ts +1 -1
- package/lib/utils/call-review.util.d.ts +2 -1
- package/package.json +8 -2
- package/public-api.d.ts +2 -1
- package/src/assets/CkBuilder/LICENSE.md +49 -0
- package/src/assets/CkBuilder/README.md +68 -0
- package/src/assets/CkBuilder/build/ckeditor.js +6 -0
- package/src/assets/CkBuilder/build/ckeditor.js.map +1 -0
- package/src/assets/CkBuilder/build/translations/af.js +1 -0
- package/src/assets/CkBuilder/build/translations/ar.js +1 -0
- package/src/assets/CkBuilder/build/translations/ast.js +1 -0
- package/src/assets/CkBuilder/build/translations/az.js +1 -0
- package/src/assets/CkBuilder/build/translations/bg.js +1 -0
- package/src/assets/CkBuilder/build/translations/bn.js +1 -0
- package/src/assets/CkBuilder/build/translations/bs.js +1 -0
- package/src/assets/CkBuilder/build/translations/ca.js +1 -0
- package/src/assets/CkBuilder/build/translations/cs.js +1 -0
- package/src/assets/CkBuilder/build/translations/da.js +1 -0
- package/src/assets/CkBuilder/build/translations/de-ch.js +1 -0
- package/src/assets/CkBuilder/build/translations/de.js +1 -0
- package/src/assets/CkBuilder/build/translations/el.js +1 -0
- package/src/assets/CkBuilder/build/translations/en-au.js +1 -0
- package/src/assets/CkBuilder/build/translations/en.js +1 -0
- package/src/assets/CkBuilder/build/translations/eo.js +1 -0
- package/src/assets/CkBuilder/build/translations/es-co.js +1 -0
- package/src/assets/CkBuilder/build/translations/es.js +1 -0
- package/src/assets/CkBuilder/build/translations/et.js +1 -0
- package/src/assets/CkBuilder/build/translations/eu.js +1 -0
- package/src/assets/CkBuilder/build/translations/fa.js +1 -0
- package/src/assets/CkBuilder/build/translations/fi.js +1 -0
- package/src/assets/CkBuilder/build/translations/fr.js +1 -0
- package/src/assets/CkBuilder/build/translations/gl.js +1 -0
- package/src/assets/CkBuilder/build/translations/gu.js +1 -0
- package/src/assets/CkBuilder/build/translations/he.js +1 -0
- package/src/assets/CkBuilder/build/translations/hi.js +1 -0
- package/src/assets/CkBuilder/build/translations/hr.js +1 -0
- package/src/assets/CkBuilder/build/translations/hu.js +1 -0
- package/src/assets/CkBuilder/build/translations/id.js +1 -0
- package/src/assets/CkBuilder/build/translations/it.js +1 -0
- package/src/assets/CkBuilder/build/translations/ja.js +1 -0
- package/src/assets/CkBuilder/build/translations/jv.js +1 -0
- package/src/assets/CkBuilder/build/translations/kk.js +1 -0
- package/src/assets/CkBuilder/build/translations/km.js +1 -0
- package/src/assets/CkBuilder/build/translations/kn.js +1 -0
- package/src/assets/CkBuilder/build/translations/ko.js +1 -0
- package/src/assets/CkBuilder/build/translations/ku.js +1 -0
- package/src/assets/CkBuilder/build/translations/lt.js +1 -0
- package/src/assets/CkBuilder/build/translations/lv.js +1 -0
- package/src/assets/CkBuilder/build/translations/ms.js +1 -0
- package/src/assets/CkBuilder/build/translations/nb.js +1 -0
- package/src/assets/CkBuilder/build/translations/ne.js +1 -0
- package/src/assets/CkBuilder/build/translations/nl.js +1 -0
- package/src/assets/CkBuilder/build/translations/no.js +1 -0
- package/src/assets/CkBuilder/build/translations/oc.js +1 -0
- package/src/assets/CkBuilder/build/translations/pl.js +1 -0
- package/src/assets/CkBuilder/build/translations/pt-br.js +1 -0
- package/src/assets/CkBuilder/build/translations/pt.js +1 -0
- package/src/assets/CkBuilder/build/translations/ro.js +1 -0
- package/src/assets/CkBuilder/build/translations/ru.js +1 -0
- package/src/assets/CkBuilder/build/translations/si.js +1 -0
- package/src/assets/CkBuilder/build/translations/sk.js +1 -0
- package/src/assets/CkBuilder/build/translations/sl.js +1 -0
- package/src/assets/CkBuilder/build/translations/sq.js +1 -0
- package/src/assets/CkBuilder/build/translations/sr-latn.js +1 -0
- package/src/assets/CkBuilder/build/translations/sr.js +1 -0
- package/src/assets/CkBuilder/build/translations/sv.js +1 -0
- package/src/assets/CkBuilder/build/translations/th.js +1 -0
- package/src/assets/CkBuilder/build/translations/tk.js +1 -0
- package/src/assets/CkBuilder/build/translations/tr.js +1 -0
- package/src/assets/CkBuilder/build/translations/tt.js +1 -0
- package/src/assets/CkBuilder/build/translations/ug.js +1 -0
- package/src/assets/CkBuilder/build/translations/uk.js +1 -0
- package/src/assets/CkBuilder/build/translations/ur.js +1 -0
- package/src/assets/CkBuilder/build/translations/uz.js +1 -0
- package/src/assets/CkBuilder/build/translations/vi.js +1 -0
- package/src/assets/CkBuilder/build/translations/zh-cn.js +1 -0
- package/src/assets/CkBuilder/build/translations/zh.js +1 -0
- package/src/assets/CkBuilder/webpack.config.js +97 -0
- package/src/assets/Mike/index.js +3 -0
- package/src/assets/annyang.js +725 -0
- package/src/assets/blue_icon_f.png +0 -0
- package/src/assets/client.js +186 -0
- package/src/assets/css/Ed_style.scss +1034 -0
- package/src/assets/css/_alerts.scss +66 -0
- package/src/assets/css/_animation.scss +88 -0
- package/src/assets/css/_api-log-chips.scss +30 -0
- package/src/assets/css/_avatar.scss +317 -0
- package/src/assets/css/_badge.scss +126 -0
- package/src/assets/css/_buttons.scss +110 -0
- package/src/assets/css/_checkbox_radio.scss +174 -0
- package/src/assets/css/_colors.scss +314 -0
- package/src/assets/css/_customfile_upload.scss +18 -0
- package/src/assets/css/_date_picker.scss +119 -0
- package/src/assets/css/_focus.scss +56 -0
- package/src/assets/css/_fontsize.scss +0 -0
- package/src/assets/css/_headings.scss +87 -0
- package/src/assets/css/_input.scss +153 -0
- package/src/assets/css/_list.scss +83 -0
- package/src/assets/css/_main-layout.scss +123 -0
- package/src/assets/css/_material_symbols.scss +31 -0
- package/src/assets/css/_ng-select.scss +124 -0
- package/src/assets/css/_resize-handler.directive.scss +46 -0
- package/src/assets/css/_root.scss +258 -0
- package/src/assets/css/_select.scss +72 -0
- package/src/assets/css/_smart-scroll.scss +93 -0
- package/src/assets/css/_smooth-scrollbar.scss +196 -0
- package/src/assets/css/_tables.css +1 -0
- package/src/assets/css/_tables.scss +815 -0
- package/src/assets/css/_tabs.css +1 -0
- package/src/assets/css/_tabs.scss +22 -0
- package/src/assets/css/_tag.scss +18 -0
- package/src/assets/css/_zindex.scss +3 -0
- package/src/assets/css/animations.css +17 -0
- package/src/assets/css/custom-elements.css +1 -0
- package/src/assets/css/custom-elements.scss +742 -0
- package/src/assets/css/font-awesome.css +4586 -0
- package/src/assets/css/foxit/contextMenu.css +298 -0
- package/src/assets/css/foxit/datepicker.css +31931 -0
- package/src/assets/css/foxit/foxit.css +8500 -0
- package/src/assets/css/icons.scss +57 -0
- package/src/assets/css/jstree.style.min.css +1 -0
- package/src/assets/css/masonrt.scss +36 -0
- package/src/assets/css/patient-portal-disclaimer-global.scss +68 -0
- package/src/assets/css/printstyle.css +839 -0
- package/src/assets/css/shoelace-edit.css +1 -0
- package/src/assets/css/shoelace-edit.scss +513 -0
- package/src/assets/css/styles.css +0 -0
- package/src/assets/css/task-description-tiptap-global.scss +84 -0
- package/src/assets/css/themes/default.css +484 -0
- package/src/assets/css/themes/green-bright.css +484 -0
- package/src/assets/css/themes/light.css +472 -0
- package/src/assets/css/tour-guide.scss +238 -0
- package/src/assets/data/growth-chart/GROWTH_CHART_LMS.json +27202 -0
- package/src/assets/favicon.png +0 -0
- package/src/assets/fonts/call-hover.svg +6 -0
- package/src/assets/fonts/edvak-fonts.eot +0 -0
- package/src/assets/fonts/edvak-fonts.svg +50 -0
- package/src/assets/fonts/edvak-fonts.ttf +0 -0
- package/src/assets/fonts/edvak-fonts.woff +0 -0
- package/src/assets/fonts/flaticon_mycollection.css +23 -0
- package/src/assets/fonts/flaticon_mycollection.eot +0 -0
- package/src/assets/fonts/flaticon_mycollection.html +463 -0
- package/src/assets/fonts/flaticon_mycollection.scss +29 -0
- package/src/assets/fonts/flaticon_mycollection.svg +15 -0
- package/src/assets/fonts/flaticon_mycollection.ttf +0 -0
- package/src/assets/fonts/flaticon_mycollection.woff +0 -0
- package/src/assets/fonts/flaticon_mycollection.woff2 +0 -0
- package/src/assets/fonts/font_face.txt +234 -0
- package/src/assets/fonts/inter.css +567 -0
- package/src/assets/fonts/lato.css +72 -0
- package/src/assets/fonts/message-hover.svg +7 -0
- package/src/assets/fonts/notes-hover.svg +8 -0
- package/src/assets/fonts/poppins-v20-latin-100.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-100.svg +320 -0
- package/src/assets/fonts/poppins-v20-latin-100.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-100.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-100.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-100italic.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-100italic.svg +341 -0
- package/src/assets/fonts/poppins-v20-latin-100italic.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-100italic.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-100italic.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-200.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-200.svg +319 -0
- package/src/assets/fonts/poppins-v20-latin-200.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-200.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-200.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-200italic.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-200italic.svg +336 -0
- package/src/assets/fonts/poppins-v20-latin-200italic.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-200italic.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-200italic.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-300.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-300.svg +321 -0
- package/src/assets/fonts/poppins-v20-latin-300.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-300.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-300.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-300italic.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-300italic.svg +336 -0
- package/src/assets/fonts/poppins-v20-latin-300italic.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-300italic.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-300italic.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-500.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-500.svg +323 -0
- package/src/assets/fonts/poppins-v20-latin-500.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-500.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-500.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-500italic.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-500italic.svg +338 -0
- package/src/assets/fonts/poppins-v20-latin-500italic.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-500italic.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-500italic.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-600.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-600.svg +322 -0
- package/src/assets/fonts/poppins-v20-latin-600.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-600.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-600.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-600italic.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-600italic.svg +338 -0
- package/src/assets/fonts/poppins-v20-latin-600italic.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-600italic.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-600italic.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-700.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-700.svg +322 -0
- package/src/assets/fonts/poppins-v20-latin-700.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-700.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-700.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-700italic.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-700italic.svg +336 -0
- package/src/assets/fonts/poppins-v20-latin-700italic.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-700italic.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-700italic.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-800.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-800.svg +320 -0
- package/src/assets/fonts/poppins-v20-latin-800.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-800.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-800.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-800italic.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-800italic.svg +335 -0
- package/src/assets/fonts/poppins-v20-latin-800italic.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-800italic.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-800italic.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-900.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-900.svg +321 -0
- package/src/assets/fonts/poppins-v20-latin-900.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-900.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-900.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-900italic.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-900italic.svg +335 -0
- package/src/assets/fonts/poppins-v20-latin-900italic.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-900italic.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-900italic.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-italic.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-italic.svg +336 -0
- package/src/assets/fonts/poppins-v20-latin-italic.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-italic.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-italic.woff2 +0 -0
- package/src/assets/fonts/poppins-v20-latin-regular.eot +0 -0
- package/src/assets/fonts/poppins-v20-latin-regular.svg +323 -0
- package/src/assets/fonts/poppins-v20-latin-regular.ttf +0 -0
- package/src/assets/fonts/poppins-v20-latin-regular.woff +0 -0
- package/src/assets/fonts/poppins-v20-latin-regular.woff2 +0 -0
- package/src/assets/fonts/schedule-hover.svg +13 -0
- package/src/assets/fonts/video-call-hover.svg +6 -0
- package/src/assets/home.css +152 -0
- package/src/assets/icons/AI.svg +15 -0
- package/src/assets/icons/AddressBook.svg +3 -0
- package/src/assets/icons/ArrowArcLeft.svg +3 -0
- package/src/assets/icons/ArrowCircleDownLeft.png +0 -0
- package/src/assets/icons/ArrowCircleDownLeft.svg +3 -0
- package/src/assets/icons/ArrowClockwise.svg +3 -0
- package/src/assets/icons/ArrowLeft.svg +3 -0
- package/src/assets/icons/ArrowUpRight.svg +3 -0
- package/src/assets/icons/ArrowsCounterClockwise.svg +3 -0
- package/src/assets/icons/ArrowsLeftRight.svg +3 -0
- package/src/assets/icons/Avatar.svg +4 -0
- package/src/assets/icons/Baby.svg +3 -0
- package/src/assets/icons/BookOpenText.svg +3 -0
- package/src/assets/icons/CalendarCheck.svg +3 -0
- package/src/assets/icons/CalendarDot.svg +3 -0
- package/src/assets/icons/CalendarDots.svg +3 -0
- package/src/assets/icons/CalendarX.svg +3 -0
- package/src/assets/icons/Camera.svg +3 -0
- package/src/assets/icons/CameraDisable.svg +3 -0
- package/src/assets/icons/ChatText.svg +3 -0
- package/src/assets/icons/ClockCountdown.svg +3 -0
- package/src/assets/icons/ClockCounterClockwise.svg +3 -0
- package/src/assets/icons/ClockUser.svg +3 -0
- package/src/assets/icons/CloudCheck.svg +3 -0
- package/src/assets/icons/CrownSimple.svg +3 -0
- package/src/assets/icons/CurrencyDollar.svg +3 -0
- package/src/assets/icons/Desktop.svg +3 -0
- package/src/assets/icons/Encounter.svg +4 -0
- package/src/assets/icons/EnvelopeSimple.svg +3 -0
- package/src/assets/icons/FileDoc.svg +3 -0
- package/src/assets/icons/FilePdf.svg +3 -0
- package/src/assets/icons/FileText.png +0 -0
- package/src/assets/icons/FileText.svg +3 -0
- package/src/assets/icons/FileTextNew.svg +3 -0
- package/src/assets/icons/FileXml.svg +4 -0
- package/src/assets/icons/FirstAid.svg +3 -0
- package/src/assets/icons/Gif.svg +3 -0
- package/src/assets/icons/Globe.svg +3 -0
- package/src/assets/icons/HandPointing.svg +3 -0
- package/src/assets/icons/Heart.svg +3 -0
- package/src/assets/icons/Image-ic.svg +3 -0
- package/src/assets/icons/Labs_Imaging.svg +8 -0
- package/src/assets/icons/Link.svg +3 -0
- package/src/assets/icons/LockSimple.svg +3 -0
- package/src/assets/icons/MapPin.svg +3 -0
- package/src/assets/icons/MapPin_new.svg +3 -0
- package/src/assets/icons/Microscope.svg +3 -0
- package/src/assets/icons/MinusCircle.svg +3 -0
- package/src/assets/icons/NoFile.svg +4 -0
- package/src/assets/icons/NotePencil.png +0 -0
- package/src/assets/icons/NotePencil.svg +3 -0
- package/src/assets/icons/Notepad.svg +3 -0
- package/src/assets/icons/OfficeChair.svg +3 -0
- package/src/assets/icons/Other Files.svg +3 -0
- package/src/assets/icons/PaperPlaneTilt.svg +3 -0
- package/src/assets/icons/Paperclip.svg +3 -0
- package/src/assets/icons/Password.svg +3 -0
- package/src/assets/icons/Phone.svg +3 -0
- package/src/assets/icons/Pulse.svg +3 -0
- package/src/assets/icons/Refund_Icon.svg +5 -0
- package/src/assets/icons/Refund_new.svg +5 -0
- package/src/assets/icons/Robot.svg +3 -0
- package/src/assets/icons/ShieldCheck.svg +3 -0
- package/src/assets/icons/Suitcase.svg +3 -0
- package/src/assets/icons/Table-ic.svg +3 -0
- package/src/assets/icons/TagSimple.svg +3 -0
- package/src/assets/icons/TextAlignLeft.svg +3 -0
- package/src/assets/icons/Translate.svg +3 -0
- package/src/assets/icons/Trash.svg +3 -0
- package/src/assets/icons/User.svg +3 -0
- package/src/assets/icons/UserCheck.svg +3 -0
- package/src/assets/icons/User_new.svg +10 -0
- package/src/assets/icons/Users.svg +3 -0
- package/src/assets/icons/WarningCircle.svg +3 -0
- package/src/assets/icons/accessibility.svg +8 -0
- package/src/assets/icons/account_tree.svg +8 -0
- package/src/assets/icons/add.svg +8 -0
- package/src/assets/icons/add_box.svg +1 -0
- package/src/assets/icons/add_call-fill.svg +1 -0
- package/src/assets/icons/add_call.svg +1 -0
- package/src/assets/icons/add_circle.svg +8 -0
- package/src/assets/icons/add_link.svg +8 -0
- package/src/assets/icons/add_reaction.svg +8 -0
- package/src/assets/icons/add_text.svg +3 -0
- package/src/assets/icons/admin_panel_settings.svg +8 -0
- package/src/assets/icons/ai_1.svg +4 -0
- package/src/assets/icons/ai_new.svg +8 -0
- package/src/assets/icons/alarm.svg +8 -0
- package/src/assets/icons/alternate_email.svg +8 -0
- package/src/assets/icons/ambulance.svg +15 -0
- package/src/assets/icons/ambulance_2.svg +17 -0
- package/src/assets/icons/android.svg +6 -0
- package/src/assets/icons/appointments.svg +3 -0
- package/src/assets/icons/archive.svg +8 -0
- package/src/assets/icons/archive_new.svg +3 -0
- package/src/assets/icons/arrow-bar-right.svg +3 -0
- package/src/assets/icons/arrow-repeat.svg +4 -0
- package/src/assets/icons/arrow_back.svg +8 -0
- package/src/assets/icons/arrow_downward_alt.svg +8 -0
- package/src/assets/icons/arrow_drop_down.svg +8 -0
- package/src/assets/icons/arrow_fat_up.svg +3 -0
- package/src/assets/icons/arrow_left.svg +1 -0
- package/src/assets/icons/arrow_left_alt.svg +8 -0
- package/src/assets/icons/arrow_right.svg +3 -0
- package/src/assets/icons/arrow_right_alt.svg +8 -0
- package/src/assets/icons/arrow_top_left.svg +8 -0
- package/src/assets/icons/arrow_upward.svg +8 -0
- package/src/assets/icons/arrow_upward_alt.svg +8 -0
- package/src/assets/icons/arrows_merge.svg +3 -0
- package/src/assets/icons/article-fill.svg +1 -0
- package/src/assets/icons/article-off.svg +9 -0
- package/src/assets/icons/article.svg +8 -0
- package/src/assets/icons/at.svg +3 -0
- package/src/assets/icons/atr.svg +8 -0
- package/src/assets/icons/attach_file.svg +8 -0
- package/src/assets/icons/attach_file_45.svg +8 -0
- package/src/assets/icons/attach_money.svg +8 -0
- package/src/assets/icons/attachment.svg +8 -0
- package/src/assets/icons/auto_awesome_mosaic.svg +8 -0
- package/src/assets/icons/auto_pay.xml +11 -0
- package/src/assets/icons/auto_pay_new.svg +8 -0
- package/src/assets/icons/backspace_fill.svg +8 -0
- package/src/assets/icons/bandaids.svg +3 -0
- package/src/assets/icons/bell_simple_ringing.svg +3 -0
- package/src/assets/icons/bell_simple_z.svg +3 -0
- package/src/assets/icons/block.svg +8 -0
- package/src/assets/icons/bolt.svg +8 -0
- package/src/assets/icons/bolt_ai.svg +3 -0
- package/src/assets/icons/bolt_new.svg +11 -0
- package/src/assets/icons/book_open.svg +3 -0
- package/src/assets/icons/border_color.svg +8 -0
- package/src/assets/icons/box_edit.svg +8 -0
- package/src/assets/icons/brightness_1.svg +8 -0
- package/src/assets/icons/bubble.svg +8 -0
- package/src/assets/icons/building_apartment.svg +3 -0
- package/src/assets/icons/cached.svg +8 -0
- package/src/assets/icons/calculate.svg +8 -0
- package/src/assets/icons/calendar-star.svg +3 -0
- package/src/assets/icons/calendar-x.svg +4 -0
- package/src/assets/icons/calendar_clock.svg +8 -0
- package/src/assets/icons/calendar_dot.svg +3 -0
- package/src/assets/icons/calendar_down.svg +9 -0
- package/src/assets/icons/calendar_month.svg +8 -0
- package/src/assets/icons/calendar_plus.svg +3 -0
- package/src/assets/icons/calendar_today.svg +8 -0
- package/src/assets/icons/calendar_up.svg +9 -0
- package/src/assets/icons/call-fill.svg +8 -0
- package/src/assets/icons/call.svg +8 -0
- package/src/assets/icons/call_end-fill.svg +1 -0
- package/src/assets/icons/call_end.svg +1 -0
- package/src/assets/icons/call_fill.svg +8 -0
- package/src/assets/icons/call_log-fill.svg +1 -0
- package/src/assets/icons/call_log.svg +1 -0
- package/src/assets/icons/call_made.svg +8 -0
- package/src/assets/icons/call_merge.svg +1 -0
- package/src/assets/icons/call_missed.svg +1 -0
- package/src/assets/icons/call_missed_outgoing.svg +1 -0
- package/src/assets/icons/call_quality-fill.svg +1 -0
- package/src/assets/icons/call_quality.svg +1 -0
- package/src/assets/icons/call_received.svg +1 -0
- package/src/assets/icons/call_split.svg +1 -0
- package/src/assets/icons/call_to_action-fill.svg +1 -0
- package/src/assets/icons/call_to_action.svg +1 -0
- package/src/assets/icons/campaign.svg +8 -0
- package/src/assets/icons/cancel.svg +8 -0
- package/src/assets/icons/card-list.svg +4 -0
- package/src/assets/icons/caret_down.svg +3 -0
- package/src/assets/icons/caret_left.svg +3 -0
- package/src/assets/icons/caret_right.svg +3 -0
- package/src/assets/icons/caret_up.svg +3 -0
- package/src/assets/icons/cash.svg +16 -0
- package/src/assets/icons/changelog.svg +3 -0
- package/src/assets/icons/chart_data.svg +8 -0
- package/src/assets/icons/chartline.svg +3 -0
- package/src/assets/icons/chat-fill.svg +1 -0
- package/src/assets/icons/chat.svg +8 -0
- package/src/assets/icons/chat_bubble.svg +8 -0
- package/src/assets/icons/chat_new.svg +3 -0
- package/src/assets/icons/chat_text.svg +3 -0
- package/src/assets/icons/check-circle-fill.svg +3 -0
- package/src/assets/icons/check-tooltip-success.svg +8 -0
- package/src/assets/icons/check.svg +15 -0
- package/src/assets/icons/check2-all.svg +4 -0
- package/src/assets/icons/check_circle.svg +8 -0
- package/src/assets/icons/check_circle_fill.svg +8 -0
- package/src/assets/icons/check_square.svg +3 -0
- package/src/assets/icons/chevron_left.svg +15 -0
- package/src/assets/icons/chevron_right.svg +8 -0
- package/src/assets/icons/chronic-fill.svg +1 -0
- package/src/assets/icons/chronic.svg +1 -0
- package/src/assets/icons/circle-fill.svg +3 -0
- package/src/assets/icons/circle_notifications-fill.svg +1 -0
- package/src/assets/icons/circle_notifications.svg +1 -0
- package/src/assets/icons/clear-all.svg +1 -0
- package/src/assets/icons/clinic.svg +3 -0
- package/src/assets/icons/clinic_settings.svg +3 -0
- package/src/assets/icons/clinical_notes.svg +8 -0
- package/src/assets/icons/clipboard-check.svg +5 -0
- package/src/assets/icons/clipboard_text.svg +3 -0
- package/src/assets/icons/clock-history.svg +5 -0
- package/src/assets/icons/clock.svg +3 -0
- package/src/assets/icons/clock_countdown.svg +3 -0
- package/src/assets/icons/clock_loader_40.svg +8 -0
- package/src/assets/icons/close.svg +1 -0
- package/src/assets/icons/close_circle_fill.svg +4 -0
- package/src/assets/icons/collapse_all.svg +1 -0
- package/src/assets/icons/collapse_content.svg +8 -0
- package/src/assets/icons/collections_bookmark-fill.svg +1 -0
- package/src/assets/icons/collections_bookmark.svg +1 -0
- package/src/assets/icons/columns.svg +3 -0
- package/src/assets/icons/comment.svg +15 -0
- package/src/assets/icons/compare_arrows.svg +8 -0
- package/src/assets/icons/contact_page.svg +8 -0
- package/src/assets/icons/content_copy-fill.svg +1 -0
- package/src/assets/icons/content_copy.svg +8 -0
- package/src/assets/icons/copy.svg +3 -0
- package/src/assets/icons/copy_all.svg +8 -0
- package/src/assets/icons/copy_simple.svg +3 -0
- package/src/assets/icons/create_new_folder.svg +8 -0
- package/src/assets/icons/credit_card-fill.svg +1 -0
- package/src/assets/icons/credit_card.svg +8 -0
- package/src/assets/icons/credit_card_off-fill.svg +1 -0
- package/src/assets/icons/credit_card_off.svg +1 -0
- package/src/assets/icons/cube.svg +3 -0
- package/src/assets/icons/currency_circle_dollar.svg +3 -0
- package/src/assets/icons/cursor_click.svg +3 -0
- package/src/assets/icons/custom_dropdown.svg +8 -0
- package/src/assets/icons/dangerous.svg +8 -0
- package/src/assets/icons/darwinIcon.svg +4 -0
- package/src/assets/icons/dash-circle.svg +4 -0
- package/src/assets/icons/dashboard_customize.svg +8 -0
- package/src/assets/icons/data_object.svg +8 -0
- package/src/assets/icons/data_object_bold.svg +8 -0
- package/src/assets/icons/delete-fill.svg +1 -0
- package/src/assets/icons/delete.svg +8 -0
- package/src/assets/icons/demography.svg +8 -0
- package/src/assets/icons/derm-lesion.svg +4 -0
- package/src/assets/icons/derm-site.svg +3 -0
- package/src/assets/icons/description.svg +15 -0
- package/src/assets/icons/desktop_windows.svg +8 -0
- package/src/assets/icons/dialpad.svg +1 -0
- package/src/assets/icons/discover_tune.svg +1 -0
- package/src/assets/icons/do_not_disturb_off.svg +8 -0
- package/src/assets/icons/do_not_disturb_on.svg +8 -0
- package/src/assets/icons/document_scanner.svg +8 -0
- package/src/assets/icons/dollar_note.svg +8 -0
- package/src/assets/icons/domain.svg +8 -0
- package/src/assets/icons/done.svg +1 -0
- package/src/assets/icons/done_all.svg +8 -0
- package/src/assets/icons/dot.svg +3 -0
- package/src/assets/icons/dots_three.svg +3 -0
- package/src/assets/icons/double_arrow.svg +1 -0
- package/src/assets/icons/download.svg +8 -0
- package/src/assets/icons/draft.svg +8 -0
- package/src/assets/icons/drag_indicator.svg +1 -0
- package/src/assets/icons/draw.svg +3 -0
- package/src/assets/icons/drive_file_move.svg +1 -0
- package/src/assets/icons/eFax.svg +17 -0
- package/src/assets/icons/east.svg +8 -0
- package/src/assets/icons/ecg.svg +8 -0
- package/src/assets/icons/ecg_heart.svg +8 -0
- package/src/assets/icons/ed-doctor.svg +15 -0
- package/src/assets/icons/ed-event_history.svg +8 -0
- package/src/assets/icons/ed-form-disable.svg +9 -0
- package/src/assets/icons/ed-past_history.svg +9 -0
- package/src/assets/icons/ed-payment_history.svg +9 -0
- package/src/assets/icons/ed-receive.svg +9 -0
- package/src/assets/icons/ed-refund.svg +9 -0
- package/src/assets/icons/ed-regular-notes.svg +6 -0
- package/src/assets/icons/ed_transaction_download.svg +6 -0
- package/src/assets/icons/edit-fill.svg +1 -0
- package/src/assets/icons/edit.svg +15 -0
- package/src/assets/icons/edit_calendar.svg +8 -0
- package/src/assets/icons/edit_document.svg +8 -0
- package/src/assets/icons/edit_note.svg +1 -0
- package/src/assets/icons/edit_notifications-fill.svg +1 -0
- package/src/assets/icons/edit_notifications.svg +1 -0
- package/src/assets/icons/edit_square-fill.svg +1 -0
- package/src/assets/icons/edit_square.svg +1 -0
- package/src/assets/icons/edvak_icon.svg +12 -0
- package/src/assets/icons/email.svg +8 -0
- package/src/assets/icons/encounters_h.svg +3 -0
- package/src/assets/icons/endocrinology.svg +8 -0
- package/src/assets/icons/ent.svg +8 -0
- package/src/assets/icons/error.svg +8 -0
- package/src/assets/icons/erx.svg +8 -0
- package/src/assets/icons/event.svg +8 -0
- package/src/assets/icons/event_available-fill.svg +1 -0
- package/src/assets/icons/event_available.svg +1 -0
- package/src/assets/icons/event_busy.svg +8 -0
- package/src/assets/icons/event_upcoming.svg +1 -0
- package/src/assets/icons/expand_content.svg +8 -0
- package/src/assets/icons/expand_less.svg +8 -0
- package/src/assets/icons/expand_more.svg +8 -0
- package/src/assets/icons/expansion_panels.svg +3 -0
- package/src/assets/icons/export_notes.svg +8 -0
- package/src/assets/icons/favorite.svg +8 -0
- package/src/assets/icons/fax.svg +1 -0
- package/src/assets/icons/feedback.svg +3 -0
- package/src/assets/icons/fiber_manual_record.svg +15 -0
- package/src/assets/icons/fiber_smart_record.svg +8 -0
- package/src/assets/icons/file-arrow-up.svg +4 -0
- package/src/assets/icons/file_csv.svg +3 -0
- package/src/assets/icons/file_docx.svg +3 -0
- package/src/assets/icons/file_image.svg +3 -0
- package/src/assets/icons/file_jpg.svg +3 -0
- package/src/assets/icons/file_pdf.svg +3 -0
- package/src/assets/icons/file_png.svg +3 -0
- package/src/assets/icons/file_text_new.svg +3 -0
- package/src/assets/icons/file_xls.svg +3 -0
- package/src/assets/icons/files.svg +3 -0
- package/src/assets/icons/files_new.svg +3 -0
- package/src/assets/icons/filetype-pdf.svg +3 -0
- package/src/assets/icons/filter_alt.svg +8 -0
- package/src/assets/icons/flag.svg +3 -0
- package/src/assets/icons/flash_on.svg +22 -0
- package/src/assets/icons/flask.svg +3 -0
- package/src/assets/icons/floppy_disk_back.svg +3 -0
- package/src/assets/icons/folder.svg +8 -0
- package/src/assets/icons/folder_open.svg +8 -0
- package/src/assets/icons/folder_plus.svg +3 -0
- package/src/assets/icons/folder_simple.svg +4 -0
- package/src/assets/icons/folders.svg +3 -0
- package/src/assets/icons/format_align_center.svg +8 -0
- package/src/assets/icons/format_align_justify.svg +8 -0
- package/src/assets/icons/format_align_left.svg +8 -0
- package/src/assets/icons/format_align_right.svg +8 -0
- package/src/assets/icons/format_bold.svg +8 -0
- package/src/assets/icons/format_clear.svg +8 -0
- package/src/assets/icons/format_color_text.svg +8 -0
- package/src/assets/icons/format_ink_highlighter.svg +8 -0
- package/src/assets/icons/format_italic.svg +8 -0
- package/src/assets/icons/format_list_bulleted.svg +8 -0
- package/src/assets/icons/format_list_numbered.svg +8 -0
- package/src/assets/icons/format_underlined.svg +8 -0
- package/src/assets/icons/full_coverage.svg +1 -0
- package/src/assets/icons/funnel.svg +3 -0
- package/src/assets/icons/gastroenterology.svg +8 -0
- package/src/assets/icons/gavel.svg +3 -0
- package/src/assets/icons/gesture.svg +8 -0
- package/src/assets/icons/gift.svg +3 -0
- package/src/assets/icons/git_merge.svg +3 -0
- package/src/assets/icons/googleSync.svg +6 -0
- package/src/assets/icons/google_icon.svg +7 -0
- package/src/assets/icons/gpp_bad.svg +8 -0
- package/src/assets/icons/gpp_bad_fill.svg +8 -0
- package/src/assets/icons/gpp_maybe.svg +8 -0
- package/src/assets/icons/gpp_maybe_fill.svg +8 -0
- package/src/assets/icons/grab.svg +4 -0
- package/src/assets/icons/grabbing.svg +17 -0
- package/src/assets/icons/graph.svg +8 -0
- package/src/assets/icons/graph_new.svg +3 -0
- package/src/assets/icons/grid_view.svg +8 -0
- package/src/assets/icons/group.svg +8 -0
- package/src/assets/icons/group_n.svg +3 -0
- package/src/assets/icons/groups.svg +1 -0
- package/src/assets/icons/growth_chart_trend_down.svg +3 -0
- package/src/assets/icons/growth_chart_trend_grey_down.svg +3 -0
- package/src/assets/icons/growth_chart_trend_grey_up.svg +3 -0
- package/src/assets/icons/growth_chart_trend_up.svg +3 -0
- package/src/assets/icons/health_and_safety.svg +8 -0
- package/src/assets/icons/health_and_safety_fill.svg +8 -0
- package/src/assets/icons/heartbeat.svg +3 -0
- package/src/assets/icons/help.svg +8 -0
- package/src/assets/icons/hide_source.svg +1 -0
- package/src/assets/icons/history.svg +8 -0
- package/src/assets/icons/history_toggle_off.svg +8 -0
- package/src/assets/icons/home.svg +8 -0
- package/src/assets/icons/home_pin.svg +8 -0
- package/src/assets/icons/horizontal_rule.svg +8 -0
- package/src/assets/icons/hospital.svg +3 -0
- package/src/assets/icons/how_to_reg.svg +8 -0
- package/src/assets/icons/icon-128x128.png +0 -0
- package/src/assets/icons/icon-144x144.png +0 -0
- package/src/assets/icons/icon-152x152.png +0 -0
- package/src/assets/icons/icon-192x192.png +0 -0
- package/src/assets/icons/icon-384x384.png +0 -0
- package/src/assets/icons/icon-512x512.png +0 -0
- package/src/assets/icons/icon-72x72.png +0 -0
- package/src/assets/icons/icon-96x96.png +0 -0
- package/src/assets/icons/id_card.svg +8 -0
- package/src/assets/icons/identification_card.svg +3 -0
- package/src/assets/icons/imagesmode.svg +8 -0
- package/src/assets/icons/import.svg +4 -0
- package/src/assets/icons/inactive_user.svg +9 -0
- package/src/assets/icons/info-fill.svg +1 -0
- package/src/assets/icons/info-square.svg +4 -0
- package/src/assets/icons/info.svg +8 -0
- package/src/assets/icons/info_i.svg +1 -0
- package/src/assets/icons/inprogress.svg +3 -0
- package/src/assets/icons/insights.svg +1 -0
- package/src/assets/icons/inventory_2.svg +8 -0
- package/src/assets/icons/ios.svg +4 -0
- package/src/assets/icons/journal-plus.svg +5 -0
- package/src/assets/icons/journal-plus1.svg +5 -0
- package/src/assets/icons/keep.svg +8 -0
- package/src/assets/icons/key-person.svg +3 -0
- package/src/assets/icons/key.svg +1 -0
- package/src/assets/icons/keyboard_arrow_down-fill.svg +1 -0
- package/src/assets/icons/keyboard_arrow_down.svg +8 -0
- package/src/assets/icons/keyboard_arrow_left-fill.svg +1 -0
- package/src/assets/icons/keyboard_arrow_left.svg +15 -0
- package/src/assets/icons/keyboard_arrow_right-fill.svg +1 -0
- package/src/assets/icons/keyboard_arrow_right.svg +8 -0
- package/src/assets/icons/keyboard_arrow_up-fill.svg +1 -0
- package/src/assets/icons/keyboard_arrow_up.svg +8 -0
- package/src/assets/icons/keyboard_backspace.svg +1 -0
- package/src/assets/icons/keyboard_double_arrow_left.svg +8 -0
- package/src/assets/icons/keyboard_double_arrow_right.svg +8 -0
- package/src/assets/icons/keyboard_voice-fill.svg +1 -0
- package/src/assets/icons/keyboard_voice.svg +1 -0
- package/src/assets/icons/lab_profile-fill.svg +1 -0
- package/src/assets/icons/lab_profile.svg +8 -0
- package/src/assets/icons/label-tag.svg +9 -0
- package/src/assets/icons/label.svg +8 -0
- package/src/assets/icons/label_important.svg +8 -0
- package/src/assets/icons/labs.svg +15 -0
- package/src/assets/icons/language.svg +8 -0
- package/src/assets/icons/library.svg +8 -0
- package/src/assets/icons/lightning-charge-fill.svg +3 -0
- package/src/assets/icons/lightning.svg +3 -0
- package/src/assets/icons/link-45deg.svg +4 -0
- package/src/assets/icons/link-break.svg +3 -0
- package/src/assets/icons/link-simple-horizontal.svg +3 -0
- package/src/assets/icons/link_new.svg +3 -0
- package/src/assets/icons/list_checks.svg +3 -0
- package/src/assets/icons/list_magnifying_glass.svg +3 -0
- package/src/assets/icons/list_star.svg +3 -0
- package/src/assets/icons/local_activity.svg +8 -0
- package/src/assets/icons/local_atm.svg +8 -0
- package/src/assets/icons/local_pharmacy.svg +8 -0
- package/src/assets/icons/local_police.svg +1 -0
- package/src/assets/icons/local_post_office.svg +8 -0
- package/src/assets/icons/location_home.svg +8 -0
- package/src/assets/icons/location_off.svg +1 -0
- package/src/assets/icons/location_on-fill.svg +8 -0
- package/src/assets/icons/location_on.svg +8 -0
- package/src/assets/icons/lock-new.svg +25 -0
- package/src/assets/icons/lock.svg +8 -0
- package/src/assets/icons/lock_open_right.svg +1 -0
- package/src/assets/icons/lock_person.svg +8 -0
- package/src/assets/icons/logos_google-calendar.svg +17 -0
- package/src/assets/icons/logout.svg +1 -0
- package/src/assets/icons/magnifying_glass.svg +3 -0
- package/src/assets/icons/mail.svg +8 -0
- package/src/assets/icons/manage_accounts.svg +1 -0
- package/src/assets/icons/mark_chat_unread.svg +10 -0
- package/src/assets/icons/mask_group.svg +8 -0
- package/src/assets/icons/material-symbol-1.svg +5 -0
- package/src/assets/icons/material-symbol.svg +22 -0
- package/src/assets/icons/medication.svg +8 -0
- package/src/assets/icons/medication_liquid.svg +8 -0
- package/src/assets/icons/mic-300.svg +1 -0
- package/src/assets/icons/mic-fill.svg +1 -0
- package/src/assets/icons/mic.svg +8 -0
- package/src/assets/icons/mic_off-fill.svg +1 -0
- package/src/assets/icons/mic_off.svg +8 -0
- package/src/assets/icons/microscope_purple.svg +3 -0
- package/src/assets/icons/mingcute_user-3-fill.svg +4 -0
- package/src/assets/icons/minus.svg +8 -0
- package/src/assets/icons/missed_video_call-fill.svg +1 -0
- package/src/assets/icons/missed_video_call.svg +1 -0
- package/src/assets/icons/mode_comment.svg +8 -0
- package/src/assets/icons/monetization_on.svg +3 -0
- package/src/assets/icons/money-wavy.svg +3 -0
- package/src/assets/icons/monitor.svg +3 -0
- package/src/assets/icons/monitor_heart.svg +8 -0
- package/src/assets/icons/monitoring.svg +8 -0
- package/src/assets/icons/mood.svg +8 -0
- package/src/assets/icons/more_horiz.svg +8 -0
- package/src/assets/icons/more_vert.svg +8 -0
- package/src/assets/icons/morphology-icon.svg +19 -0
- package/src/assets/icons/motion_photos_paused.svg +8 -0
- package/src/assets/icons/move.svg +13 -0
- package/src/assets/icons/musculoskeletal.svg +11 -0
- package/src/assets/icons/neurology.svg +8 -0
- package/src/assets/icons/no_encryption.svg +1 -0
- package/src/assets/icons/no_insurance.svg +8 -0
- package/src/assets/icons/no_insurance_fill.svg +8 -0
- package/src/assets/icons/non_administered.svg +39 -0
- package/src/assets/icons/non_administered_new.svg +4 -0
- package/src/assets/icons/non_administered_v1.svg +7 -0
- package/src/assets/icons/not_allow.svg +8 -0
- package/src/assets/icons/not_allow_fill.svg +8 -0
- package/src/assets/icons/not_verified.svg +8 -0
- package/src/assets/icons/not_verified_fill.svg +8 -0
- package/src/assets/icons/note.svg +3 -0
- package/src/assets/icons/note_add.svg +8 -0
- package/src/assets/icons/note_pad.svg +3 -0
- package/src/assets/icons/note_pad_new.svg +3 -0
- package/src/assets/icons/note_stack.svg +8 -0
- package/src/assets/icons/notifications-fill.svg +1 -0
- package/src/assets/icons/notifications.svg +8 -0
- package/src/assets/icons/notifications_active-fill.svg +1 -0
- package/src/assets/icons/notifications_active.svg +8 -0
- package/src/assets/icons/notifications_off-fill.svg +1 -0
- package/src/assets/icons/notifications_off.svg +1 -0
- package/src/assets/icons/notifications_paused-fill.svg +1 -0
- package/src/assets/icons/notifications_paused.svg +1 -0
- package/src/assets/icons/offline_bolt.svg +8 -0
- package/src/assets/icons/open_in_full.svg +1 -0
- package/src/assets/icons/open_in_new.svg +8 -0
- package/src/assets/icons/order_approve.svg +8 -0
- package/src/assets/icons/overview.svg +8 -0
- package/src/assets/icons/paid.svg +8 -0
- package/src/assets/icons/paper-plane-right.svg +3 -0
- package/src/assets/icons/paper_claim.svg +8 -0
- package/src/assets/icons/paper_plane_tilt.svg +3 -0
- package/src/assets/icons/party_mode.svg +8 -0
- package/src/assets/icons/password_2.svg +8 -0
- package/src/assets/icons/patient-chart.svg +8 -0
- package/src/assets/icons/patient_list.svg +8 -0
- package/src/assets/icons/pause.svg +3 -0
- package/src/assets/icons/pause_circle.svg +8 -0
- package/src/assets/icons/payments.svg +1 -0
- package/src/assets/icons/pen_edit.svg +8 -0
- package/src/assets/icons/pencil-square.svg +4 -0
- package/src/assets/icons/pencil_simple.svg +3 -0
- package/src/assets/icons/pending.svg +3 -0
- package/src/assets/icons/people.svg +3 -0
- package/src/assets/icons/percent.svg +3 -0
- package/src/assets/icons/perm_phone_msg.svg +1 -0
- package/src/assets/icons/permissions.svg +18 -0
- package/src/assets/icons/person-bounding-box.svg +4 -0
- package/src/assets/icons/person-circle.svg +4 -0
- package/src/assets/icons/person-fill.svg +1 -0
- package/src/assets/icons/person-plus.svg +4 -0
- package/src/assets/icons/person-rolodex.svg +4 -0
- package/src/assets/icons/person-up.svg +4 -0
- package/src/assets/icons/person-vcard.svg +4 -0
- package/src/assets/icons/person.svg +3 -0
- package/src/assets/icons/person_2-fill.svg +1 -0
- package/src/assets/icons/person_2.svg +1 -0
- package/src/assets/icons/person_24dp_5F6368_FILL1_wght400_GRAD0_opsz24.svg +1 -0
- package/src/assets/icons/person_3-fill.svg +1 -0
- package/src/assets/icons/person_3.svg +1 -0
- package/src/assets/icons/person_4-fill.svg +1 -0
- package/src/assets/icons/person_4.svg +1 -0
- package/src/assets/icons/person_add-fill.svg +8 -0
- package/src/assets/icons/person_add.svg +8 -0
- package/src/assets/icons/person_remove.svg +8 -0
- package/src/assets/icons/personal_injury.svg +15 -0
- package/src/assets/icons/phone_call.svg +3 -0
- package/src/assets/icons/phone_callback-fill.svg +1 -0
- package/src/assets/icons/phone_callback.svg +1 -0
- package/src/assets/icons/phone_forwarded.svg +8 -0
- package/src/assets/icons/photo_camera.svg +8 -0
- package/src/assets/icons/photo_camera_fill.svg +8 -0
- package/src/assets/icons/pill.svg +3 -0
- package/src/assets/icons/pill_green.svg +3 -0
- package/src/assets/icons/pin.svg +8 -0
- package/src/assets/icons/pin_drop-fill.svg +1 -0
- package/src/assets/icons/pin_drop.svg +1 -0
- package/src/assets/icons/play_arrow.svg +8 -0
- package/src/assets/icons/play_circle.svg +3 -0
- package/src/assets/icons/plug-connection.svg +10 -0
- package/src/assets/icons/prescriptions.svg +8 -0
- package/src/assets/icons/preventive.svg +5 -0
- package/src/assets/icons/preview-fill.svg +1 -0
- package/src/assets/icons/preview.svg +1 -0
- package/src/assets/icons/price_change.svg +8 -0
- package/src/assets/icons/print.svg +8 -0
- package/src/assets/icons/printer.svg +4 -0
- package/src/assets/icons/priorAuth.svg +4 -0
- package/src/assets/icons/prior_auth.svg +4 -0
- package/src/assets/icons/priority.svg +3 -0
- package/src/assets/icons/problemsicon.svg +3 -0
- package/src/assets/icons/prohibit.svg +3 -0
- package/src/assets/icons/prompt_suggestion.svg +8 -0
- package/src/assets/icons/psychology.svg +8 -0
- package/src/assets/icons/pulmonology.svg +8 -0
- package/src/assets/icons/push_pin.svg +8 -0
- package/src/assets/icons/question_fill.svg +9 -0
- package/src/assets/icons/question_mark.svg +8 -0
- package/src/assets/icons/question_mark_fill.svg +9 -0
- package/src/assets/icons/quickreply.svg +8 -0
- package/src/assets/icons/radio_button_checked.svg +8 -0
- package/src/assets/icons/radio_button_unchecked.svg +8 -0
- package/src/assets/icons/radiology.svg +8 -0
- package/src/assets/icons/radiology_new.svg +8 -0
- package/src/assets/icons/receipt.svg +3 -0
- package/src/assets/icons/receipt_long.svg +15 -0
- package/src/assets/icons/receipt_x.svg +3 -0
- package/src/assets/icons/record-circle.svg +4 -0
- package/src/assets/icons/redo.svg +8 -0
- package/src/assets/icons/referral.svg +8 -0
- package/src/assets/icons/refresh.svg +8 -0
- package/src/assets/icons/refund.svg +10 -0
- package/src/assets/icons/reg-note.svg +8 -0
- package/src/assets/icons/reg-notes.svg +8 -0
- package/src/assets/icons/remove.svg +8 -0
- package/src/assets/icons/remove_moderator.svg +8 -0
- package/src/assets/icons/remove_moderator_fill.svg +8 -0
- package/src/assets/icons/reorder.svg +8 -0
- package/src/assets/icons/repeat.svg +8 -0
- package/src/assets/icons/replay.svg +8 -0
- package/src/assets/icons/request_quote.svg +8 -0
- package/src/assets/icons/roadmap.svg +3 -0
- package/src/assets/icons/rocket_launch.svg +8 -0
- package/src/assets/icons/rotate_left.svg +8 -0
- package/src/assets/icons/rotate_right.svg +1 -0
- package/src/assets/icons/rule_settings.svg +8 -0
- package/src/assets/icons/save.svg +1 -0
- package/src/assets/icons/scan.svg +3 -0
- package/src/assets/icons/scanner.svg +8 -0
- package/src/assets/icons/schedule.svg +8 -0
- package/src/assets/icons/search.svg +8 -0
- package/src/assets/icons/selection_all.svg +3 -0
- package/src/assets/icons/self_pay.svg +8 -0
- package/src/assets/icons/self_pay_fill.svg +8 -0
- package/src/assets/icons/send-fill.svg +1 -0
- package/src/assets/icons/send.svg +8 -0
- package/src/assets/icons/settings.svg +8 -0
- package/src/assets/icons/settings_applications.svg +8 -0
- package/src/assets/icons/shapes.svg +3 -0
- package/src/assets/icons/share.svg +1 -0
- package/src/assets/icons/shield.svg +3 -0
- package/src/assets/icons/shield_person.svg +8 -0
- package/src/assets/icons/shield_person_fill.svg +8 -0
- package/src/assets/icons/shield_plus.svg +3 -0
- package/src/assets/icons/shift_timing_activate.svg +5 -0
- package/src/assets/icons/shift_timing_deactivate.svg +5 -0
- package/src/assets/icons/sign.svg +3 -0
- package/src/assets/icons/signal_cellular_alt.svg +8 -0
- package/src/assets/icons/simple-notes.svg +8 -0
- package/src/assets/icons/skin.svg +11 -0
- package/src/assets/icons/smartphone.svg +8 -0
- package/src/assets/icons/sort.svg +8 -0
- package/src/assets/icons/sort_ascending.svg +12 -0
- package/src/assets/icons/sort_by_alpha.svg +8 -0
- package/src/assets/icons/sort_descending.svg +12 -0
- package/src/assets/icons/source_notes.svg +8 -0
- package/src/assets/icons/sparkle.svg +3 -0
- package/src/assets/icons/sparkle_gradient.svg +9 -0
- package/src/assets/icons/splitscreen_bottom.svg +8 -0
- package/src/assets/icons/sprint.svg +1 -0
- package/src/assets/icons/stack.svg +3 -0
- package/src/assets/icons/star-fill.svg +3 -0
- package/src/assets/icons/star.svg +3 -0
- package/src/assets/icons/stethoscope.svg +3 -0
- package/src/assets/icons/stethoscope_check.svg +8 -0
- package/src/assets/icons/stickies.svg +4 -0
- package/src/assets/icons/sticky_note_2.svg +8 -0
- package/src/assets/icons/stop_circle.svg +8 -0
- package/src/assets/icons/store.svg +8 -0
- package/src/assets/icons/straight.svg +3 -0
- package/src/assets/icons/strikethrough_s.svg +8 -0
- package/src/assets/icons/sub-task.svg +9 -0
- package/src/assets/icons/subdirectory_arrow_left.svg +8 -0
- package/src/assets/icons/subscript.svg +8 -0
- package/src/assets/icons/summarize.svg +8 -0
- package/src/assets/icons/superscript.svg +8 -0
- package/src/assets/icons/swap_calls.svg +1 -0
- package/src/assets/icons/swap_vert.svg +8 -0
- package/src/assets/icons/swipe_left_alt.svg +8 -0
- package/src/assets/icons/syringe.svg +3 -0
- package/src/assets/icons/table.svg +8 -0
- package/src/assets/icons/tag.svg +3 -0
- package/src/assets/icons/task.svg +8 -0
- package/src/assets/icons/telemedicine.svg +15 -0
- package/src/assets/icons/text_field.svg +4 -0
- package/src/assets/icons/thumbs_down.svg +3 -0
- package/src/assets/icons/thumbs_up.svg +3 -0
- package/src/assets/icons/thunder-big.svg +12 -0
- package/src/assets/icons/thunder.svg +12 -0
- package/src/assets/icons/tips_and_updates.svg +1 -0
- package/src/assets/icons/treatment.svg +5 -0
- package/src/assets/icons/trend_down.svg +3 -0
- package/src/assets/icons/tune.svg +8 -0
- package/src/assets/icons/turn_left.svg +1 -0
- package/src/assets/icons/turn_right.svg +8 -0
- package/src/assets/icons/u_turn_left.svg +1 -0
- package/src/assets/icons/u_turn_right.svg +1 -0
- package/src/assets/icons/unarchive.svg +8 -0
- package/src/assets/icons/undo.svg +8 -0
- package/src/assets/icons/unfold_more.svg +8 -0
- package/src/assets/icons/universal-access.svg +3 -0
- package/src/assets/icons/universal_currency_alt.svg +8 -0
- package/src/assets/icons/up-arrow.svg +10 -0
- package/src/assets/icons/update_disabled.svg +8 -0
- package/src/assets/icons/upload.svg +8 -0
- package/src/assets/icons/upload_file.svg +8 -0
- package/src/assets/icons/upload_simple.svg +3 -0
- package/src/assets/icons/urology.svg +8 -0
- package/src/assets/icons/user_check.svg +3 -0
- package/src/assets/icons/user_circle.svg +3 -0
- package/src/assets/icons/user_minus.svg +3 -0
- package/src/assets/icons/user_plus.svg +3 -0
- package/src/assets/icons/users_three.svg +3 -0
- package/src/assets/icons/vaccines.svg +8 -0
- package/src/assets/icons/verified_user.svg +8 -0
- package/src/assets/icons/verified_user_fill.svg +8 -0
- package/src/assets/icons/video-camera.svg +3 -0
- package/src/assets/icons/video_call-fill.svg +1 -0
- package/src/assets/icons/video_call.svg +1 -0
- package/src/assets/icons/videocam-fill.svg +1 -0
- package/src/assets/icons/videocam.svg +8 -0
- package/src/assets/icons/videocam_off-fill.svg +1 -0
- package/src/assets/icons/videocam_off.svg +8 -0
- package/src/assets/icons/view_week.svg +8 -0
- package/src/assets/icons/virus.svg +3 -0
- package/src/assets/icons/visibility-fill.svg +8 -0
- package/src/assets/icons/visibility.svg +8 -0
- package/src/assets/icons/visibility_off-fill.svg +8 -0
- package/src/assets/icons/visibility_off.svg +8 -0
- package/src/assets/icons/vpn_key.svg +10 -0
- package/src/assets/icons/warning-fill.svg +1 -0
- package/src/assets/icons/warning.svg +8 -0
- package/src/assets/icons/warning_fill.svg +8 -0
- package/src/assets/icons/water_drop.svg +8 -0
- package/src/assets/icons/west.svg +8 -0
- package/src/assets/icons/where_to_vote.svg +8 -0
- package/src/assets/icons/widgets.svg +8 -0
- package/src/assets/icons/writeOff.svg +4 -0
- package/src/assets/icons/x-circle.svg +3 -0
- package/src/assets/icons/x-square.svg +4 -0
- package/src/assets/icons/zift.svg +19 -0
- package/src/assets/image.jpg +0 -0
- package/src/assets/images/AIUsage.png +0 -0
- package/src/assets/images/Ai-S.svg +55 -0
- package/src/assets/images/Ai.png +0 -0
- package/src/assets/images/Aiusersbg.png +0 -0
- package/src/assets/images/Android-Banner.png +0 -0
- package/src/assets/images/Android.png +0 -0
- package/src/assets/images/Animation.gif +0 -0
- package/src/assets/images/Checkbox.png +0 -0
- package/src/assets/images/Cytology_Findings.png +0 -0
- package/src/assets/images/DTProjectPlan.pdf +0 -0
- package/src/assets/images/Ed_New_sprite.svg +14 -0
- package/src/assets/images/Ed_spriteuse.svg +979 -0
- package/src/assets/images/Histopathology_Report.png +0 -0
- package/src/assets/images/IOS.png +0 -0
- package/src/assets/images/Im-logo.png +0 -0
- package/src/assets/images/Immunohistochemistry_Results.png +0 -0
- package/src/assets/images/Institutional_Billing.png +0 -0
- package/src/assets/images/No collections.svg +62 -0
- package/src/assets/images/PNG.png +0 -0
- package/src/assets/images/Slovenian.jpg +0 -0
- package/src/assets/images/Upload-file.svg +16 -0
- package/src/assets/images/UserCircle.svg +3 -0
- package/src/assets/images/access-granted.svg +1 -0
- package/src/assets/images/activeAI.png +0 -0
- package/src/assets/images/activeuserswitch.png +0 -0
- package/src/assets/images/add_icon.png +0 -0
- package/src/assets/images/allergy.svg +16 -0
- package/src/assets/images/amex-card.svg +2 -0
- package/src/assets/images/amex-new.svg +5 -0
- package/src/assets/images/amex.svg +5 -0
- package/src/assets/images/anatomy/Chin, neck front.png +0 -0
- package/src/assets/images/anatomy/Female full body 1.jpg +0 -0
- package/src/assets/images/anatomy/Head Back side.png +0 -0
- package/src/assets/images/anatomy/Head Side Views.png +0 -0
- package/src/assets/images/anatomy/Head Top View.png +0 -0
- package/src/assets/images/anatomy/Male full body.png +0 -0
- package/src/assets/images/android-kiosk.svg +2 -0
- package/src/assets/images/app-banner.png +0 -0
- package/src/assets/images/app-store.png +0 -0
- package/src/assets/images/app-store.svg +8 -0
- package/src/assets/images/banner/banner-1.jpg +0 -0
- package/src/assets/images/banner/banner-2.jpg +0 -0
- package/src/assets/images/banner/banner-3.jpg +0 -0
- package/src/assets/images/banner/banner-4.jpg +0 -0
- package/src/assets/images/banner/banner-5.jpg +0 -0
- package/src/assets/images/banner/banner-bg.png +0 -0
- package/src/assets/images/banner/banner_23-04-2026/Sparkle.svg +3 -0
- package/src/assets/images/banner/banner_23-04-2026/icon1.svg +21 -0
- package/src/assets/images/banner/banner_23-04-2026/icon2.svg +5 -0
- package/src/assets/images/banner/banner_23-04-2026/icon3.svg +3 -0
- package/src/assets/images/banner/banner_23-04-2026/image1.png +0 -0
- package/src/assets/images/banner/banner_23-04-2026/image2.png +0 -0
- package/src/assets/images/banner/banner_23-04-2026/image3.png +0 -0
- package/src/assets/images/banner/banner_23-04-2026/image4.png +0 -0
- package/src/assets/images/banner/banner_23-04-2026/image5.png +0 -0
- package/src/assets/images/banner/banner_new/banner-bg.png +0 -0
- package/src/assets/images/banner/banner_new/chart-simple.png +0 -0
- package/src/assets/images/banner/banner_new/v2_img1.png +0 -0
- package/src/assets/images/banner/banner_new/v2_img10.svg +10 -0
- package/src/assets/images/banner/banner_new/v2_img11.svg +10 -0
- package/src/assets/images/banner/banner_new/v2_img12.svg +10 -0
- package/src/assets/images/banner/banner_new/v2_img13.svg +10 -0
- package/src/assets/images/banner/banner_new/v2_img14.svg +3 -0
- package/src/assets/images/banner/banner_new/v2_img15.svg +4 -0
- package/src/assets/images/banner/banner_new/v2_img16.svg +10 -0
- package/src/assets/images/banner/banner_new/v2_img17.svg +10 -0
- package/src/assets/images/banner/banner_new/v2_img18.svg +10 -0
- package/src/assets/images/banner/banner_new/v2_img19.svg +10 -0
- package/src/assets/images/banner/banner_new/v2_img2.png +0 -0
- package/src/assets/images/banner/banner_new/v2_img20.svg +3 -0
- package/src/assets/images/banner/banner_new/v2_img3.png +0 -0
- package/src/assets/images/banner/banner_new/v2_img4.png +0 -0
- package/src/assets/images/banner/banner_new/v2_img5.svg +10 -0
- package/src/assets/images/banner/banner_new/v2_img6.svg +13 -0
- package/src/assets/images/banner/banner_new/v2_img7.svg +4 -0
- package/src/assets/images/banner/banner_new/v2_img8.svg +3 -0
- package/src/assets/images/banner/banner_new/v2_img9.svg +10 -0
- package/src/assets/images/banner/banner_new10/app_store.png +0 -0
- package/src/assets/images/banner/banner_new10/img_1.png +0 -0
- package/src/assets/images/banner/banner_new10/img_2.png +0 -0
- package/src/assets/images/banner/banner_new10/img_3.png +0 -0
- package/src/assets/images/banner/banner_new10/img_4.png +0 -0
- package/src/assets/images/banner/banner_new10/img_5.png +0 -0
- package/src/assets/images/banner/banner_new10/img_6.png +0 -0
- package/src/assets/images/banner/banner_new10/img_7.png +0 -0
- package/src/assets/images/banner/banner_new10/play_store.png +0 -0
- package/src/assets/images/banner/banner_new10/svg_1.svg +10 -0
- package/src/assets/images/banner/banner_new10/svg_10.svg +10 -0
- package/src/assets/images/banner/banner_new10/svg_2.svg +10 -0
- package/src/assets/images/banner/banner_new10/svg_3.svg +10 -0
- package/src/assets/images/banner/banner_new10/svg_4.svg +12 -0
- package/src/assets/images/banner/banner_new10/svg_5.svg +10 -0
- package/src/assets/images/banner/banner_new10/svg_6.svg +10 -0
- package/src/assets/images/banner/banner_new10/svg_7.svg +10 -0
- package/src/assets/images/banner/banner_new10/svg_8.svg +10 -0
- package/src/assets/images/banner/banner_new10/svg_9.svg +10 -0
- package/src/assets/images/banner/banner_new3/CurrencyDollarSimple.svg +3 -0
- package/src/assets/images/banner/banner_new3/IdentificationCard.svg +3 -0
- package/src/assets/images/banner/banner_new3/ListNumbers.svg +3 -0
- package/src/assets/images/banner/banner_new3/Wrench.svg +3 -0
- package/src/assets/images/banner/banner_new3/assessment 1.svg +10 -0
- package/src/assets/images/banner/banner_new3/calendar-check 1.svg +10 -0
- package/src/assets/images/banner/banner_new3/fax (2) 1.svg +10 -0
- package/src/assets/images/banner/banner_new3/v3_img1.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img10.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img11.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img2.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img3.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img4.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img5.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img6.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img7.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img8.png +0 -0
- package/src/assets/images/banner/banner_new3/v3_img9.png +0 -0
- package/src/assets/images/banner/banner_new4/v4_img1.png +0 -0
- package/src/assets/images/banner/banner_new4/v4_img2.png +0 -0
- package/src/assets/images/banner/banner_new4/v4_img3.png +0 -0
- package/src/assets/images/banner/banner_new4/v4_img4.png +0 -0
- package/src/assets/images/banner/banner_new4/v4_img5.png +0 -0
- package/src/assets/images/banner/banner_new4/v4_svg1.svg +3 -0
- package/src/assets/images/banner/banner_new4/v4_svg2.svg +3 -0
- package/src/assets/images/banner/banner_new4/v4_svg3.svg +10 -0
- package/src/assets/images/banner/banner_new4/v4_svg4.svg +3 -0
- package/src/assets/images/banner/banner_new4/v4_svg5.svg +3 -0
- package/src/assets/images/banner/banner_new4/v4_svg6.svg +3 -0
- package/src/assets/images/banner/banner_new5/Wrench.svg +3 -0
- package/src/assets/images/banner/banner_new5/img_1.png +0 -0
- package/src/assets/images/banner/banner_new5/img_2.png +0 -0
- package/src/assets/images/banner/banner_new5/img_3.png +0 -0
- package/src/assets/images/banner/banner_new5/img_4.png +0 -0
- package/src/assets/images/banner/banner_new5/img_5.png +0 -0
- package/src/assets/images/banner/banner_new6/app_store.png +0 -0
- package/src/assets/images/banner/banner_new6/img_1.png +0 -0
- package/src/assets/images/banner/banner_new6/img_2.png +0 -0
- package/src/assets/images/banner/banner_new6/img_3.png +0 -0
- package/src/assets/images/banner/banner_new6/img_4.png +0 -0
- package/src/assets/images/banner/banner_new6/img_5.png +0 -0
- package/src/assets/images/banner/banner_new6/img_6.png +0 -0
- package/src/assets/images/banner/banner_new6/improvements/add-document.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/attribution-pencil.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/bell-notification.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/billing-header.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/binary.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/box-dollar.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/check-circle.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/clinical-header.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/credit-security.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/document-circle-wrong.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/fax.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/file-prescription.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/map-marker-check.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/marker.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/member-search.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/memo-circle-check-2.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/memo-circle-check.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/others-header.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/paper-plane.svg +6 -0
- package/src/assets/images/banner/banner_new6/improvements/payroll-calendar.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/payroll-check.svg +5 -0
- package/src/assets/images/banner/banner_new6/improvements/receipt.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/referrals-header.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/reminder-appointment.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/scheduling-header.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/settings.svg +5 -0
- package/src/assets/images/banner/banner_new6/improvements/subscription-alt.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/tasks.svg +10 -0
- package/src/assets/images/banner/banner_new6/improvements/time-check.svg +11 -0
- package/src/assets/images/banner/banner_new6/play_store.png +0 -0
- package/src/assets/images/banner/banner_new7/img_1.png +0 -0
- package/src/assets/images/banner/banner_new7/img_2.png +0 -0
- package/src/assets/images/banner/banner_new7/img_3.png +0 -0
- package/src/assets/images/banner/banner_new7/img_4.png +0 -0
- package/src/assets/images/banner/banner_new7/img_5.png +0 -0
- package/src/assets/images/banner/banner_new7/img_6.png +0 -0
- package/src/assets/images/banner/banner_new8/img_1.png +0 -0
- package/src/assets/images/banner/banner_new8/img_2.png +0 -0
- package/src/assets/images/banner/banner_new8/img_3.png +0 -0
- package/src/assets/images/banner/banner_new8/img_4.png +0 -0
- package/src/assets/images/banner/banner_new8/improvements/compliance-document.svg +10 -0
- package/src/assets/images/banner/banner_new8/improvements/envelope-open-text.svg +10 -0
- package/src/assets/images/banner/banner_new8/improvements/fax.svg +10 -0
- package/src/assets/images/banner/banner_new8/improvements/file-invoice-dollar.svg +10 -0
- package/src/assets/images/banner/banner_new8/improvements/file-signature.svg +10 -0
- package/src/assets/images/banner/banner_new8/improvements/settings.svg +10 -0
- package/src/assets/images/banner/banner_new8/improvements/social-media-notification.svg +10 -0
- package/src/assets/images/banner/banner_new8/svg_1.svg +10 -0
- package/src/assets/images/banner/banner_new8/svg_2.svg +10 -0
- package/src/assets/images/banner/banner_new8/svg_3.svg +3 -0
- package/src/assets/images/banner/banner_new8/svg_4.svg +10 -0
- package/src/assets/images/banner/banner_new8/svg_5.svg +10 -0
- package/src/assets/images/banner/banner_new8/svg_6.svg +12 -0
- package/src/assets/images/banner/banner_new9/img_1.png +0 -0
- package/src/assets/images/banner/banner_new9/img_2.png +0 -0
- package/src/assets/images/banner/banner_new9/img_3.png +0 -0
- package/src/assets/images/banner/banner_new9/img_4.png +0 -0
- package/src/assets/images/banner/banner_new9/img_5.full.png +0 -0
- package/src/assets/images/banner/banner_new9/img_5.png +0 -0
- package/src/assets/images/banner/banner_new9/svg_10.svg +10 -0
- package/src/assets/images/banner/banner_new9/svg_11.svg +10 -0
- package/src/assets/images/banner/banner_new9/svg_12.svg +10 -0
- package/src/assets/images/banner/banner_new9/svg_13.svg +10 -0
- package/src/assets/images/banner/banner_new9/svg_3.svg +3 -0
- package/src/assets/images/banner/banner_new9/svg_5.svg +10 -0
- package/src/assets/images/banner/banner_new9/svg_6.svg +12 -0
- package/src/assets/images/banner/banner_new9/svg_7.svg +10 -0
- package/src/assets/images/banner/banner_new9/svg_8.svg +15 -0
- package/src/assets/images/banner/banner_new9/svg_9.svg +10 -0
- package/src/assets/images/banner/confetti.gif +0 -0
- package/src/assets/images/banner/v2_img1.png +0 -0
- package/src/assets/images/banner/v2_img10.svg +11 -0
- package/src/assets/images/banner/v2_img11.png +0 -0
- package/src/assets/images/banner/v2_img12.png +0 -0
- package/src/assets/images/banner/v2_img2.png +0 -0
- package/src/assets/images/banner/v2_img3.png +0 -0
- package/src/assets/images/banner/v2_img4.png +0 -0
- package/src/assets/images/banner/v2_img5.svg +11 -0
- package/src/assets/images/banner/v2_img6.svg +11 -0
- package/src/assets/images/banner/v2_img7.svg +13 -0
- package/src/assets/images/banner/v2_img8.svg +11 -0
- package/src/assets/images/banner/v2_img9.svg +11 -0
- package/src/assets/images/barcode-1.png +0 -0
- package/src/assets/images/barcode.png +0 -0
- package/src/assets/images/bgstrips -1.svg +30 -0
- package/src/assets/images/bgstrips.svg +40 -0
- package/src/assets/images/big-blob.webm +0 -0
- package/src/assets/images/blood-test.svg +13 -0
- package/src/assets/images/blue-stripes.svg +12 -0
- package/src/assets/images/body-map-back.png +0 -0
- package/src/assets/images/body-map-front.png +0 -0
- package/src/assets/images/bolt_ai.svg +3 -0
- package/src/assets/images/box_edit.svg +8 -0
- package/src/assets/images/broken-link-new.png +0 -0
- package/src/assets/images/broken-link.svg +1 -0
- package/src/assets/images/bubble_chart.png +0 -0
- package/src/assets/images/cam.svg +3 -0
- package/src/assets/images/camera-icon.png +0 -0
- package/src/assets/images/camera_1.jpg +0 -0
- package/src/assets/images/card-1.svg +9 -0
- package/src/assets/images/card-2.svg +9 -0
- package/src/assets/images/card-3.svg +9 -0
- package/src/assets/images/card-4.svg +9 -0
- package/src/assets/images/card-5.svg +9 -0
- package/src/assets/images/card-6.svg +9 -0
- package/src/assets/images/cards.png +0 -0
- package/src/assets/images/carelink-carequality.png +0 -0
- package/src/assets/images/carelink-halftone-bg.jpg +0 -0
- package/src/assets/images/carelink-img.png +0 -0
- package/src/assets/images/carelink-logo.svg +9 -0
- package/src/assets/images/carelink-tefca.png +0 -0
- package/src/assets/images/cash-Cancelled.svg +20 -0
- package/src/assets/images/cash.svg +1 -0
- package/src/assets/images/celebrations.png +0 -0
- package/src/assets/images/chatClose.png +0 -0
- package/src/assets/images/check_fill2.svg +4 -0
- package/src/assets/images/cirrus-card.svg +51 -0
- package/src/assets/images/clearing-1.png +0 -0
- package/src/assets/images/clearing-2.png +0 -0
- package/src/assets/images/compare_arrows.svg +8 -0
- package/src/assets/images/darwinAskIcon.png +0 -0
- package/src/assets/images/data_object_content.svg +9 -0
- package/src/assets/images/deadline.svg +1 -0
- package/src/assets/images/del-1.png +0 -0
- package/src/assets/images/del-2.png +0 -0
- package/src/assets/images/del-3.png +0 -0
- package/src/assets/images/desktop-view.svg +78 -0
- package/src/assets/images/detecting.svg +28 -0
- package/src/assets/images/discover-card.svg +9 -0
- package/src/assets/images/discover-new.svg +9 -0
- package/src/assets/images/discover.svg +9 -0
- package/src/assets/images/dollar-symbol.svg +1 -0
- package/src/assets/images/dots-loader.svg +1 -0
- package/src/assets/images/down_arrow.png +0 -0
- package/src/assets/images/drag.png +0 -0
- package/src/assets/images/dribbble.webp +0 -0
- package/src/assets/images/drop-bg.svg +3 -0
- package/src/assets/images/dummy-image.png +0 -0
- package/src/assets/images/duration.svg +3 -0
- package/src/assets/images/e-img.png +0 -0
- package/src/assets/images/eCareHub.svg +10 -0
- package/src/assets/images/ecarehub_logo.svg +9 -0
- package/src/assets/images/edvak_logo.svg +11 -0
- package/src/assets/images/edvak_logo_temp.svg +9 -0
- package/src/assets/images/edvak_logo_temp1.svg +9 -0
- package/src/assets/images/edvaklogo-old.svg +9 -0
- package/src/assets/images/edvaklogo.svg +5 -0
- package/src/assets/images/emptry-list.svg +59 -0
- package/src/assets/images/empty-list.svg +59 -0
- package/src/assets/images/empty-list2.svg +52 -0
- package/src/assets/images/failed.png +0 -0
- package/src/assets/images/fax-1.svg +8 -0
- package/src/assets/images/fax-2.svg +8 -0
- package/src/assets/images/fax_restore.png +0 -0
- package/src/assets/images/file-pdf.png +0 -0
- package/src/assets/images/file.svg +1 -0
- package/src/assets/images/file_csv.svg +14 -0
- package/src/assets/images/file_xlsx.svg +15 -0
- package/src/assets/images/flash.svg +3 -0
- package/src/assets/images/folder.png +0 -0
- package/src/assets/images/folder.svg +1 -0
- package/src/assets/images/footer-line.jpg +0 -0
- package/src/assets/images/formNoteIcon.svg +15 -0
- package/src/assets/images/gettingstarted.svg +9 -0
- package/src/assets/images/google-store.png +0 -0
- package/src/assets/images/google-store.svg +10 -0
- package/src/assets/images/graph-chart.png +0 -0
- package/src/assets/images/graph-dec.svg +9 -0
- package/src/assets/images/graph-inc.svg +9 -0
- package/src/assets/images/graphic.svg +8 -0
- package/src/assets/images/handheld-connected.svg +9 -0
- package/src/assets/images/handheld-not-connected.svg +9 -0
- package/src/assets/images/health-care-logo.svg +13 -0
- package/src/assets/images/healthcare-bg.png +0 -0
- package/src/assets/images/healthcare-logo.svg +27 -0
- package/src/assets/images/heart-attack.svg +1 -0
- package/src/assets/images/hover_add_icon.png +0 -0
- package/src/assets/images/iOS-Banner.png +0 -0
- package/src/assets/images/icons/material-symbols/300/rounded/add.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/add_box-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/add_box.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/add_call-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/add_call.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/add_reaction.svg +8 -0
- package/src/assets/images/icons/material-symbols/300/rounded/alternate_email.svg +8 -0
- package/src/assets/images/icons/material-symbols/300/rounded/arrow_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/arrow_left_alt.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/attach_file-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/attach_file.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/attach_file_add-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/attach_file_add.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/attach_money-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/attach_money.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/auto_awesome_mosaic-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/auto_awesome_mosaic.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/border_color-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/border_color.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/cac.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/cached.svg +8 -0
- package/src/assets/images/icons/material-symbols/300/rounded/calculate-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/calculate.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/calendar_add_on-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/calendar_add_on.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/calendar_month.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/calendar_today-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/calendar_today.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/call-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/call.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/call_received-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/call_received.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/chart_data-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/chart_data.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/chat.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/chat_bubble.svg +8 -0
- package/src/assets/images/icons/material-symbols/300/rounded/check-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/check.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/check_circle-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/check_circle.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/chevron_left-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/chevron_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/chevron_right-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/chevron_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/close-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/close.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/collections_bookmark-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/collections_bookmark.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/contact_page-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/contact_page.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/create_new_folder-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/create_new_folder.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/credit_card-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/credit_card.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/credit_card_off-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/credit_card_off.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/data_object-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/data_object.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/delete-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/delete.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/description-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/description.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/dialpad-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/dialpad.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/do_not_disturb_off-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/do_not_disturb_off.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/do_not_disturb_on-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/do_not_disturb_on.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/do_not_disturb_on_total_silence-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/do_not_disturb_on_total_silence.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/done-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/done.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/door_open-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/door_open.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/download-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/download.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/draft-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/draft.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/drag_indicator-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/drag_indicator.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/drag_pan-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/drag_pan.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/east-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/east.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/edit-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/edit.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/edit_note-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/edit_note.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/edit_square-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/edit_square.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/error-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/error.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/expand_more-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/expand_more.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/folder-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/folder.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/graphic_eq-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/graphic_eq.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/handyman-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/handyman.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/help-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/help.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/history-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/history.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/history_toggle_off-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/history_toggle_off.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/house_with_shield-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/house_with_shield.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/info-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/info.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/info_i-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/info_i.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keep.svg +8 -0
- package/src/assets/images/icons/material-symbols/300/rounded/key-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/key.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_arrow_right-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_arrow_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_backspace-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_backspace.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_double_arrow_left-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_double_arrow_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_double_arrow_right-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_double_arrow_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_voice-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/keyboard_voice.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/lab_profile-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/lab_profile.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/label_important.svg +8 -0
- package/src/assets/images/icons/material-symbols/300/rounded/link-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/link.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/location_on-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/location_on.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/lock-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/lock.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/lock_open-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/lock_open.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/lock_open_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/lock_person-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/lock_person.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/menu.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/mic.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/mood.svg +8 -0
- package/src/assets/images/icons/material-symbols/300/rounded/more_vert-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/more_vert.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/move_up-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/move_up.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/navigate_next-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/navigate_next.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/neurology-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/neurology.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/note-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/note.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/note_add-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/note_add.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/notifications-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/notifications.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/patient_list.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/pause-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/pause.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_2-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_2.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_3-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_3.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_4-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_4.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_add-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_add.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_add_disabled-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/person_add_disabled.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/play_arrow-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/play_arrow.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/prescriptions-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/prescriptions.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/preview-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/preview.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/preview_off-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/preview_off.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/price_change-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/price_change.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/print-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/print.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/prompt_suggestion.svg +8 -0
- package/src/assets/images/icons/material-symbols/300/rounded/push_pin-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/push_pin.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/radio_button_checked-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/radio_button_checked.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/refresh-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/refresh.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/remove-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/remove.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/repeat-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/repeat.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/report-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/report.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/rotate_left-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/rotate_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/safety_check-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/safety_check.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/safety_check_off-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/safety_check_off.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/scanner-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/scanner.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/search-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/search.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/send-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/send.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/settings-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/settings.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/settings_applications-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/settings_applications.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/share-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/share.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/signpost-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/signpost.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/sort-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/sort.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/sprint-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/sprint.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/star-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/star.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/star_half-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/star_half.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/supervisor_account-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/supervisor_account.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/swipe_left_alt-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/swipe_left_alt.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/syringe-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/syringe.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/task_alt-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/task_alt.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/turn_left-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/turn_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/turn_right-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/turn_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/u_turn_left-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/u_turn_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/upload_file-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/upload_file.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/videocam-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/videocam.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/warning-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/warning.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/where_to_vote-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/where_to_vote.svg +1 -0
- package/src/assets/images/icons/material-symbols/300/rounded/widgets.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/accessibility.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/account_tree.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/add.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/add_box.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/add_call-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/add_call.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/add_circle.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/add_link.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/add_reaction.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/alarm.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/alternate_email.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ambulance.svg +15 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ambulance_2.svg +17 -0
- package/src/assets/images/icons/material-symbols/400/rounded/arrow-bar-right.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/arrow-repeat.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/arrow_downward_alt.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/arrow_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/arrow_left_alt.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/arrow_right_alt.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/arrow_top_left.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/arrow_upward_alt.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/article-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/article.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/at.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/atr.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/attach_file.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/attach_money.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/attachment.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/auto_awesome_mosaic.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/auto_pay.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/backspace_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/block.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/bolt.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/border_color.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/brightness_1.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/bubble.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/cached.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/calculate.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/calendar-x.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/calendar_down.svg +9 -0
- package/src/assets/images/icons/material-symbols/400/rounded/calendar_month.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/calendar_today.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/calendar_up.svg +9 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_end-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_end.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_log-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_log.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_made.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_merge.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_missed.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_missed_outgoing.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_quality-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_quality.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_received.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_split.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_to_action-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/call_to_action.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/campaign.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/cancel.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/card-list.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/cash.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/chart_data.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/chat-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/chat.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/chat_bubble.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/check-circle-fill.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/check.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/check2-all.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/check_circle-fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/check_circle.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/check_circle_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/chevron_left.svg +15 -0
- package/src/assets/images/icons/material-symbols/400/rounded/chevron_right.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/chronic-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/chronic.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/circle-fill.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/circle_notifications-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/circle_notifications.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/clear-all.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/clinic.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/clinic_settings.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/clipboard-check.svg +5 -0
- package/src/assets/images/icons/material-symbols/400/rounded/clock-history.svg +5 -0
- package/src/assets/images/icons/material-symbols/400/rounded/clock_loader_40.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/close.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/collapse_all.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/collapse_content.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/collections_bookmark-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/collections_bookmark.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/comment.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/contact_page.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/content_copy-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/content_copy.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/copy_all.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/create_new_folder.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/credit_card-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/credit_card.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/credit_card_off-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/credit_card_off.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/dangerous.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/dash-circle.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/dashboard_customize.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/data_object.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/data_object_bold.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/delete-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/delete.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/demography.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/description.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/desktop_windows.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/dialpad.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/discover_tune.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/do_not_disturb_off.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/do_not_disturb_on.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/document_scanner.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/done.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/done_all.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/dot.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/double_arrow.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/download.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/draft.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/drag_indicator.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/drive_file_move.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/eFax.svg +17 -0
- package/src/assets/images/icons/material-symbols/400/rounded/east.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ecg_heart.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ed-doctor.svg +15 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ed-form-disable.svg +9 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ed-invoice download.svg +13 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ed-payment_history.svg +9 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ed-receive.svg +9 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ed-refund.svg +9 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ed-regular-notes.svg +6 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ed-transaction download.svg +11 -0
- package/src/assets/images/icons/material-symbols/400/rounded/edit-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/edit.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/edit_calendar.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/edit_document.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/edit_note.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/edit_notifications-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/edit_notifications.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/edit_square-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/edit_square.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/email.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/encounters_h.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/endocrinology.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/ent.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/error.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/event.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/event_available-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/event_available.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/event_busy.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/event_upcoming.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/expand_content.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/expand_less.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/expand_more.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/export_notes.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/favorite.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/fax.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/fiber_manual_record.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/fiber_smart_record.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/file-arrow-up.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/files.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/filetype-pdf.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/filter_alt.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/folder.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/folder_open.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/format_bold.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/format_italic.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/format_list_bulleted.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/format_underlined.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/full_coverage.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/gastroenterology.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/gpp_bad.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/gpp_bad_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/gpp_maybe.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/gpp_maybe_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/grid_view.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/group.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/groups.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/health_and_safety.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/health_and_safety_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/hide_source.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/history.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/history_toggle_off.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/how_to_reg.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/id_card.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/info-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/info-square.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/info.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/info_i.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/insights.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/inventory_2.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/journal-plus.svg +5 -0
- package/src/assets/images/icons/material-symbols/400/rounded/journal-plus1.svg +5 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keep.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/key-person.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/key.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_arrow_down-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_arrow_down.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_arrow_left-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_arrow_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_arrow_right-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_arrow_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_arrow_up-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_arrow_up.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_backspace.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_double_arrow_left.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_double_arrow_right.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_voice-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/keyboard_voice.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/lab_profile-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/lab_profile.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/label.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/label_important.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/labs.svg +15 -0
- package/src/assets/images/icons/material-symbols/400/rounded/language.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/library.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/lightning-charge-fill.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/link-45deg.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/local_activity.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/local_atm.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/local_pharmacy.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/local_police.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/local_post_office.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/location_home.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/location_off.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/location_on-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/location_on.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/lock.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/lock_open_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/lock_person.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/logout.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/mail.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/manage_accounts.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/medication.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/mic-300.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/mic-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/mic.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/mic_off-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/mic_off.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/missed_video_call-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/missed_video_call.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/mode_comment.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/monitor_heart.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/monitoring.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/mood.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/more_horiz.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/more_vert.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/motion_photos_paused.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/move.svg +13 -0
- package/src/assets/images/icons/material-symbols/400/rounded/musculoskeletal.svg +11 -0
- package/src/assets/images/icons/material-symbols/400/rounded/neurology.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/no_encryption.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/no_insurance.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/no_insurance_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/not_allow.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/not_allow_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/not_verified.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/not_verified_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/note_add.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/note_stack.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/notifications-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/notifications.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/notifications_active-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/notifications_active.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/notifications_off-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/notifications_off.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/notifications_paused-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/notifications_paused.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/offline_bolt.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/open_in_full.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/open_in_new.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/order_approve.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/overview.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/paid.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/patient_list.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/pause.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/pause_circle.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/payments.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/pen_edit.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/pencil-square.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/people.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/perm_phone_msg.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person-bounding-box.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person-circle.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person-plus.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person-rolodex.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person-up.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person-vcard.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_2-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_2.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_24dp_5F6368_FILL1_wght400_GRAD0_opsz24.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_3-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_3.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_4-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_4.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_add-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_add.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/person_remove.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/personal_injury.svg +15 -0
- package/src/assets/images/icons/material-symbols/400/rounded/phone_callback-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/phone_callback.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/phone_forwarded.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/photo_camera.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/pin_drop-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/pin_drop.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/play_arrow.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/play_circle.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/prescriptions.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/preview-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/preview.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/price_change.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/print.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/printer.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/prompt_suggestion.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/psychology.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/published_with_changes.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/pulmonology.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/push_pin.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/question_mark.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/quickreply.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/radio_button_checked.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/radio_button_unchecked.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/receipt_long.svg +15 -0
- package/src/assets/images/icons/material-symbols/400/rounded/record-circle.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/redo.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/refresh.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/refund.svg +10 -0
- package/src/assets/images/icons/material-symbols/400/rounded/reg-notes.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/remove.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/remove_moderator.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/remove_moderator_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/repeat.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/replay.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/request_quote.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/rocket_launch.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/rotate_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/rule_settings.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/save.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/scanner.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/schedule.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/search.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/self_pay.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/self_pay_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/send-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/send.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/settings.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/settings_applications.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/share.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/shield_person.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/shield_person_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/signal_cellular_alt.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/simple-notes.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/skin.svg +11 -0
- package/src/assets/images/icons/material-symbols/400/rounded/smartphone.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/sort.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/sort_by_alpha.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/sprint.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/star-fill.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/stickies.svg +4 -0
- package/src/assets/images/icons/material-symbols/400/rounded/stop_circle.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/straight.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/sub-task.svg +9 -0
- package/src/assets/images/icons/material-symbols/400/rounded/subdirectory_arrow_left.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/summarize.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/swap_calls.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/swap_vert.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/swipe_left_alt.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/syringe.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/table.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/task.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/telemedicine.svg +15 -0
- package/src/assets/images/icons/material-symbols/400/rounded/tips_and_updates.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/tune.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/turn_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/turn_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/u_turn_left.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/u_turn_right.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/unarchive.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/undo.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/unfold_more.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/universal-access.svg +3 -0
- package/src/assets/images/icons/material-symbols/400/rounded/universal_currency_alt.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/update_disabled.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/upload.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/upload_file.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/urology.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/verified_user.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/verified_user_fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/video_call-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/video_call.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/videocam-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/videocam.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/videocam_off-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/videocam_off.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/view_week.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/visibility-fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/visibility.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/visibility_off-fill.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/visibility_off.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/vpn_key.svg +10 -0
- package/src/assets/images/icons/material-symbols/400/rounded/warning-fill.svg +1 -0
- package/src/assets/images/icons/material-symbols/400/rounded/warning.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/water_drop.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/west.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/where_to_vote.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/widgets.svg +8 -0
- package/src/assets/images/icons/material-symbols/400/rounded/x-square.svg +4 -0
- package/src/assets/images/icons.svg +723 -0
- package/src/assets/images/icons8-unpin-24.png +0 -0
- package/src/assets/images/iconsnew.svg +120 -0
- package/src/assets/images/id.jfif +0 -0
- package/src/assets/images/identity-f.png +0 -0
- package/src/assets/images/identity.png +0 -0
- package/src/assets/images/idme.png +0 -0
- package/src/assets/images/image.png +0 -0
- package/src/assets/images/image.svg +1 -0
- package/src/assets/images/image_14.jpg +0 -0
- package/src/assets/images/image_15.jpg +0 -0
- package/src/assets/images/inbox-img.png +0 -0
- package/src/assets/images/inbox.svg +1 -0
- package/src/assets/images/insurance-covers-outline.svg +7 -0
- package/src/assets/images/insurance-covers.svg +3 -0
- package/src/assets/images/ios-kiosk.svg +2 -0
- package/src/assets/images/jpg.svg +67 -0
- package/src/assets/images/kiosk-banner.png +0 -0
- package/src/assets/images/link-new.svg +11 -0
- package/src/assets/images/list-check.svg +8 -0
- package/src/assets/images/loader.svg +56 -0
- package/src/assets/images/loading.gif +0 -0
- package/src/assets/images/loading.svg +18 -0
- package/src/assets/images/location_on.svg +1 -0
- package/src/assets/images/locked.jpg +0 -0
- package/src/assets/images/log.svg +6 -0
- package/src/assets/images/login-slide1.png +0 -0
- package/src/assets/images/login-slide2.png +0 -0
- package/src/assets/images/login-slide3.png +0 -0
- package/src/assets/images/logo-1.png +0 -0
- package/src/assets/images/logo-old.svg +11 -0
- package/src/assets/images/logo.svg +10 -0
- package/src/assets/images/logos/blob-fotor-bg-remover-2023091884651.png +0 -0
- package/src/assets/images/logos/texas_logo.png +0 -0
- package/src/assets/images/master-card.svg +2 -0
- package/src/assets/images/master-new.svg +11 -0
- package/src/assets/images/master.svg +13 -0
- package/src/assets/images/medicare.jpg +0 -0
- package/src/assets/images/medication.png +0 -0
- package/src/assets/images/medications.svg +1 -0
- package/src/assets/images/medicine.svg +16 -0
- package/src/assets/images/message-icon.svg +24 -0
- package/src/assets/images/mic-bg.svg +10 -0
- package/src/assets/images/middleware-mobile/Android1.svg +10 -0
- package/src/assets/images/middleware-mobile/IOS.svg +8 -0
- package/src/assets/images/middleware-mobile/android.svg +9 -0
- package/src/assets/images/middleware-mobile/apple 1.svg +9 -0
- package/src/assets/images/middleware-mobile/ecare.svg +9 -0
- package/src/assets/images/middleware-mobile/f-icon.svg +5 -0
- package/src/assets/images/middleware-mobile/folder.svg +8 -0
- package/src/assets/images/middleware-mobile/logo.svg +10 -0
- package/src/assets/images/middleware-mobile/payment.svg +8 -0
- package/src/assets/images/middleware-mobile/telemedicine.svg +16 -0
- package/src/assets/images/middleware-mobile/web.svg +9 -0
- package/src/assets/images/mobile-view-new.svg +53 -0
- package/src/assets/images/mobile-view.svg +26 -0
- package/src/assets/images/mobileapp.svg +13 -0
- package/src/assets/images/more_option.png +0 -0
- package/src/assets/images/nail-map/left-foot.svg +9 -0
- package/src/assets/images/nail-map/left-hand.svg +9 -0
- package/src/assets/images/nail-map/right-foot.svg +9 -0
- package/src/assets/images/nail-map/right-hand.svg +9 -0
- package/src/assets/images/new-19/Labs_Imaging.svg +8 -0
- package/src/assets/images/new-19/attach_file.svg +8 -0
- package/src/assets/images/new-19/box_edit.svg +8 -0
- package/src/assets/images/new-19/clinical_notes.svg +8 -0
- package/src/assets/images/new-19/close.svg +8 -0
- package/src/assets/images/new-19/delete.svg +8 -0
- package/src/assets/images/new-19/folder_open.svg +8 -0
- package/src/assets/images/new-19/format_list_bulleted.svg +8 -0
- package/src/assets/images/new-19/photo_camera.svg +8 -0
- package/src/assets/images/new-19/source_notes.svg +8 -0
- package/src/assets/images/new-19/splitscreen_bottom.svg +8 -0
- package/src/assets/images/new-19/stack.svg +8 -0
- package/src/assets/images/new-19/sticky_note_2.svg +8 -0
- package/src/assets/images/new-19/thunder.svg +12 -0
- package/src/assets/images/no-graphs.svg +29 -0
- package/src/assets/images/no-insurance-covers-outline.svg +8 -0
- package/src/assets/images/no-insurance-covers.svg +3 -0
- package/src/assets/images/no-messges.svg +80 -0
- package/src/assets/images/no_action_items.svg +54 -0
- package/src/assets/images/no_clinical_decision_support_found.svg +25 -0
- package/src/assets/images/no_documents_founds.svg +40 -0
- package/src/assets/images/no_encounter_notes_found.svg +16 -0
- package/src/assets/images/no_internet.svg +8 -0
- package/src/assets/images/no_referrals_found.svg +30 -0
- package/src/assets/images/no_templates_found.svg +43 -0
- package/src/assets/images/nodata-appointments.png +0 -0
- package/src/assets/images/nodata-calls.png +0 -0
- package/src/assets/images/nodata-labs.png +0 -0
- package/src/assets/images/nodata-medication.png +0 -0
- package/src/assets/images/nodata-patient.png +0 -0
- package/src/assets/images/nodata-referrals.png +0 -0
- package/src/assets/images/nodata-vitals.png +0 -0
- package/src/assets/images/nodata.png +0 -0
- package/src/assets/images/not_found.svg +10 -0
- package/src/assets/images/note-arrow.svg +4 -0
- package/src/assets/images/onboarding_loader.svg +24 -0
- package/src/assets/images/p-1.svg +15 -0
- package/src/assets/images/p-2.svg +15 -0
- package/src/assets/images/p-3.svg +15 -0
- package/src/assets/images/p-4.svg +15 -0
- package/src/assets/images/p-5.svg +15 -0
- package/src/assets/images/p-6.svg +15 -0
- package/src/assets/images/p-7.svg +10 -0
- package/src/assets/images/p-8.svg +15 -0
- package/src/assets/images/p-lab.svg +8 -0
- package/src/assets/images/padlock.svg +7 -0
- package/src/assets/images/paper.svg +1 -0
- package/src/assets/images/paper_claim.svg +8 -0
- package/src/assets/images/patient.png +0 -0
- package/src/assets/images/pause-active.png +0 -0
- package/src/assets/images/pause.png +0 -0
- package/src/assets/images/pdf-1.svg +1 -0
- package/src/assets/images/pdf.svg +51 -0
- package/src/assets/images/person.svg +18 -0
- package/src/assets/images/play-active.png +0 -0
- package/src/assets/images/play.png +0 -0
- package/src/assets/images/plus-button.svg +10 -0
- package/src/assets/images/print_location.svg +3 -0
- package/src/assets/images/profile_1.jpg +0 -0
- package/src/assets/images/profile_img.jpg +0 -0
- package/src/assets/images/qrcode.svg +446 -0
- package/src/assets/images/reg-encounter.png +0 -0
- package/src/assets/images/remove.png +0 -0
- package/src/assets/images/reports.svg +9 -0
- package/src/assets/images/schedule.svg +5 -0
- package/src/assets/images/send.svg +8 -0
- package/src/assets/images/simple-encounter.png +0 -0
- package/src/assets/images/sort_ascending.svg +12 -0
- package/src/assets/images/sort_descending.svg +12 -0
- package/src/assets/images/sort_none.svg +13 -0
- package/src/assets/images/stop-active.png +0 -0
- package/src/assets/images/stop.png +0 -0
- package/src/assets/images/stop_circle.svg +8 -0
- package/src/assets/images/success.svg +1 -0
- package/src/assets/images/successfull.png +0 -0
- package/src/assets/images/summarize.svg +13 -0
- package/src/assets/images/supportChat.png +0 -0
- package/src/assets/images/supportChat1.png +0 -0
- package/src/assets/images/tele-medicine.png +0 -0
- package/src/assets/images/tele-user.png +0 -0
- package/src/assets/images/temp-list.png +0 -0
- package/src/assets/images/theme-1.png +0 -0
- package/src/assets/images/theme-2.png +0 -0
- package/src/assets/images/theme-3.png +0 -0
- package/src/assets/images/thumb_down.png +0 -0
- package/src/assets/images/thumb_up.png +0 -0
- package/src/assets/images/time.svg +3 -0
- package/src/assets/images/to-do-list.svg +1 -0
- package/src/assets/images/tour_guide_1.svg +31 -0
- package/src/assets/images/tour_guide_2.svg +34 -0
- package/src/assets/images/tour_guide_3.svg +29 -0
- package/src/assets/images/tour_guide_4.svg +23 -0
- package/src/assets/images/tour_guide_5.svg +37 -0
- package/src/assets/images/tour_guide_6.svg +35 -0
- package/src/assets/images/tour_guide_7.svg +58 -0
- package/src/assets/images/tour_guide_8.svg +73 -0
- package/src/assets/images/upload-new.svg +6 -0
- package/src/assets/images/upload.svg +1 -0
- package/src/assets/images/user-avatar.png +0 -0
- package/src/assets/images/user-blocked.png +0 -0
- package/src/assets/images/user1.png +0 -0
- package/src/assets/images/user1_lg.png +0 -0
- package/src/assets/images/visa-card.svg +2 -0
- package/src/assets/images/visa-new.svg +8 -0
- package/src/assets/images/visa.png +0 -0
- package/src/assets/images/visa.svg +10 -0
- package/src/assets/images/vitals.svg +3 -0
- package/src/assets/images/voice1.svg +9 -0
- package/src/assets/images/wave.svg +1 -0
- package/src/assets/images/welcome-header.png +0 -0
- package/src/assets/images/welcome-intro.svg +19 -0
- package/src/assets/images/welcome-intro1.svg +84 -0
- package/src/assets/images/work-queues/landing-page/ai.png +0 -0
- package/src/assets/images/work-queues/landing-page/claims-1.png +0 -0
- package/src/assets/images/work-queues/landing-page/claims.png +0 -0
- package/src/assets/images/work-queues/landing-page/conditions.png +0 -0
- package/src/assets/images/xl-icon.png +0 -0
- package/src/assets/logo.png +0 -0
- package/src/assets/lottie/green-check.lottie +0 -0
- package/src/assets/lottie/smallBlob.json +1 -0
- package/src/assets/pdfs/AnesthesiaGuidelines.pdf +0 -0
- package/src/assets/pdfs/AppendixB.pdf +0 -0
- package/src/assets/pdfs/AppendixO.pdf +0 -0
- package/src/assets/pdfs/AppendixQ.pdf +0 -0
- package/src/assets/pdfs/AppendixR.pdf +0 -0
- package/src/assets/pdfs/AppendixS.pdf +0 -0
- package/src/assets/pdfs/AppendixT.pdf +0 -0
- package/src/assets/pdfs/BSS-CMS-1500-Fillable-2022.pdf +0 -0
- package/src/assets/pdfs/Category2.pdf +0 -0
- package/src/assets/pdfs/Category3.pdf +0 -0
- package/src/assets/pdfs/EvalManagementGuidelines.pdf +0 -0
- package/src/assets/pdfs/MedicineGuidelines.pdf +0 -0
- package/src/assets/pdfs/PathLabGuidelines.pdf +0 -0
- package/src/assets/pdfs/RadiologyGuidelines.pdf +0 -0
- package/src/assets/pdfs/SurgeryGuidelines.pdf +0 -0
- package/src/assets/pdfs/UB04_form.pdf +14346 -0
- package/src/assets/pdfs/form-cms1500.pdf +0 -0
- package/src/assets/pdfs/guidelinesICD.pdf +0 -0
- package/src/assets/phoneRing/PhoneRingingSound.mp3 +0 -0
- package/src/assets/scripts/SIPml-api.js +33514 -0
- package/src/assets/scripts/annyang.min.js +7 -0
- package/src/assets/scripts/api.proxynization.js +1 -0
- package/src/assets/scripts/call.js +386 -0
- package/src/assets/scripts/jquery-3.3.1.min.js +2 -0
- package/src/assets/scripts/jquery.inputmask.min.js +8 -0
- package/src/assets/scripts/jstree.min.js +6 -0
- package/src/assets/scripts/scannerDocument.html +131 -0
- package/src/assets/scripts/shoelace.js +321 -0
- package/src/assets/scripts/tailwindcss.js +65 -0
- package/src/assets/scripts/wave.js +6095 -0
- package/src/assets/svg/call-fill.svg +1 -0
- package/src/assets/svg/telemedicine.svg +16 -0
- package/src/styles.scss +3651 -0
- package/styles/_index.scss +7 -17
- package/tailwind.config.js +190 -0
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-Br2Vi1Im.mjs +0 -454
- package/fesm2022/edvak99-voice-receptionist-widget-activities-page.component-Br2Vi1Im.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-CglgGV6H.mjs +0 -276
- package/fesm2022/edvak99-voice-receptionist-widget-analytics-page.component-CglgGV6H.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-api-log.util-C0TOKF1q.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-api-logs-page.component-DPJiuNjk.mjs +0 -226
- package/fesm2022/edvak99-voice-receptionist-widget-api-logs-page.component-DPJiuNjk.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-api-logs-table.component-CiNc65dO.mjs +0 -109
- package/fesm2022/edvak99-voice-receptionist-widget-api-logs-table.component-CiNc65dO.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-ENq2c-sm.mjs +0 -513
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-detail-page.component-ENq2c-sm.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-DoYJFpSa.mjs +0 -200
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-DoYJFpSa.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-recording-player.component-GVg1g-Vq.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-review.util-Deh3jPgo.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-B_EYljRs.mjs +0 -147
- package/fesm2022/edvak99-voice-receptionist-widget-dashboard-page.component-B_EYljRs.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-BJs_TH8X.mjs +0 -38
- package/fesm2022/edvak99-voice-receptionist-widget-eds-avatar.component-BJs_TH8X.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-eds-search-field.component-OGRDvYBp.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-pS2jeB4x.mjs +0 -4089
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-pS2jeB4x.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-1woGuh0J.mjs +0 -74
- package/fesm2022/edvak99-voice-receptionist-widget-live-calls-page.component-1woGuh0J.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-live-monitor-page.component-ihwm1LNn.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-modal.component-uYApl1KF.mjs +0 -48
- package/fesm2022/edvak99-voice-receptionist-widget-modal.component-uYApl1KF.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-B2koBFU3.mjs +0 -390
- package/fesm2022/edvak99-voice-receptionist-widget-outbound-purposes-page.component-B2koBFU3.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-C6F-Hgmk.mjs +0 -1056
- package/fesm2022/edvak99-voice-receptionist-widget-settings-page.component-C6F-Hgmk.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-task-detail-drawer.component-BojdiNNx.mjs +0 -194
- package/fesm2022/edvak99-voice-receptionist-widget-task-detail-drawer.component-BojdiNNx.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-Cf76XyCz.mjs +0 -146
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-Cf76XyCz.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-wizard-page.component-BQTlz2F5.mjs +0 -45
- package/fesm2022/edvak99-voice-receptionist-widget-wizard-page.component-BQTlz2F5.mjs.map +0 -1
- package/lib/ui/eds-avatar.component.d.ts +0 -11
- package/lib/ui/eds-icon.component.d.ts +0 -10
- package/styles/chat-ui.scss +0 -132
- package/styles/eds.scss +0 -387
package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-pS2jeB4x.mjs
DELETED
|
@@ -1,4089 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, makeEnvironmentProviders, inject, signal, Injectable, ChangeDetectionStrategy, Component, input, computed, DestroyRef } from '@angular/core';
|
|
3
|
-
import { Router, RouterLink, RouterLinkActive, NavigationStart, NavigationEnd, NavigationCancel, NavigationError, RouterOutlet } from '@angular/router';
|
|
4
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
|
-
import { filter } from 'rxjs/operators';
|
|
6
|
-
import { of, delay, throwError, map, catchError, forkJoin, switchMap, interval, filter as filter$1 } from 'rxjs';
|
|
7
|
-
import { HttpClient, HttpParams } from '@angular/common/http';
|
|
8
|
-
import { io } from 'socket.io-client';
|
|
9
|
-
|
|
10
|
-
const VOICE_RECEPTIONIST_CONFIG = new InjectionToken('VOICE_RECEPTIONIST_CONFIG');
|
|
11
|
-
const VOICE_RECEPTIONIST_SESSION = new InjectionToken('VOICE_RECEPTIONIST_SESSION', { factory: () => null });
|
|
12
|
-
|
|
13
|
-
function provideVoiceReceptionist(options) {
|
|
14
|
-
const { session, ...config } = options;
|
|
15
|
-
const providers = [
|
|
16
|
-
{ provide: VOICE_RECEPTIONIST_CONFIG, useValue: config },
|
|
17
|
-
];
|
|
18
|
-
// Only set SESSION when the host passes one — otherwise leave the token
|
|
19
|
-
// unset so a separate host factory (or the token default) can provide it.
|
|
20
|
-
if (session !== undefined) {
|
|
21
|
-
providers.push({ provide: VOICE_RECEPTIONIST_SESSION, useValue: session });
|
|
22
|
-
}
|
|
23
|
-
return makeEnvironmentProviders(providers);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* API Logs is standalone-dashboard only.
|
|
28
|
-
* EHR embeds leave `showModuleNav` unset/false — redirect to dashboard.
|
|
29
|
-
*/
|
|
30
|
-
const apiLogsStandaloneGuard = () => {
|
|
31
|
-
const config = inject(VOICE_RECEPTIONIST_CONFIG);
|
|
32
|
-
const router = inject(Router);
|
|
33
|
-
if (config.showModuleNav)
|
|
34
|
-
return true;
|
|
35
|
-
const url = router.url.split('?')[0];
|
|
36
|
-
const base = url.replace(/\/api-logs(?:\/.*)?$/, '') || '';
|
|
37
|
-
const target = `${base.replace(/\/$/, '')}/dashboard` || '/dashboard';
|
|
38
|
-
return router.parseUrl(target);
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
class ToastService {
|
|
42
|
-
constructor() {
|
|
43
|
-
this.nextId = 1;
|
|
44
|
-
this.timers = new Map();
|
|
45
|
-
this._toasts = signal([]);
|
|
46
|
-
this.toasts = this._toasts.asReadonly();
|
|
47
|
-
}
|
|
48
|
-
show(text, variant = 'info', durationMs = 3500) {
|
|
49
|
-
const id = this.nextId++;
|
|
50
|
-
this._toasts.update((list) => [...list, { id, text, variant }]);
|
|
51
|
-
const timer = setTimeout(() => this.dismiss(id), durationMs);
|
|
52
|
-
this.timers.set(id, timer);
|
|
53
|
-
}
|
|
54
|
-
dismiss(id) {
|
|
55
|
-
const timer = this.timers.get(id);
|
|
56
|
-
if (timer) {
|
|
57
|
-
clearTimeout(timer);
|
|
58
|
-
this.timers.delete(id);
|
|
59
|
-
}
|
|
60
|
-
this._toasts.update((list) => list.filter((t) => t.id !== id));
|
|
61
|
-
}
|
|
62
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
63
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ToastService, providedIn: 'root' }); }
|
|
64
|
-
}
|
|
65
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ToastService, decorators: [{
|
|
66
|
-
type: Injectable,
|
|
67
|
-
args: [{ providedIn: 'root' }]
|
|
68
|
-
}] });
|
|
69
|
-
|
|
70
|
-
class ToastContainerComponent {
|
|
71
|
-
constructor() {
|
|
72
|
-
this.toastService = inject(ToastService);
|
|
73
|
-
}
|
|
74
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ToastContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
75
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ToastContainerComponent, isStandalone: true, selector: "app-toast-container", ngImport: i0, template: "<div class=\"fixed bottom-6 right-6 z-[1100] flex max-w-[380px] flex-col gap-3 pointer-events-none\" aria-live=\"polite\" aria-atomic=\"false\">\n @for (toast of toastService.toasts(); track toast.id) {\n <div\n class=\"toast pointer-events-auto flex items-start gap-3 rounded-[var(--eds-radius-md)] border border-[var(--eds-color-border)] bg-[var(--eds-color-surface)] px-4 py-3 text-[13px] text-[var(--eds-color-text)] shadow-[0_6px_24px_rgba(20,30,50,0.12)]\"\n role=\"status\"\n >\n <span\n class=\"inline-flex h-[22px] w-[22px] shrink-0 items-center justify-center rounded-full\"\n [class]=\"toast.variant === 'success' ? 'bg-[var(--eds-color-success-soft)] text-[var(--eds-color-success)]' : toast.variant === 'error' ? 'bg-[var(--eds-color-danger-soft)] text-[var(--eds-color-danger)]' : 'bg-[var(--eds-color-primary-soft)] text-[var(--eds-color-primary)]'\"\n aria-hidden=\"true\"\n >\n @switch (toast.variant) {\n @case ('success') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n }\n @case ('error') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n }\n @default {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n }\n }\n </span>\n <span class=\"flex-1 leading-snug\">{{ toast.text }}</span>\n <button\n type=\"button\"\n class=\"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded border-none bg-transparent text-[var(--eds-color-text-soft)] transition-colors duration-150 hover:bg-[var(--eds-color-surface-alt)] hover:text-[var(--eds-color-text)]\"\n (click)=\"toastService.dismiss(toast.id)\"\n aria-label=\"Dismiss notification\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n }\n</div>\n", styles: [".toast{animation:slide-in .16s ease}@keyframes slide-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
76
|
-
}
|
|
77
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ToastContainerComponent, decorators: [{
|
|
78
|
-
type: Component,
|
|
79
|
-
args: [{ selector: 'app-toast-container', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"fixed bottom-6 right-6 z-[1100] flex max-w-[380px] flex-col gap-3 pointer-events-none\" aria-live=\"polite\" aria-atomic=\"false\">\n @for (toast of toastService.toasts(); track toast.id) {\n <div\n class=\"toast pointer-events-auto flex items-start gap-3 rounded-[var(--eds-radius-md)] border border-[var(--eds-color-border)] bg-[var(--eds-color-surface)] px-4 py-3 text-[13px] text-[var(--eds-color-text)] shadow-[0_6px_24px_rgba(20,30,50,0.12)]\"\n role=\"status\"\n >\n <span\n class=\"inline-flex h-[22px] w-[22px] shrink-0 items-center justify-center rounded-full\"\n [class]=\"toast.variant === 'success' ? 'bg-[var(--eds-color-success-soft)] text-[var(--eds-color-success)]' : toast.variant === 'error' ? 'bg-[var(--eds-color-danger-soft)] text-[var(--eds-color-danger)]' : 'bg-[var(--eds-color-primary-soft)] text-[var(--eds-color-primary)]'\"\n aria-hidden=\"true\"\n >\n @switch (toast.variant) {\n @case ('success') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n }\n @case ('error') {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n }\n @default {\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n }\n }\n </span>\n <span class=\"flex-1 leading-snug\">{{ toast.text }}</span>\n <button\n type=\"button\"\n class=\"inline-flex h-6 w-6 shrink-0 items-center justify-center rounded border-none bg-transparent text-[var(--eds-color-text-soft)] transition-colors duration-150 hover:bg-[var(--eds-color-surface-alt)] hover:text-[var(--eds-color-text)]\"\n (click)=\"toastService.dismiss(toast.id)\"\n aria-label=\"Dismiss notification\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n }\n</div>\n", styles: [".toast{animation:slide-in .16s ease}@keyframes slide-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n"] }]
|
|
80
|
-
}] });
|
|
81
|
-
|
|
82
|
-
class EdsIconComponent {
|
|
83
|
-
constructor() {
|
|
84
|
-
this.name = input.required();
|
|
85
|
-
this.size = input(20);
|
|
86
|
-
this.fill = input(0);
|
|
87
|
-
this.weight = input(400);
|
|
88
|
-
this.variation = computed(() => `'FILL' ${this.fill()}, 'wght' ${this.weight()}, 'GRAD' 0, 'opsz' ${this.size()}`);
|
|
89
|
-
}
|
|
90
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
91
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.17", type: EdsIconComponent, isStandalone: true, selector: "eds-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null }, weight: { classPropertyName: "weight", publicName: "weight", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `<span class="eds-icon" [style.font-size.px]="size()" [style.font-variation-settings]="variation()">{{ name() }}</span>`, isInline: true, styles: [":host{display:inline-flex;line-height:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
92
|
-
}
|
|
93
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsIconComponent, decorators: [{
|
|
94
|
-
type: Component,
|
|
95
|
-
args: [{ selector: 'eds-icon', standalone: true, template: `<span class="eds-icon" [style.font-size.px]="size()" [style.font-variation-settings]="variation()">{{ name() }}</span>`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-flex;line-height:0}\n"] }]
|
|
96
|
-
}] });
|
|
97
|
-
|
|
98
|
-
class EdsModuleNavComponent {
|
|
99
|
-
constructor() {
|
|
100
|
-
this.config = inject(VOICE_RECEPTIONIST_CONFIG);
|
|
101
|
-
this.session = inject(VOICE_RECEPTIONIST_SESSION);
|
|
102
|
-
this.includePracticeNav = !!this.config.includePracticeNav;
|
|
103
|
-
/** Standalone Voice Hub only — never show logout in EHR embed (no module nav there). */
|
|
104
|
-
this.showLogout = computed(() => !!this.session);
|
|
105
|
-
this.userEmail = computed(() => this.session?.email() ?? null);
|
|
106
|
-
this.receptionistNav = [
|
|
107
|
-
{ id: 'dashboard', label: 'Home', icon: 'home', route: 'dashboard' },
|
|
108
|
-
{ id: 'live', label: 'Live Calls', icon: 'phone_in_talk', route: 'live' },
|
|
109
|
-
{ id: 'history', label: 'Call History', icon: 'history', route: 'history' },
|
|
110
|
-
{ id: 'activities', label: 'Activities', icon: 'format_list_bulleted', route: 'activities' },
|
|
111
|
-
{ id: 'analytics', label: 'Analytics', icon: 'show_chart', route: 'analytics' },
|
|
112
|
-
{ id: 'api-logs', label: 'API Logs', icon: 'terminal', route: 'api-logs' },
|
|
113
|
-
{ id: 'settings', label: 'Agent Setting', icon: 'settings', route: 'settings' },
|
|
114
|
-
];
|
|
115
|
-
this.practiceNav = [
|
|
116
|
-
{ id: 'patients', label: 'Patients', icon: 'groups', route: 'patients' },
|
|
117
|
-
{ id: 'providers', label: 'Providers', icon: 'medical_services', route: 'providers' },
|
|
118
|
-
{ id: 'appointments', label: 'Appointments', icon: 'calendar_month', route: 'appointments' },
|
|
119
|
-
{ id: 'admin', label: 'Admin', icon: 'admin_panel_settings', route: 'admin', adminOnly: true },
|
|
120
|
-
];
|
|
121
|
-
}
|
|
122
|
-
showNavItem(item) {
|
|
123
|
-
if (!item.adminOnly)
|
|
124
|
-
return true;
|
|
125
|
-
return !!this.session?.isAdmin() || !!this.session?.isSuperAdmin?.();
|
|
126
|
-
}
|
|
127
|
-
logout() {
|
|
128
|
-
this.session?.logout();
|
|
129
|
-
}
|
|
130
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsModuleNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
131
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: EdsModuleNavComponent, isStandalone: true, selector: "eds-module-nav", host: { classAttribute: "block shrink-0" }, ngImport: i0, template: "<nav\n class=\"flex h-screen min-h-screen w-[var(--eds-nav-width)] flex-col overflow-y-auto sticky top-0 border-r border-[var(--eds-border-default)] bg-white py-5 px-4\"\n aria-label=\"AI Receptionist\"\n>\n <div class=\"mb-4 flex items-center gap-3 border-b border-[var(--eds-border-default)] px-1 pb-4 pt-1\">\n <span class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-[10px] bg-violet-500/15 text-[var(--eds-violet-500)]\" aria-hidden=\"true\">\n <eds-icon name=\"auto_awesome\" [size]=\"20\" [fill]=\"1\" />\n </span>\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"text-[15px] font-semibold leading-tight tracking-tight text-[var(--eds-text-primary)]\">AI Receptionist</span>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n @for (item of receptionistNav; track item.id) {\n <a\n class=\"group/link relative flex items-center gap-3 rounded-[10px] px-3 py-3 text-sm font-medium leading-tight text-slate-700 no-underline transition-colors duration-150 hover:bg-slate-50 hover:text-slate-900 [&.active]:bg-slate-100 [&.active]:font-semibold [&.active]:text-slate-900\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: item.route === 'dashboard' }\"\n >\n <eds-icon class=\"shrink-0 text-slate-600 group-hover/link:text-slate-900 group-[.active]/link:text-slate-900\" [name]=\"item.icon\" [size]=\"24\" />\n <span class=\"min-w-0 flex-1\">{{ item.label }}</span>\n </a>\n }\n </div>\n\n @if (includePracticeNav) {\n <p class=\"mx-3 mb-2 mt-4 text-sm font-semibold text-[var(--eds-text-table-header,#4d5573)]\">Practice</p>\n <div class=\"mb-3 flex flex-col gap-1\">\n @for (item of practiceNav; track item.id) {\n @if (showNavItem(item)) {\n <a\n class=\"group/link relative flex items-center gap-3 rounded-[10px] px-3 py-3 text-sm font-medium leading-tight text-slate-700 no-underline transition-colors duration-150 hover:bg-slate-50 hover:text-slate-900 [&.active]:bg-slate-100 [&.active]:font-semibold [&.active]:text-slate-900\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"active\"\n >\n <eds-icon class=\"shrink-0 text-slate-600 group-hover/link:text-slate-900 group-[.active]/link:text-slate-900\" [name]=\"item.icon\" [size]=\"24\" />\n <span class=\"min-w-0 flex-1\">{{ item.label }}</span>\n </a>\n }\n }\n </div>\n }\n\n @if (showLogout()) {\n <div class=\"mt-auto border-t border-[var(--eds-border-default)] pt-3\">\n @if (userEmail(); as email) {\n <p class=\"mb-2 truncate px-3 text-xs text-slate-500\" [title]=\"email\">{{ email }}</p>\n }\n <button\n type=\"button\"\n class=\"group/link relative flex w-full cursor-pointer items-center gap-3 rounded-[10px] border-0 bg-transparent px-3 py-3 text-left text-sm font-medium leading-tight text-slate-700 transition-colors duration-150 hover:bg-slate-50 hover:text-slate-900\"\n (click)=\"logout()\"\n aria-label=\"Log out\"\n title=\"Log out\"\n >\n <eds-icon class=\"shrink-0 text-slate-600 group-hover/link:text-slate-900\" name=\"logout\" [size]=\"24\" />\n <span class=\"min-w-0 flex-1\">Log out</span>\n </button>\n </div>\n }\n</nav>\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: EdsIconComponent, selector: "eds-icon", inputs: ["name", "size", "fill", "weight"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
132
|
-
}
|
|
133
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsModuleNavComponent, decorators: [{
|
|
134
|
-
type: Component,
|
|
135
|
-
args: [{ selector: 'eds-module-nav', imports: [RouterLink, RouterLinkActive, EdsIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'block shrink-0' }, template: "<nav\n class=\"flex h-screen min-h-screen w-[var(--eds-nav-width)] flex-col overflow-y-auto sticky top-0 border-r border-[var(--eds-border-default)] bg-white py-5 px-4\"\n aria-label=\"AI Receptionist\"\n>\n <div class=\"mb-4 flex items-center gap-3 border-b border-[var(--eds-border-default)] px-1 pb-4 pt-1\">\n <span class=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-[10px] bg-violet-500/15 text-[var(--eds-violet-500)]\" aria-hidden=\"true\">\n <eds-icon name=\"auto_awesome\" [size]=\"20\" [fill]=\"1\" />\n </span>\n <div class=\"flex min-w-0 flex-col gap-1\">\n <span class=\"text-[15px] font-semibold leading-tight tracking-tight text-[var(--eds-text-primary)]\">AI Receptionist</span>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n @for (item of receptionistNav; track item.id) {\n <a\n class=\"group/link relative flex items-center gap-3 rounded-[10px] px-3 py-3 text-sm font-medium leading-tight text-slate-700 no-underline transition-colors duration-150 hover:bg-slate-50 hover:text-slate-900 [&.active]:bg-slate-100 [&.active]:font-semibold [&.active]:text-slate-900\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: item.route === 'dashboard' }\"\n >\n <eds-icon class=\"shrink-0 text-slate-600 group-hover/link:text-slate-900 group-[.active]/link:text-slate-900\" [name]=\"item.icon\" [size]=\"24\" />\n <span class=\"min-w-0 flex-1\">{{ item.label }}</span>\n </a>\n }\n </div>\n\n @if (includePracticeNav) {\n <p class=\"mx-3 mb-2 mt-4 text-sm font-semibold text-[var(--eds-text-table-header,#4d5573)]\">Practice</p>\n <div class=\"mb-3 flex flex-col gap-1\">\n @for (item of practiceNav; track item.id) {\n @if (showNavItem(item)) {\n <a\n class=\"group/link relative flex items-center gap-3 rounded-[10px] px-3 py-3 text-sm font-medium leading-tight text-slate-700 no-underline transition-colors duration-150 hover:bg-slate-50 hover:text-slate-900 [&.active]:bg-slate-100 [&.active]:font-semibold [&.active]:text-slate-900\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"active\"\n >\n <eds-icon class=\"shrink-0 text-slate-600 group-hover/link:text-slate-900 group-[.active]/link:text-slate-900\" [name]=\"item.icon\" [size]=\"24\" />\n <span class=\"min-w-0 flex-1\">{{ item.label }}</span>\n </a>\n }\n }\n </div>\n }\n\n @if (showLogout()) {\n <div class=\"mt-auto border-t border-[var(--eds-border-default)] pt-3\">\n @if (userEmail(); as email) {\n <p class=\"mb-2 truncate px-3 text-xs text-slate-500\" [title]=\"email\">{{ email }}</p>\n }\n <button\n type=\"button\"\n class=\"group/link relative flex w-full cursor-pointer items-center gap-3 rounded-[10px] border-0 bg-transparent px-3 py-3 text-left text-sm font-medium leading-tight text-slate-700 transition-colors duration-150 hover:bg-slate-50 hover:text-slate-900\"\n (click)=\"logout()\"\n aria-label=\"Log out\"\n title=\"Log out\"\n >\n <eds-icon class=\"shrink-0 text-slate-600 group-hover/link:text-slate-900\" name=\"logout\" [size]=\"24\" />\n <span class=\"min-w-0 flex-1\">Log out</span>\n </button>\n </div>\n }\n</nav>\n" }]
|
|
136
|
-
}] });
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Thin top progress bar + soft content veil while Angular navigates
|
|
140
|
-
* (lazy chunks, guards). Use once at the host root or app shell.
|
|
141
|
-
*/
|
|
142
|
-
class EdsRouteProgressComponent {
|
|
143
|
-
constructor() {
|
|
144
|
-
this.router = inject(Router);
|
|
145
|
-
this.destroyRef = inject(DestroyRef);
|
|
146
|
-
this.hideTimer = null;
|
|
147
|
-
this.active = signal(false);
|
|
148
|
-
this.router.events
|
|
149
|
-
.pipe(filter((e) => e instanceof NavigationStart ||
|
|
150
|
-
e instanceof NavigationEnd ||
|
|
151
|
-
e instanceof NavigationCancel ||
|
|
152
|
-
e instanceof NavigationError), takeUntilDestroyed(this.destroyRef))
|
|
153
|
-
.subscribe((e) => {
|
|
154
|
-
if (e instanceof NavigationStart) {
|
|
155
|
-
this.clearHideTimer();
|
|
156
|
-
this.active.set(true);
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
// Keep visible briefly so fast navigations still feel intentional.
|
|
160
|
-
this.clearHideTimer();
|
|
161
|
-
this.hideTimer = setTimeout(() => this.active.set(false), 180);
|
|
162
|
-
});
|
|
163
|
-
this.destroyRef.onDestroy(() => this.clearHideTimer());
|
|
164
|
-
}
|
|
165
|
-
clearHideTimer() {
|
|
166
|
-
if (this.hideTimer) {
|
|
167
|
-
clearTimeout(this.hideTimer);
|
|
168
|
-
this.hideTimer = null;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsRouteProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
172
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: EdsRouteProgressComponent, isStandalone: true, selector: "eds-route-progress", ngImport: i0, template: `
|
|
173
|
-
@if (active()) {
|
|
174
|
-
<div class="eds-route-progress" role="progressbar" aria-busy="true" aria-label="Loading page">
|
|
175
|
-
<div class="eds-route-progress__bar"></div>
|
|
176
|
-
</div>
|
|
177
|
-
<div class="eds-route-progress__veil" aria-hidden="true">
|
|
178
|
-
<div class="eds-route-progress__panel">
|
|
179
|
-
<span class="eds-route-progress__spinner"></span>
|
|
180
|
-
<span class="eds-route-progress__label">Loading…</span>
|
|
181
|
-
</div>
|
|
182
|
-
</div>
|
|
183
|
-
}
|
|
184
|
-
`, isInline: true, styles: [":host{display:contents}.eds-route-progress{position:fixed;inset:0 0 auto;z-index:9999;height:3px;overflow:hidden;pointer-events:none;background:transparent}.eds-route-progress__bar{height:100%;width:40%;border-radius:0 2px 2px 0;background:linear-gradient(90deg,#2162f0,#8e51ff);animation:eds-route-progress-slide 1.05s ease-in-out infinite}.eds-route-progress__veil{position:fixed;inset:0;z-index:9998;display:flex;align-items:center;justify-content:center;pointer-events:all;background:#f7faff8c;backdrop-filter:blur(1px)}.eds-route-progress__panel{display:inline-flex;align-items:center;gap:.75rem;padding:.75rem 1.1rem;border:1px solid #e2e8f0;border-radius:.75rem;background:#fff;box-shadow:0 8px 24px #0f172a14;color:#334155;font-family:Inter,system-ui,sans-serif;font-size:.875rem;font-weight:500}.eds-route-progress__spinner{width:1.1rem;height:1.1rem;border:2px solid #dbeafe;border-top-color:#2162f0;border-radius:999px;animation:eds-route-progress-spin .7s linear infinite}.eds-route-progress__label{letter-spacing:-.01em}@keyframes eds-route-progress-slide{0%{transform:translate(-120%)}to{transform:translate(320%)}}@keyframes eds-route-progress-spin{to{transform:rotate(360deg)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
185
|
-
}
|
|
186
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsRouteProgressComponent, decorators: [{
|
|
187
|
-
type: Component,
|
|
188
|
-
args: [{ selector: 'eds-route-progress', standalone: true, template: `
|
|
189
|
-
@if (active()) {
|
|
190
|
-
<div class="eds-route-progress" role="progressbar" aria-busy="true" aria-label="Loading page">
|
|
191
|
-
<div class="eds-route-progress__bar"></div>
|
|
192
|
-
</div>
|
|
193
|
-
<div class="eds-route-progress__veil" aria-hidden="true">
|
|
194
|
-
<div class="eds-route-progress__panel">
|
|
195
|
-
<span class="eds-route-progress__spinner"></span>
|
|
196
|
-
<span class="eds-route-progress__label">Loading…</span>
|
|
197
|
-
</div>
|
|
198
|
-
</div>
|
|
199
|
-
}
|
|
200
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:contents}.eds-route-progress{position:fixed;inset:0 0 auto;z-index:9999;height:3px;overflow:hidden;pointer-events:none;background:transparent}.eds-route-progress__bar{height:100%;width:40%;border-radius:0 2px 2px 0;background:linear-gradient(90deg,#2162f0,#8e51ff);animation:eds-route-progress-slide 1.05s ease-in-out infinite}.eds-route-progress__veil{position:fixed;inset:0;z-index:9998;display:flex;align-items:center;justify-content:center;pointer-events:all;background:#f7faff8c;backdrop-filter:blur(1px)}.eds-route-progress__panel{display:inline-flex;align-items:center;gap:.75rem;padding:.75rem 1.1rem;border:1px solid #e2e8f0;border-radius:.75rem;background:#fff;box-shadow:0 8px 24px #0f172a14;color:#334155;font-family:Inter,system-ui,sans-serif;font-size:.875rem;font-weight:500}.eds-route-progress__spinner{width:1.1rem;height:1.1rem;border:2px solid #dbeafe;border-top-color:#2162f0;border-radius:999px;animation:eds-route-progress-spin .7s linear infinite}.eds-route-progress__label{letter-spacing:-.01em}@keyframes eds-route-progress-slide{0%{transform:translate(-120%)}to{transform:translate(320%)}}@keyframes eds-route-progress-spin{to{transform:rotate(360deg)}}\n"] }]
|
|
201
|
-
}], ctorParameters: () => [] });
|
|
202
|
-
|
|
203
|
-
class EdsAppShellComponent {
|
|
204
|
-
constructor() {
|
|
205
|
-
/** EHR embed: false (default). Standalone Voice Hub: set showModuleNav: true. */
|
|
206
|
-
this.showModuleNav = !!inject(VOICE_RECEPTIONIST_CONFIG).showModuleNav;
|
|
207
|
-
/**
|
|
208
|
-
* Standalone Voice Hub mounts progress on app-root. EHR embeds that only use
|
|
209
|
-
* this shell still need a nav loader — enable when host nav is hidden.
|
|
210
|
-
*/
|
|
211
|
-
this.showRouteProgress = !this.showModuleNav;
|
|
212
|
-
}
|
|
213
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsAppShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
214
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: EdsAppShellComponent, isStandalone: true, selector: "eds-app-shell", ngImport: i0, template: "<div class=\"eds-layout flex min-h-screen\">\n @if (showRouteProgress) {\n <eds-route-progress />\n }\n @if (showModuleNav) {\n <eds-module-nav />\n }\n <div class=\"eds-main flex min-w-0 flex-1 flex-col\">\n <div class=\"eds-content flex-1 overflow-auto\">\n <router-outlet />\n </div>\n </div>\n <app-toast-container />\n</div>\n", styles: [":host{display:block}.eds-layout{background:var(--eds-surface-l1);font-family:var(--eds-font-inter, \"Inter\", sans-serif);font-size:var(--eds-font-size-base, 13px);font-weight:var(--eds-font-weight-regular, 400);color:var(--eds-text-primary, #41464c)}\n"], dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: EdsModuleNavComponent, selector: "eds-module-nav" }, { kind: "component", type: ToastContainerComponent, selector: "app-toast-container" }, { kind: "component", type: EdsRouteProgressComponent, selector: "eds-route-progress" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
215
|
-
}
|
|
216
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsAppShellComponent, decorators: [{
|
|
217
|
-
type: Component,
|
|
218
|
-
args: [{ selector: 'eds-app-shell', imports: [
|
|
219
|
-
RouterOutlet,
|
|
220
|
-
EdsModuleNavComponent,
|
|
221
|
-
ToastContainerComponent,
|
|
222
|
-
EdsRouteProgressComponent,
|
|
223
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"eds-layout flex min-h-screen\">\n @if (showRouteProgress) {\n <eds-route-progress />\n }\n @if (showModuleNav) {\n <eds-module-nav />\n }\n <div class=\"eds-main flex min-w-0 flex-1 flex-col\">\n <div class=\"eds-content flex-1 overflow-auto\">\n <router-outlet />\n </div>\n </div>\n <app-toast-container />\n</div>\n", styles: [":host{display:block}.eds-layout{background:var(--eds-surface-l1);font-family:var(--eds-font-inter, \"Inter\", sans-serif);font-size:var(--eds-font-size-base, 13px);font-weight:var(--eds-font-weight-regular, 400);color:var(--eds-text-primary, #41464c)}\n"] }]
|
|
224
|
-
}] });
|
|
225
|
-
|
|
226
|
-
/** Build URL helpers from a config (or raw base URL). Safe outside injection context. */
|
|
227
|
-
function createVoiceReceptionistPaths(configOrBase) {
|
|
228
|
-
const base = typeof configOrBase === 'string' ? configOrBase : configOrBase.apiBaseUrl;
|
|
229
|
-
const root = base.replace(/\/$/, '');
|
|
230
|
-
return {
|
|
231
|
-
apiRoot: () => root,
|
|
232
|
-
authPath: (suffix = '') => `${root}/api/auth${suffix}`,
|
|
233
|
-
v1Path: (suffix = '') => `${root}/api/v1${suffix}`,
|
|
234
|
-
apiPath: (suffix = '') => `${root}/api${suffix}`,
|
|
235
|
-
aiReceptionistPath: (suffix = '') => `${root}/api/ai-receptionist${suffix}`,
|
|
236
|
-
healthPath: (suffix = '') => `${root}/health${suffix}`,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/** Normalize list/detail API payloads into a row array. */
|
|
241
|
-
function extractApiRows(body) {
|
|
242
|
-
if (Array.isArray(body))
|
|
243
|
-
return body;
|
|
244
|
-
if (!body || typeof body !== 'object')
|
|
245
|
-
return [];
|
|
246
|
-
const o = body;
|
|
247
|
-
const list = o['items'] ?? o['patients'] ?? o['appointments'] ?? o['providers'] ?? o['data'];
|
|
248
|
-
if (Array.isArray(list))
|
|
249
|
-
return list;
|
|
250
|
-
if (o['patientId'] || o['patient_id'] || o['appointmentId'] || o['appointment_id']) {
|
|
251
|
-
return [body];
|
|
252
|
-
}
|
|
253
|
-
return [];
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
function mapOutboundPatientHit(raw) {
|
|
257
|
-
if (!raw || typeof raw !== 'object')
|
|
258
|
-
return null;
|
|
259
|
-
const r = raw;
|
|
260
|
-
const patientId = String(r['patientId'] ?? r['patient_id'] ?? r['id'] ?? '').trim();
|
|
261
|
-
if (!patientId)
|
|
262
|
-
return null;
|
|
263
|
-
const firstName = String(r['firstName'] ?? r['first_name'] ?? '').trim();
|
|
264
|
-
const lastName = String(r['lastName'] ?? r['last_name'] ?? '').trim();
|
|
265
|
-
const full = String(r['fullName'] ?? r['full_name'] ?? r['name'] ?? '').trim() ||
|
|
266
|
-
[firstName, lastName].filter(Boolean).join(' ');
|
|
267
|
-
const phone = String(r['mobilePhone'] ?? r['phone'] ?? r['mobile_phone'] ?? '').trim() || null;
|
|
268
|
-
const dobRaw = String(r['dateOfBirth'] ?? r['dob'] ?? '').trim();
|
|
269
|
-
return {
|
|
270
|
-
patientId,
|
|
271
|
-
firstName,
|
|
272
|
-
lastName,
|
|
273
|
-
fullName: full || 'Unknown patient',
|
|
274
|
-
phone,
|
|
275
|
-
dob: dobRaw ? dobRaw.slice(0, 10) : null,
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
function mapOutboundAppointmentHit(raw) {
|
|
279
|
-
if (!raw || typeof raw !== 'object')
|
|
280
|
-
return null;
|
|
281
|
-
const r = raw;
|
|
282
|
-
const appointmentId = String(r['appointmentId'] ?? r['appointment_id'] ?? r['id'] ?? '').trim();
|
|
283
|
-
if (!appointmentId)
|
|
284
|
-
return null;
|
|
285
|
-
const providerObj = r['provider'] && typeof r['provider'] === 'object'
|
|
286
|
-
? r['provider']
|
|
287
|
-
: null;
|
|
288
|
-
const locationObj = r['location'] && typeof r['location'] === 'object'
|
|
289
|
-
? r['location']
|
|
290
|
-
: null;
|
|
291
|
-
const visitObj = r['visitType'] && typeof r['visitType'] === 'object'
|
|
292
|
-
? r['visitType']
|
|
293
|
-
: null;
|
|
294
|
-
const providerName = String(r['providerName'] ??
|
|
295
|
-
r['provider_name'] ??
|
|
296
|
-
providerObj?.['fullName'] ??
|
|
297
|
-
[providerObj?.['firstName'], providerObj?.['lastName']].filter(Boolean).join(' ') ??
|
|
298
|
-
'').trim() || null;
|
|
299
|
-
const locationName = String(r['locationName'] ?? r['location_name'] ?? locationObj?.['locationName'] ?? '').trim() || null;
|
|
300
|
-
const visitTypeRaw = r['visitType'];
|
|
301
|
-
const visitType = (typeof visitTypeRaw === 'string' ? visitTypeRaw.trim() : '') ||
|
|
302
|
-
String(r['visitTypeName'] ??
|
|
303
|
-
r['visit_type'] ??
|
|
304
|
-
visitObj?.['visitTypeName'] ??
|
|
305
|
-
visitObj?.['name'] ??
|
|
306
|
-
'').trim() ||
|
|
307
|
-
null;
|
|
308
|
-
return {
|
|
309
|
-
appointmentId,
|
|
310
|
-
startTime: String(r['startTime'] ?? r['start_time'] ?? '').trim() || null,
|
|
311
|
-
endTime: String(r['endTime'] ?? r['end_time'] ?? '').trim() || null,
|
|
312
|
-
providerName,
|
|
313
|
-
locationName,
|
|
314
|
-
status: String(r['appointmentStatus'] ?? r['status'] ?? r['visitStatus'] ?? '').trim() || null,
|
|
315
|
-
visitType,
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
|
-
/** Best-effort E.164 for US/local numbers used in dialer. */
|
|
319
|
-
function toE164Phone(raw) {
|
|
320
|
-
const digits = String(raw ?? '').replace(/\D/g, '');
|
|
321
|
-
if (!digits)
|
|
322
|
-
return '';
|
|
323
|
-
if (String(raw ?? '').trim().startsWith('+') && /^\+[1-9]\d{6,14}$/.test(String(raw).trim())) {
|
|
324
|
-
return String(raw).trim();
|
|
325
|
-
}
|
|
326
|
-
if (digits.length === 10)
|
|
327
|
-
return `+1${digits}`;
|
|
328
|
-
if (digits.length === 11 && digits.startsWith('1'))
|
|
329
|
-
return `+${digits}`;
|
|
330
|
-
if (digits.length >= 8)
|
|
331
|
-
return `+${digits}`;
|
|
332
|
-
return String(raw ?? '').trim();
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
function mapStaffMediaJoinResult(raw) {
|
|
336
|
-
if (!raw || typeof raw !== 'object')
|
|
337
|
-
return null;
|
|
338
|
-
const r = raw;
|
|
339
|
-
const data = r['data'] && typeof r['data'] === 'object'
|
|
340
|
-
? r['data']
|
|
341
|
-
: r;
|
|
342
|
-
const livekitUrl = String(data['livekitUrl'] ?? data['livekit_url'] ?? data['url'] ?? '').trim();
|
|
343
|
-
const clientToken = String(data['clientToken'] ?? data['client_token'] ?? data['token'] ?? '').trim();
|
|
344
|
-
const modeRaw = String(data['mode'] ?? 'takeover').toLowerCase();
|
|
345
|
-
const mode = modeRaw === 'listen' ? 'listen' : 'takeover';
|
|
346
|
-
if (!livekitUrl || !clientToken)
|
|
347
|
-
return null;
|
|
348
|
-
return {
|
|
349
|
-
ok: data['ok'] !== false,
|
|
350
|
-
callId: String(data['callId'] ?? data['call_id'] ?? ''),
|
|
351
|
-
mode,
|
|
352
|
-
provider: String(data['provider'] ?? 'livekit'),
|
|
353
|
-
livekitUrl,
|
|
354
|
-
clientToken,
|
|
355
|
-
tokenExpiresAt: strOrNull$1(data['tokenExpiresAt'] ?? data['token_expires_at']),
|
|
356
|
-
conversationId: strOrNull$1(data['conversationId'] ?? data['conversation_id']),
|
|
357
|
-
memberId: strOrNull$1(data['memberId'] ?? data['member_id']),
|
|
358
|
-
roomName: strOrNull$1(data['roomName'] ?? data['room_name']),
|
|
359
|
-
iceServers: Array.isArray(data['iceServers']) ? data['iceServers'] : undefined,
|
|
360
|
-
controlMode: strOrNull$1(data['controlMode'] ?? data['control_mode']),
|
|
361
|
-
aiPaused: typeof data['aiPaused'] === 'boolean'
|
|
362
|
-
? data['aiPaused']
|
|
363
|
-
: typeof data['ai_paused'] === 'boolean'
|
|
364
|
-
? data['ai_paused']
|
|
365
|
-
: mode === 'takeover',
|
|
366
|
-
aiHandedOff: typeof data['aiHandedOff'] === 'boolean'
|
|
367
|
-
? data['aiHandedOff']
|
|
368
|
-
: mode === 'takeover',
|
|
369
|
-
assigned: strOrNull$1(data['assigned']),
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
function strOrNull$1(value) {
|
|
373
|
-
const s = String(value ?? '').trim();
|
|
374
|
-
return s || null;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
function mapAgentActivity(raw, index = 0) {
|
|
378
|
-
if (!raw || typeof raw !== 'object') {
|
|
379
|
-
return {
|
|
380
|
-
id: `activity-${index}`,
|
|
381
|
-
type: 'unknown',
|
|
382
|
-
occurredAt: new Date().toISOString(),
|
|
383
|
-
title: 'Activity',
|
|
384
|
-
detail: '',
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
|
-
const r = raw;
|
|
388
|
-
const nestedPatient = asRecord(r['patient']);
|
|
389
|
-
const nestedProvider = asRecord(r['provider'] ?? r['practitioner'] ?? r['doctor']);
|
|
390
|
-
const type = String(r['type'] ?? r['activityType'] ?? 'unknown');
|
|
391
|
-
const patientName = strOrNull(r['patientName'] ?? r['patient_name']) ?? strOrNull(nestedPatient?.['name']);
|
|
392
|
-
const providerName = strOrNull(r['providerName'] ??
|
|
393
|
-
r['provider_name'] ??
|
|
394
|
-
r['practitionerName'] ??
|
|
395
|
-
r['practitioner_name'] ??
|
|
396
|
-
r['doctorName'] ??
|
|
397
|
-
r['doctor_name']) ?? strOrNull(nestedProvider?.['name']);
|
|
398
|
-
const detail = String(r['detail'] ?? r['description'] ?? '').trim();
|
|
399
|
-
const parsed = parseActivityDetail(detail);
|
|
400
|
-
const insurance = resolveInsurance(r, nestedPatient);
|
|
401
|
-
const visitType = strOrNull(r['visitType'] ?? r['visit_type'] ?? r['category'] ?? r['reason']) ??
|
|
402
|
-
parsed.visitType;
|
|
403
|
-
const startAt = strOrNull(r['startAt'] ?? r['start_at'] ?? r['appointmentStart'] ?? r['appointment_start']) ??
|
|
404
|
-
parsed.startAt;
|
|
405
|
-
const endAt = strOrNull(r['endAt'] ?? r['end_at'] ?? r['appointmentEnd'] ?? r['appointment_end']);
|
|
406
|
-
const practiceName = strOrNull(r['practiceName'] ?? r['practice_name'] ?? r['location'] ?? r['clinic']) ??
|
|
407
|
-
parsed.practiceName;
|
|
408
|
-
return {
|
|
409
|
-
id: String(r['id'] ?? r['activityId'] ?? `activity-${index}`),
|
|
410
|
-
type,
|
|
411
|
-
occurredAt: String(r['occurredAt'] ?? r['occurred_at'] ?? r['createdAt'] ?? ''),
|
|
412
|
-
title: String(r['title'] ?? r['summary'] ?? '').trim() || activityTypeLabel(type),
|
|
413
|
-
detail,
|
|
414
|
-
patientId: strOrNull(r['patientId'] ?? r['patient_id'] ?? nestedPatient?.['id']),
|
|
415
|
-
patientName,
|
|
416
|
-
appointmentId: strOrNull(r['appointmentId'] ?? r['appointment_id']),
|
|
417
|
-
taskId: strOrNull(r['taskId'] ?? r['task_id']),
|
|
418
|
-
callId: strOrNull(r['callId'] ?? r['call_id']),
|
|
419
|
-
startAt,
|
|
420
|
-
endAt,
|
|
421
|
-
durationMinutes: numOrNull(r['durationMinutes'] ?? r['duration_minutes'] ?? r['duration']),
|
|
422
|
-
visitType,
|
|
423
|
-
practiceName,
|
|
424
|
-
patientDob: strOrNull(r['patientDob'] ?? r['patient_dob'] ?? r['dob'] ?? nestedPatient?.['dob']),
|
|
425
|
-
patientAge: numOrNull(r['patientAge'] ?? r['patient_age'] ?? r['age'] ?? nestedPatient?.['age']),
|
|
426
|
-
patientGender: normalizeGender(r['patientGender'] ?? r['patient_gender'] ?? r['gender'] ?? nestedPatient?.['gender']),
|
|
427
|
-
patientInitials: strOrNull(r['patientInitials'] ??
|
|
428
|
-
r['patient_initials'] ??
|
|
429
|
-
r['initials'] ??
|
|
430
|
-
nestedPatient?.['initials']) ?? initialsFromName(patientName),
|
|
431
|
-
patientMrn: strOrNull(r['patientMrn'] ??
|
|
432
|
-
r['patient_mrn'] ??
|
|
433
|
-
r['mrn'] ??
|
|
434
|
-
r['MRN'] ??
|
|
435
|
-
nestedPatient?.['mrn'] ??
|
|
436
|
-
nestedPatient?.['MRN']),
|
|
437
|
-
hasInsurance: insurance.hasInsurance,
|
|
438
|
-
insuranceName: insurance.name,
|
|
439
|
-
providerId: strOrNull(r['providerId'] ?? r['provider_id'] ?? nestedProvider?.['id']),
|
|
440
|
-
providerName,
|
|
441
|
-
providerInitials: strOrNull(r['providerInitials'] ??
|
|
442
|
-
r['provider_initials'] ??
|
|
443
|
-
nestedProvider?.['initials']) ?? initialsFromName(providerName),
|
|
444
|
-
providerSpecialty: strOrNull(r['providerSpecialty'] ??
|
|
445
|
-
r['provider_specialty'] ??
|
|
446
|
-
r['specialty'] ??
|
|
447
|
-
nestedProvider?.['specialty'] ??
|
|
448
|
-
nestedProvider?.['speciality']),
|
|
449
|
-
priority: normalizePriority(r['priority'] ?? r['taskPriority'] ?? r['task_priority']),
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
const INSURED_WORDS = ['active', 'verified', 'covered', 'insured', 'yes', 'true', 'eligible'];
|
|
453
|
-
const UNINSURED_WORDS = [
|
|
454
|
-
'none',
|
|
455
|
-
'no',
|
|
456
|
-
'false',
|
|
457
|
-
'uninsured',
|
|
458
|
-
'self_pay',
|
|
459
|
-
'self-pay',
|
|
460
|
-
'selfpay',
|
|
461
|
-
'inactive',
|
|
462
|
-
'expired',
|
|
463
|
-
'missing',
|
|
464
|
-
];
|
|
465
|
-
/**
|
|
466
|
-
* Coverage can arrive as a boolean, a status string, a payer name or a nested object.
|
|
467
|
-
* Unknown stays null so the UI can distinguish "no coverage" from "never told us".
|
|
468
|
-
*/
|
|
469
|
-
function resolveInsurance(r, patient) {
|
|
470
|
-
const nested = asRecord(r['insurance'] ?? patient?.['insurance']);
|
|
471
|
-
const name = strOrNull(r['insuranceName'] ??
|
|
472
|
-
r['insurance_name'] ??
|
|
473
|
-
r['payerName'] ??
|
|
474
|
-
r['payer_name'] ??
|
|
475
|
-
r['payer'] ??
|
|
476
|
-
patient?.['insuranceName'] ??
|
|
477
|
-
patient?.['insurance_name'] ??
|
|
478
|
-
nested?.['name'] ??
|
|
479
|
-
nested?.['payer'] ??
|
|
480
|
-
nested?.['planName']) ?? (typeof r['insurance'] === 'string' ? strOrNull(r['insurance']) : null);
|
|
481
|
-
const flag = firstBoolean([
|
|
482
|
-
r['hasInsurance'],
|
|
483
|
-
r['has_insurance'],
|
|
484
|
-
r['insured'],
|
|
485
|
-
r['isInsured'],
|
|
486
|
-
patient?.['hasInsurance'],
|
|
487
|
-
patient?.['has_insurance'],
|
|
488
|
-
patient?.['insured'],
|
|
489
|
-
nested?.['active'],
|
|
490
|
-
nested?.['isActive'],
|
|
491
|
-
]);
|
|
492
|
-
if (flag !== null)
|
|
493
|
-
return { hasInsurance: flag, name };
|
|
494
|
-
const status = String(r['insuranceStatus'] ??
|
|
495
|
-
r['insurance_status'] ??
|
|
496
|
-
patient?.['insuranceStatus'] ??
|
|
497
|
-
patient?.['insurance_status'] ??
|
|
498
|
-
nested?.['status'] ??
|
|
499
|
-
(typeof r['insurance'] === 'string' ? r['insurance'] : '') ??
|
|
500
|
-
'')
|
|
501
|
-
.trim()
|
|
502
|
-
.toLowerCase();
|
|
503
|
-
if (status) {
|
|
504
|
-
if (INSURED_WORDS.includes(status))
|
|
505
|
-
return { hasInsurance: true, name };
|
|
506
|
-
if (UNINSURED_WORDS.includes(status))
|
|
507
|
-
return { hasInsurance: false, name };
|
|
508
|
-
}
|
|
509
|
-
// A payer name on its own implies coverage.
|
|
510
|
-
return { hasInsurance: name ? true : null, name };
|
|
511
|
-
}
|
|
512
|
-
function firstBoolean(values) {
|
|
513
|
-
for (const value of values) {
|
|
514
|
-
if (typeof value === 'boolean')
|
|
515
|
-
return value;
|
|
516
|
-
}
|
|
517
|
-
return null;
|
|
518
|
-
}
|
|
519
|
-
/** Pull visit type / slot / practice out of a messy free-text detail blob. */
|
|
520
|
-
function parseActivityDetail(detail) {
|
|
521
|
-
if (!detail)
|
|
522
|
-
return { visitType: null, startAt: null, practiceName: null };
|
|
523
|
-
const visitMatch = /\(([^)]+)\)\s*$/.exec(detail);
|
|
524
|
-
const visitType = visitMatch?.[1]?.trim() || null;
|
|
525
|
-
const dateMatch = /\bfor\s+(\d{4}-\d{2}-\d{2})(?:\s+(\d{1,2}:\d{2}(?::\d{2})?))?/i.exec(detail) ??
|
|
526
|
-
/\b(\d{4}-\d{2}-\d{2})[ T](\d{1,2}:\d{2}(?::\d{2})?)/.exec(detail);
|
|
527
|
-
let startAt = null;
|
|
528
|
-
if (dateMatch) {
|
|
529
|
-
const date = dateMatch[1];
|
|
530
|
-
const time = dateMatch[2] ? dateMatch[2].padStart(5, '0') : '00:00';
|
|
531
|
-
startAt = `${date}T${time.length === 5 ? `${time}:00` : time}`;
|
|
532
|
-
}
|
|
533
|
-
const practiceMatch = /\bAT\s+([A-Z0-9][A-Z0-9 ,.'&-]{2,}?)(?:\s*\(|$)/.exec(detail);
|
|
534
|
-
const practiceName = practiceMatch?.[1]?.trim().replace(/,\s*$/, '') || null;
|
|
535
|
-
return { visitType, startAt, practiceName };
|
|
536
|
-
}
|
|
537
|
-
function activityTypeLabel(type) {
|
|
538
|
-
switch (type) {
|
|
539
|
-
case 'patient_created':
|
|
540
|
-
return 'Patient created';
|
|
541
|
-
case 'appointment_booked':
|
|
542
|
-
return 'Appointment booked';
|
|
543
|
-
case 'task_created':
|
|
544
|
-
return 'Task created';
|
|
545
|
-
default:
|
|
546
|
-
return type.replace(/_/g, ' ') || 'Activity';
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
function initialsFromName(name) {
|
|
550
|
-
if (!name?.trim())
|
|
551
|
-
return null;
|
|
552
|
-
const cleaned = name.replace(/^dr\.?\s+/i, '').trim();
|
|
553
|
-
const parts = cleaned.split(/\s+/).filter(Boolean);
|
|
554
|
-
if (!parts.length)
|
|
555
|
-
return null;
|
|
556
|
-
if (parts.length === 1)
|
|
557
|
-
return parts[0].slice(0, 2).toUpperCase();
|
|
558
|
-
return `${parts[0][0] ?? ''}${parts[parts.length - 1][0] ?? ''}`.toUpperCase();
|
|
559
|
-
}
|
|
560
|
-
function normalizeGender(value) {
|
|
561
|
-
const s = String(value ?? '').trim();
|
|
562
|
-
if (!s)
|
|
563
|
-
return null;
|
|
564
|
-
const key = s.toLowerCase();
|
|
565
|
-
if (key === 'm' || key === 'male')
|
|
566
|
-
return 'M';
|
|
567
|
-
if (key === 'f' || key === 'female')
|
|
568
|
-
return 'F';
|
|
569
|
-
if (key === 'o' || key === 'other' || key === 'non-binary' || key === 'nonbinary')
|
|
570
|
-
return 'O';
|
|
571
|
-
return s.length <= 3 ? s.toUpperCase() : s;
|
|
572
|
-
}
|
|
573
|
-
function normalizePriority(value) {
|
|
574
|
-
const key = String(value ?? '')
|
|
575
|
-
.trim()
|
|
576
|
-
.toLowerCase()
|
|
577
|
-
.replace(/[\s-]+/g, '_');
|
|
578
|
-
if (!key)
|
|
579
|
-
return null;
|
|
580
|
-
if (key === 'urgent' || key === 'critical')
|
|
581
|
-
return 'urgent';
|
|
582
|
-
if (key === 'high')
|
|
583
|
-
return 'high';
|
|
584
|
-
if (key === 'medium' || key === 'med' || key === 'normal')
|
|
585
|
-
return 'medium';
|
|
586
|
-
if (key === 'low')
|
|
587
|
-
return 'low';
|
|
588
|
-
return null;
|
|
589
|
-
}
|
|
590
|
-
function asRecord(value) {
|
|
591
|
-
return value && typeof value === 'object' && !Array.isArray(value)
|
|
592
|
-
? value
|
|
593
|
-
: null;
|
|
594
|
-
}
|
|
595
|
-
function strOrNull(value) {
|
|
596
|
-
const s = String(value ?? '').trim();
|
|
597
|
-
return s || null;
|
|
598
|
-
}
|
|
599
|
-
function numOrNull(value) {
|
|
600
|
-
if (value == null || value === '')
|
|
601
|
-
return null;
|
|
602
|
-
const n = Number(value);
|
|
603
|
-
return Number.isFinite(n) ? n : null;
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
const DEFAULT_PAGE_SIZE = 50;
|
|
607
|
-
/** Parse `{ items, total, page, limit }` or a bare array (legacy). */
|
|
608
|
-
function asPaginatedResult(body, fallbackPage = 1, fallbackLimit = DEFAULT_PAGE_SIZE) {
|
|
609
|
-
if (Array.isArray(body)) {
|
|
610
|
-
return {
|
|
611
|
-
items: body,
|
|
612
|
-
total: body.length,
|
|
613
|
-
page: fallbackPage,
|
|
614
|
-
limit: fallbackLimit,
|
|
615
|
-
};
|
|
616
|
-
}
|
|
617
|
-
if (!body || typeof body !== 'object') {
|
|
618
|
-
return { items: [], total: 0, page: fallbackPage, limit: fallbackLimit };
|
|
619
|
-
}
|
|
620
|
-
const o = body;
|
|
621
|
-
const rawItems = o['items'] ?? o['data'];
|
|
622
|
-
const items = Array.isArray(rawItems) ? rawItems : [];
|
|
623
|
-
const total = typeof o['total'] === 'number' ? o['total'] : items.length;
|
|
624
|
-
const page = typeof o['page'] === 'number' ? o['page'] : fallbackPage;
|
|
625
|
-
const limit = typeof o['limit'] === 'number' ? o['limit'] : fallbackLimit;
|
|
626
|
-
return { items, total, page, limit };
|
|
627
|
-
}
|
|
628
|
-
function totalPages(total, pageSize) {
|
|
629
|
-
return Math.max(1, Math.ceil(total / pageSize));
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
const WELCOME_MESSAGE_MAX = 1000;
|
|
633
|
-
function buildAutoWelcomeTemplate(practiceName, agentName) {
|
|
634
|
-
const practice = practiceName.trim() || 'our office';
|
|
635
|
-
const agent = agentName.trim() || 'your AI receptionist';
|
|
636
|
-
return `Hi, thanks for calling ${practice}. This is ${agent}. How can I help you today?`;
|
|
637
|
-
}
|
|
638
|
-
function resolveWelcomePreview(welcomeMessage, practiceName, agentName) {
|
|
639
|
-
const custom = welcomeMessage?.trim();
|
|
640
|
-
if (custom)
|
|
641
|
-
return custom;
|
|
642
|
-
return buildAutoWelcomeTemplate(practiceName, agentName);
|
|
643
|
-
}
|
|
644
|
-
function computeEffectiveWelcomeMessage(settings) {
|
|
645
|
-
const general = settings.general;
|
|
646
|
-
const custom = String(general['welcomeMessage'] ?? '').trim();
|
|
647
|
-
if (custom)
|
|
648
|
-
return custom;
|
|
649
|
-
return buildAutoWelcomeTemplate(String(general['practiceName'] ?? ''), String(general['agentName'] ?? ''));
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
/** Call history table helpers — resolution badges + result chips. */
|
|
653
|
-
function historyResolution(input) {
|
|
654
|
-
if (input.risk === 'urgent' || input.risk === 'review')
|
|
655
|
-
return 'needs_attention';
|
|
656
|
-
const r = String(input.resolution ?? '').trim().toLowerCase();
|
|
657
|
-
if (r === 'resolved')
|
|
658
|
-
return 'resolved';
|
|
659
|
-
if (r === 'unresolved' || r.includes('needs') || r.includes('attention')) {
|
|
660
|
-
return 'needs_attention';
|
|
661
|
-
}
|
|
662
|
-
const o = String(input.outcome ?? '').toLowerCase();
|
|
663
|
-
if (o.includes('unresolved') ||
|
|
664
|
-
o.includes('fail') ||
|
|
665
|
-
o.includes('escalat') ||
|
|
666
|
-
o.includes('abandon') ||
|
|
667
|
-
o.includes('attention') ||
|
|
668
|
-
o.includes('voicemail') ||
|
|
669
|
-
o === 'transferred') {
|
|
670
|
-
return 'needs_attention';
|
|
671
|
-
}
|
|
672
|
-
if (o === 'completed' || o.includes('completed'))
|
|
673
|
-
return 'resolved';
|
|
674
|
-
return 'resolved';
|
|
675
|
-
}
|
|
676
|
-
function historyResolutionLabel(resolution) {
|
|
677
|
-
return resolution === 'resolved' ? 'RESOLVED' : 'NEEDS ATTENTION';
|
|
678
|
-
}
|
|
679
|
-
function resultChipIcon(label) {
|
|
680
|
-
const key = label.toLowerCase();
|
|
681
|
-
if (key.includes('appointment') || key.includes('book'))
|
|
682
|
-
return 'calendar_month';
|
|
683
|
-
if (key.includes('task'))
|
|
684
|
-
return 'check_circle';
|
|
685
|
-
if (key.includes('register') || key.includes('patient'))
|
|
686
|
-
return 'person_add';
|
|
687
|
-
if (key.includes('info'))
|
|
688
|
-
return 'info';
|
|
689
|
-
if (key.includes('transfer'))
|
|
690
|
-
return 'phone_forwarded';
|
|
691
|
-
if (key.includes('refill'))
|
|
692
|
-
return 'medication';
|
|
693
|
-
return 'label';
|
|
694
|
-
}
|
|
695
|
-
function callerMetaLine(input) {
|
|
696
|
-
if (isUnknownCaller(input.name, input.matched)) {
|
|
697
|
-
return String(input.phone ?? '').trim() || '—';
|
|
698
|
-
}
|
|
699
|
-
const age = input.age ?? ageFromDob(input.dob);
|
|
700
|
-
if (!input.dob && age == null && !input.gender) {
|
|
701
|
-
return String(input.phone ?? '').trim() || '—';
|
|
702
|
-
}
|
|
703
|
-
const parts = [];
|
|
704
|
-
if (input.dob) {
|
|
705
|
-
parts.push(`DOB: ${formatDobDisplay(input.dob)}`);
|
|
706
|
-
}
|
|
707
|
-
const ageGender = [];
|
|
708
|
-
if (age != null)
|
|
709
|
-
ageGender.push(`${age}Y`);
|
|
710
|
-
if (input.gender)
|
|
711
|
-
ageGender.push(String(input.gender).charAt(0).toUpperCase());
|
|
712
|
-
if (ageGender.length) {
|
|
713
|
-
parts.push(parts.length ? `• ${ageGender.join(' | ')}` : ageGender.join(' | '));
|
|
714
|
-
}
|
|
715
|
-
return parts.join(' ') || String(input.phone ?? '').trim() || '—';
|
|
716
|
-
}
|
|
717
|
-
function formatDobDisplay(dob) {
|
|
718
|
-
const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(dob.trim());
|
|
719
|
-
if (m)
|
|
720
|
-
return `${m[2]}-${m[3]}-${m[1]}`;
|
|
721
|
-
return dob;
|
|
722
|
-
}
|
|
723
|
-
/** Age in whole years from YYYY-MM-DD (or partial ISO). */
|
|
724
|
-
function ageFromDob(dob, at = new Date()) {
|
|
725
|
-
const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(String(dob ?? '').trim());
|
|
726
|
-
if (!m)
|
|
727
|
-
return null;
|
|
728
|
-
const y = Number(m[1]);
|
|
729
|
-
const mo = Number(m[2]);
|
|
730
|
-
const d = Number(m[3]);
|
|
731
|
-
if (!y || !mo || !d)
|
|
732
|
-
return null;
|
|
733
|
-
let age = at.getFullYear() - y;
|
|
734
|
-
const hadBirthday = at.getMonth() + 1 > mo || (at.getMonth() + 1 === mo && at.getDate() >= d);
|
|
735
|
-
if (!hadBirthday)
|
|
736
|
-
age -= 1;
|
|
737
|
-
return age >= 0 && age < 130 ? age : null;
|
|
738
|
-
}
|
|
739
|
-
function isUnknownCaller(name, matched) {
|
|
740
|
-
if (matched === false)
|
|
741
|
-
return true;
|
|
742
|
-
const n = String(name ?? '').trim();
|
|
743
|
-
return !n || /^unknown/i.test(n) || n === '?';
|
|
744
|
-
}
|
|
745
|
-
/** Derive result chips from explicit actions, else from outcome text. */
|
|
746
|
-
function historyResultChips(results, outcome) {
|
|
747
|
-
if (results?.length)
|
|
748
|
-
return results;
|
|
749
|
-
const o = outcome.trim();
|
|
750
|
-
if (!o)
|
|
751
|
-
return [];
|
|
752
|
-
const lower = o.toLowerCase();
|
|
753
|
-
if (lower.includes('appointment') || lower.includes('book'))
|
|
754
|
-
return ['Appointment Booked'];
|
|
755
|
-
if (lower.includes('task'))
|
|
756
|
-
return ['Task Created'];
|
|
757
|
-
if (lower.includes('register'))
|
|
758
|
-
return ['Patient Registered'];
|
|
759
|
-
if (lower.includes('info') || lower.includes('hours') || lower.includes('direction')) {
|
|
760
|
-
return ['Information Provided'];
|
|
761
|
-
}
|
|
762
|
-
if (lower === 'completed')
|
|
763
|
-
return ['Information Provided'];
|
|
764
|
-
return [o];
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
/** V3 agent tool labels — mirrors GET /api/agent-tools/catalog */
|
|
768
|
-
const AGENT_TOOL_LABELS = {
|
|
769
|
-
find_doctors: 'Found Doctors',
|
|
770
|
-
check_doctor_availability: 'Checked Doctor Availability',
|
|
771
|
-
list_visit_types: 'Listed Visit Types',
|
|
772
|
-
search_patients: 'Searched Patients',
|
|
773
|
-
search_practice_faq: 'Searched Practice FAQ',
|
|
774
|
-
book_existing_appointment: 'Booked Appointment',
|
|
775
|
-
register_and_book_appointment: 'Registered & Booked Appointment',
|
|
776
|
-
submit_medication_refill: 'Submitted Medication Refill',
|
|
777
|
-
};
|
|
778
|
-
function looksLikeToolKey(value) {
|
|
779
|
-
return /^[a-z][a-z0-9_]*$/.test(value.trim());
|
|
780
|
-
}
|
|
781
|
-
function humanizeToolKey(key) {
|
|
782
|
-
return key
|
|
783
|
-
.replace(/^tool_/, '')
|
|
784
|
-
.split('_')
|
|
785
|
-
.filter(Boolean)
|
|
786
|
-
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
787
|
-
.join(' ');
|
|
788
|
-
}
|
|
789
|
-
/** Prefer API `name`; fall back to catalog label or a readable key. */
|
|
790
|
-
function resolveToolDisplayName(key, name) {
|
|
791
|
-
const trimmed = name?.trim() ?? '';
|
|
792
|
-
if (trimmed && !looksLikeToolKey(trimmed))
|
|
793
|
-
return trimmed;
|
|
794
|
-
const lookupKey = key?.trim() || (looksLikeToolKey(trimmed) ? trimmed : '');
|
|
795
|
-
if (lookupKey && AGENT_TOOL_LABELS[lookupKey])
|
|
796
|
-
return AGENT_TOOL_LABELS[lookupKey];
|
|
797
|
-
if (lookupKey)
|
|
798
|
-
return humanizeToolKey(lookupKey);
|
|
799
|
-
return trimmed || 'Tool activity';
|
|
800
|
-
}
|
|
801
|
-
/** Derive tool key from legacy `tech` values like `tool_check_doctor_availability`. */
|
|
802
|
-
function inferToolKeyFromTech(tech) {
|
|
803
|
-
const trimmed = tech?.trim();
|
|
804
|
-
if (!trimmed)
|
|
805
|
-
return undefined;
|
|
806
|
-
if (trimmed.startsWith('tool_'))
|
|
807
|
-
return trimmed.slice(5);
|
|
808
|
-
if (looksLikeToolKey(trimmed))
|
|
809
|
-
return trimmed;
|
|
810
|
-
return undefined;
|
|
811
|
-
}
|
|
812
|
-
function resolveToolKey(key, name, tech) {
|
|
813
|
-
const explicit = key?.trim();
|
|
814
|
-
if (explicit)
|
|
815
|
-
return explicit;
|
|
816
|
-
if (looksLikeToolKey(name))
|
|
817
|
-
return name.trim();
|
|
818
|
-
return inferToolKeyFromTech(tech);
|
|
819
|
-
}
|
|
820
|
-
/** Stable @for track key — avoid ?? in template track expressions (Angular compiler bug). */
|
|
821
|
-
function toolEventTrackKey(tool, index) {
|
|
822
|
-
return `${tool.key ?? ''}|${tool.t}|${tool.tech}|${tool.name}|${index}`;
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
const TONE_COLORS = {
|
|
826
|
-
brand: '#3681F4',
|
|
827
|
-
pos: '#0ABF52',
|
|
828
|
-
notice: '#FFB900',
|
|
829
|
-
neg: '#F03740',
|
|
830
|
-
violet: '#8E51FF',
|
|
831
|
-
gray: '#71717A',
|
|
832
|
-
};
|
|
833
|
-
const DAY_LABELS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
|
|
834
|
-
function parseDurToSeconds(dur) {
|
|
835
|
-
if (!dur)
|
|
836
|
-
return 0;
|
|
837
|
-
const parts = dur.split(':').map((p) => Number(p.trim()));
|
|
838
|
-
if (parts.some((n) => !Number.isFinite(n)))
|
|
839
|
-
return 0;
|
|
840
|
-
if (parts.length === 2)
|
|
841
|
-
return parts[0] * 60 + parts[1];
|
|
842
|
-
if (parts.length === 3)
|
|
843
|
-
return parts[0] * 3600 + parts[1] * 60 + parts[2];
|
|
844
|
-
return 0;
|
|
845
|
-
}
|
|
846
|
-
function parsePercent(value) {
|
|
847
|
-
const n = Number(String(value).replace('%', '').trim());
|
|
848
|
-
return Number.isFinite(n) ? n : 0;
|
|
849
|
-
}
|
|
850
|
-
function normalizeConfidence(value) {
|
|
851
|
-
if (value <= 1)
|
|
852
|
-
return Math.round(value * 100);
|
|
853
|
-
return Math.round(value);
|
|
854
|
-
}
|
|
855
|
-
function mapVerification(raw) {
|
|
856
|
-
const v = raw?.toLowerCase();
|
|
857
|
-
if (v === 'verified' || v === 'partial' || v === 'failed' || v === 'unknown')
|
|
858
|
-
return v;
|
|
859
|
-
return 'unknown';
|
|
860
|
-
}
|
|
861
|
-
function mapCallStatus(raw) {
|
|
862
|
-
const s = String(raw ?? 'ai').toLowerCase().replace(/_/g, '-');
|
|
863
|
-
const allowed = [
|
|
864
|
-
'ai',
|
|
865
|
-
'needs-help',
|
|
866
|
-
'human-requested',
|
|
867
|
-
'urgent',
|
|
868
|
-
'takeover',
|
|
869
|
-
'transferring',
|
|
870
|
-
];
|
|
871
|
-
return allowed.includes(s) ? s : 'ai';
|
|
872
|
-
}
|
|
873
|
-
function mapControlMode(raw, status, aiPaused) {
|
|
874
|
-
const mode = String(raw ?? '').toLowerCase().replace(/_/g, '-');
|
|
875
|
-
if (mode === 'ai' || mode === 'takeover' || mode === 'listen' || mode === 'paused') {
|
|
876
|
-
return mode;
|
|
877
|
-
}
|
|
878
|
-
if (aiPaused === true)
|
|
879
|
-
return 'paused';
|
|
880
|
-
const st = String(status ?? '').toLowerCase().replace(/_/g, '-');
|
|
881
|
-
if (st === 'takeover')
|
|
882
|
-
return 'takeover';
|
|
883
|
-
if (st === 'paused' || st === 'pause')
|
|
884
|
-
return 'paused';
|
|
885
|
-
if (st === 'listen' || st === 'listening')
|
|
886
|
-
return 'listen';
|
|
887
|
-
return 'ai';
|
|
888
|
-
}
|
|
889
|
-
function mapSentiment(raw) {
|
|
890
|
-
const s = String(raw ?? 'neutral').toLowerCase();
|
|
891
|
-
if (s === 'calm' || s === 'neutral' || s === 'frustrated' || s === 'urgent')
|
|
892
|
-
return s;
|
|
893
|
-
return 'neutral';
|
|
894
|
-
}
|
|
895
|
-
function mapTranscriptLine(line) {
|
|
896
|
-
return {
|
|
897
|
-
who: line.who,
|
|
898
|
-
text: line.text,
|
|
899
|
-
flag: line.flag,
|
|
900
|
-
at: line.at ?? line.offsetSeconds ?? line.startTime,
|
|
901
|
-
};
|
|
902
|
-
}
|
|
903
|
-
function mapToolEvent(tool) {
|
|
904
|
-
const state = tool.state;
|
|
905
|
-
const key = resolveToolKey(tool.key, tool.name, tool.tech);
|
|
906
|
-
return {
|
|
907
|
-
t: tool.t,
|
|
908
|
-
key,
|
|
909
|
-
name: resolveToolDisplayName(key, tool.name),
|
|
910
|
-
tech: tool.tech,
|
|
911
|
-
result: tool.result,
|
|
912
|
-
state: ['ok', 'warn', 'error', 'active'].includes(state) ? state : 'ok',
|
|
913
|
-
};
|
|
914
|
-
}
|
|
915
|
-
function normalizeRecordingStatus(status, url) {
|
|
916
|
-
const known = ['ready', 'pending', 'unavailable', 'failed'];
|
|
917
|
-
if (status && known.includes(status)) {
|
|
918
|
-
return status;
|
|
919
|
-
}
|
|
920
|
-
return url ? 'ready' : 'unavailable';
|
|
921
|
-
}
|
|
922
|
-
function mapRecordingMeta(dto) {
|
|
923
|
-
return {
|
|
924
|
-
callId: dto.callId,
|
|
925
|
-
status: normalizeRecordingStatus(dto.status, dto.url),
|
|
926
|
-
url: dto.url ?? null,
|
|
927
|
-
contentType: dto.contentType,
|
|
928
|
-
durationSeconds: dto.durationSeconds,
|
|
929
|
-
message: dto.message,
|
|
930
|
-
};
|
|
931
|
-
}
|
|
932
|
-
function mapLiveCallDto(dto) {
|
|
933
|
-
const dobRaw = String(dto.dob ?? dto.dateOfBirth ?? '').trim();
|
|
934
|
-
const dob = dobRaw ? dobRaw.slice(0, 10) : undefined;
|
|
935
|
-
const ageNum = typeof dto.age === 'number'
|
|
936
|
-
? dto.age
|
|
937
|
-
: dto.age != null && String(dto.age).trim()
|
|
938
|
-
? Number(dto.age)
|
|
939
|
-
: null;
|
|
940
|
-
const age = ageNum != null && Number.isFinite(ageNum) ? ageNum : ageFromDob(dob);
|
|
941
|
-
const gender = String(dto.gender ?? dto.sex ?? '').trim() || null;
|
|
942
|
-
return {
|
|
943
|
-
id: dto.id,
|
|
944
|
-
name: dto.name,
|
|
945
|
-
initials: dto.initials || (dto.matched ? '' : '?'),
|
|
946
|
-
avatar: dto.avatar,
|
|
947
|
-
phone: dto.phone,
|
|
948
|
-
verification: mapVerification(dto.verification),
|
|
949
|
-
direction: dto.direction,
|
|
950
|
-
reason: dto.reason,
|
|
951
|
-
status: mapCallStatus(dto.status),
|
|
952
|
-
started: dto.started,
|
|
953
|
-
sentiment: mapSentiment(dto.sentiment),
|
|
954
|
-
confidence: normalizeConfidence(dto.confidence),
|
|
955
|
-
goal: dto.goal,
|
|
956
|
-
dob,
|
|
957
|
-
age,
|
|
958
|
-
gender,
|
|
959
|
-
location: dto.location ?? '',
|
|
960
|
-
provider: dto.provider,
|
|
961
|
-
language: dto.language,
|
|
962
|
-
matched: dto.matched,
|
|
963
|
-
assigned: dto.assigned,
|
|
964
|
-
controlMode: mapControlMode(dto.controlMode, dto.status, dto.aiPaused),
|
|
965
|
-
tools: (dto.tools ?? []).map(mapToolEvent),
|
|
966
|
-
transcript: (dto.transcript ?? []).map(mapTranscriptLine),
|
|
967
|
-
aiPaused: dto.aiPaused === true || String(dto.controlMode ?? '').toLowerCase() === 'paused',
|
|
968
|
-
aiHandedOff: dto.aiHandedOff === true,
|
|
969
|
-
};
|
|
970
|
-
}
|
|
971
|
-
function mapHistoryCallDto(dto) {
|
|
972
|
-
const parsedStarted = Date.parse(dto.startedAt ?? dto.when);
|
|
973
|
-
const dobRaw = String(dto.dob ?? dto.dateOfBirth ?? '').trim();
|
|
974
|
-
const ageNum = typeof dto.age === 'number'
|
|
975
|
-
? dto.age
|
|
976
|
-
: dto.age != null && String(dto.age).trim()
|
|
977
|
-
? Number(dto.age)
|
|
978
|
-
: null;
|
|
979
|
-
const gender = String(dto.gender ?? dto.sex ?? '').trim() || null;
|
|
980
|
-
const handledRaw = String(dto.handledBy ?? dto.handler ?? '').trim().toLowerCase();
|
|
981
|
-
let handledBy;
|
|
982
|
-
if (handledRaw === 'staff' || handledRaw === 'human' || handledRaw === 'user') {
|
|
983
|
-
handledBy = 'staff';
|
|
984
|
-
}
|
|
985
|
-
else if (handledRaw === 'ai' || handledRaw === 'agent' || handledRaw === 'ava') {
|
|
986
|
-
handledBy = 'ai';
|
|
987
|
-
}
|
|
988
|
-
else if (String(dto.outcome ?? '').toLowerCase().includes('transfer')) {
|
|
989
|
-
handledBy = 'staff';
|
|
990
|
-
}
|
|
991
|
-
else {
|
|
992
|
-
handledBy = 'ai';
|
|
993
|
-
}
|
|
994
|
-
return {
|
|
995
|
-
id: dto.id,
|
|
996
|
-
name: dto.name,
|
|
997
|
-
initials: dto.initials || '?',
|
|
998
|
-
phone: dto.phone,
|
|
999
|
-
direction: dto.dir,
|
|
1000
|
-
outcome: dto.outcome,
|
|
1001
|
-
resolution: dto.resolution ?? null,
|
|
1002
|
-
reason: dto.reason,
|
|
1003
|
-
duration: parseDurToSeconds(dto.dur),
|
|
1004
|
-
durationLabel: dto.dur,
|
|
1005
|
-
started: Number.isFinite(parsedStarted) ? parsedStarted : 0,
|
|
1006
|
-
whenLabel: Number.isFinite(parsedStarted) ? undefined : dto.when,
|
|
1007
|
-
location: dto.location,
|
|
1008
|
-
verification: mapVerification(dto.verify),
|
|
1009
|
-
review: dto.review === 'reviewed' ? 'reviewed' : 'needs',
|
|
1010
|
-
handledBy,
|
|
1011
|
-
dob: dobRaw ? dobRaw.slice(0, 10) : null,
|
|
1012
|
-
age: ageNum != null && Number.isFinite(ageNum) ? ageNum : null,
|
|
1013
|
-
gender,
|
|
1014
|
-
results: Array.isArray(dto.actions)
|
|
1015
|
-
? dto.actions.map((a) => String(a).trim()).filter(Boolean)
|
|
1016
|
-
: [],
|
|
1017
|
-
risk: dto.risk ?? null,
|
|
1018
|
-
};
|
|
1019
|
-
}
|
|
1020
|
-
function mapHistoryDetailDto(call, detail, recordingUrl) {
|
|
1021
|
-
const base = mapHistoryCallDto(call);
|
|
1022
|
-
return {
|
|
1023
|
-
...base,
|
|
1024
|
-
summary: detail.summary,
|
|
1025
|
-
transcript: (detail.transcript ?? []).map(mapTranscriptLine),
|
|
1026
|
-
tools: (detail.tools ?? []).map(mapToolEvent),
|
|
1027
|
-
recordingUrl: recordingUrl ?? undefined,
|
|
1028
|
-
};
|
|
1029
|
-
}
|
|
1030
|
-
function mapAttentionItemDto(dto) {
|
|
1031
|
-
return {
|
|
1032
|
-
id: dto.id,
|
|
1033
|
-
callId: dto.id,
|
|
1034
|
-
title: dto.name,
|
|
1035
|
-
detail: dto.why || dto.reason,
|
|
1036
|
-
severity: dto.sev === 'urgent' ? 'urgent' : 'warn',
|
|
1037
|
-
time: Date.now(),
|
|
1038
|
-
timeLabel: dto.time,
|
|
1039
|
-
};
|
|
1040
|
-
}
|
|
1041
|
-
function mapDashboardSummaryDto(dto) {
|
|
1042
|
-
return {
|
|
1043
|
-
activeCalls: dto.liveCalls,
|
|
1044
|
-
answeredToday: dto.callsToday,
|
|
1045
|
-
appointmentsBooked: dto.appointmentsBooked ?? 0,
|
|
1046
|
-
tasksCreated: dto.openTasks,
|
|
1047
|
-
completionRate: parsePercent(dto.aiHandledRate),
|
|
1048
|
-
};
|
|
1049
|
-
}
|
|
1050
|
-
function mapAiCreatedAppointmentDto(dto) {
|
|
1051
|
-
return {
|
|
1052
|
-
id: dto.id,
|
|
1053
|
-
appointmentId: dto.appointmentId ?? dto.id,
|
|
1054
|
-
patientName: dto.patientName || 'Unknown patient',
|
|
1055
|
-
providerName: dto.providerName ?? null,
|
|
1056
|
-
startTime: Date.parse(dto.startTime) || 0,
|
|
1057
|
-
createdAt: Date.parse(dto.createdAt) || 0,
|
|
1058
|
-
callId: dto.callId ?? null,
|
|
1059
|
-
status: dto.status ?? null,
|
|
1060
|
-
};
|
|
1061
|
-
}
|
|
1062
|
-
function mapTaskDto(dto) {
|
|
1063
|
-
let status = 'open';
|
|
1064
|
-
if (dto.status === 'done')
|
|
1065
|
-
status = 'done';
|
|
1066
|
-
else if (dto.status === 'in-progress')
|
|
1067
|
-
status = 'in_progress';
|
|
1068
|
-
return {
|
|
1069
|
-
id: dto.id,
|
|
1070
|
-
created: dto.created ? Date.parse(dto.created) || Date.now() : Date.now(),
|
|
1071
|
-
title: dto.title || dto.type || 'Task',
|
|
1072
|
-
type: dto.type || 'Other',
|
|
1073
|
-
description: dto.summary ?? '',
|
|
1074
|
-
patient: dto.patient || '—',
|
|
1075
|
-
priority: dto.priority ?? 'normal',
|
|
1076
|
-
status,
|
|
1077
|
-
source: dto.source ?? 'voice',
|
|
1078
|
-
assignee: dto.assignee || '—',
|
|
1079
|
-
callId: dto.call || undefined,
|
|
1080
|
-
edvakTaskId: dto.edvakTaskId,
|
|
1081
|
-
edvakStatus: dto.edvakStatus,
|
|
1082
|
-
medicationName: dto.medicationName,
|
|
1083
|
-
medicationId: dto.medicationId,
|
|
1084
|
-
};
|
|
1085
|
-
}
|
|
1086
|
-
function toApiTaskStatus(status) {
|
|
1087
|
-
if (status === 'done')
|
|
1088
|
-
return 'done';
|
|
1089
|
-
if (status === 'in_progress')
|
|
1090
|
-
return 'in-progress';
|
|
1091
|
-
return 'open';
|
|
1092
|
-
}
|
|
1093
|
-
function mapCreateTaskRequest(req) {
|
|
1094
|
-
return {
|
|
1095
|
-
title: req.title.trim(),
|
|
1096
|
-
type: req.type,
|
|
1097
|
-
call: req.callId,
|
|
1098
|
-
summary: req.description?.trim() || undefined,
|
|
1099
|
-
patient: req.patient?.trim() || undefined,
|
|
1100
|
-
priority: req.priority,
|
|
1101
|
-
assignee: req.assignee?.trim() || undefined,
|
|
1102
|
-
};
|
|
1103
|
-
}
|
|
1104
|
-
function mapRegenerateSummaryResponse(dto) {
|
|
1105
|
-
return {
|
|
1106
|
-
callId: dto.callId,
|
|
1107
|
-
summary: dto.summary,
|
|
1108
|
-
summaryModel: dto.summaryModel,
|
|
1109
|
-
summaryGeneratedAt: dto.summaryGeneratedAt,
|
|
1110
|
-
transcriptTurnCount: dto.transcriptTurnCount,
|
|
1111
|
-
};
|
|
1112
|
-
}
|
|
1113
|
-
function mapAuditEventDto(dto, index) {
|
|
1114
|
-
return {
|
|
1115
|
-
id: `${dto.ts}-${index}`,
|
|
1116
|
-
actor: dto.actorName || dto.actor,
|
|
1117
|
-
action: dto.event,
|
|
1118
|
-
target: dto.call || dto.patient || dto.cat,
|
|
1119
|
-
detail: dto.detail,
|
|
1120
|
-
at: dto.ts ? Date.parse(dto.ts) || Date.now() : Date.now(),
|
|
1121
|
-
};
|
|
1122
|
-
}
|
|
1123
|
-
function mapAnalyticsDto(dto, range) {
|
|
1124
|
-
const volume = mapVolumeSeries(dto.volume);
|
|
1125
|
-
const peakHours = mapPeakSeries(dto.peak);
|
|
1126
|
-
const outcomes = (dto.outcomes ?? []).map((o) => ({
|
|
1127
|
-
label: o.label,
|
|
1128
|
-
value: o.v,
|
|
1129
|
-
color: TONE_COLORS[o.tone] ?? TONE_COLORS['brand'],
|
|
1130
|
-
}));
|
|
1131
|
-
const reasons = (dto.reasons ?? []).map((r) => ({ label: r.label, value: r.v }));
|
|
1132
|
-
const transfers = (dto.transfers ?? []).map((t) => ({ label: t.label, value: t.v }));
|
|
1133
|
-
const kpiCards = (dto.kpis ?? []).map((k) => ({
|
|
1134
|
-
label: k.label,
|
|
1135
|
-
value: k.value,
|
|
1136
|
-
delta: k.delta,
|
|
1137
|
-
tone: k.tone,
|
|
1138
|
-
sub: k.sub,
|
|
1139
|
-
}));
|
|
1140
|
-
const kpiMap = {};
|
|
1141
|
-
for (const k of dto.kpis ?? []) {
|
|
1142
|
-
const key = k.label.toLowerCase();
|
|
1143
|
-
const num = parseAnalyticsNumber(k.value);
|
|
1144
|
-
if (key.includes('handled') || key.includes('total call') || key === 'calls') {
|
|
1145
|
-
kpiMap['totalCalls'] = num;
|
|
1146
|
-
}
|
|
1147
|
-
else if (key.includes('handle time') || key.includes('avg duration') || key.includes('duration')) {
|
|
1148
|
-
kpiMap['avgDuration'] = parseDurationSeconds(k.value);
|
|
1149
|
-
}
|
|
1150
|
-
else if (key.includes('resolution') || key.includes('booking')) {
|
|
1151
|
-
kpiMap['bookingRate'] = num;
|
|
1152
|
-
}
|
|
1153
|
-
else if (key.includes('transfer')) {
|
|
1154
|
-
kpiMap['transferRate'] = num;
|
|
1155
|
-
}
|
|
1156
|
-
}
|
|
1157
|
-
return {
|
|
1158
|
-
range,
|
|
1159
|
-
kpiCards,
|
|
1160
|
-
volume,
|
|
1161
|
-
outcomes,
|
|
1162
|
-
reasons,
|
|
1163
|
-
transfers,
|
|
1164
|
-
peakHours,
|
|
1165
|
-
kpis: {
|
|
1166
|
-
totalCalls: kpiMap['totalCalls'] ?? 0,
|
|
1167
|
-
avgDuration: kpiMap['avgDuration'] ?? 0,
|
|
1168
|
-
bookingRate: kpiMap['bookingRate'] ?? 0,
|
|
1169
|
-
transferRate: kpiMap['transferRate'] ?? 0,
|
|
1170
|
-
},
|
|
1171
|
-
};
|
|
1172
|
-
}
|
|
1173
|
-
function parseAnalyticsNumber(value) {
|
|
1174
|
-
const cleaned = String(value).replace(/[^\d.]/g, '');
|
|
1175
|
-
const num = Number(cleaned);
|
|
1176
|
-
return Number.isFinite(num) ? num : 0;
|
|
1177
|
-
}
|
|
1178
|
-
function parseDurationSeconds(value) {
|
|
1179
|
-
const trimmed = value.trim();
|
|
1180
|
-
const clock = /^(\d+):(\d{2})$/.exec(trimmed);
|
|
1181
|
-
if (clock) {
|
|
1182
|
-
return Number(clock[1]) * 60 + Number(clock[2]);
|
|
1183
|
-
}
|
|
1184
|
-
return parseAnalyticsNumber(trimmed);
|
|
1185
|
-
}
|
|
1186
|
-
function isVolumeSeriesDto(raw) {
|
|
1187
|
-
return !!raw && typeof raw === 'object' && !Array.isArray(raw) && 'points' in raw;
|
|
1188
|
-
}
|
|
1189
|
-
function isPeakSeriesDto(raw) {
|
|
1190
|
-
return !!raw && typeof raw === 'object' && !Array.isArray(raw) && 'points' in raw;
|
|
1191
|
-
}
|
|
1192
|
-
function formatLegacyHourLabel(hour) {
|
|
1193
|
-
if (hour === 0)
|
|
1194
|
-
return '12 AM';
|
|
1195
|
-
if (hour < 12)
|
|
1196
|
-
return `${hour} AM`;
|
|
1197
|
-
if (hour === 12)
|
|
1198
|
-
return '12 PM';
|
|
1199
|
-
return `${hour - 12} PM`;
|
|
1200
|
-
}
|
|
1201
|
-
function mapVolumeSeries(raw) {
|
|
1202
|
-
if (isVolumeSeriesDto(raw)) {
|
|
1203
|
-
return {
|
|
1204
|
-
timezone: raw.timezone ?? 'UTC',
|
|
1205
|
-
startDate: raw.startDate ?? '',
|
|
1206
|
-
endDate: raw.endDate ?? '',
|
|
1207
|
-
points: (raw.points ?? []).map((p) => ({
|
|
1208
|
-
date: p.date,
|
|
1209
|
-
day: p.day,
|
|
1210
|
-
label: p.label,
|
|
1211
|
-
count: p.count,
|
|
1212
|
-
inbound: p.inbound,
|
|
1213
|
-
outbound: p.outbound,
|
|
1214
|
-
})),
|
|
1215
|
-
};
|
|
1216
|
-
}
|
|
1217
|
-
const values = Array.isArray(raw) ? raw : [];
|
|
1218
|
-
return {
|
|
1219
|
-
timezone: 'UTC',
|
|
1220
|
-
startDate: '',
|
|
1221
|
-
endDate: '',
|
|
1222
|
-
points: values.map((count, i) => ({
|
|
1223
|
-
date: '',
|
|
1224
|
-
day: DAY_LABELS[i % DAY_LABELS.length] ?? `D${i + 1}`,
|
|
1225
|
-
label: DAY_LABELS[i % DAY_LABELS.length] ?? `Day ${i + 1}`,
|
|
1226
|
-
count,
|
|
1227
|
-
})),
|
|
1228
|
-
};
|
|
1229
|
-
}
|
|
1230
|
-
function mapPeakSeries(raw) {
|
|
1231
|
-
if (isPeakSeriesDto(raw)) {
|
|
1232
|
-
return {
|
|
1233
|
-
timezone: raw.timezone ?? 'UTC',
|
|
1234
|
-
points: (raw.points ?? []).map((p) => ({
|
|
1235
|
-
hour: p.hour,
|
|
1236
|
-
label: p.label,
|
|
1237
|
-
count: p.count,
|
|
1238
|
-
})),
|
|
1239
|
-
};
|
|
1240
|
-
}
|
|
1241
|
-
const values = Array.isArray(raw) ? raw : [];
|
|
1242
|
-
return {
|
|
1243
|
-
timezone: 'UTC',
|
|
1244
|
-
points: values.map((count, hour) => ({
|
|
1245
|
-
hour,
|
|
1246
|
-
label: formatLegacyHourLabel(hour),
|
|
1247
|
-
count,
|
|
1248
|
-
})),
|
|
1249
|
-
};
|
|
1250
|
-
}
|
|
1251
|
-
function mapStatusDto(dto) {
|
|
1252
|
-
const online = dto.agentOnline ?? dto.activated ?? false;
|
|
1253
|
-
const step = dto.setupStep ?? (dto.activated ? 11 : 0);
|
|
1254
|
-
return {
|
|
1255
|
-
agentOn: online,
|
|
1256
|
-
mode: 'live',
|
|
1257
|
-
readiness: Math.min(100, Math.round((step / 11) * 100)),
|
|
1258
|
-
};
|
|
1259
|
-
}
|
|
1260
|
-
function mapSetupDto(dto) {
|
|
1261
|
-
const stepCount = 11;
|
|
1262
|
-
const steps = Array.from({ length: stepCount }, (_, i) => ({
|
|
1263
|
-
id: i + 1,
|
|
1264
|
-
title: `Setup step ${i + 1}`,
|
|
1265
|
-
description: dto.activated ? 'Complete' : i + 1 < dto.step ? 'Complete' : 'Pending',
|
|
1266
|
-
complete: dto.activated || i + 1 < dto.step,
|
|
1267
|
-
}));
|
|
1268
|
-
return {
|
|
1269
|
-
readiness: Math.min(100, Math.round((dto.step / stepCount) * 100)),
|
|
1270
|
-
steps,
|
|
1271
|
-
testTranscript: [],
|
|
1272
|
-
};
|
|
1273
|
-
}
|
|
1274
|
-
function mapSettingsResponse(body, safetyBody) {
|
|
1275
|
-
const raw = body;
|
|
1276
|
-
const settings = raw?.settings ?? body ?? {};
|
|
1277
|
-
const section = (key) => {
|
|
1278
|
-
const val = settings[key];
|
|
1279
|
-
if (val && typeof val === 'object' && !Array.isArray(val)) {
|
|
1280
|
-
return val;
|
|
1281
|
-
}
|
|
1282
|
-
return {};
|
|
1283
|
-
};
|
|
1284
|
-
const safetyRaw = safetyBody;
|
|
1285
|
-
const safety = (safetyRaw?.checks ?? []).map((c) => ({
|
|
1286
|
-
id: c.id,
|
|
1287
|
-
label: c.label ?? humanizeSettingsKey(c.id),
|
|
1288
|
-
status: c.ok ? 'ok' : 'warn',
|
|
1289
|
-
}));
|
|
1290
|
-
const mapped = {
|
|
1291
|
-
general: normalizeGeneralSection(section('general')),
|
|
1292
|
-
phone: normalizePhoneSection(section('phoneAvailability')),
|
|
1293
|
-
tasks: section('allowedTasks'),
|
|
1294
|
-
scheduling: section('schedulingRules'),
|
|
1295
|
-
refill: section('refillRules'),
|
|
1296
|
-
verify: section('patientVerification'),
|
|
1297
|
-
escalation: section('humanEscalation'),
|
|
1298
|
-
outbound: section('outboundCalling'),
|
|
1299
|
-
knowledge: normalizeKnowledgeSection(section('knowledgeBase')),
|
|
1300
|
-
safety,
|
|
1301
|
-
transcripts: normalizeTranscriptsSection(section('transcriptsRecording')),
|
|
1302
|
-
advanced: normalizeAdvancedSection(section('advanced')),
|
|
1303
|
-
};
|
|
1304
|
-
mapped.effectiveWelcomeMessage =
|
|
1305
|
-
raw.effectiveWelcomeMessage ?? computeEffectiveWelcomeMessage(mapped);
|
|
1306
|
-
const root = body;
|
|
1307
|
-
mapped.effectiveVoiceSystemPrompt = String(root['effectiveVoiceSystemPrompt'] ??
|
|
1308
|
-
root['effective_voice_system_prompt'] ??
|
|
1309
|
-
mapped.advanced['voiceSystemPrompt'] ??
|
|
1310
|
-
'');
|
|
1311
|
-
const usingDefaultRaw = root['usingDefaultVoiceSystemPrompt'] ?? root['using_default_voice_system_prompt'];
|
|
1312
|
-
mapped.usingDefaultVoiceSystemPrompt =
|
|
1313
|
-
typeof usingDefaultRaw === 'boolean'
|
|
1314
|
-
? usingDefaultRaw
|
|
1315
|
-
: !String(mapped.advanced['voiceSystemPrompt'] ?? '').trim();
|
|
1316
|
-
if (!mapped.knowledge) {
|
|
1317
|
-
mapped.knowledge = { whatToSay: '', whatNotToSay: '' };
|
|
1318
|
-
}
|
|
1319
|
-
return mapped;
|
|
1320
|
-
}
|
|
1321
|
-
function normalizeAdvancedSection(raw) {
|
|
1322
|
-
return {
|
|
1323
|
-
...raw,
|
|
1324
|
-
voiceSystemPrompt: String(raw['voiceSystemPrompt'] ?? raw['voice_system_prompt'] ?? ''),
|
|
1325
|
-
customVoiceInstructions: String(raw['customVoiceInstructions'] ?? raw['custom_voice_instructions'] ?? ''),
|
|
1326
|
-
};
|
|
1327
|
-
}
|
|
1328
|
-
function normalizeKnowledgeSection(raw) {
|
|
1329
|
-
return {
|
|
1330
|
-
...raw,
|
|
1331
|
-
whatToSay: String(raw['whatToSay'] ?? raw['what_to_say'] ?? ''),
|
|
1332
|
-
whatNotToSay: String(raw['whatNotToSay'] ?? raw['what_not_to_say'] ?? ''),
|
|
1333
|
-
};
|
|
1334
|
-
}
|
|
1335
|
-
function normalizeGeneralSection(raw) {
|
|
1336
|
-
const language = String(raw['language'] ?? 'English');
|
|
1337
|
-
const languagesRaw = raw['languages'] ?? raw['languageList'] ?? language;
|
|
1338
|
-
const languages = Array.isArray(languagesRaw)
|
|
1339
|
-
? languagesRaw.map(String).join(',')
|
|
1340
|
-
: String(languagesRaw || language);
|
|
1341
|
-
return {
|
|
1342
|
-
...raw,
|
|
1343
|
-
languages,
|
|
1344
|
-
tone: String(raw['tone'] ?? 'professional'),
|
|
1345
|
-
};
|
|
1346
|
-
}
|
|
1347
|
-
function normalizePhoneSection(raw) {
|
|
1348
|
-
const locationIds = raw['locationIds'] ?? raw['location_ids'] ?? raw['locationsHandled'] ?? '';
|
|
1349
|
-
const locations = Array.isArray(locationIds) ? locationIds.map(String).join(',') : String(locationIds ?? '');
|
|
1350
|
-
const afterHoursBehavior = String(raw['afterHoursBehavior'] ??
|
|
1351
|
-
raw['after_hours_behavior'] ??
|
|
1352
|
-
(raw['afterHours'] === false ? 'voicemail' : 'ai_answers'));
|
|
1353
|
-
return {
|
|
1354
|
-
...raw,
|
|
1355
|
-
answerMode: String(raw['answerMode'] ?? raw['answer_mode'] ?? 'always_first'),
|
|
1356
|
-
transferNumber: String(raw['transferNumber'] ?? raw['transfer_number'] ?? ''),
|
|
1357
|
-
ringTimeout: Number(raw['ringTimeout'] ?? raw['ring_timeout'] ?? 20) || 20,
|
|
1358
|
-
createFollowUpTask: Boolean(raw['createFollowUpTask'] ?? raw['create_follow_up_task'] ?? false),
|
|
1359
|
-
locationIds: locations,
|
|
1360
|
-
maxCallDurationMin: Number(raw['maxCallDurationMin'] ?? raw['max_call_duration_min'] ?? 5) || 5,
|
|
1361
|
-
silenceTimeoutSec: Number(raw['silenceTimeoutSec'] ?? raw['silence_timeout_sec'] ?? 30) || 30,
|
|
1362
|
-
afterHoursBehavior,
|
|
1363
|
-
};
|
|
1364
|
-
}
|
|
1365
|
-
function normalizeTranscriptsSection(raw) {
|
|
1366
|
-
const legacyRetain = Number(raw['retainDays'] ?? raw['retain_days'] ?? 30) || 30;
|
|
1367
|
-
return {
|
|
1368
|
-
...raw,
|
|
1369
|
-
recordingRetainDays: Number(raw['recordingRetainDays'] ?? raw['recording_retain_days'] ?? legacyRetain) ||
|
|
1370
|
-
legacyRetain,
|
|
1371
|
-
transcriptRetainDays: Number(raw['transcriptRetainDays'] ?? raw['transcript_retain_days'] ?? legacyRetain) ||
|
|
1372
|
-
legacyRetain,
|
|
1373
|
-
disclosureWarningEnabled: Boolean(raw['disclosureWarningEnabled'] ?? raw['disclosure_warning_enabled'] ?? true),
|
|
1374
|
-
disclosureWarningText: String(raw['disclosureWarningText'] ??
|
|
1375
|
-
raw['disclosure_warning_text'] ??
|
|
1376
|
-
'This call may be handled by an automated assistant and could be recorded for quality and training. You can ask to speak with a staff member at any time.'),
|
|
1377
|
-
};
|
|
1378
|
-
}
|
|
1379
|
-
function humanizeSettingsKey(key) {
|
|
1380
|
-
return key
|
|
1381
|
-
.replace(/([A-Z])/g, ' $1')
|
|
1382
|
-
.replace(/_/g, ' ')
|
|
1383
|
-
.trim()
|
|
1384
|
-
.replace(/^\w/, (c) => c.toUpperCase());
|
|
1385
|
-
}
|
|
1386
|
-
/** Map frontend AgentSettings → backend PUT body section keys. */
|
|
1387
|
-
function mapSettingsToRequest(settings) {
|
|
1388
|
-
return {
|
|
1389
|
-
general: settings.general,
|
|
1390
|
-
phoneAvailability: settings.phone,
|
|
1391
|
-
allowedTasks: settings.tasks,
|
|
1392
|
-
schedulingRules: settings.scheduling,
|
|
1393
|
-
refillRules: settings.refill,
|
|
1394
|
-
patientVerification: settings.verify,
|
|
1395
|
-
humanEscalation: settings.escalation,
|
|
1396
|
-
outboundCalling: settings.outbound,
|
|
1397
|
-
knowledgeBase: settings.knowledge,
|
|
1398
|
-
transcriptsRecording: settings.transcripts,
|
|
1399
|
-
advanced: settings.advanced,
|
|
1400
|
-
};
|
|
1401
|
-
}
|
|
1402
|
-
function mapLocationDto(raw) {
|
|
1403
|
-
const r = raw;
|
|
1404
|
-
return {
|
|
1405
|
-
id: r.locationId ?? r.id ?? '',
|
|
1406
|
-
name: r.locationName ?? r.name ?? '',
|
|
1407
|
-
};
|
|
1408
|
-
}
|
|
1409
|
-
function mapProviderDto(raw) {
|
|
1410
|
-
const r = raw;
|
|
1411
|
-
return {
|
|
1412
|
-
id: r.providerId ?? r.id ?? '',
|
|
1413
|
-
name: r.fullName ?? r.name ?? '',
|
|
1414
|
-
};
|
|
1415
|
-
}
|
|
1416
|
-
function asTranscriptList(body) {
|
|
1417
|
-
if (Array.isArray(body))
|
|
1418
|
-
return body;
|
|
1419
|
-
if (!body || typeof body !== 'object')
|
|
1420
|
-
return [];
|
|
1421
|
-
const o = body;
|
|
1422
|
-
const list = o['lines'] ?? o['transcript'] ?? o['items'] ?? o['data'];
|
|
1423
|
-
return Array.isArray(list) ? list : [];
|
|
1424
|
-
}
|
|
1425
|
-
function isHistoryCallDto(raw) {
|
|
1426
|
-
return !!raw && typeof raw === 'object' && 'dir' in raw;
|
|
1427
|
-
}
|
|
1428
|
-
function asHistoryList(body) {
|
|
1429
|
-
if (Array.isArray(body))
|
|
1430
|
-
return body;
|
|
1431
|
-
const list = body;
|
|
1432
|
-
return list?.items ?? [];
|
|
1433
|
-
}
|
|
1434
|
-
function asLiveCallList(body) {
|
|
1435
|
-
if (Array.isArray(body))
|
|
1436
|
-
return body;
|
|
1437
|
-
if (!body || typeof body !== 'object')
|
|
1438
|
-
return [];
|
|
1439
|
-
const o = body;
|
|
1440
|
-
const list = o['items'] ?? o['data'] ?? o['calls'] ?? o['liveCalls'];
|
|
1441
|
-
return Array.isArray(list) ? list : [];
|
|
1442
|
-
}
|
|
1443
|
-
function asTaskList(body) {
|
|
1444
|
-
if (Array.isArray(body))
|
|
1445
|
-
return body;
|
|
1446
|
-
const list = body;
|
|
1447
|
-
return list?.items ?? [];
|
|
1448
|
-
}
|
|
1449
|
-
function asAuditList(body) {
|
|
1450
|
-
if (Array.isArray(body))
|
|
1451
|
-
return body;
|
|
1452
|
-
const list = body;
|
|
1453
|
-
return list?.items ?? [];
|
|
1454
|
-
}
|
|
1455
|
-
function asAttentionList(body) {
|
|
1456
|
-
if (Array.isArray(body))
|
|
1457
|
-
return body;
|
|
1458
|
-
return [];
|
|
1459
|
-
}
|
|
1460
|
-
|
|
1461
|
-
const now$2 = Date.now();
|
|
1462
|
-
function item(partial) {
|
|
1463
|
-
return {
|
|
1464
|
-
callId: 'LC-4821',
|
|
1465
|
-
clientPracticeId: 'practice-demo',
|
|
1466
|
-
method: 'POST',
|
|
1467
|
-
urlPath: '/api/v1/patients/search',
|
|
1468
|
-
statusCode: 200,
|
|
1469
|
-
success: true,
|
|
1470
|
-
durationMs: 340,
|
|
1471
|
-
toolName: null,
|
|
1472
|
-
errorMessage: null,
|
|
1473
|
-
startedAt: new Date(now$2 - 120_000).toISOString(),
|
|
1474
|
-
requestPreview: '{"phone":"+15551234567"}',
|
|
1475
|
-
responsePreview: '{"items":[{"id":"p1"}]}',
|
|
1476
|
-
...partial,
|
|
1477
|
-
};
|
|
1478
|
-
}
|
|
1479
|
-
const SEED_CALL_API_LOGS = {
|
|
1480
|
-
'LC-4821': [
|
|
1481
|
-
item({
|
|
1482
|
-
id: 'log-1',
|
|
1483
|
-
provider: 'vonage',
|
|
1484
|
-
operation: 'answer_call',
|
|
1485
|
-
method: 'POST',
|
|
1486
|
-
urlPath: '/vonage/answer',
|
|
1487
|
-
statusCode: 200,
|
|
1488
|
-
durationMs: 120,
|
|
1489
|
-
startedAt: new Date(now$2 - 300_000).toISOString(),
|
|
1490
|
-
requestPreview: '{"callId":"..."}',
|
|
1491
|
-
responsePreview: '{"status":"connected"}',
|
|
1492
|
-
}),
|
|
1493
|
-
item({
|
|
1494
|
-
id: 'log-2',
|
|
1495
|
-
provider: 'edvak',
|
|
1496
|
-
operation: 'search_patient',
|
|
1497
|
-
toolName: 'search_patient',
|
|
1498
|
-
method: 'GET',
|
|
1499
|
-
urlPath: '/api/v1/patients',
|
|
1500
|
-
statusCode: 200,
|
|
1501
|
-
durationMs: 420,
|
|
1502
|
-
startedAt: new Date(now$2 - 240_000).toISOString(),
|
|
1503
|
-
}),
|
|
1504
|
-
item({
|
|
1505
|
-
id: 'log-3',
|
|
1506
|
-
provider: 'openai',
|
|
1507
|
-
operation: 'chat_completion',
|
|
1508
|
-
method: 'POST',
|
|
1509
|
-
urlPath: '/v1/chat/completions',
|
|
1510
|
-
statusCode: 200,
|
|
1511
|
-
durationMs: 890,
|
|
1512
|
-
startedAt: new Date(now$2 - 180_000).toISOString(),
|
|
1513
|
-
requestPreview: '{"model":"gpt-4o-mini"}',
|
|
1514
|
-
responsePreview: '{"choices":[...]}',
|
|
1515
|
-
}),
|
|
1516
|
-
item({
|
|
1517
|
-
id: 'log-4',
|
|
1518
|
-
provider: 'edvak',
|
|
1519
|
-
operation: 'create_appointment',
|
|
1520
|
-
toolName: 'create_appointment',
|
|
1521
|
-
method: 'POST',
|
|
1522
|
-
urlPath: '/api/appointments',
|
|
1523
|
-
statusCode: 201,
|
|
1524
|
-
durationMs: 560,
|
|
1525
|
-
startedAt: new Date(now$2 - 60_000).toISOString(),
|
|
1526
|
-
}),
|
|
1527
|
-
],
|
|
1528
|
-
'HC-9001': [
|
|
1529
|
-
item({
|
|
1530
|
-
id: 'log-f1',
|
|
1531
|
-
callId: 'HC-9001',
|
|
1532
|
-
provider: 'edvak',
|
|
1533
|
-
operation: 'search_patient',
|
|
1534
|
-
toolName: 'search_patient',
|
|
1535
|
-
statusCode: 500,
|
|
1536
|
-
success: false,
|
|
1537
|
-
durationMs: 2100,
|
|
1538
|
-
errorMessage: 'Internal Server Error',
|
|
1539
|
-
startedAt: new Date(now$2 - 86_400_000).toISOString(),
|
|
1540
|
-
}),
|
|
1541
|
-
],
|
|
1542
|
-
};
|
|
1543
|
-
const SEED_API_LOG_DETAILS = {
|
|
1544
|
-
'log-4': {
|
|
1545
|
-
...SEED_CALL_API_LOGS['LC-4821'][3],
|
|
1546
|
-
traceId: 'trace-abc-123',
|
|
1547
|
-
requestBody: { patientId: 'p1', slotId: 'slot-9', reason: 'Annual checkup' },
|
|
1548
|
-
responseBody: { appointmentId: 'apt-42', status: 'confirmed' },
|
|
1549
|
-
metadata: { practiceId: 'prac-1', locationId: 'loc-1' },
|
|
1550
|
-
completedAt: new Date(now$2 - 59_500).toISOString(),
|
|
1551
|
-
},
|
|
1552
|
-
'log-f1': {
|
|
1553
|
-
...SEED_CALL_API_LOGS['HC-9001'][0],
|
|
1554
|
-
traceId: 'trace-err-999',
|
|
1555
|
-
requestBody: { phone: '+15559876543' },
|
|
1556
|
-
responseBody: { error: 'Internal Server Error', message: 'Database timeout' },
|
|
1557
|
-
metadata: { retryCount: 1 },
|
|
1558
|
-
completedAt: new Date(now$2 - 86_398_000).toISOString(),
|
|
1559
|
-
},
|
|
1560
|
-
};
|
|
1561
|
-
function allSeedLogs() {
|
|
1562
|
-
return Object.values(SEED_CALL_API_LOGS).flat();
|
|
1563
|
-
}
|
|
1564
|
-
const SEED_API_LOG_STATS = {
|
|
1565
|
-
last24h: { total: 128, failed: 4, avgDurationMs: 680 },
|
|
1566
|
-
byProvider: [
|
|
1567
|
-
{ provider: 'edvak', total: 52, failed: 3 },
|
|
1568
|
-
{ provider: 'openai', total: 38, failed: 0 },
|
|
1569
|
-
{ provider: 'vonage', total: 24, failed: 1 },
|
|
1570
|
-
{ provider: 'livekit', total: 14, failed: 0 },
|
|
1571
|
-
],
|
|
1572
|
-
recentFailures: [
|
|
1573
|
-
item({
|
|
1574
|
-
id: 'log-fail-1',
|
|
1575
|
-
callId: 'HC-9001',
|
|
1576
|
-
provider: 'edvak',
|
|
1577
|
-
operation: 'search_patient',
|
|
1578
|
-
statusCode: 500,
|
|
1579
|
-
success: false,
|
|
1580
|
-
durationMs: 2100,
|
|
1581
|
-
errorMessage: 'Internal Server Error',
|
|
1582
|
-
startedAt: new Date(now$2 - 3_600_000).toISOString(),
|
|
1583
|
-
}),
|
|
1584
|
-
item({
|
|
1585
|
-
id: 'log-fail-2',
|
|
1586
|
-
callId: 'LC-4819',
|
|
1587
|
-
provider: 'vonage',
|
|
1588
|
-
operation: 'transfer',
|
|
1589
|
-
statusCode: 503,
|
|
1590
|
-
success: false,
|
|
1591
|
-
durationMs: 1500,
|
|
1592
|
-
errorMessage: 'Service unavailable',
|
|
1593
|
-
startedAt: new Date(now$2 - 7_200_000).toISOString(),
|
|
1594
|
-
}),
|
|
1595
|
-
item({
|
|
1596
|
-
id: 'log-fail-3',
|
|
1597
|
-
callId: null,
|
|
1598
|
-
provider: 'edvak',
|
|
1599
|
-
operation: 'list_providers',
|
|
1600
|
-
statusCode: 500,
|
|
1601
|
-
success: false,
|
|
1602
|
-
durationMs: 980,
|
|
1603
|
-
errorMessage: 'Gateway timeout',
|
|
1604
|
-
startedAt: new Date(now$2 - 10_800_000).toISOString(),
|
|
1605
|
-
}),
|
|
1606
|
-
],
|
|
1607
|
-
};
|
|
1608
|
-
|
|
1609
|
-
const now$1 = Date.now();
|
|
1610
|
-
const min = (m) => now$1 - m * 60_000;
|
|
1611
|
-
const baseTranscript = [
|
|
1612
|
-
{ who: 'system', text: 'Call connected · inbound PSTN' },
|
|
1613
|
-
{
|
|
1614
|
-
who: 'ai',
|
|
1615
|
-
text: 'Good afternoon, thank you for calling Riverside Family Medicine. How can I help you today?',
|
|
1616
|
-
},
|
|
1617
|
-
{ who: 'patient', text: "Hi, I'd like to reschedule my appointment for next Tuesday." },
|
|
1618
|
-
{
|
|
1619
|
-
who: 'ai',
|
|
1620
|
-
text: 'I can help with that. May I verify your date of birth and the name on the account?',
|
|
1621
|
-
flag: 'verify',
|
|
1622
|
-
},
|
|
1623
|
-
{ who: 'patient', text: 'March 14, 1985 — Maria Santos.' },
|
|
1624
|
-
{ who: 'ai', text: 'Thank you, Maria. I found your chart. You have a visit with Dr. Chen on Tuesday at 2:30 PM.' },
|
|
1625
|
-
{ who: 'patient', text: 'Can we move it to Thursday morning instead?' },
|
|
1626
|
-
{ who: 'ai', text: 'Checking availability with scheduling…' },
|
|
1627
|
-
];
|
|
1628
|
-
const streamingLines = [
|
|
1629
|
-
{ who: 'ai', text: 'I have Thursday at 9:15 AM or 10:40 AM with Dr. Chen. Which works better?' },
|
|
1630
|
-
{ who: 'patient', text: '9:15 is perfect.' },
|
|
1631
|
-
{ who: 'ai', text: 'Great — I’ve moved your appointment to Thursday at 9:15 AM. You’ll receive a confirmation text shortly.' },
|
|
1632
|
-
];
|
|
1633
|
-
const SEED_LIVE_CALLS = [
|
|
1634
|
-
{
|
|
1635
|
-
id: 'LC-4821',
|
|
1636
|
-
name: 'Maria Santos',
|
|
1637
|
-
initials: 'MS',
|
|
1638
|
-
avatar: null,
|
|
1639
|
-
phone: '+1 (512) 555-0142',
|
|
1640
|
-
verification: 'verified',
|
|
1641
|
-
direction: 'inbound',
|
|
1642
|
-
reason: 'Reschedule appointment',
|
|
1643
|
-
status: 'ai',
|
|
1644
|
-
started: min(4),
|
|
1645
|
-
sentiment: 'calm',
|
|
1646
|
-
confidence: 92,
|
|
1647
|
-
goal: 'Reschedule visit with Dr. Chen',
|
|
1648
|
-
dob: '1985-03-14',
|
|
1649
|
-
age: 41,
|
|
1650
|
-
gender: 'F',
|
|
1651
|
-
location: 'Riverside Main',
|
|
1652
|
-
provider: 'Dr. Elena Chen',
|
|
1653
|
-
language: 'English',
|
|
1654
|
-
matched: true,
|
|
1655
|
-
assigned: null,
|
|
1656
|
-
tools: [
|
|
1657
|
-
{
|
|
1658
|
-
t: '0:42',
|
|
1659
|
-
key: 'search_patients',
|
|
1660
|
-
name: 'Searched Patients',
|
|
1661
|
-
tech: 'tool_search_patients',
|
|
1662
|
-
result: 'Matched DOB + name',
|
|
1663
|
-
state: 'ok',
|
|
1664
|
-
},
|
|
1665
|
-
{
|
|
1666
|
-
t: '1:18',
|
|
1667
|
-
key: 'check_doctor_availability',
|
|
1668
|
-
name: 'Checked Doctor Availability',
|
|
1669
|
-
tech: 'tool_check_doctor_availability',
|
|
1670
|
-
result: '1 upcoming visit',
|
|
1671
|
-
state: 'ok',
|
|
1672
|
-
},
|
|
1673
|
-
{
|
|
1674
|
-
t: '2:05',
|
|
1675
|
-
key: 'check_doctor_availability',
|
|
1676
|
-
name: 'Checked Doctor Availability',
|
|
1677
|
-
tech: 'tool_check_doctor_availability',
|
|
1678
|
-
result: '2 slots found',
|
|
1679
|
-
state: 'active',
|
|
1680
|
-
},
|
|
1681
|
-
],
|
|
1682
|
-
transcript: [...baseTranscript],
|
|
1683
|
-
},
|
|
1684
|
-
{
|
|
1685
|
-
id: 'LC-4819',
|
|
1686
|
-
name: 'James Okonkwo',
|
|
1687
|
-
initials: 'JO',
|
|
1688
|
-
avatar: null,
|
|
1689
|
-
phone: '+1 (737) 555-0198',
|
|
1690
|
-
verification: 'partial',
|
|
1691
|
-
direction: 'inbound',
|
|
1692
|
-
reason: 'Medication refill — urgent',
|
|
1693
|
-
status: 'needs-help',
|
|
1694
|
-
started: min(7),
|
|
1695
|
-
sentiment: 'frustrated',
|
|
1696
|
-
confidence: 71,
|
|
1697
|
-
goal: 'Refill lisinopril 10mg',
|
|
1698
|
-
dob: '1978-09-22',
|
|
1699
|
-
age: 47,
|
|
1700
|
-
gender: 'M',
|
|
1701
|
-
location: 'North Clinic',
|
|
1702
|
-
provider: 'Dr. Patel',
|
|
1703
|
-
language: 'English',
|
|
1704
|
-
matched: true,
|
|
1705
|
-
assigned: 'Front desk queue',
|
|
1706
|
-
tools: [
|
|
1707
|
-
{
|
|
1708
|
-
t: '0:55',
|
|
1709
|
-
key: 'search_patients',
|
|
1710
|
-
name: 'Searched Patients',
|
|
1711
|
-
tech: 'tool_search_patients',
|
|
1712
|
-
result: 'Partial match',
|
|
1713
|
-
state: 'warn',
|
|
1714
|
-
},
|
|
1715
|
-
{
|
|
1716
|
-
t: '1:40',
|
|
1717
|
-
key: 'submit_medication_refill',
|
|
1718
|
-
name: 'Submitted Medication Refill',
|
|
1719
|
-
tech: 'tool_submit_medication_refill',
|
|
1720
|
-
result: 'Requires staff review',
|
|
1721
|
-
state: 'warn',
|
|
1722
|
-
},
|
|
1723
|
-
],
|
|
1724
|
-
transcript: [
|
|
1725
|
-
{ who: 'ai', text: 'Thank you for calling North Clinic. How may I assist you?' },
|
|
1726
|
-
{ who: 'patient', text: 'I need my blood pressure medication refilled today — I’m out of pills.' },
|
|
1727
|
-
{ who: 'ai', text: 'I understand. Let me pull up your chart and check refill eligibility.', flag: 'verify' },
|
|
1728
|
-
{ who: 'patient', text: "I've been a patient for years, this shouldn't be so hard." },
|
|
1729
|
-
{ who: 'system', text: 'Escalation suggested — sentiment frustrated', flag: 'escalate' },
|
|
1730
|
-
],
|
|
1731
|
-
},
|
|
1732
|
-
{
|
|
1733
|
-
id: 'LC-4815',
|
|
1734
|
-
name: 'Unknown caller',
|
|
1735
|
-
initials: '?',
|
|
1736
|
-
avatar: null,
|
|
1737
|
-
phone: '+1 (512) 555-0881',
|
|
1738
|
-
verification: 'unknown',
|
|
1739
|
-
direction: 'inbound',
|
|
1740
|
-
reason: 'Billing question',
|
|
1741
|
-
status: 'human-requested',
|
|
1742
|
-
started: min(2),
|
|
1743
|
-
sentiment: 'neutral',
|
|
1744
|
-
confidence: 58,
|
|
1745
|
-
goal: 'Speak with billing',
|
|
1746
|
-
location: 'Riverside Main',
|
|
1747
|
-
provider: null,
|
|
1748
|
-
language: 'English',
|
|
1749
|
-
matched: false,
|
|
1750
|
-
assigned: null,
|
|
1751
|
-
tools: [
|
|
1752
|
-
{
|
|
1753
|
-
t: '0:30',
|
|
1754
|
-
key: 'search_practice_faq',
|
|
1755
|
-
name: 'Searched Practice FAQ',
|
|
1756
|
-
tech: 'tool_search_practice_faq',
|
|
1757
|
-
result: 'Billing / human handoff',
|
|
1758
|
-
state: 'ok',
|
|
1759
|
-
},
|
|
1760
|
-
],
|
|
1761
|
-
transcript: [
|
|
1762
|
-
{ who: 'ai', text: 'Good afternoon. How can I help you today?' },
|
|
1763
|
-
{ who: 'patient', text: 'I need to talk to someone in billing about my statement.' },
|
|
1764
|
-
{ who: 'ai', text: 'I can connect you with our billing team. One moment while I transfer you.' },
|
|
1765
|
-
],
|
|
1766
|
-
},
|
|
1767
|
-
];
|
|
1768
|
-
const SEED_ATTENTION = [
|
|
1769
|
-
{
|
|
1770
|
-
id: 'ATT-1',
|
|
1771
|
-
callId: 'LC-4819',
|
|
1772
|
-
title: 'Refill needs staff approval',
|
|
1773
|
-
detail: 'Patient out of medication — partial verification',
|
|
1774
|
-
severity: 'urgent',
|
|
1775
|
-
time: min(1),
|
|
1776
|
-
},
|
|
1777
|
-
{
|
|
1778
|
-
id: 'ATT-2',
|
|
1779
|
-
callId: 'LC-4815',
|
|
1780
|
-
title: 'Human requested',
|
|
1781
|
-
detail: 'Billing transfer pending',
|
|
1782
|
-
severity: 'warn',
|
|
1783
|
-
time: min(0.5),
|
|
1784
|
-
},
|
|
1785
|
-
{
|
|
1786
|
-
id: 'ATT-3',
|
|
1787
|
-
callId: 'LC-4821',
|
|
1788
|
-
title: 'Scheduling in progress',
|
|
1789
|
-
detail: 'AI handling — monitor recommended',
|
|
1790
|
-
severity: 'info',
|
|
1791
|
-
time: min(3),
|
|
1792
|
-
},
|
|
1793
|
-
];
|
|
1794
|
-
const SEED_HISTORY = [
|
|
1795
|
-
{
|
|
1796
|
-
id: 'HC-9001',
|
|
1797
|
-
name: 'Sooraj Jagadeesh',
|
|
1798
|
-
initials: 'SJ',
|
|
1799
|
-
phone: '+1 (512) 555-0211',
|
|
1800
|
-
direction: 'inbound',
|
|
1801
|
-
outcome: 'Appointment booked',
|
|
1802
|
-
reason: 'Appointment Refill',
|
|
1803
|
-
duration: 252,
|
|
1804
|
-
durationLabel: '4:12',
|
|
1805
|
-
started: Date.parse('2026-06-12T14:20:00'),
|
|
1806
|
-
location: 'Riverside Main',
|
|
1807
|
-
verification: 'verified',
|
|
1808
|
-
review: 'reviewed',
|
|
1809
|
-
handledBy: 'ai',
|
|
1810
|
-
dob: '2002-06-30',
|
|
1811
|
-
age: 23,
|
|
1812
|
-
gender: 'M',
|
|
1813
|
-
results: ['Appointment Booked'],
|
|
1814
|
-
},
|
|
1815
|
-
{
|
|
1816
|
-
id: 'HC-9002',
|
|
1817
|
-
name: 'Unknown Caller',
|
|
1818
|
-
initials: '?',
|
|
1819
|
-
phone: '+1 (555) 010-2299',
|
|
1820
|
-
direction: 'outbound',
|
|
1821
|
-
outcome: 'Task created',
|
|
1822
|
-
reason: 'Appointment',
|
|
1823
|
-
duration: 165,
|
|
1824
|
-
durationLabel: '2:45',
|
|
1825
|
-
started: Date.parse('2026-06-12T11:05:00'),
|
|
1826
|
-
location: 'North Clinic',
|
|
1827
|
-
verification: 'unknown',
|
|
1828
|
-
review: 'needs',
|
|
1829
|
-
handledBy: 'ai',
|
|
1830
|
-
results: ['Task Created'],
|
|
1831
|
-
risk: 'review',
|
|
1832
|
-
},
|
|
1833
|
-
{
|
|
1834
|
-
id: 'HC-9003',
|
|
1835
|
-
name: 'Dinesh Kumar',
|
|
1836
|
-
initials: 'DK',
|
|
1837
|
-
phone: '+1 (512) 555-0444',
|
|
1838
|
-
direction: 'inbound',
|
|
1839
|
-
outcome: 'Completed',
|
|
1840
|
-
reason: 'Appointment',
|
|
1841
|
-
duration: 372,
|
|
1842
|
-
durationLabel: '6:12',
|
|
1843
|
-
started: Date.parse('2026-06-11T16:45:00'),
|
|
1844
|
-
location: 'Riverside Main',
|
|
1845
|
-
verification: 'verified',
|
|
1846
|
-
review: 'reviewed',
|
|
1847
|
-
handledBy: 'staff',
|
|
1848
|
-
dob: '1988-03-14',
|
|
1849
|
-
age: 38,
|
|
1850
|
-
gender: 'M',
|
|
1851
|
-
results: ['Patient Registered', 'Appointment Booked'],
|
|
1852
|
-
},
|
|
1853
|
-
{
|
|
1854
|
-
id: 'HC-9004',
|
|
1855
|
-
name: 'Meera Banerjee',
|
|
1856
|
-
initials: 'MB',
|
|
1857
|
-
phone: '+1 (512) 555-0555',
|
|
1858
|
-
direction: 'inbound',
|
|
1859
|
-
outcome: 'Completed',
|
|
1860
|
-
reason: 'Information',
|
|
1861
|
-
duration: 93,
|
|
1862
|
-
durationLabel: '1:33',
|
|
1863
|
-
started: Date.parse('2026-06-11T09:12:00'),
|
|
1864
|
-
location: 'South Clinic',
|
|
1865
|
-
verification: 'partial',
|
|
1866
|
-
review: 'needs',
|
|
1867
|
-
handledBy: 'ai',
|
|
1868
|
-
dob: '1995-11-02',
|
|
1869
|
-
age: 30,
|
|
1870
|
-
gender: 'F',
|
|
1871
|
-
results: ['Information Provided'],
|
|
1872
|
-
},
|
|
1873
|
-
{
|
|
1874
|
-
id: 'HC-9005',
|
|
1875
|
-
name: 'Emily Foster',
|
|
1876
|
-
initials: 'EF',
|
|
1877
|
-
phone: '+1 (737) 555-0666',
|
|
1878
|
-
direction: 'inbound',
|
|
1879
|
-
outcome: 'Completed',
|
|
1880
|
-
reason: 'Hours & directions',
|
|
1881
|
-
duration: 89,
|
|
1882
|
-
durationLabel: '1:29',
|
|
1883
|
-
started: Date.parse('2026-06-10T13:40:00'),
|
|
1884
|
-
location: 'North Clinic',
|
|
1885
|
-
verification: 'unknown',
|
|
1886
|
-
review: 'reviewed',
|
|
1887
|
-
handledBy: 'ai',
|
|
1888
|
-
results: ['Information Provided'],
|
|
1889
|
-
},
|
|
1890
|
-
];
|
|
1891
|
-
const SEED_HISTORY_DETAILS = {
|
|
1892
|
-
'HC-9001': {
|
|
1893
|
-
...SEED_HISTORY[0],
|
|
1894
|
-
summary: 'New patient intake completed. AI collected demographics, verified insurance, and booked initial visit with Dr. Chen for next Monday at 10:00 AM.',
|
|
1895
|
-
transcript: [
|
|
1896
|
-
{ who: 'ai', text: 'Welcome to Riverside Family Medicine. Are you a new patient?', at: 8 },
|
|
1897
|
-
{ who: 'patient', text: 'Yes, I need to establish care.', at: 22 },
|
|
1898
|
-
{ who: 'ai', text: 'I can help schedule your first visit. May I collect a few details?', at: 38 },
|
|
1899
|
-
{ who: 'patient', text: 'Sure.', at: 62 },
|
|
1900
|
-
{ who: 'ai', text: 'Booked: Mon 10:00 AM with Dr. Chen. Confirmation sent via SMS.', at: 285 },
|
|
1901
|
-
],
|
|
1902
|
-
tools: [
|
|
1903
|
-
{
|
|
1904
|
-
t: '1:02',
|
|
1905
|
-
key: 'register_and_book_appointment',
|
|
1906
|
-
name: 'Registered & Booked Appointment',
|
|
1907
|
-
tech: 'tool_register_and_book_appointment',
|
|
1908
|
-
result: 'Chart created',
|
|
1909
|
-
state: 'ok',
|
|
1910
|
-
},
|
|
1911
|
-
{
|
|
1912
|
-
t: '3:45',
|
|
1913
|
-
key: 'book_existing_appointment',
|
|
1914
|
-
name: 'Booked Appointment',
|
|
1915
|
-
tech: 'tool_book_existing_appointment',
|
|
1916
|
-
result: 'Slot reserved',
|
|
1917
|
-
state: 'ok',
|
|
1918
|
-
},
|
|
1919
|
-
],
|
|
1920
|
-
recordingUrl: '#mock-recording',
|
|
1921
|
-
},
|
|
1922
|
-
};
|
|
1923
|
-
const SEED_TASKS = [
|
|
1924
|
-
{
|
|
1925
|
-
id: 'TK-101',
|
|
1926
|
-
created: min(180),
|
|
1927
|
-
title: 'Refill: Lisinopril 10mg',
|
|
1928
|
-
type: 'Refill request',
|
|
1929
|
-
description: 'Patient requested refill for lisinopril 10mg. Last filled 28 days ago.',
|
|
1930
|
-
patient: 'James Okonkwo',
|
|
1931
|
-
priority: 'urgent',
|
|
1932
|
-
status: 'open',
|
|
1933
|
-
source: 'voice',
|
|
1934
|
-
assignee: 'Clinical staff',
|
|
1935
|
-
callId: 'HC-9001',
|
|
1936
|
-
edvakTaskId: 'EDV-8821',
|
|
1937
|
-
edvakStatus: 'Pending review',
|
|
1938
|
-
medicationName: 'Lisinopril 10mg',
|
|
1939
|
-
medicationId: 'RX-4492',
|
|
1940
|
-
},
|
|
1941
|
-
{
|
|
1942
|
-
id: 'TK-102',
|
|
1943
|
-
created: min(240),
|
|
1944
|
-
title: 'Billing follow-up',
|
|
1945
|
-
type: 'Billing',
|
|
1946
|
-
description: 'Caller disputed a statement charge from March visit. Needs billing review.',
|
|
1947
|
-
patient: 'Unknown caller',
|
|
1948
|
-
priority: 'normal',
|
|
1949
|
-
status: 'open',
|
|
1950
|
-
source: 'voice',
|
|
1951
|
-
assignee: 'Billing',
|
|
1952
|
-
callId: 'LC-4815',
|
|
1953
|
-
},
|
|
1954
|
-
{
|
|
1955
|
-
id: 'TK-103',
|
|
1956
|
-
created: min(300),
|
|
1957
|
-
title: 'Callback requested',
|
|
1958
|
-
type: 'Callback',
|
|
1959
|
-
description: 'Sarah Williams asked for a nurse callback regarding prior auth status.',
|
|
1960
|
-
patient: 'Sarah Williams',
|
|
1961
|
-
priority: 'normal',
|
|
1962
|
-
status: 'in_progress',
|
|
1963
|
-
source: 'voice',
|
|
1964
|
-
assignee: 'Front desk',
|
|
1965
|
-
callId: 'HC-9003',
|
|
1966
|
-
},
|
|
1967
|
-
{
|
|
1968
|
-
id: 'TK-104',
|
|
1969
|
-
created: min(360),
|
|
1970
|
-
title: 'Callback — lab results',
|
|
1971
|
-
type: 'Callback',
|
|
1972
|
-
description: 'Carlos Mendez requested nurse callback about recent lab results.',
|
|
1973
|
-
patient: 'Carlos Mendez',
|
|
1974
|
-
priority: 'normal',
|
|
1975
|
-
status: 'done',
|
|
1976
|
-
source: 'sync',
|
|
1977
|
-
assignee: 'Nurse line',
|
|
1978
|
-
callId: 'HC-9004',
|
|
1979
|
-
},
|
|
1980
|
-
{
|
|
1981
|
-
id: 'TK-105',
|
|
1982
|
-
created: min(90),
|
|
1983
|
-
title: 'Schedule follow-up visit',
|
|
1984
|
-
type: 'Scheduling',
|
|
1985
|
-
description: 'Patient needs a 2-week follow-up after ER visit.',
|
|
1986
|
-
patient: 'Maria Chen',
|
|
1987
|
-
priority: 'normal',
|
|
1988
|
-
status: 'open',
|
|
1989
|
-
source: 'manual',
|
|
1990
|
-
assignee: 'Scheduling',
|
|
1991
|
-
},
|
|
1992
|
-
];
|
|
1993
|
-
const SEED_AUDIT = [
|
|
1994
|
-
{
|
|
1995
|
-
id: 'AU-1',
|
|
1996
|
-
actor: 'admin@riverside.fm',
|
|
1997
|
-
action: 'Updated welcome message',
|
|
1998
|
-
target: 'Agent Settings',
|
|
1999
|
-
detail: 'Changed inbound greeting',
|
|
2000
|
-
at: min(30),
|
|
2001
|
-
},
|
|
2002
|
-
{
|
|
2003
|
-
id: 'AU-2',
|
|
2004
|
-
actor: 'system',
|
|
2005
|
-
action: 'Agent activated',
|
|
2006
|
-
target: 'AI Receptionist',
|
|
2007
|
-
detail: 'After-hours mode enabled',
|
|
2008
|
-
at: min(120),
|
|
2009
|
-
},
|
|
2010
|
-
{
|
|
2011
|
-
id: 'AU-3',
|
|
2012
|
-
actor: 'staff@riverside.fm',
|
|
2013
|
-
action: 'Takeover',
|
|
2014
|
-
target: 'LC-4780',
|
|
2015
|
-
detail: 'Staff joined live call',
|
|
2016
|
-
at: min(300),
|
|
2017
|
-
},
|
|
2018
|
-
];
|
|
2019
|
-
const SEED_ANALYTICS = {
|
|
2020
|
-
range: '30d',
|
|
2021
|
-
kpiCards: [
|
|
2022
|
-
{
|
|
2023
|
-
label: 'Estimated Impact This Month',
|
|
2024
|
-
value: '96 hours',
|
|
2025
|
-
delta: '',
|
|
2026
|
-
tone: 'pos',
|
|
2027
|
-
sub: 'of front-desk time handled by the AI ~2.4 full work weeks.',
|
|
2028
|
-
},
|
|
2029
|
-
{
|
|
2030
|
-
label: 'AI Autonomous Resolution',
|
|
2031
|
-
value: '89%',
|
|
2032
|
-
delta: '+12%',
|
|
2033
|
-
tone: 'pos',
|
|
2034
|
-
sub: 'without staff intervention',
|
|
2035
|
-
},
|
|
2036
|
-
{
|
|
2037
|
-
label: 'Appointments Booked',
|
|
2038
|
-
value: '34',
|
|
2039
|
-
delta: '-35%',
|
|
2040
|
-
tone: 'warn',
|
|
2041
|
-
sub: 'Created by AI',
|
|
2042
|
-
},
|
|
2043
|
-
{
|
|
2044
|
-
label: 'Tasks Created',
|
|
2045
|
-
value: '19',
|
|
2046
|
-
delta: '-35%',
|
|
2047
|
-
tone: 'warn',
|
|
2048
|
-
sub: 'Created by AI',
|
|
2049
|
-
},
|
|
2050
|
-
{
|
|
2051
|
-
label: 'Patients Registered',
|
|
2052
|
-
value: '75',
|
|
2053
|
-
delta: '-6%',
|
|
2054
|
-
tone: 'warn',
|
|
2055
|
-
sub: 'Created by AI',
|
|
2056
|
-
},
|
|
2057
|
-
{
|
|
2058
|
-
label: 'Calls Handled',
|
|
2059
|
-
value: '1,234',
|
|
2060
|
-
delta: '+25%',
|
|
2061
|
-
tone: 'pos',
|
|
2062
|
-
sub: 'Inbound 104 · Outbound 24',
|
|
2063
|
-
},
|
|
2064
|
-
],
|
|
2065
|
-
volume: {
|
|
2066
|
-
timezone: 'America/Chicago',
|
|
2067
|
-
startDate: '2025-05-01',
|
|
2068
|
-
endDate: '2025-05-28',
|
|
2069
|
-
points: [
|
|
2070
|
-
{ date: '2025-05-01', day: 'Week 1', label: 'Week 1', count: 210, inbound: 170, outbound: 40 },
|
|
2071
|
-
{ date: '2025-05-08', day: 'Week 2', label: 'Week 2', count: 255, inbound: 200, outbound: 55 },
|
|
2072
|
-
{ date: '2025-05-15', day: 'Week 3', label: 'Week 3', count: 180, inbound: 145, outbound: 35 },
|
|
2073
|
-
{ date: '2025-05-22', day: 'Week 4', label: 'Week 4', count: 290, inbound: 230, outbound: 60 },
|
|
2074
|
-
],
|
|
2075
|
-
},
|
|
2076
|
-
outcomes: [
|
|
2077
|
-
{ label: 'AI handled', value: 78, color: '#8E51FF' },
|
|
2078
|
-
{ label: 'Human Assisted', value: 18, color: '#3681F4' },
|
|
2079
|
-
{ label: 'Needs Attention', value: 4, color: '#F472B6' },
|
|
2080
|
-
],
|
|
2081
|
-
reasons: [
|
|
2082
|
-
{ label: 'Appointments', value: 68 },
|
|
2083
|
-
{ label: 'Medication/Refills', value: 24 },
|
|
2084
|
-
{ label: 'Message', value: 20 },
|
|
2085
|
-
{ label: 'Information', value: 23 },
|
|
2086
|
-
{ label: 'Registration', value: 5 },
|
|
2087
|
-
{ label: 'Tasks', value: 20 },
|
|
2088
|
-
{ label: 'Others', value: 9 },
|
|
2089
|
-
],
|
|
2090
|
-
transfers: [
|
|
2091
|
-
{ label: 'Out of Scope', value: 68 },
|
|
2092
|
-
{ label: 'Multiple Requests', value: 24 },
|
|
2093
|
-
{ label: 'Identity Unresolved', value: 20 },
|
|
2094
|
-
{ label: 'Others', value: 23 },
|
|
2095
|
-
],
|
|
2096
|
-
peakHours: {
|
|
2097
|
-
timezone: 'America/Chicago',
|
|
2098
|
-
points: Array.from({ length: 24 }, (_, hour) => ({
|
|
2099
|
-
hour,
|
|
2100
|
-
label: hour === 0 ? '12 AM' : hour < 12 ? `${hour} AM` : hour === 12 ? '12 PM' : `${hour - 12} PM`,
|
|
2101
|
-
count: hour >= 8 && hour <= 20
|
|
2102
|
-
? Math.round(30 + Math.sin((hour - 8) / 2.2) * 45 + (hour === 11 || hour === 16 ? 25 : 0))
|
|
2103
|
-
: 4 + (hour % 3),
|
|
2104
|
-
})),
|
|
2105
|
-
},
|
|
2106
|
-
kpis: {
|
|
2107
|
-
totalCalls: 1234,
|
|
2108
|
-
avgDuration: 186,
|
|
2109
|
-
bookingRate: 89,
|
|
2110
|
-
transferRate: 4,
|
|
2111
|
-
},
|
|
2112
|
-
};
|
|
2113
|
-
const SEED_SETTINGS = {
|
|
2114
|
-
general: {
|
|
2115
|
-
practiceName: 'Riverside Family Medicine',
|
|
2116
|
-
timezone: 'America/Chicago',
|
|
2117
|
-
language: 'English',
|
|
2118
|
-
languages: 'English,Spanish,Chinese,Hindi',
|
|
2119
|
-
agentName: 'Robin',
|
|
2120
|
-
tone: 'professional',
|
|
2121
|
-
welcomeMessage: 'Thanks for calling {{practiceName}}! This is {{agentName}}, the practice’s virtual assistant. How can I help you today?',
|
|
2122
|
-
ttsVoiceId: '7EzWGsX10sAS4c9m9cPf',
|
|
2123
|
-
},
|
|
2124
|
-
phone: {
|
|
2125
|
-
answerMode: 'always_first',
|
|
2126
|
-
mainNumber: '+1 (234) 092-0129',
|
|
2127
|
-
transferNumber: '+1 (234) 092-0129',
|
|
2128
|
-
ringTimeout: 20,
|
|
2129
|
-
createFollowUpTask: true,
|
|
2130
|
-
locationIds: 'loc-1,loc-2,loc-3',
|
|
2131
|
-
maxCallDurationMin: 5,
|
|
2132
|
-
silenceTimeoutSec: 30,
|
|
2133
|
-
afterHoursBehavior: 'ai_answers',
|
|
2134
|
-
afterHours: true,
|
|
2135
|
-
},
|
|
2136
|
-
tasks: { autoCreate: true, defaultAssignee: 'Front desk' },
|
|
2137
|
-
scheduling: { leadTimeHours: 4, allowSameDay: true },
|
|
2138
|
-
refill: { autoApproveDays: 7, requireStaffReview: true },
|
|
2139
|
-
verify: { requireDob: true, requireName: true, maxAttempts: 3 },
|
|
2140
|
-
escalation: { sentimentThreshold: 'frustrated', urgentKeywords: 'emergency, chest pain' },
|
|
2141
|
-
outbound: { enabled: true, callerId: '+1 (512) 555-0100' },
|
|
2142
|
-
knowledge: {
|
|
2143
|
-
whatToSay: 'Arrive 15 minutes early for new-patient visits. Bring a photo ID and insurance card. We accept most major plans and self-pay; ask front desk for current cash-pay rates. For medical emergencies, hang up and dial 911.',
|
|
2144
|
-
whatNotToSay: 'Do not give clinical advice, diagnose symptoms, or promise specific appointment times that are not available. Do not share other patients’ information. Do not quote prices that are not listed in practice guidance.',
|
|
2145
|
-
},
|
|
2146
|
-
safety: [
|
|
2147
|
-
{ id: 's1', label: 'HIPAA logging enabled', status: 'ok' },
|
|
2148
|
-
{ id: 's2', label: 'Recording consent script', status: 'ok' },
|
|
2149
|
-
{ id: 's3', label: 'Emergency routing tested', status: 'warn' },
|
|
2150
|
-
{ id: 's4', label: 'PHI redaction in transcripts', status: 'ok' },
|
|
2151
|
-
],
|
|
2152
|
-
transcripts: {
|
|
2153
|
-
recordingRetainDays: 30,
|
|
2154
|
-
transcriptRetainDays: 30,
|
|
2155
|
-
disclosureWarningEnabled: true,
|
|
2156
|
-
disclosureWarningText: 'This call may be handled by an automated assistant and could be recorded for quality and training. You can ask to speak with a staff member at any time.',
|
|
2157
|
-
retainDays: 30,
|
|
2158
|
-
redactPhi: true,
|
|
2159
|
-
},
|
|
2160
|
-
advanced: {
|
|
2161
|
-
modelVersion: 'edvak-v2',
|
|
2162
|
-
debugMode: false,
|
|
2163
|
-
voiceSystemPrompt: '',
|
|
2164
|
-
customVoiceInstructions: '',
|
|
2165
|
-
},
|
|
2166
|
-
effectiveWelcomeMessage: 'Thanks for calling Riverside Family Medicine! This is Robin, the practice’s virtual assistant. How can I help you today?',
|
|
2167
|
-
};
|
|
2168
|
-
const SEED_SETUP = {
|
|
2169
|
-
readiness: 92,
|
|
2170
|
-
steps: [
|
|
2171
|
-
{ id: 1, title: 'Practice profile', description: 'Name, locations, hours', complete: true },
|
|
2172
|
-
{ id: 2, title: 'Phone routing', description: 'Connect Vonage numbers', complete: true },
|
|
2173
|
-
{ id: 3, title: 'EHR integration', description: 'FHIR scheduling & charts', complete: true },
|
|
2174
|
-
{ id: 4, title: 'Welcome message', description: 'Inbound call greeting', complete: true },
|
|
2175
|
-
{ id: 5, title: 'Verification rules', description: 'Identity checks', complete: true },
|
|
2176
|
-
{ id: 6, title: 'Task routing', description: 'Assignees & SLAs', complete: true },
|
|
2177
|
-
{ id: 7, title: 'Escalation paths', description: 'Human handoff rules', complete: true },
|
|
2178
|
-
{ id: 8, title: 'Safety checklist', description: 'Compliance review', complete: false },
|
|
2179
|
-
{ id: 9, title: 'Test call', description: 'Simulated inbound call', complete: false },
|
|
2180
|
-
{ id: 10, title: 'Staff training', description: 'Takeover & monitoring', complete: true },
|
|
2181
|
-
{ id: 11, title: 'Go live', description: 'Activate AI receptionist', complete: false },
|
|
2182
|
-
],
|
|
2183
|
-
testTranscript: [
|
|
2184
|
-
{ who: 'ai', text: 'Test call started — simulating inbound patient.' },
|
|
2185
|
-
{ who: 'patient', text: 'I would like to book an appointment.' },
|
|
2186
|
-
{ who: 'ai', text: 'Happy to help. May I verify your date of birth?' },
|
|
2187
|
-
],
|
|
2188
|
-
};
|
|
2189
|
-
const SEED_LOCATIONS = [
|
|
2190
|
-
{ id: 'loc-1', name: 'Riverside Main' },
|
|
2191
|
-
{ id: 'loc-2', name: 'North Clinic' },
|
|
2192
|
-
{ id: 'loc-3', name: 'South Clinic' },
|
|
2193
|
-
];
|
|
2194
|
-
const SEED_PROVIDERS = [
|
|
2195
|
-
{ id: 'prov-1', name: 'Dr. Elena Chen' },
|
|
2196
|
-
{ id: 'prov-2', name: 'Dr. Raj Patel' },
|
|
2197
|
-
{ id: 'prov-3', name: 'Dr. Amy Foster' },
|
|
2198
|
-
];
|
|
2199
|
-
function buildDashboard() {
|
|
2200
|
-
return {
|
|
2201
|
-
stats: {
|
|
2202
|
-
activeCalls: SEED_LIVE_CALLS.length,
|
|
2203
|
-
answeredToday: 47,
|
|
2204
|
-
appointmentsBooked: 6,
|
|
2205
|
-
tasksCreated: 8,
|
|
2206
|
-
completionRate: 86,
|
|
2207
|
-
},
|
|
2208
|
-
liveCalls: SEED_LIVE_CALLS,
|
|
2209
|
-
latestTasks: SEED_TASKS.slice(0, 5),
|
|
2210
|
-
latestAppointments: [
|
|
2211
|
-
{
|
|
2212
|
-
id: 'appt-ai-1',
|
|
2213
|
-
appointmentId: 'appt-ai-1',
|
|
2214
|
-
patientName: 'Maria Garcia',
|
|
2215
|
-
providerName: 'Dr. Elena Chen',
|
|
2216
|
-
startTime: Date.now() + 86_400_000,
|
|
2217
|
-
createdAt: min(25),
|
|
2218
|
-
callId: 'HC-9001',
|
|
2219
|
-
status: 'booked',
|
|
2220
|
-
},
|
|
2221
|
-
],
|
|
2222
|
-
recentHistory: SEED_HISTORY.slice(0, 5),
|
|
2223
|
-
};
|
|
2224
|
-
}
|
|
2225
|
-
function getStreamingLines() {
|
|
2226
|
-
return streamingLines;
|
|
2227
|
-
}
|
|
2228
|
-
function cloneLiveCalls() {
|
|
2229
|
-
return SEED_LIVE_CALLS.map((c) => ({
|
|
2230
|
-
...c,
|
|
2231
|
-
tools: c.tools.map((t) => ({ ...t })),
|
|
2232
|
-
transcript: c.transcript.map((l) => ({ ...l })),
|
|
2233
|
-
}));
|
|
2234
|
-
}
|
|
2235
|
-
function cloneHistory() {
|
|
2236
|
-
return SEED_HISTORY.map((h) => ({ ...h }));
|
|
2237
|
-
}
|
|
2238
|
-
function cloneTasks() {
|
|
2239
|
-
return SEED_TASKS.map((t) => ({ ...t }));
|
|
2240
|
-
}
|
|
2241
|
-
|
|
2242
|
-
const DEFAULT_PLACEHOLDERS = [
|
|
2243
|
-
{ token: '{{patientName}}', label: 'Patient name', sampleValue: 'Maria Garcia' },
|
|
2244
|
-
{ token: '{{appointmentDate}}', label: 'Appointment date', sampleValue: 'March 15' },
|
|
2245
|
-
{ token: '{{appointmentTime}}', label: 'Appointment time', sampleValue: '2:30 PM' },
|
|
2246
|
-
{ token: '{{providerName}}', label: 'Provider name', sampleValue: 'Dr. Patel' },
|
|
2247
|
-
{ token: '{{practiceName}}', label: 'Practice name', sampleValue: 'Edvak Family Medicine' },
|
|
2248
|
-
];
|
|
2249
|
-
const SEED_OUTBOUND_PURPOSES = [
|
|
2250
|
-
{
|
|
2251
|
-
purposeId: 'purpose-confirm-appt',
|
|
2252
|
-
label: 'Confirm appointment',
|
|
2253
|
-
description: 'Remind patient of upcoming visit and confirm attendance.',
|
|
2254
|
-
sampleOpening: 'Hi {{patientName}}, this is {{practiceName}} calling to confirm your appointment on {{appointmentDate}} at {{appointmentTime}} with {{providerName}}.',
|
|
2255
|
-
openingTemplate: 'Hi {{patientName}}, this is {{practiceName}} calling to confirm your appointment on {{appointmentDate}} at {{appointmentTime}} with {{providerName}}.',
|
|
2256
|
-
agentContextHint: 'Confirm attendance; offer reschedule if patient cannot make it.',
|
|
2257
|
-
requiredFields: ['appointmentDate', 'appointmentTime', 'providerName'],
|
|
2258
|
-
allowsCustomScript: false,
|
|
2259
|
-
isSystem: true,
|
|
2260
|
-
isActive: true,
|
|
2261
|
-
sortOrder: 1,
|
|
2262
|
-
placeholders: DEFAULT_PLACEHOLDERS,
|
|
2263
|
-
},
|
|
2264
|
-
{
|
|
2265
|
-
purposeId: 'purpose-recall',
|
|
2266
|
-
label: 'Recall / follow-up',
|
|
2267
|
-
description: 'Invite patient to schedule a follow-up visit.',
|
|
2268
|
-
sampleOpening: 'Hello {{patientName}}, {{practiceName}} here. We would like to help you schedule a follow-up with {{providerName}}.',
|
|
2269
|
-
openingTemplate: 'Hello {{patientName}}, {{practiceName}} here. We would like to help you schedule a follow-up with {{providerName}}.',
|
|
2270
|
-
agentContextHint: null,
|
|
2271
|
-
requiredFields: ['providerName'],
|
|
2272
|
-
allowsCustomScript: true,
|
|
2273
|
-
isSystem: true,
|
|
2274
|
-
isActive: true,
|
|
2275
|
-
sortOrder: 2,
|
|
2276
|
-
placeholders: DEFAULT_PLACEHOLDERS,
|
|
2277
|
-
},
|
|
2278
|
-
{
|
|
2279
|
-
purposeId: 'purpose-custom',
|
|
2280
|
-
label: 'Custom outreach',
|
|
2281
|
-
description: 'Staff-defined script for one-off calls.',
|
|
2282
|
-
sampleOpening: '',
|
|
2283
|
-
openingTemplate: 'Hi {{patientName}}, this is {{practiceName}}.',
|
|
2284
|
-
agentContextHint: 'Follow the custom script closely.',
|
|
2285
|
-
requiredFields: ['customScript'],
|
|
2286
|
-
allowsCustomScript: true,
|
|
2287
|
-
isSystem: false,
|
|
2288
|
-
isActive: false,
|
|
2289
|
-
sortOrder: 99,
|
|
2290
|
-
placeholders: DEFAULT_PLACEHOLDERS,
|
|
2291
|
-
},
|
|
2292
|
-
];
|
|
2293
|
-
|
|
2294
|
-
const hour = 60 * 60 * 1000;
|
|
2295
|
-
const now = Date.now();
|
|
2296
|
-
function todayAt(h, m = 0) {
|
|
2297
|
-
const d = new Date();
|
|
2298
|
-
d.setHours(h, m, 0, 0);
|
|
2299
|
-
return d.toISOString();
|
|
2300
|
-
}
|
|
2301
|
-
const SEED_ACTIVITIES = [
|
|
2302
|
-
{
|
|
2303
|
-
id: 'act-appt-1',
|
|
2304
|
-
type: 'appointment_booked',
|
|
2305
|
-
occurredAt: new Date(now - 0.4 * hour).toISOString(),
|
|
2306
|
-
title: 'Appointment booked',
|
|
2307
|
-
detail: '',
|
|
2308
|
-
patientId: 'pat-1001',
|
|
2309
|
-
patientName: 'Sooraj Jagadeesh',
|
|
2310
|
-
patientInitials: 'SJ',
|
|
2311
|
-
patientDob: '2002-06-30',
|
|
2312
|
-
patientAge: 23,
|
|
2313
|
-
patientGender: 'M',
|
|
2314
|
-
providerName: 'Dr. Anika Mehra',
|
|
2315
|
-
providerInitials: 'AM',
|
|
2316
|
-
providerSpecialty: 'Cardiologist',
|
|
2317
|
-
appointmentId: 'appt-9001',
|
|
2318
|
-
callId: 'LC-4801',
|
|
2319
|
-
startAt: todayAt(8, 0),
|
|
2320
|
-
endAt: todayAt(8, 15),
|
|
2321
|
-
durationMinutes: 15,
|
|
2322
|
-
visitType: 'Follow Up',
|
|
2323
|
-
hasInsurance: true,
|
|
2324
|
-
insuranceName: 'Aetna PPO',
|
|
2325
|
-
},
|
|
2326
|
-
{
|
|
2327
|
-
id: 'act-appt-1b',
|
|
2328
|
-
type: 'task_created',
|
|
2329
|
-
occurredAt: new Date(now - 0.35 * hour).toISOString(),
|
|
2330
|
-
title: 'Needs Scheduling Assistance',
|
|
2331
|
-
detail: '',
|
|
2332
|
-
patientId: 'pat-1001',
|
|
2333
|
-
patientName: 'Sooraj Jagadeesh',
|
|
2334
|
-
patientInitials: 'SJ',
|
|
2335
|
-
patientDob: '2002-06-30',
|
|
2336
|
-
patientAge: 23,
|
|
2337
|
-
patientGender: 'M',
|
|
2338
|
-
providerName: 'Front Desk',
|
|
2339
|
-
providerInitials: 'FD',
|
|
2340
|
-
providerSpecialty: 'Operations',
|
|
2341
|
-
taskId: 'task-4801',
|
|
2342
|
-
callId: 'LC-4801',
|
|
2343
|
-
startAt: todayAt(8, 5),
|
|
2344
|
-
visitType: 'Insurance verification',
|
|
2345
|
-
durationMinutes: 10,
|
|
2346
|
-
priority: 'medium',
|
|
2347
|
-
},
|
|
2348
|
-
{
|
|
2349
|
-
id: 'act-appt-2',
|
|
2350
|
-
type: 'appointment_booked',
|
|
2351
|
-
occurredAt: new Date(now - 1.1 * hour).toISOString(),
|
|
2352
|
-
title: 'Appointment booked',
|
|
2353
|
-
detail: '',
|
|
2354
|
-
patientId: 'pat-1005',
|
|
2355
|
-
patientName: 'Lisa Sullivan',
|
|
2356
|
-
patientInitials: 'LS',
|
|
2357
|
-
patientDob: '1998-03-12',
|
|
2358
|
-
patientAge: 28,
|
|
2359
|
-
patientGender: 'F',
|
|
2360
|
-
providerName: 'Dr. Marcus Webb',
|
|
2361
|
-
providerInitials: 'MW',
|
|
2362
|
-
providerSpecialty: 'Endocrinologist',
|
|
2363
|
-
appointmentId: 'appt-9003',
|
|
2364
|
-
callId: 'LC-4800',
|
|
2365
|
-
startAt: todayAt(8, 15),
|
|
2366
|
-
endAt: todayAt(8, 30),
|
|
2367
|
-
durationMinutes: 15,
|
|
2368
|
-
visitType: 'Lab Results Review',
|
|
2369
|
-
hasInsurance: false,
|
|
2370
|
-
},
|
|
2371
|
-
{
|
|
2372
|
-
id: 'act-appt-3',
|
|
2373
|
-
type: 'appointment_booked',
|
|
2374
|
-
occurredAt: new Date(now - 2.2 * hour).toISOString(),
|
|
2375
|
-
title: 'Appointment booked',
|
|
2376
|
-
detail: '',
|
|
2377
|
-
patientId: 'pat-1006',
|
|
2378
|
-
patientName: 'Aiden Rivera',
|
|
2379
|
-
patientInitials: 'AR',
|
|
2380
|
-
patientDob: '1995-11-04',
|
|
2381
|
-
patientAge: 30,
|
|
2382
|
-
patientGender: 'M',
|
|
2383
|
-
providerName: 'Dr. Priya Nair',
|
|
2384
|
-
providerInitials: 'PN',
|
|
2385
|
-
providerSpecialty: 'General Practitioner',
|
|
2386
|
-
appointmentId: 'appt-9004',
|
|
2387
|
-
callId: 'LC-4799',
|
|
2388
|
-
startAt: todayAt(8, 30),
|
|
2389
|
-
endAt: todayAt(8, 45),
|
|
2390
|
-
durationMinutes: 15,
|
|
2391
|
-
visitType: 'Routine Checkup',
|
|
2392
|
-
},
|
|
2393
|
-
{
|
|
2394
|
-
id: 'act-appt-4',
|
|
2395
|
-
type: 'appointment_booked',
|
|
2396
|
-
occurredAt: new Date(now - 8 * hour).toISOString(),
|
|
2397
|
-
title: 'Appointment booked',
|
|
2398
|
-
detail: '',
|
|
2399
|
-
patientId: 'pat-1003',
|
|
2400
|
-
patientName: 'Aisha Patel',
|
|
2401
|
-
patientInitials: 'AP',
|
|
2402
|
-
patientDob: '1988-01-19',
|
|
2403
|
-
patientAge: 38,
|
|
2404
|
-
patientGender: 'F',
|
|
2405
|
-
providerName: 'Dr. Jordan Lee',
|
|
2406
|
-
providerInitials: 'JL',
|
|
2407
|
-
providerSpecialty: 'Internal Medicine',
|
|
2408
|
-
appointmentId: 'appt-9002',
|
|
2409
|
-
callId: 'LC-4790',
|
|
2410
|
-
startAt: todayAt(14, 30),
|
|
2411
|
-
endAt: todayAt(15, 0),
|
|
2412
|
-
durationMinutes: 30,
|
|
2413
|
-
visitType: 'Annual Wellness',
|
|
2414
|
-
hasInsurance: true,
|
|
2415
|
-
insuranceName: 'BlueCross Blue Shield',
|
|
2416
|
-
},
|
|
2417
|
-
{
|
|
2418
|
-
id: 'act-1',
|
|
2419
|
-
type: 'patient_created',
|
|
2420
|
-
occurredAt: new Date(now - 0.5 * hour).toISOString(),
|
|
2421
|
-
title: 'Patient registered',
|
|
2422
|
-
detail: '',
|
|
2423
|
-
patientId: 'pat-1008',
|
|
2424
|
-
patientName: 'Maria Garcia',
|
|
2425
|
-
patientInitials: 'MG',
|
|
2426
|
-
patientDob: '1991-04-22',
|
|
2427
|
-
patientAge: 35,
|
|
2428
|
-
patientGender: 'F',
|
|
2429
|
-
callId: 'LC-4801',
|
|
2430
|
-
startAt: todayAt(9, 12),
|
|
2431
|
-
visitType: 'New registration',
|
|
2432
|
-
hasInsurance: true,
|
|
2433
|
-
insuranceName: 'UnitedHealthcare',
|
|
2434
|
-
},
|
|
2435
|
-
{
|
|
2436
|
-
id: 'act-5',
|
|
2437
|
-
type: 'patient_created',
|
|
2438
|
-
occurredAt: new Date(now - 26 * hour).toISOString(),
|
|
2439
|
-
title: 'Patient registered',
|
|
2440
|
-
detail: '',
|
|
2441
|
-
patientId: 'pat-1004',
|
|
2442
|
-
patientName: 'Sam Okonkwo',
|
|
2443
|
-
patientInitials: 'SO',
|
|
2444
|
-
patientDob: '1979-09-08',
|
|
2445
|
-
patientAge: 46,
|
|
2446
|
-
patientGender: 'M',
|
|
2447
|
-
callId: 'LC-4782',
|
|
2448
|
-
startAt: new Date(now - 26 * hour).toISOString(),
|
|
2449
|
-
visitType: 'Outbound registration',
|
|
2450
|
-
hasInsurance: false,
|
|
2451
|
-
},
|
|
2452
|
-
{
|
|
2453
|
-
id: 'act-3',
|
|
2454
|
-
type: 'task_created',
|
|
2455
|
-
occurredAt: new Date(now - 3 * hour).toISOString(),
|
|
2456
|
-
title: 'Needs Scheduling Assistance',
|
|
2457
|
-
detail: '',
|
|
2458
|
-
patientId: 'pat-1002',
|
|
2459
|
-
patientName: 'James Chen',
|
|
2460
|
-
patientInitials: 'JC',
|
|
2461
|
-
patientDob: '1985-12-01',
|
|
2462
|
-
patientAge: 40,
|
|
2463
|
-
patientGender: 'M',
|
|
2464
|
-
providerName: 'Front Desk',
|
|
2465
|
-
providerInitials: 'FD',
|
|
2466
|
-
providerSpecialty: 'Operations',
|
|
2467
|
-
taskId: 'task-301',
|
|
2468
|
-
callId: 'LC-4798',
|
|
2469
|
-
startAt: new Date(now - 3 * hour).toISOString(),
|
|
2470
|
-
visitType: 'Insurance verification',
|
|
2471
|
-
durationMinutes: 15,
|
|
2472
|
-
priority: 'medium',
|
|
2473
|
-
},
|
|
2474
|
-
{
|
|
2475
|
-
id: 'act-6',
|
|
2476
|
-
type: 'task_created',
|
|
2477
|
-
occurredAt: new Date(now - 5 * hour).toISOString(),
|
|
2478
|
-
title: 'Needs Scheduling Assistance',
|
|
2479
|
-
detail: '',
|
|
2480
|
-
patientId: 'pat-1007',
|
|
2481
|
-
patientName: 'Elena Foster',
|
|
2482
|
-
patientInitials: 'EF',
|
|
2483
|
-
patientDob: '1993-07-15',
|
|
2484
|
-
patientAge: 32,
|
|
2485
|
-
patientGender: 'F',
|
|
2486
|
-
providerName: 'Nurse Station',
|
|
2487
|
-
providerInitials: 'NS',
|
|
2488
|
-
providerSpecialty: 'Clinical support',
|
|
2489
|
-
taskId: 'task-302',
|
|
2490
|
-
callId: 'LC-4795',
|
|
2491
|
-
startAt: new Date(now - 5 * hour).toISOString(),
|
|
2492
|
-
visitType: 'Clinical callback',
|
|
2493
|
-
durationMinutes: 10,
|
|
2494
|
-
priority: 'medium',
|
|
2495
|
-
},
|
|
2496
|
-
];
|
|
2497
|
-
|
|
2498
|
-
const MOCK_DELAY_MS = 200;
|
|
2499
|
-
class AiReceptionistApiMockService {
|
|
2500
|
-
constructor() {
|
|
2501
|
-
this.liveCalls = signal(cloneLiveCalls());
|
|
2502
|
-
this.tasks = signal(cloneTasks());
|
|
2503
|
-
this.history = signal(cloneHistory());
|
|
2504
|
-
this.settings = signal(structuredClone(SEED_SETTINGS));
|
|
2505
|
-
this.status = signal({
|
|
2506
|
-
agentOn: true,
|
|
2507
|
-
mode: 'after-hours',
|
|
2508
|
-
readiness: SEED_SETUP.readiness,
|
|
2509
|
-
});
|
|
2510
|
-
this.outboundPurposes = signal(structuredClone(SEED_OUTBOUND_PURPOSES));
|
|
2511
|
-
}
|
|
2512
|
-
mock(data) {
|
|
2513
|
-
return of({ data }).pipe(delay(MOCK_DELAY_MS));
|
|
2514
|
-
}
|
|
2515
|
-
paginate(rows, page = 1, limit = DEFAULT_PAGE_SIZE) {
|
|
2516
|
-
const safePage = Math.max(1, page);
|
|
2517
|
-
const safeLimit = Math.min(100, Math.max(1, limit));
|
|
2518
|
-
const start = (safePage - 1) * safeLimit;
|
|
2519
|
-
return of({
|
|
2520
|
-
items: rows.slice(start, start + safeLimit),
|
|
2521
|
-
total: rows.length,
|
|
2522
|
-
page: safePage,
|
|
2523
|
-
limit: safeLimit,
|
|
2524
|
-
}).pipe(delay(MOCK_DELAY_MS));
|
|
2525
|
-
}
|
|
2526
|
-
getStatus() {
|
|
2527
|
-
return this.mock(this.status());
|
|
2528
|
-
}
|
|
2529
|
-
setAgentOn(on) {
|
|
2530
|
-
this.status.update((s) => ({ ...s, agentOn: on }));
|
|
2531
|
-
}
|
|
2532
|
-
getDashboard() {
|
|
2533
|
-
const dash = buildDashboard();
|
|
2534
|
-
dash.liveCalls = [];
|
|
2535
|
-
return this.mock(dash);
|
|
2536
|
-
}
|
|
2537
|
-
getLiveCalls() {
|
|
2538
|
-
return this.mock(this.liveCalls());
|
|
2539
|
-
}
|
|
2540
|
-
getLiveCall(id) {
|
|
2541
|
-
const call = this.liveCalls().find((c) => c.id === id) ?? null;
|
|
2542
|
-
return this.mock(call ? structuredClone(call) : null);
|
|
2543
|
-
}
|
|
2544
|
-
getCallTranscript(id) {
|
|
2545
|
-
const call = this.liveCalls().find((c) => c.id === id);
|
|
2546
|
-
return this.mock(call ? call.transcript.map((l) => ({ ...l })) : []);
|
|
2547
|
-
}
|
|
2548
|
-
getCallSummary(id) {
|
|
2549
|
-
const detail = SEED_HISTORY_DETAILS[id];
|
|
2550
|
-
if (detail) {
|
|
2551
|
-
return this.mock({
|
|
2552
|
-
summary: detail.summary,
|
|
2553
|
-
transcript: detail.transcript.map((l) => ({ ...l })),
|
|
2554
|
-
tools: detail.tools.map((t) => ({ ...t })),
|
|
2555
|
-
});
|
|
2556
|
-
}
|
|
2557
|
-
const call = this.liveCalls().find((c) => c.id === id);
|
|
2558
|
-
if (call) {
|
|
2559
|
-
return this.mock({
|
|
2560
|
-
summary: 'Call summary will appear here after processing.',
|
|
2561
|
-
transcript: call.transcript.map((l) => ({ ...l })),
|
|
2562
|
-
tools: call.tools.map((t) => ({ ...t })),
|
|
2563
|
-
});
|
|
2564
|
-
}
|
|
2565
|
-
return this.mock(null);
|
|
2566
|
-
}
|
|
2567
|
-
getCallRecording(callId) {
|
|
2568
|
-
const detail = SEED_HISTORY_DETAILS[callId];
|
|
2569
|
-
if (detail?.recordingUrl) {
|
|
2570
|
-
const meta = {
|
|
2571
|
-
callId,
|
|
2572
|
-
status: 'ready',
|
|
2573
|
-
url: `/api/ai-receptionist/calls/${callId}/recording/audio`,
|
|
2574
|
-
contentType: 'audio/ogg',
|
|
2575
|
-
durationSeconds: detail.duration || 120,
|
|
2576
|
-
};
|
|
2577
|
-
return of(meta).pipe(delay(MOCK_DELAY_MS));
|
|
2578
|
-
}
|
|
2579
|
-
const unavailable = {
|
|
2580
|
-
callId,
|
|
2581
|
-
status: 'unavailable',
|
|
2582
|
-
url: null,
|
|
2583
|
-
message: 'No recording available for this call',
|
|
2584
|
-
};
|
|
2585
|
-
return of(unavailable).pipe(delay(MOCK_DELAY_MS));
|
|
2586
|
-
}
|
|
2587
|
-
getCallRecordingBlob() {
|
|
2588
|
-
return of(new Blob([], { type: 'audio/ogg' })).pipe(delay(MOCK_DELAY_MS));
|
|
2589
|
-
}
|
|
2590
|
-
getHistory(filters) {
|
|
2591
|
-
let rows = this.history();
|
|
2592
|
-
const q = filters?.q?.toLowerCase().trim();
|
|
2593
|
-
if (q) {
|
|
2594
|
-
rows = rows.filter((h) => h.name.toLowerCase().includes(q) ||
|
|
2595
|
-
h.phone.includes(q) ||
|
|
2596
|
-
h.reason.toLowerCase().includes(q) ||
|
|
2597
|
-
h.id.toLowerCase().includes(q));
|
|
2598
|
-
}
|
|
2599
|
-
if (filters?.dir)
|
|
2600
|
-
rows = rows.filter((h) => h.direction === filters.dir);
|
|
2601
|
-
if (filters?.outcome) {
|
|
2602
|
-
rows = rows.filter((h) => h.outcome.toLowerCase().includes(filters.outcome.toLowerCase()));
|
|
2603
|
-
}
|
|
2604
|
-
if (filters?.location)
|
|
2605
|
-
rows = rows.filter((h) => h.location === filters.location);
|
|
2606
|
-
if (filters?.review)
|
|
2607
|
-
rows = rows.filter((h) => h.review === filters.review);
|
|
2608
|
-
return this.paginate(rows, filters?.page, filters?.limit);
|
|
2609
|
-
}
|
|
2610
|
-
getCallDetail(id) {
|
|
2611
|
-
const detail = SEED_HISTORY_DETAILS[id] ?? null;
|
|
2612
|
-
return this.mock(detail ? structuredClone(detail) : null);
|
|
2613
|
-
}
|
|
2614
|
-
regenerateCallSummary(callId) {
|
|
2615
|
-
const detail = SEED_HISTORY_DETAILS[callId];
|
|
2616
|
-
if (!detail) {
|
|
2617
|
-
return throwError(() => ({ message: 'Call not found.', status: 404 }));
|
|
2618
|
-
}
|
|
2619
|
-
if (!detail.transcript.length) {
|
|
2620
|
-
return throwError(() => ({ message: 'No transcript on this call.', status: 400 }));
|
|
2621
|
-
}
|
|
2622
|
-
const turnCount = detail.transcript.filter((line) => line.who !== 'system').length;
|
|
2623
|
-
const summary = `Regenerated summary (${new Date().toLocaleString()}): ${detail.summary}`;
|
|
2624
|
-
detail.summary = summary;
|
|
2625
|
-
SEED_HISTORY_DETAILS[callId] = detail;
|
|
2626
|
-
return this.mock({
|
|
2627
|
-
callId,
|
|
2628
|
-
summary,
|
|
2629
|
-
summaryModel: 'gpt-4o-mini',
|
|
2630
|
-
summaryGeneratedAt: new Date().toISOString(),
|
|
2631
|
-
transcriptTurnCount: turnCount,
|
|
2632
|
-
});
|
|
2633
|
-
}
|
|
2634
|
-
postTakeover(id) {
|
|
2635
|
-
return this.postMediaJoin(id, 'takeover').pipe(map(() => ({ data: { success: true } })));
|
|
2636
|
-
}
|
|
2637
|
-
postMediaJoin(id, mode) {
|
|
2638
|
-
this.patchLive(id, (c) => ({
|
|
2639
|
-
...c,
|
|
2640
|
-
status: mode === 'takeover' ? 'takeover' : c.status,
|
|
2641
|
-
controlMode: mode,
|
|
2642
|
-
assigned: mode === 'takeover' ? 'You' : c.assigned,
|
|
2643
|
-
aiPaused: mode === 'takeover',
|
|
2644
|
-
}));
|
|
2645
|
-
// Mock tokens are placeholders — StaffMediaService is skipped when useMockApi is on.
|
|
2646
|
-
return this.mock({
|
|
2647
|
-
ok: true,
|
|
2648
|
-
callId: id,
|
|
2649
|
-
mode,
|
|
2650
|
-
provider: 'livekit',
|
|
2651
|
-
livekitUrl: 'wss://mock.livekit.local',
|
|
2652
|
-
clientToken: `mock-token-${mode}-${id}`,
|
|
2653
|
-
roomName: `call-${id}`,
|
|
2654
|
-
controlMode: mode,
|
|
2655
|
-
aiPaused: mode === 'takeover',
|
|
2656
|
-
assigned: mode === 'takeover' ? 'You' : null,
|
|
2657
|
-
});
|
|
2658
|
-
}
|
|
2659
|
-
postMediaLeave(id) {
|
|
2660
|
-
this.patchLive(id, (c) => ({
|
|
2661
|
-
...c,
|
|
2662
|
-
status: 'ai',
|
|
2663
|
-
controlMode: 'ai',
|
|
2664
|
-
assigned: null,
|
|
2665
|
-
aiPaused: false,
|
|
2666
|
-
}));
|
|
2667
|
-
return this.mock({ success: true });
|
|
2668
|
-
}
|
|
2669
|
-
postResumeAi(id) {
|
|
2670
|
-
return this.postMediaLeave(id);
|
|
2671
|
-
}
|
|
2672
|
-
postPause(id) {
|
|
2673
|
-
this.patchLive(id, (c) => ({ ...c, controlMode: 'paused', aiPaused: true }));
|
|
2674
|
-
return this.mock({ success: true });
|
|
2675
|
-
}
|
|
2676
|
-
postResume(id) {
|
|
2677
|
-
this.patchLive(id, (c) => ({
|
|
2678
|
-
...c,
|
|
2679
|
-
controlMode: c.status === 'takeover' || c.assigned ? 'takeover' : 'ai',
|
|
2680
|
-
aiPaused: false,
|
|
2681
|
-
}));
|
|
2682
|
-
return this.mock({ success: true });
|
|
2683
|
-
}
|
|
2684
|
-
postListen(id) {
|
|
2685
|
-
return this.postMediaJoin(id, 'listen').pipe(map(() => ({ data: { success: true } })));
|
|
2686
|
-
}
|
|
2687
|
-
postTransfer(id) {
|
|
2688
|
-
this.patchLive(id, (c) => ({ ...c, status: 'transferring' }));
|
|
2689
|
-
return this.mock({ success: true });
|
|
2690
|
-
}
|
|
2691
|
-
postEnd(id) {
|
|
2692
|
-
this.liveCalls.update((calls) => calls.filter((c) => c.id !== id));
|
|
2693
|
-
return this.mock({ success: true });
|
|
2694
|
-
}
|
|
2695
|
-
postMessage(id, text) {
|
|
2696
|
-
this.patchLive(id, (c) => ({
|
|
2697
|
-
...c,
|
|
2698
|
-
transcript: [...c.transcript, { who: 'staff', text, at: Date.now() }],
|
|
2699
|
-
}));
|
|
2700
|
-
return this.mock({ success: true });
|
|
2701
|
-
}
|
|
2702
|
-
postReview(id) {
|
|
2703
|
-
this.history.update((rows) => rows.map((h) => (h.id === id ? { ...h, review: 'reviewed' } : h)));
|
|
2704
|
-
const detail = SEED_HISTORY_DETAILS[id];
|
|
2705
|
-
if (detail) {
|
|
2706
|
-
detail.review = 'reviewed';
|
|
2707
|
-
}
|
|
2708
|
-
return this.mock({ review: 'reviewed' });
|
|
2709
|
-
}
|
|
2710
|
-
getTasks(filters) {
|
|
2711
|
-
let rows = this.tasks();
|
|
2712
|
-
if (filters?.status)
|
|
2713
|
-
rows = rows.filter((t) => t.status === filters.status);
|
|
2714
|
-
if (filters?.type)
|
|
2715
|
-
rows = rows.filter((t) => t.type === filters.type);
|
|
2716
|
-
if (filters?.source)
|
|
2717
|
-
rows = rows.filter((t) => t.source === filters.source);
|
|
2718
|
-
if (filters?.callId)
|
|
2719
|
-
rows = rows.filter((t) => t.callId === filters.callId);
|
|
2720
|
-
return this.paginate(rows, filters?.page, filters?.limit);
|
|
2721
|
-
}
|
|
2722
|
-
getCallTasks(callId) {
|
|
2723
|
-
return this.getTasks({ callId, limit: 100 }).pipe(map((page) => ({ data: page.items })));
|
|
2724
|
-
}
|
|
2725
|
-
createTask(req) {
|
|
2726
|
-
let description = req.description?.trim() ?? '';
|
|
2727
|
-
if (!description && req.callId) {
|
|
2728
|
-
description = SEED_HISTORY_DETAILS[req.callId]?.summary ?? '';
|
|
2729
|
-
}
|
|
2730
|
-
const task = {
|
|
2731
|
-
id: `TK-${Date.now()}`,
|
|
2732
|
-
created: Date.now(),
|
|
2733
|
-
title: req.title.trim(),
|
|
2734
|
-
type: req.type,
|
|
2735
|
-
description,
|
|
2736
|
-
patient: req.patient?.trim() || '—',
|
|
2737
|
-
priority: req.priority ?? 'normal',
|
|
2738
|
-
status: 'open',
|
|
2739
|
-
source: 'manual',
|
|
2740
|
-
assignee: req.assignee?.trim() || 'Front desk',
|
|
2741
|
-
callId: req.callId,
|
|
2742
|
-
};
|
|
2743
|
-
this.tasks.update((rows) => [task, ...rows]);
|
|
2744
|
-
return this.mock(task);
|
|
2745
|
-
}
|
|
2746
|
-
patchTask(id, status) {
|
|
2747
|
-
let updated = null;
|
|
2748
|
-
this.tasks.update((rows) => rows.map((t) => {
|
|
2749
|
-
if (t.id !== id)
|
|
2750
|
-
return t;
|
|
2751
|
-
updated = { ...t, status };
|
|
2752
|
-
return updated;
|
|
2753
|
-
}));
|
|
2754
|
-
return this.mock(updated);
|
|
2755
|
-
}
|
|
2756
|
-
getAnalytics(range) {
|
|
2757
|
-
return this.mock({ ...SEED_ANALYTICS, range });
|
|
2758
|
-
}
|
|
2759
|
-
getSettings() {
|
|
2760
|
-
const data = this.withEffectiveWelcome(this.settings());
|
|
2761
|
-
return this.mock(data);
|
|
2762
|
-
}
|
|
2763
|
-
putSettings(next) {
|
|
2764
|
-
const saved = this.withEffectiveWelcome(structuredClone(next));
|
|
2765
|
-
this.settings.set(saved);
|
|
2766
|
-
return this.mock(saved);
|
|
2767
|
-
}
|
|
2768
|
-
getVoicePromptDefault() {
|
|
2769
|
-
return of({
|
|
2770
|
-
defaultVoiceSystemPrompt: 'You are an AI receptionist for a medical practice. Be warm, concise, and HIPAA-aware.',
|
|
2771
|
-
voiceSystemPromptMaxLength: 24000,
|
|
2772
|
-
customVoiceInstructionsMaxLength: 8000,
|
|
2773
|
-
notes: 'Leave voiceSystemPrompt empty to use this shipped default.',
|
|
2774
|
-
}).pipe(delay(MOCK_DELAY_MS));
|
|
2775
|
-
}
|
|
2776
|
-
previewVoice(_voiceId) {
|
|
2777
|
-
// Silent tiny wav so mock mode does not break the Play button.
|
|
2778
|
-
const silent = new Uint8Array([
|
|
2779
|
-
0x52, 0x49, 0x46, 0x46, 0x24, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74,
|
|
2780
|
-
0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x80, 0x3e,
|
|
2781
|
-
0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00,
|
|
2782
|
-
]);
|
|
2783
|
-
return of(new Blob([silent], { type: 'audio/wav' })).pipe(delay(MOCK_DELAY_MS));
|
|
2784
|
-
}
|
|
2785
|
-
testKnowledgeAnswer(params) {
|
|
2786
|
-
const answer = `Based on our guidance: for “${params.question.trim()}”, ` +
|
|
2787
|
-
`I'd share what's in our practice knowledge and avoid restricted topics.`;
|
|
2788
|
-
return this.previewVoice(params.voiceId ?? 'mock').pipe(map((audioBlob) => ({
|
|
2789
|
-
answer,
|
|
2790
|
-
voiceId: params.voiceId ?? 'mock',
|
|
2791
|
-
audioBlob,
|
|
2792
|
-
})));
|
|
2793
|
-
}
|
|
2794
|
-
withEffectiveWelcome(settings) {
|
|
2795
|
-
return {
|
|
2796
|
-
...settings,
|
|
2797
|
-
effectiveWelcomeMessage: computeEffectiveWelcomeMessage(settings),
|
|
2798
|
-
};
|
|
2799
|
-
}
|
|
2800
|
-
getAudit(q, actor, opts) {
|
|
2801
|
-
let rows = SEED_AUDIT;
|
|
2802
|
-
if (q) {
|
|
2803
|
-
const needle = q.toLowerCase();
|
|
2804
|
-
rows = rows.filter((e) => e.action.toLowerCase().includes(needle) ||
|
|
2805
|
-
e.detail.toLowerCase().includes(needle) ||
|
|
2806
|
-
e.target.toLowerCase().includes(needle));
|
|
2807
|
-
}
|
|
2808
|
-
if (actor)
|
|
2809
|
-
rows = rows.filter((e) => e.actor.toLowerCase().includes(actor.toLowerCase()));
|
|
2810
|
-
return this.paginate(rows, opts?.page, opts?.limit);
|
|
2811
|
-
}
|
|
2812
|
-
getActivities(filters) {
|
|
2813
|
-
let rows = structuredClone(SEED_ACTIVITIES);
|
|
2814
|
-
const types = (filters?.types ?? '')
|
|
2815
|
-
.split(',')
|
|
2816
|
-
.map((t) => t.trim())
|
|
2817
|
-
.filter(Boolean);
|
|
2818
|
-
if (types.length) {
|
|
2819
|
-
rows = rows.filter((a) => types.includes(a.type));
|
|
2820
|
-
}
|
|
2821
|
-
if (filters?.callId?.trim()) {
|
|
2822
|
-
const callId = filters.callId.trim().toLowerCase();
|
|
2823
|
-
rows = rows.filter((a) => (a.callId || '').toLowerCase() === callId);
|
|
2824
|
-
}
|
|
2825
|
-
if (filters?.search?.trim()) {
|
|
2826
|
-
const needle = filters.search.trim().toLowerCase();
|
|
2827
|
-
rows = rows.filter((a) => [a.title, a.detail, a.patientName, a.callId, a.type]
|
|
2828
|
-
.filter(Boolean)
|
|
2829
|
-
.join(' ')
|
|
2830
|
-
.toLowerCase()
|
|
2831
|
-
.includes(needle));
|
|
2832
|
-
}
|
|
2833
|
-
return this.paginate(rows, filters?.page, filters?.limit);
|
|
2834
|
-
}
|
|
2835
|
-
getSetup() {
|
|
2836
|
-
return this.mock(SEED_SETUP);
|
|
2837
|
-
}
|
|
2838
|
-
activateSetup() {
|
|
2839
|
-
return this.mock({ success: true });
|
|
2840
|
-
}
|
|
2841
|
-
getLocations() {
|
|
2842
|
-
return this.mock(SEED_LOCATIONS);
|
|
2843
|
-
}
|
|
2844
|
-
getProviders() {
|
|
2845
|
-
return this.mock(SEED_PROVIDERS);
|
|
2846
|
-
}
|
|
2847
|
-
getStreamLines() {
|
|
2848
|
-
return getStreamingLines();
|
|
2849
|
-
}
|
|
2850
|
-
appendStreamLine(callId, line) {
|
|
2851
|
-
this.patchLive(callId, (c) => ({
|
|
2852
|
-
...c,
|
|
2853
|
-
transcript: [...c.transcript, line],
|
|
2854
|
-
}));
|
|
2855
|
-
}
|
|
2856
|
-
usesMockStreaming() {
|
|
2857
|
-
return true;
|
|
2858
|
-
}
|
|
2859
|
-
getCallApiLogs(callId) {
|
|
2860
|
-
const template = SEED_CALL_API_LOGS[callId] ?? SEED_CALL_API_LOGS['LC-4821'] ?? [];
|
|
2861
|
-
const items = template.map((row) => ({ ...row, callId }));
|
|
2862
|
-
return of({ items: structuredClone(items), total: items.length }).pipe(delay(MOCK_DELAY_MS));
|
|
2863
|
-
}
|
|
2864
|
-
getApiLogs(filters = {}) {
|
|
2865
|
-
let rows = allSeedLogs();
|
|
2866
|
-
if (filters.callId) {
|
|
2867
|
-
rows = rows.filter((r) => r.callId === filters.callId);
|
|
2868
|
-
}
|
|
2869
|
-
if (filters.provider) {
|
|
2870
|
-
const providers = filters.provider.split(',').filter(Boolean);
|
|
2871
|
-
rows = rows.filter((r) => providers.includes(r.provider));
|
|
2872
|
-
}
|
|
2873
|
-
if (filters.success !== undefined) {
|
|
2874
|
-
rows = rows.filter((r) => r.success === filters.success);
|
|
2875
|
-
}
|
|
2876
|
-
if (filters.statusCode != null) {
|
|
2877
|
-
rows = rows.filter((r) => r.statusCode === filters.statusCode);
|
|
2878
|
-
}
|
|
2879
|
-
if (filters.operation) {
|
|
2880
|
-
const op = filters.operation.toLowerCase();
|
|
2881
|
-
rows = rows.filter((r) => r.operation.toLowerCase().includes(op));
|
|
2882
|
-
}
|
|
2883
|
-
if (filters.search) {
|
|
2884
|
-
const q = filters.search.toLowerCase();
|
|
2885
|
-
rows = rows.filter((r) => r.operation.toLowerCase().includes(q) ||
|
|
2886
|
-
r.urlPath.toLowerCase().includes(q) ||
|
|
2887
|
-
(r.errorMessage?.toLowerCase().includes(q) ?? false) ||
|
|
2888
|
-
(r.toolName?.toLowerCase().includes(q) ?? false));
|
|
2889
|
-
}
|
|
2890
|
-
if (filters.from) {
|
|
2891
|
-
const from = Date.parse(filters.from);
|
|
2892
|
-
rows = rows.filter((r) => Date.parse(r.startedAt) >= from);
|
|
2893
|
-
}
|
|
2894
|
-
if (filters.to) {
|
|
2895
|
-
const to = Date.parse(filters.to);
|
|
2896
|
-
rows = rows.filter((r) => Date.parse(r.startedAt) <= to);
|
|
2897
|
-
}
|
|
2898
|
-
if (filters.practiceId) {
|
|
2899
|
-
rows = rows.filter((r) => (r.clientPracticeId ?? '') === filters.practiceId);
|
|
2900
|
-
}
|
|
2901
|
-
rows = [...rows].sort((a, b) => Date.parse(b.startedAt) - Date.parse(a.startedAt));
|
|
2902
|
-
const page = filters.page ?? 1;
|
|
2903
|
-
const limit = filters.limit ?? 50;
|
|
2904
|
-
const start = (page - 1) * limit;
|
|
2905
|
-
const items = rows.slice(start, start + limit);
|
|
2906
|
-
return of({
|
|
2907
|
-
items,
|
|
2908
|
-
total: rows.length,
|
|
2909
|
-
page,
|
|
2910
|
-
limit,
|
|
2911
|
-
practiceId: filters.practiceId ?? null,
|
|
2912
|
-
}).pipe(delay(MOCK_DELAY_MS));
|
|
2913
|
-
}
|
|
2914
|
-
getApiLogDetail(logId) {
|
|
2915
|
-
const detail = SEED_API_LOG_DETAILS[logId];
|
|
2916
|
-
if (detail) {
|
|
2917
|
-
return this.mock(structuredClone(detail));
|
|
2918
|
-
}
|
|
2919
|
-
const listItem = allSeedLogs().find((r) => r.id === logId);
|
|
2920
|
-
if (!listItem) {
|
|
2921
|
-
return of({ data: null }).pipe(delay(MOCK_DELAY_MS));
|
|
2922
|
-
}
|
|
2923
|
-
const fallback = {
|
|
2924
|
-
...listItem,
|
|
2925
|
-
traceId: null,
|
|
2926
|
-
requestBody: listItem.requestPreview ? { preview: listItem.requestPreview } : null,
|
|
2927
|
-
responseBody: listItem.responsePreview ? { preview: listItem.responsePreview } : null,
|
|
2928
|
-
metadata: null,
|
|
2929
|
-
completedAt: listItem.startedAt,
|
|
2930
|
-
};
|
|
2931
|
-
return this.mock(fallback);
|
|
2932
|
-
}
|
|
2933
|
-
getApiLogStats() {
|
|
2934
|
-
return this.mock(structuredClone(SEED_API_LOG_STATS));
|
|
2935
|
-
}
|
|
2936
|
-
getOutboundPurposes(includeInactive = false) {
|
|
2937
|
-
let rows = [...this.outboundPurposes()].sort((a, b) => a.sortOrder - b.sortOrder);
|
|
2938
|
-
if (!includeInactive) {
|
|
2939
|
-
rows = rows.filter((p) => p.isActive);
|
|
2940
|
-
}
|
|
2941
|
-
return of({ purposes: structuredClone(rows) }).pipe(delay(MOCK_DELAY_MS));
|
|
2942
|
-
}
|
|
2943
|
-
createOutboundPurpose(body) {
|
|
2944
|
-
const purpose = {
|
|
2945
|
-
purposeId: `purpose-${Date.now()}`,
|
|
2946
|
-
label: body.label,
|
|
2947
|
-
description: body.description ?? '',
|
|
2948
|
-
sampleOpening: body.sampleOpening ?? '',
|
|
2949
|
-
openingTemplate: body.openingTemplate,
|
|
2950
|
-
agentContextHint: body.agentContextHint ?? null,
|
|
2951
|
-
requiredFields: body.requiredFields,
|
|
2952
|
-
allowsCustomScript: body.allowsCustomScript ?? false,
|
|
2953
|
-
isSystem: false,
|
|
2954
|
-
isActive: true,
|
|
2955
|
-
sortOrder: body.sortOrder ?? this.outboundPurposes().length + 1,
|
|
2956
|
-
placeholders: structuredClone(DEFAULT_PLACEHOLDERS),
|
|
2957
|
-
};
|
|
2958
|
-
this.outboundPurposes.update((list) => [...list, purpose]);
|
|
2959
|
-
return of(structuredClone(purpose)).pipe(delay(MOCK_DELAY_MS));
|
|
2960
|
-
}
|
|
2961
|
-
updateOutboundPurpose(purposeId, body) {
|
|
2962
|
-
let updated = null;
|
|
2963
|
-
this.outboundPurposes.update((list) => list.map((p) => {
|
|
2964
|
-
if (p.purposeId !== purposeId)
|
|
2965
|
-
return p;
|
|
2966
|
-
updated = {
|
|
2967
|
-
...p,
|
|
2968
|
-
...body,
|
|
2969
|
-
label: body.label ?? p.label,
|
|
2970
|
-
description: body.description ?? p.description,
|
|
2971
|
-
sampleOpening: body.sampleOpening ?? p.sampleOpening,
|
|
2972
|
-
openingTemplate: body.openingTemplate ?? p.openingTemplate,
|
|
2973
|
-
agentContextHint: body.agentContextHint !== undefined ? body.agentContextHint : p.agentContextHint,
|
|
2974
|
-
requiredFields: body.requiredFields ?? p.requiredFields,
|
|
2975
|
-
allowsCustomScript: body.allowsCustomScript ?? p.allowsCustomScript,
|
|
2976
|
-
isActive: body.isActive ?? p.isActive,
|
|
2977
|
-
sortOrder: body.sortOrder ?? p.sortOrder,
|
|
2978
|
-
};
|
|
2979
|
-
return updated;
|
|
2980
|
-
}));
|
|
2981
|
-
if (!updated) {
|
|
2982
|
-
return throwError(() => new Error('Purpose not found'));
|
|
2983
|
-
}
|
|
2984
|
-
const saved = updated;
|
|
2985
|
-
return of(structuredClone(saved)).pipe(delay(MOCK_DELAY_MS));
|
|
2986
|
-
}
|
|
2987
|
-
deleteOutboundPurpose(purposeId) {
|
|
2988
|
-
const target = this.outboundPurposes().find((p) => p.purposeId === purposeId);
|
|
2989
|
-
if (!target) {
|
|
2990
|
-
return of({ success: false }).pipe(delay(MOCK_DELAY_MS));
|
|
2991
|
-
}
|
|
2992
|
-
if (target.isSystem) {
|
|
2993
|
-
return of({ success: false }).pipe(delay(MOCK_DELAY_MS));
|
|
2994
|
-
}
|
|
2995
|
-
this.outboundPurposes.update((list) => list.filter((p) => p.purposeId !== purposeId));
|
|
2996
|
-
return of({ success: true }).pipe(delay(MOCK_DELAY_MS));
|
|
2997
|
-
}
|
|
2998
|
-
placeOutboundCall(body) {
|
|
2999
|
-
const idHint = body.appointmentId
|
|
3000
|
-
? ` (appt ${body.appointmentId})`
|
|
3001
|
-
: body.patientId
|
|
3002
|
-
? ` (patient ${body.patientId})`
|
|
3003
|
-
: '';
|
|
3004
|
-
return of({
|
|
3005
|
-
success: true,
|
|
3006
|
-
callId: `LC-${Math.floor(4800 + Math.random() * 100)}`,
|
|
3007
|
-
message: `Outbound call started to ${body.phone}${idHint}`,
|
|
3008
|
-
}).pipe(delay(MOCK_DELAY_MS));
|
|
3009
|
-
}
|
|
3010
|
-
searchPatientsForOutbound(q, limit = 10) {
|
|
3011
|
-
const needle = q.trim().toLowerCase();
|
|
3012
|
-
const digits = q.replace(/\D/g, '');
|
|
3013
|
-
const hits = [
|
|
3014
|
-
{
|
|
3015
|
-
patientId: 'pat-1001',
|
|
3016
|
-
firstName: 'Maria',
|
|
3017
|
-
lastName: 'Garcia',
|
|
3018
|
-
fullName: 'Maria Garcia',
|
|
3019
|
-
phone: '+14155550100',
|
|
3020
|
-
dob: '1988-04-12',
|
|
3021
|
-
},
|
|
3022
|
-
{
|
|
3023
|
-
patientId: 'pat-1002',
|
|
3024
|
-
firstName: 'James',
|
|
3025
|
-
lastName: 'Chen',
|
|
3026
|
-
fullName: 'James Chen',
|
|
3027
|
-
phone: '+14155550122',
|
|
3028
|
-
dob: '1975-11-03',
|
|
3029
|
-
},
|
|
3030
|
-
{
|
|
3031
|
-
patientId: 'pat-1003',
|
|
3032
|
-
firstName: 'Aisha',
|
|
3033
|
-
lastName: 'Patel',
|
|
3034
|
-
fullName: 'Aisha Patel',
|
|
3035
|
-
phone: '+14155550987',
|
|
3036
|
-
dob: '1992-07-21',
|
|
3037
|
-
},
|
|
3038
|
-
].filter((p) => {
|
|
3039
|
-
if (!needle)
|
|
3040
|
-
return false;
|
|
3041
|
-
const hay = `${p.fullName} ${p.phone} ${p.patientId}`.toLowerCase();
|
|
3042
|
-
return hay.includes(needle) || (!!digits && (p.phone ?? '').includes(digits));
|
|
3043
|
-
});
|
|
3044
|
-
return of(hits.slice(0, limit)).pipe(delay(MOCK_DELAY_MS));
|
|
3045
|
-
}
|
|
3046
|
-
listPatientAppointmentsForOutbound(patientId, limit = 20) {
|
|
3047
|
-
const now = Date.now();
|
|
3048
|
-
const day = 24 * 60 * 60 * 1000;
|
|
3049
|
-
const all = [
|
|
3050
|
-
{
|
|
3051
|
-
appointmentId: `appt-${patientId}-1`,
|
|
3052
|
-
startTime: new Date(now + 2 * day).toISOString(),
|
|
3053
|
-
endTime: new Date(now + 2 * day + 30 * 60 * 1000).toISOString(),
|
|
3054
|
-
providerName: 'Dr. Patel',
|
|
3055
|
-
locationName: 'Main Clinic',
|
|
3056
|
-
status: 'scheduled',
|
|
3057
|
-
visitType: 'Follow-up',
|
|
3058
|
-
},
|
|
3059
|
-
{
|
|
3060
|
-
appointmentId: `appt-${patientId}-2`,
|
|
3061
|
-
startTime: new Date(now + 9 * day).toISOString(),
|
|
3062
|
-
endTime: new Date(now + 9 * day + 45 * 60 * 1000).toISOString(),
|
|
3063
|
-
providerName: 'Dr. Nguyen',
|
|
3064
|
-
locationName: 'West Wing',
|
|
3065
|
-
status: 'confirmed',
|
|
3066
|
-
visitType: 'Annual wellness',
|
|
3067
|
-
},
|
|
3068
|
-
];
|
|
3069
|
-
return of(all.slice(0, limit)).pipe(delay(MOCK_DELAY_MS));
|
|
3070
|
-
}
|
|
3071
|
-
patchLive(id, fn) {
|
|
3072
|
-
this.liveCalls.update((calls) => calls.map((c) => (c.id === id ? fn(structuredClone(c)) : c)));
|
|
3073
|
-
}
|
|
3074
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AiReceptionistApiMockService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3075
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AiReceptionistApiMockService, providedIn: 'root' }); }
|
|
3076
|
-
}
|
|
3077
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AiReceptionistApiMockService, decorators: [{
|
|
3078
|
-
type: Injectable,
|
|
3079
|
-
args: [{ providedIn: 'root' }]
|
|
3080
|
-
}] });
|
|
3081
|
-
|
|
3082
|
-
class AiReceptionistApiService {
|
|
3083
|
-
constructor() {
|
|
3084
|
-
this.http = inject(HttpClient);
|
|
3085
|
-
this.mock = inject(AiReceptionistApiMockService);
|
|
3086
|
-
this.config = inject(VOICE_RECEPTIONIST_CONFIG);
|
|
3087
|
-
this.paths = createVoiceReceptionistPaths(this.config);
|
|
3088
|
-
this.arBase = this.paths.aiReceptionistPath();
|
|
3089
|
-
}
|
|
3090
|
-
get useMock() {
|
|
3091
|
-
return !!this.config.useMockApi;
|
|
3092
|
-
}
|
|
3093
|
-
getStatus() {
|
|
3094
|
-
if (this.useMock)
|
|
3095
|
-
return this.mock.getStatus();
|
|
3096
|
-
return this.http.get(`${this.arBase}/status`).pipe(map((body) => ({ data: mapStatusDto(body) })), catchError((err) => throwError(() => ({
|
|
3097
|
-
message: this.apiErrorMessage(err, 'Failed to load agent status.'),
|
|
3098
|
-
status: err.status,
|
|
3099
|
-
}))));
|
|
3100
|
-
}
|
|
3101
|
-
/** Prefer this for the dashboard On/Off switch — PUT { enabled }. */
|
|
3102
|
-
setAgentOnline(enabled) {
|
|
3103
|
-
if (this.useMock) {
|
|
3104
|
-
this.mock.setAgentOn(enabled);
|
|
3105
|
-
return this.mock.getStatus();
|
|
3106
|
-
}
|
|
3107
|
-
return this.http
|
|
3108
|
-
.put(`${this.arBase}/agent-online`, { enabled })
|
|
3109
|
-
.pipe(map((body) => ({ data: mapStatusDto(body) })), catchError((err) => throwError(() => ({
|
|
3110
|
-
message: this.apiErrorMessage(err, 'Failed to update agent online status.'),
|
|
3111
|
-
status: err.status,
|
|
3112
|
-
}))));
|
|
3113
|
-
}
|
|
3114
|
-
/** @deprecated Prefer setAgentOnline — kept for setup wizard activate flow. */
|
|
3115
|
-
setAgentOn(on) {
|
|
3116
|
-
if (this.useMock) {
|
|
3117
|
-
this.mock.setAgentOn(on);
|
|
3118
|
-
return;
|
|
3119
|
-
}
|
|
3120
|
-
const path = on ? 'activate' : 'deactivate';
|
|
3121
|
-
this.http.post(`${this.arBase}/${path}`, {}).subscribe();
|
|
3122
|
-
}
|
|
3123
|
-
getDashboard() {
|
|
3124
|
-
if (this.useMock)
|
|
3125
|
-
return this.mock.getDashboard();
|
|
3126
|
-
return forkJoin({
|
|
3127
|
-
summary: this.http.get(`${this.arBase}/dashboard/summary`),
|
|
3128
|
-
history: this.http.get(`${this.arBase}/calls/history`, {
|
|
3129
|
-
params: new HttpParams().set('page', '1').set('limit', '5'),
|
|
3130
|
-
}),
|
|
3131
|
-
tasks: this.http
|
|
3132
|
-
.get(`${this.arBase}/tasks`, {
|
|
3133
|
-
params: new HttpParams().set('source', 'voice').set('limit', '5'),
|
|
3134
|
-
})
|
|
3135
|
-
.pipe(catchError(() => of([]))),
|
|
3136
|
-
appointments: this.http
|
|
3137
|
-
.get(`${this.arBase}/dashboard/appointments`, { params: new HttpParams().set('limit', '5') })
|
|
3138
|
-
.pipe(catchError(() => of([]))),
|
|
3139
|
-
}).pipe(map(({ summary, history, tasks, appointments }) => ({
|
|
3140
|
-
data: {
|
|
3141
|
-
stats: mapDashboardSummaryDto(summary),
|
|
3142
|
-
liveCalls: [],
|
|
3143
|
-
latestTasks: asTaskList(tasks)
|
|
3144
|
-
.map(mapTaskDto)
|
|
3145
|
-
.sort((a, b) => b.created - a.created)
|
|
3146
|
-
.slice(0, 5),
|
|
3147
|
-
latestAppointments: (Array.isArray(appointments)
|
|
3148
|
-
? appointments
|
|
3149
|
-
: appointments.items ?? []).map(mapAiCreatedAppointmentDto),
|
|
3150
|
-
recentHistory: asHistoryList(history).map(mapHistoryCallDto),
|
|
3151
|
-
},
|
|
3152
|
-
})));
|
|
3153
|
-
}
|
|
3154
|
-
getLiveCalls() {
|
|
3155
|
-
if (this.useMock)
|
|
3156
|
-
return this.mock.getLiveCalls();
|
|
3157
|
-
return this.http.get(`${this.arBase}/calls/live`).pipe(map((body) => ({ data: asLiveCallList(body).map(mapLiveCallDto) })));
|
|
3158
|
-
}
|
|
3159
|
-
getLiveCall(id) {
|
|
3160
|
-
if (this.useMock)
|
|
3161
|
-
return this.mock.getLiveCall(id);
|
|
3162
|
-
const enc = encodeURIComponent(id);
|
|
3163
|
-
return this.http.get(`${this.arBase}/calls/${enc}`).pipe(map((dto) => ({ data: dto?.id ? mapLiveCallDto(dto) : null })), catchError(() => of({ data: null })));
|
|
3164
|
-
}
|
|
3165
|
-
getCallTranscript(id) {
|
|
3166
|
-
if (this.useMock)
|
|
3167
|
-
return this.mock.getCallTranscript(id);
|
|
3168
|
-
const enc = encodeURIComponent(id);
|
|
3169
|
-
return this.http.get(`${this.arBase}/calls/${enc}/transcript`).pipe(map((body) => ({ data: asTranscriptList(body).map(mapTranscriptLine) })), catchError(() => of({ data: [] })));
|
|
3170
|
-
}
|
|
3171
|
-
getCallSummary(id) {
|
|
3172
|
-
if (this.useMock)
|
|
3173
|
-
return this.mock.getCallSummary(id);
|
|
3174
|
-
const enc = encodeURIComponent(id);
|
|
3175
|
-
return this.http.get(`${this.arBase}/calls/${enc}/summary`).pipe(map((dto) => ({
|
|
3176
|
-
data: dto
|
|
3177
|
-
? {
|
|
3178
|
-
summary: dto.summary ?? '',
|
|
3179
|
-
transcript: (dto.transcript ?? []).map(mapTranscriptLine),
|
|
3180
|
-
tools: (dto.tools ?? []).map(mapToolEvent),
|
|
3181
|
-
}
|
|
3182
|
-
: null,
|
|
3183
|
-
})), catchError(() => of({ data: null })));
|
|
3184
|
-
}
|
|
3185
|
-
getCallRecording(callId) {
|
|
3186
|
-
if (this.useMock)
|
|
3187
|
-
return this.mock.getCallRecording(callId);
|
|
3188
|
-
const enc = encodeURIComponent(callId);
|
|
3189
|
-
return this.http.get(`${this.arBase}/calls/${enc}/recording`).pipe(map((dto) => mapRecordingMeta(dto)), catchError(() => of({
|
|
3190
|
-
callId,
|
|
3191
|
-
status: 'unavailable',
|
|
3192
|
-
url: null,
|
|
3193
|
-
message: 'No recording available for this call',
|
|
3194
|
-
})));
|
|
3195
|
-
}
|
|
3196
|
-
/** Fetch audio bytes with JWT (interceptor). Pass relative path from metadata.url. */
|
|
3197
|
-
getCallRecordingBlob(audioPath) {
|
|
3198
|
-
if (this.useMock)
|
|
3199
|
-
return this.mock.getCallRecordingBlob();
|
|
3200
|
-
const url = audioPath.startsWith('http') ? audioPath : `${this.paths.apiRoot()}${audioPath}`;
|
|
3201
|
-
return this.http.get(url, { responseType: 'blob' });
|
|
3202
|
-
}
|
|
3203
|
-
getHistory(filters) {
|
|
3204
|
-
if (this.useMock)
|
|
3205
|
-
return this.mock.getHistory(filters);
|
|
3206
|
-
const page = filters?.page ?? 1;
|
|
3207
|
-
const limit = filters?.limit ?? DEFAULT_PAGE_SIZE;
|
|
3208
|
-
let params = new HttpParams().set('page', String(page)).set('limit', String(limit));
|
|
3209
|
-
if (filters?.q)
|
|
3210
|
-
params = params.set('search', filters.q);
|
|
3211
|
-
if (filters?.dir)
|
|
3212
|
-
params = params.set('direction', filters.dir);
|
|
3213
|
-
if (filters?.outcome)
|
|
3214
|
-
params = params.set('outcome', filters.outcome);
|
|
3215
|
-
if (filters?.location)
|
|
3216
|
-
params = params.set('location', filters.location);
|
|
3217
|
-
if (filters?.review)
|
|
3218
|
-
params = params.set('review', filters.review);
|
|
3219
|
-
return this.http.get(`${this.arBase}/calls/history`, { params }).pipe(map((body) => {
|
|
3220
|
-
const pageResult = asPaginatedResult(body, page, limit);
|
|
3221
|
-
return {
|
|
3222
|
-
...pageResult,
|
|
3223
|
-
items: pageResult.items.map(mapHistoryCallDto),
|
|
3224
|
-
};
|
|
3225
|
-
}));
|
|
3226
|
-
}
|
|
3227
|
-
getCallDetail(id) {
|
|
3228
|
-
if (this.useMock)
|
|
3229
|
-
return this.mock.getCallDetail(id);
|
|
3230
|
-
const enc = encodeURIComponent(id);
|
|
3231
|
-
return forkJoin({
|
|
3232
|
-
call: this.http.get(`${this.arBase}/calls/${enc}`),
|
|
3233
|
-
summary: this.http.get(`${this.arBase}/calls/${enc}/summary`),
|
|
3234
|
-
recording: this.http
|
|
3235
|
-
.get(`${this.arBase}/calls/${enc}/recording`)
|
|
3236
|
-
.pipe(catchError(() => of({ callId: id, url: null, message: '' }))),
|
|
3237
|
-
}).pipe(map(({ call, summary, recording }) => {
|
|
3238
|
-
if (!isHistoryCallDto(call))
|
|
3239
|
-
return { data: null };
|
|
3240
|
-
return {
|
|
3241
|
-
data: mapHistoryDetailDto(call, summary, recording?.url),
|
|
3242
|
-
};
|
|
3243
|
-
}), catchError(() => of({ data: null })));
|
|
3244
|
-
}
|
|
3245
|
-
regenerateCallSummary(callId) {
|
|
3246
|
-
if (this.useMock)
|
|
3247
|
-
return this.mock.regenerateCallSummary(callId);
|
|
3248
|
-
const enc = encodeURIComponent(callId);
|
|
3249
|
-
return this.http
|
|
3250
|
-
.post(`${this.arBase}/calls/${enc}/summary/regenerate`, {})
|
|
3251
|
-
.pipe(map((body) => ({ data: mapRegenerateSummaryResponse(body) })), catchError((err) => throwError(() => ({
|
|
3252
|
-
message: this.apiErrorMessage(err, 'Failed to regenerate summary.'),
|
|
3253
|
-
status: err.status,
|
|
3254
|
-
}))));
|
|
3255
|
-
}
|
|
3256
|
-
/**
|
|
3257
|
-
* Staff softphone join into LiveKit room `call-{callId}`.
|
|
3258
|
-
* POST /calls/:id/media/join { mode: listen|takeover }
|
|
3259
|
-
*/
|
|
3260
|
-
postMediaJoin(id, mode) {
|
|
3261
|
-
if (this.useMock)
|
|
3262
|
-
return this.mock.postMediaJoin(id, mode);
|
|
3263
|
-
const enc = encodeURIComponent(id);
|
|
3264
|
-
return this.http
|
|
3265
|
-
.post(`${this.arBase}/calls/${enc}/media/join`, { mode })
|
|
3266
|
-
.pipe(map((body) => {
|
|
3267
|
-
const data = mapStaffMediaJoinResult(body);
|
|
3268
|
-
if (!data) {
|
|
3269
|
-
throw new Error('media/join response missing livekitUrl or clientToken');
|
|
3270
|
-
}
|
|
3271
|
-
return { data: { ...data, callId: data.callId || id, mode } };
|
|
3272
|
-
}), catchError((err) => throwError(() => new Error(this.apiErrorMessage(err, 'Failed to join call media')))));
|
|
3273
|
-
}
|
|
3274
|
-
/** Drop staff WebRTC only; does not hang up the patient. */
|
|
3275
|
-
postMediaLeave(id) {
|
|
3276
|
-
if (this.useMock)
|
|
3277
|
-
return this.mock.postMediaLeave(id);
|
|
3278
|
-
const enc = encodeURIComponent(id);
|
|
3279
|
-
return this.http
|
|
3280
|
-
.post(`${this.arBase}/calls/${enc}/media/leave`, {})
|
|
3281
|
-
.pipe(map(() => ({ data: { success: true } })));
|
|
3282
|
-
}
|
|
3283
|
-
/**
|
|
3284
|
-
* Take over — same join payload as media/join { mode: takeover }.
|
|
3285
|
-
* Prefer this or postMediaJoin('takeover'); both are supported by BE.
|
|
3286
|
-
*/
|
|
3287
|
-
postTakeover(id) {
|
|
3288
|
-
if (this.useMock)
|
|
3289
|
-
return this.mock.postMediaJoin(id, 'takeover');
|
|
3290
|
-
const enc = encodeURIComponent(id);
|
|
3291
|
-
return this.http.post(`${this.arBase}/calls/${enc}/takeover`, {}).pipe(map((body) => {
|
|
3292
|
-
const data = mapStaffMediaJoinResult(body);
|
|
3293
|
-
if (!data) {
|
|
3294
|
-
throw new Error('takeover response missing livekitUrl or clientToken');
|
|
3295
|
-
}
|
|
3296
|
-
const mode = 'takeover';
|
|
3297
|
-
return { data: { ...data, callId: data.callId || id, mode } };
|
|
3298
|
-
}), catchError((err) => throwError(() => new Error(this.apiErrorMessage(err, 'Failed to take over call')))));
|
|
3299
|
-
}
|
|
3300
|
-
postResumeAi(id) {
|
|
3301
|
-
if (this.useMock)
|
|
3302
|
-
return this.mock.postResumeAi(id);
|
|
3303
|
-
return this.postCallAction(id, 'resume-ai');
|
|
3304
|
-
}
|
|
3305
|
-
postPause(id) {
|
|
3306
|
-
if (this.useMock)
|
|
3307
|
-
return this.mock.postPause(id);
|
|
3308
|
-
return this.postCallAction(id, 'pause');
|
|
3309
|
-
}
|
|
3310
|
-
postResume(id) {
|
|
3311
|
-
if (this.useMock)
|
|
3312
|
-
return this.mock.postResume(id);
|
|
3313
|
-
return this.postCallAction(id, 'resume');
|
|
3314
|
-
}
|
|
3315
|
-
/** Listen — same join payload as media/join { mode: listen }. */
|
|
3316
|
-
postListen(id) {
|
|
3317
|
-
if (this.useMock)
|
|
3318
|
-
return this.mock.postMediaJoin(id, 'listen');
|
|
3319
|
-
const enc = encodeURIComponent(id);
|
|
3320
|
-
return this.http.post(`${this.arBase}/calls/${enc}/listen`, {}).pipe(map((body) => {
|
|
3321
|
-
const data = mapStaffMediaJoinResult(body);
|
|
3322
|
-
if (!data) {
|
|
3323
|
-
throw new Error('listen response missing livekitUrl or clientToken');
|
|
3324
|
-
}
|
|
3325
|
-
const mode = 'listen';
|
|
3326
|
-
return { data: { ...data, callId: data.callId || id, mode } };
|
|
3327
|
-
}), catchError((err) => throwError(() => new Error(this.apiErrorMessage(err, 'Failed to listen to call')))));
|
|
3328
|
-
}
|
|
3329
|
-
postTransfer(id) {
|
|
3330
|
-
if (this.useMock)
|
|
3331
|
-
return this.mock.postTransfer(id);
|
|
3332
|
-
return this.postCallAction(id, 'transfer');
|
|
3333
|
-
}
|
|
3334
|
-
postEnd(id) {
|
|
3335
|
-
if (this.useMock)
|
|
3336
|
-
return this.mock.postEnd(id);
|
|
3337
|
-
const enc = encodeURIComponent(id);
|
|
3338
|
-
return this.http
|
|
3339
|
-
.post(`${this.arBase}/calls/${enc}/end`, {})
|
|
3340
|
-
.pipe(map(() => ({ data: { success: true } })));
|
|
3341
|
-
}
|
|
3342
|
-
postMessage(id, text) {
|
|
3343
|
-
if (this.useMock)
|
|
3344
|
-
return this.mock.postMessage(id, text);
|
|
3345
|
-
const enc = encodeURIComponent(id);
|
|
3346
|
-
return this.http
|
|
3347
|
-
.post(`${this.arBase}/calls/${enc}/messages`, { text })
|
|
3348
|
-
.pipe(map(() => ({ data: { success: true } })));
|
|
3349
|
-
}
|
|
3350
|
-
postReview(id) {
|
|
3351
|
-
if (this.useMock)
|
|
3352
|
-
return this.mock.postReview(id);
|
|
3353
|
-
const enc = encodeURIComponent(id);
|
|
3354
|
-
return this.http
|
|
3355
|
-
.post(`${this.arBase}/calls/${enc}/review`, {})
|
|
3356
|
-
.pipe(map(() => ({ data: { review: 'reviewed' } })));
|
|
3357
|
-
}
|
|
3358
|
-
getTasks(filters) {
|
|
3359
|
-
if (this.useMock)
|
|
3360
|
-
return this.mock.getTasks(filters);
|
|
3361
|
-
const page = filters?.page ?? 1;
|
|
3362
|
-
const limit = filters?.limit ?? DEFAULT_PAGE_SIZE;
|
|
3363
|
-
let params = new HttpParams().set('page', String(page)).set('limit', String(limit));
|
|
3364
|
-
if (filters?.status) {
|
|
3365
|
-
const apiStatus = filters.status === 'in_progress' ? 'in-progress' : filters.status;
|
|
3366
|
-
params = params.set('status', apiStatus);
|
|
3367
|
-
}
|
|
3368
|
-
if (filters?.type)
|
|
3369
|
-
params = params.set('type', filters.type);
|
|
3370
|
-
if (filters?.source)
|
|
3371
|
-
params = params.set('source', filters.source);
|
|
3372
|
-
if (filters?.callId)
|
|
3373
|
-
params = params.set('callId', filters.callId);
|
|
3374
|
-
return this.http.get(`${this.arBase}/tasks`, { params }).pipe(map((body) => {
|
|
3375
|
-
const pageResult = asPaginatedResult(body, page, limit);
|
|
3376
|
-
return {
|
|
3377
|
-
...pageResult,
|
|
3378
|
-
items: pageResult.items.map(mapTaskDto),
|
|
3379
|
-
};
|
|
3380
|
-
}));
|
|
3381
|
-
}
|
|
3382
|
-
getCallTasks(callId) {
|
|
3383
|
-
if (this.useMock)
|
|
3384
|
-
return this.mock.getCallTasks(callId);
|
|
3385
|
-
const enc = encodeURIComponent(callId);
|
|
3386
|
-
return this.http.get(`${this.arBase}/calls/${enc}/tasks`).pipe(map((body) => ({ data: asTaskList(body).map(mapTaskDto) })));
|
|
3387
|
-
}
|
|
3388
|
-
createTask(req) {
|
|
3389
|
-
if (this.useMock)
|
|
3390
|
-
return this.mock.createTask(req);
|
|
3391
|
-
return this.http
|
|
3392
|
-
.post(`${this.arBase}/tasks`, mapCreateTaskRequest(req))
|
|
3393
|
-
.pipe(map((body) => ({ data: mapTaskDto(body) })));
|
|
3394
|
-
}
|
|
3395
|
-
patchTask(id, status) {
|
|
3396
|
-
if (this.useMock)
|
|
3397
|
-
return this.mock.patchTask(id, status);
|
|
3398
|
-
const enc = encodeURIComponent(id);
|
|
3399
|
-
return this.http
|
|
3400
|
-
.patch(`${this.arBase}/tasks/${enc}`, { status: toApiTaskStatus(status) })
|
|
3401
|
-
.pipe(map((body) => ({ data: mapTaskDto(body) })));
|
|
3402
|
-
}
|
|
3403
|
-
getAnalytics(range) {
|
|
3404
|
-
if (this.useMock)
|
|
3405
|
-
return this.mock.getAnalytics(range);
|
|
3406
|
-
const params = new HttpParams().set('range', range);
|
|
3407
|
-
return this.http.get(`${this.arBase}/analytics/summary`, { params }).pipe(map((body) => ({ data: mapAnalyticsDto(body, range) })));
|
|
3408
|
-
}
|
|
3409
|
-
getSettings() {
|
|
3410
|
-
if (this.useMock)
|
|
3411
|
-
return this.mock.getSettings();
|
|
3412
|
-
return forkJoin({
|
|
3413
|
-
settings: this.http.get(`${this.arBase}/settings`),
|
|
3414
|
-
safety: this.http.get(`${this.arBase}/settings/safety-checks`),
|
|
3415
|
-
}).pipe(map(({ settings, safety }) => ({
|
|
3416
|
-
data: mapSettingsResponse(settings, safety),
|
|
3417
|
-
})));
|
|
3418
|
-
}
|
|
3419
|
-
putSettings(next) {
|
|
3420
|
-
if (this.useMock)
|
|
3421
|
-
return this.mock.putSettings(next);
|
|
3422
|
-
return this.http
|
|
3423
|
-
.put(`${this.arBase}/settings`, { settings: mapSettingsToRequest(next) })
|
|
3424
|
-
.pipe(switchMap(() => this.getSettings()), catchError((err) => throwError(() => new Error(this.apiErrorMessage(err, 'Failed to save agent settings')))));
|
|
3425
|
-
}
|
|
3426
|
-
/** Shipped default voice system prompt + max lengths. */
|
|
3427
|
-
getVoicePromptDefault() {
|
|
3428
|
-
if (this.useMock)
|
|
3429
|
-
return this.mock.getVoicePromptDefault();
|
|
3430
|
-
return this.http.get(`${this.arBase}/settings/voice-prompt-default`).pipe(map((body) => ({
|
|
3431
|
-
defaultVoiceSystemPrompt: String(body?.defaultVoiceSystemPrompt ?? ''),
|
|
3432
|
-
voiceSystemPromptMaxLength: Number(body?.voiceSystemPromptMaxLength) || 24000,
|
|
3433
|
-
customVoiceInstructionsMaxLength: Number(body?.customVoiceInstructionsMaxLength) || 8000,
|
|
3434
|
-
notes: body?.notes ? String(body.notes) : undefined,
|
|
3435
|
-
})));
|
|
3436
|
-
}
|
|
3437
|
-
/** ElevenLabs spoken sample for Agent Settings voice picker. */
|
|
3438
|
-
previewVoice(voiceId) {
|
|
3439
|
-
if (this.useMock)
|
|
3440
|
-
return this.mock.previewVoice(voiceId);
|
|
3441
|
-
return this.http.post(`${this.arBase}/settings/preview-voice`, { voiceId }, {
|
|
3442
|
-
responseType: 'blob',
|
|
3443
|
-
});
|
|
3444
|
-
}
|
|
3445
|
-
/**
|
|
3446
|
-
* Knowledge Base test: draft an answer from whatToSay / whatNotToSay and
|
|
3447
|
-
* return spoken audio in the practice (or selected) voice.
|
|
3448
|
-
*/
|
|
3449
|
-
testKnowledgeAnswer(params) {
|
|
3450
|
-
if (this.useMock) {
|
|
3451
|
-
return this.mock.testKnowledgeAnswer(params);
|
|
3452
|
-
}
|
|
3453
|
-
return this.http
|
|
3454
|
-
.post(`${this.arBase}/settings/test-knowledge`, params)
|
|
3455
|
-
.pipe(map((body) => {
|
|
3456
|
-
const answer = String(body?.answer ?? '').trim();
|
|
3457
|
-
const b64 = String(body?.audioBase64 ?? '').trim();
|
|
3458
|
-
if (!answer || !b64) {
|
|
3459
|
-
throw new Error('Test response missing answer or audio');
|
|
3460
|
-
}
|
|
3461
|
-
const contentType = String(body?.contentType ?? 'audio/mpeg');
|
|
3462
|
-
const binary = atob(b64);
|
|
3463
|
-
const bytes = new Uint8Array(binary.length);
|
|
3464
|
-
for (let i = 0; i < binary.length; i++)
|
|
3465
|
-
bytes[i] = binary.charCodeAt(i);
|
|
3466
|
-
return {
|
|
3467
|
-
answer,
|
|
3468
|
-
voiceId: String(body?.voiceId ?? params.voiceId ?? ''),
|
|
3469
|
-
audioBlob: new Blob([bytes], { type: contentType }),
|
|
3470
|
-
};
|
|
3471
|
-
}), catchError((err) => throwError(() => new Error(this.apiErrorMessage(err, 'Could not generate a test answer.')))));
|
|
3472
|
-
}
|
|
3473
|
-
getAudit(q, opts) {
|
|
3474
|
-
if (this.useMock)
|
|
3475
|
-
return this.mock.getAudit(q, undefined, opts);
|
|
3476
|
-
const page = opts?.page ?? 1;
|
|
3477
|
-
const limit = opts?.limit ?? DEFAULT_PAGE_SIZE;
|
|
3478
|
-
let params = new HttpParams().set('page', String(page)).set('limit', String(limit));
|
|
3479
|
-
if (q)
|
|
3480
|
-
params = params.set('search', q);
|
|
3481
|
-
return this.http.get(`${this.arBase}/audit`, { params }).pipe(map((body) => {
|
|
3482
|
-
const pageResult = asPaginatedResult(body, page, limit);
|
|
3483
|
-
return {
|
|
3484
|
-
...pageResult,
|
|
3485
|
-
items: asAuditList(body).map((e, i) => mapAuditEventDto(e, i)),
|
|
3486
|
-
};
|
|
3487
|
-
}));
|
|
3488
|
-
}
|
|
3489
|
-
/**
|
|
3490
|
-
* Agent activity feed: patients created, appointments booked, tasks from AI.
|
|
3491
|
-
* GET /api/ai-receptionist/activities
|
|
3492
|
-
*/
|
|
3493
|
-
getActivities(filters) {
|
|
3494
|
-
if (this.useMock)
|
|
3495
|
-
return this.mock.getActivities(filters);
|
|
3496
|
-
const page = filters?.page ?? 1;
|
|
3497
|
-
const limit = filters?.limit ?? DEFAULT_PAGE_SIZE;
|
|
3498
|
-
let params = new HttpParams().set('page', String(page)).set('limit', String(limit));
|
|
3499
|
-
if (filters?.search?.trim())
|
|
3500
|
-
params = params.set('search', filters.search.trim());
|
|
3501
|
-
if (filters?.types?.trim())
|
|
3502
|
-
params = params.set('types', filters.types.trim());
|
|
3503
|
-
if (filters?.from?.trim())
|
|
3504
|
-
params = params.set('from', filters.from.trim());
|
|
3505
|
-
if (filters?.to?.trim())
|
|
3506
|
-
params = params.set('to', filters.to.trim());
|
|
3507
|
-
if (filters?.callId?.trim())
|
|
3508
|
-
params = params.set('callId', filters.callId.trim());
|
|
3509
|
-
return this.http.get(`${this.arBase}/activities`, { params }).pipe(map((body) => {
|
|
3510
|
-
const pageResult = asPaginatedResult(body, page, limit);
|
|
3511
|
-
return {
|
|
3512
|
-
...pageResult,
|
|
3513
|
-
items: pageResult.items.map((row, i) => mapAgentActivity(row, i)),
|
|
3514
|
-
};
|
|
3515
|
-
}));
|
|
3516
|
-
}
|
|
3517
|
-
getSetup() {
|
|
3518
|
-
if (this.useMock)
|
|
3519
|
-
return this.mock.getSetup();
|
|
3520
|
-
return this.http.get(`${this.arBase}/setup`).pipe(map((body) => ({ data: mapSetupDto(body) })));
|
|
3521
|
-
}
|
|
3522
|
-
activateSetup() {
|
|
3523
|
-
if (this.useMock)
|
|
3524
|
-
return this.mock.activateSetup();
|
|
3525
|
-
return this.http
|
|
3526
|
-
.post(`${this.arBase}/setup/activate`, {})
|
|
3527
|
-
.pipe(map(() => ({ data: { success: true } })));
|
|
3528
|
-
}
|
|
3529
|
-
getLocations() {
|
|
3530
|
-
if (this.useMock)
|
|
3531
|
-
return this.mock.getLocations();
|
|
3532
|
-
return this.http.get(this.paths.apiPath('/locations')).pipe(map((body) => ({ data: extractApiRows(body).map(mapLocationDto) })));
|
|
3533
|
-
}
|
|
3534
|
-
getProviders() {
|
|
3535
|
-
if (this.useMock)
|
|
3536
|
-
return this.mock.getProviders();
|
|
3537
|
-
return this.http.get(this.paths.v1Path('/providers')).pipe(map((body) => ({ data: extractApiRows(body).map(mapProviderDto) })));
|
|
3538
|
-
}
|
|
3539
|
-
getStreamLines() {
|
|
3540
|
-
return this.mock.getStreamLines();
|
|
3541
|
-
}
|
|
3542
|
-
appendStreamLine(callId, line) {
|
|
3543
|
-
this.mock.appendStreamLine(callId, line);
|
|
3544
|
-
}
|
|
3545
|
-
usesMockStreaming() {
|
|
3546
|
-
return this.useMock;
|
|
3547
|
-
}
|
|
3548
|
-
getCallApiLogs(callId) {
|
|
3549
|
-
if (this.useMock)
|
|
3550
|
-
return this.mock.getCallApiLogs(callId);
|
|
3551
|
-
const enc = encodeURIComponent(callId);
|
|
3552
|
-
return this.http.get(`${this.arBase}/calls/${enc}/api-logs`).pipe(map((body) => ({
|
|
3553
|
-
items: [...(body.items ?? [])].sort((a, b) => Date.parse(a.startedAt) - Date.parse(b.startedAt)),
|
|
3554
|
-
total: body.total ?? body.items?.length ?? 0,
|
|
3555
|
-
})));
|
|
3556
|
-
}
|
|
3557
|
-
getApiLogs(filters = {}) {
|
|
3558
|
-
if (this.useMock)
|
|
3559
|
-
return this.mock.getApiLogs(filters);
|
|
3560
|
-
let params = new HttpParams();
|
|
3561
|
-
if (filters.provider)
|
|
3562
|
-
params = params.set('provider', filters.provider);
|
|
3563
|
-
if (filters.success !== undefined)
|
|
3564
|
-
params = params.set('success', String(filters.success));
|
|
3565
|
-
if (filters.statusCode != null)
|
|
3566
|
-
params = params.set('statusCode', String(filters.statusCode));
|
|
3567
|
-
if (filters.operation)
|
|
3568
|
-
params = params.set('operation', filters.operation);
|
|
3569
|
-
if (filters.callId)
|
|
3570
|
-
params = params.set('callId', filters.callId);
|
|
3571
|
-
if (filters.from)
|
|
3572
|
-
params = params.set('from', filters.from);
|
|
3573
|
-
if (filters.to)
|
|
3574
|
-
params = params.set('to', filters.to);
|
|
3575
|
-
if (filters.search)
|
|
3576
|
-
params = params.set('search', filters.search);
|
|
3577
|
-
if (filters.page != null)
|
|
3578
|
-
params = params.set('page', String(filters.page));
|
|
3579
|
-
if (filters.limit != null)
|
|
3580
|
-
params = params.set('limit', String(filters.limit));
|
|
3581
|
-
if (filters.practiceId)
|
|
3582
|
-
params = params.set('practiceId', filters.practiceId);
|
|
3583
|
-
return this.http.get(`${this.arBase}/api-logs`, { params });
|
|
3584
|
-
}
|
|
3585
|
-
getApiLogDetail(logId) {
|
|
3586
|
-
if (this.useMock)
|
|
3587
|
-
return this.mock.getApiLogDetail(logId);
|
|
3588
|
-
const enc = encodeURIComponent(logId);
|
|
3589
|
-
return this.http
|
|
3590
|
-
.get(`${this.arBase}/api-logs/${enc}`)
|
|
3591
|
-
.pipe(map((data) => ({ data })));
|
|
3592
|
-
}
|
|
3593
|
-
getApiLogStats(practiceId) {
|
|
3594
|
-
if (this.useMock)
|
|
3595
|
-
return this.mock.getApiLogStats();
|
|
3596
|
-
let params = new HttpParams();
|
|
3597
|
-
if (practiceId)
|
|
3598
|
-
params = params.set('practiceId', practiceId);
|
|
3599
|
-
return this.http
|
|
3600
|
-
.get(`${this.arBase}/api-logs/stats`, { params })
|
|
3601
|
-
.pipe(map((data) => ({ data })));
|
|
3602
|
-
}
|
|
3603
|
-
getOutboundPurposes(includeInactive = false) {
|
|
3604
|
-
if (this.useMock)
|
|
3605
|
-
return this.mock.getOutboundPurposes(includeInactive);
|
|
3606
|
-
const params = includeInactive ? new HttpParams().set('includeInactive', 'true') : undefined;
|
|
3607
|
-
return this.http.get(`${this.arBase}/calls/outbound/purposes`, {
|
|
3608
|
-
params,
|
|
3609
|
-
});
|
|
3610
|
-
}
|
|
3611
|
-
createOutboundPurpose(body) {
|
|
3612
|
-
if (this.useMock)
|
|
3613
|
-
return this.mock.createOutboundPurpose(body);
|
|
3614
|
-
return this.http.post(`${this.arBase}/calls/outbound/purposes`, body);
|
|
3615
|
-
}
|
|
3616
|
-
updateOutboundPurpose(purposeId, body) {
|
|
3617
|
-
if (this.useMock)
|
|
3618
|
-
return this.mock.updateOutboundPurpose(purposeId, body);
|
|
3619
|
-
const enc = encodeURIComponent(purposeId);
|
|
3620
|
-
return this.http.patch(`${this.arBase}/calls/outbound/purposes/${enc}`, body);
|
|
3621
|
-
}
|
|
3622
|
-
deleteOutboundPurpose(purposeId) {
|
|
3623
|
-
if (this.useMock)
|
|
3624
|
-
return this.mock.deleteOutboundPurpose(purposeId);
|
|
3625
|
-
const enc = encodeURIComponent(purposeId);
|
|
3626
|
-
return this.http.delete(`${this.arBase}/calls/outbound/purposes/${enc}`);
|
|
3627
|
-
}
|
|
3628
|
-
placeOutboundCall(body) {
|
|
3629
|
-
if (this.useMock)
|
|
3630
|
-
return this.mock.placeOutboundCall(body);
|
|
3631
|
-
return this.http.post(`${this.arBase}/calls/outbound`, body).pipe(catchError((err) => {
|
|
3632
|
-
const detail = typeof err.error === 'object' && err.error && 'message' in err.error
|
|
3633
|
-
? String(err.error.message)
|
|
3634
|
-
: err.message;
|
|
3635
|
-
return throwError(() => ({ message: detail || 'Failed to place outbound call.' }));
|
|
3636
|
-
}));
|
|
3637
|
-
}
|
|
3638
|
-
/**
|
|
3639
|
-
* Patient typeahead for outbound dialer.
|
|
3640
|
-
* Tries `/api/v1/patients/search`, then `/api/v1/patients?q=`, then by-phone for digit queries.
|
|
3641
|
-
*/
|
|
3642
|
-
searchPatientsForOutbound(q, limit = 10) {
|
|
3643
|
-
const query = q.trim();
|
|
3644
|
-
if (!query)
|
|
3645
|
-
return of([]);
|
|
3646
|
-
if (this.useMock)
|
|
3647
|
-
return this.mock.searchPatientsForOutbound(query, limit);
|
|
3648
|
-
const params = new HttpParams().set('q', query).set('limit', String(limit));
|
|
3649
|
-
const searchUrl = this.paths.v1Path('/patients/search');
|
|
3650
|
-
const listUrl = this.paths.v1Path('/patients');
|
|
3651
|
-
return this.http.get(searchUrl, { params }).pipe(map((body) => this.mapPatientHits(body)), catchError(() => this.http.get(listUrl, { params }).pipe(map((body) => this.mapPatientHits(body)), catchError(() => of([])))), switchMap((hits) => {
|
|
3652
|
-
if (hits.length > 0)
|
|
3653
|
-
return of(hits);
|
|
3654
|
-
const phone = toE164Phone(query);
|
|
3655
|
-
if (!phone && !/\d{7,}/.test(query))
|
|
3656
|
-
return of([]);
|
|
3657
|
-
return this.http
|
|
3658
|
-
.get(this.paths.v1Path('/patients/by-phone'), {
|
|
3659
|
-
params: new HttpParams().set('phone', phone || query.replace(/\D/g, '')),
|
|
3660
|
-
})
|
|
3661
|
-
.pipe(map((body) => this.mapPatientHits(body)), catchError(() => of([])));
|
|
3662
|
-
}));
|
|
3663
|
-
}
|
|
3664
|
-
/** Upcoming appointments for a patient (dialer picker). */
|
|
3665
|
-
listPatientAppointmentsForOutbound(patientId, limit = 20) {
|
|
3666
|
-
const id = patientId.trim();
|
|
3667
|
-
if (!id)
|
|
3668
|
-
return of([]);
|
|
3669
|
-
if (this.useMock)
|
|
3670
|
-
return this.mock.listPatientAppointmentsForOutbound(id, limit);
|
|
3671
|
-
const from = new Date();
|
|
3672
|
-
from.setHours(0, 0, 0, 0);
|
|
3673
|
-
const params = new HttpParams()
|
|
3674
|
-
.set('patientId', id)
|
|
3675
|
-
.set('patient_id', id)
|
|
3676
|
-
.set('from', from.toISOString())
|
|
3677
|
-
.set('limit', String(limit));
|
|
3678
|
-
const v1Url = this.paths.v1Path('/appointments');
|
|
3679
|
-
const apiUrl = this.paths.apiPath('/appointments');
|
|
3680
|
-
// Prefer /api/appointments (current host contract), then /api/v1/appointments.
|
|
3681
|
-
return this.http.get(apiUrl, { params }).pipe(map((body) => this.mapAppointmentHits(body)), catchError(() => this.http.get(v1Url, { params }).pipe(map((body) => this.mapAppointmentHits(body)), catchError(() => of([])))));
|
|
3682
|
-
}
|
|
3683
|
-
mapPatientHits(body) {
|
|
3684
|
-
return extractApiRows(body)
|
|
3685
|
-
.map(mapOutboundPatientHit)
|
|
3686
|
-
.filter((p) => !!p);
|
|
3687
|
-
}
|
|
3688
|
-
mapAppointmentHits(body) {
|
|
3689
|
-
return extractApiRows(body)
|
|
3690
|
-
.map(mapOutboundAppointmentHit)
|
|
3691
|
-
.filter((a) => !!a)
|
|
3692
|
-
.sort((a, b) => String(a.startTime ?? '').localeCompare(String(b.startTime ?? '')));
|
|
3693
|
-
}
|
|
3694
|
-
postCallAction(id, action) {
|
|
3695
|
-
const enc = encodeURIComponent(id);
|
|
3696
|
-
return this.http
|
|
3697
|
-
.post(`${this.arBase}/calls/${enc}/${action}`, {})
|
|
3698
|
-
.pipe(map(() => ({ data: { success: true } })));
|
|
3699
|
-
}
|
|
3700
|
-
apiErrorMessage(err, fallback) {
|
|
3701
|
-
const body = err.error;
|
|
3702
|
-
if (typeof body === 'object' && body && 'message' in body) {
|
|
3703
|
-
return String(body.message);
|
|
3704
|
-
}
|
|
3705
|
-
if (typeof body === 'string' && body.trim())
|
|
3706
|
-
return body;
|
|
3707
|
-
return fallback;
|
|
3708
|
-
}
|
|
3709
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AiReceptionistApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3710
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AiReceptionistApiService, providedIn: 'root' }); }
|
|
3711
|
-
}
|
|
3712
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AiReceptionistApiService, decorators: [{
|
|
3713
|
-
type: Injectable,
|
|
3714
|
-
args: [{ providedIn: 'root' }]
|
|
3715
|
-
}] });
|
|
3716
|
-
|
|
3717
|
-
/**
|
|
3718
|
-
* Single shared Socket.io connection to the `/dashboard` namespace.
|
|
3719
|
-
* Used by live calls list + per-call transcript stream.
|
|
3720
|
-
*/
|
|
3721
|
-
class DashboardSocketService {
|
|
3722
|
-
constructor() {
|
|
3723
|
-
this.config = inject(VOICE_RECEPTIONIST_CONFIG);
|
|
3724
|
-
this.paths = createVoiceReceptionistPaths(this.config);
|
|
3725
|
-
this.connected = signal(false);
|
|
3726
|
-
this.socket = null;
|
|
3727
|
-
this.refCount = 0;
|
|
3728
|
-
this.handlers = new Map();
|
|
3729
|
-
this.connectCallbacks = new Set();
|
|
3730
|
-
}
|
|
3731
|
-
acquire() {
|
|
3732
|
-
this.refCount++;
|
|
3733
|
-
if (this.refCount === 1) {
|
|
3734
|
-
this.connect();
|
|
3735
|
-
}
|
|
3736
|
-
}
|
|
3737
|
-
release() {
|
|
3738
|
-
this.refCount = Math.max(0, this.refCount - 1);
|
|
3739
|
-
if (this.refCount === 0) {
|
|
3740
|
-
this.disconnect();
|
|
3741
|
-
}
|
|
3742
|
-
}
|
|
3743
|
-
onConnect(callback) {
|
|
3744
|
-
this.connectCallbacks.add(callback);
|
|
3745
|
-
if (this.connected()) {
|
|
3746
|
-
callback();
|
|
3747
|
-
}
|
|
3748
|
-
}
|
|
3749
|
-
offConnect(callback) {
|
|
3750
|
-
this.connectCallbacks.delete(callback);
|
|
3751
|
-
}
|
|
3752
|
-
on(event, handler) {
|
|
3753
|
-
const wrapped = (payload) => handler(payload);
|
|
3754
|
-
if (!this.handlers.has(event)) {
|
|
3755
|
-
this.handlers.set(event, new Map());
|
|
3756
|
-
}
|
|
3757
|
-
this.handlers.get(event).set(handler, wrapped);
|
|
3758
|
-
if (this.socket) {
|
|
3759
|
-
this.socket.on(event, wrapped);
|
|
3760
|
-
}
|
|
3761
|
-
}
|
|
3762
|
-
off(event, handler) {
|
|
3763
|
-
const eventHandlers = this.handlers.get(event);
|
|
3764
|
-
const wrapped = eventHandlers?.get(handler);
|
|
3765
|
-
if (wrapped) {
|
|
3766
|
-
this.socket?.off(event, wrapped);
|
|
3767
|
-
eventHandlers.delete(handler);
|
|
3768
|
-
}
|
|
3769
|
-
}
|
|
3770
|
-
emit(event, payload) {
|
|
3771
|
-
this.socket?.emit(event, payload);
|
|
3772
|
-
}
|
|
3773
|
-
connect() {
|
|
3774
|
-
if (this.config.useMockApi) {
|
|
3775
|
-
this.connected.set(true);
|
|
3776
|
-
this.fireConnectCallbacks();
|
|
3777
|
-
return;
|
|
3778
|
-
}
|
|
3779
|
-
this.socket = io(`${this.paths.apiRoot()}/dashboard`, {
|
|
3780
|
-
path: '/socket.io',
|
|
3781
|
-
transports: ['websocket'],
|
|
3782
|
-
autoConnect: false,
|
|
3783
|
-
});
|
|
3784
|
-
this.socket.on('connect', () => {
|
|
3785
|
-
this.connected.set(true);
|
|
3786
|
-
this.fireConnectCallbacks();
|
|
3787
|
-
});
|
|
3788
|
-
this.socket.on('disconnect', () => {
|
|
3789
|
-
this.connected.set(false);
|
|
3790
|
-
});
|
|
3791
|
-
this.socket.io.on('reconnect', () => {
|
|
3792
|
-
this.fireConnectCallbacks();
|
|
3793
|
-
});
|
|
3794
|
-
for (const [event, handlerMap] of this.handlers) {
|
|
3795
|
-
for (const wrapped of handlerMap.values()) {
|
|
3796
|
-
this.socket.on(event, wrapped);
|
|
3797
|
-
}
|
|
3798
|
-
}
|
|
3799
|
-
this.socket.connect();
|
|
3800
|
-
}
|
|
3801
|
-
disconnect() {
|
|
3802
|
-
if (!this.socket) {
|
|
3803
|
-
this.connected.set(false);
|
|
3804
|
-
return;
|
|
3805
|
-
}
|
|
3806
|
-
for (const [event, handlerMap] of this.handlers) {
|
|
3807
|
-
for (const wrapped of handlerMap.values()) {
|
|
3808
|
-
this.socket.off(event, wrapped);
|
|
3809
|
-
}
|
|
3810
|
-
}
|
|
3811
|
-
this.socket.removeAllListeners();
|
|
3812
|
-
this.socket.disconnect();
|
|
3813
|
-
this.socket = null;
|
|
3814
|
-
this.connected.set(false);
|
|
3815
|
-
}
|
|
3816
|
-
fireConnectCallbacks() {
|
|
3817
|
-
for (const cb of this.connectCallbacks) {
|
|
3818
|
-
cb();
|
|
3819
|
-
}
|
|
3820
|
-
}
|
|
3821
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DashboardSocketService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3822
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DashboardSocketService, providedIn: 'root' }); }
|
|
3823
|
-
}
|
|
3824
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DashboardSocketService, decorators: [{
|
|
3825
|
-
type: Injectable,
|
|
3826
|
-
args: [{ providedIn: 'root' }]
|
|
3827
|
-
}] });
|
|
3828
|
-
|
|
3829
|
-
const DEFAULT_POLL_MS = 12_000;
|
|
3830
|
-
/**
|
|
3831
|
-
* Shared live calls list — REST + `live_calls_updated` socket + fallback poll.
|
|
3832
|
-
*/
|
|
3833
|
-
class LiveCallsListService {
|
|
3834
|
-
constructor() {
|
|
3835
|
-
this.api = inject(AiReceptionistApiService);
|
|
3836
|
-
this.socket = inject(DashboardSocketService);
|
|
3837
|
-
this.config = inject(VOICE_RECEPTIONIST_CONFIG);
|
|
3838
|
-
this.calls = signal([]);
|
|
3839
|
-
this.loading = signal(false);
|
|
3840
|
-
this.error = signal(null);
|
|
3841
|
-
this.lastUpdated = signal(null);
|
|
3842
|
-
this.subscriberCount = 0;
|
|
3843
|
-
this.refreshId = 0;
|
|
3844
|
-
this.mockPollTimer = null;
|
|
3845
|
-
this.onLiveCallsUpdated = () => this.refresh(false);
|
|
3846
|
-
this.onSocketConnect = () => this.refresh(false);
|
|
3847
|
-
}
|
|
3848
|
-
start() {
|
|
3849
|
-
this.subscriberCount++;
|
|
3850
|
-
if (this.subscriberCount > 1) {
|
|
3851
|
-
this.refresh(false);
|
|
3852
|
-
return;
|
|
3853
|
-
}
|
|
3854
|
-
this.socket.acquire();
|
|
3855
|
-
this.socket.on('live_calls_updated', this.onLiveCallsUpdated);
|
|
3856
|
-
this.socket.onConnect(this.onSocketConnect);
|
|
3857
|
-
this.bindVisibility();
|
|
3858
|
-
this.refresh(true);
|
|
3859
|
-
this.startFallbackPoll();
|
|
3860
|
-
}
|
|
3861
|
-
stop() {
|
|
3862
|
-
this.subscriberCount = Math.max(0, this.subscriberCount - 1);
|
|
3863
|
-
if (this.subscriberCount > 0) {
|
|
3864
|
-
return;
|
|
3865
|
-
}
|
|
3866
|
-
this.refreshId++;
|
|
3867
|
-
this.refreshSub?.unsubscribe();
|
|
3868
|
-
this.refreshSub = undefined;
|
|
3869
|
-
this.stopFallbackPoll();
|
|
3870
|
-
this.unbindVisibility();
|
|
3871
|
-
this.socket.off('live_calls_updated', this.onLiveCallsUpdated);
|
|
3872
|
-
this.socket.offConnect(this.onSocketConnect);
|
|
3873
|
-
this.socket.release();
|
|
3874
|
-
}
|
|
3875
|
-
refresh(showLoading = true) {
|
|
3876
|
-
const requestId = ++this.refreshId;
|
|
3877
|
-
if (showLoading && this.calls().length === 0) {
|
|
3878
|
-
this.loading.set(true);
|
|
3879
|
-
}
|
|
3880
|
-
this.refreshSub?.unsubscribe();
|
|
3881
|
-
this.refreshSub = this.api.getLiveCalls().subscribe({
|
|
3882
|
-
next: ({ data }) => {
|
|
3883
|
-
if (requestId !== this.refreshId)
|
|
3884
|
-
return;
|
|
3885
|
-
this.calls.set(data);
|
|
3886
|
-
this.lastUpdated.set(Date.now());
|
|
3887
|
-
this.loading.set(false);
|
|
3888
|
-
this.error.set(null);
|
|
3889
|
-
},
|
|
3890
|
-
error: (err) => {
|
|
3891
|
-
if (requestId !== this.refreshId)
|
|
3892
|
-
return;
|
|
3893
|
-
this.loading.set(false);
|
|
3894
|
-
const message = err instanceof Error ? err.message : 'Could not load live calls.';
|
|
3895
|
-
this.error.set(message);
|
|
3896
|
-
},
|
|
3897
|
-
});
|
|
3898
|
-
}
|
|
3899
|
-
startFallbackPoll() {
|
|
3900
|
-
const pollMs = this.config.liveCallsPollIntervalMs ?? DEFAULT_POLL_MS;
|
|
3901
|
-
if (this.config.useMockApi) {
|
|
3902
|
-
this.mockPollTimer = setInterval(() => {
|
|
3903
|
-
if (!document.hidden) {
|
|
3904
|
-
this.refresh(false);
|
|
3905
|
-
}
|
|
3906
|
-
}, pollMs);
|
|
3907
|
-
return;
|
|
3908
|
-
}
|
|
3909
|
-
this.pollSub = interval(pollMs)
|
|
3910
|
-
.pipe(filter$1(() => !document.hidden))
|
|
3911
|
-
.subscribe(() => this.refresh(false));
|
|
3912
|
-
}
|
|
3913
|
-
stopFallbackPoll() {
|
|
3914
|
-
this.pollSub?.unsubscribe();
|
|
3915
|
-
this.pollSub = undefined;
|
|
3916
|
-
if (this.mockPollTimer) {
|
|
3917
|
-
clearInterval(this.mockPollTimer);
|
|
3918
|
-
this.mockPollTimer = null;
|
|
3919
|
-
}
|
|
3920
|
-
}
|
|
3921
|
-
bindVisibility() {
|
|
3922
|
-
this.visibilityHandler = () => {
|
|
3923
|
-
if (!document.hidden) {
|
|
3924
|
-
this.refresh(false);
|
|
3925
|
-
}
|
|
3926
|
-
};
|
|
3927
|
-
document.addEventListener('visibilitychange', this.visibilityHandler);
|
|
3928
|
-
}
|
|
3929
|
-
unbindVisibility() {
|
|
3930
|
-
if (this.visibilityHandler) {
|
|
3931
|
-
document.removeEventListener('visibilitychange', this.visibilityHandler);
|
|
3932
|
-
this.visibilityHandler = undefined;
|
|
3933
|
-
}
|
|
3934
|
-
}
|
|
3935
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: LiveCallsListService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3936
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: LiveCallsListService, providedIn: 'root' }); }
|
|
3937
|
-
}
|
|
3938
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: LiveCallsListService, decorators: [{
|
|
3939
|
-
type: Injectable,
|
|
3940
|
-
args: [{ providedIn: 'root' }]
|
|
3941
|
-
}] });
|
|
3942
|
-
|
|
3943
|
-
/**
|
|
3944
|
-
* Owns live-calls polling/socket for both the list and the per-call monitor
|
|
3945
|
-
* so navigating list → detail → back does not tear down the shared list.
|
|
3946
|
-
*/
|
|
3947
|
-
class LiveCallsShellComponent {
|
|
3948
|
-
constructor() {
|
|
3949
|
-
this.liveCallsList = inject(LiveCallsListService);
|
|
3950
|
-
}
|
|
3951
|
-
ngOnInit() {
|
|
3952
|
-
this.liveCallsList.start();
|
|
3953
|
-
}
|
|
3954
|
-
ngOnDestroy() {
|
|
3955
|
-
this.liveCallsList.stop();
|
|
3956
|
-
}
|
|
3957
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: LiveCallsShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3958
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: LiveCallsShellComponent, isStandalone: true, selector: "eds-live-calls-shell", ngImport: i0, template: '<router-outlet />', isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3959
|
-
}
|
|
3960
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: LiveCallsShellComponent, decorators: [{
|
|
3961
|
-
type: Component,
|
|
3962
|
-
args: [{ selector: 'eds-live-calls-shell', imports: [RouterOutlet], template: '<router-outlet />', changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:contents}\n"] }]
|
|
3963
|
-
}] });
|
|
3964
|
-
|
|
3965
|
-
/** Feature child routes (under the embed shell). */
|
|
3966
|
-
const VOICE_RECEPTIONIST_FEATURE_ROUTES = [
|
|
3967
|
-
{ path: '', pathMatch: 'full', redirectTo: 'dashboard' },
|
|
3968
|
-
{
|
|
3969
|
-
path: 'dashboard',
|
|
3970
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-dashboard-page.component-B_EYljRs.mjs').then((m) => m.DashboardPageComponent),
|
|
3971
|
-
},
|
|
3972
|
-
{
|
|
3973
|
-
path: 'live',
|
|
3974
|
-
component: LiveCallsShellComponent,
|
|
3975
|
-
children: [
|
|
3976
|
-
{
|
|
3977
|
-
path: '',
|
|
3978
|
-
pathMatch: 'full',
|
|
3979
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-live-calls-page.component-1woGuh0J.mjs').then((m) => m.LiveCallsPageComponent),
|
|
3980
|
-
},
|
|
3981
|
-
{
|
|
3982
|
-
path: ':id',
|
|
3983
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-live-monitor-page.component-ihwm1LNn.mjs').then((m) => m.LiveMonitorPageComponent),
|
|
3984
|
-
},
|
|
3985
|
-
],
|
|
3986
|
-
},
|
|
3987
|
-
{
|
|
3988
|
-
path: 'history',
|
|
3989
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-call-history-page.component-DoYJFpSa.mjs').then((m) => m.CallHistoryPageComponent),
|
|
3990
|
-
},
|
|
3991
|
-
{
|
|
3992
|
-
path: 'history/:id',
|
|
3993
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-call-history-detail-page.component-ENq2c-sm.mjs').then((m) => m.CallHistoryDetailPageComponent),
|
|
3994
|
-
},
|
|
3995
|
-
{
|
|
3996
|
-
path: 'activities',
|
|
3997
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-activities-page.component-Br2Vi1Im.mjs').then((m) => m.ActivitiesPageComponent),
|
|
3998
|
-
},
|
|
3999
|
-
{
|
|
4000
|
-
path: 'tasks',
|
|
4001
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-tasks-page.component-Cf76XyCz.mjs').then((m) => m.TasksPageComponent),
|
|
4002
|
-
},
|
|
4003
|
-
{
|
|
4004
|
-
path: 'analytics',
|
|
4005
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-analytics-page.component-CglgGV6H.mjs').then((m) => m.AnalyticsPageComponent),
|
|
4006
|
-
},
|
|
4007
|
-
{
|
|
4008
|
-
path: 'api-logs',
|
|
4009
|
-
canActivate: [apiLogsStandaloneGuard],
|
|
4010
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-api-logs-page.component-DPJiuNjk.mjs').then((m) => m.ApiLogsPageComponent),
|
|
4011
|
-
},
|
|
4012
|
-
{
|
|
4013
|
-
path: 'settings',
|
|
4014
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-settings-page.component-C6F-Hgmk.mjs').then((m) => m.SettingsPageComponent),
|
|
4015
|
-
},
|
|
4016
|
-
{
|
|
4017
|
-
path: 'settings/outbound-purposes',
|
|
4018
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-outbound-purposes-page.component-B2koBFU3.mjs').then((m) => m.OutboundPurposesPageComponent),
|
|
4019
|
-
},
|
|
4020
|
-
{
|
|
4021
|
-
path: 'knowledge',
|
|
4022
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-settings-page.component-C6F-Hgmk.mjs').then((m) => m.SettingsPageComponent),
|
|
4023
|
-
data: { settingsTab: 'knowledge' },
|
|
4024
|
-
},
|
|
4025
|
-
{
|
|
4026
|
-
path: 'wizard',
|
|
4027
|
-
loadComponent: () => import('./edvak99-voice-receptionist-widget-wizard-page.component-BQTlz2F5.mjs').then((m) => m.WizardPageComponent),
|
|
4028
|
-
},
|
|
4029
|
-
];
|
|
4030
|
-
/**
|
|
4031
|
-
* Lazy-loadable routes for EHR (and standalone hosts).
|
|
4032
|
-
* Mount under a host path, e.g. `{ path: 'ai-receptionist', children: VOICE_RECEPTIONIST_ROUTES }`.
|
|
4033
|
-
*/
|
|
4034
|
-
const VOICE_RECEPTIONIST_ROUTES = [
|
|
4035
|
-
{
|
|
4036
|
-
path: '',
|
|
4037
|
-
component: EdsAppShellComponent,
|
|
4038
|
-
children: VOICE_RECEPTIONIST_FEATURE_ROUTES,
|
|
4039
|
-
},
|
|
4040
|
-
];
|
|
4041
|
-
|
|
4042
|
-
class EdsBadgeComponent {
|
|
4043
|
-
constructor() {
|
|
4044
|
-
this.tone = input('gray');
|
|
4045
|
-
}
|
|
4046
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4047
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.17", type: EdsBadgeComponent, isStandalone: true, selector: "eds-badge", inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `<span class="eds-badge inline-flex items-center gap-2 py-1 px-2" [attr.data-tone]="tone()"><ng-content /></span>`, isInline: true, styles: [".eds-badge{border-radius:var(--eds-radius-sm);font-family:var(--eds-font-inter);font-size:12px;font-weight:500;line-height:1.4;white-space:nowrap}.eds-badge[data-tone=brand]{background:#3681f41f;color:var(--eds-brand-600)}.eds-badge[data-tone=pos]{background:#0abf521f;color:var(--eds-green-500)}.eds-badge[data-tone=notice]{background:#ffb90026;color:#b45309}.eds-badge[data-tone=neg]{background:#f037401f;color:var(--eds-red-500)}.eds-badge[data-tone=violet]{background:#8e51ff1f;color:var(--eds-violet-500)}.eds-badge[data-tone=gray]{background:var(--eds-gray-100);color:var(--eds-gray-600)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4048
|
-
}
|
|
4049
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsBadgeComponent, decorators: [{
|
|
4050
|
-
type: Component,
|
|
4051
|
-
args: [{ selector: 'eds-badge', standalone: true, template: `<span class="eds-badge inline-flex items-center gap-2 py-1 px-2" [attr.data-tone]="tone()"><ng-content /></span>`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".eds-badge{border-radius:var(--eds-radius-sm);font-family:var(--eds-font-inter);font-size:12px;font-weight:500;line-height:1.4;white-space:nowrap}.eds-badge[data-tone=brand]{background:#3681f41f;color:var(--eds-brand-600)}.eds-badge[data-tone=pos]{background:#0abf521f;color:var(--eds-green-500)}.eds-badge[data-tone=notice]{background:#ffb90026;color:#b45309}.eds-badge[data-tone=neg]{background:#f037401f;color:var(--eds-red-500)}.eds-badge[data-tone=violet]{background:#8e51ff1f;color:var(--eds-violet-500)}.eds-badge[data-tone=gray]{background:var(--eds-gray-100);color:var(--eds-gray-600)}\n"] }]
|
|
4052
|
-
}] });
|
|
4053
|
-
|
|
4054
|
-
class EdsButtonComponent {
|
|
4055
|
-
constructor() {
|
|
4056
|
-
this.variant = input('secondary');
|
|
4057
|
-
this.type = input('button');
|
|
4058
|
-
this.disabled = input(false);
|
|
4059
|
-
}
|
|
4060
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4061
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.17", type: EdsButtonComponent, isStandalone: true, selector: "eds-button", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
4062
|
-
<button [type]="type()" [disabled]="disabled()" [attr.data-variant]="variant()" class="eds-btn inline-flex items-center justify-center gap-2 py-2 px-4">
|
|
4063
|
-
<ng-content />
|
|
4064
|
-
</button>
|
|
4065
|
-
`, isInline: true, styles: [".eds-btn{border-radius:var(--eds-radius-md);border:1px solid transparent;font-family:var(--eds-font-inter);font-size:13px;font-weight:500;cursor:pointer;transition:background .12s ease,border-color .12s ease,color .12s ease}.eds-btn:disabled{opacity:.5;cursor:not-allowed}.eds-btn[data-variant=primary]{background:var(--eds-brand-600);color:#fff}.eds-btn[data-variant=primary]:hover:not(:disabled){background:var(--eds-brand-500)}.eds-btn[data-variant=secondary]{background:var(--eds-surface-l0);color:var(--eds-text-primary);border-color:var(--eds-border-default)}.eds-btn[data-variant=secondary]:hover:not(:disabled){background:var(--eds-surface-l1)}.eds-btn[data-variant=ghost]{background:transparent;color:var(--eds-text-secondary)}.eds-btn[data-variant=ghost]:hover:not(:disabled){background:var(--eds-gray-100);color:var(--eds-text-primary)}.eds-btn[data-variant=danger]{background:#f037401a;color:var(--eds-red-500);border-color:#f0374040}.eds-btn[data-variant=positive]{background:#0abf521f;color:var(--eds-green-500);border-color:#0abf5240}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4066
|
-
}
|
|
4067
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: EdsButtonComponent, decorators: [{
|
|
4068
|
-
type: Component,
|
|
4069
|
-
args: [{ selector: 'eds-button', standalone: true, template: `
|
|
4070
|
-
<button [type]="type()" [disabled]="disabled()" [attr.data-variant]="variant()" class="eds-btn inline-flex items-center justify-center gap-2 py-2 px-4">
|
|
4071
|
-
<ng-content />
|
|
4072
|
-
</button>
|
|
4073
|
-
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".eds-btn{border-radius:var(--eds-radius-md);border:1px solid transparent;font-family:var(--eds-font-inter);font-size:13px;font-weight:500;cursor:pointer;transition:background .12s ease,border-color .12s ease,color .12s ease}.eds-btn:disabled{opacity:.5;cursor:not-allowed}.eds-btn[data-variant=primary]{background:var(--eds-brand-600);color:#fff}.eds-btn[data-variant=primary]:hover:not(:disabled){background:var(--eds-brand-500)}.eds-btn[data-variant=secondary]{background:var(--eds-surface-l0);color:var(--eds-text-primary);border-color:var(--eds-border-default)}.eds-btn[data-variant=secondary]:hover:not(:disabled){background:var(--eds-surface-l1)}.eds-btn[data-variant=ghost]{background:transparent;color:var(--eds-text-secondary)}.eds-btn[data-variant=ghost]:hover:not(:disabled){background:var(--eds-gray-100);color:var(--eds-text-primary)}.eds-btn[data-variant=danger]{background:#f037401a;color:var(--eds-red-500);border-color:#f0374040}.eds-btn[data-variant=positive]{background:#0abf521f;color:var(--eds-green-500);border-color:#0abf5240}\n"] }]
|
|
4074
|
-
}] });
|
|
4075
|
-
|
|
4076
|
-
/*
|
|
4077
|
-
* Public API Surface of @edvak99/voice-receptionist-widget
|
|
4078
|
-
*
|
|
4079
|
-
* Only export host-facing symbols here. Internal pages/services stay private
|
|
4080
|
-
* and are reached via VOICE_RECEPTIONIST_ROUTES / FEATURE_ROUTES.
|
|
4081
|
-
*/
|
|
4082
|
-
// Config & DI
|
|
4083
|
-
|
|
4084
|
-
/**
|
|
4085
|
-
* Generated bundle index. Do not edit.
|
|
4086
|
-
*/
|
|
4087
|
-
|
|
4088
|
-
export { AiReceptionistApiService as A, DashboardSocketService as D, EdsButtonComponent as E, LiveCallsListService as L, ToastService as T, VOICE_RECEPTIONIST_CONFIG as V, WELCOME_MESSAGE_MAX as W, historyResolutionLabel as a, historyResolution as b, callerMetaLine as c, EdsIconComponent as d, ageFromDob as e, resolveToolKey as f, resolveToolDisplayName as g, historyResultChips as h, isUnknownCaller as i, DEFAULT_PAGE_SIZE as j, totalPages as k, EdsBadgeComponent as l, activityTypeLabel as m, initialsFromName as n, VOICE_RECEPTIONIST_SESSION as o, buildAutoWelcomeTemplate as p, resolveWelcomePreview as q, resultChipIcon as r, DEFAULT_PLACEHOLDERS as s, toolEventTrackKey as t, EdsAppShellComponent as u, EdsRouteProgressComponent as v, ToastContainerComponent as w, VOICE_RECEPTIONIST_FEATURE_ROUTES as x, VOICE_RECEPTIONIST_ROUTES as y, provideVoiceReceptionist as z };
|
|
4089
|
-
//# sourceMappingURL=edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-pS2jeB4x.mjs.map
|