ahs-cti 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agentPerformanceReport-VFLQ74FQ.mjs → agentPerformanceReport-7XZLGDRW.mjs} +2 -2
- package/dist/{agentPerformanceReport-VFLQ74FQ.mjs.map → agentPerformanceReport-7XZLGDRW.mjs.map} +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -1
- package/dist/index.mjs.map +1 -1
- package/dist-react/{agentPerformanceReport-3MJUJURN.mjs → agentPerformanceReport-OE4G4MSG.mjs} +2 -2
- package/dist-react/{agentPerformanceReport-3MJUJURN.mjs.map → agentPerformanceReport-OE4G4MSG.mjs.map} +1 -1
- package/dist-react/index.d.ts +2 -1
- package/dist-react/index.js +4 -1
- package/dist-react/index.js.map +1 -1
- package/dist-react/index.mjs +10 -1
- package/dist-react/index.mjs.map +1 -1
- package/package.json +6 -1
package/dist-react/{agentPerformanceReport-3MJUJURN.mjs → agentPerformanceReport-OE4G4MSG.mjs}
RENAMED
|
@@ -471,7 +471,7 @@ function BarCell({ value, pct, accent, count, onCountClick }) {
|
|
|
471
471
|
fontVariantNumeric: "tabular-nums",
|
|
472
472
|
whiteSpace: "nowrap"
|
|
473
473
|
}, pct > 100 ? { color: C2.red, background: C2.rlt, borderRadius: "4px", px: 0.5 } : { color: C2.t2 }), children: [
|
|
474
|
-
pct.toFixed(
|
|
474
|
+
pct.toFixed(1),
|
|
475
475
|
"%"
|
|
476
476
|
] }),
|
|
477
477
|
/* @__PURE__ */ jsx3(Typography2, { sx: { fontSize: 10.5, color: C2.t3, fontVariantNumeric: "tabular-nums", whiteSpace: "nowrap" }, children: value })
|
|
@@ -855,4 +855,4 @@ var agentPerformanceReport_default = AgentPerformanceReport;
|
|
|
855
855
|
export {
|
|
856
856
|
agentPerformanceReport_default as default
|
|
857
857
|
};
|
|
858
|
-
//# sourceMappingURL=agentPerformanceReport-
|
|
858
|
+
//# sourceMappingURL=agentPerformanceReport-OE4G4MSG.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/agentPerformanceReport/index.tsx","../call-control-sdk/lib/pages/common/components/AppTable.tsx","../call-control-sdk/lib/pages/agentPerformanceReport/BreakSessionsDialog.tsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from \"react\";\r\nimport { Box, Paper, Typography, CircularProgress, Alert, Tooltip, IconButton, Select, MenuItem, FormControl } from \"@mui/material\";\r\nimport type { MRT_ColumnDef } from \"material-react-table\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\n\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport AppTable from \"../common/components/AppTable\";\r\nimport { headCellSx, bodyCellSx } from \"../common/utils/tableStyles\";\r\nimport ReportFilterBar, { type QuickRange } from \"../common/components/ReportFilterBar\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\nimport AgentDetailReport from \"../agentDetailReport\";\r\nimport BreakSessionsDialog from \"./BreakSessionsDialog\";\r\n\r\n/* ═══════════════════════ TYPES + DATA (agents analytics dashboard) ═══════════════════════ */\r\ntype ReportData = Record<string, any>;\r\n\r\n/** Per-agent time breakdown used by the four heat panels. */\r\ninterface AgentWiseTime {\r\n agentName: string;\r\n idleTime: string;\r\n talkTime: string;\r\n wrapTime: string;\r\n handleTime: string;\r\n}\r\n\r\n/** Response of POST /agent-dashboard/agent-data — KPI strip + heat panels. */\r\ninterface AgentDashboardData {\r\n agentsLoggedIn: number;\r\n callsHandled: number;\r\n loggedInDuration: string;\r\n breakTime: string;\r\n firstLoginTime: string;\r\n outboundTime: string;\r\n agentsTime: {\r\n totalIdleTime: string;\r\n totalTalkTime: string;\r\n totalWrapTime: string;\r\n totalHandleTime: string;\r\n agentWiseIdleTime: AgentWiseTime[];\r\n };\r\n}\r\n\r\n/** Inbound/outbound call leg inside an agent-performance row. */\r\ninterface AgentPerfCallLeg {\r\n totalCalls: number;\r\n answeredCalls: number;\r\n answeredPercentage: number | null;\r\n abandonedCalls: number;\r\n abandonedPercentage: number | null;\r\n}\r\n\r\n/** One row of POST /agent-dashboard/agent-performance (the Agent Wise Performance table). */\r\ninterface AgentPerformanceRow {\r\n agentId: string;\r\n agentName: string;\r\n totalCallsHandled: number;\r\n answeredCalls: number;\r\n abandonedCalls: number;\r\n loggedInDuration: string;\r\n callHandleTime: string;\r\n breakCount: number;\r\n breakTime: string;\r\n meetingTime: string;\r\n trainingTime: string;\r\n idleTime: string;\r\n totalCalls: number;\r\n inbound: AgentPerfCallLeg;\r\n outbound: AgentPerfCallLeg;\r\n holdTime: string;\r\n firstLoginTime: string | null;\r\n logoutTime: string | null;\r\n avgCallHandleTime: string;\r\n productionPct?: number;\r\n occupancyPct?: number;\r\n breakPct?: number;\r\n idlePct?: number;\r\n meetingTrainingPct?: number;\r\n callHandlePct?: number;\r\n answerRatePct?: number;\r\n reportDate?: string;\r\n loginTime?: string;\r\n}\r\n\r\ninterface AgentDashboardParams {\r\n inputType?: string;\r\n startDate: string; // YYYY-MM-DD\r\n endDate: string; // YYYY-MM-DD\r\n}\r\n\r\ninterface AgentPerformancePage {\r\n data: AgentPerformanceRow[];\r\n total: number;\r\n page: number;\r\n pageSize: number;\r\n totalPages: number;\r\n}\r\n\r\nconst EMPTY_AGENT_DASHBOARD: AgentDashboardData = {\r\n agentsLoggedIn: 0, callsHandled: 0, loggedInDuration: \"00:00:00\",\r\n breakTime: \"00:00:00\", firstLoginTime: \"00:00:00\", outboundTime: \"00:00:00\",\r\n agentsTime: { totalIdleTime: \"00:00:00\", totalTalkTime: \"00:00:00\", totalWrapTime: \"00:00:00\", totalHandleTime: \"00:00:00\", agentWiseIdleTime: [] },\r\n};\r\n\r\n/** POST /agent-dashboard/agent-data → KPI strip + per-agent idle/talk/wrap/handle (heat panels). */\r\nasync function getAgentDashboardData(params: AgentDashboardParams): Promise<AgentDashboardData> {\r\n const res = await axiosInstance.post(END_POINT.AGENT_DASHBOARD_DATA, {\r\n inputType: params.inputType ?? \"TOTAL\",\r\n startDate: params.startDate,\r\n endDate: params.endDate,\r\n });\r\n const body = res.data;\r\n const row = Array.isArray(body) ? body[0] : body;\r\n return row ? { ...EMPTY_AGENT_DASHBOARD, ...row } : EMPTY_AGENT_DASHBOARD;\r\n}\r\n\r\n/** POST /agent-dashboard/agent-performance (page 1-based + pageSize) → server-side paginated envelope. */\r\nasync function getAgentPerformancePaged(\r\n params: AgentDashboardParams & { page: number; pageSize: number },\r\n): Promise<AgentPerformancePage> {\r\n const res = await axiosInstance.post(END_POINT.AGENT_DASHBOARD_PERFORMANCE, {\r\n inputType: params.inputType ?? \"TOTAL\",\r\n startDate: params.startDate,\r\n endDate: params.endDate,\r\n page: params.page,\r\n pageSize: params.pageSize,\r\n });\r\n const b = res.data ?? {};\r\n const data: AgentPerformanceRow[] = Array.isArray(b) ? b : (b.data ?? []);\r\n return {\r\n data,\r\n total: typeof b.total === \"number\" ? b.total : data.length,\r\n page: typeof b.page === \"number\" ? b.page : params.page,\r\n pageSize: typeof b.pageSize === \"number\" ? b.pageSize : params.pageSize,\r\n totalPages: typeof b.totalPages === \"number\" ? b.totalPages : 1,\r\n };\r\n}\r\n\r\n/**\r\n * POST /agent-dashboard/export/excel → downloads the Agents dashboard as an .xlsx file\r\n * (summary cards block + agent-wise performance table; ranked heatmap is not exported).\r\n * Omit reportMode → Summary (one aggregated row per agent for the range); pass\r\n * reportMode \"cumulative\" → one row per agent per day across the range.\r\n */\r\nasync function exportAgentDashboardToExcel(params: AgentDashboardParams & { reportMode?: string }): Promise<void> {\r\n const body: Record<string, unknown> = {\r\n inputType: params.inputType ?? \"TOTAL\",\r\n startDate: params.startDate,\r\n endDate: params.endDate,\r\n };\r\n if (params.reportMode) body.reportMode = params.reportMode;\r\n const res = await axiosInstance.post(END_POINT.AGENT_DASHBOARD_EXPORT_EXCEL, body, { responseType: \"blob\" });\r\n const url = URL.createObjectURL(new Blob([res.data]));\r\n const a = document.createElement(\"a\");\r\n const suffix = params.reportMode ?? \"summary\";\r\n a.href = url;\r\n a.download = `agents-report-${suffix}-${params.startDate}_${params.endDate}.xlsx`;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\n/* ═══════════════════════ COLORS (brand primary = teal #1A5F6C) ═══════════════════════ */\r\nconst C = {\r\n navy: \"#14505b\", blue: \"#1A5F6C\", green: \"#0a9a62\", amber: \"#c47c00\",\r\n red: \"#cc2a2a\", purple: \"#6b3fbf\", teal: \"#0b7a8f\",\r\n bg: \"transparent\", surface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\r\n b1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\r\n t1: \"#0d1e35\", t2: \"#364f6e\", t3: \"#7a93b5\",\r\n blt: \"#e3f1f3\", rlt: \"#fdeae3\",\r\n};\r\n// One font stack for the whole tab — matches the agent-detail report so the\r\n// KPI strip, heat panels, table and dialogs all read as one page.\r\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n// Per-KPI accent colours (border + value) for the stat cards.\r\nconst KPI_ACCENTS = [\"#1A5F6C\", \"#00897B\", \"#5E35B1\", \"#F57C00\", \"#00ACC1\", \"#E53935\"];\r\n// Numeric styling — same page font, just bold + tabular figures for alignment.\r\nconst mono = { fontWeight: 700, fontVariantNumeric: \"tabular-nums\" as const };\r\n// Deterministic avatar palette — a name always maps to the same colour.\r\nconst AVATAR_COLORS = [\"#1A5F6C\", \"#00897B\", \"#5E35B1\", \"#F57C00\", \"#00ACC1\", \"#E53935\", \"#0a9a62\", \"#6b3fbf\"];\r\n// Initials = first letter of first name + first letter of last name.\r\nfunction getInitials(name: string): string {\r\n const parts = (name || \"\").trim().split(/\\s+/).filter(Boolean);\r\n if (parts.length === 0) return \"\";\r\n if (parts.length === 1) return parts[0][0].toUpperCase();\r\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\r\n}\r\nfunction getAvatarColor(name: string): string {\r\n let h = 0;\r\n for (let i = 0; i < (name || \"\").length; i++) h = name.charCodeAt(i) + ((h << 5) - h);\r\n return AVATAR_COLORS[Math.abs(h) % AVATAR_COLORS.length];\r\n}\r\n\r\n/* ═══════════════════════ HELPERS ═══════════════════════ */\r\nfunction parseDur(d?: string | null): number {\r\n if (!d || d === \"00:00:00\") return 0;\r\n const p = d.split(\":\").map(Number);\r\n if (p.length === 3) return p[0] * 3600 + p[1] * 60 + p[2];\r\n if (p.length === 2) return p[0] * 60 + p[1];\r\n return 0;\r\n}\r\nfunction fmtDur(s: number): string {\r\n if (!s || s <= 0) return \"00:00:00\";\r\n const h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), sc = Math.floor(s % 60);\r\n return [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\r\n}\r\nfunction fmtDateTime(v?: string | null): string {\r\n if (!v) return \"\";\r\n const d = dayjs(String(v).replace(\" \", \"T\"));\r\n return d.isValid() ? d.format(\"DD-MM-YYYY HH:mm:ss\") : String(v);\r\n}\r\n// Epoch (ms) for chronological sorting of date/time columns; 0 when empty/invalid.\r\nfunction toEpoch(v?: string | null): number {\r\n if (!v) return 0;\r\n const d = dayjs(String(v).replace(\" \", \"T\"));\r\n return d.isValid() ? d.valueOf() : 0;\r\n}\r\n/**\r\n * Threshold colour for a performance percentage (0–100).\r\n * Normal (high is good — Production, Idle, Call Handle):\r\n * < 25% → red · 25–50% → orange · 50–75% → blue · ≥ 75% → green\r\n * Inverted (high is bad — Break, Meeting + Training) flips the scale:\r\n * < 25% → green · 25–50% → blue · 50–75% → orange · ≥ 75% → red\r\n */\r\nfunction pctColor(pct: number, invert = false): string {\r\n const colors = invert\r\n ? [\"#0a9a62\", \"#1565c8\", \"#F57C00\", \"#cc2a2a\"] // green → red (low is good)\r\n : [\"#cc2a2a\", \"#F57C00\", \"#1565c8\", \"#0a9a62\"]; // red → green (high is good)\r\n if (pct < 25) return colors[0];\r\n if (pct < 50) return colors[1];\r\n if (pct < 75) return colors[2];\r\n return colors[3];\r\n}\r\n/* ═══════════════════════ KPI CELL ═══════════════════════ */\r\nfunction Kpi({ label, value, sub, accent }: { label: string; value: string | number; sub?: string; accent: string }) {\r\n return (\r\n <Box sx={{\r\n background: C.surface, border: `1px solid #dce3ef`, borderRadius: \"10px\",\r\n borderLeft: `4px solid ${accent}`, p: \"14px 16px\",\r\n boxShadow: \"0 1px 4px rgba(0,0,0,.08), 0 2px 12px rgba(0,0,0,.05)\",\r\n display: \"flex\", flexDirection: \"column\", gap: 0.5,\r\n }}>\r\n <Typography sx={{ fontSize: 11.5, fontWeight: 600, color: C.t2, textTransform: \"uppercase\", letterSpacing: 0.4 }}>{label}</Typography>\r\n <Typography sx={{ fontSize: 28, fontWeight: 800, color: accent, lineHeight: 1, letterSpacing: \"-0.5px\", fontVariantNumeric: \"tabular-nums\" }}>{value}</Typography>\r\n {sub && <Typography sx={{ fontSize: 11.5, color: C.t3 }}>{sub}</Typography>}\r\n </Box>\r\n );\r\n}\r\n\r\n/* ═══════════════════════ HEAT PANEL (Top/Bottom) ═══════════════════════ */\r\nconst HEAT_TONES = {\r\n blue: { headBg: \"#eef5f6\", headTx: \"#14505b\", pillBg: \"#e3f1f3\", pillTx: \"#14505b\", rank: \"#6ba3ac\" },\r\n red: { headBg: \"#fdeeee\", headTx: \"#b3352f\", pillBg: \"#fbe3e3\", pillTx: \"#c0392b\", rank: \"#e0a0a0\" },\r\n};\r\nfunction HeatColumn({ title, rows, variant }: { title: string; rows: { name: string; secs: number }[]; variant: \"blue\" | \"red\" }) {\r\n const tone = HEAT_TONES[variant];\r\n return (\r\n <Box sx={{ flex: 1, minWidth: 0 }}>\r\n <Typography sx={{ fontSize: 10.5, fontWeight: 700, letterSpacing: 0.4, textTransform: \"uppercase\", color: tone.headTx, background: tone.headBg, textAlign: \"center\", py: 0.7, borderBottom: `1px solid ${C.b1}` }}>{title}</Typography>\r\n <Box sx={{ maxHeight: 176, overflowY: \"auto\", \"&::-webkit-scrollbar\": { width: 5 }, \"&::-webkit-scrollbar-thumb\": { background: C.b2, borderRadius: 4 } }}>\r\n {rows.map((r, i) => (\r\n <Box key={i} sx={{\r\n display: \"grid\", gridTemplateColumns: \"18px 1fr auto\", alignItems: \"center\", gap: 0.6,\r\n px: 1, py: 0.45, borderBottom: `1px solid ${C.b1}`, \"&:last-child\": { borderBottom: \"none\" },\r\n transition: \"background .12s\", \"&:hover\": { background: C.s2 },\r\n }}>\r\n <Typography sx={{ ...mono, fontSize: 10, fontWeight: 700, color: tone.rank, textAlign: \"right\" }}>{i + 1}</Typography>\r\n <Tooltip title={r.name} arrow placement=\"top\">\r\n <Typography noWrap sx={{ fontSize: 11.5, fontWeight: 600, color: C.t1, cursor: \"default\" }}>\r\n {r.name.length > 5 ? `${r.name.slice(0, 5)}…` : r.name}\r\n </Typography>\r\n </Tooltip>\r\n <Box sx={{ background: tone.pillBg, color: tone.pillTx, borderRadius: \"5px\", textAlign: \"center\", px: 0.9, py: 0.3, minWidth: 62, ...mono, fontSize: 10.5 }}>\r\n {fmtDur(r.secs)}\r\n </Box>\r\n </Box>\r\n ))}\r\n {rows.length === 0 && <Typography sx={{ fontSize: 11.5, color: C.t3, textAlign: \"center\", py: 3 }}>No data</Typography>}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\nfunction HeatPanel({ title, total, accent, agents, pick }: {\r\n title: string; total: string; accent: string; agents: AgentWiseTime[]; pick: (a: AgentWiseTime) => string;\r\n}) {\r\n const vals = agents.map((a) => ({ name: a.agentName, secs: parseDur(pick(a)) }));\r\n const asc = [...vals].sort((a, b) => a.secs - b.secs);\r\n const desc = [...asc].reverse();\r\n return (\r\n <Paper elevation={0} sx={{ border: `1px solid #dce3ef`, borderLeft: `4px solid ${accent}`, borderRadius: \"10px\", overflow: \"hidden\", boxShadow: \"0 1px 4px rgba(0,0,0,.08), 0 2px 12px rgba(0,0,0,.05)\" }}>\r\n <Box sx={{ background: C.s2, borderBottom: `1px solid ${C.b1}`, px: 1.5, py: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}>\r\n <Box sx={{ width: 8, height: 8, borderRadius: \"50%\", background: accent }} />\r\n <Typography sx={{ fontSize: 12, fontWeight: 700, color: C.t1, letterSpacing: 0.3, textTransform: \"uppercase\" }}>{title}</Typography>\r\n </Box>\r\n <Typography sx={{ ...mono, fontSize: 14, fontWeight: 800, color: accent }}>{total}</Typography>\r\n </Box>\r\n <Box sx={{ display: \"flex\", \"& > *:first-of-type\": { borderRight: `1px solid ${C.b1}` } }}>\r\n <HeatColumn title=\"Top to Bottom\" rows={desc} variant=\"blue\" />\r\n <HeatColumn title=\"Bottom to Top\" rows={asc} variant=\"red\" />\r\n </Box>\r\n </Paper>\r\n );\r\n}\r\n\r\n/* ═══════════════════════ TABLE BAR CELL ═══════════════════════\r\n Stacked layout: a top line with [count?] · % · time, and the coloured bar\r\n sitting directly beneath them. The bar uses the column's own accent, fills\r\n 0–100%, and renders nothing at zero — so empty rows read as blank, not red. */\r\nfunction BarCell({ value, pct, accent, count, onCountClick }: {\r\n value: string; pct: number; accent: string; count?: number; onCountClick?: () => void;\r\n}) {\r\n const width = Math.max(0, Math.min(100, pct));\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 0.5, minWidth: 130, py: 0.3 }}>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}>\r\n {count != null && (\r\n <Box\r\n component=\"span\"\r\n onClick={onCountClick ? (e) => { e.stopPropagation(); onCountClick(); } : undefined}\r\n title={onCountClick ? \"View break sessions\" : undefined}\r\n sx={{\r\n flexShrink: 0, display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\",\r\n minWidth: 20, height: 18, px: 0.5, borderRadius: \"9px\", fontSize: 10,\r\n fontVariantNumeric: \"tabular-nums\", transition: \"background .12s\",\r\n ...(onCountClick\r\n ? { cursor: \"pointer\", background: C.navy, color: \"#fff\", \"&:hover\": { background: C.blue } }\r\n : { background: C.s3, color: C.t3 }),\r\n }}\r\n >\r\n {count}\r\n </Box>\r\n )}\r\n {/* A percentage over 100% is flagged with a red tint — it signals a value\r\n that exceeds its reference period and is worth a second look. */}\r\n <Typography sx={{\r\n fontSize: 11, fontVariantNumeric: \"tabular-nums\", whiteSpace: \"nowrap\",\r\n ...(pct > 100\r\n ? { color: C.red, background: C.rlt, borderRadius: \"4px\", px: 0.5 }\r\n : { color: C.t2 }),\r\n }}>{pct.toFixed(0)}%</Typography>\r\n <Typography sx={{ fontSize: 10.5, color: C.t3, fontVariantNumeric: \"tabular-nums\", whiteSpace: \"nowrap\" }}>{value}</Typography>\r\n </Box>\r\n <Box sx={{ width: \"100%\", height: 8, background: C.s3, borderRadius: \"4px\", overflow: \"hidden\" }}>\r\n {width > 0 && <Box sx={{ height: \"100%\", width: `${width}%`, background: accent, borderRadius: \"4px\" }} />}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\nconst InOut = ({ i, o }: { i: number; o: number }) => (\r\n <Typography sx={{ fontSize: 11.5, color: C.t2, whiteSpace: \"nowrap\" }}>\r\n <span style={{ color: C.t3 }}>In:</span> {i} <span style={{ color: C.t3 }}>Out:</span> {o}\r\n </Typography>\r\n);\r\n\r\n/* ═══════════════════════ MAIN COMPONENT ═══════════════════════ */\r\nfunction AgentPerformanceReportContent() {\r\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [quickRange, setQuickRange] = useState<string>(\"today\");\r\n\r\n const [dashboard, setDashboard] = useState<AgentDashboardData | null>(null);\r\n const [rows, setRows] = useState<AgentPerformanceRow[]>([]);\r\n const [total, setTotal] = useState(0);\r\n const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 });\r\n const [loadingTop, setLoadingTop] = useState(false);\r\n const [loadingTable, setLoadingTable] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n // Eye action → drill into the per-agent detail view (rendered in place).\r\n const [selectedAgent, setSelectedAgent] = useState<AgentPerformanceRow | null>(null);\r\n // Break-count click → break-sessions dialog for that agent.\r\n const [breaksAgent, setBreaksAgent] = useState<AgentPerformanceRow | null>(null);\r\n // Export mode: \"summary\" (no reportMode) or \"cumulative\" (day-wise, reportMode: \"cumulative\").\r\n const [exportMode, setExportMode] = useState<\"summary\" | \"cumulative\">(\"summary\");\r\n const [exporting, setExporting] = useState(false);\r\n const loading = loadingTop || loadingTable;\r\n\r\n const onErr = (err: any) => setError(err?.response?.data?.detail || err?.message || \"Failed to load agents report\");\r\n\r\n // KPI strip + heat panels — always the full agent set (dates only).\r\n const fetchDashboard = useCallback((showSpinner = true) => {\r\n if (!startDate || !endDate) return;\r\n const params = { inputType: \"TOTAL\", startDate: startDate.format(\"YYYY-MM-DD\"), endDate: endDate.format(\"YYYY-MM-DD\") };\r\n if (showSpinner) setLoadingTop(true);\r\n setError(\"\");\r\n getAgentDashboardData(params).then(setDashboard).catch(onErr).finally(() => setLoadingTop(false));\r\n }, [startDate, endDate]);\r\n\r\n // Agent Wise Performance table — server-side paginated.\r\n const fetchTable = useCallback((showSpinner = true) => {\r\n if (!startDate || !endDate) return;\r\n const params = {\r\n inputType: \"TOTAL\", startDate: startDate.format(\"YYYY-MM-DD\"), endDate: endDate.format(\"YYYY-MM-DD\"),\r\n page: pagination.pageIndex + 1, pageSize: pagination.pageSize,\r\n };\r\n if (showSpinner) setLoadingTable(true);\r\n setError(\"\");\r\n getAgentPerformancePaged(params)\r\n .then((res) => { setRows(res.data); setTotal(res.total); })\r\n .catch(onErr)\r\n .finally(() => setLoadingTable(false));\r\n }, [startDate, endDate, pagination.pageIndex, pagination.pageSize]);\r\n\r\n useEffect(() => { fetchDashboard(); }, [fetchDashboard]);\r\n useEffect(() => { fetchTable(); }, [fetchTable]);\r\n\r\n const handleRefresh = () => {\r\n if (quickRange === \"today\" || quickRange === \"week\" || quickRange === \"month\") {\r\n const nowD = dayjs();\r\n let sd = nowD.startOf(\"day\");\r\n if (quickRange === \"week\") sd = nowD.startOf(\"week\").startOf(\"day\");\r\n else if (quickRange === \"month\") sd = nowD.startOf(\"month\").startOf(\"day\");\r\n setStartDate(sd); setEndDate(nowD);\r\n }\r\n fetchDashboard(); fetchTable();\r\n };\r\n\r\n const handleExport = () => {\r\n if (!startDate || !endDate) return;\r\n setExporting(true);\r\n setError(\"\");\r\n exportAgentDashboardToExcel({\r\n inputType: \"TOTAL\",\r\n startDate: startDate.format(\"YYYY-MM-DD\"),\r\n endDate: endDate.format(\"YYYY-MM-DD\"),\r\n reportMode: exportMode, // \"summary\" | \"cumulative\" — sent explicitly so the two differ\r\n }).catch(onErr).finally(() => setExporting(false));\r\n };\r\n\r\n const heatAgents = dashboard?.agentsTime.agentWiseIdleTime ?? [];\r\n\r\n // Production Time = logged-in − break; the numeric value shown alongside the % bar.\r\n const prodSecs = (r: AgentPerformanceRow) => Math.max(0, parseDur(r.loggedInDuration) - parseDur(r.breakTime));\r\n const mtSecs = (r: AgentPerformanceRow) => parseDur(r.meetingTime) + parseDur(r.trainingTime);\r\n\r\n const columns = useMemo<MRT_ColumnDef<AgentPerformanceRow>[]>(() => [\r\n { id: \"agent\", header: \"Agent\", size: 220, accessorFn: (r) => r.agentName,\r\n Cell: ({ row }) => {\r\n const name = row.original.agentName || \"\";\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, minWidth: 0 }}>\r\n <Box sx={{\r\n width: 30, height: 30, borderRadius: \"50%\", flexShrink: 0,\r\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\r\n background: getAvatarColor(name), color: \"#fff\", fontSize: 11, letterSpacing: 0.3,\r\n }}>\r\n {getInitials(name)}\r\n </Box>\r\n <Box sx={{ minWidth: 0 }}>\r\n <Typography noWrap sx={{ fontSize: 11.5, color: C.t1, lineHeight: 1.3 }}>{name}</Typography>\r\n <Typography noWrap sx={{ fontSize: 10.5, color: C.t3, fontVariantNumeric: \"tabular-nums\", lineHeight: 1.3 }}>{row.original.agentId}</Typography>\r\n </Box>\r\n </Box>\r\n );\r\n } },\r\n { id: \"firstLogin\", header: \"First Login\", size: 160, accessorFn: (r) => toEpoch(r.firstLoginTime),\r\n Cell: ({ row }) => <span style={{ fontSize: 11.5, color: C.t2, fontVariantNumeric: \"tabular-nums\" }}>{fmtDateTime(row.original.firstLoginTime)}</span> },\r\n { id: \"lastLogout\", header: \"Last Logout\", size: 160, accessorFn: (r) => toEpoch(r.logoutTime),\r\n Cell: ({ row }) => <span style={{ fontSize: 11.5, color: C.t2, fontVariantNumeric: \"tabular-nums\" }}>{fmtDateTime(row.original.logoutTime)}</span> },\r\n { id: \"total\", header: \"Total Calls\", size: 120, accessorFn: (r) => r.inbound.totalCalls + r.outbound.totalCalls,\r\n Cell: ({ row }) => <InOut i={row.original.inbound.totalCalls} o={row.original.outbound.totalCalls} /> },\r\n { id: \"answered\", header: \"Answered\", size: 120, accessorFn: (r) => r.inbound.answeredCalls + r.outbound.answeredCalls,\r\n Cell: ({ row }) => <InOut i={row.original.inbound.answeredCalls} o={row.original.outbound.answeredCalls} /> },\r\n { id: \"abandoned\", header: \"Abandoned\", size: 120, accessorFn: (r) => r.inbound.abandonedCalls + r.outbound.abandonedCalls,\r\n Cell: ({ row }) => <InOut i={row.original.inbound.abandonedCalls} o={row.original.outbound.abandonedCalls} /> },\r\n { id: \"avgCallHandleTime\", header: \"AHT\", size: 100, accessorFn: (r) => parseDur(r.avgCallHandleTime),\r\n Cell: ({ row }) => <span style={{ fontWeight: 400, fontSize: 11.5, color: C.purple, fontVariantNumeric: \"tabular-nums\" }}>{row.original.avgCallHandleTime}</span> },\r\n { id: \"loggedInDuration\", header: \"Logged In Duration\", size: 130, accessorFn: (r) => parseDur(r.loggedInDuration),\r\n Cell: ({ row }) => <span style={{ fontWeight: 400, fontSize: 11.5, color: C.teal, fontVariantNumeric: \"tabular-nums\" }}>{row.original.loggedInDuration}</span> },\r\n { id: \"production\", header: \"Production Time\", size: 200, accessorFn: (r) => prodSecs(r),\r\n Cell: ({ row }) => { const p = row.original.productionPct ?? 0; return <BarCell value={fmtDur(prodSecs(row.original))} pct={p} accent={pctColor(p)} />; } },\r\n { id: \"callHandle\", header: \"Call Handle Time\", size: 200, accessorFn: (r) => parseDur(r.callHandleTime),\r\n Cell: ({ row }) => { const p = row.original.answerRatePct ?? 0; return <BarCell value={row.original.callHandleTime} pct={p} accent={pctColor(p)} />; } },\r\n { id: \"break\", header: \"Break Time\", size: 200, accessorFn: (r) => parseDur(r.breakTime),\r\n Cell: ({ row }) => { const p = row.original.breakPct ?? 0; return <BarCell value={row.original.breakTime} pct={p} accent={pctColor(p, true)} count={row.original.breakCount} onCountClick={row.original.breakCount > 0 ? () => setBreaksAgent(row.original) : undefined} />; } },\r\n { id: \"idle\", header: \"Idle Time\", size: 200, accessorFn: (r) => parseDur(r.idleTime),\r\n Cell: ({ row }) => { const p = row.original.idlePct ?? 0; return <BarCell value={row.original.idleTime} pct={p} accent={pctColor(p)} />; } },\r\n { id: \"meetingTraining\", header: \"Meeting + Training\", size: 200, accessorFn: (r) => mtSecs(r),\r\n Cell: ({ row }) => { const p = row.original.meetingTrainingPct ?? 0; return <BarCell value={fmtDur(mtSecs(row.original))} pct={p} accent={pctColor(p, true)} />; } },\r\n { id: \"actions\", header: \"Detail\", size: 80, enableColumnFilter: false, enableSorting: false,\r\n Cell: ({ row }) => (\r\n <Tooltip title=\"View agent details\" arrow>\r\n <IconButton size=\"small\" onClick={() => setSelectedAgent(row.original)} sx={{ color: C.blue }}>\r\n <VisibilityIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n ) },\r\n ], []);\r\n\r\n // Drill-down: reuse the existing per-agent detail page. It only needs the\r\n // agentId + name; every other metric it fetches itself by agent id.\r\n if (selectedAgent) {\r\n const agentRow: ReportData = { agentDetails: { agentId: selectedAgent.agentId, fullName: selectedAgent.agentName } };\r\n return (\r\n <AgentDetailReport\r\n agentRow={agentRow}\r\n onBack={() => setSelectedAgent(null)}\r\n initialStartDate={startDate}\r\n initialEndDate={endDate}\r\n initialQuickRange={quickRange}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{\r\n background: C.bg, minHeight: \"100vh\", fontFamily: FONT,\r\n \"& .MuiTypography-root, & th, & td, & .MuiButton-root, & .MuiChip-root, & .MuiMenuItem-root\": { fontFamily: FONT },\r\n }}>\r\n <PageHeader title=\"Agents Performance Report\" />\r\n\r\n <ReportFilterBar\r\n startDate={startDate} endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n showTime={false}\r\n quickRange={quickRange} onQuickRangeChange={(r: QuickRange) => setQuickRange(r)}\r\n extra={\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n <AppButton startIcon={<RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />} disabled={loading} onClick={handleRefresh} sx={{ height: 32 }}>\r\n Refresh\r\n </AppButton>\r\n <SDKPermissionGuard permissions={[SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_EXPORT, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE]}>\r\n <FormControl size=\"small\">\r\n <Select\r\n value={exportMode}\r\n onChange={(e) => setExportMode(e.target.value as \"summary\" | \"cumulative\")}\r\n sx={{ height: 32, fontSize: 13, minWidth: 130, bgcolor: \"#fff\", borderRadius: \"30px\", \"& .MuiOutlinedInput-notchedOutline\": { borderRadius: \"30px\" } }}\r\n >\r\n <MenuItem value=\"summary\" sx={{ fontSize: 13 }}>Summary</MenuItem>\r\n <MenuItem value=\"cumulative\" sx={{ fontSize: 13 }}>Day-wise</MenuItem>\r\n </Select>\r\n </FormControl>\r\n <AppButton\r\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n disabled={exporting || loading}\r\n onClick={handleExport}\r\n sx={{ height: 32 }}\r\n >\r\n Export Excel\r\n </AppButton>\r\n </SDKPermissionGuard>\r\n </Box>\r\n }\r\n />\r\n\r\n {error && <Alert severity=\"error\" sx={{ mx: 2.5, mt: 1.5 }} onClose={() => setError(\"\")}>{error}</Alert>}\r\n\r\n <Box sx={{ py: 1.5, px: 2, position: \"relative\" }}>\r\n {loadingTop && (\r\n <Box sx={{ position: \"absolute\", inset: 0, background: \"rgba(240,244,248,0.7)\", display: \"flex\", alignItems: \"flex-start\", justifyContent: \"center\", pt: 10, zIndex: 10 }}>\r\n <CircularProgress />\r\n </Box>\r\n )}\r\n\r\n {/* ═══ KPI STRIP ═══ */}\r\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"repeat(2,1fr)\", md: \"repeat(3,1fr)\", lg: \"repeat(6,1fr)\" }, gap: 1.25, mb: 1.75 }}>\r\n <Kpi label=\"Agents Logged In\" value={dashboard?.agentsLoggedIn ?? 0} sub=\"Active right now\" accent={KPI_ACCENTS[0]} />\r\n <Kpi label=\"Calls Handled\" value={(dashboard?.callsHandled ?? 0).toLocaleString()} sub=\"Today total\" accent={KPI_ACCENTS[1]} />\r\n <Kpi label=\"Logged In Duration\" value={dashboard?.loggedInDuration ?? \"00:00:00\"} sub=\"Cumulative\" accent={KPI_ACCENTS[2]} />\r\n <Kpi label=\"Break Time\" value={dashboard?.breakTime ?? \"00:00:00\"} sub=\"Cumulative\" accent={KPI_ACCENTS[3]} />\r\n <Kpi label=\"First Login Time\" value={dashboard?.firstLoginTime ?? \"00:00:00\"} sub=\"Earliest today\" accent={KPI_ACCENTS[4]} />\r\n <Kpi label=\"Outbound Time\" value={dashboard?.outboundTime ?? \"00:00:00\"} sub=\"Active outbound\" accent={KPI_ACCENTS[5]} />\r\n </Box>\r\n\r\n {/* ═══ 4 HEAT PANELS (always one row) ═══ */}\r\n <Box sx={{ display: \"grid\", gridTemplateColumns: \"repeat(4, minmax(0, 1fr))\", gap: 1.5, mb: 1.5 }}>\r\n <HeatPanel title=\"IDLE Time\" accent=\"#F57C00\" total={dashboard?.agentsTime.totalIdleTime ?? \"00:00:00\"} agents={heatAgents} pick={(a) => a.idleTime} />\r\n <HeatPanel title=\"Talk Time\" accent=\"#00897B\" total={dashboard?.agentsTime.totalTalkTime ?? \"00:00:00\"} agents={heatAgents} pick={(a) => a.talkTime} />\r\n <HeatPanel title=\"Wrap Time\" accent=\"#5E35B1\" total={dashboard?.agentsTime.totalWrapTime ?? \"00:00:00\"} agents={heatAgents} pick={(a) => a.wrapTime} />\r\n <HeatPanel title=\"Call Handle Time\" accent=\"#1A5F6C\" total={dashboard?.agentsTime.totalHandleTime ?? \"00:00:00\"} agents={heatAgents} pick={(a) => a.handleTime} />\r\n </Box>\r\n\r\n {/* ═══ AGENT WISE PERFORMANCE TABLE ═══ */}\r\n <Box>\r\n <Typography sx={{ fontSize: 13, fontWeight: 800, color: C.t1, mb: 1 }}>Agent Wise Performance</Typography>\r\n <AppTable\r\n columns={columns}\r\n data={rows}\r\n layoutMode=\"grid\"\r\n enableTopToolbar={false}\r\n enableColumnActions={false}\r\n enableColumnFilters={false}\r\n enableColumnDragging={false}\r\n enableHiding={false}\r\n enableDensityToggle={false}\r\n enableFullScreenToggle={false}\r\n enableSorting\r\n manualPagination\r\n rowCount={total}\r\n onPaginationChange={setPagination}\r\n state={{ pagination, isLoading: loadingTable }}\r\n muiTableHeadCellProps={{\r\n sx: {\r\n ...headCellSx, fontFamily: FONT, px: \"12px\", py: \"8px\",\r\n display: \"flex\", alignItems: \"center\", textAlign: \"left\",\r\n \"& .Mui-TableHeadCell-Content\": { m: 0, p: 0, width: \"100%\", justifyContent: \"flex-start\" },\r\n \"& .Mui-TableHeadCell-Content-Wrapper\": { m: 0, p: 0 },\r\n \"& .Mui-TableHeadCell-Content-Labels\": { m: 0, p: 0 },\r\n },\r\n }}\r\n muiTableBodyCellProps={{\r\n sx: {\r\n ...bodyCellSx, fontFamily: FONT, px: \"12px\", py: \"8px\",\r\n display: \"flex\", alignItems: \"center\", justifyContent: \"flex-start\", textAlign: \"left\",\r\n },\r\n }}\r\n muiTableBodyRowProps={({ row }) => ({\r\n onClick: () => setSelectedAgent(row.original),\r\n sx: { cursor: \"pointer\", \"&:hover\": { backgroundColor: C.s2 } },\r\n })}\r\n />\r\n </Box>\r\n </Box>\r\n </Box>\r\n\r\n <BreakSessionsDialog\r\n open={!!breaksAgent}\r\n onClose={() => setBreaksAgent(null)}\r\n agentId={breaksAgent?.agentId ?? \"\"}\r\n agentName={breaksAgent?.agentName ?? \"\"}\r\n startDate={startDate}\r\n endDate={endDate}\r\n />\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst AgentPerformanceReport: React.FC = () => (\r\n <SDKProvider>\r\n <AgentPerformanceReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default AgentPerformanceReport;\r\n","import { Box } from \"@mui/material\";\r\nimport {\r\n MaterialReactTable,\r\n useMaterialReactTable,\r\n type MRT_ColumnDef,\r\n type MRT_RowData,\r\n type MRT_TableOptions,\r\n} from \"material-react-table\";\r\n\r\n/**\r\n * Shared MRT styling — mirror of the main app's tableStyles so the SDK table\r\n * looks/behaves like the rest of the reports UI.\r\n */\r\nconst mrtStylingProps: Partial<MRT_TableOptions<MRT_RowData>> = {\r\n muiTableProps: {\r\n sx: {\r\n border: \"1px solid white\",\r\n borderRadius: \"20px\",\r\n boxShadow: \"0px 4px 10px rgba(0, 0, 0, 0.1)\",\r\n },\r\n },\r\n muiTableHeadCellProps: {\r\n sx: {\r\n backgroundColor: \"#f1f1f1\",\r\n color: \"#333\",\r\n fontWeight: 600,\r\n fontSize: \"14px\",\r\n \"& .Mui-TableHeadCell-Content\": {\r\n flexDirection: \"row-reverse\",\r\n justifyContent: \"flex-end\",\r\n },\r\n },\r\n },\r\n muiTableBodyCellProps: {\r\n sx: { padding: \"4px 12px\", fontSize: \"14px\" },\r\n },\r\n muiTableBodyRowProps: {\r\n sx: {\r\n \"&:nth-of-type(even)\": { backgroundColor: \"#fff\" },\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n },\r\n },\r\n};\r\n\r\n/** Shared MRT config (behavior + styling) — spread into useMaterialReactTable. */\r\nconst COLUMN_FILTERS: Partial<MRT_TableOptions<MRT_RowData>> = {\r\n enableFilters: true,\r\n enableColumnFilterModes: false,\r\n enablePagination: true,\r\n enableBottomToolbar: true,\r\n enableSorting: false,\r\n positionExpandColumn: \"last\" as const,\r\n columnFilterDisplayMode: \"popover\" as const,\r\n enableGlobalFilterModes: true,\r\n globalFilterFn: \"contains\",\r\n globalFilterModeOptions: [\"startsWith\"],\r\n initialState: { showGlobalFilter: true },\r\n muiSearchTextFieldProps: {\r\n placeholder: \"Search\",\r\n sx: { borderRadius: \"50%\" },\r\n },\r\n ...mrtStylingProps,\r\n};\r\n\r\nconst TopToolbarContainer = () => (\r\n <Box sx={{ backgroundColor: \"#fff\", display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }} />\r\n);\r\n\r\ntype AppTableOptions<T extends MRT_RowData> = Omit<\r\n MRT_TableOptions<T>,\r\n \"columns\" | \"data\"\r\n> & {\r\n columns: MRT_ColumnDef<T>[];\r\n data: T[];\r\n};\r\n\r\n/**\r\n * Hook — use when you need direct access to the `table` instance.\r\n */\r\nexport function useAppTable<T extends MRT_RowData>({\r\n columns,\r\n data,\r\n ...overrides\r\n}: AppTableOptions<T>) {\r\n return useMaterialReactTable({\r\n columns,\r\n data,\r\n ...(COLUMN_FILTERS as Partial<MRT_TableOptions<T>>),\r\n renderTopToolbar: () => <TopToolbarContainer />,\r\n ...overrides,\r\n });\r\n}\r\n\r\n/**\r\n * Component — use for simple tables that don't need external table access.\r\n */\r\nexport default function AppTable<T extends MRT_RowData>(\r\n props: AppTableOptions<T>\r\n) {\r\n const table = useAppTable(props);\r\n return <MaterialReactTable table={table} />;\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport {\r\n Box, Typography, IconButton, CircularProgress, Dialog, DialogTitle, DialogContent,\r\n} from \"@mui/material\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport dayjs, { type Dayjs } from \"dayjs\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport BreakSessionsTable from \"../common/components/BreakSessionsTable\";\r\nimport { getAgentBreakSessions, exportAgentBreakSessionsToExcel } from \"../agentDetailReport/useAgentDetailReport\";\r\nimport type { BreakSessionResponse } from \"../agentDetailReport/types\";\r\n\r\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\nconst C = { red: \"#cc2a2a\" };\r\n\r\n// Format start/end date range the way the breaks endpoint expects (ISO, end clamped to \"now\" for today).\r\nfunction fmtRange(startDate: Dayjs | null, endDate: Dayjs | null) {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n return {\r\n start_date: sd.startOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.isSame(dayjs(), \"day\")\r\n ? dayjs().format(\"YYYY-MM-DDTHH:mm:ss\")\r\n : ed.endOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n };\r\n}\r\n\r\ninterface Props {\r\n open: boolean;\r\n onClose: () => void;\r\n agentId: string;\r\n agentName: string;\r\n startDate: Dayjs | null;\r\n endDate: Dayjs | null;\r\n}\r\n\r\n/**\r\n * Break-sessions drill-down dialog — lists an agent's individual breaks grouped\r\n * by date, with an Excel export. Fetches on open via the break-sessions endpoint.\r\n */\r\nexport default function BreakSessionsDialog({ open, onClose, agentId, agentName, startDate, endDate }: Props) {\r\n const [breakSessions, setBreakSessions] = useState<BreakSessionResponse[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (!open || !agentId) return;\r\n let active = true;\r\n setBreakSessions([]);\r\n setError(\"\");\r\n setLoading(true);\r\n getAgentBreakSessions(agentId, fmtRange(startDate, endDate))\r\n .then((data) => { if (active) setBreakSessions(Array.isArray(data) ? data : []); })\r\n .catch(() => { if (active) setBreakSessions([]); })\r\n .finally(() => { if (active) setLoading(false); });\r\n return () => { active = false; };\r\n }, [open, agentId, startDate, endDate]);\r\n\r\n const handleExport = async () => {\r\n if (!agentId) return;\r\n try {\r\n await exportAgentBreakSessionsToExcel(agentId, fmtRange(startDate, endDate));\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export breaks Excel\");\r\n }\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={(_e, reason) => { if (reason !== \"backdropClick\") onClose(); }}\r\n maxWidth=\"md\"\r\n fullWidth\r\n PaperProps={{ sx: { borderRadius: \"12px\", fontFamily: FONT, overflow: \"hidden\", boxShadow: \"0 8px 32px rgba(0,0,0,0.18)\", maxWidth: 640 } }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n fontFamily: FONT,\r\n background: \"linear-gradient(135deg, var(--primary-color-dark, #14505b), var(--primary-color, #1A5F6C))\",\r\n color: \"#fff\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n py: 1.5,\r\n px: 2.5,\r\n }}\r\n >\r\n <Box>\r\n <Typography variant=\"h6\" sx={{ fontFamily: FONT, fontWeight: 700, fontSize: \"0.95rem\", letterSpacing: \"0.3px\" }}>\r\n Break Sessions\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ fontFamily: FONT, opacity: 0.9, fontSize: \"0.76rem\", mt: 0.3 }}>\r\n {agentName} • {breakSessions.length} break{breakSessions.length !== 1 ? \"s\" : \"\"}\r\n </Typography>\r\n </Box>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n <AppButton\r\n size=\"small\"\r\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.85rem !important\" }} />}\r\n disabled={loading || breakSessions.length === 0}\r\n onClick={handleExport}\r\n sx={{ whiteSpace: \"nowrap\" }}\r\n >\r\n Export to Excel\r\n </AppButton>\r\n <IconButton\r\n onClick={onClose}\r\n size=\"small\"\r\n sx={{ color: \"#fff\", backgroundColor: \"rgba(255,255,255,0.1)\", \"&:hover\": { backgroundColor: \"rgba(255,255,255,0.2)\" } }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ p: 0, backgroundColor: \"#f8fafb\" }}>\r\n {error && (\r\n <Typography sx={{ fontFamily: FONT, color: C.red, fontSize: \"0.78rem\", px: 2, pt: 1.5 }}>{error}</Typography>\r\n )}\r\n {loading ? (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <CircularProgress size={28} sx={{ color: \"var(--primary-color, #1A5F6C)\" }} />\r\n </Box>\r\n ) : breakSessions.length > 0 ? (\r\n <Box sx={{ p: 1.5 }}>\r\n <BreakSessionsTable breaks={breakSessions} maxHeight={360} showRemarksStatus={false} />\r\n </Box>\r\n ) : (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <Typography sx={{ fontFamily: FONT, color: \"#9e9e9e\", fontStyle: \"italic\", fontSize: \"0.82rem\" }}>\r\n No breaks found\r\n </Typography>\r\n </Box>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n"],"mappings":"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","names":["useState","useEffect","Box","Typography","CircularProgress","IconButton","FileDownloadIcon","dayjs","Box","jsx","Box","jsx","jsxs","C","FONT","dayjs","Box","Typography","useState","_a","_b","useEffect","IconButton","FileDownloadIcon","CircularProgress"]}
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/agentPerformanceReport/index.tsx","../call-control-sdk/lib/pages/common/components/AppTable.tsx","../call-control-sdk/lib/pages/agentPerformanceReport/BreakSessionsDialog.tsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from \"react\";\r\nimport { Box, Paper, Typography, CircularProgress, Alert, Tooltip, IconButton, Select, MenuItem, FormControl } from \"@mui/material\";\r\nimport type { MRT_ColumnDef } from \"material-react-table\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\n\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport AppTable from \"../common/components/AppTable\";\r\nimport { headCellSx, bodyCellSx } from \"../common/utils/tableStyles\";\r\nimport ReportFilterBar, { type QuickRange } from \"../common/components/ReportFilterBar\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\nimport AgentDetailReport from \"../agentDetailReport\";\r\nimport BreakSessionsDialog from \"./BreakSessionsDialog\";\r\n\r\n/* ═══════════════════════ TYPES + DATA (agents analytics dashboard) ═══════════════════════ */\r\ntype ReportData = Record<string, any>;\r\n\r\n/** Per-agent time breakdown used by the four heat panels. */\r\ninterface AgentWiseTime {\r\n agentName: string;\r\n idleTime: string;\r\n talkTime: string;\r\n wrapTime: string;\r\n handleTime: string;\r\n}\r\n\r\n/** Response of POST /agent-dashboard/agent-data — KPI strip + heat panels. */\r\ninterface AgentDashboardData {\r\n agentsLoggedIn: number;\r\n callsHandled: number;\r\n loggedInDuration: string;\r\n breakTime: string;\r\n firstLoginTime: string;\r\n outboundTime: string;\r\n agentsTime: {\r\n totalIdleTime: string;\r\n totalTalkTime: string;\r\n totalWrapTime: string;\r\n totalHandleTime: string;\r\n agentWiseIdleTime: AgentWiseTime[];\r\n };\r\n}\r\n\r\n/** Inbound/outbound call leg inside an agent-performance row. */\r\ninterface AgentPerfCallLeg {\r\n totalCalls: number;\r\n answeredCalls: number;\r\n answeredPercentage: number | null;\r\n abandonedCalls: number;\r\n abandonedPercentage: number | null;\r\n}\r\n\r\n/** One row of POST /agent-dashboard/agent-performance (the Agent Wise Performance table). */\r\ninterface AgentPerformanceRow {\r\n agentId: string;\r\n agentName: string;\r\n totalCallsHandled: number;\r\n answeredCalls: number;\r\n abandonedCalls: number;\r\n loggedInDuration: string;\r\n callHandleTime: string;\r\n breakCount: number;\r\n breakTime: string;\r\n meetingTime: string;\r\n trainingTime: string;\r\n idleTime: string;\r\n totalCalls: number;\r\n inbound: AgentPerfCallLeg;\r\n outbound: AgentPerfCallLeg;\r\n holdTime: string;\r\n firstLoginTime: string | null;\r\n logoutTime: string | null;\r\n avgCallHandleTime: string;\r\n productionPct?: number;\r\n occupancyPct?: number;\r\n breakPct?: number;\r\n idlePct?: number;\r\n meetingTrainingPct?: number;\r\n callHandlePct?: number;\r\n answerRatePct?: number;\r\n reportDate?: string;\r\n loginTime?: string;\r\n}\r\n\r\ninterface AgentDashboardParams {\r\n inputType?: string;\r\n startDate: string; // YYYY-MM-DD\r\n endDate: string; // YYYY-MM-DD\r\n}\r\n\r\ninterface AgentPerformancePage {\r\n data: AgentPerformanceRow[];\r\n total: number;\r\n page: number;\r\n pageSize: number;\r\n totalPages: number;\r\n}\r\n\r\nconst EMPTY_AGENT_DASHBOARD: AgentDashboardData = {\r\n agentsLoggedIn: 0, callsHandled: 0, loggedInDuration: \"00:00:00\",\r\n breakTime: \"00:00:00\", firstLoginTime: \"00:00:00\", outboundTime: \"00:00:00\",\r\n agentsTime: { totalIdleTime: \"00:00:00\", totalTalkTime: \"00:00:00\", totalWrapTime: \"00:00:00\", totalHandleTime: \"00:00:00\", agentWiseIdleTime: [] },\r\n};\r\n\r\n/** POST /agent-dashboard/agent-data → KPI strip + per-agent idle/talk/wrap/handle (heat panels). */\r\nasync function getAgentDashboardData(params: AgentDashboardParams): Promise<AgentDashboardData> {\r\n const res = await axiosInstance.post(END_POINT.AGENT_DASHBOARD_DATA, {\r\n inputType: params.inputType ?? \"TOTAL\",\r\n startDate: params.startDate,\r\n endDate: params.endDate,\r\n });\r\n const body = res.data;\r\n const row = Array.isArray(body) ? body[0] : body;\r\n return row ? { ...EMPTY_AGENT_DASHBOARD, ...row } : EMPTY_AGENT_DASHBOARD;\r\n}\r\n\r\n/** POST /agent-dashboard/agent-performance (page 1-based + pageSize) → server-side paginated envelope. */\r\nasync function getAgentPerformancePaged(\r\n params: AgentDashboardParams & { page: number; pageSize: number },\r\n): Promise<AgentPerformancePage> {\r\n const res = await axiosInstance.post(END_POINT.AGENT_DASHBOARD_PERFORMANCE, {\r\n inputType: params.inputType ?? \"TOTAL\",\r\n startDate: params.startDate,\r\n endDate: params.endDate,\r\n page: params.page,\r\n pageSize: params.pageSize,\r\n });\r\n const b = res.data ?? {};\r\n const data: AgentPerformanceRow[] = Array.isArray(b) ? b : (b.data ?? []);\r\n return {\r\n data,\r\n total: typeof b.total === \"number\" ? b.total : data.length,\r\n page: typeof b.page === \"number\" ? b.page : params.page,\r\n pageSize: typeof b.pageSize === \"number\" ? b.pageSize : params.pageSize,\r\n totalPages: typeof b.totalPages === \"number\" ? b.totalPages : 1,\r\n };\r\n}\r\n\r\n/**\r\n * POST /agent-dashboard/export/excel → downloads the Agents dashboard as an .xlsx file\r\n * (summary cards block + agent-wise performance table; ranked heatmap is not exported).\r\n * Omit reportMode → Summary (one aggregated row per agent for the range); pass\r\n * reportMode \"cumulative\" → one row per agent per day across the range.\r\n */\r\nasync function exportAgentDashboardToExcel(params: AgentDashboardParams & { reportMode?: string }): Promise<void> {\r\n const body: Record<string, unknown> = {\r\n inputType: params.inputType ?? \"TOTAL\",\r\n startDate: params.startDate,\r\n endDate: params.endDate,\r\n };\r\n if (params.reportMode) body.reportMode = params.reportMode;\r\n const res = await axiosInstance.post(END_POINT.AGENT_DASHBOARD_EXPORT_EXCEL, body, { responseType: \"blob\" });\r\n const url = URL.createObjectURL(new Blob([res.data]));\r\n const a = document.createElement(\"a\");\r\n const suffix = params.reportMode ?? \"summary\";\r\n a.href = url;\r\n a.download = `agents-report-${suffix}-${params.startDate}_${params.endDate}.xlsx`;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\n/* ═══════════════════════ COLORS (brand primary = teal #1A5F6C) ═══════════════════════ */\r\nconst C = {\r\n navy: \"#14505b\", blue: \"#1A5F6C\", green: \"#0a9a62\", amber: \"#c47c00\",\r\n red: \"#cc2a2a\", purple: \"#6b3fbf\", teal: \"#0b7a8f\",\r\n bg: \"transparent\", surface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\r\n b1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\r\n t1: \"#0d1e35\", t2: \"#364f6e\", t3: \"#7a93b5\",\r\n blt: \"#e3f1f3\", rlt: \"#fdeae3\",\r\n};\r\n// One font stack for the whole tab — matches the agent-detail report so the\r\n// KPI strip, heat panels, table and dialogs all read as one page.\r\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n// Per-KPI accent colours (border + value) for the stat cards.\r\nconst KPI_ACCENTS = [\"#1A5F6C\", \"#00897B\", \"#5E35B1\", \"#F57C00\", \"#00ACC1\", \"#E53935\"];\r\n// Numeric styling — same page font, just bold + tabular figures for alignment.\r\nconst mono = { fontWeight: 700, fontVariantNumeric: \"tabular-nums\" as const };\r\n// Deterministic avatar palette — a name always maps to the same colour.\r\nconst AVATAR_COLORS = [\"#1A5F6C\", \"#00897B\", \"#5E35B1\", \"#F57C00\", \"#00ACC1\", \"#E53935\", \"#0a9a62\", \"#6b3fbf\"];\r\n// Initials = first letter of first name + first letter of last name.\r\nfunction getInitials(name: string): string {\r\n const parts = (name || \"\").trim().split(/\\s+/).filter(Boolean);\r\n if (parts.length === 0) return \"\";\r\n if (parts.length === 1) return parts[0][0].toUpperCase();\r\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\r\n}\r\nfunction getAvatarColor(name: string): string {\r\n let h = 0;\r\n for (let i = 0; i < (name || \"\").length; i++) h = name.charCodeAt(i) + ((h << 5) - h);\r\n return AVATAR_COLORS[Math.abs(h) % AVATAR_COLORS.length];\r\n}\r\n\r\n/* ═══════════════════════ HELPERS ═══════════════════════ */\r\nfunction parseDur(d?: string | null): number {\r\n if (!d || d === \"00:00:00\") return 0;\r\n const p = d.split(\":\").map(Number);\r\n if (p.length === 3) return p[0] * 3600 + p[1] * 60 + p[2];\r\n if (p.length === 2) return p[0] * 60 + p[1];\r\n return 0;\r\n}\r\nfunction fmtDur(s: number): string {\r\n if (!s || s <= 0) return \"00:00:00\";\r\n const h = Math.floor(s / 3600), m = Math.floor((s % 3600) / 60), sc = Math.floor(s % 60);\r\n return [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\r\n}\r\nfunction fmtDateTime(v?: string | null): string {\r\n if (!v) return \"\";\r\n const d = dayjs(String(v).replace(\" \", \"T\"));\r\n return d.isValid() ? d.format(\"DD-MM-YYYY HH:mm:ss\") : String(v);\r\n}\r\n// Epoch (ms) for chronological sorting of date/time columns; 0 when empty/invalid.\r\nfunction toEpoch(v?: string | null): number {\r\n if (!v) return 0;\r\n const d = dayjs(String(v).replace(\" \", \"T\"));\r\n return d.isValid() ? d.valueOf() : 0;\r\n}\r\n/**\r\n * Threshold colour for a performance percentage (0–100).\r\n * Normal (high is good — Production, Idle, Call Handle):\r\n * < 25% → red · 25–50% → orange · 50–75% → blue · ≥ 75% → green\r\n * Inverted (high is bad — Break, Meeting + Training) flips the scale:\r\n * < 25% → green · 25–50% → blue · 50–75% → orange · ≥ 75% → red\r\n */\r\nfunction pctColor(pct: number, invert = false): string {\r\n const colors = invert\r\n ? [\"#0a9a62\", \"#1565c8\", \"#F57C00\", \"#cc2a2a\"] // green → red (low is good)\r\n : [\"#cc2a2a\", \"#F57C00\", \"#1565c8\", \"#0a9a62\"]; // red → green (high is good)\r\n if (pct < 25) return colors[0];\r\n if (pct < 50) return colors[1];\r\n if (pct < 75) return colors[2];\r\n return colors[3];\r\n}\r\n/* ═══════════════════════ KPI CELL ═══════════════════════ */\r\nfunction Kpi({ label, value, sub, accent }: { label: string; value: string | number; sub?: string; accent: string }) {\r\n return (\r\n <Box sx={{\r\n background: C.surface, border: `1px solid #dce3ef`, borderRadius: \"10px\",\r\n borderLeft: `4px solid ${accent}`, p: \"14px 16px\",\r\n boxShadow: \"0 1px 4px rgba(0,0,0,.08), 0 2px 12px rgba(0,0,0,.05)\",\r\n display: \"flex\", flexDirection: \"column\", gap: 0.5,\r\n }}>\r\n <Typography sx={{ fontSize: 11.5, fontWeight: 600, color: C.t2, textTransform: \"uppercase\", letterSpacing: 0.4 }}>{label}</Typography>\r\n <Typography sx={{ fontSize: 28, fontWeight: 800, color: accent, lineHeight: 1, letterSpacing: \"-0.5px\", fontVariantNumeric: \"tabular-nums\" }}>{value}</Typography>\r\n {sub && <Typography sx={{ fontSize: 11.5, color: C.t3 }}>{sub}</Typography>}\r\n </Box>\r\n );\r\n}\r\n\r\n/* ═══════════════════════ HEAT PANEL (Top/Bottom) ═══════════════════════ */\r\nconst HEAT_TONES = {\r\n blue: { headBg: \"#eef5f6\", headTx: \"#14505b\", pillBg: \"#e3f1f3\", pillTx: \"#14505b\", rank: \"#6ba3ac\" },\r\n red: { headBg: \"#fdeeee\", headTx: \"#b3352f\", pillBg: \"#fbe3e3\", pillTx: \"#c0392b\", rank: \"#e0a0a0\" },\r\n};\r\nfunction HeatColumn({ title, rows, variant }: { title: string; rows: { name: string; secs: number }[]; variant: \"blue\" | \"red\" }) {\r\n const tone = HEAT_TONES[variant];\r\n return (\r\n <Box sx={{ flex: 1, minWidth: 0 }}>\r\n <Typography sx={{ fontSize: 10.5, fontWeight: 700, letterSpacing: 0.4, textTransform: \"uppercase\", color: tone.headTx, background: tone.headBg, textAlign: \"center\", py: 0.7, borderBottom: `1px solid ${C.b1}` }}>{title}</Typography>\r\n <Box sx={{ maxHeight: 176, overflowY: \"auto\", \"&::-webkit-scrollbar\": { width: 5 }, \"&::-webkit-scrollbar-thumb\": { background: C.b2, borderRadius: 4 } }}>\r\n {rows.map((r, i) => (\r\n <Box key={i} sx={{\r\n display: \"grid\", gridTemplateColumns: \"18px 1fr auto\", alignItems: \"center\", gap: 0.6,\r\n px: 1, py: 0.45, borderBottom: `1px solid ${C.b1}`, \"&:last-child\": { borderBottom: \"none\" },\r\n transition: \"background .12s\", \"&:hover\": { background: C.s2 },\r\n }}>\r\n <Typography sx={{ ...mono, fontSize: 10, fontWeight: 700, color: tone.rank, textAlign: \"right\" }}>{i + 1}</Typography>\r\n <Tooltip title={r.name} arrow placement=\"top\">\r\n <Typography noWrap sx={{ fontSize: 11.5, fontWeight: 600, color: C.t1, cursor: \"default\" }}>\r\n {r.name.length > 5 ? `${r.name.slice(0, 5)}…` : r.name}\r\n </Typography>\r\n </Tooltip>\r\n <Box sx={{ background: tone.pillBg, color: tone.pillTx, borderRadius: \"5px\", textAlign: \"center\", px: 0.9, py: 0.3, minWidth: 62, ...mono, fontSize: 10.5 }}>\r\n {fmtDur(r.secs)}\r\n </Box>\r\n </Box>\r\n ))}\r\n {rows.length === 0 && <Typography sx={{ fontSize: 11.5, color: C.t3, textAlign: \"center\", py: 3 }}>No data</Typography>}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\nfunction HeatPanel({ title, total, accent, agents, pick }: {\r\n title: string; total: string; accent: string; agents: AgentWiseTime[]; pick: (a: AgentWiseTime) => string;\r\n}) {\r\n const vals = agents.map((a) => ({ name: a.agentName, secs: parseDur(pick(a)) }));\r\n const asc = [...vals].sort((a, b) => a.secs - b.secs);\r\n const desc = [...asc].reverse();\r\n return (\r\n <Paper elevation={0} sx={{ border: `1px solid #dce3ef`, borderLeft: `4px solid ${accent}`, borderRadius: \"10px\", overflow: \"hidden\", boxShadow: \"0 1px 4px rgba(0,0,0,.08), 0 2px 12px rgba(0,0,0,.05)\" }}>\r\n <Box sx={{ background: C.s2, borderBottom: `1px solid ${C.b1}`, px: 1.5, py: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}>\r\n <Box sx={{ width: 8, height: 8, borderRadius: \"50%\", background: accent }} />\r\n <Typography sx={{ fontSize: 12, fontWeight: 700, color: C.t1, letterSpacing: 0.3, textTransform: \"uppercase\" }}>{title}</Typography>\r\n </Box>\r\n <Typography sx={{ ...mono, fontSize: 14, fontWeight: 800, color: accent }}>{total}</Typography>\r\n </Box>\r\n <Box sx={{ display: \"flex\", \"& > *:first-of-type\": { borderRight: `1px solid ${C.b1}` } }}>\r\n <HeatColumn title=\"Top to Bottom\" rows={desc} variant=\"blue\" />\r\n <HeatColumn title=\"Bottom to Top\" rows={asc} variant=\"red\" />\r\n </Box>\r\n </Paper>\r\n );\r\n}\r\n\r\n/* ═══════════════════════ TABLE BAR CELL ═══════════════════════\r\n Stacked layout: a top line with [count?] · % · time, and the coloured bar\r\n sitting directly beneath them. The bar uses the column's own accent, fills\r\n 0–100%, and renders nothing at zero — so empty rows read as blank, not red. */\r\nfunction BarCell({ value, pct, accent, count, onCountClick }: {\r\n value: string; pct: number; accent: string; count?: number; onCountClick?: () => void;\r\n}) {\r\n const width = Math.max(0, Math.min(100, pct));\r\n return (\r\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 0.5, minWidth: 130, py: 0.3 }}>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}>\r\n {count != null && (\r\n <Box\r\n component=\"span\"\r\n onClick={onCountClick ? (e) => { e.stopPropagation(); onCountClick(); } : undefined}\r\n title={onCountClick ? \"View break sessions\" : undefined}\r\n sx={{\r\n flexShrink: 0, display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\",\r\n minWidth: 20, height: 18, px: 0.5, borderRadius: \"9px\", fontSize: 10,\r\n fontVariantNumeric: \"tabular-nums\", transition: \"background .12s\",\r\n ...(onCountClick\r\n ? { cursor: \"pointer\", background: C.navy, color: \"#fff\", \"&:hover\": { background: C.blue } }\r\n : { background: C.s3, color: C.t3 }),\r\n }}\r\n >\r\n {count}\r\n </Box>\r\n )}\r\n {/* A percentage over 100% is flagged with a red tint — it signals a value\r\n that exceeds its reference period and is worth a second look. */}\r\n <Typography sx={{\r\n fontSize: 11, fontVariantNumeric: \"tabular-nums\", whiteSpace: \"nowrap\",\r\n ...(pct > 100\r\n ? { color: C.red, background: C.rlt, borderRadius: \"4px\", px: 0.5 }\r\n : { color: C.t2 }),\r\n }}>{pct.toFixed(1)}%</Typography>\r\n <Typography sx={{ fontSize: 10.5, color: C.t3, fontVariantNumeric: \"tabular-nums\", whiteSpace: \"nowrap\" }}>{value}</Typography>\r\n </Box>\r\n <Box sx={{ width: \"100%\", height: 8, background: C.s3, borderRadius: \"4px\", overflow: \"hidden\" }}>\r\n {width > 0 && <Box sx={{ height: \"100%\", width: `${width}%`, background: accent, borderRadius: \"4px\" }} />}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\nconst InOut = ({ i, o }: { i: number; o: number }) => (\r\n <Typography sx={{ fontSize: 11.5, color: C.t2, whiteSpace: \"nowrap\" }}>\r\n <span style={{ color: C.t3 }}>In:</span> {i} <span style={{ color: C.t3 }}>Out:</span> {o}\r\n </Typography>\r\n);\r\n\r\n/* ═══════════════════════ MAIN COMPONENT ═══════════════════════ */\r\nfunction AgentPerformanceReportContent() {\r\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [quickRange, setQuickRange] = useState<string>(\"today\");\r\n\r\n const [dashboard, setDashboard] = useState<AgentDashboardData | null>(null);\r\n const [rows, setRows] = useState<AgentPerformanceRow[]>([]);\r\n const [total, setTotal] = useState(0);\r\n const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 });\r\n const [loadingTop, setLoadingTop] = useState(false);\r\n const [loadingTable, setLoadingTable] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n // Eye action → drill into the per-agent detail view (rendered in place).\r\n const [selectedAgent, setSelectedAgent] = useState<AgentPerformanceRow | null>(null);\r\n // Break-count click → break-sessions dialog for that agent.\r\n const [breaksAgent, setBreaksAgent] = useState<AgentPerformanceRow | null>(null);\r\n // Export mode: \"summary\" (no reportMode) or \"cumulative\" (day-wise, reportMode: \"cumulative\").\r\n const [exportMode, setExportMode] = useState<\"summary\" | \"cumulative\">(\"summary\");\r\n const [exporting, setExporting] = useState(false);\r\n const loading = loadingTop || loadingTable;\r\n\r\n const onErr = (err: any) => setError(err?.response?.data?.detail || err?.message || \"Failed to load agents report\");\r\n\r\n // KPI strip + heat panels — always the full agent set (dates only).\r\n const fetchDashboard = useCallback((showSpinner = true) => {\r\n if (!startDate || !endDate) return;\r\n const params = { inputType: \"TOTAL\", startDate: startDate.format(\"YYYY-MM-DD\"), endDate: endDate.format(\"YYYY-MM-DD\") };\r\n if (showSpinner) setLoadingTop(true);\r\n setError(\"\");\r\n getAgentDashboardData(params).then(setDashboard).catch(onErr).finally(() => setLoadingTop(false));\r\n }, [startDate, endDate]);\r\n\r\n // Agent Wise Performance table — server-side paginated.\r\n const fetchTable = useCallback((showSpinner = true) => {\r\n if (!startDate || !endDate) return;\r\n const params = {\r\n inputType: \"TOTAL\", startDate: startDate.format(\"YYYY-MM-DD\"), endDate: endDate.format(\"YYYY-MM-DD\"),\r\n page: pagination.pageIndex + 1, pageSize: pagination.pageSize,\r\n };\r\n if (showSpinner) setLoadingTable(true);\r\n setError(\"\");\r\n getAgentPerformancePaged(params)\r\n .then((res) => { setRows(res.data); setTotal(res.total); })\r\n .catch(onErr)\r\n .finally(() => setLoadingTable(false));\r\n }, [startDate, endDate, pagination.pageIndex, pagination.pageSize]);\r\n\r\n useEffect(() => { fetchDashboard(); }, [fetchDashboard]);\r\n useEffect(() => { fetchTable(); }, [fetchTable]);\r\n\r\n const handleRefresh = () => {\r\n if (quickRange === \"today\" || quickRange === \"week\" || quickRange === \"month\") {\r\n const nowD = dayjs();\r\n let sd = nowD.startOf(\"day\");\r\n if (quickRange === \"week\") sd = nowD.startOf(\"week\").startOf(\"day\");\r\n else if (quickRange === \"month\") sd = nowD.startOf(\"month\").startOf(\"day\");\r\n setStartDate(sd); setEndDate(nowD);\r\n }\r\n fetchDashboard(); fetchTable();\r\n };\r\n\r\n const handleExport = () => {\r\n if (!startDate || !endDate) return;\r\n setExporting(true);\r\n setError(\"\");\r\n exportAgentDashboardToExcel({\r\n inputType: \"TOTAL\",\r\n startDate: startDate.format(\"YYYY-MM-DD\"),\r\n endDate: endDate.format(\"YYYY-MM-DD\"),\r\n reportMode: exportMode, // \"summary\" | \"cumulative\" — sent explicitly so the two differ\r\n }).catch(onErr).finally(() => setExporting(false));\r\n };\r\n\r\n const heatAgents = dashboard?.agentsTime.agentWiseIdleTime ?? [];\r\n\r\n // Production Time = logged-in − break; the numeric value shown alongside the % bar.\r\n const prodSecs = (r: AgentPerformanceRow) => Math.max(0, parseDur(r.loggedInDuration) - parseDur(r.breakTime));\r\n const mtSecs = (r: AgentPerformanceRow) => parseDur(r.meetingTime) + parseDur(r.trainingTime);\r\n\r\n const columns = useMemo<MRT_ColumnDef<AgentPerformanceRow>[]>(() => [\r\n { id: \"agent\", header: \"Agent\", size: 220, accessorFn: (r) => r.agentName,\r\n Cell: ({ row }) => {\r\n const name = row.original.agentName || \"\";\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, minWidth: 0 }}>\r\n <Box sx={{\r\n width: 30, height: 30, borderRadius: \"50%\", flexShrink: 0,\r\n display: \"flex\", alignItems: \"center\", justifyContent: \"center\",\r\n background: getAvatarColor(name), color: \"#fff\", fontSize: 11, letterSpacing: 0.3,\r\n }}>\r\n {getInitials(name)}\r\n </Box>\r\n <Box sx={{ minWidth: 0 }}>\r\n <Typography noWrap sx={{ fontSize: 11.5, color: C.t1, lineHeight: 1.3 }}>{name}</Typography>\r\n <Typography noWrap sx={{ fontSize: 10.5, color: C.t3, fontVariantNumeric: \"tabular-nums\", lineHeight: 1.3 }}>{row.original.agentId}</Typography>\r\n </Box>\r\n </Box>\r\n );\r\n } },\r\n { id: \"firstLogin\", header: \"First Login\", size: 160, accessorFn: (r) => toEpoch(r.firstLoginTime),\r\n Cell: ({ row }) => <span style={{ fontSize: 11.5, color: C.t2, fontVariantNumeric: \"tabular-nums\" }}>{fmtDateTime(row.original.firstLoginTime)}</span> },\r\n { id: \"lastLogout\", header: \"Last Logout\", size: 160, accessorFn: (r) => toEpoch(r.logoutTime),\r\n Cell: ({ row }) => <span style={{ fontSize: 11.5, color: C.t2, fontVariantNumeric: \"tabular-nums\" }}>{fmtDateTime(row.original.logoutTime)}</span> },\r\n { id: \"total\", header: \"Total Calls\", size: 120, accessorFn: (r) => r.inbound.totalCalls + r.outbound.totalCalls,\r\n Cell: ({ row }) => <InOut i={row.original.inbound.totalCalls} o={row.original.outbound.totalCalls} /> },\r\n { id: \"answered\", header: \"Answered\", size: 120, accessorFn: (r) => r.inbound.answeredCalls + r.outbound.answeredCalls,\r\n Cell: ({ row }) => <InOut i={row.original.inbound.answeredCalls} o={row.original.outbound.answeredCalls} /> },\r\n { id: \"abandoned\", header: \"Abandoned\", size: 120, accessorFn: (r) => r.inbound.abandonedCalls + r.outbound.abandonedCalls,\r\n Cell: ({ row }) => <InOut i={row.original.inbound.abandonedCalls} o={row.original.outbound.abandonedCalls} /> },\r\n { id: \"avgCallHandleTime\", header: \"AHT\", size: 100, accessorFn: (r) => parseDur(r.avgCallHandleTime),\r\n Cell: ({ row }) => <span style={{ fontWeight: 400, fontSize: 11.5, color: C.purple, fontVariantNumeric: \"tabular-nums\" }}>{row.original.avgCallHandleTime}</span> },\r\n { id: \"loggedInDuration\", header: \"Logged In Duration\", size: 130, accessorFn: (r) => parseDur(r.loggedInDuration),\r\n Cell: ({ row }) => <span style={{ fontWeight: 400, fontSize: 11.5, color: C.teal, fontVariantNumeric: \"tabular-nums\" }}>{row.original.loggedInDuration}</span> },\r\n { id: \"production\", header: \"Production Time\", size: 200, accessorFn: (r) => prodSecs(r),\r\n Cell: ({ row }) => { const p = row.original.productionPct ?? 0; return <BarCell value={fmtDur(prodSecs(row.original))} pct={p} accent={pctColor(p)} />; } },\r\n { id: \"callHandle\", header: \"Call Handle Time\", size: 200, accessorFn: (r) => parseDur(r.callHandleTime),\r\n Cell: ({ row }) => { const p = row.original.answerRatePct ?? 0; return <BarCell value={row.original.callHandleTime} pct={p} accent={pctColor(p)} />; } },\r\n { id: \"break\", header: \"Break Time\", size: 200, accessorFn: (r) => parseDur(r.breakTime),\r\n Cell: ({ row }) => { const p = row.original.breakPct ?? 0; return <BarCell value={row.original.breakTime} pct={p} accent={pctColor(p, true)} count={row.original.breakCount} onCountClick={row.original.breakCount > 0 ? () => setBreaksAgent(row.original) : undefined} />; } },\r\n { id: \"idle\", header: \"Idle Time\", size: 200, accessorFn: (r) => parseDur(r.idleTime),\r\n Cell: ({ row }) => { const p = row.original.idlePct ?? 0; return <BarCell value={row.original.idleTime} pct={p} accent={pctColor(p)} />; } },\r\n { id: \"meetingTraining\", header: \"Meeting + Training\", size: 200, accessorFn: (r) => mtSecs(r),\r\n Cell: ({ row }) => { const p = row.original.meetingTrainingPct ?? 0; return <BarCell value={fmtDur(mtSecs(row.original))} pct={p} accent={pctColor(p, true)} />; } },\r\n { id: \"actions\", header: \"Detail\", size: 80, enableColumnFilter: false, enableSorting: false,\r\n Cell: ({ row }) => (\r\n <Tooltip title=\"View agent details\" arrow>\r\n <IconButton size=\"small\" onClick={() => setSelectedAgent(row.original)} sx={{ color: C.blue }}>\r\n <VisibilityIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </Tooltip>\r\n ) },\r\n ], []);\r\n\r\n // Drill-down: reuse the existing per-agent detail page. It only needs the\r\n // agentId + name; every other metric it fetches itself by agent id.\r\n if (selectedAgent) {\r\n const agentRow: ReportData = { agentDetails: { agentId: selectedAgent.agentId, fullName: selectedAgent.agentName } };\r\n return (\r\n <AgentDetailReport\r\n agentRow={agentRow}\r\n onBack={() => setSelectedAgent(null)}\r\n initialStartDate={startDate}\r\n initialEndDate={endDate}\r\n initialQuickRange={quickRange}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{\r\n background: C.bg, minHeight: \"100vh\", fontFamily: FONT,\r\n \"& .MuiTypography-root, & th, & td, & .MuiButton-root, & .MuiChip-root, & .MuiMenuItem-root\": { fontFamily: FONT },\r\n }}>\r\n <PageHeader title=\"Agents Performance Report\" />\r\n\r\n <ReportFilterBar\r\n startDate={startDate} endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n showTime={false}\r\n quickRange={quickRange} onQuickRangeChange={(r: QuickRange) => setQuickRange(r)}\r\n extra={\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n <AppButton startIcon={<RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />} disabled={loading} onClick={handleRefresh} sx={{ height: 32 }}>\r\n Refresh\r\n </AppButton>\r\n <SDKPermissionGuard permissions={[SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_EXPORT, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE]}>\r\n <FormControl size=\"small\">\r\n <Select\r\n value={exportMode}\r\n onChange={(e) => setExportMode(e.target.value as \"summary\" | \"cumulative\")}\r\n sx={{ height: 32, fontSize: 13, minWidth: 130, bgcolor: \"#fff\", borderRadius: \"30px\", \"& .MuiOutlinedInput-notchedOutline\": { borderRadius: \"30px\" } }}\r\n >\r\n <MenuItem value=\"summary\" sx={{ fontSize: 13 }}>Summary</MenuItem>\r\n <MenuItem value=\"cumulative\" sx={{ fontSize: 13 }}>Day-wise</MenuItem>\r\n </Select>\r\n </FormControl>\r\n <AppButton\r\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n disabled={exporting || loading}\r\n onClick={handleExport}\r\n sx={{ height: 32 }}\r\n >\r\n Export Excel\r\n </AppButton>\r\n </SDKPermissionGuard>\r\n </Box>\r\n }\r\n />\r\n\r\n {error && <Alert severity=\"error\" sx={{ mx: 2.5, mt: 1.5 }} onClose={() => setError(\"\")}>{error}</Alert>}\r\n\r\n <Box sx={{ py: 1.5, px: 2, position: \"relative\" }}>\r\n {loadingTop && (\r\n <Box sx={{ position: \"absolute\", inset: 0, background: \"rgba(240,244,248,0.7)\", display: \"flex\", alignItems: \"flex-start\", justifyContent: \"center\", pt: 10, zIndex: 10 }}>\r\n <CircularProgress />\r\n </Box>\r\n )}\r\n\r\n {/* ═══ KPI STRIP ═══ */}\r\n <Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"repeat(2,1fr)\", md: \"repeat(3,1fr)\", lg: \"repeat(6,1fr)\" }, gap: 1.25, mb: 1.75 }}>\r\n <Kpi label=\"Agents Logged In\" value={dashboard?.agentsLoggedIn ?? 0} sub=\"Active right now\" accent={KPI_ACCENTS[0]} />\r\n <Kpi label=\"Calls Handled\" value={(dashboard?.callsHandled ?? 0).toLocaleString()} sub=\"Today total\" accent={KPI_ACCENTS[1]} />\r\n <Kpi label=\"Logged In Duration\" value={dashboard?.loggedInDuration ?? \"00:00:00\"} sub=\"Cumulative\" accent={KPI_ACCENTS[2]} />\r\n <Kpi label=\"Break Time\" value={dashboard?.breakTime ?? \"00:00:00\"} sub=\"Cumulative\" accent={KPI_ACCENTS[3]} />\r\n <Kpi label=\"First Login Time\" value={dashboard?.firstLoginTime ?? \"00:00:00\"} sub=\"Earliest today\" accent={KPI_ACCENTS[4]} />\r\n <Kpi label=\"Outbound Time\" value={dashboard?.outboundTime ?? \"00:00:00\"} sub=\"Active outbound\" accent={KPI_ACCENTS[5]} />\r\n </Box>\r\n\r\n {/* ═══ 4 HEAT PANELS (always one row) ═══ */}\r\n <Box sx={{ display: \"grid\", gridTemplateColumns: \"repeat(4, minmax(0, 1fr))\", gap: 1.5, mb: 1.5 }}>\r\n <HeatPanel title=\"IDLE Time\" accent=\"#F57C00\" total={dashboard?.agentsTime.totalIdleTime ?? \"00:00:00\"} agents={heatAgents} pick={(a) => a.idleTime} />\r\n <HeatPanel title=\"Talk Time\" accent=\"#00897B\" total={dashboard?.agentsTime.totalTalkTime ?? \"00:00:00\"} agents={heatAgents} pick={(a) => a.talkTime} />\r\n <HeatPanel title=\"Wrap Time\" accent=\"#5E35B1\" total={dashboard?.agentsTime.totalWrapTime ?? \"00:00:00\"} agents={heatAgents} pick={(a) => a.wrapTime} />\r\n <HeatPanel title=\"Call Handle Time\" accent=\"#1A5F6C\" total={dashboard?.agentsTime.totalHandleTime ?? \"00:00:00\"} agents={heatAgents} pick={(a) => a.handleTime} />\r\n </Box>\r\n\r\n {/* ═══ AGENT WISE PERFORMANCE TABLE ═══ */}\r\n <Box>\r\n <Typography sx={{ fontSize: 13, fontWeight: 800, color: C.t1, mb: 1 }}>Agent Wise Performance</Typography>\r\n <AppTable\r\n columns={columns}\r\n data={rows}\r\n layoutMode=\"grid\"\r\n enableTopToolbar={false}\r\n enableColumnActions={false}\r\n enableColumnFilters={false}\r\n enableColumnDragging={false}\r\n enableHiding={false}\r\n enableDensityToggle={false}\r\n enableFullScreenToggle={false}\r\n enableSorting\r\n manualPagination\r\n rowCount={total}\r\n onPaginationChange={setPagination}\r\n state={{ pagination, isLoading: loadingTable }}\r\n muiTableHeadCellProps={{\r\n sx: {\r\n ...headCellSx, fontFamily: FONT, px: \"12px\", py: \"8px\",\r\n display: \"flex\", alignItems: \"center\", textAlign: \"left\",\r\n \"& .Mui-TableHeadCell-Content\": { m: 0, p: 0, width: \"100%\", justifyContent: \"flex-start\" },\r\n \"& .Mui-TableHeadCell-Content-Wrapper\": { m: 0, p: 0 },\r\n \"& .Mui-TableHeadCell-Content-Labels\": { m: 0, p: 0 },\r\n },\r\n }}\r\n muiTableBodyCellProps={{\r\n sx: {\r\n ...bodyCellSx, fontFamily: FONT, px: \"12px\", py: \"8px\",\r\n display: \"flex\", alignItems: \"center\", justifyContent: \"flex-start\", textAlign: \"left\",\r\n },\r\n }}\r\n muiTableBodyRowProps={({ row }) => ({\r\n onClick: () => setSelectedAgent(row.original),\r\n sx: { cursor: \"pointer\", \"&:hover\": { backgroundColor: C.s2 } },\r\n })}\r\n />\r\n </Box>\r\n </Box>\r\n </Box>\r\n\r\n <BreakSessionsDialog\r\n open={!!breaksAgent}\r\n onClose={() => setBreaksAgent(null)}\r\n agentId={breaksAgent?.agentId ?? \"\"}\r\n agentName={breaksAgent?.agentName ?? \"\"}\r\n startDate={startDate}\r\n endDate={endDate}\r\n />\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst AgentPerformanceReport: React.FC = () => (\r\n <SDKProvider>\r\n <AgentPerformanceReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default AgentPerformanceReport;\r\n","import { Box } from \"@mui/material\";\r\nimport {\r\n MaterialReactTable,\r\n useMaterialReactTable,\r\n type MRT_ColumnDef,\r\n type MRT_RowData,\r\n type MRT_TableOptions,\r\n} from \"material-react-table\";\r\n\r\n/**\r\n * Shared MRT styling — mirror of the main app's tableStyles so the SDK table\r\n * looks/behaves like the rest of the reports UI.\r\n */\r\nconst mrtStylingProps: Partial<MRT_TableOptions<MRT_RowData>> = {\r\n muiTableProps: {\r\n sx: {\r\n border: \"1px solid white\",\r\n borderRadius: \"20px\",\r\n boxShadow: \"0px 4px 10px rgba(0, 0, 0, 0.1)\",\r\n },\r\n },\r\n muiTableHeadCellProps: {\r\n sx: {\r\n backgroundColor: \"#f1f1f1\",\r\n color: \"#333\",\r\n fontWeight: 600,\r\n fontSize: \"14px\",\r\n \"& .Mui-TableHeadCell-Content\": {\r\n flexDirection: \"row-reverse\",\r\n justifyContent: \"flex-end\",\r\n },\r\n },\r\n },\r\n muiTableBodyCellProps: {\r\n sx: { padding: \"4px 12px\", fontSize: \"14px\" },\r\n },\r\n muiTableBodyRowProps: {\r\n sx: {\r\n \"&:nth-of-type(even)\": { backgroundColor: \"#fff\" },\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n },\r\n },\r\n};\r\n\r\n/** Shared MRT config (behavior + styling) — spread into useMaterialReactTable. */\r\nconst COLUMN_FILTERS: Partial<MRT_TableOptions<MRT_RowData>> = {\r\n enableFilters: true,\r\n enableColumnFilterModes: false,\r\n enablePagination: true,\r\n enableBottomToolbar: true,\r\n enableSorting: false,\r\n positionExpandColumn: \"last\" as const,\r\n columnFilterDisplayMode: \"popover\" as const,\r\n enableGlobalFilterModes: true,\r\n globalFilterFn: \"contains\",\r\n globalFilterModeOptions: [\"startsWith\"],\r\n initialState: { showGlobalFilter: true },\r\n muiSearchTextFieldProps: {\r\n placeholder: \"Search\",\r\n sx: { borderRadius: \"50%\" },\r\n },\r\n ...mrtStylingProps,\r\n};\r\n\r\nconst TopToolbarContainer = () => (\r\n <Box sx={{ backgroundColor: \"#fff\", display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }} />\r\n);\r\n\r\ntype AppTableOptions<T extends MRT_RowData> = Omit<\r\n MRT_TableOptions<T>,\r\n \"columns\" | \"data\"\r\n> & {\r\n columns: MRT_ColumnDef<T>[];\r\n data: T[];\r\n};\r\n\r\n/**\r\n * Hook — use when you need direct access to the `table` instance.\r\n */\r\nexport function useAppTable<T extends MRT_RowData>({\r\n columns,\r\n data,\r\n ...overrides\r\n}: AppTableOptions<T>) {\r\n return useMaterialReactTable({\r\n columns,\r\n data,\r\n ...(COLUMN_FILTERS as Partial<MRT_TableOptions<T>>),\r\n renderTopToolbar: () => <TopToolbarContainer />,\r\n ...overrides,\r\n });\r\n}\r\n\r\n/**\r\n * Component — use for simple tables that don't need external table access.\r\n */\r\nexport default function AppTable<T extends MRT_RowData>(\r\n props: AppTableOptions<T>\r\n) {\r\n const table = useAppTable(props);\r\n return <MaterialReactTable table={table} />;\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport {\r\n Box, Typography, IconButton, CircularProgress, Dialog, DialogTitle, DialogContent,\r\n} from \"@mui/material\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport dayjs, { type Dayjs } from \"dayjs\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport BreakSessionsTable from \"../common/components/BreakSessionsTable\";\r\nimport { getAgentBreakSessions, exportAgentBreakSessionsToExcel } from \"../agentDetailReport/useAgentDetailReport\";\r\nimport type { BreakSessionResponse } from \"../agentDetailReport/types\";\r\n\r\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\nconst C = { red: \"#cc2a2a\" };\r\n\r\n// Format start/end date range the way the breaks endpoint expects (ISO, end clamped to \"now\" for today).\r\nfunction fmtRange(startDate: Dayjs | null, endDate: Dayjs | null) {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n return {\r\n start_date: sd.startOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.isSame(dayjs(), \"day\")\r\n ? dayjs().format(\"YYYY-MM-DDTHH:mm:ss\")\r\n : ed.endOf(\"day\").format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n };\r\n}\r\n\r\ninterface Props {\r\n open: boolean;\r\n onClose: () => void;\r\n agentId: string;\r\n agentName: string;\r\n startDate: Dayjs | null;\r\n endDate: Dayjs | null;\r\n}\r\n\r\n/**\r\n * Break-sessions drill-down dialog — lists an agent's individual breaks grouped\r\n * by date, with an Excel export. Fetches on open via the break-sessions endpoint.\r\n */\r\nexport default function BreakSessionsDialog({ open, onClose, agentId, agentName, startDate, endDate }: Props) {\r\n const [breakSessions, setBreakSessions] = useState<BreakSessionResponse[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n\r\n useEffect(() => {\r\n if (!open || !agentId) return;\r\n let active = true;\r\n setBreakSessions([]);\r\n setError(\"\");\r\n setLoading(true);\r\n getAgentBreakSessions(agentId, fmtRange(startDate, endDate))\r\n .then((data) => { if (active) setBreakSessions(Array.isArray(data) ? data : []); })\r\n .catch(() => { if (active) setBreakSessions([]); })\r\n .finally(() => { if (active) setLoading(false); });\r\n return () => { active = false; };\r\n }, [open, agentId, startDate, endDate]);\r\n\r\n const handleExport = async () => {\r\n if (!agentId) return;\r\n try {\r\n await exportAgentBreakSessionsToExcel(agentId, fmtRange(startDate, endDate));\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export breaks Excel\");\r\n }\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={(_e, reason) => { if (reason !== \"backdropClick\") onClose(); }}\r\n maxWidth=\"md\"\r\n fullWidth\r\n PaperProps={{ sx: { borderRadius: \"12px\", fontFamily: FONT, overflow: \"hidden\", boxShadow: \"0 8px 32px rgba(0,0,0,0.18)\", maxWidth: 640 } }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n fontFamily: FONT,\r\n background: \"linear-gradient(135deg, var(--primary-color-dark, #14505b), var(--primary-color, #1A5F6C))\",\r\n color: \"#fff\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n py: 1.5,\r\n px: 2.5,\r\n }}\r\n >\r\n <Box>\r\n <Typography variant=\"h6\" sx={{ fontFamily: FONT, fontWeight: 700, fontSize: \"0.95rem\", letterSpacing: \"0.3px\" }}>\r\n Break Sessions\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ fontFamily: FONT, opacity: 0.9, fontSize: \"0.76rem\", mt: 0.3 }}>\r\n {agentName} • {breakSessions.length} break{breakSessions.length !== 1 ? \"s\" : \"\"}\r\n </Typography>\r\n </Box>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n <AppButton\r\n size=\"small\"\r\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.85rem !important\" }} />}\r\n disabled={loading || breakSessions.length === 0}\r\n onClick={handleExport}\r\n sx={{ whiteSpace: \"nowrap\" }}\r\n >\r\n Export to Excel\r\n </AppButton>\r\n <IconButton\r\n onClick={onClose}\r\n size=\"small\"\r\n sx={{ color: \"#fff\", backgroundColor: \"rgba(255,255,255,0.1)\", \"&:hover\": { backgroundColor: \"rgba(255,255,255,0.2)\" } }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ p: 0, backgroundColor: \"#f8fafb\" }}>\r\n {error && (\r\n <Typography sx={{ fontFamily: FONT, color: C.red, fontSize: \"0.78rem\", px: 2, pt: 1.5 }}>{error}</Typography>\r\n )}\r\n {loading ? (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <CircularProgress size={28} sx={{ color: \"var(--primary-color, #1A5F6C)\" }} />\r\n </Box>\r\n ) : breakSessions.length > 0 ? (\r\n <Box sx={{ p: 1.5 }}>\r\n <BreakSessionsTable breaks={breakSessions} maxHeight={360} showRemarksStatus={false} />\r\n </Box>\r\n ) : (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <Typography sx={{ fontFamily: FONT, color: \"#9e9e9e\", fontStyle: \"italic\", fontSize: \"0.82rem\" }}>\r\n No breaks found\r\n </Typography>\r\n </Box>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n"],"mappings":"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","names":["useState","useEffect","Box","Typography","CircularProgress","IconButton","FileDownloadIcon","dayjs","Box","jsx","Box","jsx","jsxs","C","FONT","dayjs","Box","Typography","useState","_a","_b","useEffect","IconButton","FileDownloadIcon","CircularProgress"]}
|
package/dist-react/index.d.ts
CHANGED
|
@@ -2480,4 +2480,5 @@ interface SDKAccessDeniedProps {
|
|
|
2480
2480
|
|
|
2481
2481
|
declare const SDKAccessDenied: React.FC<SDKAccessDeniedProps>;
|
|
2482
2482
|
|
|
2483
|
-
export {
|
|
2483
|
+
export type { APIResponse, AgentStatus, CallControlPanelProps, CallData, CallInitiationFunction, CallTerminationFunction, ChangeModePayload, CleanupOperation, ConferenceCallPayload, ConferenceLine, ControlsFromPermissions, DispositionType, EndCallData, EndCallPayLoadData, EndCallPayload, ErrorResponse, FollowUpType, HookStateTypes, InitSDKParams, LiveStatusPageProps, LogoutFunction, LogoutHookStateTypes, LogoutPayload, ProcessData, SDKAccessDeniedProps, SDKBit, SDKConfig, SDKEntitlement, SDKEntitlements, SDKInitResult, SDKPermissionContextValue, SDKPermissionGuardProps, SDKPermissionState, SDKPermissionsHook, SDKState, StartCallPayload, StartCalltData, StartCalltHookStateTypes, StartMonitoringPayload, StopMonitoringPayload, StorageType, SupervisorMonitorMode, URLConfig, UseCallMonitoringReturn, UseClickToCallReturn, UseClickToConferenceReturn, UseEndCallReturn, UseLogoutReturn }
|
|
2484
|
+
export { CallControlPanel, SDKAccessDenied, SDKPages, SDKPermissionGuard, SDKStateManager, SDK_MENU_CODES, SDK_PERMISSIONS, SDK_WILDCARD, changeMonitorMode, clickToCall, clickToConference, endCall, getSDKVersion, initSDK, isSDKInitialized, logout, sdkStateManager, setTransferLeadData, startMonitoring, stopMonitoring, useCallMonitoring, useClickToCall, useClickToConference, useEndCall, useGetAuthorizationToken, useGetCallerData, useLogout, useSDKPermissions, useSDKState };
|
package/dist-react/index.js
CHANGED
|
@@ -20387,7 +20387,7 @@ function BarCell({ value, pct, accent, count, onCountClick }) {
|
|
|
20387
20387
|
fontVariantNumeric: "tabular-nums",
|
|
20388
20388
|
whiteSpace: "nowrap"
|
|
20389
20389
|
}, pct > 100 ? { color: C4.red, background: C4.rlt, borderRadius: "4px", px: 0.5 } : { color: C4.t2 }), children: [
|
|
20390
|
-
pct.toFixed(
|
|
20390
|
+
pct.toFixed(1),
|
|
20391
20391
|
"%"
|
|
20392
20392
|
] }),
|
|
20393
20393
|
/* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_material24.Typography, { sx: { fontSize: 10.5, color: C4.t3, fontVariantNumeric: "tabular-nums", whiteSpace: "nowrap" }, children: value })
|
|
@@ -22558,6 +22558,8 @@ var init_caroQualityAuditDashboard = __esm({
|
|
|
22558
22558
|
// call-control-sdk/index.ts
|
|
22559
22559
|
var index_exports = {};
|
|
22560
22560
|
__export(index_exports, {
|
|
22561
|
+
AgentDetailReport: () => agentDetailReport_default,
|
|
22562
|
+
AuditReportDialog: () => AuditReportDialog,
|
|
22561
22563
|
CallControlPanel: () => CallControlPanel,
|
|
22562
22564
|
SDKAccessDenied: () => SDKAccessDenied,
|
|
22563
22565
|
SDKPages: () => SDKPages,
|
|
@@ -27009,6 +27011,7 @@ var SDKPages = {
|
|
|
27009
27011
|
|
|
27010
27012
|
// call-control-sdk/index.ts
|
|
27011
27013
|
init_AuditReport();
|
|
27014
|
+
init_agentDetailReport();
|
|
27012
27015
|
init_SDKPermissionGuard();
|
|
27013
27016
|
init_SDKAccessDenied();
|
|
27014
27017
|
init_useSDKPermissions();
|