ahs-cti 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/dist/agentDetailReport-F44HMQ5O.mjs +27 -0
  2. package/dist/agentDetailReport-F44HMQ5O.mjs.map +1 -0
  3. package/dist/{agentPerformanceReport-JZK5DN5E.mjs → agentPerformanceReport-TTOMNENK.mjs} +25 -15
  4. package/dist/{agentPerformanceReport-JZK5DN5E.mjs.map → agentPerformanceReport-TTOMNENK.mjs.map} +1 -1
  5. package/dist/auditReport-QTMAKVTN.mjs +26 -0
  6. package/dist/auditReport-QTMAKVTN.mjs.map +1 -0
  7. package/dist/{callHistory-T3M76D4B.mjs → callHistory-4J4J2XHA.mjs} +20 -10
  8. package/dist/{callHistory-T3M76D4B.mjs.map → callHistory-4J4J2XHA.mjs.map} +1 -1
  9. package/dist/{campaigns-5PVHXBSD.mjs → campaigns-N3UNUGQP.mjs} +23 -13
  10. package/dist/{campaigns-5PVHXBSD.mjs.map → campaigns-N3UNUGQP.mjs.map} +1 -1
  11. package/dist/{caroQualityAuditDashboard-EUDYZ3QY.mjs → caroQualityAuditDashboard-TNS4L2NR.mjs} +12 -2
  12. package/dist/{caroQualityAuditDashboard-EUDYZ3QY.mjs.map → caroQualityAuditDashboard-TNS4L2NR.mjs.map} +1 -1
  13. package/dist/{caroVoiceAI-GGJCVUIQ.mjs → caroVoiceAI-OUTAAIFE.mjs} +12 -2
  14. package/dist/{caroVoiceAI-GGJCVUIQ.mjs.map → caroVoiceAI-OUTAAIFE.mjs.map} +1 -1
  15. package/dist/{cdrReport-ZMDHSZUW.mjs → cdrReport-Z35OLYUL.mjs} +26 -16
  16. package/dist/{cdrReport-ZMDHSZUW.mjs.map → cdrReport-Z35OLYUL.mjs.map} +1 -1
  17. package/dist/chunk-3PNP6G5P.mjs +92 -0
  18. package/dist/chunk-3PNP6G5P.mjs.map +1 -0
  19. package/dist/{chunk-DF5EFKXC.mjs → chunk-45MLTWV7.mjs} +12 -2
  20. package/dist/{chunk-DF5EFKXC.mjs.map → chunk-45MLTWV7.mjs.map} +1 -1
  21. package/dist/chunk-635IIVZE.mjs +24 -0
  22. package/dist/{chunk-FRKV2U3I.mjs.map → chunk-635IIVZE.mjs.map} +1 -1
  23. package/dist/chunk-677RFPP5.mjs +24 -0
  24. package/dist/{chunk-7LE2VTAI.mjs.map → chunk-677RFPP5.mjs.map} +1 -1
  25. package/dist/{chunk-Q6G3MPS7.mjs → chunk-ERSNXW5X.mjs} +11 -1
  26. package/dist/{chunk-Q6G3MPS7.mjs.map → chunk-ERSNXW5X.mjs.map} +1 -1
  27. package/dist/{chunk-H7GRWLYI.mjs → chunk-G6KRLGGC.mjs} +13 -3
  28. package/dist/{chunk-H7GRWLYI.mjs.map → chunk-G6KRLGGC.mjs.map} +1 -1
  29. package/dist/chunk-GFVR3HLK.mjs +24 -0
  30. package/dist/{chunk-6WLG2PXL.mjs.map → chunk-GFVR3HLK.mjs.map} +1 -1
  31. package/dist/{chunk-E6KYWWAI.mjs → chunk-GTI2ZVQX.mjs} +12 -2
  32. package/dist/{chunk-E6KYWWAI.mjs.map → chunk-GTI2ZVQX.mjs.map} +1 -1
  33. package/dist/chunk-H22TUCN3.mjs +24 -0
  34. package/dist/{chunk-AOJRUZTO.mjs.map → chunk-H22TUCN3.mjs.map} +1 -1
  35. package/dist/{chunk-YAQYTUTX.mjs → chunk-HAOFUADN.mjs} +12 -2
  36. package/dist/{chunk-YAQYTUTX.mjs.map → chunk-HAOFUADN.mjs.map} +1 -1
  37. package/dist/{chunk-33QNSXP7.mjs → chunk-JHC7OUQG.mjs} +21 -11
  38. package/dist/chunk-JHC7OUQG.mjs.map +1 -0
  39. package/dist/chunk-KSVNZKRD.mjs +10930 -0
  40. package/dist/chunk-KSVNZKRD.mjs.map +1 -0
  41. package/dist/{chunk-VVDJLUYT.mjs → chunk-M7FJYZF6.mjs} +12 -2
  42. package/dist/{chunk-VVDJLUYT.mjs.map → chunk-M7FJYZF6.mjs.map} +1 -1
  43. package/dist/{chunk-DNTGBNZD.mjs → chunk-NDZDJWXY.mjs} +13 -3
  44. package/dist/{chunk-DNTGBNZD.mjs.map → chunk-NDZDJWXY.mjs.map} +1 -1
  45. package/dist/chunk-S2SMCH2C.mjs +71 -0
  46. package/dist/chunk-S2SMCH2C.mjs.map +1 -0
  47. package/dist/{chunk-IDZWA6HG.mjs → chunk-S34CQVTF.mjs} +14 -4
  48. package/dist/{chunk-IDZWA6HG.mjs.map → chunk-S34CQVTF.mjs.map} +1 -1
  49. package/dist/{chunk-2M3YEXYA.mjs → chunk-SUS5RUCA.mjs} +17 -7
  50. package/dist/{chunk-2M3YEXYA.mjs.map → chunk-SUS5RUCA.mjs.map} +1 -1
  51. package/dist/{chunk-3J7KQNEU.mjs → chunk-TCYBXDAP.mjs} +13 -3
  52. package/dist/{chunk-3J7KQNEU.mjs.map → chunk-TCYBXDAP.mjs.map} +1 -1
  53. package/dist/chunk-VII5JNA6.mjs +24 -0
  54. package/dist/{chunk-WTBVFN4H.mjs.map → chunk-VII5JNA6.mjs.map} +1 -1
  55. package/dist/chunk-W3ECDLUB.mjs +24 -0
  56. package/dist/{chunk-OHJIW3I3.mjs.map → chunk-W3ECDLUB.mjs.map} +1 -1
  57. package/dist/{chunk-VBIDPX5Z.mjs → chunk-Y4PAUTZ4.mjs} +13 -3
  58. package/dist/{chunk-VBIDPX5Z.mjs.map → chunk-Y4PAUTZ4.mjs.map} +1 -1
  59. package/dist/{chunk-NAZO4HKB.mjs → chunk-ZSRD3ZXF.mjs} +12 -2
  60. package/dist/{chunk-NAZO4HKB.mjs.map → chunk-ZSRD3ZXF.mjs.map} +1 -1
  61. package/dist/index.mjs +33 -23
  62. package/dist/index.mjs.map +1 -1
  63. package/dist/{liveStatus-YSBYSVOO.mjs → liveStatus-PRDEL7CK.mjs} +16 -6
  64. package/dist/{liveStatus-YSBYSVOO.mjs.map → liveStatus-PRDEL7CK.mjs.map} +1 -1
  65. package/dist/{loginReport-YIVBJVJD.mjs → loginReport-47QNACQU.mjs} +22 -12
  66. package/dist/{loginReport-YIVBJVJD.mjs.map → loginReport-47QNACQU.mjs.map} +1 -1
  67. package/dist/{managementDashboard-7EMQC2UA.mjs → managementDashboard-SZFYULKA.mjs} +22 -12
  68. package/dist/{managementDashboard-7EMQC2UA.mjs.map → managementDashboard-SZFYULKA.mjs.map} +1 -1
  69. package/dist/{qualityAuditDashboard-ENGQN2WQ.mjs → qualityAuditDashboard-FHRGB77R.mjs} +12 -2
  70. package/dist/{qualityAuditDashboard-ENGQN2WQ.mjs.map → qualityAuditDashboard-FHRGB77R.mjs.map} +1 -1
  71. package/dist-react/agentDetailReport-PDKQKJNL.mjs +23 -0
  72. package/dist-react/agentPerformanceReport-MU2FASNN.mjs +544 -0
  73. package/dist-react/agentPerformanceReport-MU2FASNN.mjs.map +1 -0
  74. package/dist-react/auditReport-WH2KDNYT.mjs +25 -0
  75. package/{dist/auditReport-6ZUJ4UFO.mjs.map → dist-react/auditReport-WH2KDNYT.mjs.map} +1 -1
  76. package/dist-react/callHistory-HXXRYUIV.mjs +832 -0
  77. package/dist-react/callHistory-HXXRYUIV.mjs.map +1 -0
  78. package/dist-react/campaigns-J7KIAATE.mjs +3139 -0
  79. package/dist-react/campaigns-J7KIAATE.mjs.map +1 -0
  80. package/dist-react/caroQualityAuditDashboard-THYPVOCP.mjs +76 -0
  81. package/dist-react/caroQualityAuditDashboard-THYPVOCP.mjs.map +1 -0
  82. package/dist-react/caroVoiceAI-XGDUETXI.mjs +31 -0
  83. package/dist-react/caroVoiceAI-XGDUETXI.mjs.map +1 -0
  84. package/dist-react/cdrReport-SX2FZAO6.mjs +858 -0
  85. package/dist-react/cdrReport-SX2FZAO6.mjs.map +1 -0
  86. package/dist-react/chunk-4YF4IDV6.mjs +72 -0
  87. package/dist-react/chunk-4YF4IDV6.mjs.map +1 -0
  88. package/dist-react/chunk-ADM2JJCP.mjs +190 -0
  89. package/dist-react/chunk-ADM2JJCP.mjs.map +1 -0
  90. package/dist-react/chunk-EN7HM2MD.mjs +688 -0
  91. package/dist-react/chunk-EN7HM2MD.mjs.map +1 -0
  92. package/{dist/chunk-LHE4QGJJ.mjs → dist-react/chunk-F7G2XFRU.mjs} +12 -2
  93. package/{dist/chunk-LHE4QGJJ.mjs.map → dist-react/chunk-F7G2XFRU.mjs.map} +1 -1
  94. package/{dist/chunk-DJP744FF.mjs → dist-react/chunk-GUMGXVIT.mjs} +12 -2
  95. package/{dist/chunk-DJP744FF.mjs.map → dist-react/chunk-GUMGXVIT.mjs.map} +1 -1
  96. package/dist-react/chunk-KRXHK4AU.mjs +127 -0
  97. package/dist-react/chunk-KRXHK4AU.mjs.map +1 -0
  98. package/{dist/chunk-U2UDKXMB.mjs → dist-react/chunk-LWDAC6QU.mjs} +12 -2
  99. package/{dist/chunk-U2UDKXMB.mjs.map → dist-react/chunk-LWDAC6QU.mjs.map} +1 -1
  100. package/dist-react/chunk-LX6I32Y4.mjs +106 -0
  101. package/dist-react/chunk-LX6I32Y4.mjs.map +1 -0
  102. package/dist-react/chunk-MCD5FQNY.mjs +428 -0
  103. package/dist-react/chunk-MCD5FQNY.mjs.map +1 -0
  104. package/dist-react/chunk-MD472UKG.mjs +757 -0
  105. package/{dist/chunk-33QNSXP7.mjs.map → dist-react/chunk-MD472UKG.mjs.map} +1 -1
  106. package/dist-react/chunk-ORNNWQI6.mjs +67 -0
  107. package/dist-react/chunk-ORNNWQI6.mjs.map +1 -0
  108. package/dist-react/chunk-S4J35V4B.mjs +126 -0
  109. package/dist-react/chunk-S4J35V4B.mjs.map +1 -0
  110. package/dist-react/chunk-T53WMN5A.mjs +126 -0
  111. package/dist-react/chunk-T53WMN5A.mjs.map +1 -0
  112. package/dist-react/chunk-UTSRABCL.mjs +96 -0
  113. package/dist-react/chunk-UTSRABCL.mjs.map +1 -0
  114. package/dist-react/incoming-4WP3FJI4.mp3 +0 -0
  115. package/dist-react/incoming.mp3 +0 -0
  116. package/dist-react/index.d.mts +2476 -0
  117. package/dist-react/index.d.ts +2477 -0
  118. package/dist-react/index.js +26713 -0
  119. package/dist-react/index.js.map +1 -0
  120. package/dist-react/index.mjs +4675 -0
  121. package/dist-react/index.mjs.map +1 -0
  122. package/dist-react/liveStatus-IDZ7CPYK.mjs +1087 -0
  123. package/dist-react/liveStatus-IDZ7CPYK.mjs.map +1 -0
  124. package/dist-react/loginReport-F47GUU53.mjs +990 -0
  125. package/dist-react/loginReport-F47GUU53.mjs.map +1 -0
  126. package/dist-react/managementDashboard-GC5E7NEL.mjs +540 -0
  127. package/dist-react/managementDashboard-GC5E7NEL.mjs.map +1 -0
  128. package/dist-react/qualityAuditDashboard-ZAM7HRNH.mjs +76 -0
  129. package/dist-react/qualityAuditDashboard-ZAM7HRNH.mjs.map +1 -0
  130. package/package.json +17 -2
  131. package/dist/agentDetailReport-ZR7U2LLB.mjs +0 -17
  132. package/dist/auditReport-6ZUJ4UFO.mjs +0 -16
  133. package/dist/chunk-6WLG2PXL.mjs +0 -14
  134. package/dist/chunk-7LE2VTAI.mjs +0 -14
  135. package/dist/chunk-AOJRUZTO.mjs +0 -14
  136. package/dist/chunk-FRKV2U3I.mjs +0 -14
  137. package/dist/chunk-OHJIW3I3.mjs +0 -14
  138. package/dist/chunk-WTBVFN4H.mjs +0 -14
  139. /package/{dist/agentDetailReport-ZR7U2LLB.mjs.map → dist-react/agentDetailReport-PDKQKJNL.mjs.map} +0 -0
