{"version":3,"sources":["../call-control-sdk/lib/pages/cdrReport/index.tsx","../call-control-sdk/lib/pages/common/components/FieldMappingDialog.tsx"],"sourcesContent":["import React, {\r\n  useCallback,\r\n  useEffect,\r\n  useMemo,\r\n  useRef,\r\n  useState,\r\n} from \"react\";\r\nimport {\r\n  Alert,\r\n  Box,\r\n  Chip,\r\n  Paper,\r\n  Stack,\r\n  Table,\r\n  TableBody,\r\n  TableCell,\r\n  TableContainer,\r\n  TableHead,\r\n  TableRow,\r\n  TablePagination,\r\n  TableSortLabel,\r\n  CircularProgress,\r\n  IconButton,\r\n  Tooltip,\r\n  Typography,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport AuditReportDialog from \"../common/components/AuditReport\";\r\nimport ConferenceTimelineDialog from \"../common/components/ConferenceTimeline\";\r\n\r\nimport ReportFilterBar, {\r\n  type QuickRange,\r\n  type DidOption,\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\nimport GroupsIcon from \"@mui/icons-material/Groups\";\r\nimport SettingsIcon from \"@mui/icons-material/Settings\";\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  getCdrFilterDids,\r\n  getFieldMapping,\r\n  type Queue,\r\n} from \"./useCdrReport\";\r\nimport { deepFindArray } from \"../../services/axios\";\r\nimport type { CdrReportParams, CdrRecordResponse, FieldMappingResponse } from \"./types\";\r\nimport FieldMappingDialog from \"../common/components/FieldMappingDialog\";\r\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\r\nimport { headCellSx } from \"../common/utils/tableStyles\";\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport SearchBar from \"../common/components/SearchBar\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { useSDKPermissions } from \"../../hooks/useSDKPermissions\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\nimport { useNumberMask } from \"../../utils/numberMask\";\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  | \"source\"\r\n  | \"callStatus\"\r\n  | \"agentName\"\r\n  | \"agentUserId\"\r\n  | \"queueName\"\r\n  | \"extension\"\r\n  | \"talkDurationFmt\"\r\n  | \"holdDurationFmt\"\r\n  | \"userRingingDurationFmt\"\r\n  | \"customerRingingDurationFmt\"\r\n  | \"queueDurationFmt\"\r\n  | \"ivrDurationFmt\"\r\n  | \"wrapupDurationFmt\"\r\n  | \"disposition\"\r\n  | \"parentAgentDisposition\"\r\n  | \"agentSelectedDisposition\"\r\n  | \"hangupInitiator\"\r\n  | \"remarks\"\r\n  | \"wasTransferred\"\r\n  | \"callUuid\"\r\n  | \"channelId\";\r\n\r\ntype SortDir = \"asc\" | \"desc\";\r\n\r\n/* Fallback for rows that carry only the seconds variant of a duration. */\r\nconst fmtHms = (s?: number | null): string => {\r\n  if (s == null || !isFinite(s) || s < 0) return \"\";\r\n  const h = Math.floor(s / 3600);\r\n  const m = Math.floor((s % 3600) / 60);\r\n  const sec = Math.floor(s % 60);\r\n  return [h, m, sec].map((n) => String(n).padStart(2, \"0\")).join(\":\");\r\n};\r\n\r\n/* The conference filter is held as a select-friendly string; the API wants a real\r\n   boolean, or the param left off entirely for \"all calls\". */\r\nconst toConferenceFlag = (value: string): boolean | undefined =>\r\n  value === \"\" ? undefined : value === \"true\";\r\n\r\n/* Tints for disposition badges, picked from the root category so a category always\r\n   carries the same colour across rows and across the two disposition columns. */\r\nconst DISPOSITION_TINTS = [\r\n  { color: \"#1565c8\", bg: \"#e8f0fe\" },\r\n  { color: \"#0a9a62\", bg: \"#e6f5ed\" },\r\n  { color: \"#6b3fbf\", bg: \"#f0ebfa\" },\r\n  { color: \"#c47c00\", bg: \"#fff4e0\" },\r\n  { color: \"#0f7c8a\", bg: \"#e3f4f6\" },\r\n  { color: \"#b3357a\", bg: \"#fceaf3\" },\r\n] as const;\r\n\r\nconst dispositionTint = (key: string) => {\r\n  let h = 0;\r\n  for (let i = 0; i < key.length; i += 1) h = (h * 31 + key.charCodeAt(i)) >>> 0;\r\n  return DISPOSITION_TINTS[h % DISPOSITION_TINTS.length];\r\n};\r\n\r\n/**\r\n * Dispositions arrive as a `parent > child > leaf` path. Printing the whole path\r\n * wraps to three lines and blows up the row height, so the badge shows the leaf\r\n * (the part that actually identifies the outcome), tinted by its root category,\r\n * with a depth marker and the full breadcrumb on hover.\r\n */\r\nconst splitDisposition = (value?: string | null): string[] =>\r\n  (value ?? \"\")\r\n    .split(\">\")\r\n    .map((p) => p.trim())\r\n    .filter(Boolean);\r\n\r\n/* The leaf's parent, e.g. \"HR_Job\" in \"General Enquiry > HR_Job > Provided Email Ph No\". */\r\nconst parentDisposition = (value?: string | null): string | null => {\r\n  const parts = splitDisposition(value);\r\n  return parts.length > 1 ? parts[parts.length - 2] : null;\r\n};\r\n\r\nfunction DispositionCell({ value, parent = false }: { value: string | null; parent?: boolean }) {\r\n  const raw = value?.trim();\r\n  if (!raw) return null;\r\n\r\n  const parts = splitDisposition(raw);\r\n  const nested = parts.length > 1;\r\n  // `parent` labels the badge with the leaf's parent instead of the leaf itself.\r\n  if (parent && !nested) return null;\r\n  const root = parts[0] || raw;\r\n  const leaf = (parent ? parts[parts.length - 2] : parts[parts.length - 1]) || raw;\r\n  const hidden = parent ? 0 : parts.length - 1;\r\n  const tint = dispositionTint(root.toLowerCase());\r\n\r\n  return (\r\n    <Tooltip title={nested ? parts.join(\"  ›  \") : \"\"} placement=\"top\">\r\n      <Box\r\n        component=\"span\"\r\n        sx={{\r\n          display: \"inline-flex\",\r\n          alignItems: \"center\",\r\n          gap: 0.55,\r\n          maxWidth: 210,\r\n          minWidth: 0,\r\n          px: 0.75,\r\n          py: 0.3,\r\n          borderRadius: \"6px\",\r\n          bgcolor: tint.bg,\r\n          color: tint.color,\r\n          verticalAlign: \"middle\",\r\n        }}\r\n      >\r\n        <Box\r\n          sx={{\r\n            width: 6,\r\n            height: 6,\r\n            borderRadius: \"50%\",\r\n            bgcolor: tint.color,\r\n            opacity: 0.85,\r\n            flexShrink: 0,\r\n          }}\r\n        />\r\n        <Box\r\n          component=\"span\"\r\n          sx={{\r\n            fontSize: \"0.68rem\",\r\n            fontWeight: 600,\r\n            lineHeight: 1.4,\r\n            overflow: \"hidden\",\r\n            textOverflow: \"ellipsis\",\r\n            whiteSpace: \"nowrap\",\r\n          }}\r\n        >\r\n          {leaf}\r\n        </Box>\r\n        {hidden > 0 && (\r\n          <Box\r\n            component=\"span\"\r\n            sx={{\r\n              fontSize: \"0.6rem\",\r\n              fontWeight: 700,\r\n              opacity: 0.55,\r\n              flexShrink: 0,\r\n            }}\r\n          >\r\n            +{hidden}\r\n          </Box>\r\n        )}\r\n      </Box>\r\n    </Tooltip>\r\n  );\r\n}\r\n\r\n/* Long identifiers (call UUID, channel) truncate with the full value on hover. */\r\nfunction IdCell({ value, maxWidth = 150 }: { value: string | null; maxWidth?: number }) {\r\n  if (!value) return null;\r\n  return (\r\n    <Tooltip title={value}>\r\n      <span\r\n        style={{\r\n          display: \"inline-block\",\r\n          maxWidth,\r\n          overflow: \"hidden\",\r\n          textOverflow: \"ellipsis\",\r\n          whiteSpace: \"nowrap\",\r\n          verticalAlign: \"bottom\",\r\n        }}\r\n      >\r\n        {value}\r\n      </span>\r\n    </Tooltip>\r\n  );\r\n}\r\n\r\n// Column → backend sortBy. The parent disposition is the first segment of the\r\n// agent disposition path, so sorting the full path orders parents too.\r\nconst serverSortKey = (key: SortKey): string =>\r\n  key === \"parentAgentDisposition\" ? \"agentSelectedDisposition\" : key;\r\n\r\nfunction CallTypePill({ value }: { value: string }) {\r\n  const v = (value || \"\").toLowerCase();\r\n  let color = \"#6b7b8d\";\r\n  let bg = \"transparent\";\r\n  if (v.includes(\"inbound\")) {\r\n    color = COLORS.green;\r\n    bg = \"#e6f7ef\";\r\n  } else if (v.includes(\"outbound\")) {\r\n    color = COLORS.blue;\r\n    bg = \"#e3eefa\";\r\n  } else if (v.includes(\"internal\")) {\r\n    color = COLORS.purple;\r\n    bg = \"#f0e8ff\";\r\n  }\r\n  return (\r\n    <Chip\r\n      label={value}\r\n      size=\"small\"\r\n      sx={{\r\n        fontFamily: FONT,\r\n        bgcolor: bg,\r\n        color,\r\n        fontWeight: 600,\r\n        fontSize: \"0.65rem\",\r\n        height: 20,\r\n        borderRadius: \"6px\",\r\n      }}\r\n    />\r\n  );\r\n}\r\n\r\nfunction StatusPill({ value }: { value: string }) {\r\n  const v = (value || \"\").toLowerCase();\r\n  let color = \"#6b7b8d\";\r\n  let bg = \"transparent\";\r\n  if (v.includes(\"answered\")) {\r\n    color = COLORS.green;\r\n    bg = \"#e6f7ef\";\r\n  } else if (v.includes(\"abandoned\") || v.includes(\"missed\")) {\r\n    color = COLORS.red;\r\n    bg = \"#fce8e8\";\r\n  }\r\n  return (\r\n    <Chip\r\n      label={value}\r\n      size=\"small\"\r\n      sx={{\r\n        fontFamily: FONT,\r\n        bgcolor: bg,\r\n        color,\r\n        fontWeight: 600,\r\n        fontSize: \"0.65rem\",\r\n        height: 20,\r\n        borderRadius: \"6px\",\r\n      }}\r\n    />\r\n  );\r\n}\r\n\r\nconst fmtRecordingDuration = (s: number): string => {\r\n  if (!isFinite(s) || s < 0) return \"\";\r\n  const m = Math.floor(s / 60);\r\n  const sec = Math.floor(s % 60);\r\n  return `${m}:${sec.toString().padStart(2, \"0\")}`;\r\n};\r\n\r\n/* Coordinates playback so only one recording is open at a time. */\r\nconst activePlayers = new Set<(activeId: string) => void>();\r\nconst notifyPlay = (activeId: string) => {\r\n  activePlayers.forEach((fn) => fn(activeId));\r\n};\r\n\r\nfunction CdrTableRow({\r\n  row,\r\n  canViewAudit,\r\n  canViewRecording,\r\n  fieldMapping,\r\n  onAuditClick,\r\n  onConferenceClick,\r\n  colSpan,\r\n}: {\r\n  row: CdrRecordResponse;\r\n  canViewAudit: boolean;\r\n  canViewRecording: boolean;\r\n  fieldMapping: FieldMappingResponse | null;\r\n  onAuditClick: (row: CdrRecordResponse) => void;\r\n  onConferenceClick: (row: CdrRecordResponse) => void;\r\n  colSpan: number;\r\n}) {\r\n  const { maskNumber } = useNumberMask();\r\n  const [audioUrl, setAudioUrl] = useState<string | null>(null);\r\n  const [loadingAudio, setLoadingAudio] = useState(false);\r\n  const [hasError, setHasError] = useState(false);\r\n  const unavailable = row.recordingPath === null || !row.callUuid;\r\n\r\n  const closePlayer = useCallback(() => {\r\n    setAudioUrl((prev) => {\r\n      if (prev && prev.startsWith(\"blob:\")) URL.revokeObjectURL(prev);\r\n      return null;\r\n    });\r\n  }, []);\r\n\r\n  // Close this player whenever another recording starts playing.\r\n  useEffect(() => {\r\n    const onPlay = (activeId: string) => {\r\n      if (activeId !== row.callUuid) closePlayer();\r\n    };\r\n    activePlayers.add(onPlay);\r\n    return () => {\r\n      activePlayers.delete(onPlay);\r\n    };\r\n  }, [row.callUuid, closePlayer]);\r\n\r\n  const handlePlay = async () => {\r\n    if (audioUrl) return;\r\n    if (unavailable) return;\r\n    notifyPlay(row.callUuid);\r\n    setLoadingAudio(true);\r\n    setHasError(false);\r\n    try {\r\n      const blob = await getRecordingByCall(row.callUuid);\r\n      setAudioUrl(URL.createObjectURL(blob));\r\n    } catch {\r\n      setHasError(true);\r\n    } finally {\r\n      setLoadingAudio(false);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <>\r\n      <TableRow\r\n        hover\r\n        sx={{\r\n          backgroundColor: \"#fff\",\r\n          \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n        }}\r\n      >\r\n        {canViewAudit && (\r\n          <TableCell sx={{ textAlign: \"center\", verticalAlign: \"middle\" }}>\r\n            <Tooltip title=\"View Audit Report\">\r\n              <IconButton\r\n                size=\"small\"\r\n                onClick={() => onAuditClick(row)}\r\n                sx={{ color: COLORS.blue, p: 0.4 }}\r\n              >\r\n                <AssignmentIcon sx={{ fontSize: 16 }} />\r\n              </IconButton>\r\n            </Tooltip>\r\n          </TableCell>\r\n        )}\r\n        <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n          <IdCell value={row.callUuid || null} maxWidth={160} />\r\n        </TableCell>\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          {maskNumber(row.phoneNumber) || \"\"}\r\n        </TableCell>\r\n        <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\", whiteSpace: \"nowrap\" }}>\r\n          {row.callStartTime ? (\r\n            <Box component=\"div\" sx={{ display: \"flex\", flexDirection: \"column\", lineHeight: 1.2 }}>\r\n              <Typography component=\"span\" sx={{ fontSize: \"0.73rem\", color: \"#4a5568\", fontWeight: 500 }}>\r\n                {dayjs(row.callStartTime).format(\"DD MMM YYYY\")}\r\n              </Typography>\r\n              <Typography component=\"span\" sx={{ fontSize: \"0.71rem\", color: \"#7a8599\" }}>\r\n                {dayjs(row.callStartTime).format(\"hh:mm A\")}\r\n              </Typography>\r\n            </Box>\r\n          ) : (\r\n            \"\"\r\n          )}\r\n        </TableCell>\r\n        <TableCell>\r\n          <CallTypePill value={row.callType || \"\"} />\r\n        </TableCell>\r\n        <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n          {row.source ? (\r\n            <Chip\r\n              label={row.source}\r\n              size=\"small\"\r\n              sx={{\r\n                fontFamily: FONT,\r\n                bgcolor: \"#eef1f6\",\r\n                color: COLORS.navy,\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\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 sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n          {row.agentUserId || \"\"}\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 sx={{ fontSize: \"0.73rem\", color: \"#4a5568\", fontFamily: \"monospace\", letterSpacing: \"0.3px\" }}>\r\n          {row.didNumber ?? (row as any).did_number ?? (row as any).did ?? \"\"}\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.userRingingDurationFmt ||\r\n            fmtHms(row.userRingingDurationSeconds)}\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.customerRingingDurationFmt ||\r\n            fmtHms(row.customerRingingDurationSeconds)}\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.ivrDurationFmt || fmtHms(row.ivrDurationSeconds)}\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          <IdCell value={row.channelId} maxWidth={200} />\r\n        </TableCell>\r\n        <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n          <DispositionCell value={row.disposition} />\r\n        </TableCell>\r\n        <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n          <DispositionCell value={row.agentSelectedDisposition} parent />\r\n        </TableCell>\r\n        <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n          <DispositionCell value={row.agentSelectedDisposition} />\r\n        </TableCell>\r\n        <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n          {row.hangupInitiator || \"\"}\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        {(fieldMapping?.fields ?? []).map((f) => (\r\n          <TableCell key={f.fieldKey} sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n            {row.crmFields?.[f.fieldKey] != null ? String(row.crmFields[f.fieldKey]) : \"\"}\r\n          </TableCell>\r\n        ))}\r\n        {canViewRecording && (\r\n          <TableCell align=\"center\" sx={{ verticalAlign: \"middle\" }}>\r\n            {!unavailable && !hasError ? (\r\n              <IconButton\r\n                color=\"primary\"\r\n                onClick={handlePlay}\r\n                disabled={loadingAudio}\r\n                size=\"small\"\r\n                sx={{ color: COLORS.green, p: 0.4 }}\r\n              >\r\n                {loadingAudio ? <CircularProgress size={16} /> : <PlayArrowIcon sx={{ fontSize: 18 }} />}\r\n              </IconButton>\r\n            ) : (\r\n              <Chip size=\"small\" label=\"No File\" sx={{ fontSize: \"0.65rem\", height: 20 }} />\r\n            )}\r\n          </TableCell>\r\n        )}\r\n        <TableCell\r\n          sx={{ textAlign: \"center\", verticalAlign: \"middle\" }}\r\n        >\r\n          <ConferenceCell\r\n            row={row}\r\n            onOpen={() => onConferenceClick(row)}\r\n          />\r\n        </TableCell>\r\n      </TableRow>\r\n\r\n      {/* Audio player row */}\r\n      {audioUrl && (\r\n        <TableRow>\r\n          <TableCell colSpan={colSpan} sx={{ p: 0, backgroundColor: \"#fafbfc\" }}>\r\n            <Box p={2}>\r\n              <audio\r\n                controls\r\n                autoPlay\r\n                src={audioUrl}\r\n                onEnded={closePlayer}\r\n                style={{ width: \"100%\" }}\r\n              />\r\n            </Box>\r\n          </TableCell>\r\n        </TableRow>\r\n      )}\r\n    </>\r\n  );\r\n}\r\n\r\n/**\r\n * Conference timeline trigger. The backend flags each call with `isConference`,\r\n * and a call that never hit a bridge has nothing to show — so the button is\r\n * disabled with a reason rather than opening a dialog onto an empty state.\r\n *\r\n * Only an explicit `false` disables it: a backend that doesn't send the field\r\n * leaves it `undefined`, and the timeline stays reachable (the dialog has its own\r\n * \"never conferenced\" empty state for that case).\r\n */\r\nfunction ConferenceCell({\r\n  row,\r\n  onOpen,\r\n}: {\r\n  row: CdrRecordResponse;\r\n  onOpen: () => void;\r\n}) {\r\n  const notConference = row.isConference === false;\r\n  const disabled = !row.callUuid || notConference;\r\n\r\n  const hint = !row.callUuid\r\n    ? \"Call ID unavailable for this record\"\r\n    : notConference\r\n      ? \"Not a conference call — no other participants were bridged in\"\r\n      : \"View Conference Timeline\";\r\n\r\n  return (\r\n    <Tooltip title={hint}>\r\n      <span>\r\n        <IconButton\r\n          size=\"small\"\r\n          disabled={disabled}\r\n          onClick={onOpen}\r\n          sx={{\r\n            color: disabled ? \"#b0b8c8\" : COLORS.purple,\r\n            p: 0.4,\r\n            \"&.Mui-disabled\": { color: \"#c9d0db\" },\r\n          }}\r\n        >\r\n          <GroupsIcon sx={{ fontSize: 17 }} />\r\n        </IconButton>\r\n      </span>\r\n    </Tooltip>\r\n  );\r\n}\r\n\r\nfunction CdrReportContent() {\r\n  // These columns show when the backend grants the matching permission,\r\n  // OR when the user has the CDR \"manage\" permission.\r\n  const { hasAnyPermission, hasPermission } = useSDKPermissions();\r\n  const canManageCrmFields = hasPermission(SDK_PERMISSIONS.REPORTS_CDR_CRM_FORM_FIELDS);\r\n  // Phone numbers masked to their last digits without `phone_number:view_unmasked`. The\r\n  // Excel export is produced by the backend, so that copy has to be masked there.\r\n  const { maskNumber } = useNumberMask();\r\n  const canViewRecording = hasAnyPermission([\r\n    SDK_PERMISSIONS.REPORTS_CDR_RECORDING,\r\n    SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n  ]);\r\n  const canViewAudit = hasAnyPermission([\r\n    SDK_PERMISSIONS.REPORTS_CDR_AUDIT,\r\n    SDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n  ]);\r\n\r\n  const [startDate, setStartDate] = useState<Dayjs | null>(\r\n    dayjs().startOf(\"day\"),\r\n  );\r\n  const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n  const [activeQuickDate, setActiveQuickDate] = useState<\r\n    \"today\" | \"week\" | \"month\" | null\r\n  >(\"today\");\r\n  const [searchText, setSearchText] = useState(\"\");\r\n\r\n  const [selectedAgents, setSelectedAgents] = useState<AgentOption[]>([]);\r\n  const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\r\n\r\n  const [queues, setQueues] = useState<Queue[]>([]);\r\n  const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\r\n\r\n  const [dids, setDids] = useState<DidOption[]>([]);\r\n  const [selectedDids, setSelectedDids] = useState<DidOption[]>([]);\r\n\r\n  const [callType, setCallType] = useState<string>(\"\");\r\n  const [callStatus, setCallStatus] = useState<string>(\"\");\r\n  /* \"\" = all calls, \"true\" = conference only, \"false\" = non-conference only. */\r\n  const [conferenceFilter, setConferenceFilter] = 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 [exporting, setExporting] = 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  const [conferenceRow, setConferenceRow] = useState<CdrRecordResponse | null>(\r\n    null,\r\n  );\r\n  const [fieldMapping, setFieldMapping] = useState<FieldMappingResponse | null>(null);\r\n  const [fieldMappingDialogOpen, setFieldMappingDialogOpen] = useState(false);\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    getCdrFilterDids().then((data) => setDids(data || [])).catch(() => {});\r\n    if (canManageCrmFields) {\r\n      getFieldMapping(\"cdr_report\").then(setFieldMapping).catch(() => setFieldMapping(null));\r\n    }\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [canManageCrmFields]);\r\n\r\n  // Extract distinct DID numbers from loaded records to populate DID filter options\r\n  useEffect(() => {\r\n    const uniqueDids = Array.from(\r\n      new Set(records.map((r) => r.didNumber).filter(Boolean)),\r\n    ) as string[];\r\n    if (!uniqueDids.length) return;\r\n    setDids((prev) => {\r\n      const existingSet = new Set(prev.map((p) => p.didNumber));\r\n      const next = [...prev];\r\n      uniqueDids.forEach((num) => {\r\n        if (!existingSet.has(num)) {\r\n          next.push({ id: num, didNumber: num, friendlyName: num });\r\n        }\r\n      });\r\n      return next;\r\n    });\r\n  }, [records]);\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 didValues = selectedDids.map((d) => d.didNumber).filter(Boolean);\r\n      const didParam = didValues.length === 1 ? didValues[0] : didValues.length > 1 ? didValues : undefined;\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        queue_id:\r\n          selectedQueues.length > 0\r\n            ? selectedQueues.map((q) => q.id)\r\n            : undefined,\r\n        did: didParam,\r\n        did_number: didValues.length > 0 ? didValues : undefined,\r\n        call_type: callType || undefined,\r\n        status: callStatus || undefined,\r\n        search: debouncedSearch || undefined,\r\n        isConference: toConferenceFlag(conferenceFilter),\r\n        page: pageNum + 1,\r\n        pageSize: rowsPerPage,\r\n        sortBy: serverSortKey(sortKey),\r\n        sortOrder: sortDir,\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      queues.length,\r\n      selectedDids,\r\n      dids.length,\r\n      callType,\r\n      callStatus,\r\n      conferenceFilter,\r\n      debouncedSearch,\r\n      rowsPerPage,\r\n      sortKey,\r\n      sortDir,\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  // Records arrive sorted from the server (sortBy/sortOrder); a sort change\r\n  // re-fetches from page 1 so the order spans every page, not just this one.\r\n  const sortedRecords = records;\r\n\r\n  const handleExportExcel = async () => {\r\n    const sd = startDate ?? dayjs();\r\n    const ed = endDate ?? dayjs();\r\n    const didValues = selectedDids.map((d) => d.didNumber).filter(Boolean);\r\n    const didParam = didValues.length === 1 ? didValues[0] : didValues.length > 1 ? didValues : undefined;\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      queue_id:\r\n        selectedQueues.length > 0\r\n          ? selectedQueues.map((q) => q.id)\r\n          : undefined,\r\n      did: didParam,\r\n      did_number: didValues.length > 0 ? didValues : undefined,\r\n      call_type: callType || undefined,\r\n      status: callStatus || undefined,\r\n      search: debouncedSearch || undefined,\r\n      isConference: toConferenceFlag(conferenceFilter),\r\n      sortBy: serverSortKey(sortKey),\r\n      sortOrder: sortDir,\r\n    };\r\n    try {\r\n      setExporting(true);\r\n      await exportCdrReportToExcel(params);\r\n    } catch (err: any) {\r\n      setError(err?.message || \"Failed to export Excel\");\r\n    } finally {\r\n      setExporting(false);\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, call ID, 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                {canManageCrmFields && (\r\n                  <AppButton\r\n                    variant=\"outlined\"\r\n                    startIcon={\r\n                      <SettingsIcon sx={{ fontSize: \"0.95rem !important\" }} />\r\n                    }\r\n                    onClick={() => setFieldMappingDialogOpen(true)}\r\n                    sx={{ height: 36 }}\r\n                  >\r\n                    CRM Fields\r\n                  </AppButton>\r\n                )}\r\n                <AppButton\r\n                  startIcon={\r\n                    exporting\r\n                      ? <CircularProgress size={14} sx={{ color: \"#fff\" }} />\r\n                      : <DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />\r\n                  }\r\n                  disabled={exporting || !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              showDidSelect\r\n              dids={dids}\r\n              selectedDids={selectedDids}\r\n              onDidsChange={setSelectedDids}\r\n              showCallTypeSelect\r\n              selectedCallType={callType}\r\n              onCallTypeChange={setCallType}\r\n              showStatusSelect\r\n              selectedStatus={callStatus}\r\n              onStatusChange={setCallStatus}\r\n              showConferenceSelect\r\n              selectedConference={conferenceFilter}\r\n              onConferenceChange={setConferenceFilter}\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: 2000,\r\n                  fontFamily: FONT,\r\n                  \"& .MuiTableCell-root\": {\r\n                    fontFamily: FONT,\r\n                    fontSize: \"0.75rem\",\r\n                    borderBottom: \"1px solid #eef1f6\",\r\n                    py: 0.6,\r\n                    px: 1,\r\n                  },\r\n                }}\r\n              >\r\n                <TableHead>\r\n                  <TableRow>\r\n                    {canViewAudit && (\r\n                      <TableCell\r\n                        sx={{ ...(headCellSx as object), minWidth: 110, textAlign: \"center\" }}\r\n                      >\r\n                        Audit Report\r\n                      </TableCell>\r\n                    )}\r\n                    {(\r\n                      [\r\n                        { id: \"callUuid\" as SortKey, label: \"Caller ID\" },\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: \"source\" as SortKey, label: \"Source\" },\r\n                        { id: \"callStatus\" as SortKey, label: \"Status\" },\r\n                        { id: \"agentName\" as SortKey, label: \"User Name\" },\r\n                        { id: \"agentUserId\" as SortKey, label: \"User ID\" },\r\n                        { id: \"queueName\" as SortKey, label: \"Queue\" },\r\n                        { id: \"extension\" as SortKey, label: \"Extension\" },\r\n                        { id: \"didNumber\" as SortKey, label: \"DID Number\" },\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: \"userRingingDurationFmt\" as SortKey,\r\n                          label: \"User Ring Duration\",\r\n                        },\r\n                        {\r\n                          id: \"customerRingingDurationFmt\" as SortKey,\r\n                          label: \"Customer Ring Duration\",\r\n                        },\r\n                        {\r\n                          id: \"queueDurationFmt\" as SortKey,\r\n                          label: \"Queue Duration\",\r\n                        },\r\n                        {\r\n                          id: \"ivrDurationFmt\" as SortKey,\r\n                          label: \"IVR Duration\",\r\n                        },\r\n                        {\r\n                          id: \"wrapupDurationFmt\" as SortKey,\r\n                          label: \"Wrapup Duration\",\r\n                        },\r\n                        { id: \"channelId\" as SortKey, label: \"Actual Channel\" },\r\n                        { id: \"disposition\" as SortKey, label: \"Disposition\" },\r\n                        {\r\n                          id: \"parentAgentDisposition\" as SortKey,\r\n                          label: \"Parent Agent Disposition\",\r\n                        },\r\n                        {\r\n                          id: \"agentSelectedDisposition\" as SortKey,\r\n                          label: \"Agent Disposition\",\r\n                        },\r\n                        {\r\n                          id: \"hangupInitiator\" as SortKey,\r\n                          label: \"Hangup Initiator\",\r\n                        },\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                    {(fieldMapping?.fields ?? []).map((f) => (\r\n                      <TableCell key={f.fieldKey} sx={headCellSx}>{f.label}</TableCell>\r\n                    ))}\r\n                    {canViewRecording && (\r\n                      <TableCell\r\n                        sx={{ ...(headCellSx as object), minWidth: 90, textAlign: \"center\" }}\r\n                      >\r\n                        Recording\r\n                      </TableCell>\r\n                    )}\r\n                    <TableCell\r\n                      sx={{\r\n                        ...(headCellSx as object),\r\n                        minWidth: 100,\r\n                        textAlign: \"center\",\r\n                      }}\r\n                    >\r\n                      Conference\r\n                    </TableCell>\r\n                  </TableRow>\r\n                </TableHead>\r\n\r\n                <TableBody>\r\n                  {sortedRecords.map((row, idx) => (\r\n                    <CdrTableRow\r\n                      key={row.callUuid || idx}\r\n                      row={row}\r\n                      canViewAudit={canViewAudit}\r\n                      canViewRecording={canViewRecording}\r\n                      fieldMapping={fieldMapping}\r\n                      onAuditClick={(r) => {\r\n                        setSelectedAuditRow(r);\r\n                        setAuditDialogOpen(true);\r\n                      }}\r\n                      onConferenceClick={(r) => setConferenceRow(r)}\r\n                      colSpan={\r\n                        (canViewAudit ? 1 : 0) +\r\n                        25 +\r\n                        (fieldMapping?.fields?.length || 0) +\r\n                        (canViewRecording ? 1 : 0) +\r\n                        1\r\n                      }\r\n                    />\r\n                  ))}\r\n                  {!loading && sortedRecords.length === 0 && (\r\n                    <TableRow>\r\n                      <TableCell\r\n                        colSpan={\r\n                          (canViewAudit ? 1 : 0) +\r\n                          25 +\r\n                          (fieldMapping?.fields?.length || 0) +\r\n                          (canViewRecording ? 1 : 0) +\r\n                          1\r\n                        }\r\n                        align=\"center\"\r\n                        sx={{ py: 4, color: \"#999\", fontSize: \"0.82rem\" }}\r\n                      >\r\n                        No Records Found\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\r\n      <ConferenceTimelineDialog\r\n        open={!!conferenceRow}\r\n        onClose={() => setConferenceRow(null)}\r\n        callUuid={conferenceRow?.callUuid}\r\n        phoneNumber={conferenceRow?.phoneNumber}\r\n        agentName={conferenceRow?.agentName}\r\n      />\r\n\r\n      <FieldMappingDialog\r\n        open={fieldMappingDialogOpen}\r\n        onClose={() => setFieldMappingDialogOpen(false)}\r\n        reportType=\"cdr_report\"\r\n        title=\"CDR Report — CRM Fields\"\r\n        onSaved={(mapping) => {\r\n          setFieldMapping(mapping);\r\n          fetchReport(page);\r\n        }}\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, useMemo, useState } from \"react\";\r\nimport {\r\n\tBox, Typography, Checkbox, FormControl, Select, MenuItem, CircularProgress,\r\n\tList, ListItemButton, ListItemText, Dialog, DialogContent, DialogActions, IconButton,\r\n} from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport DynamicFormIcon from \"@mui/icons-material/DynamicForm\";\r\n\r\nimport AppButton from \"./AppButton\";\r\nimport SearchBar from \"./SearchBar\";\r\nimport {\r\n\tgetFieldMapping, saveFieldMapping, getCrmForms, getCrmFormFields,\r\n} from \"../../cdrReport/useCdrReport\";\r\nimport type { CrmFormOption, CrmFormFieldOption, FieldMappingResponse } from \"../../cdrReport/types\";\r\n\r\nconst TEAL = \"#1A5F6C\";\r\n\r\ninterface FieldMappingDialogProps {\r\n\topen: boolean;\r\n\tonClose: () => void;\r\n\treportType: string;\r\n\ttitle?: string;\r\n\tonSaved: (mapping: FieldMappingResponse) => void;\r\n}\r\n\r\nexport default function FieldMappingDialog({\r\n\topen, onClose, reportType, title = \"CRM Export Fields\", onSaved,\r\n}: FieldMappingDialogProps) {\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [saving, setSaving] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\tconst [forms, setForms] = useState<CrmFormOption[]>([]);\r\n\tconst [formId, setFormId] = useState<number | \"\">(\"\");\r\n\tconst [fields, setFields] = useState<CrmFormFieldOption[]>([]);\r\n\tconst [selectedKeys, setSelectedKeys] = useState<string[]>([]);\r\n\tconst [fieldSearch, setFieldSearch] = useState(\"\");\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!open) return;\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\tsetFieldSearch(\"\");\r\n\t\tPromise.all([getCrmForms(), getFieldMapping(reportType)])\r\n\t\t\t.then(([formList, mapping]) => {\r\n\t\t\t\tsetForms(formList);\r\n\t\t\t\tif (mapping?.formId) {\r\n\t\t\t\t\tsetFormId(mapping.formId);\r\n\t\t\t\t\tsetSelectedKeys(mapping.fields.map((f) => f.fieldKey));\r\n\t\t\t\t} else if (formList.length === 1) {\r\n\t\t\t\t\tsetFormId(formList[0].id);\r\n\t\t\t\t\tsetSelectedKeys([]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetFormId(\"\");\r\n\t\t\t\t\tsetSelectedKeys([]);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.catch((err: any) => {\r\n\t\t\t\tsetError(err?.response?.data?.message || err?.message || \"Failed to load field mapping\");\r\n\t\t\t})\r\n\t\t\t.finally(() => setLoading(false));\r\n\t}, [open, reportType]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!formId) {\r\n\t\t\tsetFields([]);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tgetCrmFormFields(formId).then(setFields).catch(() => setFields([]));\r\n\t}, [formId]);\r\n\r\n\tconst handleFormChange = (value: number | \"\") => {\r\n\t\tsetFormId(value);\r\n\t\tsetSelectedKeys([]);\r\n\t\tsetFieldSearch(\"\");\r\n\t};\r\n\r\n\tconst toggleKey = (fieldKey: string) => {\r\n\t\tsetSelectedKeys((prev) =>\r\n\t\t\tprev.includes(fieldKey) ? prev.filter((k) => k !== fieldKey) : [...prev, fieldKey]);\r\n\t};\r\n\r\n\tconst visibleFields = useMemo(() => {\r\n\t\tconst q = fieldSearch.trim().toLowerCase();\r\n\t\tif (!q) return fields;\r\n\t\treturn fields.filter((f) => f.label.toLowerCase().includes(q) || f.fieldKey.toLowerCase().includes(q));\r\n\t}, [fields, fieldSearch]);\r\n\r\n\tconst allVisibleSelected = visibleFields.length > 0 && visibleFields.every((f) => selectedKeys.includes(f.fieldKey));\r\n\r\n\tconst toggleSelectAllVisible = () => {\r\n\t\tconst visibleKeys = visibleFields.map((f) => f.fieldKey);\r\n\t\tsetSelectedKeys((prev) =>\r\n\t\t\tallVisibleSelected\r\n\t\t\t\t? prev.filter((k) => !visibleKeys.includes(k))\r\n\t\t\t\t: [...new Set([...prev, ...visibleKeys])]);\r\n\t};\r\n\r\n\tconst handleSave = async () => {\r\n\t\tif (!formId) return;\r\n\t\tsetSaving(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst selectedFields = fields\r\n\t\t\t\t.filter((f) => selectedKeys.includes(f.fieldKey))\r\n\t\t\t\t.map((f) => ({ fieldKey: f.fieldKey, label: f.label }));\r\n\t\t\tconst saved = await saveFieldMapping(reportType, { formId, fields: selectedFields });\r\n\t\t\tonSaved(saved);\r\n\t\t\tonClose();\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(err?.response?.data?.message || err?.message || \"Failed to save export fields\");\r\n\t\t} finally {\r\n\t\t\tsetSaving(false);\r\n\t\t}\r\n\t};\r\n\r\n\treturn (\r\n\t\t<Dialog\r\n\t\t\topen={open}\r\n\t\t\tonClose={onClose}\r\n\t\t\tmaxWidth=\"xs\"\r\n\t\t\tfullWidth\r\n\t\t\tPaperProps={{ sx: { borderRadius: 3, overflow: \"hidden\" } }}\r\n\t\t>\r\n\t\t\t<Box sx={{ bgcolor: TEAL, px: 3, py: 2.2, display: \"flex\", alignItems: \"flex-start\", justifyContent: \"space-between\" }}>\r\n\t\t\t\t<Box>\r\n\t\t\t\t\t<Typography sx={{ fontWeight: 700, fontSize: \"1.05rem\", color: \"#fff\" }}>{title}</Typography>\r\n\t\t\t\t\t<Typography sx={{ fontSize: \"0.78rem\", color: \"rgba(255,255,255,0.8)\", mt: 0.3 }}>\r\n\t\t\t\t\t\tPick a form and which of its fields should appear in CDR Reports\r\n\t\t\t\t\t</Typography>\r\n\t\t\t\t</Box>\r\n\t\t\t\t<IconButton size=\"small\" onClick={onClose} sx={{ color: \"#fff\", mt: -0.5, mr: -0.5 }}>\r\n\t\t\t\t\t<CloseIcon fontSize=\"small\" />\r\n\t\t\t\t</IconButton>\r\n\t\t\t</Box>\r\n\r\n\t\t\t<DialogContent dividers sx={{ px: 3, py: 2.5 }}>\r\n\t\t\t\t{loading ? (\r\n\t\t\t\t\t<Box sx={{ p: 4, textAlign: \"center\" }}><CircularProgress size={22} sx={{ color: TEAL }} /></Box>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t{error && (\r\n\t\t\t\t\t\t\t<Typography sx={{ color: \"#d32f2f\", fontSize: \"0.78rem\", mb: 1.5 }}>{error}</Typography>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<FormControl size=\"small\" fullWidth sx={{ mb: 2 }}>\r\n\t\t\t\t\t\t\t<Select<number | \"\">\r\n\t\t\t\t\t\t\t\tvalue={formId}\r\n\t\t\t\t\t\t\t\tonChange={(e) => handleFormChange(e.target.value === \"\" ? \"\" : Number(e.target.value))}\r\n\t\t\t\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tfontSize: \"0.85rem\", borderRadius: 2,\r\n\t\t\t\t\t\t\t\t\t\"& .MuiOutlinedInput-notchedOutline\": { borderColor: \"#dde3e8\" },\r\n\t\t\t\t\t\t\t\t\t\"&:hover .MuiOutlinedInput-notchedOutline\": { borderColor: TEAL },\r\n\t\t\t\t\t\t\t\t\t\"&.Mui-focused .MuiOutlinedInput-notchedOutline\": { borderColor: TEAL },\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<MenuItem value=\"\" disabled>-- choose a form --</MenuItem>\r\n\t\t\t\t\t\t\t\t{forms.map((f) => (\r\n\t\t\t\t\t\t\t\t\t<MenuItem key={f.id} value={f.id} sx={{ fontSize: \"0.85rem\" }}>{f.name}</MenuItem>\r\n\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t</Select>\r\n\t\t\t\t\t\t</FormControl>\r\n\r\n\t\t\t\t\t\t{formId && (\r\n\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", mb: 1, gap: 1, flexWrap: \"wrap\" }}>\r\n\t\t\t\t\t\t\t\t\t<SearchBar\r\n\t\t\t\t\t\t\t\t\t\tvalue={fieldSearch}\r\n\t\t\t\t\t\t\t\t\t\tonChange={setFieldSearch}\r\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search fields...\"\r\n\t\t\t\t\t\t\t\t\t\twidth=\"100%\"\r\n\t\t\t\t\t\t\t\t\t\tborderRadius=\"8px\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", mb: 1 }}>\r\n\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.72rem\", fontWeight: 700, color: \"#8a94a0\", textTransform: \"uppercase\", letterSpacing: \"0.03em\" }}>\r\n\t\t\t\t\t\t\t\t\t\t{selectedKeys.length} of {fields.length} selected\r\n\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t{visibleFields.length > 0 && (\r\n\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={toggleSelectAllVisible}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{ fontSize: \"0.75rem\", fontWeight: 600, color: TEAL, cursor: \"pointer\", \"&:hover\": { textDecoration: \"underline\" } }}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{allVisibleSelected ? \"Clear all\" : \"Select all\"}\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t\t\t<List dense sx={{ border: \"1px solid #eee\", borderRadius: 2, py: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t{visibleFields.map((f) => (\r\n\t\t\t\t\t\t\t\t\t\t<ListItemButton\r\n\t\t\t\t\t\t\t\t\t\t\tkey={f.fieldKey}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => toggleKey(f.fieldKey)}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpy: 0.5, mx: 0.5, borderRadius: 1.5,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"rgba(26,95,108,0.06)\" },\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<Checkbox\r\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tchecked={selectedKeys.includes(f.fieldKey)}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ mr: 1, color: \"#c6ced4\", \"&.Mui-checked\": { color: TEAL } }}\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t<ListItemText primary={f.label} slotProps={{ primary: { sx: { fontSize: \"0.85rem\" } } }} />\r\n\t\t\t\t\t\t\t\t\t\t</ListItemButton>\r\n\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t\t{fields.length === 0 && (\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ color: \"#999\", fontSize: \"0.8rem\", p: 2, textAlign: \"center\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\tThis form has no fields yet.\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t{fields.length > 0 && visibleFields.length === 0 && (\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ color: \"#999\", fontSize: \"0.8rem\", p: 2, textAlign: \"center\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\tNo fields match \"{fieldSearch}\".\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</List>\r\n\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t{!formId && !loading && forms.length > 0 && (\r\n\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap: 1, py: 3, color: \"#aab2ba\" }}>\r\n\t\t\t\t\t\t\t\t<DynamicFormIcon sx={{ fontSize: 34 }} />\r\n\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.8rem\" }}>Choose a form above to pick its fields</Typography>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t)}\r\n\t\t\t</DialogContent>\r\n\t\t\t<DialogActions sx={{ px: 3, py: 2 }}>\r\n\t\t\t\t<AppButton variant=\"cancel\" onClick={onClose}>Close</AppButton>\r\n\t\t\t\t<AppButton onClick={handleSave} disabled={!formId || saving}>\r\n\t\t\t\t\t{saving ? <CircularProgress size={16} sx={{ color: \"#fff\" }} /> : \"Save\"}\r\n\t\t\t\t</AppButton>\r\n\t\t\t</DialogActions>\r\n\t\t</Dialog>\r\n\t);\r\n}\r\n"],"mappings":"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","names":["useEffect","useState","Box","CircularProgress","IconButton","Typography","Fragment","jsx","jsxs","jsx","jsxs","Box","useState","useEffect","jsxs","Fragment","jsx","IconButton","Box","Typography","_a","CircularProgress","_b"]}