@edvak99/voice-receptionist-widget 1.1.2 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-analytics-page.component-CW5OKmik.mjs → edvak99-voice-receptionist-widget-analytics-page.component-Dsujn5az.mjs} +4 -4
- package/fesm2022/{edvak99-voice-receptionist-widget-analytics-page.component-CW5OKmik.mjs.map → edvak99-voice-receptionist-widget-analytics-page.component-Dsujn5az.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-xoLlHj8K.mjs +67 -0
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-xoLlHj8K.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-history-detail-page.component-CTwfUHUf.mjs → edvak99-voice-receptionist-widget-call-history-detail-page.component-2K9W77As.mjs} +11 -11
- package/fesm2022/{edvak99-voice-receptionist-widget-call-history-detail-page.component-CTwfUHUf.mjs.map → edvak99-voice-receptionist-widget-call-history-detail-page.component-2K9W77As.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs → edvak99-voice-receptionist-widget-call-history-page.component-B5AnEjoh.mjs} +62 -26
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-B5AnEjoh.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-AN6GcSDq.mjs → edvak99-voice-receptionist-widget-call-recording-player.component-B8_qp7Fe.mjs} +4 -4
- package/fesm2022/{edvak99-voice-receptionist-widget-call-recording-player.component-AN6GcSDq.mjs.map → edvak99-voice-receptionist-widget-call-recording-player.component-B8_qp7Fe.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-Cy_Bf7AO.mjs → edvak99-voice-receptionist-widget-call-review.service-Cj2XTeK4.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.service-Cy_Bf7AO.mjs.map → edvak99-voice-receptionist-widget-call-review.service-Cj2XTeK4.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.util-DQLIw7xb.mjs → edvak99-voice-receptionist-widget-call-review.util-BgsBCKgZ.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-call-review.util-DQLIw7xb.mjs.map → edvak99-voice-receptionist-widget-call-review.util-BgsBCKgZ.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-dashboard-page.component-DzdIt2A7.mjs → edvak99-voice-receptionist-widget-dashboard-page.component-BNdnbAVM.mjs} +10 -10
- package/fesm2022/{edvak99-voice-receptionist-widget-dashboard-page.component-DzdIt2A7.mjs.map → edvak99-voice-receptionist-widget-dashboard-page.component-BNdnbAVM.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-avatar.component-PCnIWeOA.mjs → edvak99-voice-receptionist-widget-eds-avatar.component-CbphhP6o.mjs} +3 -3
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-avatar.component-PCnIWeOA.mjs.map → edvak99-voice-receptionist-widget-eds-avatar.component-CbphhP6o.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-elapsed.pipe-ouRlPpwT.mjs → edvak99-voice-receptionist-widget-eds-elapsed.pipe-BgLsnq6A.mjs} +2 -2
- package/fesm2022/{edvak99-voice-receptionist-widget-eds-elapsed.pipe-ouRlPpwT.mjs.map → edvak99-voice-receptionist-widget-eds-elapsed.pipe-BgLsnq6A.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMhknpGf.mjs → edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-Dn0GrZ6_.mjs} +106 -48
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-Dn0GrZ6_.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-knowledge-hub.page-cZqBuull.mjs → edvak99-voice-receptionist-widget-knowledge-hub.page-BngGx_Lc.mjs} +70 -36
- package/fesm2022/edvak99-voice-receptionist-widget-knowledge-hub.page-BngGx_Lc.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-list.service-CDtFRW8w.mjs → edvak99-voice-receptionist-widget-live-calls-list.service-0kGWO6sh.mjs} +3 -3
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-list.service-CDtFRW8w.mjs.map → edvak99-voice-receptionist-widget-live-calls-list.service-0kGWO6sh.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-DrYzXJQW.mjs → edvak99-voice-receptionist-widget-live-calls-page.component-DfLmK89M.mjs} +7 -7
- package/fesm2022/{edvak99-voice-receptionist-widget-live-calls-page.component-DrYzXJQW.mjs.map → edvak99-voice-receptionist-widget-live-calls-page.component-DfLmK89M.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-D7dlk0y2.mjs → edvak99-voice-receptionist-widget-live-monitor-page.component-DNpLFqBw.mjs} +11 -11
- package/fesm2022/{edvak99-voice-receptionist-widget-live-monitor-page.component-D7dlk0y2.mjs.map → edvak99-voice-receptionist-widget-live-monitor-page.component-DNpLFqBw.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-outbound-purposes-page.component-CJ8NEjcj.mjs → edvak99-voice-receptionist-widget-outbound-purposes-page.component-CYSZ832p.mjs} +6 -6
- package/fesm2022/{edvak99-voice-receptionist-widget-outbound-purposes-page.component-CJ8NEjcj.mjs.map → edvak99-voice-receptionist-widget-outbound-purposes-page.component-CYSZ832p.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-settings-page.component-Bo3XNK3b.mjs → edvak99-voice-receptionist-widget-settings-page.component-B9nv6wtB.mjs} +4 -4
- package/fesm2022/{edvak99-voice-receptionist-widget-settings-page.component-Bo3XNK3b.mjs.map → edvak99-voice-receptionist-widget-settings-page.component-B9nv6wtB.mjs.map} +1 -1
- package/fesm2022/{edvak99-voice-receptionist-widget-tasks-page.component-CBwl15NP.mjs → edvak99-voice-receptionist-widget-tasks-page.component-DXxjMVUv.mjs} +40 -11
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-DXxjMVUv.mjs.map +1 -0
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-CJLa5pia.mjs → edvak99-voice-receptionist-widget-wizard-page.component-C1Z6yC0q.mjs} +4 -4
- package/fesm2022/{edvak99-voice-receptionist-widget-wizard-page.component-CJLa5pia.mjs.map → edvak99-voice-receptionist-widget-wizard-page.component-C1Z6yC0q.mjs.map} +1 -1
- package/fesm2022/edvak99-voice-receptionist-widget.mjs +1 -1
- package/lib/knowledge/models/practice-faq.model.d.ts +3 -0
- package/lib/knowledge/pages/knowledge-hub.page.d.ts +8 -1
- package/lib/knowledge/services/practice-faq-api.service.d.ts +6 -2
- package/lib/models/ai-receptionist.types.d.ts +1 -0
- package/lib/models/pagination.d.ts +11 -0
- package/lib/pages/audit-page/audit-page.component.d.ts +7 -0
- package/lib/pages/call-history-page/call-history-page.component.d.ts +7 -3
- package/lib/pages/tasks-page/tasks-page.component.d.ts +6 -0
- package/lib/services/ai-receptionist-api.mock.d.ts +10 -9
- package/lib/services/ai-receptionist-api.service.d.ts +9 -9
- package/package.json +1 -1
- package/styles/_index.scss +5 -40
- package/styles/chat-ui.scss +18 -18
- package/styles/eds.scss +135 -95
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs +0 -35
- package/fesm2022/edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMhknpGf.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-knowledge-hub.page-cZqBuull.mjs.map +0 -1
- package/fesm2022/edvak99-voice-receptionist-widget-tasks-page.component-CBwl15NP.mjs.map +0 -1
package/styles/eds.scss
CHANGED
|
@@ -1,124 +1,164 @@
|
|
|
1
|
-
/* EDS Design System — AI Receptionist
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/* EDS Design System — AI Receptionist
|
|
2
|
+
*
|
|
3
|
+
* Tokens are scoped to eds-app-shell / .voice-receptionist-host only.
|
|
4
|
+
* Never set unprefixed --color-primary / --gray-* / --text-primary on :root —
|
|
5
|
+
* those collide with host apps (e.g. EHR Tailwind hsl(var(--color-primary))).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
eds-app-shell,
|
|
9
|
+
.voice-receptionist-host {
|
|
4
10
|
/* Brand */
|
|
5
|
-
--brand-500: #3681f4;
|
|
6
|
-
--brand-600: #2162f0;
|
|
7
|
-
--
|
|
8
|
-
--
|
|
9
|
-
--
|
|
10
|
-
--
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
--
|
|
14
|
-
--
|
|
15
|
-
--
|
|
16
|
-
--
|
|
17
|
-
--
|
|
18
|
-
--
|
|
19
|
-
--
|
|
20
|
-
--
|
|
21
|
-
--
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
--
|
|
25
|
-
--
|
|
26
|
-
--
|
|
27
|
-
--
|
|
28
|
-
--
|
|
29
|
-
--
|
|
30
|
-
--
|
|
31
|
-
--
|
|
32
|
-
--
|
|
33
|
-
--
|
|
34
|
-
--
|
|
35
|
-
--
|
|
36
|
-
--
|
|
37
|
-
--
|
|
38
|
-
--
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
--
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
--
|
|
45
|
-
--
|
|
46
|
-
--
|
|
47
|
-
--
|
|
48
|
-
--
|
|
49
|
-
--
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
--surface-
|
|
53
|
-
--
|
|
54
|
-
--
|
|
55
|
-
--text
|
|
56
|
-
--text-
|
|
57
|
-
--text-
|
|
58
|
-
--border
|
|
59
|
-
--
|
|
60
|
-
|
|
61
|
-
|
|
11
|
+
--eds-brand-500: #3681f4;
|
|
12
|
+
--eds-brand-600: #2162f0;
|
|
13
|
+
--eds-brand-400: #5aa3f6;
|
|
14
|
+
--eds-brand-300: #94c5f9;
|
|
15
|
+
--eds-brand: var(--eds-brand-500);
|
|
16
|
+
--eds-violet-500: #8e51ff;
|
|
17
|
+
--eds-violet-400: #a684ff;
|
|
18
|
+
--eds-green-500: #0abf52;
|
|
19
|
+
--eds-green-400: #34d399;
|
|
20
|
+
--eds-green-600: #16a34a;
|
|
21
|
+
--eds-red-500: #f03740;
|
|
22
|
+
--eds-red-400: #f87171;
|
|
23
|
+
--eds-red-300: #fca5a5;
|
|
24
|
+
--eds-amber-500: #f59e0b;
|
|
25
|
+
--eds-amber-400: #ffb900;
|
|
26
|
+
--eds-amber-300: #fcd34d;
|
|
27
|
+
--eds-purple-300: #c4b5fd;
|
|
28
|
+
|
|
29
|
+
/* Gray / slate */
|
|
30
|
+
--eds-gray-50: #f9fafb;
|
|
31
|
+
--eds-gray-100: #f4f4f5;
|
|
32
|
+
--eds-gray-200: #e4e4e7;
|
|
33
|
+
--eds-gray-300: #d4d4d8;
|
|
34
|
+
--eds-gray-400: #a1a1aa;
|
|
35
|
+
--eds-gray-500: #71717a;
|
|
36
|
+
--eds-gray-600: #52525b;
|
|
37
|
+
--eds-gray-700: #3f3f46;
|
|
38
|
+
--eds-gray-800: #27272a;
|
|
39
|
+
--eds-gray-900: #18181b;
|
|
40
|
+
--eds-slate-950: #030717;
|
|
41
|
+
--eds-slate-900: #121828;
|
|
42
|
+
--eds-slate-800: #212a39;
|
|
43
|
+
--eds-slate-700: #384251;
|
|
44
|
+
--eds-slate-600: #4e5763;
|
|
45
|
+
--eds-slate-500: #63748b;
|
|
46
|
+
--eds-slate-400: #99a2b0;
|
|
47
|
+
--eds-slate-300: #cad5e2;
|
|
48
|
+
|
|
49
|
+
/* App color tokens (legacy names → eds-prefixed) */
|
|
50
|
+
--eds-color-primary: #3681f4;
|
|
51
|
+
--eds-color-primary-hover: #2f6de0;
|
|
52
|
+
--eds-color-primary-light: #eaf2ff;
|
|
53
|
+
--eds-color-primary-soft: var(--eds-color-primary-light);
|
|
54
|
+
--eds-color-accent: #5aa2ff;
|
|
55
|
+
--eds-color-accent-light: #d6e8ff;
|
|
56
|
+
--eds-color-bg: #f7faff;
|
|
57
|
+
--eds-color-surface: #ffffff;
|
|
58
|
+
--eds-color-surface-alt: #f8fafc;
|
|
59
|
+
--eds-color-sidebar-bg: #0f172a;
|
|
60
|
+
--eds-color-chat-ai: #f1f5f9;
|
|
61
|
+
--eds-color-text: #0f172a;
|
|
62
|
+
--eds-color-text-muted: #64748b;
|
|
63
|
+
--eds-color-text-soft: #94a3b8;
|
|
64
|
+
--eds-color-border: #e2e8f0;
|
|
65
|
+
--eds-color-border-strong: #cbd5e1;
|
|
66
|
+
--eds-color-success: #22c55e;
|
|
67
|
+
--eds-color-success-soft: #ecfdf3;
|
|
68
|
+
--eds-color-warning: #f59e0b;
|
|
69
|
+
--eds-color-warning-soft: #fffbeb;
|
|
70
|
+
--eds-color-danger: #ef4444;
|
|
71
|
+
--eds-color-danger-soft: #fef2f2;
|
|
72
|
+
--eds-color-info: #3b82f6;
|
|
73
|
+
--eds-color-info-soft: #eff6ff;
|
|
74
|
+
|
|
75
|
+
/* Surfaces / text / borders */
|
|
76
|
+
--eds-surface-l0: #ffffff;
|
|
77
|
+
--eds-surface-l1: #f9fafb;
|
|
78
|
+
--eds-surface-l2: #f4f4f5;
|
|
79
|
+
--eds-surface-card: var(--eds-surface-l0);
|
|
80
|
+
--eds-surface-muted: var(--eds-surface-l1);
|
|
81
|
+
--eds-surface-hover: var(--eds-surface-l1);
|
|
82
|
+
--eds-text-primary: var(--eds-gray-700);
|
|
83
|
+
--eds-text-secondary: var(--eds-gray-600);
|
|
84
|
+
--eds-text-brand: var(--eds-brand-600);
|
|
85
|
+
--eds-border-default: var(--eds-gray-200);
|
|
86
|
+
--eds-border-subtle: var(--eds-gray-200);
|
|
87
|
+
--eds-bg-brand: var(--eds-brand-500);
|
|
88
|
+
|
|
89
|
+
/* Radius / space / shadow */
|
|
62
90
|
--eds-radius-sm: 4px;
|
|
63
91
|
--eds-radius-md: 6px;
|
|
64
92
|
--eds-radius-lg: 8px;
|
|
65
|
-
|
|
66
|
-
|
|
93
|
+
--eds-radius-xl: 16px;
|
|
94
|
+
--eds-radius-pill: 999px;
|
|
95
|
+
--eds-space-sm: 16px;
|
|
96
|
+
--eds-space-md: 24px;
|
|
97
|
+
--eds-space-lg: 32px;
|
|
98
|
+
--eds-space-4: 16px;
|
|
99
|
+
--eds-space-5: 20px;
|
|
67
100
|
--eds-shadow-sm: 0 1px 2px rgba(17, 24, 39, 0.04);
|
|
68
101
|
--eds-shadow-md: 0 2px 8px rgba(17, 24, 39, 0.06);
|
|
102
|
+
--eds-shadow-card: 0 2px 6px rgba(0, 0, 0, 0.05);
|
|
103
|
+
--eds-shadow-modal: 0 6px 16px rgba(0, 0, 0, 0.08);
|
|
69
104
|
|
|
70
105
|
/* Layout */
|
|
71
106
|
--eds-rail-width: 64px;
|
|
72
107
|
--eds-nav-width: 244px;
|
|
73
108
|
--eds-topbar-height: 60px;
|
|
109
|
+
--eds-sidebar-width: 240px;
|
|
110
|
+
--eds-monitor-text: var(--eds-text-primary);
|
|
74
111
|
|
|
75
112
|
/* Fonts */
|
|
76
|
-
--font-inter: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
77
|
-
--font-dm: 'DM Sans', var(--font-inter);
|
|
78
|
-
--font-figtree: 'Figtree', var(--font-inter);
|
|
79
|
-
--font-mono: 'IBM Plex Mono', ui-monospace, monospace;
|
|
113
|
+
--eds-font-inter: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
114
|
+
--eds-font-dm: 'DM Sans', var(--eds-font-inter);
|
|
115
|
+
--eds-font-figtree: 'Figtree', var(--eds-font-inter);
|
|
116
|
+
--eds-font-mono: 'IBM Plex Mono', ui-monospace, monospace;
|
|
117
|
+
--eds-font-sans: var(--eds-font-inter);
|
|
118
|
+
--eds-font-body: var(--eds-font-dm);
|
|
119
|
+
--eds-font-display: var(--eds-font-figtree);
|
|
80
120
|
}
|
|
81
121
|
|
|
82
122
|
/* Typography */
|
|
83
123
|
.eds-h1 {
|
|
84
|
-
font-family: var(--font-inter);
|
|
124
|
+
font-family: var(--eds-font-inter);
|
|
85
125
|
font-size: 24px;
|
|
86
126
|
font-weight: 600;
|
|
87
127
|
letter-spacing: -0.02em;
|
|
88
|
-
color: var(--text-primary);
|
|
128
|
+
color: var(--eds-text-primary);
|
|
89
129
|
margin: 0;
|
|
90
130
|
}
|
|
91
131
|
|
|
92
132
|
.eds-h2 {
|
|
93
|
-
font-family: var(--font-inter);
|
|
133
|
+
font-family: var(--eds-font-inter);
|
|
94
134
|
font-size: 18px;
|
|
95
135
|
font-weight: 600;
|
|
96
136
|
letter-spacing: -0.01em;
|
|
97
|
-
color: var(--text-primary);
|
|
137
|
+
color: var(--eds-text-primary);
|
|
98
138
|
margin: 0;
|
|
99
139
|
}
|
|
100
140
|
|
|
101
141
|
.eds-h3 {
|
|
102
|
-
font-family: var(--font-inter);
|
|
142
|
+
font-family: var(--eds-font-inter);
|
|
103
143
|
font-size: 15px;
|
|
104
144
|
font-weight: 600;
|
|
105
|
-
color: var(--text-primary);
|
|
145
|
+
color: var(--eds-text-primary);
|
|
106
146
|
margin: 0;
|
|
107
147
|
}
|
|
108
148
|
|
|
109
149
|
.eds-h4 {
|
|
110
|
-
font-family: var(--font-inter);
|
|
150
|
+
font-family: var(--eds-font-inter);
|
|
111
151
|
font-size: 13px;
|
|
112
152
|
font-weight: 600;
|
|
113
|
-
color: var(--text-primary);
|
|
153
|
+
color: var(--eds-text-primary);
|
|
114
154
|
margin: 0;
|
|
115
155
|
}
|
|
116
156
|
|
|
117
157
|
.eds-body {
|
|
118
|
-
font-family: var(--font-dm);
|
|
158
|
+
font-family: var(--eds-font-dm);
|
|
119
159
|
font-size: 14px;
|
|
120
160
|
line-height: 1.5;
|
|
121
|
-
color: var(--text-primary);
|
|
161
|
+
color: var(--eds-text-primary);
|
|
122
162
|
}
|
|
123
163
|
|
|
124
164
|
.eds-body-bold {
|
|
@@ -127,37 +167,37 @@
|
|
|
127
167
|
}
|
|
128
168
|
|
|
129
169
|
.eds-body-sm {
|
|
130
|
-
font-family: var(--font-dm);
|
|
170
|
+
font-family: var(--eds-font-dm);
|
|
131
171
|
font-size: 13px;
|
|
132
172
|
line-height: 1.45;
|
|
133
|
-
color: var(--text-secondary);
|
|
173
|
+
color: var(--eds-text-secondary);
|
|
134
174
|
}
|
|
135
175
|
|
|
136
176
|
.eds-body-sm-bold {
|
|
137
177
|
@extend .eds-body-sm;
|
|
138
178
|
font-weight: 600;
|
|
139
|
-
color: var(--text-primary);
|
|
179
|
+
color: var(--eds-text-primary);
|
|
140
180
|
}
|
|
141
181
|
|
|
142
182
|
.eds-mono {
|
|
143
|
-
font-family: var(--font-mono);
|
|
183
|
+
font-family: var(--eds-font-mono);
|
|
144
184
|
font-size: 13px;
|
|
145
|
-
color: var(--text-secondary);
|
|
185
|
+
color: var(--eds-text-secondary);
|
|
146
186
|
}
|
|
147
187
|
|
|
148
188
|
.eds-mono-sm {
|
|
149
|
-
font-family: var(--font-mono);
|
|
189
|
+
font-family: var(--eds-font-mono);
|
|
150
190
|
font-size: 11px;
|
|
151
|
-
color: var(--text-secondary);
|
|
191
|
+
color: var(--eds-text-secondary);
|
|
152
192
|
}
|
|
153
193
|
|
|
154
194
|
.eds-label {
|
|
155
|
-
font-family: var(--font-inter);
|
|
195
|
+
font-family: var(--eds-font-inter);
|
|
156
196
|
font-size: 11px;
|
|
157
197
|
font-weight: 600;
|
|
158
198
|
letter-spacing: 0.06em;
|
|
159
199
|
text-transform: uppercase;
|
|
160
|
-
color: var(--gray-500);
|
|
200
|
+
color: var(--eds-gray-500);
|
|
161
201
|
}
|
|
162
202
|
|
|
163
203
|
.eds-icon {
|
|
@@ -277,17 +317,17 @@
|
|
|
277
317
|
}
|
|
278
318
|
|
|
279
319
|
.eds-gradient-brand {
|
|
280
|
-
background: linear-gradient(135deg, var(--brand-500), var(--violet-500));
|
|
320
|
+
background: linear-gradient(135deg, var(--eds-brand-500), var(--eds-violet-500));
|
|
281
321
|
}
|
|
282
322
|
|
|
283
323
|
.eds-page {
|
|
284
324
|
min-height: calc(100vh - var(--eds-topbar-height));
|
|
285
|
-
background: var(--surface-l1);
|
|
325
|
+
background: var(--eds-surface-l1);
|
|
286
326
|
padding: 24px;
|
|
287
327
|
}
|
|
288
328
|
|
|
289
329
|
.eds-page--dark {
|
|
290
|
-
background: var(--slate-950);
|
|
330
|
+
background: var(--eds-slate-950);
|
|
291
331
|
color: #e4e4e7;
|
|
292
332
|
}
|
|
293
333
|
|
|
@@ -299,25 +339,25 @@
|
|
|
299
339
|
@extend .eds-label;
|
|
300
340
|
text-align: left;
|
|
301
341
|
padding: 10px 16px;
|
|
302
|
-
border-bottom: 1px solid var(--border-default);
|
|
303
|
-
background: var(--surface-l0);
|
|
342
|
+
border-bottom: 1px solid var(--eds-border-default);
|
|
343
|
+
background: var(--eds-surface-l0);
|
|
304
344
|
}
|
|
305
345
|
|
|
306
346
|
tbody td {
|
|
307
347
|
padding: 12px 16px;
|
|
308
348
|
font-size: 13px;
|
|
309
|
-
color: var(--text-primary);
|
|
310
|
-
border-bottom: 1px solid var(--border-default);
|
|
349
|
+
color: var(--eds-text-primary);
|
|
350
|
+
border-bottom: 1px solid var(--eds-border-default);
|
|
311
351
|
}
|
|
312
352
|
|
|
313
353
|
tbody tr:hover td {
|
|
314
|
-
background: var(--surface-l1);
|
|
354
|
+
background: var(--eds-surface-l1);
|
|
315
355
|
}
|
|
316
356
|
}
|
|
317
357
|
|
|
318
358
|
.eds-card {
|
|
319
|
-
background: var(--surface-l0);
|
|
320
|
-
border: 1px solid var(--border-default);
|
|
359
|
+
background: var(--eds-surface-l0);
|
|
360
|
+
border: 1px solid var(--eds-border-default);
|
|
321
361
|
border-radius: var(--eds-radius-lg);
|
|
322
362
|
box-shadow: var(--eds-shadow-sm);
|
|
323
363
|
transition: box-shadow 150ms ease;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
-
import { DatePipe } from '@angular/common';
|
|
4
|
-
import * as i1 from '@angular/forms';
|
|
5
|
-
import { FormsModule } from '@angular/forms';
|
|
6
|
-
import { A as AiReceptionistApiService, E as EdsButtonComponent, b as EdsIconComponent } from './edvak99-voice-receptionist-widget-edvak99-voice-receptionist-widget-CMhknpGf.mjs';
|
|
7
|
-
|
|
8
|
-
class AuditPageComponent {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.api = inject(AiReceptionistApiService);
|
|
11
|
-
this.events = signal([]);
|
|
12
|
-
this.search = signal('');
|
|
13
|
-
this.actor = signal('');
|
|
14
|
-
this.loading = signal(true);
|
|
15
|
-
}
|
|
16
|
-
ngOnInit() {
|
|
17
|
-
this.load();
|
|
18
|
-
}
|
|
19
|
-
load() {
|
|
20
|
-
this.loading.set(true);
|
|
21
|
-
this.api.getAudit(this.search() || undefined).subscribe(({ data }) => {
|
|
22
|
-
this.events.set(data);
|
|
23
|
-
this.loading.set(false);
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AuditPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
27
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: AuditPageComponent, isStandalone: true, selector: "eds-audit-page", ngImport: i0, template: "<div class=\"eds-page audit-page\">\n <header class=\"audit-page__header\">\n <div>\n <h1 class=\"eds-h1\">Audit log</h1>\n <p class=\"eds-body-sm\">Track configuration and agent activity</p>\n </div>\n </header>\n\n <div class=\"eds-card audit-page__filters\">\n <input\n type=\"search\"\n class=\"audit-page__input\"\n placeholder=\"Search action, target, detail\u2026\"\n [ngModel]=\"search()\"\n (ngModelChange)=\"search.set($event)\"\n (keyup.enter)=\"load()\"\n />\n <input\n type=\"text\"\n class=\"audit-page__input\"\n placeholder=\"Filter by actor\"\n [ngModel]=\"actor()\"\n (ngModelChange)=\"actor.set($event)\"\n (keyup.enter)=\"load()\"\n />\n <eds-button variant=\"primary\" (click)=\"load()\">\n <eds-icon name=\"search\" [size]=\"18\" /> Search\n </eds-button>\n </div>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading audit events\u2026</p>\n } @else {\n <div class=\"eds-card audit-page__table-wrap\">\n <table class=\"eds-table\">\n <thead>\n <tr>\n <th>When</th>\n <th>Actor</th>\n <th>Action</th>\n <th>Target</th>\n <th>Detail</th>\n </tr>\n </thead>\n <tbody>\n @for (event of events(); track event.id) {\n <tr>\n <td class=\"eds-mono-sm\">{{ event.at | date: 'medium' }}</td>\n <td>{{ event.actor }}</td>\n <td class=\"eds-body-sm-bold\">{{ event.action }}</td>\n <td class=\"eds-mono-sm\">{{ event.target }}</td>\n <td>{{ event.detail }}</td>\n </tr>\n } @empty {\n <tr>\n <td colspan=\"5\" class=\"audit-page__empty\">No events match your filters.</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n</div>\n", styles: [".audit-page__header{margin-bottom:20px}.audit-page__filters{display:flex;flex-wrap:wrap;gap:10px;padding:14px;margin-bottom:16px;align-items:center}.audit-page__input{flex:1;min-width:180px;padding:8px 12px;border:1px solid var(--border-default);border-radius:var(--eds-radius-md);font-size:14px}.audit-page__table-wrap{overflow-x:auto;padding:0}.audit-page__empty{text-align:center;padding:32px!important;color:var(--text-secondary)}\n"], dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: EdsButtonComponent, selector: "eds-button", inputs: ["variant", "type", "disabled"] }, { kind: "component", type: EdsIconComponent, selector: "eds-icon", inputs: ["name", "size", "fill", "weight"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
28
|
-
}
|
|
29
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: AuditPageComponent, decorators: [{
|
|
30
|
-
type: Component,
|
|
31
|
-
args: [{ selector: 'eds-audit-page', imports: [DatePipe, FormsModule, EdsButtonComponent, EdsIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"eds-page audit-page\">\n <header class=\"audit-page__header\">\n <div>\n <h1 class=\"eds-h1\">Audit log</h1>\n <p class=\"eds-body-sm\">Track configuration and agent activity</p>\n </div>\n </header>\n\n <div class=\"eds-card audit-page__filters\">\n <input\n type=\"search\"\n class=\"audit-page__input\"\n placeholder=\"Search action, target, detail\u2026\"\n [ngModel]=\"search()\"\n (ngModelChange)=\"search.set($event)\"\n (keyup.enter)=\"load()\"\n />\n <input\n type=\"text\"\n class=\"audit-page__input\"\n placeholder=\"Filter by actor\"\n [ngModel]=\"actor()\"\n (ngModelChange)=\"actor.set($event)\"\n (keyup.enter)=\"load()\"\n />\n <eds-button variant=\"primary\" (click)=\"load()\">\n <eds-icon name=\"search\" [size]=\"18\" /> Search\n </eds-button>\n </div>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading audit events\u2026</p>\n } @else {\n <div class=\"eds-card audit-page__table-wrap\">\n <table class=\"eds-table\">\n <thead>\n <tr>\n <th>When</th>\n <th>Actor</th>\n <th>Action</th>\n <th>Target</th>\n <th>Detail</th>\n </tr>\n </thead>\n <tbody>\n @for (event of events(); track event.id) {\n <tr>\n <td class=\"eds-mono-sm\">{{ event.at | date: 'medium' }}</td>\n <td>{{ event.actor }}</td>\n <td class=\"eds-body-sm-bold\">{{ event.action }}</td>\n <td class=\"eds-mono-sm\">{{ event.target }}</td>\n <td>{{ event.detail }}</td>\n </tr>\n } @empty {\n <tr>\n <td colspan=\"5\" class=\"audit-page__empty\">No events match your filters.</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n</div>\n", styles: [".audit-page__header{margin-bottom:20px}.audit-page__filters{display:flex;flex-wrap:wrap;gap:10px;padding:14px;margin-bottom:16px;align-items:center}.audit-page__input{flex:1;min-width:180px;padding:8px 12px;border:1px solid var(--border-default);border-radius:var(--eds-radius-md);font-size:14px}.audit-page__table-wrap{overflow-x:auto;padding:0}.audit-page__empty{text-align:center;padding:32px!important;color:var(--text-secondary)}\n"] }]
|
|
32
|
-
}] });
|
|
33
|
-
|
|
34
|
-
export { AuditPageComponent };
|
|
35
|
-
//# sourceMappingURL=edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edvak99-voice-receptionist-widget-audit-page.component-DL1GfQyF.mjs","sources":["../../../projects/voice-receptionist-widget/src/lib/pages/audit-page/audit-page.component.ts","../../../projects/voice-receptionist-widget/src/lib/pages/audit-page/audit-page.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, OnInit, signal } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\n\nimport { AuditEvent } from '../../models/ai-receptionist.types';\nimport { AiReceptionistApiService } from '../../services/ai-receptionist-api.service';\nimport { EdsButtonComponent } from '../../ui/eds-button.component';\nimport { EdsIconComponent } from '../../ui/eds-icon.component';\n\n@Component({\n selector: 'eds-audit-page',\n imports: [DatePipe, FormsModule, EdsButtonComponent, EdsIconComponent],\n templateUrl: './audit-page.component.html',\n styleUrl: './audit-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AuditPageComponent implements OnInit {\n private readonly api = inject(AiReceptionistApiService);\n\n protected readonly events = signal<AuditEvent[]>([]);\n protected readonly search = signal('');\n protected readonly actor = signal('');\n protected readonly loading = signal(true);\n\n ngOnInit(): void {\n this.load();\n }\n\n protected load(): void {\n this.loading.set(true);\n this.api.getAudit(this.search() || undefined).subscribe(({ data }) => {\n this.events.set(data);\n this.loading.set(false);\n });\n }\n}\n","<div class=\"eds-page audit-page\">\n <header class=\"audit-page__header\">\n <div>\n <h1 class=\"eds-h1\">Audit log</h1>\n <p class=\"eds-body-sm\">Track configuration and agent activity</p>\n </div>\n </header>\n\n <div class=\"eds-card audit-page__filters\">\n <input\n type=\"search\"\n class=\"audit-page__input\"\n placeholder=\"Search action, target, detail…\"\n [ngModel]=\"search()\"\n (ngModelChange)=\"search.set($event)\"\n (keyup.enter)=\"load()\"\n />\n <input\n type=\"text\"\n class=\"audit-page__input\"\n placeholder=\"Filter by actor\"\n [ngModel]=\"actor()\"\n (ngModelChange)=\"actor.set($event)\"\n (keyup.enter)=\"load()\"\n />\n <eds-button variant=\"primary\" (click)=\"load()\">\n <eds-icon name=\"search\" [size]=\"18\" /> Search\n </eds-button>\n </div>\n\n @if (loading()) {\n <p class=\"eds-body-sm\">Loading audit events…</p>\n } @else {\n <div class=\"eds-card audit-page__table-wrap\">\n <table class=\"eds-table\">\n <thead>\n <tr>\n <th>When</th>\n <th>Actor</th>\n <th>Action</th>\n <th>Target</th>\n <th>Detail</th>\n </tr>\n </thead>\n <tbody>\n @for (event of events(); track event.id) {\n <tr>\n <td class=\"eds-mono-sm\">{{ event.at | date: 'medium' }}</td>\n <td>{{ event.actor }}</td>\n <td class=\"eds-body-sm-bold\">{{ event.action }}</td>\n <td class=\"eds-mono-sm\">{{ event.target }}</td>\n <td>{{ event.detail }}</td>\n </tr>\n } @empty {\n <tr>\n <td colspan=\"5\" class=\"audit-page__empty\">No events match your filters.</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n</div>\n"],"names":[],"mappings":";;;;;;;MAgBa,kBAAkB,CAAA;AAP/B,IAAA,WAAA,GAAA;AAQmB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAEpC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAe,EAAE,CAAC;AACjC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;AACnB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;AAClB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;AAa1C,IAAA;IAXC,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,EAAE;IACb;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,KAAI;AACnE,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,CAAC,CAAC;IACJ;+GAlBW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChB/B,i4DA+DA,EAAA,MAAA,EAAA,CAAA,sbAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EDpDc,QAAQ,4CAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAK5D,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EACjB,CAAC,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAGrD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,i4DAAA,EAAA,MAAA,EAAA,CAAA,sbAAA,CAAA,EAAA;;;;;"}
|
package/fesm2022/edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"edvak99-voice-receptionist-widget-call-history-page.component-Cj4wxd4e.mjs","sources":["../../../projects/voice-receptionist-widget/src/lib/pages/call-history-page/call-history-page.component.ts","../../../projects/voice-receptionist-widget/src/lib/pages/call-history-page/call-history-page.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, OnInit, signal } from '@angular/core';\n\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { DatePipe } from '@angular/common';\n\nimport { FormsModule } from '@angular/forms';\n\n\n\nimport { HistoryCall } from '../../models/ai-receptionist.types';\n\nimport { AiReceptionistApiService } from '../../services/ai-receptionist-api.service';\n\nimport { CallReviewService } from '../../services/call-review.service';\n\nimport { formatOutcomeLabel, outcomeBadgeTone } from '../../utils/call-outcome.util';\n\nimport {\n\n isNeedsReview,\n\n matchesReviewFilter,\n\n reviewBadgeTone,\n\n reviewLabel,\n\n ReviewFilterTab,\n\n} from '../../utils/call-review.util';\n\nimport { EdsAvatarComponent } from '../../ui/eds-avatar.component';\n\nimport { EdsBadgeComponent } from '../../ui/eds-badge.component';\n\nimport { EdsButtonComponent } from '../../ui/eds-button.component';\n\nimport { EdsIconComponent } from '../../ui/eds-icon.component';\n\nimport { ToastService } from '../../shared/toast.service';\n\n\n\n@Component({\n selector: 'eds-call-history-page',\n imports: [\n DatePipe,\n FormsModule,\n EdsAvatarComponent,\n EdsBadgeComponent,\n EdsButtonComponent,\n EdsIconComponent,\n ],\n templateUrl: './call-history-page.component.html',\n styleUrl: './call-history-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n\nexport class CallHistoryPageComponent implements OnInit {\n\n private readonly api = inject(AiReceptionistApiService);\n\n private readonly reviewService = inject(CallReviewService);\n\n private readonly toast = inject(ToastService);\n\n private readonly route = inject(ActivatedRoute);\n\n private readonly router = inject(Router);\n\n\n\n protected readonly allRows = signal<HistoryCall[]>([]);\n\n protected readonly loading = signal(true);\n\n protected readonly reviewingId = signal<string | null>(null);\n\n protected readonly search = signal('');\n\n protected readonly direction = signal('');\n\n protected readonly outcome = signal('');\n\n protected readonly location = signal('');\n\n protected readonly reviewTab = signal<ReviewFilterTab>('all');\n\n\n\n protected readonly reviewTabs: { id: ReviewFilterTab; label: string }[] = [\n\n { id: 'all', label: 'All' },\n\n { id: 'needs', label: 'Needs review' },\n\n { id: 'reviewed', label: 'Reviewed' },\n\n ];\n\n\n\n protected readonly rows = computed(() => {\n\n const tab = this.reviewTab();\n\n return this.allRows().filter((row) => matchesReviewFilter(row.review, tab));\n\n });\n\n\n\n protected readonly needsReviewCount = computed(\n\n () => this.allRows().filter((r) => isNeedsReview(r.review)).length,\n\n );\n\n\n\n protected reviewLabel = reviewLabel;\n\n protected reviewTone = reviewBadgeTone;\n\n protected isNeedsReview = isNeedsReview;\n\n protected outcomeTone = outcomeBadgeTone;\n\n protected outcomeLabel = formatOutcomeLabel;\n\n\n\n ngOnInit(): void {\n\n const reviewParam = this.route.snapshot.queryParamMap.get('review');\n\n if (reviewParam === 'needs' || reviewParam === 'reviewed') {\n\n this.reviewTab.set(reviewParam);\n\n }\n\n this.load();\n\n }\n\n\n\n protected load(): void {\n\n this.loading.set(true);\n\n this.api\n\n .getHistory({\n\n q: this.search() || undefined,\n\n dir: this.direction() || undefined,\n\n outcome: this.outcome() || undefined,\n\n location: this.location() || undefined,\n\n })\n\n .subscribe(({ data }) => {\n\n this.allRows.set(data);\n\n this.loading.set(false);\n\n });\n\n }\n\n\n\n protected applyFilters(): void {\n\n this.load();\n\n }\n\n\n\n protected setReviewTab(tab: ReviewFilterTab): void {\n\n this.reviewTab.set(tab);\n\n void this.router.navigate([], {\n\n relativeTo: this.route,\n\n queryParams: tab === 'all' ? { review: null } : { review: tab },\n\n queryParamsHandling: 'merge',\n\n replaceUrl: true,\n\n });\n\n }\n\n\n\n protected tabBadgeCount(tab: ReviewFilterTab): number | null {\n\n if (tab !== 'needs') return null;\n\n const count = this.needsReviewCount();\n\n return count > 0 ? count : null;\n\n }\n\n\n\n protected markReviewed(row: HistoryCall, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (!isNeedsReview(row.review) || this.reviewingId()) return;\n\n\n\n this.reviewingId.set(row.id);\n\n this.allRows.update((list) =>\n\n list.map((r) => (r.id === row.id ? { ...r, review: 'reviewed' as const } : r)),\n\n );\n\n\n\n this.reviewService.markReviewed(row.id).subscribe({\n\n next: () => {\n\n this.reviewingId.set(null);\n\n this.toast.show('Call marked as reviewed', 'success');\n\n },\n\n error: () => {\n\n this.reviewingId.set(null);\n\n this.allRows.update((list) =>\n\n list.map((r) => (r.id === row.id ? { ...r, review: 'needs' as const } : r)),\n\n );\n\n this.toast.show('Failed to mark call as reviewed', 'error');\n\n },\n\n });\n\n }\n\n\n\n protected formatDuration(sec: number): string {\n const m = Math.floor(sec / 60);\n const s = sec % 60;\n return `${m}:${s.toString().padStart(2, '0')}`;\n }\n\n protected openCallDetail(id: string): void {\n void this.router.navigate(['../history', id], { relativeTo: this.route });\n }\n\n protected exportCsv(): void {\n\n const header = 'ID,Name,Phone,Direction,Outcome,Reason,Duration,Location,Review\\n';\n\n const body = this.rows()\n\n .map(\n\n (r) =>\n\n `${r.id},${r.name},${r.phone},${r.direction},${r.outcome},${r.reason},${r.duration},${r.location},${reviewLabel(r.review)}`,\n\n )\n\n .join('\\n');\n\n const blob = new Blob([header + body], { type: 'text/csv' });\n\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement('a');\n\n a.href = url;\n\n a.download = 'call-history.csv';\n\n a.click();\n\n URL.revokeObjectURL(url);\n\n }\n\n}\n\n\n","<div class=\"eds-page call-history-page\">\n\n <header class=\"call-history-page__header\">\n\n <div>\n\n <h1 class=\"eds-h1\">Call history</h1>\n\n <p class=\"eds-body-sm\">Search and review completed conversations</p>\n\n </div>\n\n <eds-button variant=\"secondary\" (click)=\"exportCsv()\">\n\n <eds-icon name=\"download\" [size]=\"18\" /> Export CSV\n\n </eds-button>\n\n </header>\n\n\n\n <nav class=\"call-history-page__review-tabs\" aria-label=\"Review status\">\n\n @for (t of reviewTabs; track t.id) {\n\n <button\n\n type=\"button\"\n\n class=\"call-history-page__review-tab\"\n\n [class.call-history-page__review-tab--active]=\"reviewTab() === t.id\"\n\n (click)=\"setReviewTab(t.id)\"\n\n >\n\n {{ t.label }}\n\n @if (tabBadgeCount(t.id); as count) {\n\n <span class=\"call-history-page__tab-badge\">{{ count }}</span>\n\n }\n\n </button>\n\n }\n\n </nav>\n\n\n\n <div class=\"eds-card call-history-page__filters\">\n\n <input\n\n type=\"search\"\n\n class=\"call-history-page__search\"\n\n placeholder=\"Search name, phone, reason…\"\n\n [ngModel]=\"search()\"\n\n (ngModelChange)=\"search.set($event)\"\n\n (keyup.enter)=\"applyFilters()\"\n\n />\n\n <select class=\"call-history-page__select\" [ngModel]=\"direction()\" (ngModelChange)=\"direction.set($event)\">\n\n <option value=\"\">All directions</option>\n\n <option value=\"inbound\">Inbound</option>\n\n <option value=\"outbound\">Outbound</option>\n\n </select>\n\n <input\n\n type=\"text\"\n\n class=\"call-history-page__select\"\n\n placeholder=\"Outcome\"\n\n [ngModel]=\"outcome()\"\n\n (ngModelChange)=\"outcome.set($event)\"\n\n />\n\n <input\n\n type=\"text\"\n\n class=\"call-history-page__select\"\n\n placeholder=\"Location\"\n\n [ngModel]=\"location()\"\n\n (ngModelChange)=\"location.set($event)\"\n\n />\n\n <eds-button variant=\"primary\" (click)=\"applyFilters()\">Apply</eds-button>\n\n </div>\n\n\n\n @if (loading()) {\n\n <p class=\"eds-body-sm\">Loading history…</p>\n\n } @else {\n\n <div class=\"eds-card call-history-page__table-wrap\">\n\n <table class=\"eds-table\">\n\n <thead>\n\n <tr>\n\n <th>Caller</th>\n\n <th>Direction</th>\n\n <th>Reason</th>\n\n <th>Status</th>\n\n <th>Duration</th>\n\n <th>Date & time</th>\n\n <th>Review</th>\n\n <th></th>\n\n </tr>\n\n </thead>\n\n <tbody>\n\n @for (row of rows(); track row.id) {\n\n <tr\n class=\"call-history-page__row\"\n [class.call-history-page__row--needs-review]=\"isNeedsReview(row.review)\"\n tabindex=\"0\"\n role=\"link\"\n [attr.aria-label]=\"'View call details for ' + row.name\"\n (click)=\"openCallDetail(row.id)\"\n (keyup.enter)=\"openCallDetail(row.id)\"\n >\n <td>\n <div class=\"call-history-page__caller\">\n <eds-avatar [initials]=\"row.initials\" />\n <span>{{ row.name }}</span>\n </div>\n </td>\n\n <td>{{ row.direction }}</td>\n\n <td>{{ row.reason }}</td>\n\n <td>\n\n <eds-badge [tone]=\"outcomeTone(row.outcome)\">\n\n {{ outcomeLabel(row.outcome) }}\n\n </eds-badge>\n\n </td>\n\n <td class=\"eds-mono-sm\">{{ row.durationLabel ?? formatDuration(row.duration) }}</td>\n\n <td class=\"eds-mono-sm\">\n {{ row.started ? (row.started | date: 'medium') : (row.whenLabel ?? '—') }}\n </td>\n\n <td>\n\n <eds-badge [tone]=\"reviewTone(row.review)\">\n\n {{ reviewLabel(row.review) }}\n\n </eds-badge>\n\n </td>\n\n <td class=\"call-history-page__actions\">\n\n @if (isNeedsReview(row.review)) {\n\n <button\n\n type=\"button\"\n\n class=\"call-history-page__mark-btn\"\n\n title=\"Mark as reviewed\"\n\n [disabled]=\"reviewingId() === row.id\"\n\n (click)=\"markReviewed(row, $event)\"\n\n >\n\n <eds-icon name=\"check_circle\" [size]=\"18\" />\n\n </button>\n\n }\n\n </td>\n\n </tr>\n\n } @empty {\n\n <tr>\n\n <td colspan=\"8\" class=\"eds-body-sm\">No calls match this filter.</td>\n\n </tr>\n\n }\n\n </tbody>\n\n </table>\n\n </div>\n\n }\n\n</div>\n\n\n"],"names":[],"mappings":"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"}
|