@@ -0,0 +1,858 @@
1
+ import * as __ext_react from "react";
2
+ import * as __ext_react_dom from "react-dom";
3
+ import * as __ext_react_jsx from "react/jsx-runtime";
4
+ var __cjsExternals = { "react": __ext_react, "react-dom": __ext_react_dom, "react/jsx-runtime": __ext_react_jsx };
5
+ var require = function (id) {
6
+ var mod = __cjsExternals[id];
7
+ if (mod) return mod.default || mod;
8
+ throw new Error('Dynamic require of "' + id + '" is not supported');
9
+ };
10
+
11
+ import {
12
+ exportCdrReportToExcel,
13
+ getCdrReport,
14
+ getQueues,
15
+ getRecordingByCall
16
+ } from "./chunk-GUMGXVIT.mjs";
17
+ import {
18
+ AuditReportDialog
19
+ } from "./chunk-EN7HM2MD.mjs";
20
+ import {
21
+ ReportFilterBar,
22
+ SearchBar,
23
+ headCellSx
24
+ } from "./chunk-MCD5FQNY.mjs";
25
+ import {
26
+ SDKPermissionGuard,
27
+ useSDKPermissions
28
+ } from "./chunk-ADM2JJCP.mjs";
29
+ import {
30
+ PageHeader
31
+ } from "./chunk-KRXHK4AU.mjs";
32
+ import {
33
+ AppButton
34
+ } from "./chunk-LX6I32Y4.mjs";
35
+ import "./chunk-UTSRABCL.mjs";
36
+ import {
37
+ SDKProvider
38
+ } from "./chunk-4YF4IDV6.mjs";
39
+ import {
40
+ SDK_PERMISSIONS,
41
+ deepFindArray
42
+ } from "./chunk-F7G2XFRU.mjs";
43
+ import {
44
+ __spreadProps,
45
+ __spreadValues
46
+ } from "./chunk-S4J35V4B.mjs";
47
+
48
+ // call-control-sdk/lib/pages/cdrReport/index.tsx
49
+ import {
50
+ useCallback,
51
+ useEffect,
52
+ useMemo,
53
+ useRef,
54
+ useState
55
+ } from "react";
56
+ import {
57
+ Alert,
58
+ Box,
59
+ Chip,
60
+ Paper,
61
+ Stack,
62
+ Table,
63
+ TableBody,
64
+ TableCell,
65
+ TableContainer,
66
+ TableHead,
67
+ TableRow,
68
+ TablePagination,
69
+ TableSortLabel,
70
+ CircularProgress,
71
+ IconButton,
72
+ Tooltip,
73
+ Typography
74
+ } from "@mui/material";
75
+ import DownloadIcon from "@mui/icons-material/Download";
76
+ import RefreshIcon from "@mui/icons-material/Refresh";
77
+ import PlayArrowIcon from "@mui/icons-material/PlayArrow";
78
+ import FileDownloadIcon from "@mui/icons-material/FileDownload";
79
+ import AssignmentIcon from "@mui/icons-material/Assignment";
80
+ import dayjs from "dayjs";
81
+ import isoWeek from "dayjs/plugin/isoWeek";
82
+ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
83
+ import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
84
+ import { jsx, jsxs } from "react/jsx-runtime";
85
+ dayjs.extend(isoWeek);
86
+ var FONT = "'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif";
87
+ var COLORS = {
88
+ navy: "#0d2a56",
89
+ blue: "#1565c8",
90
+ green: "#0a9a62",
91
+ amber: "#c47c00",
92
+ red: "#cc2a2a",
93
+ purple: "#6b3fbf",
94
+ bg: "transparent",
95
+ surface: "transparent"
96
+ };
97
+ var DEFAULT_PAGE_SIZE = 15;
98
+ var comparator = (a, b, key) => {
99
+ const av = a[key];
100
+ const bv = b[key];
101
+ if (typeof av === "number" && typeof bv === "number") return av - bv;
102
+ if (typeof av === "boolean" && typeof bv === "boolean")
103
+ return (av ? 1 : 0) - (bv ? 1 : 0);
104
+ return String(av != null ? av : "").localeCompare(String(bv != null ? bv : ""));
105
+ };
106
+ function CallTypePill({ value }) {
107
+ const v = (value || "").toLowerCase();
108
+ let color = "#6b7b8d";
109
+ let bg = "transparent";
110
+ if (v.includes("inbound")) {
111
+ color = COLORS.green;
112
+ bg = "#e6f7ef";
113
+ } else if (v.includes("outbound")) {
114
+ color = COLORS.blue;
115
+ bg = "#e3eefa";
116
+ } else if (v.includes("internal")) {
117
+ color = COLORS.purple;
118
+ bg = "#f0e8ff";
119
+ }
120
+ return /* @__PURE__ */ jsx(
121
+ Chip,
122
+ {
123
+ label: value,
124
+ size: "small",
125
+ sx: {
126
+ fontFamily: FONT,
127
+ bgcolor: bg,
128
+ color,
129
+ fontWeight: 600,
130
+ fontSize: "0.65rem",
131
+ height: 20,
132
+ borderRadius: "6px"
133
+ }
134
+ }
135
+ );
136
+ }
137
+ function StatusPill({ value }) {
138
+ const v = (value || "").toLowerCase();
139
+ let color = "#6b7b8d";
140
+ let bg = "transparent";
141
+ if (v.includes("answered")) {
142
+ color = COLORS.green;
143
+ bg = "#e6f7ef";
144
+ } else if (v.includes("abandoned") || v.includes("missed")) {
145
+ color = COLORS.red;
146
+ bg = "#fce8e8";
147
+ }
148
+ return /* @__PURE__ */ jsx(
149
+ Chip,
150
+ {
151
+ label: value,
152
+ size: "small",
153
+ sx: {
154
+ fontFamily: FONT,
155
+ bgcolor: bg,
156
+ color,
157
+ fontWeight: 600,
158
+ fontSize: "0.65rem",
159
+ height: 20,
160
+ borderRadius: "6px"
161
+ }
162
+ }
163
+ );
164
+ }
165
+ var fmtRecordingDuration = (s) => {
166
+ if (!isFinite(s) || s < 0) return "";
167
+ const m = Math.floor(s / 60);
168
+ const sec = Math.floor(s % 60);
169
+ return `${m}:${sec.toString().padStart(2, "0")}`;
170
+ };
171
+ var activePlayers = /* @__PURE__ */ new Set();
172
+ var notifyPlay = (activeId) => {
173
+ activePlayers.forEach((fn) => fn(activeId));
174
+ };
175
+ function RecordingCell({
176
+ callUuid,
177
+ recordingPath
178
+ }) {
179
+ const [audioUrl, setAudioUrl] = useState(null);
180
+ const [loading, setLoading] = useState(false);
181
+ const [error, setError] = useState(false);
182
+ const [durationSec, setDurationSec] = useState(null);
183
+ const [currentSec, setCurrentSec] = useState(0);
184
+ const unavailable = recordingPath === null;
185
+ const totalLabel = durationSec != null ? fmtRecordingDuration(durationSec) : "";
186
+ const closePlayer = useCallback(() => {
187
+ setAudioUrl((prev) => {
188
+ if (prev && prev.startsWith("blob:")) URL.revokeObjectURL(prev);
189
+ return null;
190
+ });
191
+ setCurrentSec(0);
192
+ setDurationSec(null);
193
+ }, []);
194
+ useEffect(() => {
195
+ const onPlay = (activeId) => {
196
+ if (activeId !== callUuid) closePlayer();
197
+ };
198
+ activePlayers.add(onPlay);
199
+ return () => {
200
+ activePlayers.delete(onPlay);
201
+ };
202
+ }, [callUuid, closePlayer]);
203
+ const handlePlay = async () => {
204
+ if (audioUrl) return;
205
+ notifyPlay(callUuid);
206
+ try {
207
+ setLoading(true);
208
+ setError(false);
209
+ const blob = await getRecordingByCall(callUuid);
210
+ const url = URL.createObjectURL(blob);
211
+ setAudioUrl(url);
212
+ } catch (e) {
213
+ setError(true);
214
+ } finally {
215
+ setLoading(false);
216
+ }
217
+ };
218
+ const handleDownload = async () => {
219
+ try {
220
+ const blob = audioUrl ? await fetch(audioUrl).then((r) => r.blob()) : await getRecordingByCall(callUuid);
221
+ const url = URL.createObjectURL(blob);
222
+ const a = document.createElement("a");
223
+ a.href = url;
224
+ a.download = `recording_${callUuid}.wav`;
225
+ a.click();
226
+ URL.revokeObjectURL(url);
227
+ } catch (e) {
228
+ }
229
+ };
230
+ if (audioUrl) {
231
+ return /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
232
+ /* @__PURE__ */ jsx(
233
+ "audio",
234
+ {
235
+ controls: true,
236
+ autoPlay: true,
237
+ src: audioUrl,
238
+ onLoadedMetadata: (e) => setDurationSec(e.currentTarget.duration),
239
+ onTimeUpdate: (e) => setCurrentSec(e.currentTarget.currentTime),
240
+ onEnded: closePlayer,
241
+ style: { width: 180, height: 30 }
242
+ }
243
+ ),
244
+ totalLabel && /* @__PURE__ */ jsxs(Typography, { sx: { fontSize: 12, fontWeight: 600, color: COLORS.navy, whiteSpace: "nowrap" }, children: [
245
+ fmtRecordingDuration(currentSec),
246
+ " / ",
247
+ totalLabel
248
+ ] }),
249
+ /* @__PURE__ */ jsx(Tooltip, { title: "Download", children: /* @__PURE__ */ jsx(
250
+ IconButton,
251
+ {
252
+ size: "small",
253
+ onClick: handleDownload,
254
+ sx: { color: COLORS.blue, p: 0.4 },
255
+ children: /* @__PURE__ */ jsx(FileDownloadIcon, { sx: { fontSize: 16 } })
256
+ }
257
+ ) })
258
+ ] });
259
+ }
260
+ return /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 0.3 }, children: [
261
+ /* @__PURE__ */ jsx(Tooltip, { title: unavailable || error ? "Recording Unavailable" : "Play", children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
262
+ IconButton,
263
+ {
264
+ size: "small",
265
+ onClick: handlePlay,
266
+ disabled: loading || error || unavailable,
267
+ sx: { color: unavailable ? "#b0b8c8" : COLORS.green, p: 0.4 },
268
+ children: loading ? /* @__PURE__ */ jsx(CircularProgress, { size: 14 }) : /* @__PURE__ */ jsx(PlayArrowIcon, { sx: { fontSize: 16 } })
269
+ }
270
+ ) }) }),
271
+ /* @__PURE__ */ jsx(
272
+ Tooltip,
273
+ {
274
+ title: unavailable || error ? "Recording Unavailable" : "Download",
275
+ children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
276
+ IconButton,
277
+ {
278
+ size: "small",
279
+ onClick: handleDownload,
280
+ disabled: loading || error || unavailable,
281
+ sx: { color: unavailable ? "#b0b8c8" : COLORS.blue, p: 0.4 },
282
+ children: /* @__PURE__ */ jsx(FileDownloadIcon, { sx: { fontSize: 16 } })
283
+ }
284
+ ) })
285
+ }
286
+ ),
287
+ totalLabel && /* @__PURE__ */ jsx(Typography, { sx: { fontSize: 12, fontWeight: 600, color: COLORS.navy, whiteSpace: "nowrap", ml: 0.3 }, children: totalLabel })
288
+ ] });
289
+ }
290
+ function CdrReportContent() {
291
+ const { hasAnyPermission } = useSDKPermissions();
292
+ const canViewRecording = hasAnyPermission([
293
+ SDK_PERMISSIONS.REPORTS_CDR_RECORDING,
294
+ SDK_PERMISSIONS.REPORTS_CDR_MANAGE
295
+ ]);
296
+ const canViewAudit = hasAnyPermission([
297
+ SDK_PERMISSIONS.REPORTS_CDR_AUDIT,
298
+ SDK_PERMISSIONS.REPORTS_CDR_MANAGE
299
+ ]);
300
+ const [startDate, setStartDate] = useState(
301
+ dayjs().startOf("day")
302
+ );
303
+ const [endDate, setEndDate] = useState(dayjs());
304
+ const [activeQuickDate, setActiveQuickDate] = useState("today");
305
+ const [searchText, setSearchText] = useState("");
306
+ const [selectedAgents, setSelectedAgents] = useState([]);
307
+ const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);
308
+ const [queues, setQueues] = useState([]);
309
+ const [selectedQueues, setSelectedQueues] = useState([]);
310
+ const [callType, setCallType] = useState("");
311
+ const [callStatus, setCallStatus] = useState("");
312
+ const [records, setRecords] = useState([]);
313
+ const [totalRecords, setTotalRecords] = useState(0);
314
+ const [loading, setLoading] = useState(false);
315
+ const [error, setError] = useState("");
316
+ const [page, setPage] = useState(0);
317
+ const [rowsPerPage, setRowsPerPage] = useState(DEFAULT_PAGE_SIZE);
318
+ const [sortKey, setSortKey] = useState("callStartTime");
319
+ const [sortDir, setSortDir] = useState("desc");
320
+ const [auditDialogOpen, setAuditDialogOpen] = useState(false);
321
+ const [selectedAuditRow, setSelectedAuditRow] = useState(null);
322
+ useEffect(() => {
323
+ getQueues().then((data) => setQueues(data || [])).catch(() => setError("Failed to load filter options"));
324
+ }, []);
325
+ const handleQuickRangeChange = (range) => {
326
+ setActiveQuickDate(range || null);
327
+ };
328
+ const [debouncedSearch, setDebouncedSearch] = useState("");
329
+ const debounceRef = useRef(void 0);
330
+ useEffect(() => {
331
+ debounceRef.current = setTimeout(
332
+ () => setDebouncedSearch(searchText.trim()),
333
+ 400
334
+ );
335
+ return () => clearTimeout(debounceRef.current);
336
+ }, [searchText]);
337
+ const fetchReport = useCallback(
338
+ async (pageNum) => {
339
+ var _a, _b, _c, _d, _e;
340
+ const sd = startDate != null ? startDate : dayjs();
341
+ const ed = endDate != null ? endDate : dayjs();
342
+ if (!sd || !ed) {
343
+ setError("Select a valid date range");
344
+ return;
345
+ }
346
+ const params = {
347
+ start_date: sd.format("YYYY-MM-DDTHH:mm:ss"),
348
+ end_date: ed.format("YYYY-MM-DDTHH:mm:ss"),
349
+ agent_id: !isAllUsersSelected && selectedAgents.length > 0 ? selectedAgents.map((a) => a.id) : void 0,
350
+ // All queues selected → send no queue_id (backend returns all).
351
+ queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : void 0,
352
+ call_type: callType || void 0,
353
+ status: callStatus || void 0,
354
+ search: debouncedSearch || void 0,
355
+ page: pageNum + 1,
356
+ pageSize: rowsPerPage
357
+ };
358
+ try {
359
+ setError("");
360
+ setLoading(true);
361
+ const response = await getCdrReport(params);
362
+ setRecords(
363
+ deepFindArray(response, ["data", "records"])
364
+ );
365
+ setTotalRecords(
366
+ (_e = (_d = (_b = (_a = response == null ? void 0 : response.records) == null ? void 0 : _a.total) != null ? _b : response == null ? void 0 : response.total) != null ? _d : (_c = response == null ? void 0 : response.data) == null ? void 0 : _c.total) != null ? _e : 0
367
+ );
368
+ } catch (err) {
369
+ setError((err == null ? void 0 : err.message) || "Failed to fetch CDR report");
370
+ setRecords([]);
371
+ } finally {
372
+ setLoading(false);
373
+ }
374
+ },
375
+ [
376
+ startDate,
377
+ endDate,
378
+ selectedAgents,
379
+ isAllUsersSelected,
380
+ selectedQueues,
381
+ callType,
382
+ callStatus,
383
+ debouncedSearch,
384
+ rowsPerPage
385
+ ]
386
+ );
387
+ useEffect(() => {
388
+ setPage(0);
389
+ fetchReport(0);
390
+ }, [fetchReport]);
391
+ const handleRefresh = () => {
392
+ if (activeQuickDate) {
393
+ const now = dayjs();
394
+ let sd = now.startOf("day");
395
+ const ed = now;
396
+ if (activeQuickDate === "week") sd = now.startOf("week").startOf("day");
397
+ else if (activeQuickDate === "month")
398
+ sd = now.startOf("month").startOf("day");
399
+ setStartDate(sd);
400
+ setEndDate(ed);
401
+ } else {
402
+ fetchReport(page);
403
+ }
404
+ };
405
+ const handlePageChange = useCallback(
406
+ (_event, newPage) => {
407
+ setPage(newPage);
408
+ fetchReport(newPage);
409
+ },
410
+ [fetchReport]
411
+ );
412
+ const handleSort = (key) => {
413
+ if (sortKey === key) {
414
+ setSortDir((d) => d === "asc" ? "desc" : "asc");
415
+ } else {
416
+ setSortKey(key);
417
+ setSortDir("asc");
418
+ }
419
+ };
420
+ const sortedRecords = useMemo(() => {
421
+ const rows = [...records];
422
+ rows.sort((a, b) => {
423
+ const cmp = comparator(a, b, sortKey);
424
+ return sortDir === "asc" ? cmp : -cmp;
425
+ });
426
+ return rows;
427
+ }, [records, sortKey, sortDir]);
428
+ const handleExportExcel = async () => {
429
+ const sd = startDate != null ? startDate : dayjs();
430
+ const ed = endDate != null ? endDate : dayjs();
431
+ const params = {
432
+ start_date: sd.format("YYYY-MM-DDTHH:mm:ss"),
433
+ end_date: ed.format("YYYY-MM-DDTHH:mm:ss"),
434
+ agent_id: !isAllUsersSelected && selectedAgents.length > 0 ? selectedAgents.map((a) => a.id) : void 0,
435
+ queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : void 0,
436
+ call_type: callType || void 0,
437
+ status: callStatus || void 0,
438
+ search: debouncedSearch || void 0
439
+ };
440
+ try {
441
+ await exportCdrReportToExcel(params);
442
+ } catch (err) {
443
+ setError((err == null ? void 0 : err.message) || "Failed to export Excel");
444
+ }
445
+ };
446
+ return /* @__PURE__ */ jsxs(LocalizationProvider, { dateAdapter: AdapterDayjs, children: [
447
+ /* @__PURE__ */ jsxs(
448
+ Box,
449
+ {
450
+ sx: {
451
+ height: "100%",
452
+ display: "flex",
453
+ flexDirection: "column",
454
+ fontFamily: FONT
455
+ },
456
+ children: [
457
+ /* @__PURE__ */ jsx(
458
+ PageHeader,
459
+ {
460
+ title: "CDR Report",
461
+ actions: /* @__PURE__ */ jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, children: [
462
+ /* @__PURE__ */ jsx(
463
+ SearchBar,
464
+ {
465
+ value: searchText,
466
+ onChange: setSearchText,
467
+ placeholder: "Search phone, agent...",
468
+ width: 250
469
+ }
470
+ ),
471
+ /* @__PURE__ */ jsx(
472
+ SDKPermissionGuard,
473
+ {
474
+ permissions: [
475
+ SDK_PERMISSIONS.REPORTS_CDR_EXPORT,
476
+ SDK_PERMISSIONS.REPORTS_CDR_MANAGE
477
+ ],
478
+ showFallback: false,
479
+ children: /* @__PURE__ */ jsx(
480
+ AppButton,
481
+ {
482
+ startIcon: /* @__PURE__ */ jsx(DownloadIcon, { sx: { fontSize: "0.95rem !important" } }),
483
+ disabled: !records.length,
484
+ onClick: handleExportExcel,
485
+ sx: { height: 36 },
486
+ children: "Export Excel"
487
+ }
488
+ )
489
+ }
490
+ )
491
+ ] })
492
+ }
493
+ ),
494
+ /* @__PURE__ */ jsxs(Box, { sx: { flex: 1, overflow: "auto", py: 0.8, px: 0 }, children: [
495
+ /* @__PURE__ */ jsxs(Box, { sx: { mb: 0.8 }, children: [
496
+ /* @__PURE__ */ jsx(
497
+ ReportFilterBar,
498
+ {
499
+ startDate,
500
+ endDate,
501
+ onStartChange: setStartDate,
502
+ onEndChange: setEndDate,
503
+ quickRange: activeQuickDate || "",
504
+ onQuickRangeChange: handleQuickRangeChange,
505
+ showAgentSelect: true,
506
+ selectedAgents,
507
+ onAgentsChange: setSelectedAgents,
508
+ setIsAllUsersSelected,
509
+ showQueueSelect: true,
510
+ queues,
511
+ selectedQueues,
512
+ onQueuesChange: setSelectedQueues,
513
+ showCallTypeSelect: true,
514
+ selectedCallType: callType,
515
+ onCallTypeChange: setCallType,
516
+ showStatusSelect: true,
517
+ selectedStatus: callStatus,
518
+ onStatusChange: setCallStatus,
519
+ extra: /* @__PURE__ */ jsx(
520
+ AppButton,
521
+ {
522
+ startIcon: /* @__PURE__ */ jsx(RefreshIcon, { sx: { fontSize: "0.9rem !important" } }),
523
+ disabled: loading,
524
+ onClick: handleRefresh,
525
+ sx: { height: 32 },
526
+ children: "Refresh"
527
+ }
528
+ )
529
+ }
530
+ ),
531
+ error && /* @__PURE__ */ jsx(
532
+ Alert,
533
+ {
534
+ severity: "error",
535
+ sx: { mt: 1, fontFamily: FONT, fontSize: "0.78rem" },
536
+ children: error
537
+ }
538
+ )
539
+ ] }),
540
+ loading && /* @__PURE__ */ jsx(Box, { sx: { textAlign: "center", py: 2.5 }, children: /* @__PURE__ */ jsx(CircularProgress, { sx: { color: COLORS.blue }, size: 28 }) }),
541
+ /* @__PURE__ */ jsxs(
542
+ Paper,
543
+ {
544
+ elevation: 0,
545
+ sx: {
546
+ borderRadius: "8px",
547
+ border: "1px solid #e0e7ef",
548
+ overflow: "hidden",
549
+ mb: 2
550
+ },
551
+ children: [
552
+ /* @__PURE__ */ jsx(TableContainer, { children: /* @__PURE__ */ jsxs(
553
+ Table,
554
+ {
555
+ size: "small",
556
+ sx: {
557
+ minWidth: 1400,
558
+ fontFamily: FONT,
559
+ "& .MuiTableCell-root": {
560
+ fontFamily: FONT,
561
+ fontSize: "0.75rem",
562
+ borderBottom: "1px solid #eef1f6",
563
+ py: 0.6,
564
+ px: 1
565
+ }
566
+ },
567
+ children: [
568
+ /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
569
+ canViewAudit && /* @__PURE__ */ jsx(
570
+ TableCell,
571
+ {
572
+ sx: __spreadProps(__spreadValues({}, headCellSx), { minWidth: 110, textAlign: "center" }),
573
+ children: "Audit Report"
574
+ }
575
+ ),
576
+ canViewRecording && /* @__PURE__ */ jsx(
577
+ TableCell,
578
+ {
579
+ sx: __spreadProps(__spreadValues({}, headCellSx), { minWidth: 100 }),
580
+ children: "Recording"
581
+ }
582
+ ),
583
+ [
584
+ { id: "phoneNumber", label: "Phone Number" },
585
+ { id: "callStartTime", label: "Call Start" },
586
+ { id: "callType", label: "Call Type" },
587
+ { id: "callStatus", label: "Status" },
588
+ { id: "agentName", label: "User Name" },
589
+ { id: "queueName", label: "Queues" },
590
+ { id: "extension", label: "Extension" },
591
+ {
592
+ id: "talkDurationFmt",
593
+ label: "Talk Duration"
594
+ },
595
+ {
596
+ id: "holdDurationFmt",
597
+ label: "Hold Duration"
598
+ },
599
+ {
600
+ id: "ringingDurationFmt",
601
+ label: "Ringing Duration"
602
+ },
603
+ {
604
+ id: "queueDurationFmt",
605
+ label: "Queue Duration"
606
+ },
607
+ {
608
+ id: "wrapupDurationFmt",
609
+ label: "Wrapup Duration"
610
+ },
611
+ { id: "disposition", label: "Disposition" },
612
+ { id: "remarks", label: "Remarks" },
613
+ {
614
+ id: "wasTransferred",
615
+ label: "Transferred"
616
+ }
617
+ ].map((col) => /* @__PURE__ */ jsx(TableCell, { sx: headCellSx, children: /* @__PURE__ */ jsx(
618
+ TableSortLabel,
619
+ {
620
+ active: sortKey === col.id,
621
+ direction: sortKey === col.id ? sortDir : "asc",
622
+ onClick: () => handleSort(col.id),
623
+ sx: {
624
+ "&.MuiTableSortLabel-root": { color: "#333" },
625
+ "&.MuiTableSortLabel-root:hover": { color: "#555" },
626
+ "&.Mui-active": { color: "#333" },
627
+ "& .MuiTableSortLabel-icon": {
628
+ color: "#333 !important"
629
+ }
630
+ },
631
+ children: col.label
632
+ }
633
+ ) }, col.id))
634
+ ] }) }),
635
+ /* @__PURE__ */ jsx(TableBody, { children: sortedRecords.map((row, idx) => /* @__PURE__ */ jsxs(
636
+ TableRow,
637
+ {
638
+ hover: true,
639
+ sx: {
640
+ backgroundColor: "#fff",
641
+ "&:hover": { backgroundColor: "#f0f7f8" }
642
+ },
643
+ children: [
644
+ canViewAudit && /* @__PURE__ */ jsx(TableCell, { sx: { textAlign: "center", verticalAlign: "middle" }, children: /* @__PURE__ */ jsx(Tooltip, { title: "View Audit Report", children: /* @__PURE__ */ jsx(
645
+ IconButton,
646
+ {
647
+ size: "small",
648
+ onClick: () => {
649
+ setSelectedAuditRow(row);
650
+ setAuditDialogOpen(true);
651
+ },
652
+ sx: { color: COLORS.blue, p: 0.4 },
653
+ children: /* @__PURE__ */ jsx(AssignmentIcon, { sx: { fontSize: 16 } })
654
+ }
655
+ ) }) }),
656
+ canViewRecording && /* @__PURE__ */ jsx(TableCell, { sx: { verticalAlign: "middle" }, children: row.callUuid ? /* @__PURE__ */ jsx(
657
+ RecordingCell,
658
+ {
659
+ callUuid: row.callUuid,
660
+ recordingPath: row.recordingPath
661
+ }
662
+ ) : null }),
663
+ /* @__PURE__ */ jsx(
664
+ TableCell,
665
+ {
666
+ sx: {
667
+ fontWeight: 600,
668
+ color: COLORS.navy,
669
+ fontSize: "0.75rem"
670
+ },
671
+ children: row.phoneNumber || ""
672
+ }
673
+ ),
674
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.73rem", color: "#4a5568" }, children: row.callStartTime ? dayjs(row.callStartTime).format(
675
+ "DD MMM YYYY hh:mm A"
676
+ ) : "" }),
677
+ /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(CallTypePill, { value: row.callType || "" }) }),
678
+ /* @__PURE__ */ jsx(TableCell, { children: /* @__PURE__ */ jsx(StatusPill, { value: row.callStatus || "" }) }),
679
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.73rem", color: "#4a5568" }, children: row.agentName || "" }),
680
+ /* @__PURE__ */ jsx(TableCell, { children: row.queueName ? /* @__PURE__ */ jsx(
681
+ Chip,
682
+ {
683
+ label: row.queueName,
684
+ size: "small",
685
+ sx: {
686
+ fontFamily: FONT,
687
+ backgroundColor: "#f0ebfa",
688
+ color: COLORS.purple,
689
+ fontWeight: 500,
690
+ fontSize: "0.67rem",
691
+ height: 22
692
+ }
693
+ }
694
+ ) : null }),
695
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.73rem", color: "#4a5568" }, children: row.extension || "" }),
696
+ /* @__PURE__ */ jsx(
697
+ TableCell,
698
+ {
699
+ sx: {
700
+ fontWeight: 600,
701
+ color: COLORS.blue,
702
+ fontSize: "0.75rem",
703
+ fontVariantNumeric: "tabular-nums"
704
+ },
705
+ children: row.talkDurationFmt || ""
706
+ }
707
+ ),
708
+ /* @__PURE__ */ jsx(
709
+ TableCell,
710
+ {
711
+ sx: {
712
+ fontWeight: 500,
713
+ color: COLORS.amber,
714
+ fontSize: "0.75rem",
715
+ fontVariantNumeric: "tabular-nums"
716
+ },
717
+ children: row.holdDurationFmt || ""
718
+ }
719
+ ),
720
+ /* @__PURE__ */ jsx(
721
+ TableCell,
722
+ {
723
+ sx: {
724
+ fontWeight: 500,
725
+ fontSize: "0.75rem",
726
+ fontVariantNumeric: "tabular-nums"
727
+ },
728
+ children: row.ringingDurationFmt || ""
729
+ }
730
+ ),
731
+ /* @__PURE__ */ jsx(
732
+ TableCell,
733
+ {
734
+ sx: {
735
+ fontWeight: 500,
736
+ fontSize: "0.75rem",
737
+ fontVariantNumeric: "tabular-nums"
738
+ },
739
+ children: row.queueDurationFmt || ""
740
+ }
741
+ ),
742
+ /* @__PURE__ */ jsx(
743
+ TableCell,
744
+ {
745
+ sx: {
746
+ fontWeight: 500,
747
+ fontSize: "0.75rem",
748
+ fontVariantNumeric: "tabular-nums"
749
+ },
750
+ children: row.wrapupDurationFmt || ""
751
+ }
752
+ ),
753
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.73rem", color: "#4a5568" }, children: row.disposition || "" }),
754
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.73rem", color: "#4a5568" }, children: row.remarks ? /* @__PURE__ */ jsx(Tooltip, { title: row.remarks, children: /* @__PURE__ */ jsx(
755
+ "span",
756
+ {
757
+ style: {
758
+ display: "inline-block",
759
+ maxWidth: 180,
760
+ overflow: "hidden",
761
+ textOverflow: "ellipsis",
762
+ whiteSpace: "nowrap",
763
+ verticalAlign: "bottom"
764
+ },
765
+ children: row.remarks
766
+ }
767
+ ) }) : "" }),
768
+ /* @__PURE__ */ jsx(TableCell, { children: row.wasTransferred ? /* @__PURE__ */ jsx(
769
+ Chip,
770
+ {
771
+ label: "Yes",
772
+ size: "small",
773
+ sx: {
774
+ fontFamily: FONT,
775
+ backgroundColor: "#e6f7ef",
776
+ color: COLORS.green,
777
+ fontWeight: 600,
778
+ fontSize: "0.65rem",
779
+ height: 20,
780
+ borderRadius: "6px"
781
+ }
782
+ }
783
+ ) : /* @__PURE__ */ jsx(
784
+ Chip,
785
+ {
786
+ label: "No",
787
+ size: "small",
788
+ sx: {
789
+ fontFamily: FONT,
790
+ backgroundColor: "transparent",
791
+ color: "#6b7b8d",
792
+ fontWeight: 600,
793
+ fontSize: "0.65rem",
794
+ height: 20,
795
+ borderRadius: "6px"
796
+ }
797
+ }
798
+ ) })
799
+ ]
800
+ },
801
+ row.callUuid || idx
802
+ )) })
803
+ ]
804
+ }
805
+ ) }),
806
+ /* @__PURE__ */ jsx(
807
+ TablePagination,
808
+ {
809
+ component: "div",
810
+ count: totalRecords,
811
+ page,
812
+ onPageChange: handlePageChange,
813
+ rowsPerPage,
814
+ rowsPerPageOptions: [10, 15, 25, 50, 100],
815
+ onRowsPerPageChange: (e) => {
816
+ setRowsPerPage(parseInt(e.target.value, 10));
817
+ setPage(0);
818
+ },
819
+ sx: {
820
+ borderTop: "1px solid #eef1f6",
821
+ fontFamily: FONT,
822
+ "& .MuiTablePagination-displayedRows": {
823
+ fontFamily: FONT,
824
+ fontSize: "0.73rem"
825
+ },
826
+ "& .MuiTablePagination-selectLabel": {
827
+ fontFamily: FONT,
828
+ fontSize: "0.73rem"
829
+ }
830
+ }
831
+ }
832
+ )
833
+ ]
834
+ }
835
+ )
836
+ ] })
837
+ ]
838
+ }
839
+ ),
840
+ /* @__PURE__ */ jsx(
841
+ AuditReportDialog,
842
+ {
843
+ open: auditDialogOpen,
844
+ onClose: () => {
845
+ setAuditDialogOpen(false);
846
+ setSelectedAuditRow(null);
847
+ },
848
+ rowData: selectedAuditRow != null ? selectedAuditRow : void 0
849
+ }
850
+ )
851
+ ] });
852
+ }
853
+ var CdrReport = () => /* @__PURE__ */ jsx(SDKProvider, { children: /* @__PURE__ */ jsx(CdrReportContent, {}) });
854
+ var cdrReport_default = CdrReport;
855
+ export {
856
+ cdrReport_default as default
857
+ };
858
+ //# sourceMappingURL=cdrReport-SX2FZAO6.mjs.map