ahs-cti 1.0.1-beta.44 → 1.0.1-beta.45

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.
@@ -75,9 +75,9 @@ import {
75
75
  } from "@mui/material";
76
76
  import { alpha } from "@mui/material/styles";
77
77
  import CloseIcon from "@mui/icons-material/Close";
78
- import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutline";
78
+ import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutlined";
79
79
  import HighlightOffIcon from "@mui/icons-material/HighlightOff";
80
- import RemoveCircleOutlineIcon from "@mui/icons-material/RemoveCircleOutline";
80
+ import RemoveCircleOutlineIcon from "@mui/icons-material/RemoveCircleOutlined";
81
81
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
82
82
  var STATUS_COLOUR = {
83
83
  completed: { color: "#2e7d32", bg: "#e8f5e9" },
@@ -1905,4 +1905,4 @@ var cdrReport_default = CdrReport;
1905
1905
  export {
1906
1906
  cdrReport_default as default
1907
1907
  };
1908
- //# sourceMappingURL=cdrReport-DCAAYJN2.mjs.map
1908
+ //# sourceMappingURL=cdrReport-LU7QZHKZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../call-control-sdk/lib/pages/cdrReport/index.tsx","../call-control-sdk/lib/pages/common/components/AuditReport.tsx","../call-control-sdk/lib/pages/cdrReport/useCdrReport.ts"],"sourcesContent":["import React, {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport {\r\n Alert,\r\n Box,\r\n Chip,\r\n Paper,\r\n Stack,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n TablePagination,\r\n TableSortLabel,\r\n CircularProgress,\r\n IconButton,\r\n Tooltip,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport AuditReportDialog from \"../common/components/AuditReport\";\r\n\r\nimport ReportFilterBar, {\r\n type QuickRange,\r\n} from \"../common/components/ReportFilterBar\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport AssignmentIcon from \"@mui/icons-material/Assignment\";\r\n\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\n\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport {\r\n getCdrReport,\r\n exportCdrReportToExcel,\r\n getRecordingByCall,\r\n getQueues,\r\n type Queue,\r\n} from \"./useCdrReport\";\r\nimport { deepFindArray } from \"../../services/axios\";\r\nimport type { CdrReportParams, CdrRecordResponse } from \"./types\";\r\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\r\nimport { headCellSx } from \"../common/utils/tableStyles\";\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport SearchBar from \"../common/components/SearchBar\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\n\r\ndayjs.extend(isoWeek);\r\n\r\nconst FONT =\r\n \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n\r\nconst COLORS = {\r\n navy: \"#0d2a56\",\r\n blue: \"#1565c8\",\r\n green: \"#0a9a62\",\r\n amber: \"#c47c00\",\r\n red: \"#cc2a2a\",\r\n purple: \"#6b3fbf\",\r\n bg: \"transparent\",\r\n surface: \"transparent\",\r\n} as const;\r\n\r\nconst DEFAULT_PAGE_SIZE = 15;\r\n\r\ntype SortKey =\r\n | \"phoneNumber\"\r\n | \"callStartTime\"\r\n | \"callType\"\r\n | \"callStatus\"\r\n | \"agentName\"\r\n | \"queueName\"\r\n | \"extension\"\r\n | \"talkDurationFmt\"\r\n | \"holdDurationFmt\"\r\n | \"ringingDurationFmt\"\r\n | \"queueDurationFmt\"\r\n | \"wrapupDurationFmt\"\r\n | \"disposition\"\r\n | \"remarks\"\r\n | \"wasTransferred\";\r\n\r\ntype SortDir = \"asc\" | \"desc\";\r\n\r\nconst comparator = (\r\n a: CdrRecordResponse,\r\n b: CdrRecordResponse,\r\n key: SortKey,\r\n): number => {\r\n const av = a[key as keyof CdrRecordResponse];\r\n const bv = b[key as keyof CdrRecordResponse];\r\n if (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\r\n if (typeof av === \"boolean\" && typeof bv === \"boolean\")\r\n return (av ? 1 : 0) - (bv ? 1 : 0);\r\n return String(av ?? \"\").localeCompare(String(bv ?? \"\"));\r\n};\r\n\r\nfunction CallTypePill({ value }: { value: string }) {\r\n const v = (value || \"\").toLowerCase();\r\n let color = \"#6b7b8d\";\r\n let bg = \"transparent\";\r\n if (v.includes(\"inbound\")) {\r\n color = COLORS.green;\r\n bg = \"#e6f7ef\";\r\n } else if (v.includes(\"outbound\")) {\r\n color = COLORS.blue;\r\n bg = \"#e3eefa\";\r\n } else if (v.includes(\"internal\")) {\r\n color = COLORS.purple;\r\n bg = \"#f0e8ff\";\r\n }\r\n return (\r\n <Chip\r\n label={value}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n bgcolor: bg,\r\n color,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction StatusPill({ value }: { value: string }) {\r\n const v = (value || \"\").toLowerCase();\r\n let color = \"#6b7b8d\";\r\n let bg = \"transparent\";\r\n if (v.includes(\"answered\")) {\r\n color = COLORS.green;\r\n bg = \"#e6f7ef\";\r\n } else if (v.includes(\"abandoned\") || v.includes(\"missed\")) {\r\n color = COLORS.red;\r\n bg = \"#fce8e8\";\r\n }\r\n return (\r\n <Chip\r\n label={value}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n bgcolor: bg,\r\n color,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n );\r\n}\r\n\r\nfunction RecordingCell({\r\n callUuid,\r\n recordingPath,\r\n}: {\r\n callUuid: string;\r\n recordingPath: string | null;\r\n}) {\r\n const [audioUrl, setAudioUrl] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(false);\r\n const unavailable = recordingPath === null;\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={() => {\r\n if (audioUrl.startsWith(\"blob:\")) URL.revokeObjectURL(audioUrl);\r\n setAudioUrl(null);\r\n }}\r\n style={{ width: 180, height: 30 }}\r\n />\r\n <Tooltip title=\"Download\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDownload}\r\n sx={{ color: COLORS.blue, p: 0.4 }}\r\n >\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.3 }}>\r\n <Tooltip title={unavailable || error ? \"Recording Unavailable\" : \"Play\"}>\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handlePlay}\r\n disabled={loading || error || unavailable}\r\n sx={{ color: unavailable ? \"#b0b8c8\" : COLORS.green, p: 0.4 }}\r\n >\r\n {loading ? (\r\n <CircularProgress size={14} />\r\n ) : (\r\n <PlayArrowIcon sx={{ fontSize: 16 }} />\r\n )}\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n <Tooltip\r\n title={unavailable || error ? \"Recording Unavailable\" : \"Download\"}\r\n >\r\n <span>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleDownload}\r\n disabled={loading || error || unavailable}\r\n sx={{ color: unavailable ? \"#b0b8c8\" : COLORS.blue, p: 0.4 }}\r\n >\r\n <FileDownloadIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </span>\r\n </Tooltip>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction CdrReportContent() {\r\n const [startDate, setStartDate] = useState<Dayjs | null>(\r\n dayjs().startOf(\"day\"),\r\n );\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [activeQuickDate, setActiveQuickDate] = useState<\r\n \"today\" | \"week\" | \"month\" | null\r\n >(\"today\");\r\n const [searchText, setSearchText] = useState(\"\");\r\n\r\n const [selectedAgents, setSelectedAgents] = useState<AgentOption[]>([]);\r\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\r\n\r\n const [queues, setQueues] = useState<Queue[]>([]);\r\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\r\n\r\n const [callType, setCallType] = useState<string>(\"\");\r\n const [callStatus, setCallStatus] = useState<string>(\"\");\r\n\r\n const [records, setRecords] = useState<CdrRecordResponse[]>([]);\r\n const [totalRecords, setTotalRecords] = useState(0);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n\r\n const [page, setPage] = useState(0);\r\n const [rowsPerPage, setRowsPerPage] = useState(DEFAULT_PAGE_SIZE);\r\n const [sortKey, setSortKey] = useState<SortKey>(\"callStartTime\");\r\n const [sortDir, setSortDir] = useState<SortDir>(\"desc\");\r\n\r\n const [auditDialogOpen, setAuditDialogOpen] = useState(false);\r\n const [selectedAuditRow, setSelectedAuditRow] =\r\n useState<CdrRecordResponse | null>(null);\r\n\r\n useEffect(() => {\r\n getQueues()\r\n .then((data) => setQueues(data || []))\r\n .catch(() => setError(\"Failed to load filter options\"));\r\n }, []);\r\n\r\n const handleQuickRangeChange = (range: QuickRange) => {\r\n setActiveQuickDate(range || null);\r\n };\r\n\r\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n debounceRef.current = setTimeout(\r\n () => setDebouncedSearch(searchText.trim()),\r\n 400,\r\n );\r\n return () => clearTimeout(debounceRef.current);\r\n }, [searchText]);\r\n\r\n const fetchReport = useCallback(\r\n async (pageNum: number) => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n\r\n if (!sd || !ed) {\r\n setError(\"Select a valid date range\");\r\n return;\r\n }\r\n\r\n const params: CdrReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id:\r\n !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.id)\r\n : undefined,\r\n // All queues selected → send no queue_id (backend returns all).\r\n queue_id:\r\n selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n call_type: callType || undefined,\r\n status: callStatus || undefined,\r\n search: debouncedSearch || undefined,\r\n page: pageNum + 1,\r\n pageSize: rowsPerPage,\r\n };\r\n\r\n try {\r\n setError(\"\");\r\n setLoading(true);\r\n const response: any = await getCdrReport(params);\r\n setRecords(\r\n deepFindArray<CdrRecordResponse>(response, [\"data\", \"records\"]),\r\n );\r\n setTotalRecords(\r\n response?.records?.total ??\r\n response?.total ??\r\n response?.data?.total ??\r\n 0,\r\n );\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to fetch CDR report\");\r\n setRecords([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [\r\n startDate,\r\n endDate,\r\n selectedAgents,\r\n isAllUsersSelected,\r\n selectedQueues,\r\n callType,\r\n callStatus,\r\n debouncedSearch,\r\n rowsPerPage,\r\n ],\r\n );\r\n\r\n useEffect(() => {\r\n setPage(0);\r\n fetchReport(0);\r\n }, [fetchReport]);\r\n\r\n const handleRefresh = () => {\r\n if (activeQuickDate) {\r\n const now = dayjs();\r\n let sd = now.startOf(\"day\");\r\n const ed = now;\r\n if (activeQuickDate === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\r\n else if (activeQuickDate === \"month\")\r\n sd = now.startOf(\"month\").startOf(\"day\");\r\n setStartDate(sd);\r\n setEndDate(ed);\r\n } else {\r\n fetchReport(page);\r\n }\r\n };\r\n\r\n const handlePageChange = useCallback(\r\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n setPage(newPage);\r\n fetchReport(newPage);\r\n },\r\n [fetchReport],\r\n );\r\n\r\n const handleSort = (key: SortKey) => {\r\n if (sortKey === key) {\r\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n } else {\r\n setSortKey(key);\r\n setSortDir(\"asc\");\r\n }\r\n };\r\n\r\n const sortedRecords = useMemo(() => {\r\n const rows = [...records];\r\n rows.sort((a, b) => {\r\n const cmp = comparator(a, b, sortKey);\r\n return sortDir === \"asc\" ? cmp : -cmp;\r\n });\r\n return rows;\r\n }, [records, sortKey, sortDir]);\r\n\r\n const handleExportExcel = async () => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n const params: CdrReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id:\r\n !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.id)\r\n : undefined,\r\n queue_id:\r\n selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n call_type: callType || undefined,\r\n status: callStatus || undefined,\r\n search: debouncedSearch || undefined,\r\n };\r\n try {\r\n await exportCdrReportToExcel(params);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n };\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box\r\n sx={{\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n fontFamily: FONT,\r\n }}\r\n >\r\n <PageHeader\r\n title=\"CDR Report\"\r\n actions={\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n <SearchBar\r\n value={searchText}\r\n onChange={setSearchText}\r\n placeholder=\"Search phone, agent...\"\r\n width={250}\r\n />\r\n <SDKPermissionGuard\r\n permissions={[\r\n SDK_PERMISSIONS.REPORTS_CDR_EXPORT,\r\n SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n ]}\r\n showFallback={false}\r\n >\r\n <AppButton\r\n startIcon={\r\n <DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />\r\n }\r\n disabled={!records.length}\r\n onClick={handleExportExcel}\r\n sx={{ height: 36 }}\r\n >\r\n Export Excel\r\n </AppButton>\r\n </SDKPermissionGuard>\r\n </Stack>\r\n }\r\n />\r\n\r\n <Box sx={{ flex: 1, overflow: \"auto\", py: 0.8, px: 0 }}>\r\n <Box sx={{ mb: 0.8 }}>\r\n <ReportFilterBar\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n quickRange={activeQuickDate || \"\"}\r\n onQuickRangeChange={handleQuickRangeChange}\r\n showAgentSelect\r\n selectedAgents={selectedAgents}\r\n onAgentsChange={setSelectedAgents}\r\n setIsAllUsersSelected={setIsAllUsersSelected}\r\n showQueueSelect\r\n queues={queues}\r\n selectedQueues={selectedQueues}\r\n onQueuesChange={setSelectedQueues}\r\n showCallTypeSelect\r\n selectedCallType={callType}\r\n onCallTypeChange={setCallType}\r\n showStatusSelect\r\n selectedStatus={callStatus}\r\n onStatusChange={setCallStatus}\r\n extra={\r\n <AppButton\r\n startIcon={\r\n <RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />\r\n }\r\n disabled={loading}\r\n onClick={handleRefresh}\r\n sx={{ height: 32 }}\r\n >\r\n Refresh\r\n </AppButton>\r\n }\r\n />\r\n\r\n {error && (\r\n <Alert\r\n severity=\"error\"\r\n sx={{ mt: 1, fontFamily: FONT, fontSize: \"0.78rem\" }}\r\n >\r\n {error}\r\n </Alert>\r\n )}\r\n </Box>\r\n\r\n {loading && (\r\n <Box sx={{ textAlign: \"center\", py: 2.5 }}>\r\n <CircularProgress sx={{ color: COLORS.blue }} size={28} />\r\n </Box>\r\n )}\r\n\r\n <Paper\r\n elevation={0}\r\n sx={{\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e0e7ef\",\r\n overflow: \"hidden\",\r\n mb: 2,\r\n }}\r\n >\r\n <TableContainer>\r\n <Table\r\n size=\"small\"\r\n sx={{\r\n minWidth: 1400,\r\n fontFamily: FONT,\r\n \"& .MuiTableCell-root\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.75rem\",\r\n borderBottom: \"1px solid #eef1f6\",\r\n py: 0.6,\r\n px: 1,\r\n },\r\n }}\r\n >\r\n <TableHead>\r\n <TableRow>\r\n {(\r\n [\r\n { id: \"phoneNumber\" as SortKey, label: \"Phone Number\" },\r\n { id: \"callStartTime\" as SortKey, label: \"Call Start\" },\r\n { id: \"callType\" as SortKey, label: \"Call Type\" },\r\n { id: \"callStatus\" as SortKey, label: \"Status\" },\r\n { id: \"agentName\" as SortKey, label: \"User Name\" },\r\n { id: \"queueName\" as SortKey, label: \"Queues\" },\r\n { id: \"extension\" as SortKey, label: \"Extension\" },\r\n {\r\n id: \"talkDurationFmt\" as SortKey,\r\n label: \"Talk Duration\",\r\n },\r\n {\r\n id: \"holdDurationFmt\" as SortKey,\r\n label: \"Hold Duration\",\r\n },\r\n {\r\n id: \"ringingDurationFmt\" as SortKey,\r\n label: \"Ringing Duration\",\r\n },\r\n {\r\n id: \"queueDurationFmt\" as SortKey,\r\n label: \"Queue Duration\",\r\n },\r\n {\r\n id: \"wrapupDurationFmt\" as SortKey,\r\n label: \"Wrapup Duration\",\r\n },\r\n { id: \"disposition\" as SortKey, label: \"Disposition\" },\r\n { id: \"remarks\" as SortKey, label: \"Remarks\" },\r\n {\r\n id: \"wasTransferred\" as SortKey,\r\n label: \"Transferred\",\r\n },\r\n ] as { id: SortKey; label: string }[]\r\n ).map((col) => (\r\n <TableCell key={col.id} sx={headCellSx}>\r\n <TableSortLabel\r\n active={sortKey === col.id}\r\n direction={sortKey === col.id ? sortDir : \"asc\"}\r\n onClick={() => handleSort(col.id)}\r\n sx={{\r\n \"&.MuiTableSortLabel-root\": { color: \"#333\" },\r\n \"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\r\n \"&.Mui-active\": { color: \"#333\" },\r\n \"& .MuiTableSortLabel-icon\": {\r\n color: \"#333 !important\",\r\n },\r\n }}\r\n >\r\n {col.label}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n <TableCell\r\n sx={{ ...(headCellSx as object), minWidth: 220 }}\r\n >\r\n Recording\r\n </TableCell>\r\n <TableCell\r\n sx={{ ...(headCellSx as object), minWidth: 110 }}\r\n >\r\n Audit Report\r\n </TableCell>\r\n </TableRow>\r\n </TableHead>\r\n\r\n <TableBody>\r\n {sortedRecords.map((row, idx) => (\r\n <TableRow\r\n key={row.callUuid || idx}\r\n hover\r\n sx={{\r\n backgroundColor: \"#fff\",\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n }}\r\n >\r\n <TableCell\r\n sx={{\r\n fontWeight: 600,\r\n color: COLORS.navy,\r\n fontSize: \"0.75rem\",\r\n }}\r\n >\r\n {row.phoneNumber || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.callStartTime\r\n ? dayjs(row.callStartTime).format(\r\n \"DD MMM YYYY hh:mm A\",\r\n )\r\n : \"\"}\r\n </TableCell>\r\n <TableCell>\r\n <CallTypePill value={row.callType || \"\"} />\r\n </TableCell>\r\n <TableCell>\r\n <StatusPill value={row.callStatus || \"\"} />\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.agentName || \"\"}\r\n </TableCell>\r\n <TableCell>\r\n {row.queueName ? (\r\n <Chip\r\n label={row.queueName}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#f0ebfa\",\r\n color: COLORS.purple,\r\n fontWeight: 500,\r\n fontSize: \"0.67rem\",\r\n height: 22,\r\n }}\r\n />\r\n ) : null}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.extension || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 600,\r\n color: COLORS.blue,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.talkDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n color: COLORS.amber,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.holdDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.ringingDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.queueDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n fontWeight: 500,\r\n fontSize: \"0.75rem\",\r\n fontVariantNumeric: \"tabular-nums\",\r\n }}\r\n >\r\n {row.wrapupDurationFmt || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.disposition || \"\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.remarks ? (\r\n <Tooltip title={row.remarks}>\r\n <span\r\n style={{\r\n display: \"inline-block\",\r\n maxWidth: 180,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n verticalAlign: \"bottom\",\r\n }}\r\n >\r\n {row.remarks}\r\n </span>\r\n </Tooltip>\r\n ) : (\r\n \"\"\r\n )}\r\n </TableCell>\r\n <TableCell>\r\n {row.wasTransferred ? (\r\n <Chip\r\n label=\"Yes\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#e6f7ef\",\r\n color: COLORS.green,\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n ) : (\r\n <Chip\r\n label=\"No\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"transparent\",\r\n color: \"#6b7b8d\",\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n borderRadius: \"6px\",\r\n }}\r\n />\r\n )}\r\n </TableCell>\r\n <TableCell>\r\n {row.callUuid ? (\r\n <RecordingCell\r\n callUuid={row.callUuid}\r\n recordingPath={row.recordingPath}\r\n />\r\n ) : null}\r\n </TableCell>\r\n <TableCell>\r\n <Tooltip title=\"View Audit Report\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => {\r\n setSelectedAuditRow(row);\r\n setAuditDialogOpen(true);\r\n }}\r\n sx={{ color: COLORS.blue, p: 0.4 }}\r\n >\r\n <AssignmentIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n\r\n <TablePagination\r\n component=\"div\"\r\n count={totalRecords}\r\n page={page}\r\n onPageChange={handlePageChange}\r\n rowsPerPage={rowsPerPage}\r\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\r\n onRowsPerPageChange={(e) => {\r\n setRowsPerPage(parseInt(e.target.value, 10));\r\n setPage(0);\r\n }}\r\n sx={{\r\n borderTop: \"1px solid #eef1f6\",\r\n fontFamily: FONT,\r\n \"& .MuiTablePagination-displayedRows\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.73rem\",\r\n },\r\n \"& .MuiTablePagination-selectLabel\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.73rem\",\r\n },\r\n }}\r\n />\r\n </Paper>\r\n </Box>\r\n </Box>\r\n\r\n <AuditReportDialog\r\n open={auditDialogOpen}\r\n onClose={() => {\r\n setAuditDialogOpen(false);\r\n setSelectedAuditRow(null);\r\n }}\r\n rowData={selectedAuditRow ?? undefined}\r\n />\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst CdrReport: React.FC = () => (\r\n <SDKProvider>\r\n <CdrReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default CdrReport;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport {\r\n Box,\r\n Typography,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Tabs,\r\n Tab,\r\n LinearProgress,\r\n useTheme,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n IconButton,\r\n GlobalStyles,\r\n CircularProgress,\r\n Alert,\r\n} from \"@mui/material\";\r\nimport { alpha } from \"@mui/material/styles\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport CheckCircleOutlineIcon from \"@mui/icons-material/CheckCircleOutlined\";\r\nimport HighlightOffIcon from \"@mui/icons-material/HighlightOff\";\r\nimport RemoveCircleOutlineIcon from \"@mui/icons-material/RemoveCircleOutlined\";\r\nimport axiosInstance from \"../../../services/axios\";\r\nimport { END_POINT } from \"../../../services/endPoint\";\r\nimport type { CdrRecordResponse } from \"../../cdrReport/types\";\r\n\r\nexport type CellRender = \"text\" | \"badge\" | \"status-icon-badge\" | \"progress\";\r\nexport type CellValue = string | number | ProgressValue;\r\nexport interface ProgressValue {\r\n score: number;\r\n max: number;\r\n}\r\n\r\nexport interface TableColumn {\r\n key: string;\r\n label: string;\r\n render?: CellRender;\r\n align?: \"left\" | \"center\" | \"right\";\r\n minWidth?: number | string;\r\n}\r\n\r\nexport interface TableContent {\r\n type: \"table\";\r\n title?: string;\r\n columns: TableColumn[];\r\n rows: Array<Record<string, CellValue>>;\r\n /** Optional summary row rendered with emphasis at the bottom. */\r\n footerRow?: Record<string, CellValue>;\r\n}\r\n\r\nexport interface KVGridContent {\r\n type: \"kv-grid\";\r\n title?: string;\r\n items: Array<{ label: string; value: string }>;\r\n /** Number of label-value columns. Defaults to 2. */\r\n columns?: 1 | 2 | 3;\r\n}\r\n\r\nexport interface ScoreWithMetricsContent {\r\n type: \"score-with-metrics\";\r\n score: number;\r\n maxScore: number;\r\n scoreLabel?: string;\r\n /** Rendered as a StatusBadge alongside the score. */\r\n resultBadge?: string;\r\n /** Metric cards rendered to the right of the score. */\r\n metrics: Array<{ label: string; value: string }>;\r\n}\r\n\r\nexport interface TextContent {\r\n type: \"text\";\r\n title?: string;\r\n body: string;\r\n /** \"accent\" adds a left border in the primary colour. */\r\n variant?: \"default\" | \"accent\";\r\n}\r\n\r\nexport interface BulletGroupContent {\r\n type: \"bullet-group\";\r\n title?: string;\r\n /** Side-by-side bullet lists. */\r\n groups: Array<{\r\n title: string;\r\n items: string[];\r\n bulletColor?: string;\r\n }>;\r\n}\r\nexport type SectionContent =\r\n | TableContent\r\n | KVGridContent\r\n | ScoreWithMetricsContent\r\n | TextContent\r\n | BulletGroupContent;\r\n\r\nexport interface ReportSection {\r\n id: string;\r\n /** Tab label. */\r\n label: string;\r\n content: SectionContent[];\r\n}\r\n\r\nexport interface AuditReportDialogData {\r\n title: string;\r\n subtitle?: string;\r\n headerBadges?: Array<{ label: string; value: string; asBadge?: boolean }>;\r\n sections?: ReportSection[];\r\n // Call_Summary?: string;\r\n}\r\n\r\n// const MOCK_AUDIT_REPORT: AuditReportDialogData = {\r\n// title: \"Audit Report\",\r\n// subtitle: \"Priya · Apollo Hospitals – Hyderabad · 28-May-2026\",\r\n// headerBadges: [\r\n// {\r\n// label: \"Call Disposition\",\r\n// value: \"Appointment Booking – Existing Patient\",\r\n// },\r\n// { label: \"Result\", value: \"PASS\", asBadge: true },\r\n// { label: \"Score\", value: \"94/100\" },\r\n// ],\r\n// sections: [\r\n// {\r\n// id: \"overview\",\r\n// label: \"Overview\",\r\n// content: [\r\n// {\r\n// type: \"score-with-metrics\",\r\n// score: 94,\r\n// maxScore: 100,\r\n// scoreLabel: \"OVERALL SCORE\",\r\n// resultBadge: \"PASS\",\r\n// metrics: [\r\n// { label: \"Audit Result\", value: \"PASS\" },\r\n// { label: \"Compliance Status\", value: \"COMPLIANT\" },\r\n// { label: \"First Call Resolution\", value: \"ACHIEVED\" },\r\n// { label: \"Customer Experience\", value: \"GOOD\" },\r\n// { label: \"Process Adherence\", value: \"STRONG\" },\r\n// { label: \"Communication\", value: \"STRONG\" },\r\n// { label: \"Knowledge Accuracy\", value: \"STRONG\" },\r\n// { label: \"Empathy Handling\", value: \"MODERATE\" },\r\n// { label: \"Risk Severity\", value: \"LOW\" },\r\n// ],\r\n// },\r\n// {\r\n// type: \"kv-grid\",\r\n// title: \"Audit Metadata\",\r\n// columns: 2,\r\n// items: [\r\n// { label: \"Hospital Name\", value: \"Apollo Hospitals – Hyderabad\" },\r\n// { label: \"Call Duration\", value: \"Approx. 03:30 Minutes\" },\r\n// { label: \"Department\", value: \"Central Appointment Desk\" },\r\n// { label: \"Agent Name\", value: \"Priya\" },\r\n// {\r\n// label: \"Call Disposition\",\r\n// value: \"Appointment Booking – Existing Patient\",\r\n// },\r\n// { label: \"Employee ID\", value: \"Not Available\" },\r\n// { label: \"Call Category\", value: \"General Medicine OPD\" },\r\n// { label: \"Team Leader\", value: \"Not Available\" },\r\n// { label: \"Call Type\", value: \"Inbound\" },\r\n// { label: \"Auditor Name\", value: \"QA Team\" },\r\n// { label: \"Audit Date\", value: \"28-May-2026\" },\r\n// { label: \"Language\", value: \"English\" },\r\n// { label: \"Call Date & Time\", value: \"Not Available\" },\r\n// { label: \"Recording ID\", value: \"Not Available\" },\r\n// ],\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// id: \"scorecard\",\r\n// label: \"Scorecard\",\r\n// content: [\r\n// {\r\n// type: \"table\",\r\n// title: \"Quality Scorecard\",\r\n// columns: [\r\n// { key: \"parameter\", label: \"Evaluation Parameter\" },\r\n// {\r\n// key: \"weightage\",\r\n// label: \"Weightage\",\r\n// align: \"center\",\r\n// minWidth: 90,\r\n// },\r\n// {\r\n// key: \"scoreObtained\",\r\n// label: \"Score\",\r\n// align: \"center\",\r\n// minWidth: 80,\r\n// },\r\n// { key: \"bar\", label: \"\", render: \"progress\", minWidth: 120 },\r\n// { key: \"remarks\", label: \"Remarks\" },\r\n// ],\r\n// rows: [\r\n// {\r\n// parameter: \"Opening & Greeting\",\r\n// weightage: 10,\r\n// scoreObtained: 10,\r\n// bar: { score: 10, max: 10 },\r\n// remarks: \"Fully compliant\",\r\n// },\r\n// {\r\n// parameter: \"Verification & Authentication\",\r\n// weightage: 10,\r\n// scoreObtained: 9,\r\n// bar: { score: 9, max: 10 },\r\n// remarks: \"Secondary verification missed\",\r\n// },\r\n// {\r\n// parameter: \"Communication & Soft Skills\",\r\n// weightage: 15,\r\n// scoreObtained: 14,\r\n// bar: { score: 14, max: 15 },\r\n// remarks: \"Clear and professional\",\r\n// },\r\n// {\r\n// parameter: \"Process Knowledge\",\r\n// weightage: 20,\r\n// scoreObtained: 19,\r\n// bar: { score: 19, max: 20 },\r\n// remarks: \"Strong workflow adherence\",\r\n// },\r\n// {\r\n// parameter: \"Resolution Accuracy\",\r\n// weightage: 20,\r\n// scoreObtained: 20,\r\n// bar: { score: 20, max: 20 },\r\n// remarks: \"Accurate booking completed\",\r\n// },\r\n// {\r\n// parameter: \"Empathy & Patient Assurance\",\r\n// weightage: 10,\r\n// scoreObtained: 7,\r\n// bar: { score: 7, max: 10 },\r\n// remarks: \"Emotional reassurance missing\",\r\n// },\r\n// {\r\n// parameter: \"Call Handling & Probing\",\r\n// weightage: 5,\r\n// scoreObtained: 4,\r\n// bar: { score: 4, max: 5 },\r\n// remarks: \"Limited symptom probing\",\r\n// },\r\n// {\r\n// parameter: \"CRM Documentation Alignment\",\r\n// weightage: 5,\r\n// scoreObtained: 5,\r\n// bar: { score: 5, max: 5 },\r\n// remarks: \"Proper disposition assumed\",\r\n// },\r\n// {\r\n// parameter: \"Closing & Customer Education\",\r\n// weightage: 5,\r\n// scoreObtained: 4,\r\n// bar: { score: 4, max: 5 },\r\n// remarks: \"Good closure; recontact guidance missed\",\r\n// },\r\n// ],\r\n// footerRow: {\r\n// parameter: \"Total Score\",\r\n// weightage: 100,\r\n// scoreObtained: 93,\r\n// bar: { score: 93, max: 100 },\r\n// remarks: \"EXCELLENT\",\r\n// },\r\n// },\r\n// {\r\n// type: \"table\",\r\n// title: \"Disposition-Based Quality Framework\",\r\n// columns: [\r\n// {\r\n// key: \"dispositionType\",\r\n// label: \"Disposition Type\",\r\n// minWidth: 160,\r\n// },\r\n// {\r\n// key: \"expectedFramework\",\r\n// label: \"Expected Framework\",\r\n// minWidth: 200,\r\n// },\r\n// {\r\n// key: \"status\",\r\n// label: \"Status\",\r\n// render: \"status-icon-badge\",\r\n// minWidth: 120,\r\n// },\r\n// { key: \"remarks\", label: \"Remarks\" },\r\n// ],\r\n// rows: [\r\n// {\r\n// dispositionType: \"Appointment Booking\",\r\n// expectedFramework: \"Patient Verification\",\r\n// status: \"completed\",\r\n// remarks: \"Existing patient validation performed\",\r\n// },\r\n// {\r\n// dispositionType: \"Appointment Booking\",\r\n// expectedFramework: \"Doctor & Slot Recommendation\",\r\n// status: \"completed\",\r\n// remarks: \"Appropriate slots offered\",\r\n// },\r\n// {\r\n// dispositionType: \"Appointment Booking\",\r\n// expectedFramework: \"Appointment Confirmation\",\r\n// status: \"completed\",\r\n// remarks: \"Booking details confirmed clearly\",\r\n// },\r\n// {\r\n// dispositionType: \"Appointment Booking\",\r\n// expectedFramework: \"SMS Confirmation Intimation\",\r\n// status: \"completed\",\r\n// remarks: \"SMS update communicated\",\r\n// },\r\n// {\r\n// dispositionType: \"Appointment Booking\",\r\n// expectedFramework: \"Pre-Visit Guidance\",\r\n// status: \"completed\",\r\n// remarks: \"Arrival instructions shared\",\r\n// },\r\n// {\r\n// dispositionType: \"Appointment Booking\",\r\n// expectedFramework: \"Cancellation/Rebooking Guidance\",\r\n// status: \"missed\",\r\n// remarks: \"No rebooking guidance provided\",\r\n// },\r\n// {\r\n// dispositionType: \"Appointment Booking\",\r\n// expectedFramework: \"Clinical Sensitivity Handling\",\r\n// status: \"partial\",\r\n// remarks: \"Symptom probing not performed\",\r\n// },\r\n// {\r\n// dispositionType: \"Appointment Booking\",\r\n// expectedFramework: \"Empathy Statement\",\r\n// status: \"missed\",\r\n// remarks: \"No empathetic acknowledgement used\",\r\n// },\r\n// ],\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// id: \"checklist\",\r\n// label: \"Audit Checklist\",\r\n// content: [\r\n// {\r\n// type: \"table\",\r\n// title: \"Opening & Greeting\",\r\n// columns: [\r\n// { key: \"parameter\", label: \"Audit Parameter\", minWidth: 180 },\r\n// {\r\n// key: \"expectedStandard\",\r\n// label: \"Expected Standard\",\r\n// minWidth: 200,\r\n// },\r\n// {\r\n// key: \"status\",\r\n// label: \"Status\",\r\n// render: \"status-icon-badge\",\r\n// minWidth: 130,\r\n// },\r\n// { key: \"remarks\", label: \"Remarks\", minWidth: 160 },\r\n// {\r\n// key: \"qaObservation\",\r\n// label: \"QA Observation / Impact\",\r\n// minWidth: 180,\r\n// },\r\n// ],\r\n// rows: [\r\n// {\r\n// parameter: \"Standard Greeting Used\",\r\n// expectedStandard:\r\n// \"Agent must greet as per approved hospital script\",\r\n// status: \"complied\",\r\n// remarks: \"Standard greeting delivered correctly\",\r\n// qaObservation:\r\n// \"Professional opening created positive first impression\",\r\n// },\r\n// {\r\n// parameter: \"Hospital Name Mentioned\",\r\n// expectedStandard: \"Mandatory hospital identification\",\r\n// status: \"complied\",\r\n// remarks: \"Apollo Hospitals mentioned clearly\",\r\n// qaObservation: \"Established caller confidence\",\r\n// },\r\n// {\r\n// parameter: \"Agent Introduction Provided\",\r\n// expectedStandard: \"Agent must introduce self\",\r\n// status: \"complied\",\r\n// remarks: \"Agent introduced herself as Priya\",\r\n// qaObservation: \"Maintained professional etiquette\",\r\n// },\r\n// {\r\n// parameter: \"Professional Tone Maintained\",\r\n// expectedStandard: \"Warm and professional tone expected\",\r\n// status: \"complied\",\r\n// remarks: \"Tone remained courteous throughout\",\r\n// qaObservation: \"Positive customer experience maintained\",\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// type: \"table\",\r\n// title: \"Verification & Authentication\",\r\n// columns: [\r\n// { key: \"parameter\", label: \"Audit Parameter\", minWidth: 180 },\r\n// {\r\n// key: \"expectedStandard\",\r\n// label: \"Expected Standard\",\r\n// minWidth: 200,\r\n// },\r\n// {\r\n// key: \"status\",\r\n// label: \"Status\",\r\n// render: \"status-icon-badge\",\r\n// minWidth: 130,\r\n// },\r\n// { key: \"remarks\", label: \"Remarks\", minWidth: 160 },\r\n// {\r\n// key: \"qaObservation\",\r\n// label: \"QA Observation / Impact\",\r\n// minWidth: 180,\r\n// },\r\n// ],\r\n// rows: [\r\n// {\r\n// parameter: \"Patient Name Captured\",\r\n// expectedStandard: \"Mandatory for identification\",\r\n// status: \"complied\",\r\n// remarks: \"Patient name confirmed\",\r\n// qaObservation: \"Proper patient identification followed\",\r\n// },\r\n// {\r\n// parameter: \"Existing/New Patient Validation\",\r\n// expectedStandard: \"Required for workflow routing\",\r\n// status: \"complied\",\r\n// remarks: \"Existing patient status verified\",\r\n// qaObservation: \"Correct workflow handling\",\r\n// },\r\n// {\r\n// parameter: \"Registered Mobile Number Verified\",\r\n// expectedStandard: \"Mandatory authentication step\",\r\n// status: \"complied\",\r\n// remarks: \"Mobile number validated\",\r\n// qaObservation: \"Compliance adherence maintained\",\r\n// },\r\n// {\r\n// parameter: \"Secondary Authentication (DOB/UHID)\",\r\n// expectedStandard: \"Recommended compliance practice\",\r\n// status: \"missed\",\r\n// remarks: \"DOB/UHID not validated\",\r\n// qaObservation: \"Minor compliance enhancement opportunity\",\r\n// },\r\n// {\r\n// parameter: \"Patient Data Handling\",\r\n// expectedStandard:\r\n// \"Confidential information to be handled securely\",\r\n// status: \"complied\",\r\n// remarks: \"No privacy concern observed\",\r\n// qaObservation: \"Low compliance risk\",\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// type: \"table\",\r\n// title: \"Communication Effectiveness\",\r\n// columns: [\r\n// { key: \"parameter\", label: \"Audit Parameter\", minWidth: 180 },\r\n// {\r\n// key: \"expectedStandard\",\r\n// label: \"Expected Standard\",\r\n// minWidth: 200,\r\n// },\r\n// {\r\n// key: \"status\",\r\n// label: \"Status\",\r\n// render: \"status-icon-badge\",\r\n// minWidth: 130,\r\n// },\r\n// { key: \"remarks\", label: \"Remarks\", minWidth: 160 },\r\n// {\r\n// key: \"qaObservation\",\r\n// label: \"QA Observation / Impact\",\r\n// minWidth: 180,\r\n// },\r\n// ],\r\n// rows: [\r\n// {\r\n// parameter: \"Clarity of Speech\",\r\n// expectedStandard: \"Clear and understandable communication\",\r\n// status: \"complied\",\r\n// remarks: \"Good articulation observed\",\r\n// qaObservation: \"Smooth patient interaction\",\r\n// },\r\n// {\r\n// parameter: \"Active Listening Demonstrated\",\r\n// expectedStandard: \"Agent should acknowledge caller inputs\",\r\n// status: \"complied\",\r\n// remarks: \"Patient concern handled attentively\",\r\n// qaObservation: \"Effective communication maintained\",\r\n// },\r\n// {\r\n// parameter: \"Avoidance of Dead Air\",\r\n// expectedStandard: \"Minimal silence during call\",\r\n// status: \"complied\",\r\n// remarks: \"Smooth conversational flow\",\r\n// qaObservation: \"Enhanced caller comfort\",\r\n// },\r\n// {\r\n// parameter: \"Professional Language Usage\",\r\n// expectedStandard: \"No slang/rude language\",\r\n// status: \"complied\",\r\n// remarks: \"Professional language maintained\",\r\n// qaObservation: \"Positive brand representation\",\r\n// },\r\n// {\r\n// parameter: \"Empathy Statements Used\",\r\n// expectedStandard: \"Emotional acknowledgement expected\",\r\n// status: \"missed\",\r\n// remarks: \"No empathy statement provided\",\r\n// qaObservation: \"Patient reassurance opportunity missed\",\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// type: \"table\",\r\n// title: \"Process & Workflow Adherence\",\r\n// columns: [\r\n// { key: \"parameter\", label: \"Audit Parameter\", minWidth: 180 },\r\n// {\r\n// key: \"expectedStandard\",\r\n// label: \"Expected Standard\",\r\n// minWidth: 200,\r\n// },\r\n// {\r\n// key: \"status\",\r\n// label: \"Status\",\r\n// render: \"status-icon-badge\",\r\n// minWidth: 130,\r\n// },\r\n// { key: \"remarks\", label: \"Remarks\", minWidth: 160 },\r\n// {\r\n// key: \"qaObservation\",\r\n// label: \"QA Observation / Impact\",\r\n// minWidth: 180,\r\n// },\r\n// ],\r\n// rows: [\r\n// {\r\n// parameter: \"Correct Department Identification\",\r\n// expectedStandard: \"Appropriate specialty mapping required\",\r\n// status: \"complied\",\r\n// remarks: \"General Medicine identified correctly\",\r\n// qaObservation: \"Strong process knowledge demonstrated\",\r\n// },\r\n// {\r\n// parameter: \"Doctor/Service Availability Checked\",\r\n// expectedStandard: \"Agent must provide available slots/services\",\r\n// status: \"complied\",\r\n// remarks: \"Two appointment slots offered\",\r\n// qaObservation: \"Efficient appointment handling\",\r\n// },\r\n// {\r\n// parameter: \"Appointment/Request Confirmation\",\r\n// expectedStandard: \"Explicit patient confirmation required\",\r\n// status: \"complied\",\r\n// remarks: \"5:30 PM slot confirmed\",\r\n// qaObservation: \"Accurate workflow execution\",\r\n// },\r\n// {\r\n// parameter: \"Resolution Accuracy\",\r\n// expectedStandard: \"Correct workflow execution mandatory\",\r\n// status: \"complied\",\r\n// remarks: \"Appointment booked successfully\",\r\n// qaObservation: \"FCR achieved\",\r\n// },\r\n// {\r\n// parameter: \"SMS / Ticket Confirmation Shared\",\r\n// expectedStandard: \"Customer confirmation mandatory\",\r\n// status: \"complied\",\r\n// remarks: \"SMS update communicated\",\r\n// qaObservation: \"Improved patient awareness\",\r\n// },\r\n// {\r\n// parameter: \"Pre-Visit / Next-Step Guidance Shared\",\r\n// expectedStandard: \"Appropriate instructions expected\",\r\n// status: \"complied\",\r\n// remarks: \"Asked patient to arrive 15 mins early\",\r\n// qaObservation: \"Good patient guidance\",\r\n// },\r\n// {\r\n// parameter: \"Cancellation/Rebooking Guidance Provided\",\r\n// expectedStandard: \"Recommended customer education practice\",\r\n// status: \"missed\",\r\n// remarks: \"No reschedule/cancellation guidance shared\",\r\n// qaObservation: \"Minor customer education gap\",\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// type: \"table\",\r\n// title: \"Clinical Sensitivity & Patient Handling\",\r\n// columns: [\r\n// { key: \"parameter\", label: \"Audit Parameter\", minWidth: 180 },\r\n// {\r\n// key: \"expectedStandard\",\r\n// label: \"Expected Standard\",\r\n// minWidth: 200,\r\n// },\r\n// {\r\n// key: \"status\",\r\n// label: \"Status\",\r\n// render: \"status-icon-badge\",\r\n// minWidth: 130,\r\n// },\r\n// { key: \"remarks\", label: \"Remarks\", minWidth: 160 },\r\n// {\r\n// key: \"qaObservation\",\r\n// label: \"QA Observation / Impact\",\r\n// minWidth: 180,\r\n// },\r\n// ],\r\n// rows: [\r\n// {\r\n// parameter: \"Patient Concern Acknowledged\",\r\n// expectedStandard: \"Agent should acknowledge caller concern\",\r\n// status: \"partial\",\r\n// remarks: \"Symptoms heard but not emotionally acknowledged\",\r\n// qaObservation: \"Moderate empathy gap observed\",\r\n// },\r\n// {\r\n// parameter: \"Empathy Toward Patient Condition\",\r\n// expectedStandard: \"Empathetic reassurance expected\",\r\n// status: \"missed\",\r\n// remarks: \"No supportive reassurance statement\",\r\n// qaObservation: \"Patient-centric experience opportunity missed\",\r\n// },\r\n// {\r\n// parameter: \"Severity/Red Flag Probing\",\r\n// expectedStandard:\r\n// \"Escalation probing recommended where applicable\",\r\n// status: \"missed\",\r\n// remarks: \"No symptom severity probing conducted\",\r\n// qaObservation: \"Potential clinical sensitivity gap\",\r\n// },\r\n// {\r\n// parameter: \"Professional Behaviour Maintained\",\r\n// expectedStandard: \"Calm and respectful handling required\",\r\n// status: \"complied\",\r\n// remarks: \"Professional tone maintained\",\r\n// qaObservation: \"Positive interaction maintained\",\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// type: \"table\",\r\n// title: \"Call Closure & Customer Education\",\r\n// columns: [\r\n// { key: \"parameter\", label: \"Audit Parameter\", minWidth: 180 },\r\n// {\r\n// key: \"expectedStandard\",\r\n// label: \"Expected Standard\",\r\n// minWidth: 200,\r\n// },\r\n// {\r\n// key: \"status\",\r\n// label: \"Status\",\r\n// render: \"status-icon-badge\",\r\n// minWidth: 130,\r\n// },\r\n// { key: \"remarks\", label: \"Remarks\", minWidth: 160 },\r\n// {\r\n// key: \"qaObservation\",\r\n// label: \"QA Observation / Impact\",\r\n// minWidth: 180,\r\n// },\r\n// ],\r\n// rows: [\r\n// {\r\n// parameter: \"Additional Assistance Offered\",\r\n// expectedStandard: \"Mandatory closure check\",\r\n// status: \"complied\",\r\n// remarks: \"Agent checked for additional help\",\r\n// qaObservation: \"Good closure adherence\",\r\n// },\r\n// {\r\n// parameter: \"Professional Closing Provided\",\r\n// expectedStandard: \"Standard closure etiquette expected\",\r\n// status: \"complied\",\r\n// remarks: \"Proper courtesy closing used\",\r\n// qaObservation: \"Positive closure experience\",\r\n// },\r\n// {\r\n// parameter: \"Wellness/Courtesy Statement Used\",\r\n// expectedStandard: \"Positive healthcare closure preferred\",\r\n// status: \"complied\",\r\n// remarks: '\"Wishing you a speedy recovery\" used',\r\n// qaObservation: \"Enhanced patient experience\",\r\n// },\r\n// {\r\n// parameter: \"Recontact Information Shared\",\r\n// expectedStandard: \"Helpline/rebooking guidance recommended\",\r\n// status: \"missed\",\r\n// remarks: \"No callback/rebooking information provided\",\r\n// qaObservation: \"Minor patient education gap\",\r\n// },\r\n// ],\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// id: \"compliance\",\r\n// label: \"Compliance\",\r\n// content: [\r\n// {\r\n// type: \"table\",\r\n// title: \"Critical Compliance & Risk Analysis\",\r\n// columns: [\r\n// { key: \"parameter\", label: \"Critical Parameter\" },\r\n// {\r\n// key: \"status\",\r\n// label: \"Status\",\r\n// render: \"badge\",\r\n// align: \"center\",\r\n// minWidth: 80,\r\n// },\r\n// {\r\n// key: \"riskLevel\",\r\n// label: \"Risk Level\",\r\n// render: \"badge\",\r\n// align: \"center\",\r\n// minWidth: 100,\r\n// },\r\n// { key: \"remarks\", label: \"Remarks\" },\r\n// ],\r\n// rows: [\r\n// {\r\n// parameter: \"Wrong Information Shared\",\r\n// status: \"NO\",\r\n// riskLevel: \"LOW\",\r\n// remarks: \"Correct appointment information provided\",\r\n// },\r\n// {\r\n// parameter: \"Incorrect Appointment / Service Booking\",\r\n// status: \"NO\",\r\n// riskLevel: \"LOW\",\r\n// remarks: \"Booking completed accurately\",\r\n// },\r\n// {\r\n// parameter: \"Data Privacy Breach\",\r\n// status: \"NO\",\r\n// riskLevel: \"LOW\",\r\n// remarks: \"No confidentiality breach observed\",\r\n// },\r\n// {\r\n// parameter: \"Escalation Failure\",\r\n// status: \"NO\",\r\n// riskLevel: \"LOW\",\r\n// remarks: \"No escalation scenario identified\",\r\n// },\r\n// {\r\n// parameter: \"False Commitment\",\r\n// status: \"NO\",\r\n// riskLevel: \"LOW\",\r\n// remarks: \"No incorrect assurance provided\",\r\n// },\r\n// {\r\n// parameter: \"Rude / Unprofessional Behaviour\",\r\n// status: \"NO\",\r\n// riskLevel: \"LOW\",\r\n// remarks: \"Professional behaviour maintained\",\r\n// },\r\n// {\r\n// parameter: \"Incomplete Resolution\",\r\n// status: \"NO\",\r\n// riskLevel: \"LOW\",\r\n// remarks: \"Query resolved successfully\",\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// type: \"table\",\r\n// title: \"Knowledge Gap & Disposition Analytics\",\r\n// columns: [\r\n// {\r\n// key: \"dispositionType\",\r\n// label: \"Disposition Type\",\r\n// minWidth: 180,\r\n// },\r\n// {\r\n// key: \"processKnowledge\",\r\n// label: \"Process Knowledge\",\r\n// render: \"badge\",\r\n// align: \"center\",\r\n// },\r\n// {\r\n// key: \"communication\",\r\n// label: \"Communication\",\r\n// render: \"badge\",\r\n// align: \"center\",\r\n// },\r\n// {\r\n// key: \"compliance\",\r\n// label: \"Compliance\",\r\n// render: \"badge\",\r\n// align: \"center\",\r\n// },\r\n// {\r\n// key: \"riskTrend\",\r\n// label: \"Risk Trend\",\r\n// render: \"badge\",\r\n// align: \"center\",\r\n// },\r\n// { key: \"qaObservation\", label: \"QA Observation\" },\r\n// ],\r\n// rows: [\r\n// {\r\n// dispositionType: \"Appointment Booking\",\r\n// processKnowledge: \"STRONG\",\r\n// communication: \"STRONG\",\r\n// compliance: \"STRONG\",\r\n// riskTrend: \"LOW\",\r\n// qaObservation: \"Operationally stable\",\r\n// },\r\n// {\r\n// dispositionType: \"Existing Patient Verification\",\r\n// processKnowledge: \"STRONG\",\r\n// communication: \"GOOD\",\r\n// compliance: \"GOOD\",\r\n// riskTrend: \"LOW\",\r\n// qaObservation: \"Secondary authentication gap\",\r\n// },\r\n// {\r\n// dispositionType: \"Symptomatic Patient Handling\",\r\n// processKnowledge: \"MODERATE\",\r\n// communication: \"MODERATE\",\r\n// compliance: \"MODERATE\",\r\n// riskTrend: \"MEDIUM\",\r\n// qaObservation: \"Empathy and probing improvement needed\",\r\n// },\r\n// {\r\n// dispositionType: \"Patient Education\",\r\n// processKnowledge: \"MODERATE\",\r\n// communication: \"GOOD\",\r\n// compliance: \"MODERATE\",\r\n// riskTrend: \"LOW\",\r\n// qaObservation: \"Rebooking guidance missed\",\r\n// },\r\n// ],\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// id: \"development\",\r\n// label: \"Development\",\r\n// content: [\r\n// {\r\n// type: \"table\",\r\n// title: \"Root Cause Analysis\",\r\n// columns: [\r\n// { key: \"observation\", label: \"Observation\", minWidth: 180 },\r\n// { key: \"rootCause\", label: \"Root Cause\", minWidth: 200 },\r\n// { key: \"impact\", label: \"Impact\", minWidth: 200 },\r\n// {\r\n// key: \"severity\",\r\n// label: \"Severity\",\r\n// render: \"badge\",\r\n// align: \"center\",\r\n// minWidth: 90,\r\n// },\r\n// ],\r\n// rows: [\r\n// {\r\n// observation: \"Lack of empathy statements\",\r\n// rootCause: \"Transaction-focused handling approach\",\r\n// impact: \"Reduced emotional reassurance\",\r\n// severity: \"MEDIUM\",\r\n// },\r\n// {\r\n// observation: \"Limited symptom probing\",\r\n// rootCause: \"Inadequate clinical sensitivity coaching\",\r\n// impact: \"Potential missed escalation opportunity\",\r\n// severity: \"MEDIUM\",\r\n// },\r\n// {\r\n// observation: \"Missing cancellation guidance\",\r\n// rootCause: \"Incomplete closure checklist adherence\",\r\n// impact: \"Minor customer education gap\",\r\n// severity: \"LOW\",\r\n// },\r\n// {\r\n// observation: \"Secondary authentication missed\",\r\n// rootCause: \"Fast-call handling prioritization\",\r\n// impact: \"Minor compliance exposure\",\r\n// severity: \"LOW\",\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// type: \"table\",\r\n// title: \"Coaching & Development Plan\",\r\n// columns: [\r\n// { key: \"area\", label: \"Coaching Area\", minWidth: 160 },\r\n// {\r\n// key: \"recommendedAction\",\r\n// label: \"Recommended Action\",\r\n// minWidth: 220,\r\n// },\r\n// { key: \"owner\", label: \"Owner\", minWidth: 140 },\r\n// {\r\n// key: \"priority\",\r\n// label: \"Priority\",\r\n// render: \"badge\",\r\n// align: \"center\",\r\n// minWidth: 90,\r\n// },\r\n// { key: \"targetDate\", label: \"Target Date\", minWidth: 120 },\r\n// ],\r\n// rows: [\r\n// {\r\n// area: \"Empathy Handling\",\r\n// recommendedAction:\r\n// \"Reinforce empathetic acknowledgement techniques\",\r\n// owner: \"Team Leader\",\r\n// priority: \"HIGH\",\r\n// targetDate: \"Immediate\",\r\n// },\r\n// {\r\n// area: \"Clinical Sensitivity\",\r\n// recommendedAction: \"Train on symptom severity probing standards\",\r\n// owner: \"QA / Training Team\",\r\n// priority: \"HIGH\",\r\n// targetDate: \"Immediate\",\r\n// },\r\n// {\r\n// area: \"Closure Framework\",\r\n// recommendedAction:\r\n// \"Include rebooking/cancellation education in closure\",\r\n// owner: \"Team Leader\",\r\n// priority: \"MEDIUM\",\r\n// targetDate: \"Within 1 Week\",\r\n// },\r\n// {\r\n// area: \"Verification Compliance\",\r\n// recommendedAction: \"Reinforce secondary authentication process\",\r\n// owner: \"Operations Team\",\r\n// priority: \"MEDIUM\",\r\n// targetDate: \"Within 1 Week\",\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// type: \"text\",\r\n// title: \"Operational Assessment\",\r\n// body: \"The call demonstrated strong operational efficiency, accurate appointment booking workflow adherence, and professional customer handling. The interaction was completed successfully without any critical compliance or process failures.\",\r\n// },\r\n// {\r\n// type: \"bullet-group\",\r\n// groups: [\r\n// {\r\n// title: \"Key Strengths\",\r\n// bulletColor: \"#2e7d32\",\r\n// items: [\r\n// \"Strong appointment booking workflow adherence\",\r\n// \"Accurate and clear communication\",\r\n// \"Professional call handling behaviour\",\r\n// \"Effective call closure etiquette\",\r\n// ],\r\n// },\r\n// {\r\n// title: \"Improvement Areas\",\r\n// bulletColor: \"#e65100\",\r\n// items: [\r\n// \"Empathy and emotional reassurance\",\r\n// \"Symptom-based probing\",\r\n// \"Secondary patient authentication\",\r\n// \"Rebooking/cancellation guidance\",\r\n// ],\r\n// },\r\n// ],\r\n// },\r\n// {\r\n// type: \"text\",\r\n// title: \"Management Recommendation\",\r\n// body: \"Continue current operational workflow practices while introducing targeted coaching on healthcare empathy handling and clinical sensitivity-based customer interactions.\",\r\n// },\r\n// {\r\n// type: \"text\",\r\n// title: \"Final Auditor Remarks\",\r\n// body: \"The agent successfully managed the appointment booking interaction with strong process adherence, accurate resolution delivery, and professional communication standards. No operational or compliance risks were identified during the interaction. The primary opportunity for improvement lies in enhancing patient-centric empathy, clinical sensitivity probing, and strengthening closure education practices to further elevate overall patient experience quality.\",\r\n// variant: \"accent\",\r\n// },\r\n// ],\r\n// },\r\n// ],\r\n// };\r\n\r\nconst STATUS_COLOUR: Record<string, { color: string; bg: string }> = {\r\n completed: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n complied: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n pass: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n compliant: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n achieved: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n strong: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n excellent: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n low: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n no: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n good: { color: \"#1565c0\", bg: \"#e3f2fd\" },\r\n partial: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n moderate: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n medium: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n missed: { color: \"#c62828\", bg: \"#ffebee\" },\r\n fail: { color: \"#c62828\", bg: \"#ffebee\" },\r\n high: { color: \"#c62828\", bg: \"#ffebee\" },\r\n yes: { color: \"#c62828\", bg: \"#ffebee\" },\r\n};\r\n\r\nfunction resolveColour(label: string): { color: string; bg: string } {\r\n const key = label.toLowerCase().replace(/[^a-z]/g, \"\");\r\n return STATUS_COLOUR[key] ?? { color: \"#555\", bg: \"#f0f0f0\" };\r\n}\r\n\r\nfunction StatusBadge({ label }: { label: string }) {\r\n const { color, bg } = resolveColour(label);\r\n return (\r\n <Box\r\n sx={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n px: \"7px\",\r\n py: \"2px\",\r\n borderRadius: \"4px\",\r\n backgroundColor: bg,\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontSize: \"0.72rem\",\r\n fontWeight: 600,\r\n color,\r\n letterSpacing: \"0.02em\",\r\n }}\r\n >\r\n {label.toUpperCase()}\r\n </Typography>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction StatusIconBadge({ label }: { label: string }) {\r\n const key = label.toLowerCase().replace(/[^a-z]/g, \"\");\r\n let icon: React.ReactNode;\r\n if (key === \"complied\" || key === \"completed\") {\r\n icon = <CheckCircleOutlineIcon sx={{ fontSize: 15, color: \"#2e7d32\" }} />;\r\n } else if (key === \"partial\") {\r\n icon = <RemoveCircleOutlineIcon sx={{ fontSize: 15, color: \"#e65100\" }} />;\r\n } else {\r\n icon = <HighlightOffIcon sx={{ fontSize: 15, color: \"#c62828\" }} />;\r\n }\r\n return (\r\n <Box sx={{ display: \"inline-flex\", alignItems: \"center\", gap: \"4px\" }}>\r\n {icon}\r\n <StatusBadge label={label} />\r\n </Box>\r\n );\r\n}\r\n\r\nfunction ProgressCell({\r\n value,\r\n primary,\r\n}: {\r\n value: ProgressValue;\r\n primary: string;\r\n}) {\r\n const pct = Math.min(Math.round((value.score / value.max) * 100), 100);\r\n const isLow = pct < 80;\r\n const barColor = isLow ? \"#c62828\" : primary;\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, minWidth: 100 }}>\r\n <LinearProgress\r\n variant=\"determinate\"\r\n value={pct}\r\n sx={{\r\n flex: 1,\r\n height: 5,\r\n borderRadius: 3,\r\n backgroundColor: alpha(barColor, 0.12),\r\n \"& .MuiLinearProgress-bar\": {\r\n backgroundColor: barColor,\r\n borderRadius: 3,\r\n },\r\n }}\r\n />\r\n <Typography\r\n sx={{\r\n fontSize: \"0.68rem\",\r\n color: \"text.secondary\",\r\n minWidth: 28,\r\n textAlign: \"right\",\r\n }}\r\n >\r\n {pct}%\r\n </Typography>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction RenderCell({\r\n value,\r\n render,\r\n primary,\r\n}: {\r\n value: CellValue;\r\n render?: CellRender;\r\n primary: string;\r\n}) {\r\n if (render === \"badge\") {\r\n return <StatusBadge label={String(value)} />;\r\n }\r\n if (render === \"status-icon-badge\") {\r\n return <StatusIconBadge label={String(value)} />;\r\n }\r\n if (render === \"progress\" && typeof value === \"object\") {\r\n return <ProgressCell value={value as ProgressValue} primary={primary} />;\r\n }\r\n return <>{value}</>;\r\n}\r\n\r\nconst TH: SxProps<Theme> = {\r\n fontSize: \"0.72rem\",\r\n fontWeight: 700,\r\n color: \"text.secondary\",\r\n py: \"7px\",\r\n px: \"10px\",\r\n backgroundColor: \"#f5f7f8\",\r\n borderBottom: \"1px solid\",\r\n borderColor: \"divider\",\r\n whiteSpace: \"nowrap\",\r\n};\r\n\r\nconst TD: SxProps<Theme> = {\r\n fontSize: \"0.75rem\",\r\n color: \"text.primary\",\r\n py: \"6px\",\r\n px: \"10px\",\r\n borderBottom: \"1px solid\",\r\n borderColor: \"divider\",\r\n verticalAlign: \"middle\",\r\n};\r\nfunction RenderTable({\r\n content,\r\n primary,\r\n}: {\r\n content: TableContent;\r\n primary: string;\r\n}) {\r\n return (\r\n <Box>\r\n {content.title && (\r\n <Typography\r\n sx={{\r\n fontSize: \"0.78rem\",\r\n fontWeight: 700,\r\n color: \"text.primary\",\r\n mb: \"8px\",\r\n mt: \"4px\",\r\n }}\r\n >\r\n {content.title}\r\n </Typography>\r\n )}\r\n <TableContainer\r\n sx={{\r\n border: \"1px solid\",\r\n borderColor: \"divider\",\r\n borderRadius: \"8px\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <Table size=\"small\">\r\n <TableHead>\r\n <TableRow>\r\n {content.columns.map((col) => (\r\n <TableCell\r\n key={col.key}\r\n sx={{\r\n ...TH,\r\n textAlign: col.align ?? \"left\",\r\n minWidth: col.minWidth,\r\n }}\r\n >\r\n {col.label}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {content.rows.map((row, ri) => (\r\n <TableRow\r\n key={ri}\r\n sx={{\r\n \"&:last-child td\": {\r\n borderBottom: content.footerRow ? undefined : 0,\r\n },\r\n }}\r\n >\r\n {content.columns.map((col) => (\r\n <TableCell\r\n key={col.key}\r\n sx={{ ...TD, textAlign: col.align ?? \"left\" }}\r\n >\r\n <RenderCell\r\n value={row[col.key] ?? \"\"}\r\n render={col.render}\r\n primary={primary}\r\n />\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n ))}\r\n {content.footerRow && (\r\n <TableRow\r\n sx={{ backgroundColor: \"#f5f7f8\", \"& td\": { borderBottom: 0 } }}\r\n >\r\n {content.columns.map((col) => (\r\n <TableCell\r\n key={col.key}\r\n sx={{\r\n ...TD,\r\n textAlign: col.align ?? \"left\",\r\n fontWeight: 700,\r\n }}\r\n >\r\n <RenderCell\r\n value={content.footerRow![col.key] ?? \"\"}\r\n render={col.render}\r\n primary={primary}\r\n />\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction RenderKVGrid({ content }: { content: KVGridContent }) {\r\n const cols = content.columns ?? 2;\r\n const half = Math.ceil(content.items.length / cols);\r\n const chunks: (typeof content.items)[] = [];\r\n for (let i = 0; i < cols; i++) {\r\n chunks.push(content.items.slice(i * half, (i + 1) * half));\r\n }\r\n\r\n return (\r\n <Box>\r\n {content.title && (\r\n <Typography\r\n sx={{\r\n fontSize: \"0.78rem\",\r\n fontWeight: 700,\r\n color: \"text.primary\",\r\n mb: \"8px\",\r\n mt: \"4px\",\r\n }}\r\n >\r\n {content.title}\r\n </Typography>\r\n )}\r\n <Box\r\n sx={{\r\n border: \"1px solid\",\r\n borderColor: \"divider\",\r\n borderRadius: \"8px\",\r\n overflow: \"hidden\",\r\n backgroundColor: \"background.paper\",\r\n }}\r\n >\r\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\" }}>\r\n {chunks.map((chunk, ci) => (\r\n <Box\r\n key={ci}\r\n sx={{\r\n flex: \"1 1 240px\",\r\n minWidth: 0,\r\n borderRight: ci < chunks.length - 1 ? \"1px solid\" : \"none\",\r\n borderColor: \"divider\",\r\n }}\r\n >\r\n {chunk.map((item, ii) => (\r\n <Box\r\n key={ii}\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"baseline\",\r\n borderBottom: ii < chunk.length - 1 ? \"1px solid\" : \"none\",\r\n borderColor: \"divider\",\r\n px: \"10px\",\r\n py: \"6px\",\r\n gap: 1,\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontSize: \"0.72rem\",\r\n color: \"text.secondary\",\r\n minWidth: 140,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {item.label}\r\n </Typography>\r\n <Typography\r\n sx={{\r\n fontSize: \"0.75rem\",\r\n color: \"text.primary\",\r\n fontWeight: 500,\r\n }}\r\n >\r\n {item.value === \"Not Available\" ? \"_\" : item.value}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction RenderScoreWithMetrics({\r\n content,\r\n primary,\r\n}: {\r\n content: ScoreWithMetricsContent;\r\n primary: string;\r\n}) {\r\n const pct = Math.round((content.score / content.maxScore) * 100);\r\n return (\r\n <Box\r\n sx={{ display: \"flex\", gap: 2, flexWrap: \"wrap\", alignItems: \"stretch\" }}\r\n >\r\n {/* Score card */}\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n border: \"1px solid\",\r\n borderColor: \"divider\",\r\n borderRadius: \"8px\",\r\n backgroundColor: \"background.paper\",\r\n px: 3,\r\n py: 2,\r\n minWidth: 140,\r\n gap: 0.5,\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontSize: \"0.72rem\",\r\n color: \"text.secondary\",\r\n fontWeight: 600,\r\n mb: 0.5,\r\n letterSpacing: \"0.04em\",\r\n }}\r\n >\r\n {content.scoreLabel ?? \"SCORE\"}\r\n </Typography>\r\n <Box sx={{ display: \"flex\", alignItems: \"baseline\", gap: \"3px\" }}>\r\n <Typography\r\n sx={{\r\n fontSize: \"2.4rem\",\r\n fontWeight: 700,\r\n color: primary,\r\n lineHeight: 1,\r\n }}\r\n >\r\n {content.score}\r\n </Typography>\r\n <Typography\r\n sx={{\r\n fontSize: \"0.85rem\",\r\n color: \"text.secondary\",\r\n fontWeight: 600,\r\n }}\r\n >\r\n /{content.maxScore}\r\n </Typography>\r\n </Box>\r\n <Box sx={{ width: \"100%\", mt: 0.75 }}>\r\n <LinearProgress\r\n variant=\"determinate\"\r\n value={pct}\r\n sx={{\r\n height: 6,\r\n borderRadius: 3,\r\n backgroundColor: alpha(primary, 0.12),\r\n \"& .MuiLinearProgress-bar\": {\r\n backgroundColor: primary,\r\n borderRadius: 3,\r\n },\r\n }}\r\n />\r\n </Box>\r\n {content.resultBadge && (\r\n <Box sx={{ mt: 0.75 }}>\r\n <StatusBadge label={content.resultBadge} />\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n {/* Metric cards */}\r\n <Box\r\n sx={{\r\n flex: 1,\r\n minWidth: 260,\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(auto-fill, minmax(160px, 1fr))\",\r\n gap: \"8px\",\r\n }}\r\n >\r\n {content.metrics.map((m) => (\r\n <Box\r\n key={m.label}\r\n sx={{\r\n border: \"1px solid\",\r\n borderColor: \"divider\",\r\n borderRadius: \"6px\",\r\n backgroundColor: \"background.paper\",\r\n px: \"10px\",\r\n py: \"7px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontSize: \"0.72rem\",\r\n color: \"text.secondary\",\r\n lineHeight: 1.3,\r\n flex: 1,\r\n }}\r\n >\r\n {m.label}\r\n </Typography>\r\n <StatusBadge label={m.value} />\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction RenderText({\r\n content,\r\n primary,\r\n}: {\r\n content: TextContent;\r\n primary: string;\r\n}) {\r\n const isAccent = content.variant === \"accent\";\r\n return (\r\n <Box\r\n sx={{\r\n border: \"1px solid\",\r\n borderLeft: isAccent ? \"3px solid\" : \"1px solid\",\r\n borderColor: \"divider\",\r\n borderLeftColor: isAccent ? primary : \"divider\",\r\n borderRadius: \"6px\",\r\n px: \"14px\",\r\n py: \"10px\",\r\n backgroundColor: isAccent ? alpha(primary, 0.04) : \"background.paper\",\r\n }}\r\n >\r\n {content.title && (\r\n <Typography\r\n sx={{\r\n fontSize: \"0.78rem\",\r\n fontWeight: 600,\r\n color: isAccent ? primary : \"text.primary\",\r\n mb: \"6px\",\r\n }}\r\n >\r\n {content.title}\r\n </Typography>\r\n )}\r\n <Typography\r\n sx={{ fontSize: \"0.75rem\", color: \"text.secondary\", lineHeight: 1.6 }}\r\n >\r\n {content.body}\r\n </Typography>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction RenderBulletGroup({ content }: { content: BulletGroupContent }) {\r\n return (\r\n <Box>\r\n {content.title && (\r\n <Typography\r\n sx={{\r\n fontSize: \"0.78rem\",\r\n fontWeight: 700,\r\n color: \"text.primary\",\r\n mb: \"8px\",\r\n mt: \"4px\",\r\n }}\r\n >\r\n {content.title}\r\n </Typography>\r\n )}\r\n <Box sx={{ display: \"flex\", gap: 2, flexWrap: \"wrap\" }}>\r\n {content.groups.map((g, gi) => (\r\n <Box\r\n key={gi}\r\n sx={{\r\n flex: \"1 1 200px\",\r\n border: \"1px solid\",\r\n borderColor: \"divider\",\r\n borderRadius: \"6px\",\r\n backgroundColor: \"background.paper\",\r\n px: \"14px\",\r\n py: \"10px\",\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontSize: \"0.78rem\",\r\n fontWeight: 600,\r\n color: \"text.primary\",\r\n mb: \"8px\",\r\n }}\r\n >\r\n {g.title}\r\n </Typography>\r\n {g.items.map((item, ii) => (\r\n <Box\r\n key={ii}\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: \"7px\",\r\n mb: \"5px\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n width: 5,\r\n height: 5,\r\n borderRadius: \"50%\",\r\n backgroundColor: g.bulletColor ?? \"#555\",\r\n mt: \"5px\",\r\n flexShrink: 0,\r\n }}\r\n />\r\n <Typography\r\n sx={{\r\n fontSize: \"0.75rem\",\r\n color: \"text.secondary\",\r\n lineHeight: 1.5,\r\n }}\r\n >\r\n {item}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n ))}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n\r\nfunction SectionPanel({\r\n section,\r\n primary,\r\n}: {\r\n section: ReportSection;\r\n primary: string;\r\n}) {\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n {section.content.map((item, i) => {\r\n switch (item.type) {\r\n case \"table\":\r\n return <RenderTable key={i} content={item} primary={primary} />;\r\n case \"kv-grid\":\r\n return <RenderKVGrid key={i} content={item} />;\r\n case \"score-with-metrics\":\r\n return (\r\n <RenderScoreWithMetrics\r\n key={i}\r\n content={item}\r\n primary={primary}\r\n />\r\n );\r\n case \"text\":\r\n return <RenderText key={i} content={item} primary={primary} />;\r\n case \"bullet-group\":\r\n return <RenderBulletGroup key={i} content={item} />;\r\n default:\r\n return null;\r\n }\r\n })}\r\n </Box>\r\n );\r\n}\r\n\r\nconst PRINT_ROOT_ID = \"audit-report-print-root\";\r\n\r\nconst PRINT_STYLES = (\r\n <GlobalStyles\r\n styles={{\r\n [`#${PRINT_ROOT_ID}`]: {\r\n position: \"absolute\",\r\n width: \"1px\",\r\n height: \"1px\",\r\n overflow: \"hidden\",\r\n clip: \"rect(0 0 0 0)\",\r\n clipPath: \"inset(50%)\",\r\n whiteSpace: \"nowrap\",\r\n pointerEvents: \"none\",\r\n },\r\n \"@media print\": {\r\n \"body *\": { visibility: \"hidden\" },\r\n [`#${PRINT_ROOT_ID}`]: {\r\n visibility: \"visible\",\r\n // override the off-screen clip\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"auto\",\r\n overflow: \"visible\",\r\n clip: \"auto\",\r\n clipPath: \"none\",\r\n whiteSpace: \"normal\",\r\n padding: \"0 8mm\",\r\n boxSizing: \"border-box\",\r\n },\r\n [`#${PRINT_ROOT_ID} *`]: {\r\n visibility: \"visible\",\r\n printColorAdjust: \"exact\",\r\n WebkitPrintColorAdjust: \"exact\",\r\n } as React.CSSProperties,\r\n },\r\n }}\r\n />\r\n);\r\n\r\nfunction PrintLayout({\r\n report,\r\n primary,\r\n}: {\r\n report: AuditReportDialogData | null;\r\n primary: string;\r\n}) {\r\n return (\r\n <div id={PRINT_ROOT_ID}>\r\n <Box\r\n sx={{\r\n mb: 2.5,\r\n pb: 1.5,\r\n borderBottom: \"2px solid\",\r\n borderColor: \"divider\",\r\n }}\r\n >\r\n <Typography\r\n sx={{ fontSize: \"1.2rem\", fontWeight: 700, color: \"text.primary\" }}\r\n >\r\n {report?.title}\r\n </Typography>\r\n\r\n {report?.subtitle && (\r\n <Typography\r\n sx={{ fontSize: \"0.8rem\", color: \"text.secondary\", mt: \"4px\" }}\r\n >\r\n {report.subtitle}\r\n </Typography>\r\n )}\r\n\r\n {report?.headerBadges && report.headerBadges.length > 0 && (\r\n <Box sx={{ display: \"flex\", gap: 1, flexWrap: \"wrap\", mt: 1 }}>\r\n {report.headerBadges.map((badge, i) =>\r\n badge.asBadge ? (\r\n <StatusBadge key={i} label={badge.value} />\r\n ) : (\r\n <Typography\r\n key={i}\r\n sx={{ fontSize: \"0.72rem\", color: \"text.secondary\" }}\r\n >\r\n <Box\r\n component=\"span\"\r\n sx={{ fontWeight: 600, color: \"text.primary\", mr: \"3px\" }}\r\n >\r\n {badge.label}:\r\n </Box>\r\n {badge.value}\r\n </Typography>\r\n ),\r\n )}\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n {/* ── All sections stacked ── */}\r\n {report?.sections?.map((section, si) => (\r\n <Box\r\n key={section.id}\r\n sx={{\r\n mb: 3,\r\n pageBreakBefore: si > 0 ? \"always\" : \"auto\",\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontSize: \"0.82rem\",\r\n fontWeight: 700,\r\n color: \"text.primary\",\r\n mb: 1.5,\r\n pb: \"6px\",\r\n borderBottom: \"2px solid\",\r\n borderColor: \"divider\",\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.06em\",\r\n }}\r\n >\r\n {section.label}\r\n </Typography>\r\n\r\n <SectionPanel section={section} primary={primary} />\r\n </Box>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\ninterface AuditReportDialogProps {\r\n open: boolean;\r\n onClose: () => void;\r\n maxWidth?: \"sm\" | \"md\" | \"lg\" | \"xl\";\r\n rowData?: CdrRecordResponse;\r\n}\r\n\r\nexport default function AuditReportDialog({\r\n open,\r\n onClose,\r\n maxWidth = \"lg\",\r\n rowData,\r\n}: AuditReportDialogProps) {\r\n const theme = useTheme();\r\n const primary = theme.palette.primary.main;\r\n const [activeTab, setActiveTab] = useState(0);\r\n const [reportData, setReportData] = useState<AuditReportDialogData | null>({\r\n title: \"Audit Report\",\r\n });\r\n const [auditLoading, setAuditLoading] = useState(false);\r\n const [auditError, setAuditError] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n setReportData({ title: \"Audit Report\" });\r\n setAuditError(null);\r\n setActiveTab(0);\r\n\r\n if (!open || !rowData) return;\r\n\r\n let cancelled = false;\r\n\r\n const fetchAuditReport = async () => {\r\n setAuditLoading(true);\r\n try {\r\n const res = await axiosInstance.get<AuditReportDialogData>(\r\n END_POINT.CALLSAGE_AUDIT(rowData.callUuid),\r\n );\r\n\r\n if (!cancelled) setReportData(res.data);\r\n } catch (err: any) {\r\n if (!cancelled) {\r\n setAuditError(\r\n err?.response?.data?.message ??\r\n err?.message ??\r\n \"Failed to generate audit report\",\r\n );\r\n setReportData({ title: \"Audit Report\" });\r\n }\r\n } finally {\r\n if (!cancelled) setAuditLoading(false);\r\n }\r\n };\r\n\r\n fetchAuditReport();\r\n return () => {\r\n cancelled = true;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [open, rowData]);\r\n\r\n return (\r\n <>\r\n {/* Inject print CSS into <head> once while the dialog is mounted */}\r\n {PRINT_STYLES}\r\n {open &&\r\n createPortal(\r\n <PrintLayout report={reportData} primary={primary} />,\r\n document.body,\r\n )}\r\n\r\n <Dialog\r\n open={open}\r\n onClose={onClose}\r\n maxWidth={maxWidth}\r\n fullWidth\r\n slotProps={{\r\n paper: {\r\n sx: {\r\n height: \"90vh\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n borderRadius: \"10px\",\r\n },\r\n },\r\n }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n px: { xs: 2, md: 2.5 },\r\n py: \"12px\",\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n justifyContent: \"space-between\",\r\n gap: 1,\r\n borderBottom: \"1px solid\",\r\n borderColor: \"divider\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n <Box sx={{ minWidth: 0 }}>\r\n <Typography\r\n sx={{\r\n fontWeight: 700,\r\n fontSize: { xs: \"1rem\", sm: \"1.2rem\" },\r\n color: \"text.primary\",\r\n lineHeight: 1.3,\r\n }}\r\n >\r\n {reportData?.title}\r\n </Typography>\r\n {reportData?.subtitle && (\r\n <Typography\r\n sx={{ fontSize: \"0.78rem\", color: \"text.secondary\", mt: \"3px\" }}\r\n >\r\n {reportData.subtitle}\r\n </Typography>\r\n )}\r\n </Box>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onClose}\r\n sx={{\r\n flexShrink: 0,\r\n width: 28,\r\n height: 28,\r\n borderRadius: \"6px\",\r\n backgroundColor: \"action.hover\",\r\n color: \"text.secondary\",\r\n \"&:hover\": {\r\n backgroundColor: \"action.selected\",\r\n color: \"text.primary\",\r\n },\r\n transition: \"all 0.15s ease\",\r\n }}\r\n >\r\n <CloseIcon sx={{ fontSize: 15 }} />\r\n </IconButton>\r\n </DialogTitle>\r\n\r\n {/* Header badges */}\r\n {reportData?.headerBadges && reportData.headerBadges.length > 0 && (\r\n <Box\r\n sx={{\r\n px: { xs: 2, md: 2.5 },\r\n py: \"8px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"8px\",\r\n flexWrap: \"wrap\",\r\n borderBottom: \"1px solid\",\r\n borderColor: \"divider\",\r\n backgroundColor: \"#f5f7f8\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n {reportData.headerBadges.map((badge, i) =>\r\n badge.asBadge ? (\r\n <StatusBadge key={i} label={badge.value} />\r\n ) : (\r\n <Box\r\n key={i}\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"5px\",\r\n px: \"9px\",\r\n height: 26,\r\n border: \"1px solid\",\r\n borderColor: \"divider\",\r\n borderRadius: \"5px\",\r\n backgroundColor: \"background.paper\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n width: 5,\r\n height: 5,\r\n borderRadius: \"50%\",\r\n backgroundColor: primary,\r\n flexShrink: 0,\r\n }}\r\n />\r\n <Typography\r\n sx={{\r\n fontSize: \"0.72rem\",\r\n color: \"text.secondary\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n <Box\r\n component=\"span\"\r\n sx={{ fontWeight: 600, color: \"text.primary\", mr: \"3px\" }}\r\n >\r\n {badge.label}:\r\n </Box>\r\n {badge.value}\r\n </Typography>\r\n </Box>\r\n ),\r\n )}\r\n </Box>\r\n )}\r\n\r\n {/* Tabs */}\r\n <Box\r\n sx={{\r\n borderBottom: \"1px solid\",\r\n borderColor: \"divider\",\r\n backgroundColor: \"background.paper\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n <Tabs\r\n value={activeTab}\r\n onChange={(_, v) => setActiveTab(v)}\r\n variant=\"scrollable\"\r\n scrollButtons=\"auto\"\r\n sx={{\r\n minHeight: 40,\r\n px: { xs: 1, md: 2 },\r\n \"& .MuiTab-root\": {\r\n fontSize: \"0.78rem\",\r\n fontWeight: 600,\r\n minHeight: 40,\r\n textTransform: \"none\",\r\n color: \"text.secondary\",\r\n py: 0,\r\n px: 1.5,\r\n \"&.Mui-selected\": { color: primary },\r\n },\r\n \"& .MuiTabs-indicator\": { backgroundColor: primary, height: 2 },\r\n }}\r\n >\r\n {reportData?.sections?.map((section) => (\r\n <Tab key={section.id} label={section.label} disableRipple />\r\n ))}\r\n </Tabs>\r\n </Box>\r\n\r\n <DialogContent\r\n sx={{ flex: 1, overflow: \"auto\", px: { xs: 2, md: 2.5 }, py: 2 }}\r\n >\r\n {auditLoading && (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n py: 6,\r\n }}\r\n >\r\n <CircularProgress size={32} />\r\n </Box>\r\n )}\r\n {!auditLoading && auditError && (\r\n <Alert severity=\"warning\" sx={{ mb: 2, fontSize: \"0.78rem\" }}>\r\n {auditError}\r\n </Alert>\r\n )}\r\n\r\n {!auditLoading && reportData?.sections?.[activeTab] && (\r\n <SectionPanel\r\n section={reportData.sections[activeTab]}\r\n primary={primary}\r\n />\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n","import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type {\r\n\tCdrAgentFilterOption,\r\n\tCdrQueueFilterOption,\r\n\tCdrRecordsPage,\r\n\tCdrReportParams,\r\n\tCdrReportResponse,\r\n} from \"./types\";\r\n\r\n// ─── Build query string for CDR endpoints ────────────────────────────────────\r\n\r\nfunction buildCdrQuery(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) {\r\n\t\tfor (const id of params.agent_id) qs.append(\"agent_id\", String(id));\r\n\t}\r\n\tif (params.queue_id) {\r\n\t\tfor (const id of params.queue_id) qs.append(\"queue_id\", String(id));\r\n\t}\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\n// ─── CDR records hook ────────────────────────────────────────────────────────\r\n\r\nexport function useCdrReport() {\r\n\tconst [records, setRecords] = useState<CdrRecordsPage[\"data\"]>([]);\r\n\tconst [totalRecords, setTotalRecords] = useState(0);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchRecords = useCallback(async (params: CdrReportParams): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst qs = buildCdrQuery(params);\r\n\t\t\tconst res = await axiosInstance.get<CdrRecordsPage>(`${END_POINT.CDR_REPORT_RECORDS}${qs}`);\r\n\t\t\tsetRecords(res.data?.data ?? []);\r\n\t\t\tsetTotalRecords(res.data?.total ?? 0);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(\r\n\t\t\t\terr?.response?.data?.message\r\n\t\t\t\t?? err?.response?.data?.detail\r\n\t\t\t\t?? err?.message\r\n\t\t\t\t?? \"Failed to fetch CDR report\"\r\n\t\t\t);\r\n\t\t\tsetRecords([]);\r\n\t\t\tsetTotalRecords(0);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst exportExcel = useCallback(async (params: CdrReportParams): Promise<void> => {\r\n\t\tconst qs = buildCdrQuery(params);\r\n\t\tconst res = await axiosInstance.get(`${END_POINT.CDR_REPORT_EXPORT_EXCEL}${qs}`, {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\tconst blob = res.data as Blob;\r\n\t\tconst url = window.URL.createObjectURL(blob);\r\n\t\tconst a = document.createElement(\"a\");\r\n\t\ta.href = url;\r\n\t\ta.download = `cdr-report-${params.start_date ?? \"export\"}.xlsx`;\r\n\t\tdocument.body.appendChild(a);\r\n\t\ta.click();\r\n\t\ta.remove();\r\n\t\twindow.URL.revokeObjectURL(url);\r\n\t}, []);\r\n\r\n\tconst fetchRecording = useCallback(async (callUuid: string): Promise<Blob> => {\r\n\t\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\treturn res.data;\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\trecords,\r\n\t\ttotalRecords,\r\n\t\tloading,\r\n\t\terror,\r\n\t\tsetError,\r\n\t\tfetchRecords,\r\n\t\texportExcel,\r\n\t\tfetchRecording,\r\n\t};\r\n}\r\n\r\n// ─── CDR filter options hook (agents + queues) ───────────────────────────────\r\n//\r\n// The main app's CdrReport uses the general user-list and master-queue endpoints\r\n// (NOT a CDR-specific filter endpoint). We mirror that here.\r\n// - agents: GET /api/v1/users/?role=AGENT → filter to role === \"AGENT\"\r\n// - queues: GET /api/v1/master/queue\r\n\r\ninterface UserListItem {\r\n\tid: number;\r\n\tuserId: string;\r\n\tfirstName?: string;\r\n\tlastName?: string;\r\n\trole?: string | { name?: string } | null;\r\n}\r\n\r\ninterface QueueListItem {\r\n\tid: number;\r\n\tname: string;\r\n}\r\n\r\nexport function useCdrFilters() {\r\n\tconst [agents, setAgents] = useState<CdrAgentFilterOption[]>([]);\r\n\tconst [queues, setQueues] = useState<CdrQueueFilterOption[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst fetchAgents = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<UserListItem[] | { data: UserListItem[] }>(\r\n\t\t\t\tEND_POINT.USERS_LIST,\r\n\t\t\t\t{ params: { role: \"AGENT\" } },\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tconst mapped: CdrAgentFilterOption[] = (raw as UserListItem[])\r\n\t\t\t\t.filter((u) => {\r\n\t\t\t\t\tconst roleName = typeof u.role === \"object\" && u.role !== null ? u.role.name : u.role;\r\n\t\t\t\t\treturn roleName === \"AGENT\";\r\n\t\t\t\t})\r\n\t\t\t\t.map((u) => ({\r\n\t\t\t\t\tid: u.id,\r\n\t\t\t\t\tuserId: u.userId,\r\n\t\t\t\t\tfullName: [u.firstName, u.lastName].filter(Boolean).join(\" \") || u.userId,\r\n\t\t\t\t}));\r\n\t\t\tsetAgents(mapped);\r\n\t\t} catch {\r\n\t\t\tsetAgents([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchQueues = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<QueueListItem[] | { data: QueueListItem[] }>(\r\n\t\t\t\tEND_POINT.MASTER_QUEUES,\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tsetQueues((raw as QueueListItem[]).map((q) => ({ id: q.id, name: q.name })));\r\n\t\t} catch {\r\n\t\t\tsetQueues([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchAll = useCallback(async (): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tawait Promise.all([fetchAgents(), fetchQueues()]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, [fetchAgents, fetchQueues]);\r\n\r\n\treturn { agents, queues, loading, fetchAgents, fetchQueues, fetchAll };\r\n}\r\n\r\nexport interface Queue {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport async function getQueues(): Promise<Queue[]> {\r\n\tconst res = await axiosInstance.get<QueueListItem[] | { data: QueueListItem[] }>(END_POINT.MASTER_QUEUES);\r\n\tconst raw = Array.isArray(res.data)\r\n\t\t? res.data\r\n\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t? (res.data as any).data\r\n\t\t\t: [];\r\n\treturn (raw as QueueListItem[]).map((q) => ({ id: q.id, name: q.name, description: \"\", isActive: true }));\r\n}\r\n\r\nexport async function getCdrReportRecords(params: CdrReportParams): Promise<CdrRecordsPage> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get<CdrRecordsPage>(`${END_POINT.CDR_REPORT_RECORDS}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\n/**\r\n * Combined CDR report — stats + the current page of records in one call.\r\n * This is the documented endpoint that honours page/pageSize/search.\r\n */\r\nexport async function getCdrReport(params: CdrReportParams): Promise<CdrReportResponse> {\r\n\tconst qs = buildCdrQuery(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 exportCdrReportToExcel(params: CdrReportParams): Promise<void> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get(`${END_POINT.CDR_REPORT_EXPORT_EXCEL}${qs}`, { responseType: \"blob\" });\r\n\tconst url = window.URL.createObjectURL(new Blob([res.data]));\r\n\tconst a = document.createElement(\"a\");\r\n\ta.href = url;\r\n\ta.download = `cdr-report-${params.start_date ?? \"export\"}.xlsx`;\r\n\tdocument.body.appendChild(a);\r\n\ta.click();\r\n\ta.remove();\r\n\twindow.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport async function getRecordingByCall(callUuid: string): Promise<Blob> {\r\n\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), { responseType: \"blob\" });\r\n\treturn res.data;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,EACE,eAAAA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,OACK;AACP;AAAA,EACE,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,OACK;;;ACxBP,SAAgB,WAAW,gBAAgB;AAC3C,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa;AAEtB,OAAO,eAAe;AACtB,OAAO,4BAA4B;AACnC,OAAO,sBAAsB;AAC7B,OAAO,6BAA6B;AAu/B9B,SA0FG,UA1FH,KAyBF,YAzBE;AAvCN,IAAM,gBAA+D;AAAA,EACnE,WAAW,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC7C,UAAU,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC5C,MAAM,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EACxC,WAAW,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC7C,UAAU,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC5C,QAAQ,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC1C,WAAW,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC7C,KAAK,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EACvC,IAAI,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EACtC,MAAM,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EACxC,SAAS,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC3C,UAAU,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC5C,QAAQ,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC1C,QAAQ,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EAC1C,MAAM,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EACxC,MAAM,EAAE,OAAO,WAAW,IAAI,UAAU;AAAA,EACxC,KAAK,EAAE,OAAO,WAAW,IAAI,UAAU;AACzC;AAEA,SAAS,cAAc,OAA8C;AAhgCrE;AAigCE,QAAM,MAAM,MAAM,YAAY,EAAE,QAAQ,WAAW,EAAE;AACrD,UAAO,mBAAc,GAAG,MAAjB,YAAsB,EAAE,OAAO,QAAQ,IAAI,UAAU;AAC9D;AAEA,SAAS,YAAY,EAAE,MAAM,GAAsB;AACjD,QAAM,EAAE,OAAO,GAAG,IAAI,cAAc,KAAK;AACzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,YACF,UAAU;AAAA,YACV,YAAY;AAAA,YACZ;AAAA,YACA,eAAe;AAAA,UACjB;AAAA,UAEC,gBAAM,YAAY;AAAA;AAAA,MACrB;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,gBAAgB,EAAE,MAAM,GAAsB;AACrD,QAAM,MAAM,MAAM,YAAY,EAAE,QAAQ,WAAW,EAAE;AACrD,MAAI;AACJ,MAAI,QAAQ,cAAc,QAAQ,aAAa;AAC7C,WAAO,oBAAC,0BAAuB,IAAI,EAAE,UAAU,IAAI,OAAO,UAAU,GAAG;AAAA,EACzE,WAAW,QAAQ,WAAW;AAC5B,WAAO,oBAAC,2BAAwB,IAAI,EAAE,UAAU,IAAI,OAAO,UAAU,GAAG;AAAA,EAC1E,OAAO;AACL,WAAO,oBAAC,oBAAiB,IAAI,EAAE,UAAU,IAAI,OAAO,UAAU,GAAG;AAAA,EACnE;AACA,SACE,qBAAC,OAAI,IAAI,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,MAAM,GACjE;AAAA;AAAA,IACD,oBAAC,eAAY,OAAc;AAAA,KAC7B;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AACF,GAGG;AACD,QAAM,MAAM,KAAK,IAAI,KAAK,MAAO,MAAM,QAAQ,MAAM,MAAO,GAAG,GAAG,GAAG;AACrE,QAAM,QAAQ,MAAM;AACpB,QAAM,WAAW,QAAQ,YAAY;AACrC,SACE,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,UAAU,IAAI,GACtE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,OAAO;AAAA,QACP,IAAI;AAAA,UACF,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,iBAAiB,MAAM,UAAU,IAAI;AAAA,UACrC,4BAA4B;AAAA,YAC1B,iBAAiB;AAAA,YACjB,cAAc;AAAA,UAChB;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,UAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAU;AAAA,UACV,WAAW;AAAA,QACb;AAAA,QAEC;AAAA;AAAA,UAAI;AAAA;AAAA;AAAA,IACP;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,WAAW,SAAS;AACtB,WAAO,oBAAC,eAAY,OAAO,OAAO,KAAK,GAAG;AAAA,EAC5C;AACA,MAAI,WAAW,qBAAqB;AAClC,WAAO,oBAAC,mBAAgB,OAAO,OAAO,KAAK,GAAG;AAAA,EAChD;AACA,MAAI,WAAW,cAAc,OAAO,UAAU,UAAU;AACtD,WAAO,oBAAC,gBAAa,OAA+B,SAAkB;AAAA,EACxE;AACA,SAAO,gCAAG,iBAAM;AAClB;AAEA,IAAM,KAAqB;AAAA,EACzB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,YAAY;AACd;AAEA,IAAM,KAAqB;AAAA,EACzB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AACjB;AACA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAGG;AACD,SACE,qBAAC,OACE;AAAA,YAAQ,SACP;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QAEC,kBAAQ;AAAA;AAAA,IACX;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,cAAc;AAAA,UACd,UAAU;AAAA,QACZ;AAAA,QAEA,+BAAC,SAAM,MAAK,SACV;AAAA,8BAAC,aACC,8BAAC,YACE,kBAAQ,QAAQ,IAAI,CAAC,QAAK;AAtqCzC;AAuqCgB;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI,iCACC,KADD;AAAA,kBAEF,YAAW,SAAI,UAAJ,YAAa;AAAA,kBACxB,UAAU,IAAI;AAAA,gBAChB;AAAA,gBAEC,cAAI;AAAA;AAAA,cAPA,IAAI;AAAA,YAQX;AAAA,WACD,GACH,GACF;AAAA,UACA,qBAAC,aACE;AAAA,oBAAQ,KAAK,IAAI,CAAC,KAAK,OACtB;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI;AAAA,kBACF,mBAAmB;AAAA,oBACjB,cAAc,QAAQ,YAAY,SAAY;AAAA,kBAChD;AAAA,gBACF;AAAA,gBAEC,kBAAQ,QAAQ,IAAI,CAAC,QAAK;AA9rC3C;AA+rCkB;AAAA,oBAAC;AAAA;AAAA,sBAEC,IAAI,iCAAK,KAAL,EAAS,YAAW,SAAI,UAAJ,YAAa,OAAO;AAAA,sBAE5C;AAAA,wBAAC;AAAA;AAAA,0BACC,QAAO,SAAI,IAAI,GAAG,MAAX,YAAgB;AAAA,0BACvB,QAAQ,IAAI;AAAA,0BACZ;AAAA;AAAA,sBACF;AAAA;AAAA,oBAPK,IAAI;AAAA,kBAQX;AAAA,iBACD;AAAA;AAAA,cAlBI;AAAA,YAmBP,CACD;AAAA,YACA,QAAQ,aACP;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,EAAE,iBAAiB,WAAW,QAAQ,EAAE,cAAc,EAAE,EAAE;AAAA,gBAE7D,kBAAQ,QAAQ,IAAI,CAAC,QAAK;AAhtC3C;AAitCkB;AAAA,oBAAC;AAAA;AAAA,sBAEC,IAAI,iCACC,KADD;AAAA,wBAEF,YAAW,SAAI,UAAJ,YAAa;AAAA,wBACxB,YAAY;AAAA,sBACd;AAAA,sBAEA;AAAA,wBAAC;AAAA;AAAA,0BACC,QAAO,aAAQ,UAAW,IAAI,GAAG,MAA1B,YAA+B;AAAA,0BACtC,QAAQ,IAAI;AAAA,0BACZ;AAAA;AAAA,sBACF;AAAA;AAAA,oBAXK,IAAI;AAAA,kBAYX;AAAA,iBACD;AAAA;AAAA,YACH;AAAA,aAEJ;AAAA,WACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,aAAa,EAAE,QAAQ,GAA+B;AAzuC/D;AA0uCE,QAAM,QAAO,aAAQ,YAAR,YAAmB;AAChC,QAAM,OAAO,KAAK,KAAK,QAAQ,MAAM,SAAS,IAAI;AAClD,QAAM,SAAmC,CAAC;AAC1C,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,WAAO,KAAK,QAAQ,MAAM,MAAM,IAAI,OAAO,IAAI,KAAK,IAAI,CAAC;AAAA,EAC3D;AAEA,SACE,qBAAC,OACE;AAAA,YAAQ,SACP;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QAEC,kBAAQ;AAAA;AAAA,IACX;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,cAAc;AAAA,UACd,UAAU;AAAA,UACV,iBAAiB;AAAA,QACnB;AAAA,QAEA,8BAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,OAAO,GAC1C,iBAAO,IAAI,CAAC,OAAO,OAClB;AAAA,UAAC;AAAA;AAAA,YAEC,IAAI;AAAA,cACF,MAAM;AAAA,cACN,UAAU;AAAA,cACV,aAAa,KAAK,OAAO,SAAS,IAAI,cAAc;AAAA,cACpD,aAAa;AAAA,YACf;AAAA,YAEC,gBAAM,IAAI,CAAC,MAAM,OAChB;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI;AAAA,kBACF,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,cAAc,KAAK,MAAM,SAAS,IAAI,cAAc;AAAA,kBACpD,aAAa;AAAA,kBACb,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,KAAK;AAAA,gBACP;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,wBACF,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,UAAU;AAAA,wBACV,YAAY;AAAA,sBACd;AAAA,sBAEC,eAAK;AAAA;AAAA,kBACR;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,wBACF,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,YAAY;AAAA,sBACd;AAAA,sBAEC,eAAK,UAAU,kBAAkB,MAAM,KAAK;AAAA;AAAA,kBAC/C;AAAA;AAAA;AAAA,cA7BK;AAAA,YA8BP,CACD;AAAA;AAAA,UAzCI;AAAA,QA0CP,CACD,GACH;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AACF,GAGG;AAp0CH;AAq0CE,QAAM,MAAM,KAAK,MAAO,QAAQ,QAAQ,QAAQ,WAAY,GAAG;AAC/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,UAAU,QAAQ,YAAY,UAAU;AAAA,MAGvE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,cACF,SAAS;AAAA,cACT,eAAe;AAAA,cACf,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,aAAa;AAAA,cACb,cAAc;AAAA,cACd,iBAAiB;AAAA,cACjB,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,UAAU;AAAA,cACV,KAAK;AAAA,YACP;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,oBACF,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,YAAY;AAAA,oBACZ,IAAI;AAAA,oBACJ,eAAe;AAAA,kBACjB;AAAA,kBAEC,wBAAQ,eAAR,YAAsB;AAAA;AAAA,cACzB;AAAA,cACA,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,YAAY,KAAK,MAAM,GAC7D;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAI;AAAA,sBACF,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,YAAY;AAAA,oBACd;AAAA,oBAEC,kBAAQ;AAAA;AAAA,gBACX;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAI;AAAA,sBACF,UAAU;AAAA,sBACV,OAAO;AAAA,sBACP,YAAY;AAAA,oBACd;AAAA,oBACD;AAAA;AAAA,sBACG,QAAQ;AAAA;AAAA;AAAA,gBACZ;AAAA,iBACF;AAAA,cACA,oBAAC,OAAI,IAAI,EAAE,OAAO,QAAQ,IAAI,KAAK,GACjC;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,IAAI;AAAA,oBACF,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,iBAAiB,MAAM,SAAS,IAAI;AAAA,oBACpC,4BAA4B;AAAA,sBAC1B,iBAAiB;AAAA,sBACjB,cAAc;AAAA,oBAChB;AAAA,kBACF;AAAA;AAAA,cACF,GACF;AAAA,cACC,QAAQ,eACP,oBAAC,OAAI,IAAI,EAAE,IAAI,KAAK,GAClB,8BAAC,eAAY,OAAO,QAAQ,aAAa,GAC3C;AAAA;AAAA;AAAA,QAEJ;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,cACF,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS;AAAA,cACT,qBAAqB;AAAA,cACrB,KAAK;AAAA,YACP;AAAA,YAEC,kBAAQ,QAAQ,IAAI,CAAC,MACpB;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI;AAAA,kBACF,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,cAAc;AAAA,kBACd,iBAAiB;AAAA,kBACjB,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,KAAK;AAAA,gBACP;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,wBACF,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,YAAY;AAAA,wBACZ,MAAM;AAAA,sBACR;AAAA,sBAEC,YAAE;AAAA;AAAA,kBACL;AAAA,kBACA,oBAAC,eAAY,OAAO,EAAE,OAAO;AAAA;AAAA;AAAA,cAxBxB,EAAE;AAAA,YAyBT,CACD;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AACF,GAGG;AACD,QAAM,WAAW,QAAQ,YAAY;AACrC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,QAAQ;AAAA,QACR,YAAY,WAAW,cAAc;AAAA,QACrC,aAAa;AAAA,QACb,iBAAiB,WAAW,UAAU;AAAA,QACtC,cAAc;AAAA,QACd,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,iBAAiB,WAAW,MAAM,SAAS,IAAI,IAAI;AAAA,MACrD;AAAA,MAEC;AAAA,gBAAQ,SACP;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,cACF,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,OAAO,WAAW,UAAU;AAAA,cAC5B,IAAI;AAAA,YACN;AAAA,YAEC,kBAAQ;AAAA;AAAA,QACX;AAAA,QAEF;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,EAAE,UAAU,WAAW,OAAO,kBAAkB,YAAY,IAAI;AAAA,YAEnE,kBAAQ;AAAA;AAAA,QACX;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,kBAAkB,EAAE,QAAQ,GAAoC;AACvE,SACE,qBAAC,OACE;AAAA,YAAQ,SACP;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QAEC,kBAAQ;AAAA;AAAA,IACX;AAAA,IAEF,oBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,UAAU,OAAO,GAClD,kBAAQ,OAAO,IAAI,CAAC,GAAG,OACtB;AAAA,MAAC;AAAA;AAAA,QAEC,IAAI;AAAA,UACF,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,cAAc;AAAA,UACd,iBAAiB;AAAA,UACjB,IAAI;AAAA,UACJ,IAAI;AAAA,QACN;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,IAAI;AAAA,cACN;AAAA,cAEC,YAAE;AAAA;AAAA,UACL;AAAA,UACC,EAAE,MAAM,IAAI,CAAC,MAAM,OAAI;AA/gDpC;AAghDc;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI;AAAA,kBACF,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,IAAI;AAAA,gBACN;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,wBACF,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,kBAAiB,OAAE,gBAAF,YAAiB;AAAA,wBAClC,IAAI;AAAA,wBACJ,YAAY;AAAA,sBACd;AAAA;AAAA,kBACF;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,wBACF,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,YAAY;AAAA,sBACd;AAAA,sBAEC;AAAA;AAAA,kBACH;AAAA;AAAA;AAAA,cA1BK;AAAA,YA2BP;AAAA,WACD;AAAA;AAAA;AAAA,MAnDI;AAAA,IAoDP,CACD,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AACF,GAGG;AACD,SACE,oBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,EAAE,GACzD,kBAAQ,QAAQ,IAAI,CAAC,MAAM,MAAM;AAChC,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO,oBAAC,eAAoB,SAAS,MAAM,WAAlB,CAAoC;AAAA,MAC/D,KAAK;AACH,eAAO,oBAAC,gBAAqB,SAAS,QAAZ,CAAkB;AAAA,MAC9C,KAAK;AACH,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS;AAAA,YACT;AAAA;AAAA,UAFK;AAAA,QAGP;AAAA,MAEJ,KAAK;AACH,eAAO,oBAAC,cAAmB,SAAS,MAAM,WAAlB,CAAoC;AAAA,MAC9D,KAAK;AACH,eAAO,oBAAC,qBAA0B,SAAS,QAAZ,CAAkB;AAAA,MACnD;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC,GACH;AAEJ;AAEA,IAAM,gBAAgB;AAEtB,IAAM,eACJ;AAAA,EAAC;AAAA;AAAA,IACC,QAAQ;AAAA,MACN,CAAC,IAAI,aAAa,EAAE,GAAG;AAAA,QACrB,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe;AAAA,MACjB;AAAA,MACA,gBAAgB;AAAA,QACd,UAAU,EAAE,YAAY,SAAS;AAAA,QACjC,CAAC,IAAI,aAAa,EAAE,GAAG;AAAA,UACrB,YAAY;AAAA;AAAA,UAEZ,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,QACA,CAAC,IAAI,aAAa,IAAI,GAAG;AAAA,UACvB,YAAY;AAAA,UACZ,kBAAkB;AAAA,UAClB,wBAAwB;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA;AACF;AAGF,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAGG;AAxoDH;AAyoDE,SACE,qBAAC,SAAI,IAAI,eACP;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,cAAc;AAAA,UACd,aAAa;AAAA,QACf;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,EAAE,UAAU,UAAU,YAAY,KAAK,OAAO,eAAe;AAAA,cAEhE,2CAAQ;AAAA;AAAA,UACX;AAAA,WAEC,iCAAQ,aACP;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,EAAE,UAAU,UAAU,OAAO,kBAAkB,IAAI,MAAM;AAAA,cAE5D,iBAAO;AAAA;AAAA,UACV;AAAA,WAGD,iCAAQ,iBAAgB,OAAO,aAAa,SAAS,KACpD,oBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,UAAU,QAAQ,IAAI,EAAE,GACzD,iBAAO,aAAa;AAAA,YAAI,CAAC,OAAO,MAC/B,MAAM,UACJ,oBAAC,eAAoB,OAAO,MAAM,SAAhB,CAAuB,IAEzC;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI,EAAE,UAAU,WAAW,OAAO,iBAAiB;AAAA,gBAEnD;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,IAAI,EAAE,YAAY,KAAK,OAAO,gBAAgB,IAAI,MAAM;AAAA,sBAEvD;AAAA,8BAAM;AAAA,wBAAM;AAAA;AAAA;AAAA,kBACf;AAAA,kBACC,MAAM;AAAA;AAAA;AAAA,cATF;AAAA,YAUP;AAAA,UAEJ,GACF;AAAA;AAAA;AAAA,IAEJ;AAAA,KAGC,sCAAQ,aAAR,mBAAkB,IAAI,CAAC,SAAS,OAC/B;AAAA,MAAC;AAAA;AAAA,QAEC,IAAI;AAAA,UACF,IAAI;AAAA,UACJ,iBAAiB,KAAK,IAAI,WAAW;AAAA,QACvC;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,IAAI;AAAA,gBACJ,IAAI;AAAA,gBACJ,cAAc;AAAA,gBACd,aAAa;AAAA,gBACb,eAAe;AAAA,gBACf,eAAe;AAAA,cACjB;AAAA,cAEC,kBAAQ;AAAA;AAAA,UACX;AAAA,UAEA,oBAAC,gBAAa,SAAkB,SAAkB;AAAA;AAAA;AAAA,MAtB7C,QAAQ;AAAA,IAuBf;AAAA,KAEJ;AAEJ;AASe,SAAR,kBAAmC;AAAA,EACxC;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAA2B;AAruD3B;AAsuDE,QAAM,QAAQ,SAAS;AACvB,QAAM,UAAU,MAAM,QAAQ,QAAQ;AACtC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,CAAC;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAI,SAAuC;AAAA,IACzE,OAAO;AAAA,EACT,CAAC;AACD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAwB,IAAI;AAEhE,YAAU,MAAM;AACd,kBAAc,EAAE,OAAO,eAAe,CAAC;AACvC,kBAAc,IAAI;AAClB,iBAAa,CAAC;AAEd,QAAI,CAAC,QAAQ,CAAC,QAAS;AAEvB,QAAI,YAAY;AAEhB,UAAM,mBAAmB,YAAY;AAxvDzC,UAAAC,KAAAC,KAAA;AAyvDM,sBAAgB,IAAI;AACpB,UAAI;AACF,cAAM,MAAM,MAAM,cAAc;AAAA,UAC9B,UAAU,eAAe,QAAQ,QAAQ;AAAA,QAC3C;AAEA,YAAI,CAAC,UAAW,eAAc,IAAI,IAAI;AAAA,MACxC,SAAS,KAAU;AACjB,YAAI,CAAC,WAAW;AACd;AAAA,aACE,YAAAA,OAAAD,MAAA,2BAAK,aAAL,gBAAAA,IAAe,SAAf,gBAAAC,IAAqB,YAArB,YACE,2BAAK,YADP,YAEE;AAAA,UACJ;AACA,wBAAc,EAAE,OAAO,eAAe,CAAC;AAAA,QACzC;AAAA,MACF,UAAE;AACA,YAAI,CAAC,UAAW,iBAAgB,KAAK;AAAA,MACvC;AAAA,IACF;AAEA,qBAAiB;AACjB,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EAEF,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,SACE,iCAEG;AAAA;AAAA,IACA,QACC;AAAA,MACE,oBAAC,eAAY,QAAQ,YAAY,SAAkB;AAAA,MACnD,SAAS;AAAA,IACX;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAS;AAAA,QACT,WAAW;AAAA,UACT,OAAO;AAAA,YACL,IAAI;AAAA,cACF,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,eAAe;AAAA,cACf,UAAU;AAAA,cACV,cAAc;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI;AAAA,gBACrB,IAAI;AAAA,gBACJ,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,KAAK;AAAA,gBACL,cAAc;AAAA,gBACd,aAAa;AAAA,gBACb,YAAY;AAAA,cACd;AAAA,cAEA;AAAA,qCAAC,OAAI,IAAI,EAAE,UAAU,EAAE,GACrB;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,wBACF,YAAY;AAAA,wBACZ,UAAU,EAAE,IAAI,QAAQ,IAAI,SAAS;AAAA,wBACrC,OAAO;AAAA,wBACP,YAAY;AAAA,sBACd;AAAA,sBAEC,mDAAY;AAAA;AAAA,kBACf;AAAA,mBACC,yCAAY,aACX;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI,EAAE,UAAU,WAAW,OAAO,kBAAkB,IAAI,MAAM;AAAA,sBAE7D,qBAAW;AAAA;AAAA,kBACd;AAAA,mBAEJ;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,IAAI;AAAA,sBACF,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,iBAAiB;AAAA,sBACjB,OAAO;AAAA,sBACP,WAAW;AAAA,wBACT,iBAAiB;AAAA,wBACjB,OAAO;AAAA,sBACT;AAAA,sBACA,YAAY;AAAA,oBACd;AAAA,oBAEA,8BAAC,aAAU,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,gBACnC;AAAA;AAAA;AAAA,UACF;AAAA,WAGC,yCAAY,iBAAgB,WAAW,aAAa,SAAS,KAC5D;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI;AAAA,gBACrB,IAAI;AAAA,gBACJ,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,aAAa;AAAA,gBACb,iBAAiB;AAAA,gBACjB,YAAY;AAAA,cACd;AAAA,cAEC,qBAAW,aAAa;AAAA,gBAAI,CAAC,OAAO,MACnC,MAAM,UACJ,oBAAC,eAAoB,OAAO,MAAM,SAAhB,CAAuB,IAEzC;AAAA,kBAAC;AAAA;AAAA,oBAEC,IAAI;AAAA,sBACF,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,KAAK;AAAA,sBACL,IAAI;AAAA,sBACJ,QAAQ;AAAA,sBACR,QAAQ;AAAA,sBACR,aAAa;AAAA,sBACb,cAAc;AAAA,sBACd,iBAAiB;AAAA,oBACnB;AAAA,oBAEA;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAI;AAAA,4BACF,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,cAAc;AAAA,4BACd,iBAAiB;AAAA,4BACjB,YAAY;AAAA,0BACd;AAAA;AAAA,sBACF;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAI;AAAA,4BACF,UAAU;AAAA,4BACV,OAAO;AAAA,4BACP,YAAY;AAAA,0BACd;AAAA,0BAEA;AAAA;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAU;AAAA,gCACV,IAAI,EAAE,YAAY,KAAK,OAAO,gBAAgB,IAAI,MAAM;AAAA,gCAEvD;AAAA,wCAAM;AAAA,kCAAM;AAAA;AAAA;AAAA,4BACf;AAAA,4BACC,MAAM;AAAA;AAAA;AAAA,sBACT;AAAA;AAAA;AAAA,kBApCK;AAAA,gBAqCP;AAAA,cAEJ;AAAA;AAAA,UACF;AAAA,UAIF;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,cAAc;AAAA,gBACd,aAAa;AAAA,gBACb,iBAAiB;AAAA,gBACjB,YAAY;AAAA,cACd;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP,UAAU,CAAC,GAAG,MAAM,aAAa,CAAC;AAAA,kBAClC,SAAQ;AAAA,kBACR,eAAc;AAAA,kBACd,IAAI;AAAA,oBACF,WAAW;AAAA,oBACX,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,oBACnB,kBAAkB;AAAA,sBAChB,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,WAAW;AAAA,sBACX,eAAe;AAAA,sBACf,OAAO;AAAA,sBACP,IAAI;AAAA,sBACJ,IAAI;AAAA,sBACJ,kBAAkB,EAAE,OAAO,QAAQ;AAAA,oBACrC;AAAA,oBACA,wBAAwB,EAAE,iBAAiB,SAAS,QAAQ,EAAE;AAAA,kBAChE;AAAA,kBAEC,yDAAY,aAAZ,mBAAsB,IAAI,CAAC,YAC1B,oBAAC,OAAqB,OAAO,QAAQ,OAAO,eAAa,QAA/C,QAAQ,EAAwC;AAAA;AAAA,cAE9D;AAAA;AAAA,UACF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,EAAE,MAAM,GAAG,UAAU,QAAQ,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE;AAAA,cAE9D;AAAA,gCACC;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAI;AAAA,sBACF,SAAS;AAAA,sBACT,gBAAgB;AAAA,sBAChB,YAAY;AAAA,sBACZ,IAAI;AAAA,oBACN;AAAA,oBAEA,8BAAC,oBAAiB,MAAM,IAAI;AAAA;AAAA,gBAC9B;AAAA,gBAED,CAAC,gBAAgB,cAChB,oBAAC,SAAM,UAAS,WAAU,IAAI,EAAE,IAAI,GAAG,UAAU,UAAU,GACxD,sBACH;AAAA,gBAGD,CAAC,kBAAgB,8CAAY,aAAZ,mBAAuB,eACvC;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,WAAW,SAAS,SAAS;AAAA,oBACtC;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UAEJ;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;ADz8DA,OAAO,kBAAkB;AACzB,OAAO,iBAAiB;AACxB,OAAO,mBAAmB;AAC1B,OAAO,sBAAsB;AAC7B,OAAO,oBAAoB;AAE3B,OAAO,WAAsB;AAC7B,OAAO,aAAa;;;AEtCpB,SAAS,aAAa,YAAAC,iBAAgB;AAatC,SAAS,cAAc,QAAiC;AACvD,QAAM,KAAK,IAAI,gBAAgB;AAC/B,MAAI,OAAO,WAAY,IAAG,OAAO,cAAc,OAAO,UAAU;AAChE,MAAI,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,QAAQ;AAC1D,MAAI,OAAO,UAAU;AACpB,eAAW,MAAM,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,EAAE,CAAC;AAAA,EACnE;AACA,MAAI,OAAO,UAAU;AACpB,eAAW,MAAM,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,EAAE,CAAC;AAAA,EACnE;AACA,MAAI,OAAO,UAAW,IAAG,OAAO,aAAa,OAAO,SAAS;AAC7D,MAAI,OAAO,OAAQ,IAAG,OAAO,UAAU,OAAO,MAAM;AACpD,MAAI,OAAO,OAAQ,IAAG,OAAO,UAAU,OAAO,MAAM;AACpD,MAAI,OAAO,KAAM,IAAG,OAAO,QAAQ,OAAO,OAAO,IAAI,CAAC;AACtD,MAAI,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,OAAO,QAAQ,CAAC;AAClE,QAAM,MAAM,GAAG,SAAS;AACxB,SAAO,MAAM,IAAI,GAAG,KAAK;AAC1B;AA0JA,eAAsB,YAA8B;AAxLpD;AAyLC,QAAM,MAAM,MAAM,cAAc,IAAiD,UAAU,aAAa;AACxG,QAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,IAC/B,IAAI,OACJ,MAAM,SAAS,SAAI,SAAJ,mBAAkB,IAAI,IACnC,IAAI,KAAa,OAClB,CAAC;AACL,SAAQ,IAAwB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,aAAa,IAAI,UAAU,KAAK,EAAE;AACzG;AAYA,eAAsB,aAAa,QAAqD;AACvF,QAAM,KAAK,cAAc,MAAM;AAC/B,QAAM,MAAM,MAAM,cAAc,IAAuB,GAAG,UAAU,UAAU,GAAG,EAAE,EAAE;AACrF,SAAO,IAAI;AACZ;AAEA,eAAsB,uBAAuB,QAAwC;AAlNrF;AAmNC,QAAM,KAAK,cAAc,MAAM;AAC/B,QAAM,MAAM,MAAM,cAAc,IAAI,GAAG,UAAU,uBAAuB,GAAG,EAAE,IAAI,EAAE,cAAc,OAAO,CAAC;AACzG,QAAM,MAAM,OAAO,IAAI,gBAAgB,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;AAC3D,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW,eAAc,YAAO,eAAP,YAAqB,QAAQ;AACxD,WAAS,KAAK,YAAY,CAAC;AAC3B,IAAE,MAAM;AACR,IAAE,OAAO;AACT,SAAO,IAAI,gBAAgB,GAAG;AAC/B;AAEA,eAAsB,mBAAmB,UAAiC;AACzE,QAAM,MAAM,MAAM,cAAc,IAAI,UAAU,kBAAkB,QAAQ,GAAG,EAAE,cAAc,OAAO,CAAC;AACnG,SAAO,IAAI;AACZ;;;AFrGI,gBAAAC,MAyFE,QAAAC,aAzFF;AAjEJ,MAAM,OAAO,OAAO;AAEpB,IAAM,OACJ;AAEF,IAAM,SAAS;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,SAAS;AACX;AAEA,IAAM,oBAAoB;AAqB1B,IAAM,aAAa,CACjB,GACA,GACA,QACW;AACX,QAAM,KAAK,EAAE,GAA8B;AAC3C,QAAM,KAAK,EAAE,GAA8B;AAC3C,MAAI,OAAO,OAAO,YAAY,OAAO,OAAO,SAAU,QAAO,KAAK;AAClE,MAAI,OAAO,OAAO,aAAa,OAAO,OAAO;AAC3C,YAAQ,KAAK,IAAI,MAAM,KAAK,IAAI;AAClC,SAAO,OAAO,kBAAM,EAAE,EAAE,cAAc,OAAO,kBAAM,EAAE,CAAC;AACxD;AAEA,SAAS,aAAa,EAAE,MAAM,GAAsB;AAClD,QAAM,KAAK,SAAS,IAAI,YAAY;AACpC,MAAI,QAAQ;AACZ,MAAI,KAAK;AACT,MAAI,EAAE,SAAS,SAAS,GAAG;AACzB,YAAQ,OAAO;AACf,SAAK;AAAA,EACP,WAAW,EAAE,SAAS,UAAU,GAAG;AACjC,YAAQ,OAAO;AACf,SAAK;AAAA,EACP,WAAW,EAAE,SAAS,UAAU,GAAG;AACjC,YAAQ,OAAO;AACf,SAAK;AAAA,EACP;AACA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,MAAK;AAAA,MACL,IAAI;AAAA,QACF,YAAY;AAAA,QACZ,SAAS;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,WAAW,EAAE,MAAM,GAAsB;AAChD,QAAM,KAAK,SAAS,IAAI,YAAY;AACpC,MAAI,QAAQ;AACZ,MAAI,KAAK;AACT,MAAI,EAAE,SAAS,UAAU,GAAG;AAC1B,YAAQ,OAAO;AACf,SAAK;AAAA,EACP,WAAW,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,QAAQ,GAAG;AAC1D,YAAQ,OAAO;AACf,SAAK;AAAA,EACP;AACA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,MAAK;AAAA,MACL,IAAI;AAAA,QACF,YAAY;AAAA,QACZ,SAAS;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,UAAU,WAAW,IAAIE,UAAwB,IAAI;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,KAAK;AACxC,QAAM,cAAc,kBAAkB;AAEtC,QAAM,aAAa,YAAY;AAC7B,QAAI,SAAU;AACd,QAAI;AACF,iBAAW,IAAI;AACf,eAAS,KAAK;AACd,YAAM,OAAO,MAAM,mBAAmB,QAAQ;AAC9C,YAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,kBAAY,GAAG;AAAA,IACjB,SAAQ;AACN,eAAS,IAAI;AAAA,IACf,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,iBAAiB,YAAY;AACjC,QAAI;AACF,YAAM,OAAO,WACT,MAAM,MAAM,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAC1C,MAAM,mBAAmB,QAAQ;AACrC,YAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,OAAO;AACT,QAAE,WAAW,aAAa,QAAQ;AAClC,QAAE,MAAM;AACR,UAAI,gBAAgB,GAAG;AAAA,IACzB,SAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,WACE,gBAAAD,MAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GACzD;AAAA,sBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,UAAQ;AAAA,UACR,UAAQ;AAAA,UACR,KAAK;AAAA,UACL,SAAS,MAAM;AACb,gBAAI,SAAS,WAAW,OAAO,EAAG,KAAI,gBAAgB,QAAQ;AAC9D,wBAAY,IAAI;AAAA,UAClB;AAAA,UACA,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG;AAAA;AAAA,MAClC;AAAA,MACA,gBAAAA,KAAC,WAAQ,OAAM,YACb,0BAAAA;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,IAAI,EAAE,OAAO,OAAO,MAAM,GAAG,IAAI;AAAA,UAEjC,0BAAAJ,KAAC,oBAAiB,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,MAC1C,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAACE,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GACzD;AAAA,oBAAAH,KAAC,WAAQ,OAAO,eAAe,QAAQ,0BAA0B,QAC/D,0BAAAA,KAAC,UACC,0BAAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU,WAAW,SAAS;AAAA,QAC9B,IAAI,EAAE,OAAO,cAAc,YAAY,OAAO,OAAO,GAAG,IAAI;AAAA,QAE3D,oBACC,gBAAAJ,KAACK,mBAAA,EAAiB,MAAM,IAAI,IAE5B,gBAAAL,KAAC,iBAAc,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,IAEzC,GACF,GACF;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,eAAe,QAAQ,0BAA0B;AAAA,QAExD,0BAAAA,KAAC,UACC,0BAAAA;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,WAAW,SAAS;AAAA,YAC9B,IAAI,EAAE,OAAO,cAAc,YAAY,OAAO,MAAM,GAAG,IAAI;AAAA,YAE3D,0BAAAJ,KAAC,oBAAiB,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,QAC1C,GACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,SAAS,mBAAmB;AAC1B,QAAM,CAAC,WAAW,YAAY,IAAIE;AAAA,IAChC,MAAM,EAAE,QAAQ,KAAK;AAAA,EACvB;AACA,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAuB,MAAM,CAAC;AAC5D,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAE5C,OAAO;AACT,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,EAAE;AAE/C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAwB,CAAC,CAAC;AACtE,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,KAAK;AAElE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAkB,CAAC,CAAC;AAChD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAkB,CAAC,CAAC;AAEhE,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAiB,EAAE;AACnD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAiB,EAAE;AAEvD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA8B,CAAC,CAAC;AAC9D,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AAErC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,CAAC;AAClC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,iBAAiB;AAChE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkB,eAAe;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkB,MAAM;AAEtD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,KAAK;AAC5D,QAAM,CAAC,kBAAkB,mBAAmB,IAC1CA,UAAmC,IAAI;AAEzC,EAAAI,WAAU,MAAM;AACd,cAAU,EACP,KAAK,CAAC,SAAS,UAAU,QAAQ,CAAC,CAAC,CAAC,EACpC,MAAM,MAAM,SAAS,+BAA+B,CAAC;AAAA,EAC1D,GAAG,CAAC,CAAC;AAEL,QAAM,yBAAyB,CAAC,UAAsB;AACpD,uBAAmB,SAAS,IAAI;AAAA,EAClC;AAEA,QAAM,CAAC,iBAAiB,kBAAkB,IAAIJ,UAAS,EAAE;AACzD,QAAM,cAAc,OAAsC,MAAS;AAEnE,EAAAI,WAAU,MAAM;AACd,gBAAY,UAAU;AAAA,MACpB,MAAM,mBAAmB,WAAW,KAAK,CAAC;AAAA,MAC1C;AAAA,IACF;AACA,WAAO,MAAM,aAAa,YAAY,OAAO;AAAA,EAC/C,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,cAAcC;AAAA,IAClB,OAAO,YAAoB;AAzU/B;AA0UM,YAAM,KAAK,gCAAa,MAAM;AAC9B,YAAM,KAAK,4BAAW,MAAM;AAE5B,UAAI,CAAC,MAAM,CAAC,IAAI;AACd,iBAAS,2BAA2B;AACpC;AAAA,MACF;AAEA,YAAM,SAA0B;AAAA,QAC9B,YAAY,GAAG,OAAO,qBAAqB;AAAA,QAC3C,UAAU,GAAG,OAAO,qBAAqB;AAAA,QACzC,UACE,CAAC,sBAAsB,eAAe,SAAS,IAC3C,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,IAC9B;AAAA;AAAA,QAEN,UACE,eAAe,SAAS,KAAK,eAAe,SAAS,OAAO,SACxD,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,IAC9B;AAAA,QACN,WAAW,YAAY;AAAA,QACvB,QAAQ,cAAc;AAAA,QACtB,QAAQ,mBAAmB;AAAA,QAC3B,MAAM,UAAU;AAAA,QAChB,UAAU;AAAA,MACZ;AAEA,UAAI;AACF,iBAAS,EAAE;AACX,mBAAW,IAAI;AACf,cAAM,WAAgB,MAAM,aAAa,MAAM;AAC/C;AAAA,UACE,cAAiC,UAAU,CAAC,QAAQ,SAAS,CAAC;AAAA,QAChE;AACA;AAAA,WACE,4DAAU,YAAV,mBAAmB,UAAnB,YACE,qCAAU,UADZ,aAEE,0CAAU,SAAV,mBAAgB,UAFlB,YAGE;AAAA,QACJ;AAAA,MACF,SAAS,KAAU;AACjB,kBAAS,2BAAK,YAAW,4BAA4B;AACrD,mBAAW,CAAC,CAAC;AAAA,MACf,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,EAAAD,WAAU,MAAM;AACd,YAAQ,CAAC;AACT,gBAAY,CAAC;AAAA,EACf,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,gBAAgB,MAAM;AAC1B,QAAI,iBAAiB;AACnB,YAAM,MAAM,MAAM;AAClB,UAAI,KAAK,IAAI,QAAQ,KAAK;AAC1B,YAAM,KAAK;AACX,UAAI,oBAAoB,OAAQ,MAAK,IAAI,QAAQ,MAAM,EAAE,QAAQ,KAAK;AAAA,eAC7D,oBAAoB;AAC3B,aAAK,IAAI,QAAQ,OAAO,EAAE,QAAQ,KAAK;AACzC,mBAAa,EAAE;AACf,iBAAW,EAAE;AAAA,IACf,OAAO;AACL,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,mBAAmBC;AAAA,IACvB,CAAC,QAAoD,YAAoB;AACvE,cAAQ,OAAO;AACf,kBAAY,OAAO;AAAA,IACrB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,aAAa,CAAC,QAAiB;AACnC,QAAI,YAAY,KAAK;AACnB,iBAAW,CAAC,MAAO,MAAM,QAAQ,SAAS,KAAM;AAAA,IAClD,OAAO;AACL,iBAAW,GAAG;AACd,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,gBAAgB,QAAQ,MAAM;AAClC,UAAM,OAAO,CAAC,GAAG,OAAO;AACxB,SAAK,KAAK,CAAC,GAAG,MAAM;AAClB,YAAM,MAAM,WAAW,GAAG,GAAG,OAAO;AACpC,aAAO,YAAY,QAAQ,MAAM,CAAC;AAAA,IACpC,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,SAAS,OAAO,CAAC;AAE9B,QAAM,oBAAoB,YAAY;AACpC,UAAM,KAAK,gCAAa,MAAM;AAC9B,UAAM,KAAK,4BAAW,MAAM;AAC5B,UAAM,SAA0B;AAAA,MAC9B,YAAY,GAAG,OAAO,qBAAqB;AAAA,MAC3C,UAAU,GAAG,OAAO,qBAAqB;AAAA,MACzC,UACE,CAAC,sBAAsB,eAAe,SAAS,IAC3C,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,IAC9B;AAAA,MACN,UACE,eAAe,SAAS,KAAK,eAAe,SAAS,OAAO,SACxD,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,IAC9B;AAAA,MACN,WAAW,YAAY;AAAA,MACvB,QAAQ,cAAc;AAAA,MACtB,QAAQ,mBAAmB;AAAA,IAC7B;AACA,QAAI;AACF,YAAM,uBAAuB,MAAM;AAAA,IACrC,SAAS,KAAU;AACjB,gBAAS,2BAAK,YAAW,wBAAwB;AAAA,IACnD;AAAA,EACF;AAEA,SACE,gBAAAN,MAAC,wBAAqB,aAAa,cACjC;AAAA,oBAAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,IAAI;AAAA,UACF,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,QACd;AAAA,QAEA;AAAA,0BAAAH;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,SACE,gBAAAC,MAAC,SAAM,WAAU,OAAM,YAAW,UAAS,SAAS,GAClD;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,aAAY;AAAA,oBACZ,OAAO;AAAA;AAAA,gBACT;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,aAAa;AAAA,sBACX,gBAAgB;AAAA,sBAChB,gBAAgB;AAAA,oBAClB;AAAA,oBACA,cAAc;AAAA,oBAEd,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,WACE,gBAAAA,KAAC,gBAAa,IAAI,EAAE,UAAU,qBAAqB,GAAG;AAAA,wBAExD,UAAU,CAAC,QAAQ;AAAA,wBACnB,SAAS;AAAA,wBACT,IAAI,EAAE,QAAQ,GAAG;AAAA,wBAClB;AAAA;AAAA,oBAED;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA;AAAA,UAEJ;AAAA,UAEA,gBAAAC,MAACE,MAAA,EAAI,IAAI,EAAE,MAAM,GAAG,UAAU,QAAQ,IAAI,KAAK,IAAI,EAAE,GACnD;AAAA,4BAAAF,MAACE,MAAA,EAAI,IAAI,EAAE,IAAI,IAAI,GACjB;AAAA,8BAAAH;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA,eAAe;AAAA,kBACf,aAAa;AAAA,kBACb,YAAY,mBAAmB;AAAA,kBAC/B,oBAAoB;AAAA,kBACpB,iBAAe;AAAA,kBACf;AAAA,kBACA,gBAAgB;AAAA,kBAChB;AAAA,kBACA,iBAAe;AAAA,kBACf;AAAA,kBACA;AAAA,kBACA,gBAAgB;AAAA,kBAChB,oBAAkB;AAAA,kBAClB,kBAAkB;AAAA,kBAClB,kBAAkB;AAAA,kBAClB,kBAAgB;AAAA,kBAChB,gBAAgB;AAAA,kBAChB,gBAAgB;AAAA,kBAChB,OACE,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WACE,gBAAAA,KAAC,eAAY,IAAI,EAAE,UAAU,oBAAoB,GAAG;AAAA,sBAEtD,UAAU;AAAA,sBACV,SAAS;AAAA,sBACT,IAAI,EAAE,QAAQ,GAAG;AAAA,sBAClB;AAAA;AAAA,kBAED;AAAA;AAAA,cAEJ;AAAA,cAEC,SACC,gBAAAA;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,UAAS;AAAA,kBACT,IAAI,EAAE,IAAI,GAAG,YAAY,MAAM,UAAU,UAAU;AAAA,kBAElD;AAAA;AAAA,cACH;AAAA,eAEJ;AAAA,YAEC,WACC,gBAAAR,KAACG,MAAA,EAAI,IAAI,EAAE,WAAW,UAAU,IAAI,IAAI,GACtC,0BAAAH,KAACK,mBAAA,EAAiB,IAAI,EAAE,OAAO,OAAO,KAAK,GAAG,MAAM,IAAI,GAC1D;AAAA,YAGF,gBAAAJ;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,gBACX,IAAI;AAAA,kBACF,cAAc;AAAA,kBACd,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,IAAI;AAAA,gBACN;AAAA,gBAEA;AAAA,kCAAAD,KAACS,iBAAA,EACC,0BAAAR;AAAA,oBAACS;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,IAAI;AAAA,wBACF,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,wBAAwB;AAAA,0BACtB,YAAY;AAAA,0BACZ,UAAU;AAAA,0BACV,cAAc;AAAA,0BACd,IAAI;AAAA,0BACJ,IAAI;AAAA,wBACN;AAAA,sBACF;AAAA,sBAEA;AAAA,wCAAAV,KAACW,YAAA,EACC,0BAAAV,MAACW,WAAA,EAEG;AAAA;AAAA,4BACE,EAAE,IAAI,eAA0B,OAAO,eAAe;AAAA,4BACtD,EAAE,IAAI,iBAA4B,OAAO,aAAa;AAAA,4BACtD,EAAE,IAAI,YAAuB,OAAO,YAAY;AAAA,4BAChD,EAAE,IAAI,cAAyB,OAAO,SAAS;AAAA,4BAC/C,EAAE,IAAI,aAAwB,OAAO,YAAY;AAAA,4BACjD,EAAE,IAAI,aAAwB,OAAO,SAAS;AAAA,4BAC9C,EAAE,IAAI,aAAwB,OAAO,YAAY;AAAA,4BACjD;AAAA,8BACE,IAAI;AAAA,8BACJ,OAAO;AAAA,4BACT;AAAA,4BACA;AAAA,8BACE,IAAI;AAAA,8BACJ,OAAO;AAAA,4BACT;AAAA,4BACA;AAAA,8BACE,IAAI;AAAA,8BACJ,OAAO;AAAA,4BACT;AAAA,4BACA;AAAA,8BACE,IAAI;AAAA,8BACJ,OAAO;AAAA,4BACT;AAAA,4BACA;AAAA,8BACE,IAAI;AAAA,8BACJ,OAAO;AAAA,4BACT;AAAA,4BACA,EAAE,IAAI,eAA0B,OAAO,cAAc;AAAA,4BACrD,EAAE,IAAI,WAAsB,OAAO,UAAU;AAAA,4BAC7C;AAAA,8BACE,IAAI;AAAA,8BACJ,OAAO;AAAA,4BACT;AAAA,0BACF,EACA,IAAI,CAAC,QACL,gBAAAZ,KAACa,YAAA,EAAuB,IAAI,YAC1B,0BAAAb;AAAA,4BAAC;AAAA;AAAA,8BACC,QAAQ,YAAY,IAAI;AAAA,8BACxB,WAAW,YAAY,IAAI,KAAK,UAAU;AAAA,8BAC1C,SAAS,MAAM,WAAW,IAAI,EAAE;AAAA,8BAChC,IAAI;AAAA,gCACF,4BAA4B,EAAE,OAAO,OAAO;AAAA,gCAC5C,kCAAkC,EAAE,OAAO,OAAO;AAAA,gCAClD,gBAAgB,EAAE,OAAO,OAAO;AAAA,gCAChC,6BAA6B;AAAA,kCAC3B,OAAO;AAAA,gCACT;AAAA,8BACF;AAAA,8BAEC,cAAI;AAAA;AAAA,0BACP,KAfc,IAAI,EAgBpB,CACD;AAAA,0BACD,gBAAAA;AAAA,4BAACa;AAAA,4BAAA;AAAA,8BACC,IAAI,iCAAM,aAAN,EAA6B,UAAU,IAAI;AAAA,8BAChD;AAAA;AAAA,0BAED;AAAA,0BACA,gBAAAb;AAAA,4BAACa;AAAA,4BAAA;AAAA,8BACC,IAAI,iCAAM,aAAN,EAA6B,UAAU,IAAI;AAAA,8BAChD;AAAA;AAAA,0BAED;AAAA,2BACF,GACF;AAAA,wBAEA,gBAAAb,KAACc,YAAA,EACE,wBAAc,IAAI,CAAC,KAAK,QACvB,gBAAAb;AAAA,0BAACW;AAAA,0BAAA;AAAA,4BAEC,OAAK;AAAA,4BACL,IAAI;AAAA,8BACF,iBAAiB;AAAA,8BACjB,WAAW,EAAE,iBAAiB,UAAU;AAAA,4BAC1C;AAAA,4BAEA;AAAA,8CAAAZ;AAAA,gCAACa;AAAA,gCAAA;AAAA,kCACC,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,OAAO,OAAO;AAAA,oCACd,UAAU;AAAA,kCACZ;AAAA,kCAEC,cAAI,eAAe;AAAA;AAAA,8BACtB;AAAA,8BACA,gBAAAb,KAACa,YAAA,EAAU,IAAI,EAAE,UAAU,WAAW,OAAO,UAAU,GACpD,cAAI,gBACD,MAAM,IAAI,aAAa,EAAE;AAAA,gCACvB;AAAA,8BACF,IACA,IACN;AAAA,8BACA,gBAAAb,KAACa,YAAA,EACC,0BAAAb,KAAC,gBAAa,OAAO,IAAI,YAAY,IAAI,GAC3C;AAAA,8BACA,gBAAAA,KAACa,YAAA,EACC,0BAAAb,KAAC,cAAW,OAAO,IAAI,cAAc,IAAI,GAC3C;AAAA,8BACA,gBAAAA,KAACa,YAAA,EAAU,IAAI,EAAE,UAAU,WAAW,OAAO,UAAU,GACpD,cAAI,aAAa,IACpB;AAAA,8BACA,gBAAAb,KAACa,YAAA,EACE,cAAI,YACH,gBAAAb;AAAA,gCAAC;AAAA;AAAA,kCACC,OAAO,IAAI;AAAA,kCACX,MAAK;AAAA,kCACL,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,iBAAiB;AAAA,oCACjB,OAAO,OAAO;AAAA,oCACd,YAAY;AAAA,oCACZ,UAAU;AAAA,oCACV,QAAQ;AAAA,kCACV;AAAA;AAAA,8BACF,IACE,MACN;AAAA,8BACA,gBAAAA,KAACa,YAAA,EAAU,IAAI,EAAE,UAAU,WAAW,OAAO,UAAU,GACpD,cAAI,aAAa,IACpB;AAAA,8BACA,gBAAAb;AAAA,gCAACa;AAAA,gCAAA;AAAA,kCACC,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,OAAO,OAAO;AAAA,oCACd,UAAU;AAAA,oCACV,oBAAoB;AAAA,kCACtB;AAAA,kCAEC,cAAI,mBAAmB;AAAA;AAAA,8BAC1B;AAAA,8BACA,gBAAAb;AAAA,gCAACa;AAAA,gCAAA;AAAA,kCACC,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,OAAO,OAAO;AAAA,oCACd,UAAU;AAAA,oCACV,oBAAoB;AAAA,kCACtB;AAAA,kCAEC,cAAI,mBAAmB;AAAA;AAAA,8BAC1B;AAAA,8BACA,gBAAAb;AAAA,gCAACa;AAAA,gCAAA;AAAA,kCACC,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,UAAU;AAAA,oCACV,oBAAoB;AAAA,kCACtB;AAAA,kCAEC,cAAI,sBAAsB;AAAA;AAAA,8BAC7B;AAAA,8BACA,gBAAAb;AAAA,gCAACa;AAAA,gCAAA;AAAA,kCACC,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,UAAU;AAAA,oCACV,oBAAoB;AAAA,kCACtB;AAAA,kCAEC,cAAI,oBAAoB;AAAA;AAAA,8BAC3B;AAAA,8BACA,gBAAAb;AAAA,gCAACa;AAAA,gCAAA;AAAA,kCACC,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,UAAU;AAAA,oCACV,oBAAoB;AAAA,kCACtB;AAAA,kCAEC,cAAI,qBAAqB;AAAA;AAAA,8BAC5B;AAAA,8BACA,gBAAAb,KAACa,YAAA,EAAU,IAAI,EAAE,UAAU,WAAW,OAAO,UAAU,GACpD,cAAI,eAAe,IACtB;AAAA,8BACA,gBAAAb,KAACa,YAAA,EAAU,IAAI,EAAE,UAAU,WAAW,OAAO,UAAU,GACpD,cAAI,UACH,gBAAAb,KAAC,WAAQ,OAAO,IAAI,SAClB,0BAAAA;AAAA,gCAAC;AAAA;AAAA,kCACC,OAAO;AAAA,oCACL,SAAS;AAAA,oCACT,UAAU;AAAA,oCACV,UAAU;AAAA,oCACV,cAAc;AAAA,oCACd,YAAY;AAAA,oCACZ,eAAe;AAAA,kCACjB;AAAA,kCAEC,cAAI;AAAA;AAAA,8BACP,GACF,IAEA,IAEJ;AAAA,8BACA,gBAAAA,KAACa,YAAA,EACE,cAAI,iBACH,gBAAAb;AAAA,gCAAC;AAAA;AAAA,kCACC,OAAM;AAAA,kCACN,MAAK;AAAA,kCACL,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,iBAAiB;AAAA,oCACjB,OAAO,OAAO;AAAA,oCACd,YAAY;AAAA,oCACZ,UAAU;AAAA,oCACV,QAAQ;AAAA,oCACR,cAAc;AAAA,kCAChB;AAAA;AAAA,8BACF,IAEA,gBAAAA;AAAA,gCAAC;AAAA;AAAA,kCACC,OAAM;AAAA,kCACN,MAAK;AAAA,kCACL,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,iBAAiB;AAAA,oCACjB,OAAO;AAAA,oCACP,YAAY;AAAA,oCACZ,UAAU;AAAA,oCACV,QAAQ;AAAA,oCACR,cAAc;AAAA,kCAChB;AAAA;AAAA,8BACF,GAEJ;AAAA,8BACA,gBAAAA,KAACa,YAAA,EACE,cAAI,WACH,gBAAAb;AAAA,gCAAC;AAAA;AAAA,kCACC,UAAU,IAAI;AAAA,kCACd,eAAe,IAAI;AAAA;AAAA,8BACrB,IACE,MACN;AAAA,8BACA,gBAAAA,KAACa,YAAA,EACC,0BAAAb,KAAC,WAAQ,OAAM,qBACb,0BAAAA;AAAA,gCAACI;AAAA,gCAAA;AAAA,kCACC,MAAK;AAAA,kCACL,SAAS,MAAM;AACb,wDAAoB,GAAG;AACvB,uDAAmB,IAAI;AAAA,kCACzB;AAAA,kCACA,IAAI,EAAE,OAAO,OAAO,MAAM,GAAG,IAAI;AAAA,kCAEjC,0BAAAJ,KAAC,kBAAe,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,8BACxC,GACF,GACF;AAAA;AAAA;AAAA,0BA7KK,IAAI,YAAY;AAAA,wBA8KvB,CACD,GACH;AAAA;AAAA;AAAA,kBACF,GACF;AAAA,kBAEA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO;AAAA,sBACP;AAAA,sBACA,cAAc;AAAA,sBACd;AAAA,sBACA,oBAAoB,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,sBACxC,qBAAqB,CAAC,MAAM;AAC1B,uCAAe,SAAS,EAAE,OAAO,OAAO,EAAE,CAAC;AAC3C,gCAAQ,CAAC;AAAA,sBACX;AAAA,sBACA,IAAI;AAAA,wBACF,WAAW;AAAA,wBACX,YAAY;AAAA,wBACZ,uCAAuC;AAAA,0BACrC,YAAY;AAAA,0BACZ,UAAU;AAAA,wBACZ;AAAA,wBACA,qCAAqC;AAAA,0BACnC,YAAY;AAAA,0BACZ,UAAU;AAAA,wBACZ;AAAA,sBACF;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YACF;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,SAAS,MAAM;AACb,6BAAmB,KAAK;AACxB,8BAAoB,IAAI;AAAA,QAC1B;AAAA,QACA,SAAS,8CAAoB;AAAA;AAAA,IAC/B;AAAA,KACF;AAEJ;AAEA,IAAM,YAAsB,MAC1B,gBAAAA,KAAC,eACC,0BAAAA,KAAC,oBAAiB,GACpB;AAGF,IAAO,oBAAQ;","names":["useCallback","useEffect","useState","Alert","Box","Table","TableBody","TableCell","TableContainer","TableHead","TableRow","CircularProgress","IconButton","_a","_b","useState","jsx","jsxs","useState","Box","IconButton","CircularProgress","useEffect","useCallback","Alert","TableContainer","Table","TableHead","TableRow","TableCell","TableBody"]}
package/dist/index.js CHANGED
@@ -31817,9 +31817,9 @@ function StatusIconBadge({ label }) {
31817
31817
  const key = label.toLowerCase().replace(/[^a-z]/g, "");
31818
31818
  let icon;
31819
31819
  if (key === "complied" || key === "completed") {
31820
- icon = /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_CheckCircleOutline.default, { sx: { fontSize: 15, color: "#2e7d32" } });
31820
+ icon = /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_CheckCircleOutlined.default, { sx: { fontSize: 15, color: "#2e7d32" } });
31821
31821
  } else if (key === "partial") {
31822
- icon = /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_RemoveCircleOutline.default, { sx: { fontSize: 15, color: "#e65100" } });
31822
+ icon = /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_RemoveCircleOutlined.default, { sx: { fontSize: 15, color: "#e65100" } });
31823
31823
  } else {
31824
31824
  icon = /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_HighlightOff.default, { sx: { fontSize: 15, color: "#c62828" } });
