ahs-cti 0.0.23 → 0.0.24
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-LLYQYMML.mjs → agentDetailReport-6HFIDHTC.mjs} +2 -2
- package/dist/{agentPerformanceReport-HV2EGJLX.mjs → agentPerformanceReport-P7J5XJTA.mjs} +82 -75
- package/dist/agentPerformanceReport-P7J5XJTA.mjs.map +1 -0
- package/dist/{chunk-4ZGL3YV7.mjs → chunk-6AXXYS36.mjs} +2 -15
- package/dist/chunk-6AXXYS36.mjs.map +1 -0
- package/dist/index.d.mts +54 -1
- package/dist/index.d.ts +55 -2
- package/dist/index.js +0 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/dist-react/{agentDetailReport-5Z7TJCKZ.mjs → agentDetailReport-D4SIU3BC.mjs} +2 -2
- package/dist-react/{agentPerformanceReport-254GZV62.mjs → agentPerformanceReport-NZI4MXJM.mjs} +2 -2
- package/dist-react/{chunk-4ZGPGLF3.mjs → chunk-GE5Q5DRU.mjs} +1 -7
- package/dist-react/chunk-GE5Q5DRU.mjs.map +1 -0
- package/dist-react/index.d.mts +54 -1
- package/dist-react/index.d.ts +54 -1
- package/dist-react/index.js +4 -10
- package/dist-react/index.js.map +1 -1
- package/dist-react/index.mjs +3 -3
- package/dist-react/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/agentPerformanceReport-HV2EGJLX.mjs.map +0 -1
- package/dist/chunk-4ZGL3YV7.mjs.map +0 -1
- package/dist-react/chunk-4ZGPGLF3.mjs.map +0 -1
- /package/dist/{agentDetailReport-LLYQYMML.mjs.map → agentDetailReport-6HFIDHTC.mjs.map} +0 -0
- /package/dist-react/{agentDetailReport-5Z7TJCKZ.mjs.map → agentDetailReport-D4SIU3BC.mjs.map} +0 -0
- /package/dist-react/{agentPerformanceReport-254GZV62.mjs.map → agentPerformanceReport-NZI4MXJM.mjs.map} +0 -0
|
@@ -76,8 +76,7 @@ import {
|
|
|
76
76
|
Typography_default,
|
|
77
77
|
__spreadProps,
|
|
78
78
|
__spreadValues,
|
|
79
|
-
__toESM
|
|
80
|
-
createSvgIcon
|
|
79
|
+
__toESM
|
|
81
80
|
} from "./chunk-7F3FCGC3.mjs";
|
|
82
81
|
|
|
83
82
|
// call-control-sdk/lib/pages/agentDetailReport/index.tsx
|
|
@@ -123,12 +122,6 @@ function BreakSessionsTable({ breaks, maxHeight = 380, showRemarksStatus = true
|
|
|
123
122
|
] }) });
|
|
124
123
|
}
|
|
125
124
|
|
|
126
|
-
// node_modules/@mui/icons-material/Visibility.mjs
|
|
127
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
128
|
-
var Visibility_default = createSvgIcon(/* @__PURE__ */ _jsx("path", {
|
|
129
|
-
d: "M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"
|
|
130
|
-
}), "Visibility");
|
|
131
|
-
|
|
132
125
|
// call-control-sdk/lib/pages/agentDetailReport/index.tsx
|
|
133
126
|
var import_dayjs2 = __toESM(require_dayjs_min());
|
|
134
127
|
|
|
@@ -425,11 +418,6 @@ function AgentDetailReportContent({ agentRow: propAgentRow, onBack, from, initia
|
|
|
425
418
|
setBreaksLoading(false);
|
|
426
419
|
}
|
|
427
420
|
}, [agentIdFromRow, startDate, endDate]);
|
|
428
|
-
const openBreaksDialog = async () => {
|
|
429
|
-
if (!agentIdFromRow) return;
|
|
430
|
-
setBreaksDialogOpen(true);
|
|
431
|
-
await loadBreakSessions();
|
|
432
|
-
};
|
|
433
421
|
const closeBreaksDialog = () => {
|
|
434
422
|
setBreaksDialogOpen(false);
|
|
435
423
|
};
|
|
@@ -950,10 +938,9 @@ var AgentDetailReport = (props) => /* @__PURE__ */ jsx2(SDKProvider, { children:
|
|
|
950
938
|
var agentDetailReport_default = AgentDetailReport;
|
|
951
939
|
|
|
952
940
|
export {
|
|
953
|
-
Visibility_default,
|
|
954
941
|
BreakSessionsTable,
|
|
955
942
|
getAgentBreakSessions,
|
|
956
943
|
exportAgentBreakSessionsToExcel,
|
|
957
944
|
agentDetailReport_default
|
|
958
945
|
};
|
|
959
|
-
//# sourceMappingURL=chunk-
|
|
946
|
+
//# sourceMappingURL=chunk-6AXXYS36.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/agentDetailReport/index.tsx","../call-control-sdk/lib/pages/common/components/BreakSessionsTable.tsx","../call-control-sdk/lib/pages/agentDetailReport/useAgentDetailReport.ts"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from \"react\";\r\n\r\nimport {\r\n Box, Typography, Table, TableBody, TableCell, TableContainer,\r\n TableHead, TableRow, TablePagination, IconButton, Chip,\r\n CircularProgress, Alert, Dialog, DialogTitle, DialogContent,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport BreakSessionsTable from \"../common/components/BreakSessionsTable\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\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 CloseIcon from \"@mui/icons-material/Close\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport {\r\n BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip as RTooltip,\r\n PieChart, Pie, Cell, Legend, ResponsiveContainer, LabelList,\r\n} from \"recharts\";\r\nimport dayjs, { type Dayjs } from \"dayjs\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport DateRangePicker from \"../common/components/DateRangePicker\";\r\nimport { getAgentDetailReport, getCdrReport, getRecordingByCall, getAgentBreakSessions, exportAgentBreakSessionsToExcel } from \"./useAgentDetailReport\";\r\nimport { deepFindArray } from \"../../services/axios\";\r\nimport { sdkStateManager } from \"../../hooks/sdk-state\";\r\nimport type {\r\n AgentDetailReportResponse,\r\n AgentDetailProfile,\r\n BreakSessionResponse,\r\n CdrRecordResponse,\r\n CdrReportParams,\r\n ReportData,\r\n} from \"./types\";\r\nimport PageHeader from \"../common/components/PageHeader\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\n\r\nconst C = {\r\n navy: \"#0d2a56\", blue: \"#1565c8\", green: \"#0a9a62\", amber: \"#c47c00\",\r\n red: \"#cc2a2a\", purple: \"#6b3fbf\", teal: \"#0b7a8f\",\r\n bg: \"#fff\", surface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\r\n b1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\r\n t1: \"#0d1e35\", t2: \"#364f6e\", t3: \"#7a93b5\", t4: \"#bccad9\",\r\n blt: \"#e8f0fc\", glt: \"#e4f6ef\", alt: \"#fdf3e0\", rlt: \"#fde8e8\",\r\n plt: \"#f0eafa\", tlt: \"#e3f4f7\",\r\n};\r\n\r\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\nconst monoSx = { fontFamily: \"'JetBrains Mono', monospace\", fontSize: 11, fontWeight: 600 };\r\nconst QUEUE_COLORS = [C.blue, C.green, C.purple, C.amber, C.teal, C.red, C.navy];\r\n\r\nfunction StatusChip({ status }: { status: string }) {\r\n const s = status?.toLowerCase();\r\n const isAns = s === \"answered\";\r\n const isAband = s === \"abandoned\";\r\n return (\r\n <Chip label={status || \"—\"} size=\"small\" sx={{\r\n fontSize: 11, fontWeight: 700, height: 22,\r\n background: isAns ? C.glt : isAband ? C.alt : C.rlt,\r\n color: isAns ? C.green : isAband ? C.amber : C.red,\r\n border: `1px solid ${isAns ? \"rgba(10,154,98,.2)\" : isAband ? \"rgba(196,124,0,.2)\" : \"rgba(204,42,42,.2)\"}`,\r\n fontFamily: \"'JetBrains Mono', monospace\",\r\n }} />\r\n );\r\n}\r\n\r\nfunction CallTypeChip({ type }: { type: string }) {\r\n const isIn = type?.toLowerCase() === \"inbound\";\r\n return (\r\n <Chip label={type || \"—\"} size=\"small\" sx={{\r\n fontSize: 11, fontWeight: 700, height: 22,\r\n background: isIn ? C.glt : C.blt,\r\n color: isIn ? C.green : C.blue,\r\n border: `1px solid ${isIn ? \"rgba(10,154,98,.2)\" : \"rgba(21,101,200,.2)\"}`,\r\n fontFamily: \"'JetBrains Mono', monospace\",\r\n }} />\r\n );\r\n}\r\n\r\nfunction RecordingCell({ callUuid, recordingPath }: { callUuid: string; recordingPath: string | null }) {\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\r\n if (!recordingPath) {\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.3 }}>\r\n <Tooltip title=\"No recording available\">\r\n <span>\r\n <IconButton size=\"small\" disabled sx={{ p: 0.4 }}>\r\n <PlayArrowIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n <Tooltip title=\"No recording available\">\r\n <span>\r\n <IconButton size=\"small\" disabled sx={{ p: 0.4 }}>\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n </Box>\r\n );\r\n }\r\n\r\n const handlePlay = async () => {\r\n if (audioUrl) return;\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 onEnded={() => { if (audioUrl.startsWith(\"blob:\")) URL.revokeObjectURL(audioUrl); setAudioUrl(null); }}\r\n style={{ width: 140, height: 30 }}\r\n />\r\n <Tooltip title=\"Download\">\r\n <IconButton size=\"small\" onClick={handleDownload} sx={{ color: C.blue, p: 0.4 }}>\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={error ? \"Recording unavailable\" : \"Play\"}>\r\n <span>\r\n <IconButton size=\"small\" onClick={handlePlay} disabled={loading || error} sx={{ color: C.green, p: 0.4 }}>\r\n {loading ? <CircularProgress size={14} /> : <PlayArrowIcon sx={{ fontSize: 16 }} />}\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n <Tooltip title={error ? \"Recording unavailable\" : \"Download\"}>\r\n <span>\r\n <IconButton size=\"small\" onClick={handleDownload} disabled={loading || error} sx={{ color: C.blue, p: 0.4 }}>\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n {error && <Chip label=\"No File\" size=\"small\" sx={{ fontSize: \"0.6rem\", height: 18 }} />}\r\n </Box>\r\n );\r\n}\r\n\r\nconst cdrHeadSx = {\r\n bgcolor: \"#f1f1f1\", color: \"#333\", fontWeight: 600,\r\n whiteSpace: \"nowrap\" as const, fontSize: \"14px\",\r\n py: 0.7, px: 1,\r\n};\r\n\r\nexport interface AgentDetailReportProps {\r\n agentRow?: ReportData | null;\r\n onBack?: () => void;\r\n from?: \"REPORTS_LIST\" | string;\r\n initialStartDate?: Dayjs | null;\r\n initialEndDate?: Dayjs | null;\r\n initialQuickRange?: string;\r\n}\r\n\r\nfunction AgentDetailReportContent({ agentRow: propAgentRow, onBack, from, initialStartDate, initialEndDate, initialQuickRange }: AgentDetailReportProps = {}) {\r\n const agentRow: ReportData | null = propAgentRow || null;\r\n const isFromReportsList = from === \"REPORTS_LIST\";\r\n const agentIdFromRow = isFromReportsList\r\n ? agentRow?.agentDetails?.agentId || \"\"\r\n : sdkStateManager.getState().agentId || agentRow?.agentDetails?.agentId || \"\";\r\n\r\n const [quickRange, setQuickRange] = useState<string>(initialQuickRange || \"today\");\r\n const [startDate, setStartDate] = useState<Dayjs | null>(initialStartDate ?? dayjs());\r\n const [endDate, setEndDate] = useState<Dayjs | null>(initialEndDate ?? dayjs());\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const syncFilterToUrl = (_sd: Dayjs, _ed: Dayjs, _range: string) => { /* no-op in SDK context */ };\r\n\r\n const [activeTab, setActiveTab] = useState(0);\r\n\r\n const [detail, setDetail] = useState<AgentDetailReportResponse | null>(null);\r\n const [detailLoading, setDetailLoading] = useState(!isFromReportsList);\r\n const [detailError, setDetailError] = useState(\"\");\r\n\r\n const [cdrRecords, setCdrRecords] = useState<CdrRecordResponse[]>([]);\r\n const [cdrTotal, setCdrTotal] = useState(0);\r\n const [cdrPage, setCdrPage] = useState(0);\r\n const [cdrPageSize, setCdrPageSize] = useState(10);\r\n const [cdrLoading, setCdrLoading] = useState(false);\r\n const [cdrError, setCdrError] = useState(\"\");\r\n\r\n // Break sessions dialog state (opened from the \"Breaks Taken\" stat)\r\n const [breaksDialogOpen, setBreaksDialogOpen] = useState(false);\r\n const [breakSessions, setBreakSessions] = useState<BreakSessionResponse[]>([]);\r\n const [breaksLoading, setBreaksLoading] = useState(false);\r\n\r\n const profile: AgentDetailProfile | null = detail?.profile || null;\r\n const agentName = profile?.fullName || agentRow?.agentDetails?.fullName || \"Unknown Agent\";\r\n const showInitialSpinner = !isFromReportsList && detailLoading && !profile && !agentRow?.agentDetails?.fullName;\r\n\r\n const setQuick = (range: string) => {\r\n setQuickRange(range);\r\n const today = dayjs();\r\n let sd: Dayjs = today;\r\n const ed: Dayjs = today;\r\n if (range === \"week\") sd = today.startOf(\"week\");\r\n else if (range === \"month\") sd = today.startOf(\"month\");\r\n setStartDate(sd);\r\n setEndDate(ed);\r\n syncFilterToUrl(sd, ed, range);\r\n };\r\n\r\n const fetchDetailFn = async (sd: Dayjs, ed: Dayjs) => {\r\n if (!agentIdFromRow) return;\r\n try {\r\n setDetailLoading(true);\r\n setDetailError(\"\");\r\n const res = await getAgentDetailReport(agentIdFromRow, {\r\n start_date: sd.startOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.isSame(dayjs(), \"day\") ? dayjs().format(\"YYYY-MM-DDTHH:mm:ss\") : ed.endOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n });\r\n setDetail(res);\r\n } catch (err: any) {\r\n setDetailError(err?.message || \"Failed to load agent detail\");\r\n } finally {\r\n setDetailLoading(false);\r\n }\r\n };\r\n\r\n const fetchCdrFn = async (sd: Dayjs, ed: Dayjs, page: number, pageSize: number) => {\r\n if (!agentIdFromRow) return;\r\n try {\r\n setCdrLoading(true);\r\n setCdrError(\"\");\r\n const params: CdrReportParams = {\r\n start_date: sd.startOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.isSame(dayjs(), \"day\") ? dayjs().format(\"YYYY-MM-DDTHH:mm:ss\") : ed.endOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n search: agentIdFromRow,\r\n page: page + 1,\r\n pageSize: pageSize,\r\n };\r\n const res: any = await getCdrReport(params);\r\n setCdrRecords(deepFindArray<CdrRecordResponse>(res, [\"data\", \"records\"]));\r\n setCdrTotal(res?.records?.total ?? res?.total ?? res?.data?.total ?? 0);\r\n } catch (err: any) {\r\n setCdrError(err?.message || \"Failed to load call history\");\r\n } finally {\r\n setCdrLoading(false);\r\n }\r\n };\r\n\r\n /* ── Break sessions dialog ── */\r\n const loadBreakSessions = useCallback(async () => {\r\n if (!agentIdFromRow) return;\r\n setBreaksLoading(true);\r\n try {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n const data = await getAgentBreakSessions(agentIdFromRow, {\r\n start_date: sd.startOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.isSame(dayjs(), \"day\")\r\n ? dayjs().format(\"YYYY-MM-DDTHH:mm:ss\")\r\n : ed.endOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n });\r\n setBreakSessions(Array.isArray(data) ? data : []);\r\n } catch {\r\n setBreakSessions([]);\r\n } finally {\r\n setBreaksLoading(false);\r\n }\r\n }, [agentIdFromRow, startDate, endDate]);\r\n\r\n // Only toggle the dialog — keep breakSessions so the inline table (which\r\n // shares this state) isn't wiped when the dialog closes.\r\n const closeBreaksDialog = () => {\r\n setBreaksDialogOpen(false);\r\n };\r\n\r\n /* ── Manual refresh / search (re-fetch with the current date range) ── */\r\n const handleSearch = (sd?: Dayjs | null, ed?: Dayjs | null) => {\r\n const fromDate = sd ?? startDate;\r\n const toDate = ed ?? endDate;\r\n if (!fromDate || !toDate) return;\r\n fetchDetailFn(fromDate, toDate);\r\n setCdrPage(0);\r\n if (activeTab === 1) fetchCdrFn(fromDate, toDate, 0, cdrPageSize);\r\n };\r\n\r\n // Auto-fetch the detail report whenever the agent or date range changes.\r\n useEffect(() => {\r\n if (agentIdFromRow && startDate && endDate) fetchDetailFn(startDate, endDate);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [agentIdFromRow, startDate, endDate]);\r\n\r\n // Fetch CDR records on tab switch, pagination, or date-range change.\r\n useEffect(() => {\r\n if (activeTab === 1 && startDate && endDate) {\r\n fetchCdrFn(startDate, endDate, cdrPage, cdrPageSize);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [activeTab, cdrPage, cdrPageSize, startDate, endDate]);\r\n\r\n // Load break sessions inline whenever the Break Details tab is active.\r\n useEffect(() => {\r\n if (activeTab === 2 && agentIdFromRow && startDate && endDate) loadBreakSessions();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [activeTab, agentIdFromRow, startDate, endDate]);\r\n\r\n const hourlyCallData = useMemo(() => {\r\n return (detail?.hourlyCalls || []).map((h) => ({\r\n hour: String(h.hourOfDay).padStart(2, \"0\"),\r\n answered: h.answeredCalls,\r\n abandoned: h.missedCalls,\r\n }));\r\n }, [detail]);\r\n\r\n const timeUtilData = useMemo(() => {\r\n const tu = detail?.timeUtilisation;\r\n if (!tu) return [];\r\n const total = tu.totalLoginSeconds || 1;\r\n return [\r\n { name: \"On Call / Handle\", value: tu.onCallSeconds, pct: (tu.onCallSeconds / total) * 100, formatted: tu.onCallFormatted, color: C.blue },\r\n { name: \"Idle\", value: tu.idleSeconds, pct: (tu.idleSeconds / total) * 100, formatted: tu.idleFormatted, color: \"#e8a0a0\" },\r\n { name: \"Break\", value: tu.breakSeconds, pct: (tu.breakSeconds / total) * 100, formatted: tu.breakFormatted, color: C.amber },\r\n ];\r\n }, [detail]);\r\n\r\n const talkDurationBuckets = useMemo(() => {\r\n const items = [...(detail?.talkDistribution || [])].sort((a, b) => a.bucketOrder - b.bucketOrder);\r\n const total = items.reduce((s, b) => s + (b.callCount || 0), 0);\r\n return items.map((b) => ({\r\n bucket: b.bucketLabel,\r\n count: b.callCount,\r\n minSeconds: b.minSeconds,\r\n maxSeconds: b.maxSeconds,\r\n pct: total > 0 ? (b.callCount / total) * 100 : 0,\r\n }));\r\n }, [detail]);\r\n\r\n const talkDurationTotal = useMemo(\r\n () => talkDurationBuckets.reduce((s, b) => s + (b.count || 0), 0),\r\n [talkDurationBuckets],\r\n );\r\n\r\n const queuePieData = useMemo(() => {\r\n return (detail?.callsByQueue || []).map((q, i) => ({\r\n name: q.queueName,\r\n value: q.callCount,\r\n pctOfTotal: q.pctOfTotal,\r\n color: QUEUE_COLORS[i % QUEUE_COLORS.length],\r\n }));\r\n }, [detail]);\r\n\r\n const queueMetrics = useMemo(() => {\r\n const items = detail?.queueMetrics || [];\r\n const grandTotal = items.reduce((sum, q) => sum + q.totalCalls, 0);\r\n return items.map((q, i) => ({\r\n ...q,\r\n pctOfTotal: grandTotal > 0 ? (q.totalCalls / grandTotal) * 100 : 0,\r\n answerRate: q.totalCalls > 0 ? (q.answeredCalls / q.totalCalls) * 100 : 0,\r\n color: QUEUE_COLORS[i % QUEUE_COLORS.length],\r\n }));\r\n }, [detail]);\r\n\r\n const hourlyChartTitle = useMemo(() => {\r\n if (quickRange === \"today\") return \"Hourly Call Volume — Today\";\r\n if (quickRange === \"month\") return `Hourly Call Volume — ${dayjs().format(\"MMMM YYYY\")}`;\r\n if (quickRange === \"week\") return \"Hourly Call Volume — This Week\";\r\n if (startDate && endDate) {\r\n if (startDate.isSame(endDate, \"day\")) return `Hourly Call Volume — ${startDate.format(\"DD MMM YYYY\")}`;\r\n return `Hourly Call Volume — ${startDate.format(\"DD MMM YYYY\")} to ${endDate.format(\"DD MMM YYYY\")}`;\r\n }\r\n return \"Hourly Call Volume\";\r\n }, [quickRange, startDate, endDate]);\r\n\r\n const handleBack = useCallback(() => {\r\n onBack?.();\r\n }, [onBack]);\r\n\r\n if (!agentIdFromRow) {\r\n return (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <Typography sx={{ color: C.t3, mb: 2 }}>No agent selected.</Typography>\r\n {isFromReportsList && (\r\n <AppButton onClick={handleBack}>\r\n Go Back\r\n </AppButton>\r\n )}\r\n </Box>\r\n );\r\n }\r\n\r\n if (showInitialSpinner) {\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", minHeight: 400 }}>\r\n <CircularProgress size={36} />\r\n </Box>\r\n );\r\n }\r\n\r\n const tabs = [\"Overview\", \"Call History\", \"Break Details\"];\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ background: C.bg, minHeight: \"100vh\" }}>\r\n <PageHeader\r\n title={agentName}\r\n showBack={isFromReportsList}\r\n onBack={handleBack}\r\n />\r\n\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, flexWrap: \"wrap\", pb: 1.5, px: 2 }}>\r\n <DateRangePicker\r\n showTime={false}\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={(d) => { setStartDate(d); setQuickRange(\"custom\"); if (d && endDate) syncFilterToUrl(d, endDate, \"custom\"); }}\r\n onEndChange={(d) => { setEndDate(d); setQuickRange(\"custom\"); if (startDate && d) syncFilterToUrl(startDate, d, \"custom\"); }}\r\n />\r\n <AppButton variant={quickRange === \"today\" ? \"primary\" : \"outlined\"} onClick={() => setQuick(\"today\")} sx={{ whiteSpace: \"nowrap\" }}>Today</AppButton>\r\n <AppButton variant={quickRange === \"week\" ? \"primary\" : \"outlined\"} onClick={() => setQuick(\"week\")} sx={{ whiteSpace: \"nowrap\" }}>This Week</AppButton>\r\n <AppButton variant={quickRange === \"month\" ? \"primary\" : \"outlined\"} onClick={() => setQuick(\"month\")} sx={{ whiteSpace: \"nowrap\" }}>This Month</AppButton>\r\n </Box>\r\n\r\n <Box sx={{ py: 2, px: 2, position: \"relative\" }}>\r\n {detailLoading && (\r\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 }}>\r\n <CircularProgress />\r\n </Box>\r\n )}\r\n\r\n {detailError && <Alert severity=\"error\" sx={{ mb: 2 }} onClose={() => setDetailError(\"\")}>{detailError}</Alert>}\r\n\r\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr 1fr\", sm: \"repeat(3, 1fr)\", md: \"repeat(5, 1fr)\" }, gap: 1.5, mb: 2 }}>\r\n {[\r\n { v: profile?.totalCalls ?? 0, l: \"Total Calls\", c: C.navy },\r\n { v: profile?.answeredCalls ?? 0, l: \"Answered\", c: C.green },\r\n { v: profile?.missedCalls ?? 0, l: \"Missed\", c: C.red },\r\n { v: profile?.avgAhtFormatted || \"00:00:00\", l: \"Avg AHT\", c: C.purple },\r\n { v: `${(profile?.answerRate ?? 0).toFixed(1)}%`, l: \"Answer Rate\", c: C.green },\r\n { v: profile?.loginDurationFormatted || \"00:00:00\", l: \"Login Duration\", c: C.blue },\r\n { v: profile?.productionFormatted || \"00:00:00\", l: \"Production\", c: C.blue },\r\n { v: profile?.handleTimeFormatted || \"00:00:00\", l: \"Handle Time\", c: C.purple },\r\n { v: profile?.breakTimeFormatted || \"00:00:00\", l: \"Break Time\", c: C.amber },\r\n { v: `${(profile?.adherencePct ?? 0).toFixed(1)}%`, l: `Adherence${profile?.adherenceGrade ? ` (${profile.adherenceGrade})` : \"\"}`, c: C.teal },\r\n ].map((kpi, i) => (\r\n <Box key={i} sx={{\r\n px: 1.5, py: 1.2,\r\n borderRadius: \"10px\",\r\n backgroundColor: \"#fafafa\",\r\n borderLeft: `3px solid ${kpi.c}`,\r\n border: \"1px solid #e0e0e0\",\r\n borderLeftWidth: \"3px\",\r\n borderLeftStyle: \"solid\",\r\n borderLeftColor: kpi.c,\r\n }}>\r\n <Typography sx={{\r\n fontFamily: \"poppins, Arial, sans-serif\",\r\n fontSize: \"0.72rem\", fontWeight: 600, color: \"#888\", mb: 0.3,\r\n }}>\r\n {kpi.l}\r\n </Typography>\r\n <Typography sx={{\r\n fontFamily: \"poppins, Arial, sans-serif\",\r\n fontSize: \"0.95rem\", fontWeight: 700, color: \"#1a1a1a\",\r\n }}>\r\n {kpi.v}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n\r\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 }}>\r\n <Box sx={{ display: \"flex\", gap: 0.5, flexWrap: \"wrap\" }}>\r\n {tabs.map((tab, idx) => (\r\n <Box key={tab} onClick={() => setActiveTab(idx)}\r\n sx={{\r\n px: 2, py: 1, fontSize: 13, fontWeight: 600, cursor: \"pointer\",\r\n color: activeTab === idx ? C.blue : C.t3,\r\n borderBottom: `2px solid ${activeTab === idx ? C.blue : \"transparent\"}`,\r\n mb: \"-2px\", transition: \"all .15s\", \"&:hover\": { color: C.t1 },\r\n }}>\r\n {tab}\r\n </Box>\r\n ))}\r\n </Box>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5, mb: \"-2px\" }}>\r\n <AppButton\r\n size=\"small\"\r\n startIcon={<RefreshIcon />}\r\n disabled={detailLoading || cdrLoading}\r\n onClick={() => handleSearch()}\r\n >\r\n Refresh\r\n </AppButton>\r\n {activeTab !== 2 && (\r\n <AppButton size=\"small\" startIcon={<SearchIcon />} onClick={() => handleSearch()}>\r\n Search\r\n </AppButton>\r\n )}\r\n </Box>\r\n </Box>\r\n\r\n {activeTab === 0 && (\r\n <Box>\r\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr\", md: \"1fr 1fr\" }, gap: 2, mb: 2 }}>\r\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\" }}>\r\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}`, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\r\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>{hourlyChartTitle}</Typography>\r\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)` }} />\r\n </Box>\r\n <Box sx={{ p: 2, height: 260 }}>\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n <BarChart data={hourlyCallData} barGap={1}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke={C.b1} />\r\n <XAxis dataKey=\"hour\" tick={{ fontSize: 11, fill: C.t3 }} />\r\n <YAxis tick={{ fontSize: 11, fill: C.t3 }} allowDecimals={false} />\r\n <RTooltip labelFormatter={(label) => `${String(label).padStart(2, \"0\")}:00`} contentStyle={{ fontSize: 12, borderRadius: 8, border: `1px solid ${C.b2}` }} />\r\n <Legend wrapperStyle={{ fontSize: 11 }} />\r\n <Bar dataKey=\"answered\" name=\"Answered\" fill={C.blue} radius={[3, 3, 0, 0]} />\r\n <Bar dataKey=\"abandoned\" name=\"Abandoned\" fill={C.red} radius={[3, 3, 0, 0]} />\r\n </BarChart>\r\n </ResponsiveContainer>\r\n </Box>\r\n </Box>\r\n\r\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\" }}>\r\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}` }}>\r\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Time Utilisation Breakdown</Typography>\r\n </Box>\r\n <Box sx={{ p: 2, height: 260 }}>\r\n {timeUtilData.length > 0 ? (\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n <PieChart>\r\n <Pie data={timeUtilData} cx=\"50%\" cy=\"50%\" innerRadius={60} outerRadius={95} dataKey=\"value\" nameKey=\"name\" minAngle={8}>\r\n {timeUtilData.map((entry, idx) => <Cell key={idx} fill={entry.color} />)}\r\n </Pie>\r\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}` }} />\r\n <Legend wrapperStyle={{ fontSize: 12 }} formatter={(value: string) => <span style={{ color: C.t1, fontWeight: 500 }}>{value}</span>} />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n ) : (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", color: C.t3, fontSize: 13 }}>No data</Box>\r\n )}\r\n </Box>\r\n </Box>\r\n </Box>\r\n\r\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\", mb: 2 }}>\r\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}`, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\r\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Talk Duration Distribution</Typography>\r\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)` }} />\r\n </Box>\r\n <Box sx={{ p: 2, height: 260 }}>\r\n {talkDurationBuckets.length > 0 ? (\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n <BarChart data={talkDurationBuckets} margin={{ top: 16, right: 16, left: 0, bottom: 20 }}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke={C.b1} />\r\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 } }} />\r\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 } }} />\r\n <RTooltip\r\n contentStyle={{ fontSize: 12, borderRadius: 8, border: `1px solid ${C.b2}` }}\r\n labelFormatter={(label, payload) => {\r\n const p = payload?.[0]?.payload as { minSeconds?: number; maxSeconds?: number } | undefined;\r\n if (!p) return String(label);\r\n return `${label} (${p.minSeconds}–${p.maxSeconds}s)`;\r\n }}\r\n formatter={(val, _name, entry) => {\r\n const pct = (entry as any)?.payload?.pct;\r\n return [`${val} call${val === 1 ? \"\" : \"s\"}${pct != null ? ` (${pct.toFixed(1)}%)` : \"\"}`, \"Calls\"];\r\n }}\r\n />\r\n <Bar dataKey=\"count\" name=\"Calls\" fill={C.teal} radius={[4, 4, 0, 0]}>\r\n <LabelList dataKey=\"count\" position=\"top\" style={{ fontSize: 11, fontWeight: 700, fill: C.t1 }} />\r\n </Bar>\r\n </BarChart>\r\n </ResponsiveContainer>\r\n ) : (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", color: C.t3, fontSize: 13 }}>No data</Box>\r\n )}\r\n </Box>\r\n </Box>\r\n\r\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr\", md: \"1fr 1fr\" }, gap: 2 }}>\r\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\" }}>\r\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}` }}>\r\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Calls by Queue</Typography>\r\n </Box>\r\n <Box sx={{ p: 2, height: 260 }}>\r\n {queuePieData.length > 0 ? (\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n <PieChart>\r\n <Pie data={queuePieData} cx=\"50%\" cy=\"50%\" outerRadius={90} dataKey=\"value\" nameKey=\"name\">\r\n {queuePieData.map((entry, idx) => <Cell key={idx} fill={entry.color} />)}\r\n </Pie>\r\n <RTooltip\r\n contentStyle={{ fontSize: 12, borderRadius: 8, border: `1px solid ${C.b2}` }}\r\n formatter={(val, name, entry) => {\r\n const pct = (entry as any)?.payload?.pctOfTotal;\r\n return [`${val} calls${pct != null ? ` (${pct.toFixed(1)}%)` : \"\"}`, name];\r\n }}\r\n />\r\n <Legend wrapperStyle={{ fontSize: 12 }} formatter={(value: string) => <span style={{ color: C.t1, fontWeight: 500 }}>{value}</span>} />\r\n </PieChart>\r\n </ResponsiveContainer>\r\n ) : (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", height: \"100%\", color: C.t3, fontSize: 13 }}>No queue data</Box>\r\n )}\r\n </Box>\r\n </Box>\r\n\r\n <Box sx={{ border: `1px solid ${C.b1}`, borderRadius: \"10px\", overflow: \"hidden\", background: \"transparent\" }}>\r\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}` }}>\r\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Queue Performance Metrics</Typography>\r\n </Box>\r\n <Box sx={{ p: 2 }}>\r\n {queueMetrics.length > 0 ? queueMetrics.map((q) => (\r\n <Box key={q.queueName} sx={{ mb: 2, \"&:last-child\": { mb: 0 } }}>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", mb: 0.3 }}>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n <Box sx={{ width: 10, height: 10, borderRadius: \"50%\", background: q.color, flexShrink: 0 }} />\r\n <Typography sx={{ fontSize: 13, fontWeight: 700, color: C.t1 }}>{q.queueName}</Typography>\r\n </Box>\r\n <Typography sx={{ ...monoSx, fontSize: 13, fontWeight: 800, color: q.color }}>\r\n {q.totalCalls} calls\r\n <Typography component=\"span\" sx={{ ...monoSx, color: C.t3, ml: 0.5 }}>\r\n ({q.answeredCalls} ans / {q.missedCalls} miss)\r\n </Typography>\r\n </Typography>\r\n </Box>\r\n <Box sx={{ height: 6, background: C.s3, borderRadius: 3, overflow: \"hidden\", mb: 0.3 }}>\r\n <Box sx={{ height: \"100%\", width: `${q.pctOfTotal ?? 0}%`, background: q.color, borderRadius: 3 }} />\r\n </Box>\r\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", columnGap: 1.5, rowGap: 0.2 }}>\r\n <Typography sx={{ fontSize: 11, color: C.t3 }}>{(q.pctOfTotal ?? 0).toFixed(0)}% of total</Typography>\r\n <Typography sx={{ fontSize: 11, color: C.t3 }}>Ans: {(q.answerRate ?? 0).toFixed(0)}%</Typography>\r\n <Typography sx={{ fontSize: 11, color: C.t3 }}>Talk: <span style={{ ...monoSx, color: C.t2 }}>{q.avgTalkFormatted}</span></Typography>\r\n <Typography sx={{ fontSize: 11, color: C.t3 }}>Hold: <span style={{ ...monoSx, color: C.t2 }}>{q.avgHoldFormatted}</span></Typography>\r\n <Typography sx={{ fontSize: 11, color: C.t3 }}>Wrap: <span style={{ ...monoSx, color: C.t2 }}>{q.avgWrapupFormatted}</span></Typography>\r\n <Typography sx={{ fontSize: 11, color: C.t3 }}>AHT: <span style={{ ...monoSx, color: C.t2 }}>{q.avgAhtFormatted}</span></Typography>\r\n </Box>\r\n </Box>\r\n )) : (\r\n <Box sx={{ textAlign: \"center\", py: 4, color: C.t3, fontSize: 13 }}>No queue data</Box>\r\n )}\r\n </Box>\r\n </Box>\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {activeTab === 1 && (\r\n <Box sx={{ borderRadius: \"8px\", border: \"1px solid #e0e7ef\", overflow: \"hidden\", background: \"transparent\" }}>\r\n <Box sx={{ px: 2, py: 1.2, background: C.s2, borderBottom: `1px solid ${C.b1}`, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n <Typography sx={{ fontSize: 12, fontWeight: 700, letterSpacing: 0.8, textTransform: \"uppercase\", color: C.t2 }}>Call History</Typography>\r\n <Chip label={`${cdrTotal} records`} size=\"small\" sx={{ fontSize: 11, fontWeight: 700, background: C.s2, color: C.t3, border: `1px solid ${C.b2}` }} />\r\n </Box>\r\n </Box>\r\n {cdrError && <Alert severity=\"error\" sx={{ mx: 2, mt: 1 }} onClose={() => setCdrError(\"\")}>{cdrError}</Alert>}\r\n <TableContainer sx={{ position: \"relative\" }}>\r\n {cdrLoading && (\r\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 }}>\r\n <CircularProgress size={28} />\r\n </Box>\r\n )}\r\n <Table size=\"small\" sx={{\r\n minWidth: 1400,\r\n \"& .MuiTableCell-root\": { fontSize: \"0.75rem\", borderBottom: \"1px solid #eef1f6\", py: 0.6, px: 1 },\r\n }}>\r\n <TableHead>\r\n <TableRow>\r\n {[\r\n \"Phone Number\", \"Call Start\", \"Call Type\", \"Status\", \"Queue\", \"Extension\",\r\n \"Talk Duration\", \"Hold Duration\", \"Ringing Duration\", \"Wrapup Duration\",\r\n \"Disposition\", \"Transferred\", \"Recording\",\r\n ].map((label) => (\r\n <TableCell key={label} sx={cdrHeadSx}>{label}</TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {cdrRecords.map((row, idx) => (\r\n <TableRow key={row.callUuid || idx} hover sx={{\r\n backgroundColor: \"#fff\",\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n }}>\r\n <TableCell sx={{ fontWeight: 600, color: C.navy, fontSize: \"0.75rem\" }}>{row.phoneNumber || \"\"}</TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.callStartTime ? dayjs(row.callStartTime).format(\"DD MMM YYYY hh:mm A\") : \"\"}\r\n </TableCell>\r\n <TableCell><CallTypeChip type={row.callType || \"\"} /></TableCell>\r\n <TableCell><StatusChip status={row.callStatus || \"\"} /></TableCell>\r\n <TableCell>\r\n {row.queueName\r\n ? <Chip label={row.queueName} size=\"small\" sx={{ backgroundColor: \"#f0ebfa\", color: C.purple, fontWeight: 500, fontSize: \"0.67rem\", height: 22 }} />\r\n : \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>{row.extension || \"\"}</TableCell>\r\n <TableCell sx={{ fontWeight: 600, color: C.blue, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>{row.talkDurationFmt || \"\"}</TableCell>\r\n <TableCell sx={{ fontWeight: 500, color: C.amber, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>{row.holdDurationFmt || \"\"}</TableCell>\r\n <TableCell sx={{ fontWeight: 500, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>{row.ringingDurationFmt || \"\"}</TableCell>\r\n <TableCell sx={{ fontWeight: 500, color: C.purple, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>{row.wrapupDurationFmt || \"\"}</TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>{row.disposition || \"\"}</TableCell>\r\n <TableCell>\r\n {row.wasTransferred\r\n ? <Chip label=\"Yes\" size=\"small\" sx={{ backgroundColor: \"#e6f7ef\", color: C.green, fontWeight: 600, fontSize: \"0.65rem\", height: 20, borderRadius: \"6px\" }} />\r\n : <Chip label=\"No\" size=\"small\" sx={{ backgroundColor: \"transparent\", color: \"#6b7b8d\", fontWeight: 600, fontSize: \"0.65rem\", height: 20, borderRadius: \"6px\" }} />}\r\n </TableCell>\r\n <TableCell>\r\n {row.callUuid ? <RecordingCell callUuid={row.callUuid} recordingPath={row.recordingPath ?? null} /> : \"\"}\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n {!cdrLoading && cdrRecords.length === 0 && (\r\n <TableRow><TableCell colSpan={13} sx={{ textAlign: \"center\", py: 4, color: C.t3, fontSize: 13 }}>No call records found</TableCell></TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n <TablePagination\r\n component=\"div\" count={cdrTotal} page={cdrPage}\r\n onPageChange={(_, p) => setCdrPage(p)} rowsPerPage={cdrPageSize}\r\n onRowsPerPageChange={(e) => { setCdrPageSize(parseInt(e.target.value, 10)); setCdrPage(0); }}\r\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\r\n sx={{ borderTop: \"1px solid #eef1f6\", \"& .MuiTablePagination-displayedRows\": { fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontSize: \"0.73rem\" } }}\r\n />\r\n </Box>\r\n )}\r\n\r\n {activeTab === 2 && (\r\n <Box>\r\n {/* ═══ BREAK SESSIONS (inline table) ═══ */}\r\n <Box>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", mb: 1 }}>\r\n <Typography sx={{ fontSize: \"0.72rem\", fontWeight: 700, color: \"#888\", textTransform: \"uppercase\", letterSpacing: 0.8, fontFamily: \"poppins, Arial, sans-serif\" }}>\r\n Break Sessions\r\n </Typography>\r\n <AppButton\r\n size=\"small\"\r\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.85rem !important\" }} />}\r\n disabled={breaksLoading || breakSessions.length === 0}\r\n onClick={async () => {\r\n if (!agentIdFromRow) return;\r\n try {\r\n await exportAgentBreakSessionsToExcel(agentIdFromRow, {\r\n start_date: (startDate ?? dayjs()).startOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: (endDate ?? dayjs()).isSame(dayjs(), \"day\")\r\n ? dayjs().format(\"YYYY-MM-DDTHH:mm:ss\")\r\n : (endDate ?? dayjs()).endOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n });\r\n } catch (err: any) {\r\n setDetailError(err?.message || \"Failed to export breaks Excel\");\r\n }\r\n }}\r\n >\r\n Export to Excel\r\n </AppButton>\r\n </Box>\r\n {breaksLoading ? (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <CircularProgress size={26} sx={{ color: \"var(--primary-color, #1A5F6C)\" }} />\r\n </Box>\r\n ) : breakSessions.length > 0 ? (\r\n <BreakSessionsTable breaks={breakSessions} />\r\n ) : (\r\n <Box sx={{ p: 3, textAlign: \"center\", border: \"1px solid #e4eaf0\", borderRadius: \"10px\", backgroundColor: \"#fff\" }}>\r\n <Typography sx={{ fontFamily: FONT, color: \"#9e9e9e\", fontStyle: \"italic\", fontSize: \"0.82rem\" }}>No breaks found</Typography>\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n {/* ─── BREAK SESSIONS DIALOG ─── */}\r\n <Dialog\r\n open={breaksDialogOpen}\r\n onClose={(_e, reason) => { if (reason !== \"backdropClick\") closeBreaksDialog(); }}\r\n maxWidth=\"md\"\r\n fullWidth\r\n slotProps={{\r\n paper: {\r\n sx: {\r\n borderRadius: \"12px\",\r\n fontFamily: FONT,\r\n overflow: \"hidden\",\r\n boxShadow: \"0 8px 32px rgba(0,0,0,0.18)\",\r\n maxWidth: 640,\r\n },\r\n },\r\n }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n fontFamily: FONT,\r\n background: \"linear-gradient(135deg, var(--primary-color-dark, #14505b), var(--primary-color, #1A5F6C))\",\r\n color: \"#fff\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n py: 1.5,\r\n px: 2.5,\r\n }}\r\n >\r\n <Box>\r\n <Typography variant=\"h6\" sx={{ fontFamily: FONT, fontWeight: 700, fontSize: \"0.95rem\", letterSpacing: \"0.3px\" }}>\r\n Break Sessions\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ fontFamily: FONT, opacity: 0.9, fontSize: \"0.76rem\", mt: 0.3 }}>\r\n {agentName} • {breakSessions.length} break{breakSessions.length !== 1 ? \"s\" : \"\"}\r\n </Typography>\r\n </Box>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n <AppButton\r\n size=\"small\"\r\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.85rem !important\" }} />}\r\n disabled={breaksLoading || breakSessions.length === 0}\r\n onClick={async () => {\r\n if (!agentIdFromRow) return;\r\n try {\r\n await exportAgentBreakSessionsToExcel(agentIdFromRow, {\r\n start_date: (startDate ?? dayjs()).startOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: (endDate ?? dayjs()).isSame(dayjs(), \"day\")\r\n ? dayjs().format(\"YYYY-MM-DDTHH:mm:ss\")\r\n : (endDate ?? dayjs()).endOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n });\r\n } catch (err: any) {\r\n setDetailError(err?.message || \"Failed to export breaks Excel\");\r\n }\r\n }}\r\n sx={{ whiteSpace: \"nowrap\" }}\r\n >\r\n Export to Excel\r\n </AppButton>\r\n <IconButton\r\n onClick={closeBreaksDialog}\r\n size=\"small\"\r\n sx={{\r\n color: \"#fff\",\r\n backgroundColor: \"rgba(255,255,255,0.1)\",\r\n \"&:hover\": { backgroundColor: \"rgba(255,255,255,0.2)\" },\r\n }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ p: 0, backgroundColor: \"#f8fafb\" }}>\r\n {breaksLoading ? (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <CircularProgress size={28} sx={{ color: \"var(--primary-color, #1A5F6C)\" }} />\r\n </Box>\r\n ) : breakSessions.length > 0 ? (\r\n <Box sx={{ p: 1.5 }}>\r\n <BreakSessionsTable breaks={breakSessions} maxHeight={360} showRemarksStatus={false} />\r\n </Box>\r\n ) : (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <Typography sx={{ fontFamily: FONT, color: \"#9e9e9e\", fontStyle: \"italic\", fontSize: \"0.82rem\" }}>\r\n No breaks found\r\n </Typography>\r\n </Box>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst AgentDetailReport: React.FC<AgentDetailReportProps> = (props) => (\r\n <SDKProvider>\r\n <AgentDetailReportContent {...props} />\r\n </SDKProvider>\r\n);\r\n\r\nexport default AgentDetailReport;\r\n","import { Typography, Chip, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from \"@mui/material\";\r\nimport dayjs from \"dayjs\";\r\nimport type { BreakSessionResponse } from \"../../agentDetailReport/types\";\r\n\r\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\nconst C = { green: \"#0a9a62\", red: \"#cc2a2a\", purple: \"#6b3fbf\", teal: \"#0b7a8f\", plt: \"#f0eafa\", glt: \"#e4f6ef\", tlt: \"#e3f4f7\" };\r\n\r\n// Fallback formatter when the API omits durationFormatted but gives seconds.\r\nfunction fmtDur(s: number): string {\r\n if (!s || s <= 0) return \"\";\r\n const h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), sc = Math.floor(s % 60);\r\n return [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\r\n}\r\nfunction fmtDateTime(v?: string | null): string {\r\n return v ? dayjs(v).format(\"DD MMM YYYY h:mm:ss A\") : \"\";\r\n}\r\nfunction fmtDuration(b: BreakSessionResponse): string {\r\n return b.durationFormatted || (b.durationSeconds != null ? fmtDur(b.durationSeconds) : \"\");\r\n}\r\n\r\n/**\r\n * Break sessions rendered as a table — shared by the agent-detail Break Details\r\n * tab, its dialog, and the performance-tab break drill-down so the layout stays\r\n * identical everywhere. Null / missing values render as empty cells.\r\n */\r\nexport default function BreakSessionsTable({ breaks, maxHeight = 380, showRemarksStatus = true }: { breaks: BreakSessionResponse[]; maxHeight?: number; showRemarksStatus?: boolean }) {\r\n return (\r\n <TableContainer sx={{ maxHeight, backgroundColor: \"#fff\", border: \"1px solid #e4eaf0\", borderRadius: \"10px\" }}>\r\n <Table stickyHeader size=\"small\" sx={{ \"& td, & th\": { fontFamily: FONT } }}>\r\n <TableHead>\r\n <TableRow sx={{ \"& th\": { backgroundColor: \"#f0f5f4\", fontWeight: 700, fontSize: \"0.72rem\", color: \"#555\", textTransform: \"uppercase\", letterSpacing: \"0.5px\", borderBottom: \"1px solid #e4eaf0\", py: 0.9 } }}>\r\n <TableCell>Break Type</TableCell>\r\n <TableCell>Started At</TableCell>\r\n <TableCell>Ended At</TableCell>\r\n <TableCell>Duration</TableCell>\r\n {showRemarksStatus && <TableCell>Remarks</TableCell>}\r\n {showRemarksStatus && <TableCell>Status</TableCell>}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {breaks.map((b, i) => (\r\n <TableRow key={b.sessionId ?? i} hover sx={{ \"& td\": { fontSize: \"0.78rem\", borderBottom: \"1px solid #eef1f6\", py: 0.7 } }}>\r\n <TableCell>\r\n {b.breakType\r\n ? <Chip label={b.breakType} size=\"small\" sx={{ fontFamily: FONT, fontSize: \"0.65rem\", fontWeight: 600, height: 18, backgroundColor: C.plt, color: C.purple }} />\r\n : \"\"}\r\n </TableCell>\r\n <TableCell sx={{ color: b.breakStart ? C.green : \"#9e9e9e\", whiteSpace: \"nowrap\" }}>{fmtDateTime(b.breakStart)}</TableCell>\r\n <TableCell sx={{ color: b.breakEnd ? C.red : \"#9e9e9e\", whiteSpace: \"nowrap\" }}>{fmtDateTime(b.breakEnd)}</TableCell>\r\n <TableCell>\r\n {fmtDuration(b)\r\n ? <Typography component=\"span\" sx={{ fontFamily: FONT, fontSize: \"0.72rem\", fontWeight: 700, fontVariantNumeric: \"tabular-nums\", color: C.teal, backgroundColor: C.tlt, borderRadius: \"5px\", px: 0.8, py: 0.25, whiteSpace: \"nowrap\" }}>{fmtDuration(b)}</Typography>\r\n : \"\"}\r\n </TableCell>\r\n {showRemarksStatus && <TableCell sx={{ color: \"#555\" }}>{b.remarks || \"\"}</TableCell>}\r\n {showRemarksStatus && (\r\n <TableCell>\r\n {b.status\r\n ? <Chip label={b.status} size=\"small\" sx={{ fontFamily: FONT, fontSize: \"0.62rem\", fontWeight: 700, height: 18, backgroundColor: b.status === \"Active\" ? C.glt : \"#eef2f7\", color: b.status === \"Active\" ? C.green : \"#555\" }} />\r\n : \"\"}\r\n </TableCell>\r\n )}\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n );\r\n}\r\n\r\nexport { BreakSessionsTable };\r\n","import { useCallback, useState } from \"react\";\r\nimport axiosInstance, { deepFindArray } from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type {\r\n\tAgentDetailReportParams,\r\n\tAgentDetailReportResponse,\r\n\tBreakSessionResponse,\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 getAgentBreakSessions(\r\n\tagentId: string,\r\n\tparams?: { start_date?: string; end_date?: string },\r\n): Promise<BreakSessionResponse[]> {\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(\r\n\t\t`${END_POINT.LOGIN_REPORT_AGENT_BREAKS(agentId)}${qsStr ? `?${qsStr}` : \"\"}`,\r\n\t);\r\n\t// Response may be a bare array or wrapped ({ data: [...] }, { breaks: [...] }, etc.),\r\n\t// and occasionally an unparsed JSON string if Content-Type wasn't application/json.\r\n\tlet body: any = res.data;\r\n\tif (typeof body === \"string\") {\r\n\t\ttry { body = JSON.parse(body); } catch { /* leave as-is */ }\r\n\t}\r\n\treturn deepFindArray<BreakSessionResponse>(body, [\"breaks\", \"sessions\", \"data\"]);\r\n}\r\n\r\nexport async function exportAgentBreakSessionsToExcel(\r\n\tagentId: string,\r\n\tparams?: { start_date?: string; end_date?: string },\r\n): Promise<void> {\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(\r\n\t\t`${END_POINT.LOGIN_REPORT_AGENT_BREAKS_EXPORT_EXCEL(agentId)}${qsStr ? `?${qsStr}` : \"\"}`,\r\n\t\t{ responseType: \"blob\" },\r\n\t);\r\n\tconst blobUrl = URL.createObjectURL(new Blob([res.data]));\r\n\tconst a = document.createElement(\"a\");\r\n\ta.href = blobUrl;\r\n\ta.download = `break_sessions_${agentId}.xlsx`;\r\n\tdocument.body.appendChild(a);\r\n\ta.click();\r\n\ta.remove();\r\n\tURL.revokeObjectURL(blobUrl);\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","dayjs","import_dayjs","jsx","jsxs","C","FONT","useState","dayjs","_a","_b","_c","_d","_e","useCallback"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -641,6 +641,59 @@ declare const SDKPages: {
|
|
|
641
641
|
readonly CaroQualityAuditDashboard: React.ComponentType<any>;
|
|
642
642
|
};
|
|
643
643
|
|
|
644
|
+
/**
|
|
645
|
+
* 🧾 Audit Report Dialog
|
|
646
|
+
*
|
|
647
|
+
* @description Stand-alone dialog component that renders the call audit report.
|
|
648
|
+
* Pass either a full CDR `rowData` or a bare `callUuid`. The "maximize" action
|
|
649
|
+
* uses the globally-configured URL resolver unless `onMaximize` is provided.
|
|
650
|
+
*
|
|
651
|
+
* @since 1.0.0
|
|
652
|
+
* @author CTI SDK Team
|
|
653
|
+
*/
|
|
654
|
+
interface AuditReportDialogProps {
|
|
655
|
+
open: boolean;
|
|
656
|
+
onClose: () => void;
|
|
657
|
+
width?: string;
|
|
658
|
+
/** Full CDR row to audit. */
|
|
659
|
+
rowData?: Record<string, any>;
|
|
660
|
+
/** Bare call id to audit. Takes precedence over `rowData.callUuid`. */
|
|
661
|
+
callUuid?: string;
|
|
662
|
+
/** Per-instance override of the maximize behaviour. */
|
|
663
|
+
onMaximize?: (callUuid: string) => void;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
declare const AuditReportDialog: React.ComponentType<AuditReportDialogProps>;
|
|
667
|
+
|
|
668
|
+
/** Resolver that maps a call id to the URL opened by the audit report "maximize" action. */
|
|
669
|
+
type AuditReportUrlResolver = (callUuid: string) => string;
|
|
670
|
+
|
|
671
|
+
/** Register a global resolver for the audit report "maximize" action. Call once at startup. */
|
|
672
|
+
declare function setAuditReportUrlResolver(resolver: AuditReportUrlResolver): void;
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* 👤 Agent Detail Report
|
|
676
|
+
*
|
|
677
|
+
* @description Stand-alone (full-page) agent detail report component. Can be
|
|
678
|
+
* rendered directly (e.g. via a route) instead of through {@link SDKPages}.
|
|
679
|
+
*
|
|
680
|
+
* @since 1.0.0
|
|
681
|
+
* @author CTI SDK Team
|
|
682
|
+
*/
|
|
683
|
+
interface AgentDetailReportProps {
|
|
684
|
+
/** The agent/report row to render details for. */
|
|
685
|
+
agentRow?: Record<string, any> | null;
|
|
686
|
+
onBack?: () => void;
|
|
687
|
+
from?: "REPORTS_LIST" | string;
|
|
688
|
+
/** Initial start date (a Dayjs instance). */
|
|
689
|
+
initialStartDate?: any;
|
|
690
|
+
/** Initial end date (a Dayjs instance). */
|
|
691
|
+
initialEndDate?: any;
|
|
692
|
+
initialQuickRange?: string;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
declare const AgentDetailReport: React.ComponentType<AgentDetailReportProps>;
|
|
696
|
+
|
|
644
697
|
// =============================================================================
|
|
645
698
|
// 🗃️ TYPE EXPORTS
|
|
646
699
|
// =============================================================================
|
|
@@ -2480,4 +2533,4 @@ interface SDKAccessDeniedProps {
|
|
|
2480
2533
|
|
|
2481
2534
|
declare const SDKAccessDenied: React.FC<SDKAccessDeniedProps>;
|
|
2482
2535
|
|
|
2483
|
-
export { type APIResponse, type AgentStatus, CallControlPanel, type CallControlPanelProps, type CallData, type CallInitiationFunction, type CallTerminationFunction, type ChangeModePayload, type CleanupOperation, type ConferenceCallPayload, type ConferenceLine, type ControlsFromPermissions, type DispositionType, type EndCallData, type EndCallPayLoadData, type EndCallPayload, type ErrorResponse, type FollowUpType, type HookStateTypes, type InitSDKParams, type LiveStatusPageProps, type LogoutFunction, type LogoutHookStateTypes, type LogoutPayload, type ProcessData, SDKAccessDenied, type SDKAccessDeniedProps, type SDKBit, type SDKConfig, type SDKEntitlement, type SDKEntitlements, type SDKInitResult, SDKPages, type SDKPermissionContextValue, SDKPermissionGuard, type SDKPermissionGuardProps, type SDKPermissionState, type SDKPermissionsHook, type SDKState, SDKStateManager, SDK_MENU_CODES, SDK_PERMISSIONS, SDK_WILDCARD, type StartCallPayload, type StartCalltData, type StartCalltHookStateTypes, type StartMonitoringPayload, type StopMonitoringPayload, type StorageType, type SupervisorMonitorMode, type URLConfig, type UseCallMonitoringReturn, type UseClickToCallReturn, type UseClickToConferenceReturn, type UseEndCallReturn, type UseLogoutReturn, changeMonitorMode, clickToCall, clickToConference, endCall, getSDKVersion, initSDK, isSDKInitialized, logout, sdkStateManager, setTransferLeadData, startMonitoring, stopMonitoring, useCallMonitoring, useClickToCall, useClickToConference, useEndCall, useGetAuthorizationToken, useGetCallerData, useLogout, useSDKPermissions, useSDKState };
|
|
2536
|
+
export { type APIResponse, AgentDetailReport, type AgentDetailReportProps, type AgentStatus, AuditReportDialog, type AuditReportDialogProps, type AuditReportUrlResolver, CallControlPanel, type CallControlPanelProps, type CallData, type CallInitiationFunction, type CallTerminationFunction, type ChangeModePayload, type CleanupOperation, type ConferenceCallPayload, type ConferenceLine, type ControlsFromPermissions, type DispositionType, type EndCallData, type EndCallPayLoadData, type EndCallPayload, type ErrorResponse, type FollowUpType, type HookStateTypes, type InitSDKParams, type LiveStatusPageProps, type LogoutFunction, type LogoutHookStateTypes, type LogoutPayload, type ProcessData, SDKAccessDenied, type SDKAccessDeniedProps, type SDKBit, type SDKConfig, type SDKEntitlement, type SDKEntitlements, type SDKInitResult, SDKPages, type SDKPermissionContextValue, SDKPermissionGuard, type SDKPermissionGuardProps, type SDKPermissionState, type SDKPermissionsHook, type SDKState, SDKStateManager, SDK_MENU_CODES, SDK_PERMISSIONS, SDK_WILDCARD, type StartCallPayload, type StartCalltData, type StartCalltHookStateTypes, type StartMonitoringPayload, type StopMonitoringPayload, type StorageType, type SupervisorMonitorMode, type URLConfig, type UseCallMonitoringReturn, type UseClickToCallReturn, type UseClickToConferenceReturn, type UseEndCallReturn, type UseLogoutReturn, changeMonitorMode, clickToCall, clickToConference, endCall, getSDKVersion, initSDK, isSDKInitialized, logout, sdkStateManager, setAuditReportUrlResolver, setTransferLeadData, startMonitoring, stopMonitoring, useCallMonitoring, useClickToCall, useClickToConference, useEndCall, useGetAuthorizationToken, useGetCallerData, useLogout, useSDKPermissions, useSDKState };
|
package/dist/index.d.ts
CHANGED
|
@@ -641,6 +641,59 @@ declare const SDKPages: {
|
|
|
641
641
|
readonly CaroQualityAuditDashboard: React.ComponentType<any>;
|
|
642
642
|
};
|
|
643
643
|
|
|
644
|
+
/**
|
|
645
|
+
* 🧾 Audit Report Dialog
|
|
646
|
+
*
|
|
647
|
+
* @description Stand-alone dialog component that renders the call audit report.
|
|
648
|
+
* Pass either a full CDR `rowData` or a bare `callUuid`. The "maximize" action
|
|
649
|
+
* uses the globally-configured URL resolver unless `onMaximize` is provided.
|
|
650
|
+
*
|
|
651
|
+
* @since 1.0.0
|
|
652
|
+
* @author CTI SDK Team
|
|
653
|
+
*/
|
|
654
|
+
interface AuditReportDialogProps {
|
|
655
|
+
open: boolean;
|
|
656
|
+
onClose: () => void;
|
|
657
|
+
width?: string;
|
|
658
|
+
/** Full CDR row to audit. */
|
|
659
|
+
rowData?: Record<string, any>;
|
|
660
|
+
/** Bare call id to audit. Takes precedence over `rowData.callUuid`. */
|
|
661
|
+
callUuid?: string;
|
|
662
|
+
/** Per-instance override of the maximize behaviour. */
|
|
663
|
+
onMaximize?: (callUuid: string) => void;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
declare const AuditReportDialog: React.ComponentType<AuditReportDialogProps>;
|
|
667
|
+
|
|
668
|
+
/** Resolver that maps a call id to the URL opened by the audit report "maximize" action. */
|
|
669
|
+
type AuditReportUrlResolver = (callUuid: string) => string;
|
|
670
|
+
|
|
671
|
+
/** Register a global resolver for the audit report "maximize" action. Call once at startup. */
|
|
672
|
+
declare function setAuditReportUrlResolver(resolver: AuditReportUrlResolver): void;
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* 👤 Agent Detail Report
|
|
676
|
+
*
|
|
677
|
+
* @description Stand-alone (full-page) agent detail report component. Can be
|
|
678
|
+
* rendered directly (e.g. via a route) instead of through {@link SDKPages}.
|
|
679
|
+
*
|
|
680
|
+
* @since 1.0.0
|
|
681
|
+
* @author CTI SDK Team
|
|
682
|
+
*/
|
|
683
|
+
interface AgentDetailReportProps {
|
|
684
|
+
/** The agent/report row to render details for. */
|
|
685
|
+
agentRow?: Record<string, any> | null;
|
|
686
|
+
onBack?: () => void;
|
|
687
|
+
from?: "REPORTS_LIST" | string;
|
|
688
|
+
/** Initial start date (a Dayjs instance). */
|
|
689
|
+
initialStartDate?: any;
|
|
690
|
+
/** Initial end date (a Dayjs instance). */
|
|
691
|
+
initialEndDate?: any;
|
|
692
|
+
initialQuickRange?: string;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
declare const AgentDetailReport: React.ComponentType<AgentDetailReportProps>;
|
|
696
|
+
|
|
644
697
|
// =============================================================================
|
|
645
698
|
// 🗃️ TYPE EXPORTS
|
|
646
699
|
// =============================================================================
|
|
@@ -2480,5 +2533,5 @@ interface SDKAccessDeniedProps {
|
|
|
2480
2533
|
|
|
2481
2534
|
declare const SDKAccessDenied: React.FC<SDKAccessDeniedProps>;
|
|
2482
2535
|
|
|
2483
|
-
export type { APIResponse, AgentStatus, CallControlPanelProps, CallData, CallInitiationFunction, CallTerminationFunction, ChangeModePayload, CleanupOperation, ConferenceCallPayload, ConferenceLine, ControlsFromPermissions, DispositionType, EndCallData, EndCallPayLoadData, EndCallPayload, ErrorResponse, FollowUpType, HookStateTypes, InitSDKParams, LiveStatusPageProps, LogoutFunction, LogoutHookStateTypes, LogoutPayload, ProcessData, SDKAccessDeniedProps, SDKBit, SDKConfig, SDKEntitlement, SDKEntitlements, SDKInitResult, SDKPermissionContextValue, SDKPermissionGuardProps, SDKPermissionState, SDKPermissionsHook, SDKState, StartCallPayload, StartCalltData, StartCalltHookStateTypes, StartMonitoringPayload, StopMonitoringPayload, StorageType, SupervisorMonitorMode, URLConfig, UseCallMonitoringReturn, UseClickToCallReturn, UseClickToConferenceReturn, UseEndCallReturn, UseLogoutReturn }
|
|
2484
|
-
export { CallControlPanel, SDKAccessDenied, SDKPages, SDKPermissionGuard, SDKStateManager, SDK_MENU_CODES, SDK_PERMISSIONS, SDK_WILDCARD, changeMonitorMode, clickToCall, clickToConference, endCall, getSDKVersion, initSDK, isSDKInitialized, logout, sdkStateManager, setTransferLeadData, startMonitoring, stopMonitoring, useCallMonitoring, useClickToCall, useClickToConference, useEndCall, useGetAuthorizationToken, useGetCallerData, useLogout, useSDKPermissions, useSDKState };
|
|
2536
|
+
export type { APIResponse, AgentDetailReportProps, AgentStatus, AuditReportDialogProps, AuditReportUrlResolver, CallControlPanelProps, CallData, CallInitiationFunction, CallTerminationFunction, ChangeModePayload, CleanupOperation, ConferenceCallPayload, ConferenceLine, ControlsFromPermissions, DispositionType, EndCallData, EndCallPayLoadData, EndCallPayload, ErrorResponse, FollowUpType, HookStateTypes, InitSDKParams, LiveStatusPageProps, LogoutFunction, LogoutHookStateTypes, LogoutPayload, ProcessData, SDKAccessDeniedProps, SDKBit, SDKConfig, SDKEntitlement, SDKEntitlements, SDKInitResult, SDKPermissionContextValue, SDKPermissionGuardProps, SDKPermissionState, SDKPermissionsHook, SDKState, StartCallPayload, StartCalltData, StartCalltHookStateTypes, StartMonitoringPayload, StopMonitoringPayload, StorageType, SupervisorMonitorMode, URLConfig, UseCallMonitoringReturn, UseClickToCallReturn, UseClickToConferenceReturn, UseEndCallReturn, UseLogoutReturn }
|
|
2537
|
+
export { AgentDetailReport, AuditReportDialog, CallControlPanel, SDKAccessDenied, SDKPages, SDKPermissionGuard, SDKStateManager, SDK_MENU_CODES, SDK_PERMISSIONS, SDK_WILDCARD, changeMonitorMode, clickToCall, clickToConference, endCall, getSDKVersion, initSDK, isSDKInitialized, logout, sdkStateManager, setAuditReportUrlResolver, setTransferLeadData, startMonitoring, stopMonitoring, useCallMonitoring, useClickToCall, useClickToConference, useEndCall, useGetAuthorizationToken, useGetCallerData, useLogout, useSDKPermissions, useSDKState };
|
package/dist/index.js
CHANGED
|
@@ -131702,11 +131702,6 @@ function AgentDetailReportContent({ agentRow: propAgentRow, onBack, from: from3,
|
|
|
131702
131702
|
setBreaksLoading(false);
|
|
131703
131703
|
}
|
|
131704
131704
|
}, [agentIdFromRow, startDate, endDate]);
|
|
131705
|
-
const openBreaksDialog = async () => {
|
|
131706
|
-
if (!agentIdFromRow) return;
|
|
131707
|
-
setBreaksDialogOpen(true);
|
|
131708
|
-
await loadBreakSessions();
|
|
131709
|
-
};
|
|
131710
131705
|
const closeBreaksDialog = () => {
|
|
131711
131706
|
setBreaksDialogOpen(false);
|
|
131712
131707
|
};
|