ahs-cti 0.0.2-beta.8 → 0.0.2

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.
Files changed (58) hide show
  1. package/README.md +425 -294
  2. package/dist/agentDetailReport-XSBMOUMW.mjs +12 -0
  3. package/dist/agentDetailReport-XSBMOUMW.mjs.map +1 -0
  4. package/dist/agentPerformanceReport-UT6QZWYD.mjs +533 -0
  5. package/dist/agentPerformanceReport-UT6QZWYD.mjs.map +1 -0
  6. package/dist/auditReport-R67BYA4Z.mjs +15 -0
  7. package/dist/auditReport-R67BYA4Z.mjs.map +1 -0
  8. package/dist/callHistory-PHGY224F.mjs +805 -0
  9. package/dist/callHistory-PHGY224F.mjs.map +1 -0
  10. package/dist/campaigns-JSMYHHDF.mjs +3049 -0
  11. package/dist/campaigns-JSMYHHDF.mjs.map +1 -0
  12. package/dist/caroQualityAuditDashboard-7X44HRZL.mjs +66 -0
  13. package/dist/caroQualityAuditDashboard-7X44HRZL.mjs.map +1 -0
  14. package/dist/caroVoiceAI-OZAB7LK4.mjs +21 -0
  15. package/dist/caroVoiceAI-OZAB7LK4.mjs.map +1 -0
  16. package/dist/cdrReport-44LN5VUX.mjs +819 -0
  17. package/dist/cdrReport-44LN5VUX.mjs.map +1 -0
  18. package/dist/chunk-6ICPXSN6.mjs +61 -0
  19. package/dist/chunk-6ICPXSN6.mjs.map +1 -0
  20. package/dist/chunk-CXULBAK6.mjs +493 -0
  21. package/dist/chunk-CXULBAK6.mjs.map +1 -0
  22. package/dist/chunk-FVXHNBYV.mjs +82 -0
  23. package/dist/chunk-FVXHNBYV.mjs.map +1 -0
  24. package/dist/chunk-G6KDIN5W.mjs +749 -0
  25. package/dist/chunk-G6KDIN5W.mjs.map +1 -0
  26. package/dist/chunk-GGACEO3I.mjs +180 -0
  27. package/dist/chunk-GGACEO3I.mjs.map +1 -0
  28. package/dist/chunk-HBR2JS4C.mjs +95 -0
  29. package/dist/chunk-HBR2JS4C.mjs.map +1 -0
  30. package/dist/chunk-HRM6S6J2.mjs +61 -0
  31. package/dist/chunk-HRM6S6J2.mjs.map +1 -0
  32. package/dist/chunk-JOZ4YQMR.mjs +116 -0
  33. package/dist/chunk-JOZ4YQMR.mjs.map +1 -0
  34. package/dist/chunk-O2XGWZLT.mjs +1060 -0
  35. package/dist/chunk-O2XGWZLT.mjs.map +1 -0
  36. package/dist/chunk-RZZQ42MG.mjs +115 -0
  37. package/dist/chunk-RZZQ42MG.mjs.map +1 -0
  38. package/dist/chunk-UZF5Q3GR.mjs +678 -0
  39. package/dist/chunk-UZF5Q3GR.mjs.map +1 -0
  40. package/dist/chunk-VQCHBU2Q.mjs +27 -0
  41. package/dist/chunk-VQCHBU2Q.mjs.map +1 -0
  42. package/dist/chunk-WWWM33FY.mjs +57 -0
  43. package/dist/chunk-WWWM33FY.mjs.map +1 -0
  44. package/dist/index.d.mts +795 -112
  45. package/dist/index.d.ts +796 -112
  46. package/dist/index.js +13690 -2103
  47. package/dist/index.js.map +1 -1
  48. package/dist/index.mjs +2335 -2250
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/liveStatus-AHKS4XLW.mjs +1077 -0
  51. package/dist/liveStatus-AHKS4XLW.mjs.map +1 -0
  52. package/dist/loginReport-7GBMZP55.mjs +828 -0
  53. package/dist/loginReport-7GBMZP55.mjs.map +1 -0
  54. package/dist/managementDashboard-TYON77NW.mjs +529 -0
  55. package/dist/managementDashboard-TYON77NW.mjs.map +1 -0
  56. package/dist/qualityAuditDashboard-AGJH5VVN.mjs +66 -0
  57. package/dist/qualityAuditDashboard-AGJH5VVN.mjs.map +1 -0
  58. package/package.json +16 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../call-control-sdk/lib/pages/loginReport/index.tsx","../call-control-sdk/lib/pages/loginReport/useLoginReport.ts"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Alert,\n Box,\n Chip,\n CircularProgress,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n Paper,\n Stack,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n TablePagination,\n TableSortLabel,\n Tooltip,\n Typography,\n} from \"@mui/material\";\nimport AppButton from \"../common/components/AppButton\";\n\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport ReportFilterBar, { type QuickRange } from \"../common/components/ReportFilterBar\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\n\nimport dayjs, { Dayjs } from \"dayjs\";\nimport isoWeek from \"dayjs/plugin/isoWeek\";\n\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\nimport {\n getLoginReport,\n getAgentLoginSessions,\n exportLoginReportToExcel,\n exportAgentLoginSessionsToExcel,\n getQueues,\n type Queue,\n} from \"./useLoginReport\";\nimport type { LoginReportParams, LoginAgentRowResponse, LoginSessionResponse } from \"./types\";\nimport { deepFindArray } from \"../../services/axios\";\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\nimport { headCellSx } from \"../common/utils/tableStyles\";\nimport PageHeader from \"../common/components/PageHeader\";\nimport SearchBar from \"../common/components/SearchBar\";\n\nimport { SDKProvider } from \"../../components/SDKProvider\";\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\n\ndayjs.extend(isoWeek);\n\ntype SortKey =\n | \"fullName\"\n | \"agentId\"\n | \"processNames\"\n | \"queueNames\"\n | \"numLogins\"\n | \"firstLoginTime\"\n | \"lastLogoutTime\"\n | \"workingDurationFormatted\"\n | \"breakDurationFormatted\"\n | \"loginDurationFormatted\"\n | \"utilisationPct\";\n\ntype SortDir = \"asc\" | \"desc\";\n\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\n\nconst COLORS = {\n navy: \"#0d2a56\",\n blue: \"#1565c8\",\n green: \"#0a9a62\",\n amber: \"#c47c00\",\n red: \"#cc2a2a\",\n purple: \"#6b3fbf\",\n bg: \"transparent\",\n surface: \"transparent\",\n} as const;\n\nconst DEFAULT_ROWS_PER_PAGE = 10;\n\nconst comparator = (a: LoginAgentRowResponse, b: LoginAgentRowResponse, key: SortKey): number => {\n const av = a[key];\n const bv = b[key];\n if (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\n return String(av ?? \"\").localeCompare(String(bv ?? \"\"));\n};\n\nfunction LoginReportContent() {\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\n const [activeQuickDate, setActiveQuickDate] = useState<\"today\" | \"week\" | \"month\" | null>(\"today\");\n const [searchText, setSearchText] = useState(\"\");\n\n const [selectedAgents, setSelectedAgents] = useState<AgentOption[]>([]);\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\n\n const [queues, setQueues] = useState<Queue[]>([]);\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\n\n const [reportData, setReportData] = useState<LoginAgentRowResponse[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const [page, setPage] = useState(0);\n const [rowsPerPage, setRowsPerPage] = useState(DEFAULT_ROWS_PER_PAGE);\n const [totalCount, setTotalCount] = useState(-1);\n const [sortKey, setSortKey] = useState<SortKey>(\"fullName\");\n const [sortDir, setSortDir] = useState<SortDir>(\"asc\");\n\n // Debounced search (sent to the server)\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n debounceRef.current = setTimeout(() => setDebouncedSearch(searchText.trim()), 400);\n return () => clearTimeout(debounceRef.current);\n }, [searchText]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedRow, setSelectedRow] = useState<LoginAgentRowResponse | null>(null);\n const [sessions, setSessions] = useState<LoginSessionResponse[]>([]);\n const [sessionsLoading, setSessionsLoading] = useState(false);\n\n useEffect(() => {\n getQueues().then((data) => setQueues(data || [])).catch(() => setError(\"Failed to load queues\"));\n }, []);\n\n const handleQuickRangeChange = (range: QuickRange) => { setActiveQuickDate(range || null); };\n\n const handleRefresh = () => {\n if (activeQuickDate) {\n const now = dayjs();\n let sd = now.startOf(\"day\");\n const ed = now;\n if (activeQuickDate === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\n else if (activeQuickDate === \"month\") sd = now.startOf(\"month\").startOf(\"day\");\n // Setting the dates re-triggers the auto-fetch effect below.\n setStartDate(sd);\n setEndDate(ed);\n } else {\n fetchReport(page);\n }\n };\n\n const fetchReport = useCallback(\n async (pageNum: number) => {\n const sd = startDate;\n const ed = endDate;\n\n if (!sd || !ed) {\n setError(\"Select a valid date range\");\n return;\n }\n\n const params: LoginReportParams = {\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\n agent_id: !isAllUsersSelected && selectedAgents.length > 0\n ? selectedAgents.map((a) => a.userId)\n : undefined,\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\n ? selectedQueues.map((q) => q.id)\n : undefined,\n search: debouncedSearch || undefined,\n page: pageNum + 1,\n pageSize: rowsPerPage,\n };\n\n try {\n setError(\"\");\n setLoading(true);\n const res = await getLoginReport(params);\n const agents = deepFindArray<LoginAgentRowResponse>(res, [\"agents\"]);\n setReportData(agents);\n // Real total from the response (falls back defensively to the summary count).\n const total =\n (res as any)?.total ??\n (res as any)?.pagination?.total ??\n res?.summary?.totalAgentsLoggedIn;\n setTotalCount(typeof total === \"number\" ? total : agents.length);\n } catch (err: any) {\n setError(err?.message || \"Failed to fetch login report\");\n setReportData([]);\n } finally {\n setLoading(false);\n }\n },\n [startDate, endDate, selectedAgents, isAllUsersSelected, selectedQueues, debouncedSearch, rowsPerPage],\n );\n\n useEffect(() => {\n setPage(0);\n fetchReport(0);\n }, [fetchReport]);\n\n const handlePageChange = useCallback(\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\n setPage(newPage);\n fetchReport(newPage);\n },\n [fetchReport],\n );\n\n // Sorting is applied client-side to the current page; search + paging are server-side.\n const filteredData = useMemo(() => {\n const rows = [...reportData];\n rows.sort((a, b) => {\n const cmp = comparator(a, b, sortKey);\n return sortDir === \"asc\" ? cmp : -cmp;\n });\n return rows;\n }, [reportData, sortKey, sortDir]);\n\n const paginatedData = filteredData;\n\n const handleSort = (key: SortKey) => {\n if (sortKey === key) {\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\n } else {\n setSortKey(key);\n setSortDir(\"asc\");\n }\n };\n\n const openDialog = async (row: LoginAgentRowResponse) => {\n setSelectedRow(row);\n setSessions([]);\n setDialogOpen(true);\n setSessionsLoading(true);\n try {\n const sd = startDate ?? dayjs();\n const ed = endDate ?? dayjs();\n const data = await getAgentLoginSessions(row.agentId, {\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\n });\n setSessions(data);\n } catch {\n setSessions([]);\n } finally {\n setSessionsLoading(false);\n }\n };\n\n const closeDialog = () => {\n setDialogOpen(false);\n setTimeout(() => {\n setSelectedRow(null);\n setSessions([]);\n }, 300);\n };\n\n const handleExportExcel = async () => {\n const sd = startDate ?? dayjs();\n const ed = endDate ?? dayjs();\n const params: LoginReportParams = {\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\n agent_id: !isAllUsersSelected && selectedAgents.length > 0\n ? selectedAgents.map((a) => a.userId)\n : undefined,\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\n ? selectedQueues.map((q) => q.id)\n : undefined,\n search: debouncedSearch || undefined,\n };\n try {\n await exportLoginReportToExcel(params);\n } catch (err: any) {\n setError(err?.message || \"Failed to export Excel\");\n }\n };\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box sx={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", fontFamily: FONT }}>\n <PageHeader\n title=\"Login Report\"\n actions={\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <SearchBar\n value={searchText}\n onChange={(val) => { setSearchText(val); setPage(0); }}\n placeholder=\"Search name, ID...\"\n width={250}\n />\n <SDKPermissionGuard\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE, SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_EXPORT]}\n showFallback={false}\n >\n <AppButton\n startIcon={<DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\n disabled={!reportData.length}\n onClick={handleExportExcel}\n sx={{ height: 36 }}\n >\n Export Excel\n </AppButton>\n </SDKPermissionGuard>\n </Stack>\n }\n />\n\n <Box sx={{ flex: 1, overflow: \"auto\", py: 0.8, px: 0 }}>\n <Box sx={{ mb: 0.8 }}>\n <ReportFilterBar\n startDate={startDate}\n endDate={endDate}\n onStartChange={setStartDate}\n onEndChange={setEndDate}\n quickRange={activeQuickDate || \"\"}\n onQuickRangeChange={handleQuickRangeChange}\n showAgentSelect\n selectedAgents={selectedAgents}\n onAgentsChange={setSelectedAgents}\n setIsAllUsersSelected={setIsAllUsersSelected}\n showQueueSelect\n queues={queues}\n selectedQueues={selectedQueues}\n onQueuesChange={setSelectedQueues}\n extra={\n <AppButton\n startIcon={<RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />}\n disabled={loading}\n onClick={handleRefresh}\n sx={{ height: 32 }}\n >\n Refresh\n </AppButton>\n }\n />\n\n {error && (\n <Alert severity=\"error\" sx={{ mt: 1, fontFamily: FONT, fontSize: \"0.78rem\" }}>\n {error}\n </Alert>\n )}\n </Box>\n\n {loading && (\n <Box sx={{ textAlign: \"center\", py: 2.5 }}>\n <CircularProgress sx={{ color: COLORS.blue }} size={28} />\n </Box>\n )}\n\n <Paper\n elevation={0}\n sx={{\n borderRadius: \"8px\",\n border: \"1px solid #e0e7ef\",\n overflow: \"hidden\",\n mb: 2,\n }}\n >\n <TableContainer>\n <Table\n size=\"small\"\n sx={{\n minWidth: 1100,\n fontFamily: FONT,\n \"& .MuiTableCell-root\": {\n fontFamily: FONT,\n fontSize: \"0.75rem\",\n borderBottom: \"1px solid #eef1f6\",\n py: 0.6,\n px: 1,\n },\n }}\n >\n <TableHead>\n <TableRow>\n {(\n [\n { id: \"fullName\" as SortKey, label: \"User Name\" },\n { id: \"agentId\" as SortKey, label: \"User ID\" },\n { id: \"queueNames\" as SortKey, label: \"Queues\" },\n { id: \"numLogins\" as SortKey, label: \"Logins\" },\n { id: \"firstLoginTime\" as SortKey, label: \"First Login\" },\n { id: \"lastLogoutTime\" as SortKey, label: \"Last Logout\" },\n { id: \"workingDurationFormatted\" as SortKey, label: \"Working Duration\" },\n { id: \"breakDurationFormatted\" as SortKey, label: \"Break Duration\" },\n { id: \"loginDurationFormatted\" as SortKey, label: \"Login Duration\" },\n { id: \"utilisationPct\" as SortKey, label: \"Utilisation %\" },\n ] as { id: SortKey; label: string }[]\n ).map((col) => (\n <TableCell key={col.id} sx={headCellSx}>\n <TableSortLabel\n active={sortKey === col.id}\n direction={sortKey === col.id ? sortDir : \"asc\"}\n onClick={() => handleSort(col.id)}\n sx={{\n \"&.MuiTableSortLabel-root\": { color: \"#333\" },\n \"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\n \"&.Mui-active\": { color: \"#333\" },\n \"& .MuiTableSortLabel-icon\": { color: \"#333 !important\" },\n }}\n >\n {col.label}\n </TableSortLabel>\n </TableCell>\n ))}\n </TableRow>\n </TableHead>\n\n <TableBody>\n {paginatedData.map((row, idx) => {\n const isLoggedIn = !row.lastLogoutTime;\n return (\n <TableRow\n key={`${row.agentId}-${idx}`}\n hover\n sx={{\n backgroundColor: \"#fff\",\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\n }}\n >\n <TableCell sx={{ fontWeight: 600, color: COLORS.navy, fontSize: \"0.75rem\" }}>\n {row.fullName || \"—\"}\n </TableCell>\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>{row.agentId || \"—\"}</TableCell>\n <TableCell>\n {row.queueNames ? (\n <Chip\n label={row.queueNames}\n size=\"small\"\n sx={{\n fontFamily: FONT,\n backgroundColor: \"#f0ebfa\",\n color: COLORS.purple,\n fontWeight: 500,\n fontSize: \"0.67rem\",\n height: 22,\n }}\n />\n ) : (\n \"—\"\n )}\n </TableCell>\n <TableCell sx={{ textAlign: \"center\" }}>\n <Chip\n label={row.numLogins}\n size=\"small\"\n onClick={(e) => { e.stopPropagation(); openDialog(row); }}\n sx={{\n fontFamily: FONT,\n backgroundColor: COLORS.navy,\n color: \"#fff\",\n fontWeight: 600,\n minWidth: 28,\n height: 20,\n fontSize: \"0.67rem\",\n cursor: \"pointer\",\n \"&:hover\": { backgroundColor: COLORS.blue },\n }}\n />\n </TableCell>\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\n {row.firstLoginTime\n ? dayjs(row.firstLoginTime).format(\"DD MMM YYYY hh:mm A\")\n : \"—\"}\n </TableCell>\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\n {isLoggedIn ? (\n <Chip\n label=\"LOGGED-IN\"\n size=\"small\"\n sx={{\n fontFamily: FONT,\n backgroundColor: COLORS.green,\n color: \"#fff\",\n fontWeight: 600,\n fontSize: \"0.65rem\",\n height: 20,\n }}\n />\n ) : (\n dayjs(row.lastLogoutTime).format(\"DD MMM YYYY hh:mm A\")\n )}\n </TableCell>\n <TableCell\n sx={{ fontWeight: 600, color: COLORS.blue, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}\n >\n {row.workingDurationFormatted || \"—\"}\n </TableCell>\n <TableCell\n sx={{ fontWeight: 500, color: COLORS.amber, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}\n >\n {row.breakDurationFormatted || \"—\"}\n </TableCell>\n <TableCell sx={{ fontWeight: 500, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>\n {row.loginDurationFormatted || \"—\"}\n </TableCell>\n <TableCell sx={{ minWidth: 120 }}>\n {row.utilisationPct != null ? (() => {\n const pct = Math.min(row.utilisationPct, 100);\n const barColor =\n pct >= 80 ? \"#10b981\" : pct >= 60 ? \"#f59e0b\" : \"#ef4444\";\n const bgTint =\n pct >= 80 ? \"#d1fae5\" : pct >= 60 ? \"#fef3c7\" : \"#fee2e2\";\n return (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}>\n <Box\n sx={{\n position: \"relative\",\n flex: 1,\n height: 7,\n borderRadius: 4,\n backgroundColor: bgTint,\n overflow: \"hidden\",\n }}\n >\n <Box\n sx={{\n width: `${pct}%`,\n height: \"100%\",\n borderRadius: 4,\n background: `linear-gradient(90deg, ${barColor}cc, ${barColor})`,\n transition: \"width 0.4s ease\",\n }}\n />\n </Box>\n <Chip\n label={`${Math.round(pct)}%`}\n size=\"small\"\n sx={{\n fontFamily: FONT,\n height: 18,\n minWidth: 38,\n fontSize: \"0.63rem\",\n fontWeight: 700,\n backgroundColor: bgTint,\n color: barColor,\n \"& .MuiChip-label\": { px: 0.6 },\n }}\n />\n </Box>\n );\n })() : (\n \"—\"\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </TableContainer>\n\n <TablePagination\n component=\"div\"\n count={totalCount}\n page={page}\n onPageChange={handlePageChange}\n rowsPerPage={rowsPerPage}\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\n onRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\n sx={{ borderTop: \"1px solid #eef1f6\", fontFamily: FONT, \"& .MuiTablePagination-displayedRows\": { fontFamily: FONT, fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontFamily: FONT, fontSize: \"0.73rem\" } }}\n />\n </Paper>\n\n <Dialog\n open={dialogOpen}\n onClose={(_e, reason) => { if (reason !== 'backdropClick') closeDialog(); }}\n maxWidth=\"md\"\n fullWidth\n PaperProps={{\n sx: {\n borderRadius: \"12px\",\n fontFamily: FONT,\n overflow: \"hidden\",\n boxShadow: \"0 8px 32px rgba(0,0,0,0.18)\",\n maxWidth: 450,\n },\n }}\n >\n <DialogTitle\n sx={{\n fontFamily: FONT,\n background: \"linear-gradient(135deg, var(--primary-color-dark, #14505b), var(--primary-color, #1A5F6C))\",\n color: \"#fff\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n py: 1.5,\n px: 2.5,\n }}\n >\n <Box>\n <Typography variant=\"h6\" sx={{ fontFamily: FONT, fontWeight: 700, fontSize: \"0.95rem\", letterSpacing: \"0.3px\" }}>\n Login Sessions\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{ fontFamily: FONT, opacity: 0.9, fontSize: \"0.76rem\", mt: 0.3 }}\n >\n {selectedRow?.fullName} &bull; {selectedRow?.numLogins} session{selectedRow?.numLogins !== 1 ? \"s\" : \"\"}\n </Typography>\n </Box>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\n <AppButton\n size=\"small\"\n startIcon={<DownloadIcon sx={{ fontSize: \"0.85rem !important\" }} />}\n onClick={async () => {\n if (!selectedRow) return;\n try {\n await exportAgentLoginSessionsToExcel(selectedRow.agentId, {\n start_date: (startDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: (endDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\n });\n } catch (err: any) {\n setError(err?.message || \"Failed to export Excel\");\n }\n }}\n sx={{ whiteSpace: \"nowrap\" }}\n >\n Export to Excel\n </AppButton>\n <IconButton\n onClick={closeDialog}\n size=\"small\"\n sx={{\n color: \"#fff\",\n backgroundColor: \"rgba(255,255,255,0.1)\",\n \"&:hover\": { backgroundColor: \"rgba(255,255,255,0.2)\" },\n }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </DialogTitle>\n\n <DialogContent sx={{ p: 0, backgroundColor: \"#f8fafb\" }}>\n {sessionsLoading ? (\n <Box sx={{ p: 4, textAlign: \"center\" }}>\n <CircularProgress size={28} sx={{ color: \"var(--primary-color, #1A5F6C)\" }} />\n </Box>\n ) : sessions.length > 0 ? (\n <Box sx={{ p: 1.5, maxHeight: 300, overflowY: \"auto\" }}>\n {Object.entries(\n sessions.reduce<Record<string, LoginSessionResponse[]>>((acc, s) => {\n const dateKey = s.loginTime\n ? dayjs(s.loginTime).format(\"DD MMM YYYY\")\n : \"Unknown Date\";\n if (!acc[dateKey]) acc[dateKey] = [];\n acc[dateKey].push(s);\n return acc;\n }, {})\n ).map(([date, dateSessions]) => (\n <Paper\n key={date}\n elevation={0}\n sx={{\n mb: 1.5,\n borderRadius: \"10px\",\n border: \"1px solid #e4eaf0\",\n overflow: \"hidden\",\n backgroundColor: \"#fff\",\n }}\n >\n <Box\n sx={{\n px: 1.5,\n py: 0.8,\n backgroundColor: \"#f0f5f4\",\n borderBottom: \"1px solid #e4eaf0\",\n }}\n >\n <Typography\n sx={{\n fontFamily: FONT,\n fontWeight: 700,\n fontSize: \"0.8rem\",\n color: \"var(--primary-color-dark, #14505b)\",\n letterSpacing: \"0.3px\",\n }}\n >\n {date}\n </Typography>\n </Box>\n <Box sx={{ px: 1.5, py: 1 }}>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n pb: 0.5,\n mb: 0.5,\n borderBottom: \"1px solid #e4eaf0\",\n }}\n >\n <Typography\n sx={{\n flex: 1,\n fontFamily: FONT,\n fontSize: \"0.72rem\",\n fontWeight: 700,\n color: \"#555\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.5px\",\n }}\n >\n Login\n </Typography>\n <Typography\n sx={{\n flex: 1,\n fontFamily: FONT,\n fontSize: \"0.72rem\",\n fontWeight: 700,\n color: \"#555\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.5px\",\n }}\n >\n Logout\n </Typography>\n </Box>\n {dateSessions.map((s, i) => (\n <Box\n key={i}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n py: 0.6,\n borderBottom: i < dateSessions.length - 1 ? \"1px dashed #e8ecf0\" : \"none\",\n }}\n >\n <Typography\n component=\"span\"\n sx={{\n flex: 1,\n fontFamily: FONT,\n fontSize: \"0.78rem\",\n fontWeight: 500,\n color: s.loginTime ? COLORS.green : \"#9e9e9e\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.4,\n }}\n >\n <span style={{ fontSize: \"0.9rem\" }}>{\"↙\"}</span>\n {s.loginTime ? dayjs(s.loginTime).format(\"DD MMM YYYY h:mm:ss A\") : \"Missing\"}\n </Typography>\n <Typography\n component=\"span\"\n sx={{\n flex: 1,\n fontFamily: FONT,\n fontSize: \"0.78rem\",\n fontWeight: 500,\n color: s.logoutTime ? COLORS.red : \"#9e9e9e\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.4,\n }}\n >\n <span style={{ fontSize: \"0.9rem\" }}>{\"↗\"}</span>\n {s.logoutTime ? dayjs(s.logoutTime).format(\"DD MMM YYYY h:mm:ss A\") : \"Missing\"}\n </Typography>\n </Box>\n ))}\n </Box>\n </Paper>\n ))}\n </Box>\n ) : (\n <Box sx={{ p: 4, textAlign: \"center\" }}>\n <Typography sx={{ fontFamily: FONT, color: \"#9e9e9e\", fontStyle: \"italic\", fontSize: \"0.82rem\" }}>\n No sessions found\n </Typography>\n </Box>\n )}\n </DialogContent>\n </Dialog>\n </Box>\n </Box>\n </LocalizationProvider>\n );\n}\n\nconst LoginReport: React.FC = () => (\n <SDKProvider>\n <LoginReportContent />\n </SDKProvider>\n);\n\nexport default LoginReport;\n","import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type {\r\n\tLoginAgentRowResponse,\r\n\tLoginReportParams,\r\n\tLoginReportResponse,\r\n\tLoginSessionResponse,\r\n} from \"./types\";\r\n\r\nexport interface Queue {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tprocessId?: number;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport async function fetchQueues(): Promise<Queue[]> {\r\n\tconst res = await axiosInstance.get(END_POINT.MASTER_QUEUES);\r\n\tif (Array.isArray(res.data)) return res.data;\r\n\tif (Array.isArray(res.data?.data)) return res.data.data;\r\n\treturn [];\r\n}\r\n\r\nexport async function getQueues(): Promise<Queue[]> {\r\n\treturn fetchQueues();\r\n}\r\n\r\nexport async function getLoginReportAgents(params: LoginReportParams): Promise<LoginAgentRowResponse[]> {\r\n\tconst qs = buildLoginReportQueryString(params);\r\n\tconst res = await axiosInstance.get<LoginAgentRowResponse[]>(`${END_POINT.LOGIN_REPORT_AGENTS}${qs}`);\r\n\treturn Array.isArray(res.data) ? res.data : [];\r\n}\r\n\r\n/**\r\n * Combined login report — returns summary + the current page of agent rows.\r\n * Used for server-side pagination (the combined endpoint honours page/pageSize/search).\r\n */\r\nexport async function getLoginReport(params: LoginReportParams): Promise<LoginReportResponse> {\r\n\tconst qs = buildLoginReportQueryString(params);\r\n\tconst res = await axiosInstance.get<LoginReportResponse>(`${END_POINT.LOGIN_REPORT}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\nexport async function getAgentLoginSessions(\r\n\tagentId: string,\r\n\tparams?: { start_date?: string; end_date?: string },\r\n): Promise<LoginSessionResponse[]> {\r\n\tconst qs = buildSessionQueryString(params);\r\n\tconst res = await axiosInstance.get<LoginSessionResponse[]>(\r\n\t\t`${END_POINT.LOGIN_REPORT_AGENT_SESSIONS(agentId)}${qs}`,\r\n\t);\r\n\treturn Array.isArray(res.data) ? res.data : [];\r\n}\r\n\r\nexport async function exportLoginReportToExcel(params: LoginReportParams): Promise<void> {\r\n\tconst qs = buildLoginReportQueryString(params);\r\n\tconst res = await axiosInstance.get(`${END_POINT.LOGIN_REPORT_EXPORT_EXCEL}${qs}`, { responseType: \"blob\" });\r\n\ttriggerBlobDownload(new Blob([res.data]), `login-report-${params.start_date ?? \"export\"}.xlsx`);\r\n}\r\n\r\nexport async function exportAgentLoginSessionsToExcel(\r\n\tagentId: string,\r\n\tparams?: { start_date?: string; end_date?: string },\r\n): Promise<void> {\r\n\tconst qs = buildSessionQueryString(params);\r\n\tconst res = await axiosInstance.get(\r\n\t\t`${END_POINT.LOGIN_REPORT_AGENT_SESSIONS_EXPORT_EXCEL(agentId)}${qs}`,\r\n\t\t{ responseType: \"blob\" },\r\n\t);\r\n\ttriggerBlobDownload(new Blob([res.data]), `login_sessions_${agentId}.xlsx`);\r\n}\r\n\r\nfunction buildLoginReportQueryString(params: LoginReportParams): string {\r\n\tconst qs = new URLSearchParams();\r\n\tif (params.start_date) qs.append(\"start_date\", params.start_date);\r\n\tif (params.end_date) qs.append(\"end_date\", params.end_date);\r\n\tif (params.agent_id) for (const id of params.agent_id) qs.append(\"agent_id\", id);\r\n\tif (params.queue_id) for (const id of params.queue_id) qs.append(\"queue_id\", String(id));\r\n\tif (params.process_id) for (const id of params.process_id) qs.append(\"process_id\", String(id));\r\n\tif (params.search) qs.append(\"search\", params.search);\r\n\tif (params.page) qs.append(\"page\", String(params.page));\r\n\tif (params.pageSize) qs.append(\"pageSize\", String(params.pageSize));\r\n\tconst str = qs.toString();\r\n\treturn str ? `?${str}` : \"\";\r\n}\r\n\r\nfunction buildSessionQueryString(params?: { start_date?: string; end_date?: string }): string {\r\n\tconst qs = new URLSearchParams();\r\n\tif (params?.start_date) qs.append(\"start_date\", params.start_date);\r\n\tif (params?.end_date) qs.append(\"end_date\", params.end_date);\r\n\tconst str = qs.toString();\r\n\treturn str ? `?${str}` : \"\";\r\n}\r\n\r\nfunction triggerBlobDownload(blob: Blob, filename: string): void {\r\n\tconst url = URL.createObjectURL(blob);\r\n\tconst a = document.createElement(\"a\");\r\n\ta.href = url;\r\n\ta.download = filename;\r\n\tdocument.body.appendChild(a);\r\n\ta.click();\r\n\ta.remove();\r\n\tURL.revokeObjectURL(url);\r\n}\r\n\r\nexport function useLoginReport() {\r\n\tconst [agents, setAgents] = useState<LoginAgentRowResponse[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchAgents = useCallback(async (params: LoginReportParams): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst qs = buildLoginReportQueryString(params);\r\n\t\t\tconst res = await axiosInstance.get<LoginAgentRowResponse[]>(\r\n\t\t\t\t`${END_POINT.LOGIN_REPORT_AGENTS}${qs}`,\r\n\t\t\t);\r\n\t\t\tsetAgents(Array.isArray(res.data) ? res.data : []);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetAgents([]);\r\n\t\t\tsetError(\r\n\t\t\t\terr?.response?.data?.message ||\r\n\t\t\t\t\terr?.response?.data?.detail ||\r\n\t\t\t\t\terr?.message ||\r\n\t\t\t\t\t\"Failed to fetch login report\",\r\n\t\t\t);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchSummary = useCallback(async (params: LoginReportParams): Promise<LoginReportResponse> => {\r\n\t\tconst qs = buildLoginReportQueryString(params);\r\n\t\tconst res = await axiosInstance.get<LoginReportResponse>(\r\n\t\t\t`${END_POINT.LOGIN_REPORT}${qs}`,\r\n\t\t);\r\n\t\treturn res.data;\r\n\t}, []);\r\n\r\n\tconst fetchAgentSessions = useCallback(\r\n\t\tasync (agentId: string, params?: { start_date?: string; end_date?: string }): Promise<LoginSessionResponse[]> => {\r\n\t\t\tconst qs = buildSessionQueryString(params);\r\n\t\t\tconst res = await axiosInstance.get<LoginSessionResponse[]>(\r\n\t\t\t\t`${END_POINT.LOGIN_REPORT_AGENT_SESSIONS(agentId)}${qs}`,\r\n\t\t\t);\r\n\t\t\treturn Array.isArray(res.data) ? res.data : [];\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\r\n\tconst exportReportExcel = useCallback(async (params: LoginReportParams): Promise<void> => {\r\n\t\tconst qs = buildLoginReportQueryString(params);\r\n\t\tconst res = await axiosInstance.get(\r\n\t\t\t`${END_POINT.LOGIN_REPORT_EXPORT_EXCEL}${qs}`,\r\n\t\t\t{ responseType: \"blob\" },\r\n\t\t);\r\n\t\ttriggerBlobDownload(new Blob([res.data]), `login-report-${params.start_date ?? \"export\"}.xlsx`);\r\n\t}, []);\r\n\r\n\tconst exportAgentSessionsExcel = useCallback(\r\n\t\tasync (agentId: string, params?: { start_date?: string; end_date?: string }): Promise<void> => {\r\n\t\t\tconst qs = buildSessionQueryString(params);\r\n\t\t\tconst res = await axiosInstance.get(\r\n\t\t\t\t`${END_POINT.LOGIN_REPORT_AGENT_SESSIONS_EXPORT_EXCEL(agentId)}${qs}`,\r\n\t\t\t\t{ responseType: \"blob\" },\r\n\t\t\t);\r\n\t\t\ttriggerBlobDownload(new Blob([res.data]), `login_sessions_${agentId}.xlsx`);\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\r\n\treturn {\r\n\t\tagents,\r\n\t\tloading,\r\n\t\terror,\r\n\t\tsetError,\r\n\t\tfetchAgents,\r\n\t\tfetchSummary,\r\n\t\tfetchAgentSessions,\r\n\t\texportReportExcel,\r\n\t\texportAgentSessionsExcel,\r\n\t};\r\n}\r\n"],"mappings":"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","names":["useCallback","useState","useState","useCallback"]}