31825
31825
  }
@@ -32736,7 +32736,7 @@ function AuditReportDialog({
32736
32736
  )
32737
32737
  ] });
32738
32738
  }
32739
- var import_react30, import_react_dom2, import_material18, import_styles51, import_Close5, import_CheckCircleOutline, import_HighlightOff, import_RemoveCircleOutline, import_jsx_runtime74, STATUS_COLOUR, TH, TD, PRINT_ROOT_ID, PRINT_STYLES;
32739
+ var import_react30, import_react_dom2, import_material18, import_styles51, import_Close5, import_CheckCircleOutlined, import_HighlightOff, import_RemoveCircleOutlined, import_jsx_runtime74, STATUS_COLOUR, TH, TD, PRINT_ROOT_ID, PRINT_STYLES;
32740
32740
  var init_AuditReport = __esm({
32741
32741
  "call-control-sdk/lib/pages/common/components/AuditReport.tsx"() {
32742
32742
  "use strict";
@@ -32745,9 +32745,9 @@ var init_AuditReport = __esm({
32745
32745
  import_material18 = require("@mui/material");
32746
32746
  import_styles51 = require("@mui/material/styles");
32747
32747
  import_Close5 = __toESM(require("@mui/icons-material/Close"));
32748
- import_CheckCircleOutline = __toESM(require("@mui/icons-material/CheckCircleOutline"));
32748
+ import_CheckCircleOutlined = __toESM(require("@mui/icons-material/CheckCircleOutlined"));
32749
32749
  import_HighlightOff = __toESM(require("@mui/icons-material/HighlightOff"));
32750
- import_RemoveCircleOutline = __toESM(require("@mui/icons-material/RemoveCircleOutline"));
32750
+ import_RemoveCircleOutlined = __toESM(require("@mui/icons-material/RemoveCircleOutlined"));
32751
32751
  init_axios();
32752
32752
  init_endPoint();
32753
32753
  import_jsx_runtime74 = require("react/jsx-runtime");