ahs-cti 0.0.5 → 0.0.6
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/dist/agentDetailReport-ZR7U2LLB.mjs +17 -0
- package/dist/{agentPerformanceReport-U2QGVTXF.mjs → agentPerformanceReport-JZK5DN5E.mjs} +59 -57
- package/dist/{agentPerformanceReport-U2QGVTXF.mjs.map → agentPerformanceReport-JZK5DN5E.mjs.map} +1 -1
- package/dist/{auditReport-DEVQDTDT.mjs → auditReport-6ZUJ4UFO.mjs} +5 -5
- package/dist/{callHistory-MRBBY3UO.mjs → callHistory-T3M76D4B.mjs} +147 -156
- package/dist/{callHistory-MRBBY3UO.mjs.map → callHistory-T3M76D4B.mjs.map} +1 -1
- package/dist/{campaigns-ERO3QM6I.mjs → campaigns-5PVHXBSD.mjs} +384 -386
- package/dist/{campaigns-ERO3QM6I.mjs.map → campaigns-5PVHXBSD.mjs.map} +1 -1
- package/dist/{caroQualityAuditDashboard-NRWY6SEC.mjs → caroQualityAuditDashboard-EUDYZ3QY.mjs} +6 -5
- package/dist/{caroQualityAuditDashboard-NRWY6SEC.mjs.map → caroQualityAuditDashboard-EUDYZ3QY.mjs.map} +1 -1
- package/dist/{caroVoiceAI-Z5BDDDSY.mjs → caroVoiceAI-GGJCVUIQ.mjs} +5 -4
- package/dist/{caroVoiceAI-Z5BDDDSY.mjs.map → caroVoiceAI-GGJCVUIQ.mjs.map} +1 -1
- package/dist/{cdrReport-EZNOCELK.mjs → cdrReport-ZMDHSZUW.mjs} +101 -100
- package/dist/{cdrReport-EZNOCELK.mjs.map → cdrReport-ZMDHSZUW.mjs.map} +1 -1
- package/dist/{chunk-53DYH64M.mjs → chunk-2M3YEXYA.mjs} +91 -64
- package/dist/chunk-2M3YEXYA.mjs.map +1 -0
- package/dist/{chunk-ISQBOS5Q.mjs → chunk-33QNSXP7.mjs} +160 -160
- package/dist/{chunk-ISQBOS5Q.mjs.map → chunk-33QNSXP7.mjs.map} +1 -1
- package/dist/{chunk-YFW47Y76.mjs → chunk-3J7KQNEU.mjs} +15 -12
- package/dist/{chunk-YFW47Y76.mjs.map → chunk-3J7KQNEU.mjs.map} +1 -1
- package/dist/{chunk-MBHP7UOP.mjs → chunk-6WLG2PXL.mjs} +2 -2
- package/dist/{chunk-MBXHRFGP.mjs → chunk-7LE2VTAI.mjs} +2 -2
- package/dist/{chunk-MFZKONNR.mjs → chunk-AOJRUZTO.mjs} +2 -2
- package/dist/chunk-DF5EFKXC.mjs +28690 -0
- package/dist/chunk-DF5EFKXC.mjs.map +1 -0
- package/dist/{chunk-5FSMIU5K.mjs → chunk-DJP744FF.mjs} +2 -2
- package/dist/{chunk-BVQNDAS6.mjs → chunk-DNTGBNZD.mjs} +18 -14
- package/dist/{chunk-BVQNDAS6.mjs.map → chunk-DNTGBNZD.mjs.map} +1 -1
- package/dist/{chunk-AJQBR3AZ.mjs → chunk-E6KYWWAI.mjs} +4243 -7804
- package/dist/chunk-E6KYWWAI.mjs.map +1 -0
- package/dist/{chunk-3DOSR6LQ.mjs → chunk-FRKV2U3I.mjs} +2 -2
- package/dist/{chunk-ICGEHYJL.mjs → chunk-H7GRWLYI.mjs} +5 -5
- package/dist/{chunk-6MURUWDX.mjs → chunk-IDZWA6HG.mjs} +154 -156
- package/dist/{chunk-6MURUWDX.mjs.map → chunk-IDZWA6HG.mjs.map} +1 -1
- package/dist/chunk-LHE4QGJJ.mjs +10920 -0
- package/dist/chunk-LHE4QGJJ.mjs.map +1 -0
- package/dist/{chunk-HBR2JS4C.mjs → chunk-NAZO4HKB.mjs} +8 -4
- package/dist/{chunk-HBR2JS4C.mjs.map → chunk-NAZO4HKB.mjs.map} +1 -1
- package/dist/{chunk-DXZIYCNQ.mjs → chunk-OHJIW3I3.mjs} +2 -2
- package/dist/chunk-Q6G3MPS7.mjs +37797 -0
- package/dist/chunk-Q6G3MPS7.mjs.map +1 -0
- package/dist/{chunk-QPOHVXUK.mjs → chunk-U2UDKXMB.mjs} +2 -2
- package/dist/{chunk-XMRM5VR4.mjs → chunk-VBIDPX5Z.mjs} +18 -14
- package/dist/{chunk-XMRM5VR4.mjs.map → chunk-VBIDPX5Z.mjs.map} +1 -1
- package/dist/{chunk-6ICPXSN6.mjs → chunk-VVDJLUYT.mjs} +8 -4
- package/dist/{chunk-6ICPXSN6.mjs.map → chunk-VVDJLUYT.mjs.map} +1 -1
- package/dist/{chunk-XA5SCAZJ.mjs → chunk-WTBVFN4H.mjs} +2 -2
- package/dist/{chunk-RSL5OBRQ.mjs → chunk-YAQYTUTX.mjs} +2 -2
- package/dist/index.js +117240 -32148
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +276 -296
- package/dist/index.mjs.map +1 -1
- package/dist/{liveStatus-F6AKCC27.mjs → liveStatus-YSBYSVOO.mjs} +123 -122
- package/dist/{liveStatus-F6AKCC27.mjs.map → liveStatus-YSBYSVOO.mjs.map} +1 -1
- package/dist/{loginReport-MWTI4G6O.mjs → loginReport-YIVBJVJD.mjs} +118 -116
- package/dist/{loginReport-MWTI4G6O.mjs.map → loginReport-YIVBJVJD.mjs.map} +1 -1
- package/dist/managementDashboard-7EMQC2UA.mjs +536 -0
- package/dist/{managementDashboard-6UBOCLBA.mjs.map → managementDashboard-7EMQC2UA.mjs.map} +1 -1
- package/dist/{qualityAuditDashboard-ZJEEAMBS.mjs → qualityAuditDashboard-ENGQN2WQ.mjs} +6 -5
- package/dist/{qualityAuditDashboard-ZJEEAMBS.mjs.map → qualityAuditDashboard-ENGQN2WQ.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/agentDetailReport-F7XZLVVO.mjs +0 -16
- package/dist/chunk-53DYH64M.mjs.map +0 -1
- package/dist/chunk-AJQBR3AZ.mjs.map +0 -1
- package/dist/chunk-Q7FIRWF2.mjs +0 -1067
- package/dist/chunk-Q7FIRWF2.mjs.map +0 -1
- package/dist/chunk-UB5HSUGK.mjs +0 -65
- package/dist/chunk-UB5HSUGK.mjs.map +0 -1
- package/dist/managementDashboard-6UBOCLBA.mjs +0 -536
- /package/dist/{agentDetailReport-F7XZLVVO.mjs.map → agentDetailReport-ZR7U2LLB.mjs.map} +0 -0
- /package/dist/{auditReport-DEVQDTDT.mjs.map → auditReport-6ZUJ4UFO.mjs.map} +0 -0
- /package/dist/{chunk-MBHP7UOP.mjs.map → chunk-6WLG2PXL.mjs.map} +0 -0
- /package/dist/{chunk-MBXHRFGP.mjs.map → chunk-7LE2VTAI.mjs.map} +0 -0
- /package/dist/{chunk-MFZKONNR.mjs.map → chunk-AOJRUZTO.mjs.map} +0 -0
- /package/dist/{chunk-5FSMIU5K.mjs.map → chunk-DJP744FF.mjs.map} +0 -0
- /package/dist/{chunk-3DOSR6LQ.mjs.map → chunk-FRKV2U3I.mjs.map} +0 -0
- /package/dist/{chunk-ICGEHYJL.mjs.map → chunk-H7GRWLYI.mjs.map} +0 -0
- /package/dist/{chunk-DXZIYCNQ.mjs.map → chunk-OHJIW3I3.mjs.map} +0 -0
- /package/dist/{chunk-QPOHVXUK.mjs.map → chunk-U2UDKXMB.mjs.map} +0 -0
- /package/dist/{chunk-XA5SCAZJ.mjs.map → chunk-WTBVFN4H.mjs.map} +0 -0
- /package/dist/{chunk-RSL5OBRQ.mjs.map → chunk-YAQYTUTX.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/cdrReport/index.tsx","../node_modules/@mui/icons-material/Assignment.mjs"],"sourcesContent":["import React, {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n Alert,\r\n Box,\r\n Chip,\r\n Paper,\r\n Stack,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n TablePagination,\r\n TableSortLabel,\r\n CircularProgress,\r\n IconButton,\r\n Tooltip,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport AuditReportDialog from \"../common/components/AuditReport\";\r\n\r\nimport ReportFilterBar, {\r\n type QuickRange,\r\n} from \"../common/components/ReportFilterBar\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport AssignmentIcon from \"@mui/icons-material/Assignment\";\r\n\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\n\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport {\r\n getCdrReport,\r\n exportCdrReportToExcel,\r\n getRecordingByCall,\r\n getQueues,\r\n type Queue,\r\n} from \"./useCdrReport\";\r\nimport { deepFindArray } from \"../../services/axios\";\r\nimport type { CdrReportParams, CdrRecordResponse } from \"./types\";\r\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\r\nimport { headCellSx } from \"../common/utils/tableStyles\";\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport SearchBar from \"../common/components/SearchBar\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { useSDKPermissions } from \"../../hooks/useSDKPermissions\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\n\r\ndayjs.extend(isoWeek);\r\n\r\nconst FONT =\r\n \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n\r\nconst COLORS = {\r\n navy: \"#0d2a56\",\r\n blue: \"#1565c8\",\r\n green: \"#0a9a62\",\r\n amber: \"#c47c00\",\r\n red: \"#cc2a2a\",\r\n purple: \"#6b3fbf\",\r\n bg: \"transparent\",\r\n surface: \"transparent\",\r\n} as const;\r\n\r\nconst DEFAULT_PAGE_SIZE = 15;\r\n\r\ntype SortKey =\r\n | \"phoneNumber\"\r\n | \"callStartTime\"\r\n | \"callType\"\r\n | \"callStatus\"\r\n | \"agentName\"\r\n | \"queueName\"\r\n | \"extension\"\r\n | \"talkDurationFmt\"\r\n | \"holdDurationFmt\"\r\n | \"ringingDurationFmt\"\r\n | \"queueDurationFmt\"\r\n | \"wrapupDurationFmt\"\r\n | \"disposition\"\r\n | \"remarks\"\r\n | \"wasTransferred\";\r\n\r\ntype SortDir = \"asc\" | \"desc\";\r\n\r\nconst comparator = (\r\n a: CdrRecordResponse,\r\n b: CdrRecordResponse,\r\n key: SortKey,\r\n): number => {\r\n const av = a[key as keyof CdrRecordResponse];\r\n const bv = b[key as keyof CdrRecordResponse];\r\n if (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\r\n if (typeof av === \"boolean\" && typeof bv === \"boolean\")\r\n return (av ? 1 : 0) - (bv ? 1 : 0);\r\n return String(av ?? \"\").localeCompare(String(bv ?? \"\"));\r\n};\r\n\r\nfunction CallTypePill({ value }: { value: string }) {\r\n const v = (value || \"\").toLowerCase();\r\n let color = \"#6b7b8d\";\r\n let bg = \"transparent\";\r\n if (v.includes(\"inbound\")) {\r\n color = COLORS.green;\r\n bg = \"#e6f7ef\";\r\n } else if (v.includes(\"outbound\")) {\r\n color = COLORS.blue;\r\n bg = \"#e3eefa\";\r\n } else if (v.includes(\"internal\")) {\r\n color = COLORS.purple;\r\n bg = \"#f0e8ff\";\r\n }\r\n return (\r\n <Chip\r\n label={value}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n bgcolor: bg,\r\n color,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction StatusPill({ value }: { value: string }) {\r\n const v = (value || \"\").toLowerCase();\r\n let color = \"#6b7b8d\";\r\n let bg = \"transparent\";\r\n if (v.includes(\"answered\")) {\r\n color = COLORS.green;\r\n bg = \"#e6f7ef\";\r\n } else if (v.includes(\"abandoned\") || v.includes(\"missed\")) {\r\n color = COLORS.red;\r\n bg = \"#fce8e8\";\r\n }\r\n return (\r\n <Chip\r\n label={value}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n bgcolor: bg,\r\n color,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n );\r\n}\r\n\r\nconst fmtRecordingDuration = (s: number): string => {\r\n if (!isFinite(s) || s < 0) return \"\";\r\n const m = Math.floor(s / 60);\r\n const sec = Math.floor(s % 60);\r\n return `${m}:${sec.toString().padStart(2, \"0\")}`;\r\n};\r\n\r\n/* Coordinates playback so only one recording is open at a time. */\r\nconst activePlayers = new Set<(activeId: string) => void>();\r\nconst notifyPlay = (activeId: string) => {\r\n activePlayers.forEach((fn) => fn(activeId));\r\n};\r\n\r\nfunction RecordingCell({\r\n callUuid,\r\n recordingPath,\r\n}: {\r\n callUuid: string;\r\n recordingPath: string | null;\r\n}) {\r\n const [audioUrl, setAudioUrl] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(false);\r\n const [durationSec, setDurationSec] = useState<number | null>(null);\r\n const [currentSec, setCurrentSec] = useState(0);\r\n const unavailable = recordingPath === null;\r\n const totalLabel = durationSec != null ? fmtRecordingDuration(durationSec) : \"\";\r\n\r\n const closePlayer = useCallback(() => {\r\n setAudioUrl((prev) => {\r\n if (prev && prev.startsWith(\"blob:\")) URL.revokeObjectURL(prev);\r\n return null;\r\n });\r\n setCurrentSec(0);\r\n setDurationSec(null);\r\n }, []);\r\n\r\n // Close this player whenever another recording starts playing.\r\n useEffect(() => {\r\n const onPlay = (activeId: string) => {\r\n if (activeId !== callUuid) closePlayer();\r\n };\r\n activePlayers.add(onPlay);\r\n return () => {\r\n activePlayers.delete(onPlay);\r\n };\r\n }, [callUuid, closePlayer]);\r\n\r\n const handlePlay = async () => {\r\n if (audioUrl) return;\r\n notifyPlay(callUuid);\r\n try {\r\n setLoading(true);\r\n setError(false);\r\n const blob = await getRecordingByCall(callUuid);\r\n const url = URL.createObjectURL(blob);\r\n setAudioUrl(url);\r\n } catch {\r\n setError(true);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleDownload = async () => {\r\n try {\r\n const blob = audioUrl\r\n ? await fetch(audioUrl).then((r) => r.blob())\r\n : await getRecordingByCall(callUuid);\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = `recording_${callUuid}.wav`;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n } catch {\r\n /* ignore */\r\n }\r\n };\r\n\r\n if (audioUrl) {\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n <audio\r\n controls\r\n autoPlay\r\n src={audioUrl}\r\n onLoadedMetadata={(e) => setDurationSec(e.currentTarget.duration)}\r\n onTimeUpdate={(e) => setCurrentSec(e.currentTarget.currentTime)}\r\n onEnded={closePlayer}\r\n style={{ width: 180, height: 30 }}\r\n />\r\n {totalLabel && (\r\n <Typography sx={{ fontSize: 12, fontWeight: 600, color: COLORS.navy, whiteSpace: \"nowrap\" }}>\r\n {fmtRecordingDuration(currentSec)} / {totalLabel}\r\n </Typography>\r\n )}\r\n <Tooltip title=\"Download\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDownload}\r\n sx={{ color: COLORS.blue, p: 0.4 }}\r\n >\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.3 }}>\r\n <Tooltip title={unavailable || error ? \"Recording Unavailable\" : \"Play\"}>\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handlePlay}\r\n disabled={loading || error || unavailable}\r\n sx={{ color: unavailable ? \"#b0b8c8\" : COLORS.green, p: 0.4 }}\r\n >\r\n {loading ? (\r\n <CircularProgress size={14} />\r\n ) : (\r\n <PlayArrowIcon sx={{ fontSize: 16 }} />\r\n )}\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n <Tooltip\r\n title={unavailable || error ? \"Recording Unavailable\" : \"Download\"}\r\n >\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDownload}\r\n disabled={loading || error || unavailable}\r\n sx={{ color: unavailable ? \"#b0b8c8\" : COLORS.blue, p: 0.4 }}\r\n >\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n {totalLabel && (\r\n <Typography sx={{ fontSize: 12, fontWeight: 600, color: COLORS.navy, whiteSpace: \"nowrap\", ml: 0.3 }}>\r\n {totalLabel}\r\n </Typography>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction CdrReportContent() {\r\n // These columns show when the backend grants the matching permission,\r\n // OR when the user has the CDR \"manage\" permission.\r\n const { hasAnyPermission } = useSDKPermissions();\r\n const canViewRecording = hasAnyPermission([\r\n SDK_PERMISSIONS.REPORTS_CDR_RECORDING,\r\n SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n ]);\r\n const canViewAudit = hasAnyPermission([\r\n SDK_PERMISSIONS.REPORTS_CDR_AUDIT,\r\n SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n ]);\r\n\r\n const [startDate, setStartDate] = useState<Dayjs | null>(\r\n dayjs().startOf(\"day\"),\r\n );\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [activeQuickDate, setActiveQuickDate] = useState<\r\n \"today\" | \"week\" | \"month\" | null\r\n >(\"today\");\r\n const [searchText, setSearchText] = useState(\"\");\r\n\r\n const [selectedAgents, setSelectedAgents] = useState<AgentOption[]>([]);\r\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\r\n\r\n const [queues, setQueues] = useState<Queue[]>([]);\r\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\r\n\r\n const [callType, setCallType] = useState<string>(\"\");\r\n const [callStatus, setCallStatus] = useState<string>(\"\");\r\n\r\n const [records, setRecords] = useState<CdrRecordResponse[]>([]);\r\n const [totalRecords, setTotalRecords] = useState(0);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n\r\n const [page, setPage] = useState(0);\r\n const [rowsPerPage, setRowsPerPage] = useState(DEFAULT_PAGE_SIZE);\r\n const [sortKey, setSortKey] = useState<SortKey>(\"callStartTime\");\r\n const [sortDir, setSortDir] = useState<SortDir>(\"desc\");\r\n\r\n const [auditDialogOpen, setAuditDialogOpen] = useState(false);\r\n const [selectedAuditRow, setSelectedAuditRow] =\r\n useState<CdrRecordResponse | null>(null);\r\n\r\n useEffect(() => {\r\n getQueues()\r\n .then((data) => setQueues(data || []))\r\n .catch(() => setError(\"Failed to load filter options\"));\r\n }, []);\r\n\r\n const handleQuickRangeChange = (range: QuickRange) => {\r\n setActiveQuickDate(range || null);\r\n };\r\n\r\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n debounceRef.current = setTimeout(\r\n () => setDebouncedSearch(searchText.trim()),\r\n 400,\r\n );\r\n return () => clearTimeout(debounceRef.current);\r\n }, [searchText]);\r\n\r\n const fetchReport = useCallback(\r\n async (pageNum: number) => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n\r\n if (!sd || !ed) {\r\n setError(\"Select a valid date range\");\r\n return;\r\n }\r\n\r\n const params: CdrReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id:\r\n !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.id)\r\n : undefined,\r\n // All queues selected → send no queue_id (backend returns all).\r\n queue_id:\r\n selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n call_type: callType || undefined,\r\n status: callStatus || undefined,\r\n search: debouncedSearch || undefined,\r\n page: pageNum + 1,\r\n pageSize: rowsPerPage,\r\n };\r\n\r\n try {\r\n setError(\"\");\r\n setLoading(true);\r\n const response: any = await getCdrReport(params);\r\n setRecords(\r\n deepFindArray<CdrRecordResponse>(response, [\"data\", \"records\"]),\r\n );\r\n setTotalRecords(\r\n response?.records?.total ??\r\n response?.total ??\r\n response?.data?.total ??\r\n 0,\r\n );\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to fetch CDR report\");\r\n setRecords([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [\r\n startDate,\r\n endDate,\r\n selectedAgents,\r\n isAllUsersSelected,\r\n selectedQueues,\r\n callType,\r\n callStatus,\r\n debouncedSearch,\r\n rowsPerPage,\r\n ],\r\n );\r\n\r\n useEffect(() => {\r\n setPage(0);\r\n fetchReport(0);\r\n }, [fetchReport]);\r\n\r\n const handleRefresh = () => {\r\n if (activeQuickDate) {\r\n const now = dayjs();\r\n let sd = now.startOf(\"day\");\r\n const ed = now;\r\n if (activeQuickDate === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\r\n else if (activeQuickDate === \"month\")\r\n sd = now.startOf(\"month\").startOf(\"day\");\r\n setStartDate(sd);\r\n setEndDate(ed);\r\n } else {\r\n fetchReport(page);\r\n }\r\n };\r\n\r\n const handlePageChange = useCallback(\r\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n setPage(newPage);\r\n fetchReport(newPage);\r\n },\r\n [fetchReport],\r\n );\r\n\r\n const handleSort = (key: SortKey) => {\r\n if (sortKey === key) {\r\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n } else {\r\n setSortKey(key);\r\n setSortDir(\"asc\");\r\n }\r\n };\r\n\r\n const sortedRecords = useMemo(() => {\r\n const rows = [...records];\r\n rows.sort((a, b) => {\r\n const cmp = comparator(a, b, sortKey);\r\n return sortDir === \"asc\" ? cmp : -cmp;\r\n });\r\n return rows;\r\n }, [records, sortKey, sortDir]);\r\n\r\n const handleExportExcel = async () => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n const params: CdrReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id:\r\n !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.id)\r\n : undefined,\r\n queue_id:\r\n selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n call_type: callType || undefined,\r\n status: callStatus || undefined,\r\n search: debouncedSearch || undefined,\r\n };\r\n try {\r\n await exportCdrReportToExcel(params);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n };\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box\r\n sx={{\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n fontFamily: FONT,\r\n }}\r\n >\r\n <PageHeader\r\n title=\"CDR Report\"\r\n actions={\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n <SearchBar\r\n value={searchText}\r\n onChange={setSearchText}\r\n placeholder=\"Search phone, agent...\"\r\n width={250}\r\n />\r\n <SDKPermissionGuard\r\n permissions={[\r\n SDK_PERMISSIONS.REPORTS_CDR_EXPORT,\r\n SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n ]}\r\n showFallback={false}\r\n >\r\n <AppButton\r\n startIcon={\r\n <DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />\r\n }\r\n disabled={!records.length}\r\n onClick={handleExportExcel}\r\n sx={{ height: 36 }}\r\n >\r\n Export Excel\r\n </AppButton>\r\n </SDKPermissionGuard>\r\n </Stack>\r\n }\r\n />\r\n\r\n <Box sx={{ flex: 1, overflow: \"auto\", py: 0.8, px: 0 }}>\r\n <Box sx={{ mb: 0.8 }}>\r\n <ReportFilterBar\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n quickRange={activeQuickDate || \"\"}\r\n onQuickRangeChange={handleQuickRangeChange}\r\n showAgentSelect\r\n selectedAgents={selectedAgents}\r\n onAgentsChange={setSelectedAgents}\r\n setIsAllUsersSelected={setIsAllUsersSelected}\r\n showQueueSelect\r\n queues={queues}\r\n selectedQueues={selectedQueues}\r\n onQueuesChange={setSelectedQueues}\r\n showCallTypeSelect\r\n selectedCallType={callType}\r\n onCallTypeChange={setCallType}\r\n showStatusSelect\r\n selectedStatus={callStatus}\r\n onStatusChange={setCallStatus}\r\n extra={\r\n <AppButton\r\n startIcon={\r\n <RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />\r\n }\r\n disabled={loading}\r\n onClick={handleRefresh}\r\n sx={{ height: 32 }}\r\n >\r\n Refresh\r\n </AppButton>\r\n }\r\n />\r\n\r\n {error && (\r\n <Alert\r\n severity=\"error\"\r\n sx={{ mt: 1, fontFamily: FONT, fontSize: \"0.78rem\" }}\r\n >\r\n {error}\r\n </Alert>\r\n )}\r\n </Box>\r\n\r\n {loading && (\r\n <Box sx={{ textAlign: \"center\", py: 2.5 }}>\r\n <CircularProgress sx={{ color: COLORS.blue }} size={28} />\r\n </Box>\r\n )}\r\n\r\n <Paper\r\n elevation={0}\r\n sx={{\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e0e7ef\",\r\n overflow: \"hidden\",\r\n mb: 2,\r\n }}\r\n >\r\n <TableContainer>\r\n <Table\r\n size=\"small\"\r\n sx={{\r\n minWidth: 1400,\r\n fontFamily: FONT,\r\n \"& .MuiTableCell-root\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.75rem\",\r\n borderBottom: \"1px solid #eef1f6\",\r\n py: 0.6,\r\n px: 1,\r\n },\r\n }}\r\n >\r\n <TableHead>\r\n <TableRow>\r\n {canViewAudit && (\r\n <TableCell\r\n sx={{ ...(headCellSx as object), minWidth: 110, textAlign: \"center\" }}\r\n >\r\n Audit Report\r\n </TableCell>\r\n )}\r\n {canViewRecording && (\r\n <TableCell\r\n sx={{ ...(headCellSx as object), minWidth: 100 }}\r\n >\r\n Recording\r\n </TableCell>\r\n )}\r\n {(\r\n [\r\n { id: \"phoneNumber\" as SortKey, label: \"Phone Number\" },\r\n { id: \"callStartTime\" as SortKey, label: \"Call Start\" },\r\n { id: \"callType\" as SortKey, label: \"Call Type\" },\r\n { id: \"callStatus\" as SortKey, label: \"Status\" },\r\n { id: \"agentName\" as SortKey, label: \"User Name\" },\r\n { id: \"queueName\" as SortKey, label: \"Queues\" },\r\n { id: \"extension\" as SortKey, label: \"Extension\" },\r\n {\r\n id: \"talkDurationFmt\" as SortKey,\r\n label: \"Talk Duration\",\r\n },\r\n {\r\n id: \"holdDurationFmt\" as SortKey,\r\n label: \"Hold Duration\",\r\n },\r\n {\r\n id: \"ringingDurationFmt\" as SortKey,\r\n label: \"Ringing Duration\",\r\n },\r\n {\r\n id: \"queueDurationFmt\" as SortKey,\r\n label: \"Queue Duration\",\r\n },\r\n {\r\n id: \"wrapupDurationFmt\" as SortKey,\r\n label: \"Wrapup Duration\",\r\n },\r\n { id: \"disposition\" as SortKey, label: \"Disposition\" },\r\n { id: \"remarks\" as SortKey, label: \"Remarks\" },\r\n {\r\n id: \"wasTransferred\" as SortKey,\r\n label: \"Transferred\",\r\n },\r\n ] as { id: SortKey; label: string }[]\r\n ).map((col) => (\r\n <TableCell key={col.id} sx={headCellSx}>\r\n <TableSortLabel\r\n active={sortKey === col.id}\r\n direction={sortKey === col.id ? sortDir : \"asc\"}\r\n onClick={() => handleSort(col.id)}\r\n sx={{\r\n \"&.MuiTableSortLabel-root\": { color: \"#333\" },\r\n \"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\r\n \"&.Mui-active\": { color: \"#333\" },\r\n \"& .MuiTableSortLabel-icon\": {\r\n color: \"#333 !important\",\r\n },\r\n }}\r\n >\r\n {col.label}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n\r\n <TableBody>\r\n {sortedRecords.map((row, idx) => (\r\n <TableRow\r\n key={row.callUuid || idx}\r\n hover\r\n sx={{\r\n backgroundColor: \"#fff\",\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n }}\r\n >\r\n {canViewAudit && (\r\n <TableCell sx={{ textAlign: \"center\", verticalAlign: \"middle\" }}>\r\n <Tooltip title=\"View Audit Report\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setSelectedAuditRow(row);\r\n setAuditDialogOpen(true);\r\n }}\r\n sx={{ color: COLORS.blue, p: 0.4 }}\r\n >\r\n <AssignmentIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n </TableCell>\r\n )}\r\n {canViewRecording && (\r\n <TableCell sx={{ verticalAlign: \"middle\" }}>\r\n {row.callUuid ? (\r\n <RecordingCell\r\n callUuid={row.callUuid}\r\n recordingPath={row.recordingPath}\r\n />\r\n ) : null}\r\n </TableCell>\r\n )}\r\n <TableCell\r\n sx={{\r\n fontWeight: 600,\r\n color: COLORS.navy,\r\n fontSize: \"0.75rem\",\r\n }}\r\n >\r\n {row.phoneNumber || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.callStartTime\r\n ? dayjs(row.callStartTime).format(\r\n \"DD MMM YYYY hh:mm A\",\r\n )\r\n : \"\"}\r\n </TableCell>\r\n <TableCell>\r\n <CallTypePill value={row.callType || \"\"} />\r\n </TableCell>\r\n <TableCell>\r\n <StatusPill value={row.callStatus || \"\"} />\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.agentName || \"\"}\r\n </TableCell>\r\n <TableCell>\r\n {row.queueName ? (\r\n <Chip\r\n label={row.queueName}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#f0ebfa\",\r\n color: COLORS.purple,\r\n fontWeight: 500,\r\n fontSize: \"0.67rem\",\r\n height: 22,\r\n }}\r\n />\r\n ) : null}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.extension || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 600,\r\n color: COLORS.blue,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.talkDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n color: COLORS.amber,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.holdDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.ringingDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.queueDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.wrapupDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.disposition || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.remarks ? (\r\n <Tooltip title={row.remarks}>\r\n <span\r\n style={{\r\n display: \"inline-block\",\r\n maxWidth: 180,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n verticalAlign: \"bottom\",\r\n }}\r\n >\r\n {row.remarks}\r\n </span>\r\n </Tooltip>\r\n ) : (\r\n \"\"\r\n )}\r\n </TableCell>\r\n <TableCell>\r\n {row.wasTransferred ? (\r\n <Chip\r\n label=\"Yes\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#e6f7ef\",\r\n color: COLORS.green,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n ) : (\r\n <Chip\r\n label=\"No\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"transparent\",\r\n color: \"#6b7b8d\",\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n )}\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n\r\n <TablePagination\r\n component=\"div\"\r\n count={totalRecords}\r\n page={page}\r\n onPageChange={handlePageChange}\r\n rowsPerPage={rowsPerPage}\r\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\r\n onRowsPerPageChange={(e) => {\r\n setRowsPerPage(parseInt(e.target.value, 10));\r\n setPage(0);\r\n }}\r\n sx={{\r\n borderTop: \"1px solid #eef1f6\",\r\n fontFamily: FONT,\r\n \"& .MuiTablePagination-displayedRows\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.73rem\",\r\n },\r\n \"& .MuiTablePagination-selectLabel\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.73rem\",\r\n },\r\n }}\r\n />\r\n </Paper>\r\n </Box>\r\n </Box>\r\n\r\n <AuditReportDialog\r\n open={auditDialogOpen}\r\n onClose={() => {\r\n setAuditDialogOpen(false);\r\n setSelectedAuditRow(null);\r\n }}\r\n rowData={selectedAuditRow ?? undefined}\r\n />\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst CdrReport: React.FC = () => (\r\n <SDKProvider>\r\n <CdrReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default CdrReport;\r\n","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 3h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1m2 14H7v-2h7zm3-4H7v-2h10zm0-4H7V7h10z\"\n}), 'Assignment');"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/cdrReport/index.tsx","../node_modules/@mui/icons-material/Assignment.mjs"],"sourcesContent":["import React, {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n Alert,\r\n Box,\r\n Chip,\r\n Paper,\r\n Stack,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n TablePagination,\r\n TableSortLabel,\r\n CircularProgress,\r\n IconButton,\r\n Tooltip,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport AuditReportDialog from \"../common/components/AuditReport\";\r\n\r\nimport ReportFilterBar, {\r\n type QuickRange,\r\n} from \"../common/components/ReportFilterBar\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport AssignmentIcon from \"@mui/icons-material/Assignment\";\r\n\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\n\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport {\r\n getCdrReport,\r\n exportCdrReportToExcel,\r\n getRecordingByCall,\r\n getQueues,\r\n type Queue,\r\n} from \"./useCdrReport\";\r\nimport { deepFindArray } from \"../../services/axios\";\r\nimport type { CdrReportParams, CdrRecordResponse } from \"./types\";\r\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\r\nimport { headCellSx } from \"../common/utils/tableStyles\";\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport SearchBar from \"../common/components/SearchBar\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { useSDKPermissions } from \"../../hooks/useSDKPermissions\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\n\r\ndayjs.extend(isoWeek);\r\n\r\nconst FONT =\r\n \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n\r\nconst COLORS = {\r\n navy: \"#0d2a56\",\r\n blue: \"#1565c8\",\r\n green: \"#0a9a62\",\r\n amber: \"#c47c00\",\r\n red: \"#cc2a2a\",\r\n purple: \"#6b3fbf\",\r\n bg: \"transparent\",\r\n surface: \"transparent\",\r\n} as const;\r\n\r\nconst DEFAULT_PAGE_SIZE = 15;\r\n\r\ntype SortKey =\r\n | \"phoneNumber\"\r\n | \"callStartTime\"\r\n | \"callType\"\r\n | \"callStatus\"\r\n | \"agentName\"\r\n | \"queueName\"\r\n | \"extension\"\r\n | \"talkDurationFmt\"\r\n | \"holdDurationFmt\"\r\n | \"ringingDurationFmt\"\r\n | \"queueDurationFmt\"\r\n | \"wrapupDurationFmt\"\r\n | \"disposition\"\r\n | \"remarks\"\r\n | \"wasTransferred\";\r\n\r\ntype SortDir = \"asc\" | \"desc\";\r\n\r\nconst comparator = (\r\n a: CdrRecordResponse,\r\n b: CdrRecordResponse,\r\n key: SortKey,\r\n): number => {\r\n const av = a[key as keyof CdrRecordResponse];\r\n const bv = b[key as keyof CdrRecordResponse];\r\n if (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\r\n if (typeof av === \"boolean\" && typeof bv === \"boolean\")\r\n return (av ? 1 : 0) - (bv ? 1 : 0);\r\n return String(av ?? \"\").localeCompare(String(bv ?? \"\"));\r\n};\r\n\r\nfunction CallTypePill({ value }: { value: string }) {\r\n const v = (value || \"\").toLowerCase();\r\n let color = \"#6b7b8d\";\r\n let bg = \"transparent\";\r\n if (v.includes(\"inbound\")) {\r\n color = COLORS.green;\r\n bg = \"#e6f7ef\";\r\n } else if (v.includes(\"outbound\")) {\r\n color = COLORS.blue;\r\n bg = \"#e3eefa\";\r\n } else if (v.includes(\"internal\")) {\r\n color = COLORS.purple;\r\n bg = \"#f0e8ff\";\r\n }\r\n return (\r\n <Chip\r\n label={value}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n bgcolor: bg,\r\n color,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction StatusPill({ value }: { value: string }) {\r\n const v = (value || \"\").toLowerCase();\r\n let color = \"#6b7b8d\";\r\n let bg = \"transparent\";\r\n if (v.includes(\"answered\")) {\r\n color = COLORS.green;\r\n bg = \"#e6f7ef\";\r\n } else if (v.includes(\"abandoned\") || v.includes(\"missed\")) {\r\n color = COLORS.red;\r\n bg = \"#fce8e8\";\r\n }\r\n return (\r\n <Chip\r\n label={value}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n bgcolor: bg,\r\n color,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n );\r\n}\r\n\r\nconst fmtRecordingDuration = (s: number): string => {\r\n if (!isFinite(s) || s < 0) return \"\";\r\n const m = Math.floor(s / 60);\r\n const sec = Math.floor(s % 60);\r\n return `${m}:${sec.toString().padStart(2, \"0\")}`;\r\n};\r\n\r\n/* Coordinates playback so only one recording is open at a time. */\r\nconst activePlayers = new Set<(activeId: string) => void>();\r\nconst notifyPlay = (activeId: string) => {\r\n activePlayers.forEach((fn) => fn(activeId));\r\n};\r\n\r\nfunction RecordingCell({\r\n callUuid,\r\n recordingPath,\r\n}: {\r\n callUuid: string;\r\n recordingPath: string | null;\r\n}) {\r\n const [audioUrl, setAudioUrl] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(false);\r\n const [durationSec, setDurationSec] = useState<number | null>(null);\r\n const [currentSec, setCurrentSec] = useState(0);\r\n const unavailable = recordingPath === null;\r\n const totalLabel = durationSec != null ? fmtRecordingDuration(durationSec) : \"\";\r\n\r\n const closePlayer = useCallback(() => {\r\n setAudioUrl((prev) => {\r\n if (prev && prev.startsWith(\"blob:\")) URL.revokeObjectURL(prev);\r\n return null;\r\n });\r\n setCurrentSec(0);\r\n setDurationSec(null);\r\n }, []);\r\n\r\n // Close this player whenever another recording starts playing.\r\n useEffect(() => {\r\n const onPlay = (activeId: string) => {\r\n if (activeId !== callUuid) closePlayer();\r\n };\r\n activePlayers.add(onPlay);\r\n return () => {\r\n activePlayers.delete(onPlay);\r\n };\r\n }, [callUuid, closePlayer]);\r\n\r\n const handlePlay = async () => {\r\n if (audioUrl) return;\r\n notifyPlay(callUuid);\r\n try {\r\n setLoading(true);\r\n setError(false);\r\n const blob = await getRecordingByCall(callUuid);\r\n const url = URL.createObjectURL(blob);\r\n setAudioUrl(url);\r\n } catch {\r\n setError(true);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleDownload = async () => {\r\n try {\r\n const blob = audioUrl\r\n ? await fetch(audioUrl).then((r) => r.blob())\r\n : await getRecordingByCall(callUuid);\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = `recording_${callUuid}.wav`;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n } catch {\r\n /* ignore */\r\n }\r\n };\r\n\r\n if (audioUrl) {\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n <audio\r\n controls\r\n autoPlay\r\n src={audioUrl}\r\n onLoadedMetadata={(e) => setDurationSec(e.currentTarget.duration)}\r\n onTimeUpdate={(e) => setCurrentSec(e.currentTarget.currentTime)}\r\n onEnded={closePlayer}\r\n style={{ width: 180, height: 30 }}\r\n />\r\n {totalLabel && (\r\n <Typography sx={{ fontSize: 12, fontWeight: 600, color: COLORS.navy, whiteSpace: \"nowrap\" }}>\r\n {fmtRecordingDuration(currentSec)} / {totalLabel}\r\n </Typography>\r\n )}\r\n <Tooltip title=\"Download\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDownload}\r\n sx={{ color: COLORS.blue, p: 0.4 }}\r\n >\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.3 }}>\r\n <Tooltip title={unavailable || error ? \"Recording Unavailable\" : \"Play\"}>\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handlePlay}\r\n disabled={loading || error || unavailable}\r\n sx={{ color: unavailable ? \"#b0b8c8\" : COLORS.green, p: 0.4 }}\r\n >\r\n {loading ? (\r\n <CircularProgress size={14} />\r\n ) : (\r\n <PlayArrowIcon sx={{ fontSize: 16 }} />\r\n )}\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n <Tooltip\r\n title={unavailable || error ? \"Recording Unavailable\" : \"Download\"}\r\n >\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDownload}\r\n disabled={loading || error || unavailable}\r\n sx={{ color: unavailable ? \"#b0b8c8\" : COLORS.blue, p: 0.4 }}\r\n >\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n {totalLabel && (\r\n <Typography sx={{ fontSize: 12, fontWeight: 600, color: COLORS.navy, whiteSpace: \"nowrap\", ml: 0.3 }}>\r\n {totalLabel}\r\n </Typography>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nfunction CdrReportContent() {\r\n // These columns show when the backend grants the matching permission,\r\n // OR when the user has the CDR \"manage\" permission.\r\n const { hasAnyPermission } = useSDKPermissions();\r\n const canViewRecording = hasAnyPermission([\r\n SDK_PERMISSIONS.REPORTS_CDR_RECORDING,\r\n SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n ]);\r\n const canViewAudit = hasAnyPermission([\r\n SDK_PERMISSIONS.REPORTS_CDR_AUDIT,\r\n SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n ]);\r\n\r\n const [startDate, setStartDate] = useState<Dayjs | null>(\r\n dayjs().startOf(\"day\"),\r\n );\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [activeQuickDate, setActiveQuickDate] = useState<\r\n \"today\" | \"week\" | \"month\" | null\r\n >(\"today\");\r\n const [searchText, setSearchText] = useState(\"\");\r\n\r\n const [selectedAgents, setSelectedAgents] = useState<AgentOption[]>([]);\r\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\r\n\r\n const [queues, setQueues] = useState<Queue[]>([]);\r\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\r\n\r\n const [callType, setCallType] = useState<string>(\"\");\r\n const [callStatus, setCallStatus] = useState<string>(\"\");\r\n\r\n const [records, setRecords] = useState<CdrRecordResponse[]>([]);\r\n const [totalRecords, setTotalRecords] = useState(0);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n\r\n const [page, setPage] = useState(0);\r\n const [rowsPerPage, setRowsPerPage] = useState(DEFAULT_PAGE_SIZE);\r\n const [sortKey, setSortKey] = useState<SortKey>(\"callStartTime\");\r\n const [sortDir, setSortDir] = useState<SortDir>(\"desc\");\r\n\r\n const [auditDialogOpen, setAuditDialogOpen] = useState(false);\r\n const [selectedAuditRow, setSelectedAuditRow] =\r\n useState<CdrRecordResponse | null>(null);\r\n\r\n useEffect(() => {\r\n getQueues()\r\n .then((data) => setQueues(data || []))\r\n .catch(() => setError(\"Failed to load filter options\"));\r\n }, []);\r\n\r\n const handleQuickRangeChange = (range: QuickRange) => {\r\n setActiveQuickDate(range || null);\r\n };\r\n\r\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n debounceRef.current = setTimeout(\r\n () => setDebouncedSearch(searchText.trim()),\r\n 400,\r\n );\r\n return () => clearTimeout(debounceRef.current);\r\n }, [searchText]);\r\n\r\n const fetchReport = useCallback(\r\n async (pageNum: number) => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n\r\n if (!sd || !ed) {\r\n setError(\"Select a valid date range\");\r\n return;\r\n }\r\n\r\n const params: CdrReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id:\r\n !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.id)\r\n : undefined,\r\n // All queues selected → send no queue_id (backend returns all).\r\n queue_id:\r\n selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n call_type: callType || undefined,\r\n status: callStatus || undefined,\r\n search: debouncedSearch || undefined,\r\n page: pageNum + 1,\r\n pageSize: rowsPerPage,\r\n };\r\n\r\n try {\r\n setError(\"\");\r\n setLoading(true);\r\n const response: any = await getCdrReport(params);\r\n setRecords(\r\n deepFindArray<CdrRecordResponse>(response, [\"data\", \"records\"]),\r\n );\r\n setTotalRecords(\r\n response?.records?.total ??\r\n response?.total ??\r\n response?.data?.total ??\r\n 0,\r\n );\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to fetch CDR report\");\r\n setRecords([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [\r\n startDate,\r\n endDate,\r\n selectedAgents,\r\n isAllUsersSelected,\r\n selectedQueues,\r\n callType,\r\n callStatus,\r\n debouncedSearch,\r\n rowsPerPage,\r\n ],\r\n );\r\n\r\n useEffect(() => {\r\n setPage(0);\r\n fetchReport(0);\r\n }, [fetchReport]);\r\n\r\n const handleRefresh = () => {\r\n if (activeQuickDate) {\r\n const now = dayjs();\r\n let sd = now.startOf(\"day\");\r\n const ed = now;\r\n if (activeQuickDate === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\r\n else if (activeQuickDate === \"month\")\r\n sd = now.startOf(\"month\").startOf(\"day\");\r\n setStartDate(sd);\r\n setEndDate(ed);\r\n } else {\r\n fetchReport(page);\r\n }\r\n };\r\n\r\n const handlePageChange = useCallback(\r\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n setPage(newPage);\r\n fetchReport(newPage);\r\n },\r\n [fetchReport],\r\n );\r\n\r\n const handleSort = (key: SortKey) => {\r\n if (sortKey === key) {\r\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n } else {\r\n setSortKey(key);\r\n setSortDir(\"asc\");\r\n }\r\n };\r\n\r\n const sortedRecords = useMemo(() => {\r\n const rows = [...records];\r\n rows.sort((a, b) => {\r\n const cmp = comparator(a, b, sortKey);\r\n return sortDir === \"asc\" ? cmp : -cmp;\r\n });\r\n return rows;\r\n }, [records, sortKey, sortDir]);\r\n\r\n const handleExportExcel = async () => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n const params: CdrReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id:\r\n !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.id)\r\n : undefined,\r\n queue_id:\r\n selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n call_type: callType || undefined,\r\n status: callStatus || undefined,\r\n search: debouncedSearch || undefined,\r\n };\r\n try {\r\n await exportCdrReportToExcel(params);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n };\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box\r\n sx={{\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n fontFamily: FONT,\r\n }}\r\n >\r\n <PageHeader\r\n title=\"CDR Report\"\r\n actions={\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n <SearchBar\r\n value={searchText}\r\n onChange={setSearchText}\r\n placeholder=\"Search phone, agent...\"\r\n width={250}\r\n />\r\n <SDKPermissionGuard\r\n permissions={[\r\n SDK_PERMISSIONS.REPORTS_CDR_EXPORT,\r\n SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n ]}\r\n showFallback={false}\r\n >\r\n <AppButton\r\n startIcon={\r\n <DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />\r\n }\r\n disabled={!records.length}\r\n onClick={handleExportExcel}\r\n sx={{ height: 36 }}\r\n >\r\n Export Excel\r\n </AppButton>\r\n </SDKPermissionGuard>\r\n </Stack>\r\n }\r\n />\r\n\r\n <Box sx={{ flex: 1, overflow: \"auto\", py: 0.8, px: 0 }}>\r\n <Box sx={{ mb: 0.8 }}>\r\n <ReportFilterBar\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n quickRange={activeQuickDate || \"\"}\r\n onQuickRangeChange={handleQuickRangeChange}\r\n showAgentSelect\r\n selectedAgents={selectedAgents}\r\n onAgentsChange={setSelectedAgents}\r\n setIsAllUsersSelected={setIsAllUsersSelected}\r\n showQueueSelect\r\n queues={queues}\r\n selectedQueues={selectedQueues}\r\n onQueuesChange={setSelectedQueues}\r\n showCallTypeSelect\r\n selectedCallType={callType}\r\n onCallTypeChange={setCallType}\r\n showStatusSelect\r\n selectedStatus={callStatus}\r\n onStatusChange={setCallStatus}\r\n extra={\r\n <AppButton\r\n startIcon={\r\n <RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />\r\n }\r\n disabled={loading}\r\n onClick={handleRefresh}\r\n sx={{ height: 32 }}\r\n >\r\n Refresh\r\n </AppButton>\r\n }\r\n />\r\n\r\n {error && (\r\n <Alert\r\n severity=\"error\"\r\n sx={{ mt: 1, fontFamily: FONT, fontSize: \"0.78rem\" }}\r\n >\r\n {error}\r\n </Alert>\r\n )}\r\n </Box>\r\n\r\n {loading && (\r\n <Box sx={{ textAlign: \"center\", py: 2.5 }}>\r\n <CircularProgress sx={{ color: COLORS.blue }} size={28} />\r\n </Box>\r\n )}\r\n\r\n <Paper\r\n elevation={0}\r\n sx={{\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e0e7ef\",\r\n overflow: \"hidden\",\r\n mb: 2,\r\n }}\r\n >\r\n <TableContainer>\r\n <Table\r\n size=\"small\"\r\n sx={{\r\n minWidth: 1400,\r\n fontFamily: FONT,\r\n \"& .MuiTableCell-root\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.75rem\",\r\n borderBottom: \"1px solid #eef1f6\",\r\n py: 0.6,\r\n px: 1,\r\n },\r\n }}\r\n >\r\n <TableHead>\r\n <TableRow>\r\n {canViewAudit && (\r\n <TableCell\r\n sx={{ ...(headCellSx as object), minWidth: 110, textAlign: \"center\" }}\r\n >\r\n Audit Report\r\n </TableCell>\r\n )}\r\n {canViewRecording && (\r\n <TableCell\r\n sx={{ ...(headCellSx as object), minWidth: 100 }}\r\n >\r\n Recording\r\n </TableCell>\r\n )}\r\n {(\r\n [\r\n { id: \"phoneNumber\" as SortKey, label: \"Phone Number\" },\r\n { id: \"callStartTime\" as SortKey, label: \"Call Start\" },\r\n { id: \"callType\" as SortKey, label: \"Call Type\" },\r\n { id: \"callStatus\" as SortKey, label: \"Status\" },\r\n { id: \"agentName\" as SortKey, label: \"User Name\" },\r\n { id: \"queueName\" as SortKey, label: \"Queues\" },\r\n { id: \"extension\" as SortKey, label: \"Extension\" },\r\n {\r\n id: \"talkDurationFmt\" as SortKey,\r\n label: \"Talk Duration\",\r\n },\r\n {\r\n id: \"holdDurationFmt\" as SortKey,\r\n label: \"Hold Duration\",\r\n },\r\n {\r\n id: \"ringingDurationFmt\" as SortKey,\r\n label: \"Ringing Duration\",\r\n },\r\n {\r\n id: \"queueDurationFmt\" as SortKey,\r\n label: \"Queue Duration\",\r\n },\r\n {\r\n id: \"wrapupDurationFmt\" as SortKey,\r\n label: \"Wrapup Duration\",\r\n },\r\n { id: \"disposition\" as SortKey, label: \"Disposition\" },\r\n { id: \"remarks\" as SortKey, label: \"Remarks\" },\r\n {\r\n id: \"wasTransferred\" as SortKey,\r\n label: \"Transferred\",\r\n },\r\n ] as { id: SortKey; label: string }[]\r\n ).map((col) => (\r\n <TableCell key={col.id} sx={headCellSx}>\r\n <TableSortLabel\r\n active={sortKey === col.id}\r\n direction={sortKey === col.id ? sortDir : \"asc\"}\r\n onClick={() => handleSort(col.id)}\r\n sx={{\r\n \"&.MuiTableSortLabel-root\": { color: \"#333\" },\r\n \"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\r\n \"&.Mui-active\": { color: \"#333\" },\r\n \"& .MuiTableSortLabel-icon\": {\r\n color: \"#333 !important\",\r\n },\r\n }}\r\n >\r\n {col.label}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n\r\n <TableBody>\r\n {sortedRecords.map((row, idx) => (\r\n <TableRow\r\n key={row.callUuid || idx}\r\n hover\r\n sx={{\r\n backgroundColor: \"#fff\",\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n }}\r\n >\r\n {canViewAudit && (\r\n <TableCell sx={{ textAlign: \"center\", verticalAlign: \"middle\" }}>\r\n <Tooltip title=\"View Audit Report\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setSelectedAuditRow(row);\r\n setAuditDialogOpen(true);\r\n }}\r\n sx={{ color: COLORS.blue, p: 0.4 }}\r\n >\r\n <AssignmentIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n </TableCell>\r\n )}\r\n {canViewRecording && (\r\n <TableCell sx={{ verticalAlign: \"middle\" }}>\r\n {row.callUuid ? (\r\n <RecordingCell\r\n callUuid={row.callUuid}\r\n recordingPath={row.recordingPath}\r\n />\r\n ) : null}\r\n </TableCell>\r\n )}\r\n <TableCell\r\n sx={{\r\n fontWeight: 600,\r\n color: COLORS.navy,\r\n fontSize: \"0.75rem\",\r\n }}\r\n >\r\n {row.phoneNumber || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.callStartTime\r\n ? dayjs(row.callStartTime).format(\r\n \"DD MMM YYYY hh:mm A\",\r\n )\r\n : \"\"}\r\n </TableCell>\r\n <TableCell>\r\n <CallTypePill value={row.callType || \"\"} />\r\n </TableCell>\r\n <TableCell>\r\n <StatusPill value={row.callStatus || \"\"} />\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.agentName || \"\"}\r\n </TableCell>\r\n <TableCell>\r\n {row.queueName ? (\r\n <Chip\r\n label={row.queueName}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#f0ebfa\",\r\n color: COLORS.purple,\r\n fontWeight: 500,\r\n fontSize: \"0.67rem\",\r\n height: 22,\r\n }}\r\n />\r\n ) : null}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.extension || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 600,\r\n color: COLORS.blue,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.talkDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n color: COLORS.amber,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.holdDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.ringingDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.queueDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.wrapupDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.disposition || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.remarks ? (\r\n <Tooltip title={row.remarks}>\r\n <span\r\n style={{\r\n display: \"inline-block\",\r\n maxWidth: 180,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n verticalAlign: \"bottom\",\r\n }}\r\n >\r\n {row.remarks}\r\n </span>\r\n </Tooltip>\r\n ) : (\r\n \"\"\r\n )}\r\n </TableCell>\r\n <TableCell>\r\n {row.wasTransferred ? (\r\n <Chip\r\n label=\"Yes\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#e6f7ef\",\r\n color: COLORS.green,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n ) : (\r\n <Chip\r\n label=\"No\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"transparent\",\r\n color: \"#6b7b8d\",\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n )}\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n\r\n <TablePagination\r\n component=\"div\"\r\n count={totalRecords}\r\n page={page}\r\n onPageChange={handlePageChange}\r\n rowsPerPage={rowsPerPage}\r\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\r\n onRowsPerPageChange={(e) => {\r\n setRowsPerPage(parseInt(e.target.value, 10));\r\n setPage(0);\r\n }}\r\n sx={{\r\n borderTop: \"1px solid #eef1f6\",\r\n fontFamily: FONT,\r\n \"& .MuiTablePagination-displayedRows\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.73rem\",\r\n },\r\n \"& .MuiTablePagination-selectLabel\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.73rem\",\r\n },\r\n }}\r\n />\r\n </Paper>\r\n </Box>\r\n </Box>\r\n\r\n <AuditReportDialog\r\n open={auditDialogOpen}\r\n onClose={() => {\r\n setAuditDialogOpen(false);\r\n setSelectedAuditRow(null);\r\n }}\r\n rowData={selectedAuditRow ?? undefined}\r\n />\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst CdrReport: React.FC = () => (\r\n <SDKProvider>\r\n <CdrReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default CdrReport;\r\n","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 3h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1m2 14H7v-2h7zm3-4H7v-2h10zm0-4H7V7h10z\"\n}), 'Assignment');"],"mappings":"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","names":["dayjs","isoWeek"]}
|
|
@@ -1,25 +1,70 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Close_default
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-WTBVFN4H.mjs";
|
|
4
4
|
import {
|
|
5
5
|
AppButton
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-NAZO4HKB.mjs";
|
|
7
7
|
import {
|
|
8
|
-
DateRangePicker
|
|
9
|
-
|
|
8
|
+
DateRangePicker,
|
|
9
|
+
require_dayjs_min
|
|
10
|
+
} from "./chunk-E6KYWWAI.mjs";
|
|
10
11
|
import {
|
|
11
12
|
Search_default
|
|
12
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-YAQYTUTX.mjs";
|
|
13
14
|
import {
|
|
14
15
|
END_POINT,
|
|
15
16
|
axios_default
|
|
16
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-LHE4QGJJ.mjs";
|
|
17
18
|
import {
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
Box_default,
|
|
20
|
+
Checkbox_default,
|
|
21
|
+
CircularProgress_default,
|
|
22
|
+
FormControl_default,
|
|
23
|
+
IconButton_default,
|
|
24
|
+
InputAdornment_default,
|
|
25
|
+
InputLabel_default,
|
|
26
|
+
MenuItem_default,
|
|
27
|
+
Select_default,
|
|
28
|
+
TextField_default,
|
|
29
|
+
Typography_default,
|
|
30
|
+
__commonJS,
|
|
31
|
+
__spreadValues,
|
|
32
|
+
__toESM
|
|
33
|
+
} from "./chunk-Q6G3MPS7.mjs";
|
|
34
|
+
|
|
35
|
+
// node_modules/dayjs/plugin/isoWeek.js
|
|
36
|
+
var require_isoWeek = __commonJS({
|
|
37
|
+
"node_modules/dayjs/plugin/isoWeek.js"(exports, module) {
|
|
38
|
+
"use strict";
|
|
39
|
+
!(function(e, t) {
|
|
40
|
+
"object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (e = "undefined" != typeof globalThis ? globalThis : e || self).dayjs_plugin_isoWeek = t();
|
|
41
|
+
})(exports, (function() {
|
|
42
|
+
"use strict";
|
|
43
|
+
var e = "day";
|
|
44
|
+
return function(t, i, s) {
|
|
45
|
+
var a = function(t2) {
|
|
46
|
+
return t2.add(4 - t2.isoWeekday(), e);
|
|
47
|
+
}, d = i.prototype;
|
|
48
|
+
d.isoWeekYear = function() {
|
|
49
|
+
return a(this).year();
|
|
50
|
+
}, d.isoWeek = function(t2) {
|
|
51
|
+
if (!this.$utils().u(t2)) return this.add(7 * (t2 - this.isoWeek()), e);
|
|
52
|
+
var i2, d2, n2, o, r = a(this), u = (i2 = this.isoWeekYear(), d2 = this.$u, n2 = (d2 ? s.utc : s)().year(i2).startOf("year"), o = 4 - n2.isoWeekday(), n2.isoWeekday() > 4 && (o += 7), n2.add(o, e));
|
|
53
|
+
return r.diff(u, "week") + 1;
|
|
54
|
+
}, d.isoWeekday = function(e2) {
|
|
55
|
+
return this.$utils().u(e2) ? this.day() || 7 : this.day(this.day() % 7 ? e2 : e2 - 7);
|
|
56
|
+
};
|
|
57
|
+
var n = d.startOf;
|
|
58
|
+
d.startOf = function(e2, t2) {
|
|
59
|
+
var i2 = this.$utils(), s2 = !!i2.u(t2) || t2;
|
|
60
|
+
return "isoweek" === i2.p(e2) ? s2 ? this.date(this.date() - (this.isoWeekday() - 1)).startOf("day") : this.date(this.date() - 1 - (this.isoWeekday() - 1) + 7).endOf("day") : n.bind(this)(e2, t2);
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
});
|
|
20
66
|
|
|
21
67
|
// call-control-sdk/lib/pages/common/components/SearchBar.tsx
|
|
22
|
-
import { TextField, InputAdornment, IconButton } from "@mui/material";
|
|
23
68
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
24
69
|
function SearchBar({
|
|
25
70
|
value,
|
|
@@ -33,15 +78,15 @@ function SearchBar({
|
|
|
33
78
|
inputRef,
|
|
34
79
|
sx
|
|
35
80
|
}) {
|
|
36
|
-
const searchAdornment = /* @__PURE__ */ jsx(
|
|
37
|
-
const clearButton = showClear && value ? /* @__PURE__ */ jsx(
|
|
81
|
+
const searchAdornment = /* @__PURE__ */ jsx(InputAdornment_default, { position: iconPosition, children: /* @__PURE__ */ jsx(Search_default, { sx: { color: "#1A5F6C", fontSize: 18 } }) });
|
|
82
|
+
const clearButton = showClear && value ? /* @__PURE__ */ jsx(InputAdornment_default, { position: "end", children: /* @__PURE__ */ jsx(IconButton_default, { size: "small", onClick: () => onChange(""), edge: "end", children: /* @__PURE__ */ jsx(Close_default, { sx: { fontSize: 16, color: "#94a3b8" } }) }) }) : null;
|
|
38
83
|
const startAdornment = iconPosition === "start" ? searchAdornment : void 0;
|
|
39
84
|
const endAdornment = iconPosition === "end" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
40
85
|
clearButton,
|
|
41
86
|
searchAdornment
|
|
42
87
|
] }) : clearButton || void 0;
|
|
43
88
|
return /* @__PURE__ */ jsx(
|
|
44
|
-
|
|
89
|
+
TextField_default,
|
|
45
90
|
{
|
|
46
91
|
size: "small",
|
|
47
92
|
placeholder,
|
|
@@ -70,30 +115,11 @@ function SearchBar({
|
|
|
70
115
|
}
|
|
71
116
|
|
|
72
117
|
// call-control-sdk/lib/pages/common/components/ReportFilterBar.tsx
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
Checkbox as Checkbox2,
|
|
76
|
-
FormControl as FormControl2,
|
|
77
|
-
InputLabel as InputLabel2,
|
|
78
|
-
MenuItem as MenuItem2,
|
|
79
|
-
Select as Select2,
|
|
80
|
-
TextField as TextField2,
|
|
81
|
-
CircularProgress as CircularProgress2
|
|
82
|
-
} from "@mui/material";
|
|
83
|
-
import dayjs from "dayjs";
|
|
84
|
-
import isoWeek from "dayjs/plugin/isoWeek";
|
|
118
|
+
var import_dayjs = __toESM(require_dayjs_min());
|
|
119
|
+
var import_isoWeek = __toESM(require_isoWeek());
|
|
85
120
|
|
|
86
121
|
// call-control-sdk/lib/pages/common/components/AgentMultiSelect.tsx
|
|
87
122
|
import { useState, useEffect } from "react";
|
|
88
|
-
import {
|
|
89
|
-
Checkbox,
|
|
90
|
-
FormControl,
|
|
91
|
-
InputLabel,
|
|
92
|
-
MenuItem,
|
|
93
|
-
Select,
|
|
94
|
-
CircularProgress,
|
|
95
|
-
Typography
|
|
96
|
-
} from "@mui/material";
|
|
97
123
|
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
98
124
|
async function getUsers(params) {
|
|
99
125
|
var _a;
|
|
@@ -158,10 +184,10 @@ function AgentMultiSelect({
|
|
|
158
184
|
if (sel.length === 0 || sel.length === agents.length) return placeholder;
|
|
159
185
|
return `${sel.length} Agent(s)`;
|
|
160
186
|
};
|
|
161
|
-
return /* @__PURE__ */ jsxs2(
|
|
162
|
-
/* @__PURE__ */ jsx2(
|
|
187
|
+
return /* @__PURE__ */ jsxs2(FormControl_default, { size: "small", sx: { minWidth }, disabled: disabled || loading, children: [
|
|
188
|
+
/* @__PURE__ */ jsx2(InputLabel_default, { sx: { fontSize: "0.76rem" }, children: label }),
|
|
163
189
|
/* @__PURE__ */ jsxs2(
|
|
164
|
-
|
|
190
|
+
Select_default,
|
|
165
191
|
{
|
|
166
192
|
multiple: true,
|
|
167
193
|
value: selectedIds,
|
|
@@ -179,17 +205,17 @@ function AgentMultiSelect({
|
|
|
179
205
|
}
|
|
180
206
|
},
|
|
181
207
|
children: [
|
|
182
|
-
loading && /* @__PURE__ */ jsxs2(
|
|
183
|
-
/* @__PURE__ */ jsx2(
|
|
208
|
+
loading && /* @__PURE__ */ jsxs2(MenuItem_default, { disabled: true, children: [
|
|
209
|
+
/* @__PURE__ */ jsx2(CircularProgress_default, { size: 16, sx: { mr: 1 } }),
|
|
184
210
|
" Loading\u2026"
|
|
185
211
|
] }),
|
|
186
|
-
!loading && /* @__PURE__ */ jsxs2(
|
|
187
|
-
/* @__PURE__ */ jsx2(
|
|
212
|
+
!loading && /* @__PURE__ */ jsxs2(MenuItem_default, { value: SELECT_ALL_ID, children: [
|
|
213
|
+
/* @__PURE__ */ jsx2(Checkbox_default, { checked: allSelected, indeterminate: value.length > 0 && !allSelected, size: "small" }),
|
|
188
214
|
"Select All"
|
|
189
215
|
] }),
|
|
190
|
-
!loading && agents.map((agent) => /* @__PURE__ */ jsxs2(
|
|
191
|
-
/* @__PURE__ */ jsx2(
|
|
192
|
-
/* @__PURE__ */ jsx2(
|
|
216
|
+
!loading && agents.map((agent) => /* @__PURE__ */ jsxs2(MenuItem_default, { value: agent.id, children: [
|
|
217
|
+
/* @__PURE__ */ jsx2(Checkbox_default, { checked: selectedIds.includes(agent.id), size: "small" }),
|
|
218
|
+
/* @__PURE__ */ jsx2(Typography_default, { noWrap: true, sx: { fontSize: "0.76rem", maxWidth: 180 }, title: agent.displayName, children: agent.displayName })
|
|
193
219
|
] }, agent.id))
|
|
194
220
|
]
|
|
195
221
|
}
|
|
@@ -199,7 +225,7 @@ function AgentMultiSelect({
|
|
|
199
225
|
|
|
200
226
|
// call-control-sdk/lib/pages/common/components/ReportFilterBar.tsx
|
|
201
227
|
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
202
|
-
|
|
228
|
+
import_dayjs.default.extend(import_isoWeek.default);
|
|
203
229
|
var FILTER_HEIGHT = 32;
|
|
204
230
|
function ReportFilterBar({
|
|
205
231
|
startDate,
|
|
@@ -249,7 +275,7 @@ function ReportFilterBar({
|
|
|
249
275
|
}) {
|
|
250
276
|
const setQuick = (range) => {
|
|
251
277
|
onQuickRangeChange(range);
|
|
252
|
-
const today =
|
|
278
|
+
const today = (0, import_dayjs.default)();
|
|
253
279
|
let sd = today.startOf("day");
|
|
254
280
|
const ed = today;
|
|
255
281
|
if (range === "week") sd = today.startOf("week").startOf("day");
|
|
@@ -257,7 +283,7 @@ function ReportFilterBar({
|
|
|
257
283
|
onStartChange(sd);
|
|
258
284
|
onEndChange(ed);
|
|
259
285
|
};
|
|
260
|
-
return /* @__PURE__ */ jsxs3(
|
|
286
|
+
return /* @__PURE__ */ jsxs3(Box_default, { sx: { py: 0.6, px: 1, display: "flex", alignItems: "center", gap: 1, flexWrap: "wrap", rowGap: 1 }, children: [
|
|
261
287
|
/* @__PURE__ */ jsx3(
|
|
262
288
|
DateRangePicker,
|
|
263
289
|
{
|
|
@@ -278,10 +304,10 @@ function ReportFilterBar({
|
|
|
278
304
|
/* @__PURE__ */ jsx3(AppButton, { variant: quickRange === "week" ? "primary" : "outlined", onClick: () => setQuick("week"), sx: { height: FILTER_HEIGHT, whiteSpace: "nowrap" }, children: "This Week" }),
|
|
279
305
|
/* @__PURE__ */ jsx3(AppButton, { variant: quickRange === "month" ? "primary" : "outlined", onClick: () => setQuick("month"), sx: { height: FILTER_HEIGHT, whiteSpace: "nowrap" }, children: "This Month" }),
|
|
280
306
|
showAgentSelect && onAgentsChange && /* @__PURE__ */ jsx3(AgentMultiSelect, { value: selectedAgents, onChange: onAgentsChange, setIsAllUsersSelected, minWidth: 130 }),
|
|
281
|
-
showQueueSelect && onQueuesChange && /* @__PURE__ */ jsxs3(
|
|
282
|
-
/* @__PURE__ */ jsx3(
|
|
307
|
+
showQueueSelect && onQueuesChange && /* @__PURE__ */ jsxs3(FormControl_default, { size: "small", sx: { minWidth: 130 }, children: [
|
|
308
|
+
/* @__PURE__ */ jsx3(InputLabel_default, { sx: { fontSize: "0.76rem" }, children: "All Queues" }),
|
|
283
309
|
/* @__PURE__ */ jsxs3(
|
|
284
|
-
|
|
310
|
+
Select_default,
|
|
285
311
|
{
|
|
286
312
|
multiple: true,
|
|
287
313
|
sx: { fontSize: "0.76rem", height: FILTER_HEIGHT, borderRadius: "6px" },
|
|
@@ -310,12 +336,12 @@ function ReportFilterBar({
|
|
|
310
336
|
return `${selected.length} Queue(s)`;
|
|
311
337
|
},
|
|
312
338
|
children: [
|
|
313
|
-
/* @__PURE__ */ jsxs3(
|
|
314
|
-
/* @__PURE__ */ jsx3(
|
|
339
|
+
/* @__PURE__ */ jsxs3(MenuItem_default, { value: -1, children: [
|
|
340
|
+
/* @__PURE__ */ jsx3(Checkbox_default, { checked: selectedQueues.length === queues.length && queues.length > 0, size: "small" }),
|
|
315
341
|
"Select All"
|
|
316
342
|
] }),
|
|
317
|
-
queues.map((q) => /* @__PURE__ */ jsxs3(
|
|
318
|
-
/* @__PURE__ */ jsx3(
|
|
343
|
+
queues.map((q) => /* @__PURE__ */ jsxs3(MenuItem_default, { value: q.id, children: [
|
|
344
|
+
/* @__PURE__ */ jsx3(Checkbox_default, { checked: selectedQueues.some((sq) => sq.id === q.id), size: "small" }),
|
|
319
345
|
q.name
|
|
320
346
|
] }, q.id))
|
|
321
347
|
]
|
|
@@ -323,7 +349,7 @@ function ReportFilterBar({
|
|
|
323
349
|
)
|
|
324
350
|
] }),
|
|
325
351
|
showProcessSelect && processes.length > 0 && onProcessChange && /* @__PURE__ */ jsx3(
|
|
326
|
-
|
|
352
|
+
TextField_default,
|
|
327
353
|
{
|
|
328
354
|
select: true,
|
|
329
355
|
size: "small",
|
|
@@ -333,10 +359,10 @@ function ReportFilterBar({
|
|
|
333
359
|
children: processes.map((p) => /* @__PURE__ */ jsx3("option", { value: p.value, children: p.label }, p.value))
|
|
334
360
|
}
|
|
335
361
|
),
|
|
336
|
-
showCallTypeSelect && onCallTypeChange && /* @__PURE__ */ jsxs3(
|
|
337
|
-
/* @__PURE__ */ jsx3(
|
|
362
|
+
showCallTypeSelect && onCallTypeChange && /* @__PURE__ */ jsxs3(FormControl_default, { size: "small", sx: { minWidth: 130 }, children: [
|
|
363
|
+
/* @__PURE__ */ jsx3(InputLabel_default, { sx: { fontSize: "0.76rem" }, children: "Call Type" }),
|
|
338
364
|
/* @__PURE__ */ jsx3(
|
|
339
|
-
|
|
365
|
+
Select_default,
|
|
340
366
|
{
|
|
341
367
|
value: selectedCallType,
|
|
342
368
|
label: "Call Type",
|
|
@@ -349,14 +375,14 @@ function ReportFilterBar({
|
|
|
349
375
|
}
|
|
350
376
|
}
|
|
351
377
|
},
|
|
352
|
-
children: callTypeOptions.map((opt) => /* @__PURE__ */ jsx3(
|
|
378
|
+
children: callTypeOptions.map((opt) => /* @__PURE__ */ jsx3(MenuItem_default, { value: opt.value, children: opt.label }, opt.value || "all"))
|
|
353
379
|
}
|
|
354
380
|
)
|
|
355
381
|
] }),
|
|
356
|
-
showStatusSelect && onStatusChange && /* @__PURE__ */ jsxs3(
|
|
357
|
-
/* @__PURE__ */ jsx3(
|
|
382
|
+
showStatusSelect && onStatusChange && /* @__PURE__ */ jsxs3(FormControl_default, { size: "small", sx: { minWidth: 130 }, children: [
|
|
383
|
+
/* @__PURE__ */ jsx3(InputLabel_default, { sx: { fontSize: "0.76rem" }, children: "Status" }),
|
|
358
384
|
/* @__PURE__ */ jsx3(
|
|
359
|
-
|
|
385
|
+
Select_default,
|
|
360
386
|
{
|
|
361
387
|
value: selectedStatus,
|
|
362
388
|
label: "Status",
|
|
@@ -369,7 +395,7 @@ function ReportFilterBar({
|
|
|
369
395
|
}
|
|
370
396
|
}
|
|
371
397
|
},
|
|
372
|
-
children: statusOptions.map((opt) => /* @__PURE__ */ jsx3(
|
|
398
|
+
children: statusOptions.map((opt) => /* @__PURE__ */ jsx3(MenuItem_default, { value: opt.value, children: opt.label }, opt.value || "all"))
|
|
373
399
|
}
|
|
374
400
|
)
|
|
375
401
|
] }),
|
|
@@ -384,7 +410,7 @@ function ReportFilterBar({
|
|
|
384
410
|
sx: { "& .MuiOutlinedInput-root": { height: FILTER_HEIGHT, fontSize: 13 } }
|
|
385
411
|
}
|
|
386
412
|
),
|
|
387
|
-
showSearchButton && onSearch && /* @__PURE__ */ jsx3(AppButton, { onClick: onSearch, disabled: loading, sx: { height: FILTER_HEIGHT }, children: loading ? /* @__PURE__ */ jsx3(
|
|
413
|
+
showSearchButton && onSearch && /* @__PURE__ */ jsx3(AppButton, { onClick: onSearch, disabled: loading, sx: { height: FILTER_HEIGHT }, children: loading ? /* @__PURE__ */ jsx3(CircularProgress_default, { size: 16, sx: { color: "#fff" } }) : "Search" }),
|
|
388
414
|
extra
|
|
389
415
|
] });
|
|
390
416
|
}
|
|
@@ -413,10 +439,11 @@ var reportBodyCellSx = {
|
|
|
413
439
|
};
|
|
414
440
|
|
|
415
441
|
export {
|
|
442
|
+
require_isoWeek,
|
|
416
443
|
SearchBar,
|
|
417
444
|
ReportFilterBar,
|
|
418
445
|
headCellSx,
|
|
419
446
|
sortLabelSx,
|
|
420
447
|
reportBodyCellSx
|
|
421
448
|
};
|
|
422
|
-
//# sourceMappingURL=chunk-
|
|
449
|
+
//# sourceMappingURL=chunk-2M3YEXYA.mjs.map
|