ahs-cti 0.0.4 → 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-6RO6STKU.mjs → agentPerformanceReport-JZK5DN5E.mjs} +73 -57
- package/dist/agentPerformanceReport-JZK5DN5E.mjs.map +1 -0
- package/dist/{auditReport-PYRZU3NA.mjs → auditReport-6ZUJ4UFO.mjs} +5 -4
- package/dist/{auditReport-PYRZU3NA.mjs.map → auditReport-6ZUJ4UFO.mjs.map} +1 -1
- package/dist/{callHistory-4JI64TU7.mjs → callHistory-T3M76D4B.mjs} +161 -158
- package/dist/callHistory-T3M76D4B.mjs.map +1 -0
- package/dist/{campaigns-JZE22SIM.mjs → campaigns-5PVHXBSD.mjs} +472 -417
- package/dist/campaigns-5PVHXBSD.mjs.map +1 -0
- 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-RJTURVVV.mjs → cdrReport-ZMDHSZUW.mjs} +122 -104
- package/dist/cdrReport-ZMDHSZUW.mjs.map +1 -0
- package/dist/{chunk-HAJ6SECI.mjs → chunk-2M3YEXYA.mjs} +95 -64
- package/dist/chunk-2M3YEXYA.mjs.map +1 -0
- package/dist/{chunk-BDQZYTAY.mjs → chunk-33QNSXP7.mjs} +169 -163
- package/dist/chunk-33QNSXP7.mjs.map +1 -0
- package/dist/{chunk-FVVDDZCA.mjs → chunk-3J7KQNEU.mjs} +22 -11
- package/dist/chunk-3J7KQNEU.mjs.map +1 -0
- package/dist/chunk-6WLG2PXL.mjs +14 -0
- package/dist/chunk-6WLG2PXL.mjs.map +1 -0
- package/dist/chunk-7LE2VTAI.mjs +14 -0
- package/dist/chunk-7LE2VTAI.mjs.map +1 -0
- package/dist/chunk-AOJRUZTO.mjs +14 -0
- package/dist/chunk-AOJRUZTO.mjs.map +1 -0
- package/dist/chunk-DF5EFKXC.mjs +28690 -0
- package/dist/chunk-DF5EFKXC.mjs.map +1 -0
- package/dist/{chunk-UNTGXE6T.mjs → chunk-DJP744FF.mjs} +2 -2
- package/dist/{chunk-RZZQ42MG.mjs → chunk-DNTGBNZD.mjs} +22 -15
- package/dist/{chunk-RZZQ42MG.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-FRKV2U3I.mjs +14 -0
- package/dist/chunk-FRKV2U3I.mjs.map +1 -0
- package/dist/{chunk-IBFF6DJA.mjs → chunk-H7GRWLYI.mjs} +13 -5
- package/dist/chunk-H7GRWLYI.mjs.map +1 -0
- package/dist/{chunk-PO6POUPL.mjs → chunk-IDZWA6HG.mjs} +185 -162
- package/dist/chunk-IDZWA6HG.mjs.map +1 -0
- 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-OHJIW3I3.mjs +14 -0
- package/dist/chunk-OHJIW3I3.mjs.map +1 -0
- package/dist/chunk-Q6G3MPS7.mjs +37797 -0
- package/dist/chunk-Q6G3MPS7.mjs.map +1 -0
- package/dist/{chunk-ATAP77RC.mjs → chunk-U2UDKXMB.mjs} +2 -2
- package/dist/{chunk-JOZ4YQMR.mjs → chunk-VBIDPX5Z.mjs} +22 -15
- package/dist/{chunk-JOZ4YQMR.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-WTBVFN4H.mjs +14 -0
- package/dist/chunk-WTBVFN4H.mjs.map +1 -0
- package/dist/chunk-YAQYTUTX.mjs +28 -0
- package/dist/chunk-YAQYTUTX.mjs.map +1 -0
- package/dist/index.js +117517 -31841
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +474 -369
- package/dist/index.mjs.map +1 -1
- package/dist/{liveStatus-E7UP37FK.mjs → liveStatus-YSBYSVOO.mjs} +123 -122
- package/dist/{liveStatus-E7UP37FK.mjs.map → liveStatus-YSBYSVOO.mjs.map} +1 -1
- package/dist/{loginReport-5QYHG6OM.mjs → loginReport-YIVBJVJD.mjs} +143 -122
- package/dist/loginReport-YIVBJVJD.mjs.map +1 -0
- package/dist/managementDashboard-7EMQC2UA.mjs +536 -0
- package/dist/{managementDashboard-PARD3QHL.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-JYBV3TF6.mjs +0 -13
- package/dist/agentPerformanceReport-6RO6STKU.mjs.map +0 -1
- package/dist/callHistory-4JI64TU7.mjs.map +0 -1
- package/dist/campaigns-JZE22SIM.mjs.map +0 -1
- package/dist/cdrReport-RJTURVVV.mjs.map +0 -1
- package/dist/chunk-AJQBR3AZ.mjs.map +0 -1
- package/dist/chunk-BDQZYTAY.mjs.map +0 -1
- package/dist/chunk-FVVDDZCA.mjs.map +0 -1
- package/dist/chunk-HAJ6SECI.mjs.map +0 -1
- package/dist/chunk-IBFF6DJA.mjs.map +0 -1
- package/dist/chunk-OVC42HVH.mjs +0 -1063
- package/dist/chunk-OVC42HVH.mjs.map +0 -1
- package/dist/chunk-PO6POUPL.mjs.map +0 -1
- package/dist/chunk-UB5HSUGK.mjs +0 -65
- package/dist/chunk-UB5HSUGK.mjs.map +0 -1
- package/dist/loginReport-5QYHG6OM.mjs.map +0 -1
- package/dist/managementDashboard-PARD3QHL.mjs +0 -531
- /package/dist/{agentDetailReport-JYBV3TF6.mjs.map → agentDetailReport-ZR7U2LLB.mjs.map} +0 -0
- /package/dist/{chunk-UNTGXE6T.mjs.map → chunk-DJP744FF.mjs.map} +0 -0
- /package/dist/{chunk-ATAP77RC.mjs.map → chunk-U2UDKXMB.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/agentDetailReport/index.tsx","../call-control-sdk/lib/pages/agentDetailReport/useAgentDetailReport.ts"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from \"react\";\n\nimport {\n Box, Typography, Table, TableBody, TableCell, TableContainer,\n TableHead, TableRow, TablePagination, IconButton, Chip,\n CircularProgress, Alert,\n} from \"@mui/material\";\nimport AppButton from \"../common/components/AppButton\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport {\n BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip as RTooltip,\n PieChart, Pie, Cell, Legend, ResponsiveContainer, LabelList,\n} from \"recharts\";\nimport dayjs, { type Dayjs } from \"dayjs\";\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\nimport DateRangePicker from \"../common/components/DateRangePicker\";\nimport { getAgentDetailReport, getCdrReport, getRecordingByCall } from \"./useAgentDetailReport\";\nimport { deepFindArray } from \"../../services/axios\";\nimport { sdkStateManager } from \"../../hooks/sdk-state\";\nimport type {\n AgentDetailReportResponse,\n AgentDetailProfile,\n CdrRecordResponse,\n CdrReportParams,\n ReportData,\n} from \"./types\";\nimport PageHeader from \"../common/components/PageHeader\";\n\nimport { SDKProvider } from \"../../components/SDKProvider\";\n\nconst C = {\n navy: \"#0d2a56\", blue: \"#1565c8\", green: \"#0a9a62\", amber: \"#c47c00\",\n red: \"#cc2a2a\", purple: \"#6b3fbf\", teal: \"#0b7a8f\",\n bg: \"#fff\", surface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\n b1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\n t1: \"#0d1e35\", t2: \"#364f6e\", t3: \"#7a93b5\", t4: \"#bccad9\",\n blt: \"#e8f0fc\", glt: \"#e4f6ef\", alt: \"#fdf3e0\", rlt: \"#fde8e8\",\n plt: \"#f0eafa\", tlt: \"#e3f4f7\",\n};\n\nconst monoSx = { fontFamily: \"'JetBrains Mono', monospace\", fontSize: 11, fontWeight: 600 };\nconst QUEUE_COLORS = [C.blue, C.green, C.purple, C.amber, C.teal, C.red, C.navy];\n\nfunction StatCard({ value, label, color }: { value: string | number; label: string; color: string }) {\n return (\n <Box sx={{\n px: 1.5, py: 1.2,\n borderRadius: \"10px\",\n backgroundColor: \"#fafafa\",\n border: \"1px solid #e0e0e0\",\n borderLeftWidth: \"3px\",\n borderLeftStyle: \"solid\",\n borderLeftColor: color,\n }}>\n <Typography sx={{ fontFamily: \"poppins, Arial, sans-serif\", fontSize: \"0.72rem\", fontWeight: 600, color: \"#888\", mb: 0.3 }}>\n {label}\n </Typography>\n <Typography sx={{ fontFamily: \"poppins, Arial, sans-serif\", fontSize: \"0.95rem\", fontWeight: 700, color: \"#1a1a1a\" }}>\n {value}\n </Typography>\n </Box>\n );\n}\n\nfunction StatusChip({ status }: { status: string }) {\n const s = status?.toLowerCase();\n const isAns = s === \"answered\";\n const isAband = s === \"abandoned\";\n return (\n <Chip label={status || \"—\"} size=\"small\" sx={{\n fontSize: 11, fontWeight: 700, height: 22,\n background: isAns ? C.glt : isAband ? C.alt : C.rlt,\n color: isAns ? C.green : isAband ? C.amber : C.red,\n border: `1px solid ${isAns ? \"rgba(10,154,98,.2)\" : isAband ? \"rgba(196,124,0,.2)\" : \"rgba(204,42,42,.2)\"}`,\n fontFamily: \"'JetBrains Mono', monospace\",\n }} />\n );\n}\n\nfunction CallTypeChip({ type }: { type: string }) {\n const isIn = type?.toLowerCase() === \"inbound\";\n return (\n <Chip label={type || \"—\"} size=\"small\" sx={{\n fontSize: 11, fontWeight: 700, height: 22,\n background: isIn ? C.glt : C.blt,\n color: isIn ? C.green : C.blue,\n border: `1px solid ${isIn ? \"rgba(10,154,98,.2)\" : \"rgba(21,101,200,.2)\"}`,\n fontFamily: \"'JetBrains Mono', monospace\",\n }} />\n );\n}\n\nfunction RecordingCell({ callUuid, recordingPath }: { callUuid: string; recordingPath: string | null }) {\n const [audioUrl, setAudioUrl] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n\n if (!recordingPath) {\n return (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.3 }}>\n <Tooltip title=\"No recording available\">\n <span>\n <IconButton size=\"small\" disabled sx={{ p: 0.4 }}>\n <PlayArrowIcon sx={{ fontSize: 16 }} />\n </IconButton>\n </span>\n </Tooltip>\n <Tooltip title=\"No recording available\">\n <span>\n <IconButton size=\"small\" disabled sx={{ p: 0.4 }}>\n <FileDownloadIcon sx={{ fontSize: 16 }} />\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n );\n }\n\n const handlePlay = async () => {\n if (audioUrl) return;\n try {\n setLoading(true);\n setError(false);\n const blob = await getRecordingByCall(callUuid);\n const url = URL.createObjectURL(blob);\n setAudioUrl(url);\n } catch {\n setError(true);\n } finally {\n setLoading(false);\n }\n };\n\n const handleDownload = async () => {\n try {\n const blob = audioUrl\n ? await fetch(audioUrl).then((r) => r.blob())\n : await getRecordingByCall(callUuid);\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `recording_${callUuid}.wav`;\n a.click();\n URL.revokeObjectURL(url);\n } catch {\n /* ignore */\n }\n };\n\n if (audioUrl) {\n return (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\n <audio\n controls\n autoPlay\n src={audioUrl}\n onEnded={() => { if (audioUrl.startsWith(\"blob:\")) URL.revokeObjectURL(audioUrl); setAudioUrl(null); }}\n style={{ width: 140, height: 30 }}\n />\n <Tooltip title=\"Download\">\n <IconButton size=\"small\" onClick={handleDownload} sx={{ color: C.blue, p: 0.4 }}>\n <FileDownloadIcon sx={{ fontSize: 16 }} />\n </IconButton>\n </Tooltip>\n </Box>\n );\n }\n\n return (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.3 }}>\n <Tooltip title={error ? \"Recording unavailable\" : \"Play\"}>\n <span>\n <IconButton size=\"small\" onClick={handlePlay} disabled={loading || error} sx={{ color: C.green, p: 0.4 }}>\n {loading ? <CircularProgress size={14} /> : <PlayArrowIcon sx={{ fontSize: 16 }} />}\n </IconButton>\n </span>\n </Tooltip>\n <Tooltip title={error ? \"Recording unavailable\" : \"Download\"}>\n <span>\n <IconButton size=\"small\" onClick={handleDownload} disabled={loading || error} sx={{ color: C.blue, p: 0.4 }}>\n <FileDownloadIcon sx={{ fontSize: 16 }} />\n </IconButton>\n </span>\n </Tooltip>\n {error && <Chip label=\"No File\" size=\"small\" sx={{ fontSize: \"0.6rem\", height: 18 }} />}\n </Box>\n );\n}\n\nconst cdrHeadSx = {\n bgcolor: \"#f1f1f1\", color: \"#333\", fontWeight: 600,\n whiteSpace: \"nowrap\" as const, fontSize: \"14px\",\n py: 0.7, px: 1,\n};\n\nexport interface AgentDetailReportProps {\n agentRow?: ReportData | null;\n onBack?: () => void;\n from?: \"REPORTS_LIST\" | string;\n initialStartDate?: Dayjs | null;\n initialEndDate?: Dayjs | null;\n initialQuickRange?: string;\n}\n\nfunction AgentDetailReportContent({ agentRow: propAgentRow, onBack, from, initialStartDate, initialEndDate, initialQuickRange }: AgentDetailReportProps = {}) {\n const agentRow: ReportData | null = propAgentRow || null;\n const isFromReportsList = from === \"REPORTS_LIST\";\n const agentIdFromRow = isFromReportsList\n ? agentRow?.agentDetails?.agentId || \"\"\n : sdkStateManager.getState().agentId || agentRow?.agentDetails?.agentId || \"\";\n\n const [quickRange, setQuickRange] = useState<string>(initialQuickRange || \"today\");\n const [startDate, setStartDate] = useState<Dayjs | null>(initialStartDate ?? dayjs());\n const [endDate, setEndDate] = useState<Dayjs | null>(initialEndDate ?? dayjs());\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const syncFilterToUrl = (_sd: Dayjs, _ed: Dayjs, _range: string) => { /* no-op in SDK context */ };\n\n const [activeTab, setActiveTab] = useState(0);\n\n const [detail, setDetail] = useState<AgentDetailReportResponse | null>(null);\n const [detailLoading, setDetailLoading] = useState(!isFromReportsList);\n const [detailError, setDetailError] = useState(\"\");\n\n const [cdrRecords, setCdrRecords] = useState<CdrRecordResponse[]>([]);\n const [cdrTotal, setCdrTotal] = useState(0);\n const [cdrPage, setCdrPage] = useState(0);\n const [cdrPageSize, setCdrPageSize] = useState(10);\n const [cdrLoading, setCdrLoading] = useState(false);\n const [cdrError, setCdrError] = useState(\"\");\n\n const profile: AgentDetailProfile | null = detail?.profile || null;\n const agentName = profile?.fullName || agentRow?.agentDetails?.fullName || \"Unknown Agent\";\n const showInitialSpinner = !isFromReportsList && detailLoading && !profile && !agentRow?.agentDetails?.fullName;\n\n const setQuick = (range: string) => {\n setQuickRange(range);\n const today = dayjs();\n let sd: Dayjs = today;\n const ed: Dayjs = today;\n if (range === \"week\") sd = today.startOf(\"week\");\n else if (range === \"month\") sd = today.startOf(\"month\");\n setStartDate(sd);\n setEndDate(ed);\n syncFilterToUrl(sd, ed, range);\n };\n\n const fetchDetailFn = async (sd: Dayjs, ed: Dayjs) => {\n if (!agentIdFromRow) return;\n try {\n setDetailLoading(true);\n setDetailError(\"\");\n const res = await getAgentDetailReport(agentIdFromRow, {\n start_date: sd.startOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: ed.isSame(dayjs(), \"day\") ? dayjs().format(\"YYYY-MM-DDTHH:mm:ss\") : ed.endOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\n });\n setDetail(res);\n } catch (err: any) {\n setDetailError(err?.message || \"Failed to load agent detail\");\n } finally {\n setDetailLoading(false);\n }\n };\n\n const fetchCdrFn = async (sd: Dayjs, ed: Dayjs, page: number, pageSize: number) => {\n if (!agentIdFromRow) return;\n try {\n setCdrLoading(true);\n setCdrError(\"\");\n const params: CdrReportParams = {\n start_date: sd.startOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: ed.isSame(dayjs(), \"day\") ? dayjs().format(\"YYYY-MM-DDTHH:mm:ss\") : ed.endOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\n search: agentIdFromRow,\n page: page + 1,\n pageSize: pageSize,\n };\n const res: any = await getCdrReport(params);\n setCdrRecords(deepFindArray<CdrRecordResponse>(res, [\"data\", \"records\"]));\n setCdrTotal(res?.records?.total ?? res?.total ?? res?.data?.total ?? 0);\n } catch (err: any) {\n setCdrError(err?.message || \"Failed to load call history\");\n } finally {\n setCdrLoading(false);\n }\n };\n\n /* ── Manual refresh / search (re-fetch with the current date range) ── */\n const handleSearch = (sd?: Dayjs | null, ed?: Dayjs | null) => {\n const fromDate = sd ?? startDate;\n const toDate = ed ?? endDate;\n if (!fromDate || !toDate) return;\n fetchDetailFn(fromDate, toDate);\n setCdrPage(0);\n if (activeTab === 1) fetchCdrFn(fromDate, toDate, 0, cdrPageSize);\n };\n\n // Auto-fetch the detail report whenever the agent or date range changes.\n useEffect(() => {\n if (agentIdFromRow && startDate && endDate) fetchDetailFn(startDate, endDate);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [agentIdFromRow, startDate, endDate]);\n\n // Fetch CDR records on tab switch, pagination, or date-range change.\n useEffect(() => {\n if (activeTab === 1 && startDate && endDate) {\n fetchCdrFn(startDate, endDate, cdrPage, cdrPageSize);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, cdrPage, cdrPageSize, startDate, endDate]);\n\n const hourlyCallData = useMemo(() => {\n return (detail?.hourlyCalls || []).map((h) => ({\n hour: String(h.hourOfDay).padStart(2, \"0\"),\n answered: h.answeredCalls,\n abandoned: h.missedCalls,\n }));\n }, [detail]);\n\n const timeUtilData = useMemo(() => {\n const tu = detail?.timeUtilisation;\n if (!tu) return [];\n const total = tu.totalLoginSeconds || 1;\n return [\n { name: \"On Call / Handle\", value: tu.onCallSeconds, pct: (tu.onCallSeconds / total) * 100, formatted: tu.onCallFormatted, color: C.blue },\n { name: \"Idle\", value: tu.idleSeconds, pct: (tu.idleSeconds / total) * 100, formatted: tu.idleFormatted, color: \"#e8a0a0\" },\n { name: \"Break\", value: tu.breakSeconds, pct: (tu.breakSeconds / total) * 100, formatted: tu.breakFormatted, color: C.amber },\n ];\n }, [detail]);\n\n const talkDurationBuckets = useMemo(() => {\n const items = [...(detail?.talkDistribution || [])].sort((a, b) => a.bucketOrder - b.bucketOrder);\n const total = items.reduce((s, b) => s + (b.callCount || 0), 0);\n return items.map((b) => ({\n bucket: b.bucketLabel,\n count: b.callCount,\n minSeconds: b.minSeconds,\n maxSeconds: b.maxSeconds,\n pct: total > 0 ? (b.callCount / total) * 100 : 0,\n }));\n }, [detail]);\n\n const talkDurationTotal = useMemo(\n () => talkDurationBuckets.reduce((s, b) => s + (b.count || 0), 0),\n [talkDurationBuckets],\n );\n\n const queuePieData = useMemo(() => {\n return (detail?.callsByQueue || []).map((q, i) => ({\n name: q.queueName,\n value: q.callCount,\n pctOfTotal: q.pctOfTotal,\n color: QUEUE_COLORS[i % QUEUE_COLORS.length],\n }));\n }, [detail]);\n\n const queueMetrics = useMemo(() => {\n const items = detail?.queueMetrics || [];\n const grandTotal = items.reduce((sum, q) => sum + q.totalCalls, 0);\n return items.map((q, i) => ({\n ...q,\n pctOfTotal: grandTotal > 0 ? (q.totalCalls / grandTotal) * 100 : 0,\n answerRate: q.totalCalls > 0 ? (q.answeredCalls / q.totalCalls) * 100 : 0,\n color: QUEUE_COLORS[i % QUEUE_COLORS.length],\n }));\n }, [detail]);\n\n const hourlyChartTitle = useMemo(() => {\n if (quickRange === \"today\") return \"Hourly Call Volume — Today\";\n if (quickRange === \"month\") return `Hourly Call Volume — ${dayjs().format(\"MMMM YYYY\")}`;\n if (quickRange === \"week\") return \"Hourly Call Volume — This Week\";\n if (startDate && endDate) {\n if (startDate.isSame(endDate, \"day\")) return `Hourly Call Volume — ${startDate.format(\"DD MMM YYYY\")}`;\n return `Hourly Call Volume — ${startDate.format(\"DD MMM YYYY\")} to ${endDate.format(\"DD MMM YYYY\")}`;\n }\n return \"Hourly Call Volume\";\n }, [quickRange, startDate, endDate]);\n\n const handleBack = useCallback(() => {\n onBack?.();\n }, [onBack]);\n\n if (!agentIdFromRow) {\n return (\n <Box sx={{ p: 4, textAlign: \"center\" }}>\n <Typography sx={{ color: C.t3, mb: 2 }}>No agent selected.</Typography>\n {isFromReportsList && (\n <AppButton onClick={handleBack}>\n Go Back\n </AppButton>\n )}\n </Box>\n );\n }\n\n if (showInitialSpinner) {\n return (\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", minHeight: 400 }}>\n <CircularProgress size={36} />\n </Box>\n );\n }\n\n const tabs = [\"Overview\", \"Call History\", \"Break Details\"];\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box sx={{ background: C.bg, minHeight: \"100vh\" }}>\n <PageHeader\n title={agentName}\n showBack={isFromReportsList}\n onBack={handleBack}\n />\n\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, flexWrap: \"wrap\", pb: 1.5, px: 2 }}>\n <DateRangePicker\n showTime={false}\n startDate={startDate}\n endDate={endDate}\n onStartChange={(d) => { setStartDate(d); setQuickRange(\"custom\"); if (d && endDate) syncFilterToUrl(d, endDate, \"custom\"); }}\n onEndChange={(d) => { setEndDate(d); setQuickRange(\"custom\"); if (startDate && d) syncFilterToUrl(startDate, d, \"custom\"); }}\n />\n <AppButton variant={quickRange === \"today\" ? \"primary\" : \"outlined\"} onClick={() => setQuick(\"today\")} sx={{ whiteSpace: \"nowrap\" }}>Today</AppButton>\n <AppButton variant={quickRange === \"week\" ? \"primary\" : \"outlined\"} onClick={() => setQuick(\"week\")} sx={{ whiteSpace: \"nowrap\" }}>This Week</AppButton>\n <AppButton variant={quickRange === \"month\" ? \"primary\" : \"outlined\"} onClick={() => setQuick(\"month\")} sx={{ whiteSpace: \"nowrap\" }}>This Month</AppButton>\n </Box>\n\n <Box sx={{ py: 2, px: 2, position: \"relative\" }}>\n {detailLoading && (\n <Box sx={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, background: \"rgba(240,244,248,0.7)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", zIndex: 10 }}>\n <CircularProgress />\n </Box>\n )}\n\n {detailError && <Alert severity=\"error\" sx={{ mb: 2 }} onClose={() => setDetailError(\"\")}>{detailError}</Alert>}\n\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr 1fr\", sm: \"repeat(3, 1fr)\", md: \"repeat(5, 1fr)\" }, gap: 1.5, mb: 2 }}>\n {[\n { v: profile?.totalCalls ?? 0, l: \"Total Calls\", c: C.navy },\n { v: profile?.answeredCalls ?? 0, l: \"Answered\", c: C.green },\n { v: profile?.missedCalls ?? 0, l: \"Missed\", c: C.red },\n { v: profile?.avgAhtFormatted || \"00:00:00\", l: \"Avg AHT\", c: C.purple },\n { v: `${(profile?.answerRate ?? 0).toFixed(1)}%`, l: \"Answer Rate\", c: C.green },\n { v: profile?.loginDurationFormatted || \"00:00:00\", l: \"Login Duration\", c: C.blue },\n { v: profile?.productionFormatted || \"00:00:00\", l: \"Production\", c: C.blue },\n { v: profile?.handleTimeFormatted || \"00:00:00\", l: \"Handle Time\", c: C.purple },\n { v: profile?.breakTimeFormatted || \"00:00:00\", l: \"Break Time\", c: C.amber },\n { v: `${(profile?.adherencePct ?? 0).toFixed(1)}%`, l: `Adherence${profile?.adherenceGrade ? ` (${profile.adherenceGrade})` : \"\"}`, c: C.teal },\n ].map((kpi, i) => (\n <Box key={i} sx={{\n px: 1.5, py: 1.2,\n borderRadius: \"10px\",\n backgroundColor: \"#fafafa\",\n borderLeft: `3px solid ${kpi.c}`,\n border: \"1px solid #e0e0e0\",\n borderLeftWidth: \"3px\",\n borderLeftStyle: \"solid\",\n borderLeftColor: kpi.c,\n }}>\n <Typography sx={{\n fontFamily: \"poppins, Arial, sans-serif\",\n fontSize: \"0.72rem\", fontWeight: 600, color: \"#888\", mb: 0.3,\n }}>\n {kpi.l}\n </Typography>\n <Typography sx={{\n fontFamily: \"poppins, Arial, sans-serif\",\n fontSize: \"0.95rem\", fontWeight: 700, color: \"#1a1a1a\",\n }}>\n {kpi.v}\n </Typography>\n </Box>\n ))}\n </Box>\n\n <Box sx={{ display: \"flex\", alignItems: { xs: \"flex-start\", sm: \"center\" }, justifyContent: \"space-between\", flexDirection: { xs: \"column\", sm: \"row\" }, gap: 1, borderBottom: `2px solid ${C.b1}`, mb: 2 }}>\n <Box sx={{ display: \"flex\", gap: 0.5, flexWrap: \"wrap\" }}>\n {tabs.map((tab, idx) => (\n <Box key={tab} onClick={() => setActiveTab(idx)}\n sx={{\n px: 2, py: 1, fontSize: 13, fontWeight: 600, cursor: \"pointer\",\n color: activeTab === idx ? C.blue : C.t3,\n borderBottom: `2px solid ${activeTab === idx ? C.blue : \"transparent\"}`,\n mb: \"-2px\", transition: \"all .15s\", \"&:hover\": { color: C.t1 },\n }}>\n {tab}\n </Box>\n ))}\n </Box>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5, mb: \"-2px\" }}>\n <AppButton\n size=\"small\"\n startIcon={<RefreshIcon />}\n disabled={detailLoading || cdrLoading}\n onClick={() => handleSearch()}\n >\n Refresh\n </AppButton>\n <AppButton size=\"small\" startIcon={<SearchIcon />} onClick={() => handleSearch()}>\n Search\n </AppButton>\n </Box>\n </Box>\n\n {activeTab === 0 && (\n <Box>\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr\", md: \"1fr 1fr\" }, gap: 2, mb: 2 }}>\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\" }}>\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}`, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>{hourlyChartTitle}</Typography>\n <Chip label={agentName} size=\"small\" sx={{ fontSize: 11, fontWeight: 700, background: C.blt, color: C.blue, border: `1px solid rgba(21,101,200,.2)` }} />\n </Box>\n <Box sx={{ p: 2, height: 260 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={hourlyCallData} barGap={1}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={C.b1} />\n <XAxis dataKey=\"hour\" tick={{ fontSize: 11, fill: C.t3 }} />\n <YAxis tick={{ fontSize: 11, fill: C.t3 }} allowDecimals={false} />\n <RTooltip labelFormatter={(label) => `${String(label).padStart(2, \"0\")}:00`} contentStyle={{ fontSize: 12, borderRadius: 8, border: `1px solid ${C.b2}` }} />\n <Legend wrapperStyle={{ fontSize: 11 }} />\n <Bar dataKey=\"answered\" name=\"Answered\" fill={C.blue} radius={[3, 3, 0, 0]} />\n <Bar dataKey=\"abandoned\" name=\"Abandoned\" fill={C.red} radius={[3, 3, 0, 0]} />\n </BarChart>\n </ResponsiveContainer>\n </Box>\n </Box>\n\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\" }}>\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}` }}>\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Time Utilisation Breakdown</Typography>\n </Box>\n <Box sx={{ p: 2, height: 260 }}>\n {timeUtilData.length > 0 ? (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie data={timeUtilData} cx=\"50%\" cy=\"50%\" innerRadius={60} outerRadius={95} dataKey=\"value\" nameKey=\"name\" minAngle={8}>\n {timeUtilData.map((entry, idx) => <Cell key={idx} fill={entry.color} />)}\n </Pie>\n <RTooltip formatter={(_val, name, entry) => [`${(entry as any).payload.formatted} (${(entry as any).payload.pct.toFixed(1)}%)`, name]} contentStyle={{ fontSize: 12, borderRadius: 8, border: `1px solid ${C.b2}` }} />\n <Legend wrapperStyle={{ fontSize: 12 }} formatter={(value: string) => <span style={{ color: C.t1, fontWeight: 500 }}>{value}</span>} />\n </PieChart>\n </ResponsiveContainer>\n ) : (\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", color: C.t3, fontSize: 13 }}>No data</Box>\n )}\n </Box>\n </Box>\n </Box>\n\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\", mb: 2 }}>\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}`, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Talk Duration Distribution</Typography>\n <Chip label={`${talkDurationTotal} call${talkDurationTotal === 1 ? \"\" : \"s\"}`} size=\"small\" sx={{ fontSize: 11, fontWeight: 700, background: C.glt, color: C.green, border: `1px solid rgba(10,154,98,.2)` }} />\n </Box>\n <Box sx={{ p: 2, height: 260 }}>\n {talkDurationBuckets.length > 0 ? (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={talkDurationBuckets} margin={{ top: 16, right: 16, left: 0, bottom: 20 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={C.b1} />\n <XAxis dataKey=\"bucket\" tick={{ fontSize: 11, fill: C.t3 }} label={{ value: \"Talking Duration\", position: \"insideBottom\", offset: -5, style: { fontSize: 11, fontWeight: 600, fill: C.t2 } }} />\n <YAxis tick={{ fontSize: 11, fill: C.t3 }} allowDecimals={false} label={{ value: \"Call Count\", angle: -90, position: \"insideLeft\", offset: 10, style: { fontSize: 11, fontWeight: 600, fill: C.t2 } }} />\n <RTooltip\n contentStyle={{ fontSize: 12, borderRadius: 8, border: `1px solid ${C.b2}` }}\n labelFormatter={(label, payload) => {\n const p = payload?.[0]?.payload as { minSeconds?: number; maxSeconds?: number } | undefined;\n if (!p) return String(label);\n return `${label} (${p.minSeconds}–${p.maxSeconds}s)`;\n }}\n formatter={(val, _name, entry) => {\n const pct = (entry as any)?.payload?.pct;\n return [`${val} call${val === 1 ? \"\" : \"s\"}${pct != null ? ` (${pct.toFixed(1)}%)` : \"\"}`, \"Calls\"];\n }}\n />\n <Bar dataKey=\"count\" name=\"Calls\" fill={C.teal} radius={[4, 4, 0, 0]}>\n <LabelList dataKey=\"count\" position=\"top\" style={{ fontSize: 11, fontWeight: 700, fill: C.t1 }} />\n </Bar>\n </BarChart>\n </ResponsiveContainer>\n ) : (\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", color: C.t3, fontSize: 13 }}>No data</Box>\n )}\n </Box>\n </Box>\n\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr\", md: \"1fr 1fr\" }, gap: 2 }}>\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\" }}>\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}` }}>\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Calls by Queue</Typography>\n </Box>\n <Box sx={{ p: 2, height: 260 }}>\n {queuePieData.length > 0 ? (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie data={queuePieData} cx=\"50%\" cy=\"50%\" outerRadius={90} dataKey=\"value\" nameKey=\"name\">\n {queuePieData.map((entry, idx) => <Cell key={idx} fill={entry.color} />)}\n </Pie>\n <RTooltip\n contentStyle={{ fontSize: 12, borderRadius: 8, border: `1px solid ${C.b2}` }}\n formatter={(val, name, entry) => {\n const pct = (entry as any)?.payload?.pctOfTotal;\n return [`${val} calls${pct != null ? ` (${pct.toFixed(1)}%)` : \"\"}`, name];\n }}\n />\n <Legend wrapperStyle={{ fontSize: 12 }} formatter={(value: string) => <span style={{ color: C.t1, fontWeight: 500 }}>{value}</span>} />\n </PieChart>\n </ResponsiveContainer>\n ) : (\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", color: C.t3, fontSize: 13 }}>No queue data</Box>\n )}\n </Box>\n </Box>\n\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\" }}>\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}` }}>\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Queue Performance Metrics</Typography>\n </Box>\n <Box sx={{ p: 2 }}>\n {queueMetrics.length > 0 ? queueMetrics.map((q) => (\n <Box key={q.queueName} sx={{ mb: 2, \"&:last-child\": { mb: 0 } }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", mb: 0.3 }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Box sx={{ width: 10, height: 10, borderRadius: \"50%\", background: q.color, flexShrink: 0 }} />\n <Typography sx={{ fontSize: 13, fontWeight: 700, color: C.t1 }}>{q.queueName}</Typography>\n </Box>\n <Typography sx={{ ...monoSx, fontSize: 13, fontWeight: 800, color: q.color }}>\n {q.totalCalls} calls\n <Typography component=\"span\" sx={{ ...monoSx, color: C.t3, ml: 0.5 }}>\n ({q.answeredCalls} ans / {q.missedCalls} miss)\n </Typography>\n </Typography>\n </Box>\n <Box sx={{ height: 6, background: C.s3, borderRadius: 3, overflow: \"hidden\", mb: 0.3 }}>\n <Box sx={{ height: \"100%\", width: `${q.pctOfTotal ?? 0}%`, background: q.color, borderRadius: 3 }} />\n </Box>\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", columnGap: 1.5, rowGap: 0.2 }}>\n <Typography sx={{ fontSize: 11, color: C.t3 }}>{(q.pctOfTotal ?? 0).toFixed(0)}% of total</Typography>\n <Typography sx={{ fontSize: 11, color: C.t3 }}>Ans: {(q.answerRate ?? 0).toFixed(0)}%</Typography>\n <Typography sx={{ fontSize: 11, color: C.t3 }}>Talk: <span style={{ ...monoSx, color: C.t2 }}>{q.avgTalkFormatted}</span></Typography>\n <Typography sx={{ fontSize: 11, color: C.t3 }}>Hold: <span style={{ ...monoSx, color: C.t2 }}>{q.avgHoldFormatted}</span></Typography>\n <Typography sx={{ fontSize: 11, color: C.t3 }}>Wrap: <span style={{ ...monoSx, color: C.t2 }}>{q.avgWrapupFormatted}</span></Typography>\n <Typography sx={{ fontSize: 11, color: C.t3 }}>AHT: <span style={{ ...monoSx, color: C.t2 }}>{q.avgAhtFormatted}</span></Typography>\n </Box>\n </Box>\n )) : (\n <Box sx={{ textAlign: \"center\", py: 4, color: C.t3, fontSize: 13 }}>No queue data</Box>\n )}\n </Box>\n </Box>\n </Box>\n </Box>\n )}\n\n {activeTab === 1 && (\n <Box sx={{ borderRadius: \"8px\", border: \"1px solid #e0e7ef\", overflow: \"hidden\", background: \"transparent\" }}>\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}`, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Call History</Typography>\n <Chip label={`${cdrTotal} records`} size=\"small\" sx={{ fontSize: 11, fontWeight: 700, background: C.s2, color: C.t3, border: `1px solid ${C.b2}` }} />\n </Box>\n </Box>\n {cdrError && <Alert severity=\"error\" sx={{ mx: 2, mt: 1 }} onClose={() => setCdrError(\"\")}>{cdrError}</Alert>}\n <TableContainer sx={{ position: \"relative\" }}>\n {cdrLoading && (\n <Box sx={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, background: \"rgba(255,255,255,0.7)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", zIndex: 5 }}>\n <CircularProgress size={28} />\n </Box>\n )}\n <Table size=\"small\" sx={{\n minWidth: 1400,\n \"& .MuiTableCell-root\": { fontSize: \"0.75rem\", borderBottom: \"1px solid #eef1f6\", py: 0.6, px: 1 },\n }}>\n <TableHead>\n <TableRow>\n {[\n \"Phone Number\", \"Call Start\", \"Call Type\", \"Status\", \"Queue\", \"Extension\",\n \"Talk Duration\", \"Hold Duration\", \"Ringing Duration\", \"Wrapup Duration\",\n \"Disposition\", \"Transferred\", \"Recording\",\n ].map((label) => (\n <TableCell key={label} sx={cdrHeadSx}>{label}</TableCell>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {cdrRecords.map((row, idx) => (\n <TableRow key={row.callUuid || idx} hover sx={{\n backgroundColor: \"#fff\",\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\n }}>\n <TableCell sx={{ fontWeight: 600, color: C.navy, fontSize: \"0.75rem\" }}>{row.phoneNumber || \"\"}</TableCell>\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\n {row.callStartTime ? dayjs(row.callStartTime).format(\"DD MMM YYYY hh:mm A\") : \"\"}\n </TableCell>\n <TableCell><CallTypeChip type={row.callType || \"\"} /></TableCell>\n <TableCell><StatusChip status={row.callStatus || \"\"} /></TableCell>\n <TableCell>\n {row.queueName\n ? <Chip label={row.queueName} size=\"small\" sx={{ backgroundColor: \"#f0ebfa\", color: C.purple, fontWeight: 500, fontSize: \"0.67rem\", height: 22 }} />\n : \"\"}\n </TableCell>\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>{row.extension || \"\"}</TableCell>\n <TableCell sx={{ fontWeight: 600, color: C.blue, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>{row.talkDurationFmt || \"\"}</TableCell>\n <TableCell sx={{ fontWeight: 500, color: C.amber, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>{row.holdDurationFmt || \"\"}</TableCell>\n <TableCell sx={{ fontWeight: 500, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>{row.ringingDurationFmt || \"\"}</TableCell>\n <TableCell sx={{ fontWeight: 500, color: C.purple, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>{row.wrapupDurationFmt || \"\"}</TableCell>\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>{row.disposition || \"\"}</TableCell>\n <TableCell>\n {row.wasTransferred\n ? <Chip label=\"Yes\" size=\"small\" sx={{ backgroundColor: \"#e6f7ef\", color: C.green, fontWeight: 600, fontSize: \"0.65rem\", height: 20, borderRadius: \"6px\" }} />\n : <Chip label=\"No\" size=\"small\" sx={{ backgroundColor: \"transparent\", color: \"#6b7b8d\", fontWeight: 600, fontSize: \"0.65rem\", height: 20, borderRadius: \"6px\" }} />}\n </TableCell>\n <TableCell>\n {row.callUuid ? <RecordingCell callUuid={row.callUuid} recordingPath={row.recordingPath ?? null} /> : \"\"}\n </TableCell>\n </TableRow>\n ))}\n {!cdrLoading && cdrRecords.length === 0 && (\n <TableRow><TableCell colSpan={13} sx={{ textAlign: \"center\", py: 4, color: C.t3, fontSize: 13 }}>No call records found</TableCell></TableRow>\n )}\n </TableBody>\n </Table>\n </TableContainer>\n <TablePagination\n component=\"div\" count={cdrTotal} page={cdrPage}\n onPageChange={(_, p) => setCdrPage(p)} rowsPerPage={cdrPageSize}\n onRowsPerPageChange={(e) => { setCdrPageSize(parseInt(e.target.value, 10)); setCdrPage(0); }}\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\n sx={{ borderTop: \"1px solid #eef1f6\", \"& .MuiTablePagination-displayedRows\": { fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontSize: \"0.73rem\" } }}\n />\n </Box>\n )}\n\n {activeTab === 2 && (\n <Box>\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr 1fr\", md: \"repeat(3, 1fr)\", lg: \"repeat(4, 1fr)\" }, gap: { xs: 1.5, lg: 2 }, mb: 2 }}>\n <StatCard value={profile?.breakTimeFormatted || \"00:00:00\"} label=\"Total Break Time\" color={C.amber} />\n <StatCard value={profile?.breaksTaken ?? 0} label=\"Breaks Taken\" color={C.purple} />\n <StatCard value={profile?.productionFormatted || \"00:00:00\"} label=\"Production Time\" color={C.green} />\n <StatCard value={profile?.loginDurationFormatted || \"00:00:00\"} label=\"Login Duration\" color={C.teal} />\n </Box>\n\n <Box>\n <Typography sx={{ fontSize: \"0.72rem\", fontWeight: 700, color: \"#888\", textTransform: \"uppercase\", letterSpacing: 0.8, mb: 1, fontFamily: \"poppins, Arial, sans-serif\" }}>\n Attendance Summary\n </Typography>\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr 1fr\", md: \"repeat(4, 1fr)\" }, gap: 1.5 }}>\n {[\n { label: \"First Login\", value: profile?.firstLoginTime ? dayjs(profile.firstLoginTime).format(\"YYYY-MM-DD HH:mm:ss\") : \"—\", color: C.blue },\n { label: \"Adherence Score\", value: `${profile?.adherencePct ?? 0}%`, color: C.green },\n { label: \"Adherence Grade\", value: profile?.adherenceGrade || \"—\", color: C.purple },\n { label: \"Answer Rate\", value: `${(profile?.answerRate ?? 0).toFixed(1)}%`, color: C.teal },\n ].map((item) => (\n <Box key={item.label} sx={{\n px: 1.5, py: 1.2, borderRadius: \"10px\",\n backgroundColor: \"#fafafa\", border: \"1px solid #e0e0e0\",\n borderLeftWidth: \"3px\", borderLeftStyle: \"solid\", borderLeftColor: item.color,\n }}>\n <Typography sx={{ fontFamily: \"poppins, Arial, sans-serif\", fontSize: \"0.72rem\", fontWeight: 600, color: \"#888\", mb: 0.3 }}>{item.label}</Typography>\n <Typography sx={{ fontFamily: \"poppins, Arial, sans-serif\", fontSize: \"0.95rem\", fontWeight: 700, color: \"#1a1a1a\" }}>{item.value}</Typography>\n </Box>\n ))}\n </Box>\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n </LocalizationProvider>\n );\n}\n\nconst AgentDetailReport: React.FC<AgentDetailReportProps> = (props) => (\n <SDKProvider>\n <AgentDetailReportContent {...props} />\n </SDKProvider>\n);\n\nexport default AgentDetailReport;\n","import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type {\r\n\tAgentDetailReportParams,\r\n\tAgentDetailReportResponse,\r\n\tCdrReportParams,\r\n\tCdrReportResponse,\r\n} from \"./types\";\r\n\r\nfunction buildCdrQs(params: CdrReportParams): string {\r\n\tconst qs = new URLSearchParams();\r\n\tif (params.start_date) qs.append(\"start_date\", params.start_date);\r\n\tif (params.end_date) qs.append(\"end_date\", params.end_date);\r\n\tif (params.agent_id) for (const id of params.agent_id) qs.append(\"agent_id\", String(id));\r\n\tif (params.queue_id) for (const id of params.queue_id) qs.append(\"queue_id\", String(id));\r\n\tif (params.call_type) qs.append(\"call_type\", params.call_type);\r\n\tif (params.status) qs.append(\"status\", params.status);\r\n\tif (params.search) qs.append(\"search\", params.search);\r\n\tif (params.page) qs.append(\"page\", String(params.page));\r\n\tif (params.pageSize) qs.append(\"pageSize\", String(params.pageSize));\r\n\tconst str = qs.toString();\r\n\treturn str ? `?${str}` : \"\";\r\n}\r\n\r\nexport function useAgentDetailReport() {\r\n\tconst [detail, setDetail] = useState<AgentDetailReportResponse | null>(null);\r\n\tconst [detailLoading, setDetailLoading] = useState(false);\r\n\tconst [detailError, setDetailError] = useState(\"\");\r\n\r\n\tconst fetchDetail = useCallback(\r\n\t\tasync (agentId: string, params: AgentDetailReportParams) => {\r\n\t\t\tif (!agentId) return;\r\n\t\t\tsetDetailLoading(true);\r\n\t\t\tsetDetailError(\"\");\r\n\t\t\ttry {\r\n\t\t\t\tconst qs = new URLSearchParams();\r\n\t\t\t\tif (params.start_date) qs.append(\"start_date\", params.start_date);\r\n\t\t\t\tif (params.end_date) qs.append(\"end_date\", params.end_date);\r\n\t\t\t\tconst qsStr = qs.toString();\r\n\t\t\t\tconst url = `${END_POINT.AGENT_DETAIL_REPORT(agentId)}${qsStr ? `?${qsStr}` : \"\"}`;\r\n\t\t\t\tconst res = await axiosInstance.get<AgentDetailReportResponse>(url);\r\n\t\t\t\tsetDetail(res.data);\r\n\t\t\t} catch (err: any) {\r\n\t\t\t\tsetDetailError(err?.response?.data?.message || err?.message || \"Failed to load agent detail\");\r\n\t\t\t\tsetDetail(null);\r\n\t\t\t} finally {\r\n\t\t\t\tsetDetailLoading(false);\r\n\t\t\t}\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\r\n\treturn { detail, detailLoading, detailError, setDetailError, fetchDetail };\r\n}\r\n\r\nexport function useAgentCdrRecords() {\r\n\tconst [records, setRecords] = useState<CdrReportResponse[\"records\"][\"data\"]>([]);\r\n\tconst [total, setTotal] = useState(0);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchCdr = useCallback(async (params: CdrReportParams) => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<CdrReportResponse>(\r\n\t\t\t\t`${END_POINT.CDR_REPORT}${buildCdrQs(params)}`,\r\n\t\t\t);\r\n\t\t\tsetRecords(res.data?.records?.data || []);\r\n\t\t\tsetTotal(res.data?.records?.total || 0);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(err?.response?.data?.message || err?.message || \"Failed to load call history\");\r\n\t\t\tsetRecords([]);\r\n\t\t\tsetTotal(0);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\treturn { records, total, loading, error, setError, fetchCdr };\r\n}\r\n\r\nexport async function fetchRecordingBlob(callUuid: string): Promise<Blob> {\r\n\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), {\r\n\t\tresponseType: \"blob\",\r\n\t});\r\n\treturn res.data as Blob;\r\n}\r\n\r\nexport async function getAgentDetailReport(\r\n\tagentId: string,\r\n\tparams?: AgentDetailReportParams,\r\n): Promise<AgentDetailReportResponse> {\r\n\tconst qs = new URLSearchParams();\r\n\tif (params?.start_date) qs.append(\"start_date\", params.start_date);\r\n\tif (params?.end_date) qs.append(\"end_date\", params.end_date);\r\n\tconst qsStr = qs.toString();\r\n\tconst res = await axiosInstance.get<AgentDetailReportResponse>(\r\n\t\t`${END_POINT.AGENT_DETAIL_REPORT(agentId)}${qsStr ? `?${qsStr}` : \"\"}`,\r\n\t);\r\n\treturn res.data;\r\n}\r\n\r\nexport async function getCdrReport(params: CdrReportParams): Promise<CdrReportResponse> {\r\n\tconst qs = buildCdrQs(params);\r\n\tconst res = await axiosInstance.get<CdrReportResponse>(`${END_POINT.CDR_REPORT}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\nexport async function getRecordingByCall(callUuid: string): Promise<Blob> {\r\n\treturn fetchRecordingBlob(callUuid);\r\n}\r\n"],"mappings":"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","names":["useState","useCallback","useState","_a","_b","_c","_d","_e","useCallback"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/hooks/useSDKPermissions.ts","../call-control-sdk/lib/components/SDKAccessDenied.tsx","../call-control-sdk/lib/components/SDKPermissionGuard.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport type { SDKEntitlements } from \"../permissions/types\";\r\n\r\nexport interface SDKPermissionsHook {\r\n permissions: string[];\r\n menuEntitlements: Array<{ code: string; name: string; enabled: boolean }>;\r\n isLoaded: boolean;\r\n hasPermission: (permission: string) => boolean;\r\n hasAnyPermission: (permissions: string[]) => boolean;\r\n hasAllPermissions: (permissions: string[]) => boolean;\r\n hasMenuFeature: (code: string) => boolean;\r\n isBitEnabled: (category: keyof SDKEntitlements, bitCode: string) => boolean;\r\n}\r\n\r\nexport function useSDKPermissions(): SDKPermissionsHook {\r\n const [state, setState] = useState(() => sdkStateManager.getState());\r\n\r\n useEffect(() => {\r\n const unsubscribe = sdkStateManager.subscribe(() => {\r\n setState(sdkStateManager.getState());\r\n });\r\n return unsubscribe;\r\n }, []);\r\n\r\n const hasPermission = useCallback(\r\n (permission: string) => sdkStateManager.hasPermission(permission),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.userPermissions],\r\n );\r\n\r\n const hasAnyPermission = useCallback(\r\n (permissions: string[]) => sdkStateManager.hasAnyPermission(permissions),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.userPermissions],\r\n );\r\n\r\n const hasAllPermissions = useCallback(\r\n (permissions: string[]) => sdkStateManager.hasAllPermissions(permissions),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.userPermissions],\r\n );\r\n\r\n const hasMenuFeature = useCallback(\r\n (code: string) => sdkStateManager.hasMenuFeature(code),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.menuEntitlements],\r\n );\r\n\r\n const isBitEnabled = useCallback(\r\n (category: keyof SDKEntitlements, bitCode: string) =>\r\n sdkStateManager.isBitEnabled(category, bitCode),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.sdk],\r\n );\r\n\r\n return {\r\n permissions: state.userPermissions ?? [],\r\n menuEntitlements: state.menuEntitlements ?? [],\r\n isLoaded: state.isPermissionsLoaded,\r\n hasPermission,\r\n hasAnyPermission,\r\n hasAllPermissions,\r\n hasMenuFeature,\r\n isBitEnabled,\r\n };\r\n}\r\n","import React from \"react\";\r\nimport { Box, Paper, Typography, useTheme } from \"@mui/material\";\r\nimport { alpha } from \"@mui/material/styles\";\r\nimport LockOutlinedIcon from \"@mui/icons-material/LockOutlined\";\r\n\r\ninterface SDKAccessDeniedProps {\r\n message?: string;\r\n}\r\n\r\nexport const SDKAccessDenied: React.FC<SDKAccessDeniedProps> = ({\r\n message = \"You don't have the necessary permissions to view this content.\",\r\n}) => {\r\n const theme = useTheme();\r\n\r\n return (\r\n <Box\r\n sx={{\r\n p: 4,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n minHeight: 250,\r\n }}\r\n >\r\n <Paper\r\n elevation={0}\r\n sx={{\r\n p: 4,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n bgcolor: alpha(theme.palette.error.main, 0.05),\r\n borderRadius: 3,\r\n border: \"1px dashed\",\r\n borderColor: alpha(theme.palette.error.main, 0.3),\r\n maxWidth: 420,\r\n textAlign: \"center\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n bgcolor: alpha(theme.palette.error.main, 0.1),\r\n color: \"error.main\",\r\n borderRadius: \"50%\",\r\n p: 2,\r\n display: \"flex\",\r\n mb: 2,\r\n }}\r\n >\r\n <LockOutlinedIcon sx={{ fontSize: 32 }} />\r\n </Box>\r\n <Typography variant=\"h6\" color=\"text.primary\" gutterBottom fontWeight=\"600\" sx={{ mb: 1 }}>\r\n Access Denied\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 0 }}>\r\n {message}\r\n </Typography>\r\n </Paper>\r\n </Box>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { useSDKPermissions } from \"../hooks/useSDKPermissions\";\r\nimport { SDKAccessDenied } from \"./SDKAccessDenied\";\r\n\r\ninterface SDKPermissionGuardProps {\r\n children?: React.ReactNode;\r\n /** Single permission code (e.g. \"calls:inbound\") */\r\n permission?: string;\r\n /** Multiple permission codes — ANY match grants access by default */\r\n permissions?: string[];\r\n /** When true, ALL permissions must be granted */\r\n requireAll?: boolean;\r\n /** One or more menu feature codes — ANY match grants access by default */\r\n menuFeature?: string | string[];\r\n /** When true, ALL menu features must be enabled */\r\n requireAllMenus?: boolean;\r\n /** Custom fallback rendered when access is denied */\r\n fallback?: React.ReactNode;\r\n /** Show the default Access Denied UI when denied. Defaults to true. */\r\n showFallback?: boolean;\r\n /** Callback fired when the guard denies access */\r\n onDenied?: () => void;\r\n}\r\n\r\nexport const SDKPermissionGuard: React.FC<SDKPermissionGuardProps> = ({\r\n children,\r\n permission,\r\n permissions,\r\n requireAll = false,\r\n menuFeature,\r\n requireAllMenus = false,\r\n fallback,\r\n showFallback = true,\r\n onDenied,\r\n}) => {\r\n const { isLoaded, hasPermission, hasAnyPermission, hasAllPermissions, hasMenuFeature } =\r\n useSDKPermissions();\r\n\r\n if (!isLoaded) return null;\r\n\r\n const isAllowed = checkAccess({\r\n permission,\r\n permissions,\r\n requireAll,\r\n menuFeature,\r\n requireAllMenus,\r\n hasPermission,\r\n hasAnyPermission,\r\n hasAllPermissions,\r\n hasMenuFeature,\r\n });\r\n\r\n if (!isAllowed) {\r\n onDenied?.();\r\n if (fallback !== undefined) return <>{fallback}</>;\r\n if (showFallback) return <SDKAccessDenied />;\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n\r\nfunction checkAccess({\r\n permission,\r\n permissions,\r\n requireAll,\r\n menuFeature,\r\n requireAllMenus,\r\n hasPermission,\r\n hasAnyPermission,\r\n hasAllPermissions,\r\n hasMenuFeature,\r\n}: {\r\n permission?: string;\r\n permissions?: string[];\r\n requireAll: boolean;\r\n menuFeature?: string | string[];\r\n requireAllMenus: boolean;\r\n hasPermission: (p: string) => boolean;\r\n hasAnyPermission: (p: string[]) => boolean;\r\n hasAllPermissions: (p: string[]) => boolean;\r\n hasMenuFeature: (c: string) => boolean;\r\n}): boolean {\r\n const menuCodes = menuFeature\r\n ? Array.isArray(menuFeature) ? menuFeature : [menuFeature]\r\n : [];\r\n\r\n const hasNoGuards =\r\n !permission &&\r\n (!permissions || permissions.length === 0) &&\r\n menuCodes.length === 0;\r\n\r\n if (hasNoGuards) return true;\r\n\r\n if (menuCodes.length > 0) {\r\n const menuGranted = requireAllMenus\r\n ? menuCodes.every((c) => hasMenuFeature(c))\r\n : menuCodes.some((c) => hasMenuFeature(c));\r\n if (!menuGranted) return false;\r\n }\r\n\r\n if (permission && !hasPermission(permission)) return false;\r\n\r\n if (permissions && permissions.length > 0) {\r\n const granted = requireAll ? hasAllPermissions(permissions) : hasAnyPermission(permissions);\r\n if (!granted) return false;\r\n }\r\n\r\n return true;\r\n}\r\n"],"mappings":"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","names":["jsx"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/common/components/SearchBar.tsx","../call-control-sdk/lib/pages/common/components/ReportFilterBar.tsx","../call-control-sdk/lib/pages/common/components/AgentMultiSelect.tsx","../call-control-sdk/lib/pages/common/utils/tableStyles.ts"],"sourcesContent":["import React from \"react\";\r\nimport { TextField, InputAdornment, IconButton } from \"@mui/material\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\n\r\ninterface SearchBarProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n iconPosition?: \"start\" | \"end\";\r\n showClear?: boolean;\r\n width?: number | string | Record<string, number | string>;\r\n borderRadius?: number | string;\r\n autoFocus?: boolean;\r\n inputRef?: React.Ref<any>;\r\n sx?: SxProps<Theme>;\r\n}\r\n\r\nexport default function SearchBar({\r\n value,\r\n onChange,\r\n placeholder = \"Search...\",\r\n iconPosition = \"start\",\r\n showClear = true,\r\n width = 250,\r\n borderRadius = \"50px\",\r\n autoFocus = false,\r\n inputRef,\r\n sx,\r\n}: SearchBarProps) {\r\n const searchAdornment = (\r\n <InputAdornment position={iconPosition}>\r\n <SearchIcon sx={{ color: \"#1A5F6C\", fontSize: 18 }} />\r\n </InputAdornment>\r\n );\r\n\r\n const clearButton =\r\n showClear && value ? (\r\n <InputAdornment position=\"end\">\r\n <IconButton size=\"small\" onClick={() => onChange(\"\")} edge=\"end\">\r\n <CloseIcon sx={{ fontSize: 16, color: \"#94a3b8\" }} />\r\n </IconButton>\r\n </InputAdornment>\r\n ) : null;\r\n\r\n const startAdornment = iconPosition === \"start\" ? searchAdornment : undefined;\r\n const endAdornment =\r\n iconPosition === \"end\" ? (\r\n <>\r\n {clearButton}\r\n {searchAdornment}\r\n </>\r\n ) : (\r\n clearButton || undefined\r\n );\r\n\r\n return (\r\n <TextField\r\n size=\"small\"\r\n placeholder={placeholder}\r\n value={value}\r\n autoFocus={autoFocus}\r\n inputRef={inputRef}\r\n onChange={(e) => onChange(e.target.value)}\r\n InputProps={{ startAdornment, endAdornment }}\r\n sx={{\r\n width,\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius,\r\n height: 36,\r\n backgroundColor: \"#f5f7f8\",\r\n \"& fieldset\": { borderColor: \"#dde3e8\" },\r\n \"&:hover fieldset\": { borderColor: \"#1A5F6C\" },\r\n \"&.Mui-focused fieldset\": { borderColor: \"#1A5F6C\", borderWidth: \"1.5px\" },\r\n },\r\n \"& .MuiInputBase-input\": {\r\n fontSize: \"0.85rem\",\r\n \"&::placeholder\": { color: \"#94a3b8\", opacity: 1 },\r\n },\r\n ...((sx as object) || {}),\r\n }}\r\n />\r\n );\r\n}\r\n","import React from \"react\";\r\nimport {\r\n Box,\r\n Checkbox,\r\n FormControl,\r\n InputLabel,\r\n MenuItem,\r\n Select,\r\n TextField,\r\n CircularProgress,\r\n} from \"@mui/material\";\r\nimport AppButton from \"./AppButton\";\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\nimport SearchBar from \"./SearchBar\";\r\nimport DateRangePicker from \"./DateRangePicker\";\r\nimport AgentMultiSelect, { type AgentOption } from \"./AgentMultiSelect\";\r\nimport { type Queue } from \"../../cdrReport/useCdrReport\";\r\n\r\ndayjs.extend(isoWeek);\r\n\r\nconst FILTER_HEIGHT = 32;\r\n\r\ntype QuickRange = \"today\" | \"week\" | \"month\" | \"\";\r\n\r\ninterface ProcessOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface ReportFilterBarProps {\r\n startDate: Dayjs | null;\r\n endDate: Dayjs | null;\r\n onStartChange: (val: Dayjs | null) => void;\r\n onEndChange: (val: Dayjs | null) => void;\r\n showTime?: boolean;\r\n quickRange: string;\r\n onQuickRangeChange: (range: QuickRange) => void;\r\n showAgentSelect?: boolean;\r\n selectedAgents?: AgentOption[];\r\n onAgentsChange?: (agents: AgentOption[]) => void;\r\n showQueueSelect?: boolean;\r\n queues?: Queue[];\r\n selectedQueues?: Queue[];\r\n onQueuesChange?: (queues: Queue[]) => void;\r\n showProcessSelect?: boolean;\r\n processes?: ProcessOption[];\r\n selectedProcess?: string;\r\n onProcessChange?: (process: string) => void;\r\n showCallTypeSelect?: boolean;\r\n selectedCallType?: string;\r\n onCallTypeChange?: (callType: string) => void;\r\n callTypeOptions?: ProcessOption[];\r\n showStatusSelect?: boolean;\r\n selectedStatus?: string;\r\n onStatusChange?: (status: string) => void;\r\n statusOptions?: ProcessOption[];\r\n showSearchBar?: boolean;\r\n searchValue?: string;\r\n onSearchChange?: (value: string) => void;\r\n searchPlaceholder?: string;\r\n showSearchButton?: boolean;\r\n onSearch?: () => void;\r\n loading?: boolean;\r\n extra?: React.ReactNode;\r\n setIsAllUsersSelected?: (allSelected: boolean) => void;\r\n}\r\n\r\nexport default function ReportFilterBar({\r\n startDate,\r\n endDate,\r\n onStartChange,\r\n onEndChange,\r\n showTime = true,\r\n quickRange,\r\n onQuickRangeChange,\r\n showAgentSelect = false,\r\n selectedAgents = [],\r\n onAgentsChange,\r\n setIsAllUsersSelected,\r\n showQueueSelect = false,\r\n queues = [],\r\n selectedQueues = [],\r\n onQueuesChange,\r\n showProcessSelect = false,\r\n processes = [],\r\n selectedProcess = \"\",\r\n onProcessChange,\r\n showCallTypeSelect = false,\r\n selectedCallType = \"\",\r\n onCallTypeChange,\r\n callTypeOptions = [\r\n { label: \"All Call Types\", value: \"\" },\r\n { label: \"Inbound\", value: \"Inbound\" },\r\n { label: \"Outbound\", value: \"Outbound\" }\r\n ],\r\n showStatusSelect = false,\r\n selectedStatus = \"\",\r\n onStatusChange,\r\n statusOptions = [\r\n { label: \"All Statuses\", value: \"\" },\r\n { label: \"Answered\", value: \"Answered\" },\r\n { label: \"Abandoned\", value: \"Abandoned\" },\r\n { label: \"Not Answered\", value: \"NO_ANSWER\" },\r\n ],\r\n showSearchBar = false,\r\n searchValue = \"\",\r\n onSearchChange,\r\n searchPlaceholder = \"Search...\",\r\n showSearchButton = false,\r\n onSearch,\r\n loading = false,\r\n extra,\r\n}: ReportFilterBarProps) {\r\n const setQuick = (range: QuickRange) => {\r\n onQuickRangeChange(range);\r\n const today = dayjs();\r\n let sd: Dayjs = today.startOf(\"day\");\r\n const ed: Dayjs = today;\r\n if (range === \"week\") sd = today.startOf(\"week\").startOf(\"day\");\r\n else if (range === \"month\") sd = today.startOf(\"month\").startOf(\"day\");\r\n onStartChange(sd);\r\n onEndChange(ed);\r\n };\r\n\r\n return (\r\n <Box sx={{ py: 0.6, px: 1, display: \"flex\", alignItems: \"center\", gap: 1, flexWrap: \"wrap\", rowGap: 1 }}>\r\n <DateRangePicker\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={(v) => { onStartChange(v); onQuickRangeChange(\"\"); }}\r\n onEndChange={(v) => { onEndChange(v); onQuickRangeChange(\"\"); }}\r\n showTime={showTime}\r\n />\r\n\r\n <AppButton variant={quickRange === \"today\" ? \"primary\" : \"outlined\"} onClick={() => setQuick(\"today\")} sx={{ height: FILTER_HEIGHT, whiteSpace: \"nowrap\" }}>\r\n Today\r\n </AppButton>\r\n <AppButton variant={quickRange === \"week\" ? \"primary\" : \"outlined\"} onClick={() => setQuick(\"week\")} sx={{ height: FILTER_HEIGHT, whiteSpace: \"nowrap\" }}>\r\n This Week\r\n </AppButton>\r\n <AppButton variant={quickRange === \"month\" ? \"primary\" : \"outlined\"} onClick={() => setQuick(\"month\")} sx={{ height: FILTER_HEIGHT, whiteSpace: \"nowrap\" }}>\r\n This Month\r\n </AppButton>\r\n\r\n {showAgentSelect && onAgentsChange && (\r\n <AgentMultiSelect value={selectedAgents} onChange={onAgentsChange} setIsAllUsersSelected={setIsAllUsersSelected} minWidth={130} />\r\n )}\r\n\r\n {showQueueSelect && onQueuesChange && (\r\n <FormControl size=\"small\" sx={{ minWidth: 130 }}>\r\n <InputLabel sx={{ fontSize: \"0.76rem\" }}>All Queues</InputLabel>\r\n <Select\r\n multiple\r\n sx={{ fontSize: \"0.76rem\", height: FILTER_HEIGHT, borderRadius: \"6px\" }}\r\n MenuProps={{\r\n variant: \"menu\",\r\n PaperProps: {\r\n sx: {\r\n maxHeight: 280,\r\n \"& .MuiMenuItem-root\": { fontSize: \"0.76rem\", minHeight: 32, py: 0.3 },\r\n },\r\n },\r\n }}\r\n value={selectedQueues.map((q) => q.id)}\r\n label=\"All Queues\"\r\n onChange={(e) => {\r\n const ids = e.target.value as number[];\r\n if (ids.includes(-1)) {\r\n onQueuesChange(selectedQueues.length === queues.length ? [] : [...queues]);\r\n } else {\r\n onQueuesChange(queues.filter((q) => ids.includes(q.id)));\r\n }\r\n }}\r\n renderValue={(selected) => {\r\n if ((selected as number[]).length === 0) return \"All Queues\";\r\n if ((selected as number[]).length === queues.length) return \"All Queues\";\r\n return `${(selected as number[]).length} Queue(s)`;\r\n }}\r\n >\r\n <MenuItem value={-1}>\r\n <Checkbox checked={selectedQueues.length === queues.length && queues.length > 0} size=\"small\" />\r\n Select All\r\n </MenuItem>\r\n {queues.map((q) => (\r\n <MenuItem key={q.id} value={q.id}>\r\n <Checkbox checked={selectedQueues.some((sq) => sq.id === q.id)} size=\"small\" />\r\n {q.name}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n )}\r\n\r\n {showProcessSelect && processes.length > 0 && onProcessChange && (\r\n <TextField\r\n select\r\n size=\"small\"\r\n value={selectedProcess}\r\n onChange={(e) => onProcessChange(e.target.value)}\r\n sx={{ width: 140, \"& .MuiOutlinedInput-root\": { height: FILTER_HEIGHT, borderRadius: \"6px\", fontSize: 13 } }}\r\n >\r\n {processes.map((p) => (\r\n <option key={p.value} value={p.value}>\r\n {p.label}\r\n </option>\r\n ))}\r\n </TextField>\r\n )}\r\n\r\n {showCallTypeSelect && onCallTypeChange && (\r\n <FormControl size=\"small\" sx={{ minWidth: 130 }}>\r\n <InputLabel sx={{ fontSize: \"0.76rem\" }}>Call Type</InputLabel>\r\n <Select\r\n value={selectedCallType}\r\n label=\"Call Type\"\r\n onChange={(e) => onCallTypeChange(e.target.value as string)}\r\n sx={{ fontSize: \"0.76rem\", height: FILTER_HEIGHT, borderRadius: \"6px\" }}\r\n MenuProps={{\r\n PaperProps: {\r\n sx: {\r\n \"& .MuiMenuItem-root\": { fontSize: \"0.76rem\", minHeight: 32, py: 0.3 },\r\n },\r\n },\r\n }}\r\n >\r\n {callTypeOptions.map((opt) => (\r\n <MenuItem key={opt.value || \"all\"} value={opt.value}>\r\n {opt.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n )}\r\n\r\n {showStatusSelect && onStatusChange && (\r\n <FormControl size=\"small\" sx={{ minWidth: 130 }}>\r\n <InputLabel sx={{ fontSize: \"0.76rem\" }}>Status</InputLabel>\r\n <Select\r\n value={selectedStatus}\r\n label=\"Status\"\r\n onChange={(e) => onStatusChange(e.target.value as string)}\r\n sx={{ fontSize: \"0.76rem\", height: FILTER_HEIGHT, borderRadius: \"6px\" }}\r\n MenuProps={{\r\n PaperProps: {\r\n sx: {\r\n \"& .MuiMenuItem-root\": { fontSize: \"0.76rem\", minHeight: 32, py: 0.3 },\r\n },\r\n },\r\n }}\r\n >\r\n {statusOptions.map((opt) => (\r\n <MenuItem key={opt.value || \"all\"} value={opt.value}>\r\n {opt.label}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n )}\r\n\r\n {showSearchBar && onSearchChange && (\r\n <SearchBar\r\n value={searchValue}\r\n onChange={onSearchChange}\r\n placeholder={searchPlaceholder}\r\n width={200}\r\n borderRadius=\"6px\"\r\n sx={{ \"& .MuiOutlinedInput-root\": { height: FILTER_HEIGHT, fontSize: 13 } }}\r\n />\r\n )}\r\n\r\n {showSearchButton && onSearch && (\r\n <AppButton onClick={onSearch} disabled={loading} sx={{ height: FILTER_HEIGHT }}>\r\n {loading ? <CircularProgress size={16} sx={{ color: \"#fff\" }} /> : \"Search\"}\r\n </AppButton>\r\n )}\r\n\r\n {extra}\r\n </Box>\r\n );\r\n}\r\n\r\nexport type { QuickRange, ProcessOption, ReportFilterBarProps };\r\n","import { useState, useEffect } from \"react\";\r\nimport {\r\n Checkbox,\r\n FormControl,\r\n InputLabel,\r\n MenuItem,\r\n Select,\r\n CircularProgress,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport axiosInstance from \"../../../services/axios\";\r\nimport { END_POINT } from \"../../../services/endPoint\";\r\n\r\ninterface User {\r\n id: number;\r\n userId: string;\r\n firstName: string;\r\n lastName: string;\r\n role: any;\r\n}\r\n\r\nasync function getUsers(params?: { role?: string; pageSize?: number }): Promise<User[]> {\r\n const res = await axiosInstance.get(END_POINT.USERS_LIST, { params });\r\n return Array.isArray(res.data) ? res.data : Array.isArray(res.data?.data) ? res.data.data : [];\r\n}\r\n\r\nexport interface AgentOption {\r\n id: number;\r\n userId: string;\r\n displayName: string;\r\n}\r\n\r\ninterface AgentMultiSelectProps {\r\n value: AgentOption[];\r\n onChange: (agents: AgentOption[]) => void;\r\n agents?: AgentOption[];\r\n label?: string;\r\n placeholder?: string;\r\n role?: string;\r\n minWidth?: number;\r\n disabled?: boolean;\r\n setIsAllUsersSelected?: (allSelected: boolean) => void;\r\n}\r\n\r\nconst SELECT_ALL_ID = -999;\r\n\r\nexport default function AgentMultiSelect({\r\n value,\r\n onChange,\r\n agents: externalAgents,\r\n label = \"Agents\",\r\n placeholder = \"All Agents\",\r\n role = \"\",\r\n minWidth = 160,\r\n disabled = false,\r\n setIsAllUsersSelected,\r\n}: AgentMultiSelectProps) {\r\n const [internalAgents, setInternalAgents] = useState<AgentOption[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n\r\n const agents = externalAgents ?? internalAgents;\r\n\r\n useEffect(() => {\r\n if (externalAgents) return;\r\n let cancelled = false;\r\n (async () => {\r\n try {\r\n setLoading(true);\r\n const users = await getUsers(role ? { role, pageSize: 500 } : { pageSize: 500 });\r\n if (cancelled) return;\r\n // An empty `role` lists all users (all roles) instead of agents only.\r\n const filtered = role\r\n ? (users || []).filter((u: User) => {\r\n const roleName =\r\n typeof u.role === \"object\" && u.role !== null ? u.role.name : u.role;\r\n return roleName === role;\r\n })\r\n : (users || []);\r\n setInternalAgents(\r\n filtered.map((u: User) => ({\r\n id: u.id,\r\n userId: u.userId,\r\n displayName:\r\n [u.firstName, u.lastName].filter(Boolean).join(\" \") || u.userId,\r\n })),\r\n );\r\n } catch {\r\n /* silently fail */\r\n } finally {\r\n if (!cancelled) setLoading(false);\r\n }\r\n })();\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [externalAgents, role]);\r\n\r\n const selectedIds = value.map((a) => a.id);\r\n const allSelected = agents.length > 0 && value.length === agents.length;\r\n\r\n const handleChange = (ids: number[]) => {\r\n setIsAllUsersSelected?.(ids.includes(SELECT_ALL_ID));\r\n if (ids.includes(SELECT_ALL_ID)) {\r\n onChange(allSelected ? [] : [...agents]);\r\n } else {\r\n onChange(agents.filter((a) => ids.includes(a.id)));\r\n }\r\n };\r\n\r\n const renderValue = (selected: unknown) => {\r\n const sel = selected as number[];\r\n if (sel.length === 0 || sel.length === agents.length) return placeholder;\r\n return `${sel.length} Agent(s)`;\r\n };\r\n\r\n return (\r\n <FormControl size=\"small\" sx={{ minWidth }} disabled={disabled || loading}>\r\n <InputLabel sx={{ fontSize: \"0.76rem\" }}>{label}</InputLabel>\r\n <Select\r\n multiple\r\n value={selectedIds}\r\n label={label}\r\n onChange={(e) => handleChange(e.target.value as number[])}\r\n renderValue={renderValue}\r\n sx={{ fontSize: \"0.76rem\", height: 32, borderRadius: \"6px\" }}\r\n MenuProps={{\r\n variant: \"menu\",\r\n PaperProps: {\r\n sx: {\r\n maxHeight: 280,\r\n \"& .MuiMenuItem-root\": { fontSize: \"0.76rem\", minHeight: 32, py: 0.3 },\r\n },\r\n },\r\n }}\r\n >\r\n {loading && (\r\n <MenuItem disabled>\r\n <CircularProgress size={16} sx={{ mr: 1 }} /> Loading…\r\n </MenuItem>\r\n )}\r\n {!loading && (\r\n <MenuItem value={SELECT_ALL_ID}>\r\n <Checkbox checked={allSelected} indeterminate={value.length > 0 && !allSelected} size=\"small\" />\r\n Select All\r\n </MenuItem>\r\n )}\r\n {!loading &&\r\n agents.map((agent) => (\r\n <MenuItem key={agent.id} value={agent.id}>\r\n <Checkbox checked={selectedIds.includes(agent.id)} size=\"small\" />\r\n <Typography noWrap sx={{ fontSize: \"0.76rem\", maxWidth: 180 }} title={agent.displayName}>\r\n {agent.displayName}\r\n </Typography>\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n );\r\n}\r\n\r\nexport function toAgentOptions(users: User[]): AgentOption[] {\r\n return users.map((u) => ({\r\n id: u.id,\r\n userId: u.userId,\r\n displayName:\r\n [u.firstName, u.lastName].filter(Boolean).join(\" \") || u.userId,\r\n }));\r\n}\r\n","import type { SxProps, Theme } from \"@mui/material/styles\";\r\n\r\nexport const headCellSx: SxProps<Theme> = {\r\n fontFamily: \"poppins, Arial, sans-serif\",\r\n bgcolor: \"#f1f1f1\",\r\n color: \"#333\",\r\n fontWeight: 600,\r\n whiteSpace: \"nowrap\",\r\n fontSize: \"14px\",\r\n};\r\n\r\nexport const sortLabelSx: SxProps<Theme> = {\r\n \"&.MuiTableSortLabel-root\": { color: \"#333\" },\r\n \"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\r\n \"&.Mui-active\": { color: \"#333\" },\r\n \"& .MuiTableSortLabel-icon\": { color: \"#333 !important\" },\r\n};\r\n\r\nexport const reportBodyCellSx: SxProps<Theme> = {\r\n fontSize: \"0.75rem\",\r\n py: 0.6,\r\n px: 1,\r\n borderBottom: \"1px solid #eef1f6\",\r\n whiteSpace: \"nowrap\",\r\n};\r\n\r\nexport const tableRowSx: SxProps<Theme> = {\r\n \"&:nth-of-type(odd)\": { backgroundColor: \"#fff\" },\r\n \"&:nth-of-type(even)\": { backgroundColor: \"#fff\" },\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n \"&:last-child td, &:last-child th\": { border: 0 },\r\n};\r\n\r\nexport const bodyCellSx: SxProps<Theme> = {\r\n fontFamily: \"poppins, Arial, sans-serif\",\r\n fontSize: \"14px\",\r\n padding: \"4px 12px\",\r\n};\r\n"],"mappings":"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","names":["Checkbox","FormControl","InputLabel","MenuItem","Select","TextField","CircularProgress","jsx","jsxs","jsx","jsxs","FormControl","InputLabel","Select","MenuItem","Checkbox","TextField","CircularProgress"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/hooks/useGetCallerData.ts"],"sourcesContent":["import { useState, useEffect } from \"react\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport type { CallData } from \"../../types\";\r\n\r\nexport const useGetCallerData = (): CallData => {\r\n\tconst sdkState = sdkStateManager.getState();\r\n\tconst { process_id, process_name, status, phone_number, agent_id, call_id, call_details } =\r\n\t\tsdkState.callData;\r\n\tconst initialLeadData = sdkStateManager.getTransferLeadData();\r\n\tconst initialCallData = {\r\n\t\tphone_number,\r\n\t\tstatus,\r\n\t\tcallReferenceId: call_id,\r\n\t\tagent_id,\r\n\t\tprocess_id,\r\n\t\tprocess_name,\r\n\t\tcall_details,\r\n\t\tauto_wrapup_time: sdkState.backendCallControls?.auto_wrapup_time ?? null,\r\n\t\t...(initialLeadData !== undefined && { lead_data: initialLeadData }),\r\n\t\tsocket_info: sdkState.callData,\r\n\t};\r\n\tconst [callData, setCallData] = useState<CallData>(initialCallData);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst unsubscribe = sdkStateManager.subscribe(() => {\r\n\t\t\tconst state = sdkStateManager.getState();\r\n\t\t\tconst { process_id, process_name, status, phone_number, agent_id, call_id, call_details, auto_wrapup_time } =\r\n\t\t\t\tstate.callData;\r\n\t\t\tconst lead_data = sdkStateManager.getTransferLeadData();\r\n\t\t\tconst currentCallData = {\r\n\t\t\t\tphone_number,\r\n\t\t\t\tstatus,\r\n\t\t\t\tcallReferenceId: call_id,\r\n\t\t\t\tagent_id,\r\n\t\t\t\tprocess_id,\r\n\t\t\t\tprocess_name,\r\n\t\t\t\tcall_details,\r\n\t\t\t\tauto_wrapup_time: auto_wrapup_time ?? state.backendCallControls?.auto_wrapup_time ?? null,\r\n\t\t\t\t...(lead_data !== undefined && { lead_data }),\r\n\t\t\t\tsocket_info: state.callData,\r\n\t\t\t};\r\n\t\t\tsetCallData(currentCallData);\r\n\t\t});\r\n\r\n\t\treturn unsubscribe;\r\n\t}, []);\r\n\r\n\treturn callData;\r\n};\r\n"],"mappings":";;;;;;;;;AAAA,SAAS,UAAU,iBAAiB;AAI7B,IAAM,mBAAmB,MAAgB;AAJhD;AAKC,QAAM,WAAW,gBAAgB,SAAS;AAC1C,QAAM,EAAE,YAAY,cAAc,QAAQ,cAAc,UAAU,SAAS,aAAa,IACvF,SAAS;AACV,QAAM,kBAAkB,gBAAgB,oBAAoB;AAC5D,QAAM,kBAAkB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAkB,oBAAS,wBAAT,mBAA8B,qBAA9B,YAAkD;AAAA,KAChE,oBAAoB,UAAa,EAAE,WAAW,gBAAgB,IAT3C;AAAA,IAUvB,aAAa,SAAS;AAAA,EACvB;AACA,QAAM,CAAC,UAAU,WAAW,IAAI,SAAmB,eAAe;AAElE,YAAU,MAAM;AACf,UAAM,cAAc,gBAAgB,UAAU,MAAM;AAxBtD,UAAAA,KAAAC;AAyBG,YAAM,QAAQ,gBAAgB,SAAS;AACvC,YAAM,EAAE,YAAAC,aAAY,cAAAC,eAAc,QAAAC,SAAQ,cAAAC,eAAc,UAAAC,WAAU,SAAAC,UAAS,cAAAC,eAAc,iBAAiB,IACzG,MAAM;AACP,YAAM,YAAY,gBAAgB,oBAAoB;AACtD,YAAM,kBAAkB;AAAA,QACvB,cAAAH;AAAA,QACA,QAAAD;AAAA,QACA,iBAAiBG;AAAA,QACjB,UAAAD;AAAA,QACA,YAAAJ;AAAA,QACA,cAAAC;AAAA,QACA,cAAAK;AAAA,QACA,mBAAkBP,MAAA,+CAAoBD,MAAA,MAAM,wBAAN,gBAAAA,IAA2B,qBAA/C,OAAAC,MAAmE;AAAA,SACjF,cAAc,UAAa,EAAE,UAAU,IATpB;AAAA,QAUvB,aAAa,MAAM;AAAA,MACpB;AACA,kBAAY,eAAe;AAAA,IAC5B,CAAC;AAED,WAAO;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,SAAO;AACR;","names":["_a","_b","process_id","process_name","status","phone_number","agent_id","call_id","call_details"]}
|