ahs-cti 0.0.8 → 0.0.9

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 (139) hide show
  1. package/dist/agentDetailReport-F44HMQ5O.mjs +27 -0
  2. package/dist/agentDetailReport-F44HMQ5O.mjs.map +1 -0
  3. package/dist/{agentPerformanceReport-JZK5DN5E.mjs → agentPerformanceReport-TTOMNENK.mjs} +25 -15
  4. package/dist/{agentPerformanceReport-JZK5DN5E.mjs.map → agentPerformanceReport-TTOMNENK.mjs.map} +1 -1
  5. package/dist/auditReport-QTMAKVTN.mjs +26 -0
  6. package/dist/auditReport-QTMAKVTN.mjs.map +1 -0
  7. package/dist/{callHistory-T3M76D4B.mjs → callHistory-4J4J2XHA.mjs} +20 -10
  8. package/dist/{callHistory-T3M76D4B.mjs.map → callHistory-4J4J2XHA.mjs.map} +1 -1
  9. package/dist/{campaigns-5PVHXBSD.mjs → campaigns-N3UNUGQP.mjs} +23 -13
  10. package/dist/{campaigns-5PVHXBSD.mjs.map → campaigns-N3UNUGQP.mjs.map} +1 -1
  11. package/dist/{caroQualityAuditDashboard-EUDYZ3QY.mjs → caroQualityAuditDashboard-TNS4L2NR.mjs} +12 -2
  12. package/dist/{caroQualityAuditDashboard-EUDYZ3QY.mjs.map → caroQualityAuditDashboard-TNS4L2NR.mjs.map} +1 -1
  13. package/dist/{caroVoiceAI-GGJCVUIQ.mjs → caroVoiceAI-OUTAAIFE.mjs} +12 -2
  14. package/dist/{caroVoiceAI-GGJCVUIQ.mjs.map → caroVoiceAI-OUTAAIFE.mjs.map} +1 -1
  15. package/dist/{cdrReport-ZMDHSZUW.mjs → cdrReport-Z35OLYUL.mjs} +26 -16
  16. package/dist/{cdrReport-ZMDHSZUW.mjs.map → cdrReport-Z35OLYUL.mjs.map} +1 -1
  17. package/dist/chunk-3PNP6G5P.mjs +92 -0
  18. package/dist/chunk-3PNP6G5P.mjs.map +1 -0
  19. package/dist/{chunk-DF5EFKXC.mjs → chunk-45MLTWV7.mjs} +12 -2
  20. package/dist/{chunk-DF5EFKXC.mjs.map → chunk-45MLTWV7.mjs.map} +1 -1
  21. package/dist/chunk-635IIVZE.mjs +24 -0
  22. package/dist/{chunk-FRKV2U3I.mjs.map → chunk-635IIVZE.mjs.map} +1 -1
  23. package/dist/chunk-677RFPP5.mjs +24 -0
  24. package/dist/{chunk-7LE2VTAI.mjs.map → chunk-677RFPP5.mjs.map} +1 -1
  25. package/dist/{chunk-Q6G3MPS7.mjs → chunk-ERSNXW5X.mjs} +11 -1
  26. package/dist/{chunk-Q6G3MPS7.mjs.map → chunk-ERSNXW5X.mjs.map} +1 -1
  27. package/dist/{chunk-H7GRWLYI.mjs → chunk-G6KRLGGC.mjs} +13 -3
  28. package/dist/{chunk-H7GRWLYI.mjs.map → chunk-G6KRLGGC.mjs.map} +1 -1
  29. package/dist/chunk-GFVR3HLK.mjs +24 -0
  30. package/dist/{chunk-6WLG2PXL.mjs.map → chunk-GFVR3HLK.mjs.map} +1 -1
  31. package/dist/{chunk-E6KYWWAI.mjs → chunk-GTI2ZVQX.mjs} +12 -2
  32. package/dist/{chunk-E6KYWWAI.mjs.map → chunk-GTI2ZVQX.mjs.map} +1 -1
  33. package/dist/chunk-H22TUCN3.mjs +24 -0
  34. package/dist/{chunk-AOJRUZTO.mjs.map → chunk-H22TUCN3.mjs.map} +1 -1
  35. package/dist/{chunk-YAQYTUTX.mjs → chunk-HAOFUADN.mjs} +12 -2
  36. package/dist/{chunk-YAQYTUTX.mjs.map → chunk-HAOFUADN.mjs.map} +1 -1
  37. package/dist/{chunk-33QNSXP7.mjs → chunk-JHC7OUQG.mjs} +21 -11
  38. package/dist/chunk-JHC7OUQG.mjs.map +1 -0
  39. package/dist/chunk-KSVNZKRD.mjs +10930 -0
  40. package/dist/chunk-KSVNZKRD.mjs.map +1 -0
  41. package/dist/{chunk-VVDJLUYT.mjs → chunk-M7FJYZF6.mjs} +12 -2
  42. package/dist/{chunk-VVDJLUYT.mjs.map → chunk-M7FJYZF6.mjs.map} +1 -1
  43. package/dist/{chunk-DNTGBNZD.mjs → chunk-NDZDJWXY.mjs} +13 -3
  44. package/dist/{chunk-DNTGBNZD.mjs.map → chunk-NDZDJWXY.mjs.map} +1 -1
  45. package/dist/chunk-S2SMCH2C.mjs +71 -0
  46. package/dist/chunk-S2SMCH2C.mjs.map +1 -0
  47. package/dist/{chunk-IDZWA6HG.mjs → chunk-S34CQVTF.mjs} +14 -4
  48. package/dist/{chunk-IDZWA6HG.mjs.map → chunk-S34CQVTF.mjs.map} +1 -1
  49. package/dist/{chunk-2M3YEXYA.mjs → chunk-SUS5RUCA.mjs} +17 -7
  50. package/dist/{chunk-2M3YEXYA.mjs.map → chunk-SUS5RUCA.mjs.map} +1 -1
  51. package/dist/{chunk-3J7KQNEU.mjs → chunk-TCYBXDAP.mjs} +13 -3
  52. package/dist/{chunk-3J7KQNEU.mjs.map → chunk-TCYBXDAP.mjs.map} +1 -1
  53. package/dist/chunk-VII5JNA6.mjs +24 -0
  54. package/dist/{chunk-WTBVFN4H.mjs.map → chunk-VII5JNA6.mjs.map} +1 -1
  55. package/dist/chunk-W3ECDLUB.mjs +24 -0
  56. package/dist/{chunk-OHJIW3I3.mjs.map → chunk-W3ECDLUB.mjs.map} +1 -1
  57. package/dist/{chunk-VBIDPX5Z.mjs → chunk-Y4PAUTZ4.mjs} +13 -3
  58. package/dist/{chunk-VBIDPX5Z.mjs.map → chunk-Y4PAUTZ4.mjs.map} +1 -1
  59. package/dist/{chunk-NAZO4HKB.mjs → chunk-ZSRD3ZXF.mjs} +12 -2
  60. package/dist/{chunk-NAZO4HKB.mjs.map → chunk-ZSRD3ZXF.mjs.map} +1 -1
  61. package/dist/index.mjs +33 -23
  62. package/dist/index.mjs.map +1 -1
  63. package/dist/{liveStatus-YSBYSVOO.mjs → liveStatus-PRDEL7CK.mjs} +16 -6
  64. package/dist/{liveStatus-YSBYSVOO.mjs.map → liveStatus-PRDEL7CK.mjs.map} +1 -1
  65. package/dist/{loginReport-YIVBJVJD.mjs → loginReport-47QNACQU.mjs} +22 -12
  66. package/dist/{loginReport-YIVBJVJD.mjs.map → loginReport-47QNACQU.mjs.map} +1 -1
  67. package/dist/{managementDashboard-7EMQC2UA.mjs → managementDashboard-SZFYULKA.mjs} +22 -12
  68. package/dist/{managementDashboard-7EMQC2UA.mjs.map → managementDashboard-SZFYULKA.mjs.map} +1 -1
  69. package/dist/{qualityAuditDashboard-ENGQN2WQ.mjs → qualityAuditDashboard-FHRGB77R.mjs} +12 -2
  70. package/dist/{qualityAuditDashboard-ENGQN2WQ.mjs.map → qualityAuditDashboard-FHRGB77R.mjs.map} +1 -1
  71. package/dist-react/agentDetailReport-PDKQKJNL.mjs +23 -0
  72. package/dist-react/agentPerformanceReport-MU2FASNN.mjs +544 -0
  73. package/dist-react/agentPerformanceReport-MU2FASNN.mjs.map +1 -0
  74. package/dist-react/auditReport-WH2KDNYT.mjs +25 -0
  75. package/{dist/auditReport-6ZUJ4UFO.mjs.map → dist-react/auditReport-WH2KDNYT.mjs.map} +1 -1
  76. package/dist-react/callHistory-HXXRYUIV.mjs +832 -0
  77. package/dist-react/callHistory-HXXRYUIV.mjs.map +1 -0
  78. package/dist-react/campaigns-J7KIAATE.mjs +3139 -0
  79. package/dist-react/campaigns-J7KIAATE.mjs.map +1 -0
  80. package/dist-react/caroQualityAuditDashboard-THYPVOCP.mjs +76 -0
  81. package/dist-react/caroQualityAuditDashboard-THYPVOCP.mjs.map +1 -0
  82. package/dist-react/caroVoiceAI-XGDUETXI.mjs +31 -0
  83. package/dist-react/caroVoiceAI-XGDUETXI.mjs.map +1 -0
  84. package/dist-react/cdrReport-SX2FZAO6.mjs +858 -0
  85. package/dist-react/cdrReport-SX2FZAO6.mjs.map +1 -0
  86. package/dist-react/chunk-4YF4IDV6.mjs +72 -0
  87. package/dist-react/chunk-4YF4IDV6.mjs.map +1 -0
  88. package/dist-react/chunk-ADM2JJCP.mjs +190 -0
  89. package/dist-react/chunk-ADM2JJCP.mjs.map +1 -0
  90. package/dist-react/chunk-EN7HM2MD.mjs +688 -0
  91. package/dist-react/chunk-EN7HM2MD.mjs.map +1 -0
  92. package/{dist/chunk-LHE4QGJJ.mjs → dist-react/chunk-F7G2XFRU.mjs} +12 -2
  93. package/{dist/chunk-LHE4QGJJ.mjs.map → dist-react/chunk-F7G2XFRU.mjs.map} +1 -1
  94. package/{dist/chunk-DJP744FF.mjs → dist-react/chunk-GUMGXVIT.mjs} +12 -2
  95. package/{dist/chunk-DJP744FF.mjs.map → dist-react/chunk-GUMGXVIT.mjs.map} +1 -1
  96. package/dist-react/chunk-KRXHK4AU.mjs +127 -0
  97. package/dist-react/chunk-KRXHK4AU.mjs.map +1 -0
  98. package/{dist/chunk-U2UDKXMB.mjs → dist-react/chunk-LWDAC6QU.mjs} +12 -2
  99. package/{dist/chunk-U2UDKXMB.mjs.map → dist-react/chunk-LWDAC6QU.mjs.map} +1 -1
  100. package/dist-react/chunk-LX6I32Y4.mjs +106 -0
  101. package/dist-react/chunk-LX6I32Y4.mjs.map +1 -0
  102. package/dist-react/chunk-MCD5FQNY.mjs +428 -0
  103. package/dist-react/chunk-MCD5FQNY.mjs.map +1 -0
  104. package/dist-react/chunk-MD472UKG.mjs +757 -0
  105. package/{dist/chunk-33QNSXP7.mjs.map → dist-react/chunk-MD472UKG.mjs.map} +1 -1
  106. package/dist-react/chunk-ORNNWQI6.mjs +67 -0
  107. package/dist-react/chunk-ORNNWQI6.mjs.map +1 -0
  108. package/dist-react/chunk-S4J35V4B.mjs +126 -0
  109. package/dist-react/chunk-S4J35V4B.mjs.map +1 -0
  110. package/dist-react/chunk-T53WMN5A.mjs +126 -0
  111. package/dist-react/chunk-T53WMN5A.mjs.map +1 -0
  112. package/dist-react/chunk-UTSRABCL.mjs +96 -0
  113. package/dist-react/chunk-UTSRABCL.mjs.map +1 -0
  114. package/dist-react/incoming-4WP3FJI4.mp3 +0 -0
  115. package/dist-react/incoming.mp3 +0 -0
  116. package/dist-react/index.d.mts +2476 -0
  117. package/dist-react/index.d.ts +2477 -0
  118. package/dist-react/index.js +26713 -0
  119. package/dist-react/index.js.map +1 -0
  120. package/dist-react/index.mjs +4675 -0
  121. package/dist-react/index.mjs.map +1 -0
  122. package/dist-react/liveStatus-IDZ7CPYK.mjs +1087 -0
  123. package/dist-react/liveStatus-IDZ7CPYK.mjs.map +1 -0
  124. package/dist-react/loginReport-F47GUU53.mjs +990 -0
  125. package/dist-react/loginReport-F47GUU53.mjs.map +1 -0
  126. package/dist-react/managementDashboard-GC5E7NEL.mjs +540 -0
  127. package/dist-react/managementDashboard-GC5E7NEL.mjs.map +1 -0
  128. package/dist-react/qualityAuditDashboard-ZAM7HRNH.mjs +76 -0
  129. package/dist-react/qualityAuditDashboard-ZAM7HRNH.mjs.map +1 -0
  130. package/package.json +17 -2
  131. package/dist/agentDetailReport-ZR7U2LLB.mjs +0 -17
  132. package/dist/auditReport-6ZUJ4UFO.mjs +0 -16
  133. package/dist/chunk-6WLG2PXL.mjs +0 -14
  134. package/dist/chunk-7LE2VTAI.mjs +0 -14
  135. package/dist/chunk-AOJRUZTO.mjs +0 -14
  136. package/dist/chunk-FRKV2U3I.mjs +0 -14
  137. package/dist/chunk-OHJIW3I3.mjs +0 -14
  138. package/dist/chunk-WTBVFN4H.mjs +0 -14
  139. /package/{dist/agentDetailReport-ZR7U2LLB.mjs.map → dist-react/agentDetailReport-PDKQKJNL.mjs.map} +0 -0
@@ -1,42 +1,52 @@
1
+ import * as __ext_react from "react";
2
+ import * as __ext_react_dom from "react-dom";
3
+ import * as __ext_react_jsx from "react/jsx-runtime";
4
+ var __cjsExternals = { "react": __ext_react, "react-dom": __ext_react_dom, "react/jsx-runtime": __ext_react_jsx };
5
+ var require = function (id) {
6
+ var mod = __cjsExternals[id];
7
+ if (mod) return mod.default || mod;
8
+ throw new Error('Dynamic require of "' + id + '" is not supported');
9
+ };
10
+
1
11
  import {
2
12
  Download_default
3
- } from "./chunk-FRKV2U3I.mjs";
13
+ } from "./chunk-635IIVZE.mjs";
4
14
  import {
5
15
  ReportFilterBar,
6
16
  SearchBar,
7
17
  headCellSx,
8
18
  require_isoWeek
9
- } from "./chunk-2M3YEXYA.mjs";
19
+ } from "./chunk-SUS5RUCA.mjs";
10
20
  import {
11
21
  SDKPermissionGuard
12
- } from "./chunk-3J7KQNEU.mjs";
22
+ } from "./chunk-TCYBXDAP.mjs";
13
23
  import {
14
24
  Close_default
15
- } from "./chunk-WTBVFN4H.mjs";
25
+ } from "./chunk-VII5JNA6.mjs";
16
26
  import {
17
27
  PageHeader
18
- } from "./chunk-VBIDPX5Z.mjs";
28
+ } from "./chunk-Y4PAUTZ4.mjs";
19
29
  import {
20
30
  AppButton
21
- } from "./chunk-NAZO4HKB.mjs";
31
+ } from "./chunk-ZSRD3ZXF.mjs";
22
32
  import {
23
33
  AdapterDayjs,
24
34
  DateTimePicker,
25
35
  LocalizationProvider,
26
36
  require_dayjs_min
27
- } from "./chunk-E6KYWWAI.mjs";
37
+ } from "./chunk-GTI2ZVQX.mjs";
28
38
  import {
29
39
  Refresh_default
30
- } from "./chunk-YAQYTUTX.mjs";
40
+ } from "./chunk-HAOFUADN.mjs";
31
41
  import {
32
42
  SDKProvider
33
- } from "./chunk-VVDJLUYT.mjs";
43
+ } from "./chunk-M7FJYZF6.mjs";
34
44
  import {
35
45
  END_POINT,
36
46
  SDK_PERMISSIONS,
37
47
  axios_default,
38
48
  deepFindArray
39
- } from "./chunk-LHE4QGJJ.mjs";
49
+ } from "./chunk-KSVNZKRD.mjs";
40
50
  import {
41
51
  Alert_default,
42
52
  Box_default,
@@ -60,7 +70,7 @@ import {
60
70
  Typography_default,
61
71
  __toESM,
62
72
  createSvgIcon
63
- } from "./chunk-Q6G3MPS7.mjs";
73
+ } from "./chunk-ERSNXW5X.mjs";
64
74
 
65
75
  // call-control-sdk/lib/pages/loginReport/index.tsx
66
76
  import { useCallback as useCallback2, useEffect, useMemo, useRef, useState as useState2 } from "react";
@@ -999,4 +1009,4 @@ var loginReport_default = LoginReport;
999
1009
  export {
1000
1010
  loginReport_default as default
1001
1011
  };
1002
- //# sourceMappingURL=loginReport-YIVBJVJD.mjs.map
1012
+ //# sourceMappingURL=loginReport-47QNACQU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../call-control-sdk/lib/pages/loginReport/index.tsx","../node_modules/@mui/icons-material/Check.mjs","../node_modules/@mui/icons-material/EditCalendar.mjs","../call-control-sdk/lib/pages/loginReport/useLoginReport.ts"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport {\r\n Alert,\r\n Box,\r\n Chip,\r\n CircularProgress,\r\n Dialog,\r\n DialogContent,\r\n DialogTitle,\r\n IconButton,\r\n Paper,\r\n Stack,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n TablePagination,\r\n TableSortLabel,\r\n Tooltip,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport CheckIcon from \"@mui/icons-material/Check\";\r\nimport EditCalendarIcon from \"@mui/icons-material/EditCalendar\";\r\nimport ReportFilterBar, { type QuickRange } from \"../common/components/ReportFilterBar\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\n\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\n\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport { DateTimePicker } from \"@mui/x-date-pickers/DateTimePicker\";\r\nimport {\r\n getLoginReport,\r\n getAgentLoginSessions,\r\n exportLoginReportToExcel,\r\n exportAgentLoginSessionsToExcel,\r\n regularizeLoginSession,\r\n getQueues,\r\n type Queue,\r\n} from \"./useLoginReport\";\r\nimport type { LoginReportParams, LoginAgentRowResponse, LoginSessionResponse } from \"./types\";\r\nimport { deepFindArray } from \"../../services/axios\";\r\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\r\nimport { headCellSx } from \"../common/utils/tableStyles\";\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport SearchBar from \"../common/components/SearchBar\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\n\r\ndayjs.extend(isoWeek);\r\n\r\ntype SortKey =\r\n | \"fullName\"\r\n | \"agentId\"\r\n | \"processNames\"\r\n | \"queueNames\"\r\n | \"numLogins\"\r\n | \"firstLoginTime\"\r\n | \"lastLogoutTime\"\r\n | \"workingDurationFormatted\"\r\n | \"breakDurationFormatted\"\r\n | \"loginDurationFormatted\"\r\n | \"utilisationPct\";\r\n\r\ntype SortDir = \"asc\" | \"desc\";\r\n\r\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n\r\nconst COLORS = {\r\n navy: \"#0d2a56\",\r\n blue: \"#1565c8\",\r\n green: \"#0a9a62\",\r\n amber: \"#c47c00\",\r\n red: \"#cc2a2a\",\r\n purple: \"#6b3fbf\",\r\n bg: \"transparent\",\r\n surface: \"transparent\",\r\n} as const;\r\n\r\nconst DEFAULT_ROWS_PER_PAGE = 10;\r\n\r\nconst comparator = (a: LoginAgentRowResponse, b: LoginAgentRowResponse, key: SortKey): number => {\r\n const av = a[key];\r\n const bv = b[key];\r\n if (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\r\n return String(av ?? \"\").localeCompare(String(bv ?? \"\"));\r\n};\r\n\r\nfunction LoginReportContent() {\r\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [activeQuickDate, setActiveQuickDate] = useState<\"today\" | \"week\" | \"month\" | null>(\"today\");\r\n const [searchText, setSearchText] = useState(\"\");\r\n\r\n const [selectedAgents, setSelectedAgents] = useState<AgentOption[]>([]);\r\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\r\n\r\n const [queues, setQueues] = useState<Queue[]>([]);\r\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\r\n\r\n const [reportData, setReportData] = useState<LoginAgentRowResponse[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n\r\n const [page, setPage] = useState(0);\r\n const [rowsPerPage, setRowsPerPage] = useState(DEFAULT_ROWS_PER_PAGE);\r\n const [totalCount, setTotalCount] = useState(-1);\r\n const [sortKey, setSortKey] = useState<SortKey>(\"fullName\");\r\n const [sortDir, setSortDir] = useState<SortDir>(\"asc\");\r\n\r\n // Debounced search (sent to the server)\r\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n debounceRef.current = setTimeout(() => setDebouncedSearch(searchText.trim()), 400);\r\n return () => clearTimeout(debounceRef.current);\r\n }, [searchText]);\r\n\r\n const [dialogOpen, setDialogOpen] = useState(false);\r\n const [selectedRow, setSelectedRow] = useState<LoginAgentRowResponse | null>(null);\r\n const [sessions, setSessions] = useState<LoginSessionResponse[]>([]);\r\n const [sessionsLoading, setSessionsLoading] = useState(false);\r\n\r\n /* ----- regularize (close stuck session) state ----- */\r\n const [regularizeSessionId, setRegularizeSessionId] = useState<number | null>(null);\r\n const [regularizeTime, setRegularizeTime] = useState<Dayjs | null>(null);\r\n const [regularizing, setRegularizing] = useState(false);\r\n const [regularizeError, setRegularizeError] = useState(\"\");\r\n\r\n useEffect(() => {\r\n getQueues().then((data) => setQueues(data || [])).catch(() => setError(\"Failed to load queues\"));\r\n }, []);\r\n\r\n const handleQuickRangeChange = (range: QuickRange) => { setActiveQuickDate(range || null); };\r\n\r\n const handleRefresh = () => {\r\n if (activeQuickDate) {\r\n const now = dayjs();\r\n let sd = now.startOf(\"day\");\r\n const ed = now;\r\n if (activeQuickDate === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\r\n else if (activeQuickDate === \"month\") sd = now.startOf(\"month\").startOf(\"day\");\r\n // Setting the dates re-triggers the auto-fetch effect below.\r\n setStartDate(sd);\r\n setEndDate(ed);\r\n } else {\r\n fetchReport(page);\r\n }\r\n };\r\n\r\n const fetchReport = useCallback(\r\n async (pageNum: number) => {\r\n const sd = startDate;\r\n const ed = endDate;\r\n\r\n if (!sd || !ed) {\r\n setError(\"Select a valid date range\");\r\n return;\r\n }\r\n\r\n const params: LoginReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id: !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.userId)\r\n : undefined,\r\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n search: debouncedSearch || undefined,\r\n page: pageNum + 1,\r\n pageSize: rowsPerPage,\r\n };\r\n\r\n try {\r\n setError(\"\");\r\n setLoading(true);\r\n const res = await getLoginReport(params);\r\n const agents = deepFindArray<LoginAgentRowResponse>(res, [\"agents\"]);\r\n setReportData(agents);\r\n // Real total from the response (falls back defensively to the summary count).\r\n const total =\r\n (res as any)?.total ??\r\n (res as any)?.pagination?.total ??\r\n res?.summary?.totalAgentsLoggedIn;\r\n setTotalCount(typeof total === \"number\" ? total : agents.length);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to fetch login report\");\r\n setReportData([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [startDate, endDate, selectedAgents, isAllUsersSelected, selectedQueues, debouncedSearch, rowsPerPage],\r\n );\r\n\r\n useEffect(() => {\r\n setPage(0);\r\n fetchReport(0);\r\n }, [fetchReport]);\r\n\r\n const handlePageChange = useCallback(\r\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n setPage(newPage);\r\n fetchReport(newPage);\r\n },\r\n [fetchReport],\r\n );\r\n\r\n // Sorting is applied client-side to the current page; search + paging are server-side.\r\n const filteredData = useMemo(() => {\r\n const rows = [...reportData];\r\n rows.sort((a, b) => {\r\n const cmp = comparator(a, b, sortKey);\r\n return sortDir === \"asc\" ? cmp : -cmp;\r\n });\r\n return rows;\r\n }, [reportData, sortKey, sortDir]);\r\n\r\n const paginatedData = filteredData;\r\n\r\n const handleSort = (key: SortKey) => {\r\n if (sortKey === key) {\r\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n } else {\r\n setSortKey(key);\r\n setSortDir(\"asc\");\r\n }\r\n };\r\n\r\n const loadSessions = useCallback(async (agentId: string) => {\r\n setSessionsLoading(true);\r\n try {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n const data = await getAgentLoginSessions(agentId, {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n });\r\n setSessions(data);\r\n } catch {\r\n setSessions([]);\r\n } finally {\r\n setSessionsLoading(false);\r\n }\r\n }, [startDate, endDate]);\r\n\r\n const openDialog = async (row: LoginAgentRowResponse) => {\r\n setSelectedRow(row);\r\n setSessions([]);\r\n setRegularizeSessionId(null);\r\n setRegularizeError(\"\");\r\n setDialogOpen(true);\r\n await loadSessions(row.agentId);\r\n };\r\n\r\n const closeDialog = () => {\r\n setDialogOpen(false);\r\n setTimeout(() => {\r\n setSelectedRow(null);\r\n setSessions([]);\r\n setRegularizeSessionId(null);\r\n setRegularizeError(\"\");\r\n }, 300);\r\n };\r\n\r\n /* ================= REGULARIZE (close stuck session) ================= */\r\n\r\n const startRegularize = (session: LoginSessionResponse) => {\r\n if (session.sessionId == null) return;\r\n setRegularizeError(\"\");\r\n setRegularizeSessionId(session.sessionId);\r\n // Default the logout time to now (supervisor can edit before saving).\r\n setRegularizeTime(dayjs());\r\n };\r\n\r\n const cancelRegularize = () => {\r\n setRegularizeSessionId(null);\r\n setRegularizeTime(null);\r\n setRegularizeError(\"\");\r\n };\r\n\r\n const saveRegularize = async () => {\r\n if (regularizeSessionId == null || !regularizeTime || !regularizeTime.isValid()) {\r\n setRegularizeError(\"Select a valid logout time\");\r\n return;\r\n }\r\n try {\r\n setRegularizing(true);\r\n setRegularizeError(\"\");\r\n await regularizeLoginSession(regularizeSessionId, regularizeTime.toISOString());\r\n cancelRegularize();\r\n // Refresh the session list and the underlying report so the row reflects the change.\r\n if (selectedRow) await loadSessions(selectedRow.agentId);\r\n fetchReport(page);\r\n } catch (err: any) {\r\n setRegularizeError(err?.message || \"Failed to regularize login session\");\r\n } finally {\r\n setRegularizing(false);\r\n }\r\n };\r\n\r\n const handleExportExcel = async () => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n const params: LoginReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id: !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.userId)\r\n : undefined,\r\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n search: debouncedSearch || undefined,\r\n };\r\n try {\r\n await exportLoginReportToExcel(params);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n };\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", fontFamily: FONT }}>\r\n <PageHeader\r\n title=\"Login Report\"\r\n actions={\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n <SearchBar\r\n value={searchText}\r\n onChange={(val) => { setSearchText(val); setPage(0); }}\r\n placeholder=\"Search name, ID...\"\r\n width={250}\r\n />\r\n <SDKPermissionGuard\r\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE, SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_EXPORT]}\r\n showFallback={false}\r\n >\r\n <AppButton\r\n startIcon={<DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n disabled={!reportData.length}\r\n onClick={handleExportExcel}\r\n sx={{ height: 36 }}\r\n >\r\n Export Excel\r\n </AppButton>\r\n </SDKPermissionGuard>\r\n </Stack>\r\n }\r\n />\r\n\r\n <Box sx={{ flex: 1, overflow: \"auto\", py: 0.8, px: 0 }}>\r\n <Box sx={{ mb: 0.8 }}>\r\n <ReportFilterBar\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n quickRange={activeQuickDate || \"\"}\r\n onQuickRangeChange={handleQuickRangeChange}\r\n showAgentSelect\r\n selectedAgents={selectedAgents}\r\n onAgentsChange={setSelectedAgents}\r\n setIsAllUsersSelected={setIsAllUsersSelected}\r\n showQueueSelect\r\n queues={queues}\r\n selectedQueues={selectedQueues}\r\n onQueuesChange={setSelectedQueues}\r\n extra={\r\n <AppButton\r\n startIcon={<RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />}\r\n disabled={loading}\r\n onClick={handleRefresh}\r\n sx={{ height: 32 }}\r\n >\r\n Refresh\r\n </AppButton>\r\n }\r\n />\r\n\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mt: 1, fontFamily: FONT, fontSize: \"0.78rem\" }}>\r\n {error}\r\n </Alert>\r\n )}\r\n </Box>\r\n\r\n {loading && (\r\n <Box sx={{ textAlign: \"center\", py: 2.5 }}>\r\n <CircularProgress sx={{ color: COLORS.blue }} size={28} />\r\n </Box>\r\n )}\r\n\r\n <Paper\r\n elevation={0}\r\n sx={{\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e0e7ef\",\r\n overflow: \"hidden\",\r\n mb: 2,\r\n }}\r\n >\r\n <TableContainer>\r\n <Table\r\n size=\"small\"\r\n sx={{\r\n minWidth: 1100,\r\n fontFamily: FONT,\r\n \"& .MuiTableCell-root\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.75rem\",\r\n borderBottom: \"1px solid #eef1f6\",\r\n py: 0.6,\r\n px: 1,\r\n },\r\n }}\r\n >\r\n <TableHead>\r\n <TableRow>\r\n {(\r\n [\r\n { id: \"fullName\" as SortKey, label: \"User Name\" },\r\n { id: \"agentId\" as SortKey, label: \"User ID\" },\r\n { id: \"queueNames\" as SortKey, label: \"Queues\" },\r\n { id: \"numLogins\" as SortKey, label: \"Logins\" },\r\n { id: \"firstLoginTime\" as SortKey, label: \"First Login\" },\r\n { id: \"lastLogoutTime\" as SortKey, label: \"Last Logout\" },\r\n { id: \"workingDurationFormatted\" as SortKey, label: \"Working Duration\" },\r\n { id: \"breakDurationFormatted\" as SortKey, label: \"Break Duration\" },\r\n { id: \"loginDurationFormatted\" as SortKey, label: \"Login Duration\" },\r\n { id: \"utilisationPct\" as SortKey, label: \"Utilisation %\" },\r\n ] as { id: SortKey; label: string }[]\r\n ).map((col) => (\r\n <TableCell key={col.id} sx={headCellSx}>\r\n <TableSortLabel\r\n active={sortKey === col.id}\r\n direction={sortKey === col.id ? sortDir : \"asc\"}\r\n onClick={() => handleSort(col.id)}\r\n sx={{\r\n \"&.MuiTableSortLabel-root\": { color: \"#333\" },\r\n \"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\r\n \"&.Mui-active\": { color: \"#333\" },\r\n \"& .MuiTableSortLabel-icon\": { color: \"#333 !important\" },\r\n }}\r\n >\r\n {col.label}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n\r\n <TableBody>\r\n {paginatedData.map((row, idx) => {\r\n const isLoggedIn = !row.lastLogoutTime;\r\n return (\r\n <TableRow\r\n key={`${row.agentId}-${idx}`}\r\n hover\r\n sx={{\r\n backgroundColor: \"#fff\",\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n }}\r\n >\r\n <TableCell sx={{ fontWeight: 600, color: COLORS.navy, fontSize: \"0.75rem\" }}>\r\n {row.fullName || \"—\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>{row.agentId || \"—\"}</TableCell>\r\n <TableCell>\r\n {row.queueNames ? (\r\n <Chip\r\n label={row.queueNames}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#f0ebfa\",\r\n color: COLORS.purple,\r\n fontWeight: 500,\r\n fontSize: \"0.67rem\",\r\n height: 22,\r\n }}\r\n />\r\n ) : (\r\n \"—\"\r\n )}\r\n </TableCell>\r\n <TableCell sx={{ textAlign: \"center\" }}>\r\n <Chip\r\n label={row.numLogins}\r\n size=\"small\"\r\n onClick={(e) => { e.stopPropagation(); openDialog(row); }}\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: COLORS.navy,\r\n color: \"#fff\",\r\n fontWeight: 600,\r\n minWidth: 28,\r\n height: 20,\r\n fontSize: \"0.67rem\",\r\n cursor: \"pointer\",\r\n \"&:hover\": { backgroundColor: COLORS.blue },\r\n }}\r\n />\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.firstLoginTime\r\n ? dayjs(row.firstLoginTime).format(\"DD MMM YYYY hh:mm A\")\r\n : \"—\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {isLoggedIn ? (\r\n <Chip\r\n label=\"LOGGED-IN\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: COLORS.green,\r\n color: \"#fff\",\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n }}\r\n />\r\n ) : (\r\n dayjs(row.lastLogoutTime).format(\"DD MMM YYYY hh:mm A\")\r\n )}\r\n </TableCell>\r\n <TableCell\r\n sx={{ fontWeight: 600, color: COLORS.blue, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}\r\n >\r\n {row.workingDurationFormatted || \"—\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{ fontWeight: 500, color: COLORS.amber, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}\r\n >\r\n {row.breakDurationFormatted || \"—\"}\r\n </TableCell>\r\n <TableCell sx={{ fontWeight: 500, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>\r\n {row.loginDurationFormatted || \"—\"}\r\n </TableCell>\r\n <TableCell sx={{ minWidth: 120 }}>\r\n {row.utilisationPct != null ? (() => {\r\n const pct = Math.min(row.utilisationPct, 100);\r\n const barColor =\r\n pct >= 80 ? \"#10b981\" : pct >= 60 ? \"#f59e0b\" : \"#ef4444\";\r\n const bgTint =\r\n pct >= 80 ? \"#d1fae5\" : pct >= 60 ? \"#fef3c7\" : \"#fee2e2\";\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}>\r\n <Box\r\n sx={{\r\n position: \"relative\",\r\n flex: 1,\r\n height: 7,\r\n borderRadius: 4,\r\n backgroundColor: bgTint,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n width: `${pct}%`,\r\n height: \"100%\",\r\n borderRadius: 4,\r\n background: `linear-gradient(90deg, ${barColor}cc, ${barColor})`,\r\n transition: \"width 0.4s ease\",\r\n }}\r\n />\r\n </Box>\r\n <Chip\r\n label={`${Math.round(pct)}%`}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n height: 18,\r\n minWidth: 38,\r\n fontSize: \"0.63rem\",\r\n fontWeight: 700,\r\n backgroundColor: bgTint,\r\n color: barColor,\r\n \"& .MuiChip-label\": { px: 0.6 },\r\n }}\r\n />\r\n </Box>\r\n );\r\n })() : (\r\n \"—\"\r\n )}\r\n </TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n\r\n <TablePagination\r\n component=\"div\"\r\n count={totalCount}\r\n page={page}\r\n onPageChange={handlePageChange}\r\n rowsPerPage={rowsPerPage}\r\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\r\n onRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\r\n sx={{ borderTop: \"1px solid #eef1f6\", fontFamily: FONT, \"& .MuiTablePagination-displayedRows\": { fontFamily: FONT, fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontFamily: FONT, fontSize: \"0.73rem\" } }}\r\n />\r\n </Paper>\r\n\r\n <Dialog\r\n open={dialogOpen}\r\n onClose={(_e, reason) => { if (reason !== 'backdropClick') closeDialog(); }}\r\n maxWidth=\"md\"\r\n fullWidth\r\n PaperProps={{\r\n sx: {\r\n borderRadius: \"12px\",\r\n fontFamily: FONT,\r\n overflow: \"hidden\",\r\n boxShadow: \"0 8px 32px rgba(0,0,0,0.18)\",\r\n maxWidth: 450,\r\n },\r\n }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n fontFamily: FONT,\r\n background: \"linear-gradient(135deg, var(--primary-color-dark, #14505b), var(--primary-color, #1A5F6C))\",\r\n color: \"#fff\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n py: 1.5,\r\n px: 2.5,\r\n }}\r\n >\r\n <Box>\r\n <Typography variant=\"h6\" sx={{ fontFamily: FONT, fontWeight: 700, fontSize: \"0.95rem\", letterSpacing: \"0.3px\" }}>\r\n Login Sessions\r\n </Typography>\r\n <Typography\r\n variant=\"body2\"\r\n sx={{ fontFamily: FONT, opacity: 0.9, fontSize: \"0.76rem\", mt: 0.3 }}\r\n >\r\n {selectedRow?.fullName} &bull; {selectedRow?.numLogins} session{selectedRow?.numLogins !== 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={<DownloadIcon sx={{ fontSize: \"0.85rem !important\" }} />}\r\n onClick={async () => {\r\n if (!selectedRow) return;\r\n try {\r\n await exportAgentLoginSessionsToExcel(selectedRow.agentId, {\r\n start_date: (startDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: (endDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n });\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n }}\r\n sx={{ whiteSpace: \"nowrap\" }}\r\n >\r\n Export to Excel\r\n </AppButton>\r\n <IconButton\r\n onClick={closeDialog}\r\n size=\"small\"\r\n sx={{\r\n color: \"#fff\",\r\n backgroundColor: \"rgba(255,255,255,0.1)\",\r\n \"&:hover\": { backgroundColor: \"rgba(255,255,255,0.2)\" },\r\n }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ p: 0, backgroundColor: \"#f8fafb\" }}>\r\n {sessionsLoading ? (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <CircularProgress size={28} sx={{ color: \"var(--primary-color, #1A5F6C)\" }} />\r\n </Box>\r\n ) : sessions.length > 0 ? (\r\n <Box sx={{ p: 1.5, maxHeight: 300, overflowY: \"auto\" }}>\r\n {Object.entries(\r\n sessions.reduce<Record<string, LoginSessionResponse[]>>((acc, s) => {\r\n const dateKey = s.loginTime\r\n ? dayjs(s.loginTime).format(\"DD MMM YYYY\")\r\n : \"Unknown Date\";\r\n if (!acc[dateKey]) acc[dateKey] = [];\r\n acc[dateKey].push(s);\r\n return acc;\r\n }, {})\r\n ).map(([date, dateSessions]) => (\r\n <Paper\r\n key={date}\r\n elevation={0}\r\n sx={{\r\n mb: 1.5,\r\n borderRadius: \"10px\",\r\n border: \"1px solid #e4eaf0\",\r\n overflow: \"hidden\",\r\n backgroundColor: \"#fff\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n px: 1.5,\r\n py: 0.8,\r\n backgroundColor: \"#f0f5f4\",\r\n borderBottom: \"1px solid #e4eaf0\",\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontFamily: FONT,\r\n fontWeight: 700,\r\n fontSize: \"0.8rem\",\r\n color: \"var(--primary-color-dark, #14505b)\",\r\n letterSpacing: \"0.3px\",\r\n }}\r\n >\r\n {date}\r\n </Typography>\r\n </Box>\r\n <Box sx={{ px: 1.5, py: 1 }}>\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 2,\r\n pb: 0.5,\r\n mb: 0.5,\r\n borderBottom: \"1px solid #e4eaf0\",\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n flex: 1,\r\n fontFamily: FONT,\r\n fontSize: \"0.72rem\",\r\n fontWeight: 700,\r\n color: \"#555\",\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n }}\r\n >\r\n Login\r\n </Typography>\r\n <Typography\r\n sx={{\r\n flex: 1,\r\n fontFamily: FONT,\r\n fontSize: \"0.72rem\",\r\n fontWeight: 700,\r\n color: \"#555\",\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n }}\r\n >\r\n Logout\r\n </Typography>\r\n </Box>\r\n {dateSessions.map((s, i) => {\r\n const isOpenSession = !s.logoutTime;\r\n const isEditing = s.sessionId != null && regularizeSessionId === s.sessionId;\r\n return (\r\n <Box\r\n key={i}\r\n sx={{\r\n py: 0.6,\r\n borderBottom: i < dateSessions.length - 1 ? \"1px dashed #e8ecf0\" : \"none\",\r\n }}\r\n >\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\r\n <Typography\r\n component=\"span\"\r\n sx={{\r\n flex: 1,\r\n fontFamily: FONT,\r\n fontSize: \"0.78rem\",\r\n fontWeight: 500,\r\n color: s.loginTime ? COLORS.green : \"#9e9e9e\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 0.4,\r\n }}\r\n >\r\n <span style={{ fontSize: \"0.9rem\" }}>{\"↙\"}</span>\r\n {s.loginTime ? dayjs(s.loginTime).format(\"DD MMM YYYY h:mm:ss A\") : \"Missing\"}\r\n </Typography>\r\n <Box sx={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 0.4 }}>\r\n <Typography\r\n component=\"span\"\r\n sx={{\r\n fontFamily: FONT,\r\n fontSize: \"0.78rem\",\r\n fontWeight: 500,\r\n color: s.logoutTime ? COLORS.red : \"#9e9e9e\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 0.4,\r\n }}\r\n >\r\n <span style={{ fontSize: \"0.9rem\" }}>{\"↗\"}</span>\r\n {s.logoutTime\r\n ? dayjs(s.logoutTime).format(\"DD MMM YYYY h:mm:ss A\")\r\n : \"Missing\"}\r\n </Typography>\r\n {isOpenSession && s.sessionId != null && !isEditing && (\r\n <SDKPermissionGuard\r\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE]}\r\n showFallback={false}\r\n >\r\n <Tooltip title=\"Regularize — set logout time\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => startRegularize(s)}\r\n sx={{\r\n p: 0.4,\r\n color: \"var(--primary-color, #1A5F6C)\",\r\n borderRadius: \"6px\",\r\n \"&:hover\": { backgroundColor: \"rgba(26,95,108,0.08)\" },\r\n }}\r\n >\r\n <EditCalendarIcon sx={{ fontSize: \"1.05rem\" }} />\r\n </IconButton>\r\n </Tooltip>\r\n </SDKPermissionGuard>\r\n )}\r\n </Box>\r\n </Box>\r\n\r\n {isEditing && (\r\n <Box\r\n sx={{\r\n mt: 1,\r\n p: 1.25,\r\n borderRadius: \"10px\",\r\n backgroundColor: \"#f0f5f4\",\r\n border: \"1px solid #d7e3e1\",\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontFamily: FONT,\r\n fontSize: \"0.68rem\",\r\n fontWeight: 700,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n color: \"var(--primary-color-dark, #14505b)\",\r\n mb: 0.75,\r\n }}\r\n >\r\n Set Logout Time\r\n </Typography>\r\n <DateTimePicker\r\n value={regularizeTime}\r\n onChange={(val) => setRegularizeTime(val)}\r\n minDateTime={s.loginTime ? dayjs(s.loginTime) : undefined}\r\n maxDateTime={dayjs()}\r\n ampm\r\n format=\"DD MMM YYYY hh:mm A\"\r\n slotProps={{\r\n textField: {\r\n size: \"small\",\r\n fullWidth: true,\r\n sx: {\r\n backgroundColor: \"#fff\",\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"8px\",\r\n fontFamily: FONT,\r\n fontSize: \"0.8rem\",\r\n \"&.Mui-focused fieldset\": { borderColor: \"var(--primary-color, #1A5F6C)\" },\r\n },\r\n },\r\n },\r\n actionBar: { actions: [\"clear\", \"cancel\", \"accept\"] },\r\n }}\r\n />\r\n {regularizeError && (\r\n <Typography sx={{ fontFamily: FONT, color: COLORS.red, fontSize: \"0.7rem\", mt: 0.6 }}>\r\n {regularizeError}\r\n </Typography>\r\n )}\r\n <Stack direction=\"row\" justifyContent=\"flex-end\" spacing={1} sx={{ mt: 1 }}>\r\n <AppButton\r\n variant=\"cancel\"\r\n size=\"small\"\r\n onClick={cancelRegularize}\r\n disabled={regularizing}\r\n >\r\n Cancel\r\n </AppButton>\r\n <AppButton\r\n size=\"small\"\r\n onClick={saveRegularize}\r\n disabled={regularizing}\r\n startIcon={\r\n regularizing\r\n ? <CircularProgress size={14} sx={{ color: \"#fff\" }} />\r\n : <CheckIcon sx={{ fontSize: \"0.95rem !important\" }} />\r\n }\r\n >\r\n {regularizing ? \"Saving…\" : \"Regularize\"}\r\n </AppButton>\r\n </Stack>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n </Paper>\r\n ))}\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 sessions found\r\n </Typography>\r\n </Box>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n </Box>\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst LoginReport: React.FC = () => (\r\n <SDKProvider>\r\n <LoginReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default LoginReport;\r\n","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\n}), 'Check');","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 22H5c-1.11 0-2-.9-2-2l.01-14c0-1.1.88-2 1.99-2h1V2h2v2h8V2h2v2h1c1.1 0 2 .9 2 2v6h-2v-2H5v10h7zm10.13-5.01.71-.71c.39-.39.39-1.02 0-1.41l-.71-.71a.996.996 0 0 0-1.41 0l-.71.71zm-.71.71-5.3 5.3H14v-2.12l5.3-5.3z\"\n}), 'EditCalendar');","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\n/**\r\n * Regularize (close) a stuck open login session by setting its logout time.\r\n * Supervisor action from the login report — clears the agent's active session.\r\n */\r\nexport async function regularizeLoginSession(sessionId: number | string, logoutTime: string): Promise<void> {\r\n\tawait axiosInstance.patch(END_POINT.LOGIN_REPORT_REGULARIZE_SESSION(sessionId), { sessionId, logoutTime });\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","_jsx","dayjs","isoWeek","useState","useCallback"]}
1
+ {"version":3,"sources":["../call-control-sdk/lib/pages/loginReport/index.tsx","../node_modules/@mui/icons-material/Check.mjs","../node_modules/@mui/icons-material/EditCalendar.mjs","../call-control-sdk/lib/pages/loginReport/useLoginReport.ts"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport {\r\n Alert,\r\n Box,\r\n Chip,\r\n CircularProgress,\r\n Dialog,\r\n DialogContent,\r\n DialogTitle,\r\n IconButton,\r\n Paper,\r\n Stack,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n TablePagination,\r\n TableSortLabel,\r\n Tooltip,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport CheckIcon from \"@mui/icons-material/Check\";\r\nimport EditCalendarIcon from \"@mui/icons-material/EditCalendar\";\r\nimport ReportFilterBar, { type QuickRange } from \"../common/components/ReportFilterBar\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\n\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\n\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport { DateTimePicker } from \"@mui/x-date-pickers/DateTimePicker\";\r\nimport {\r\n getLoginReport,\r\n getAgentLoginSessions,\r\n exportLoginReportToExcel,\r\n exportAgentLoginSessionsToExcel,\r\n regularizeLoginSession,\r\n getQueues,\r\n type Queue,\r\n} from \"./useLoginReport\";\r\nimport type { LoginReportParams, LoginAgentRowResponse, LoginSessionResponse } from \"./types\";\r\nimport { deepFindArray } from \"../../services/axios\";\r\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\r\nimport { headCellSx } from \"../common/utils/tableStyles\";\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport SearchBar from \"../common/components/SearchBar\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\n\r\ndayjs.extend(isoWeek);\r\n\r\ntype SortKey =\r\n | \"fullName\"\r\n | \"agentId\"\r\n | \"processNames\"\r\n | \"queueNames\"\r\n | \"numLogins\"\r\n | \"firstLoginTime\"\r\n | \"lastLogoutTime\"\r\n | \"workingDurationFormatted\"\r\n | \"breakDurationFormatted\"\r\n | \"loginDurationFormatted\"\r\n | \"utilisationPct\";\r\n\r\ntype SortDir = \"asc\" | \"desc\";\r\n\r\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n\r\nconst COLORS = {\r\n navy: \"#0d2a56\",\r\n blue: \"#1565c8\",\r\n green: \"#0a9a62\",\r\n amber: \"#c47c00\",\r\n red: \"#cc2a2a\",\r\n purple: \"#6b3fbf\",\r\n bg: \"transparent\",\r\n surface: \"transparent\",\r\n} as const;\r\n\r\nconst DEFAULT_ROWS_PER_PAGE = 10;\r\n\r\nconst comparator = (a: LoginAgentRowResponse, b: LoginAgentRowResponse, key: SortKey): number => {\r\n const av = a[key];\r\n const bv = b[key];\r\n if (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\r\n return String(av ?? \"\").localeCompare(String(bv ?? \"\"));\r\n};\r\n\r\nfunction LoginReportContent() {\r\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [activeQuickDate, setActiveQuickDate] = useState<\"today\" | \"week\" | \"month\" | null>(\"today\");\r\n const [searchText, setSearchText] = useState(\"\");\r\n\r\n const [selectedAgents, setSelectedAgents] = useState<AgentOption[]>([]);\r\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\r\n\r\n const [queues, setQueues] = useState<Queue[]>([]);\r\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\r\n\r\n const [reportData, setReportData] = useState<LoginAgentRowResponse[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n\r\n const [page, setPage] = useState(0);\r\n const [rowsPerPage, setRowsPerPage] = useState(DEFAULT_ROWS_PER_PAGE);\r\n const [totalCount, setTotalCount] = useState(-1);\r\n const [sortKey, setSortKey] = useState<SortKey>(\"fullName\");\r\n const [sortDir, setSortDir] = useState<SortDir>(\"asc\");\r\n\r\n // Debounced search (sent to the server)\r\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n debounceRef.current = setTimeout(() => setDebouncedSearch(searchText.trim()), 400);\r\n return () => clearTimeout(debounceRef.current);\r\n }, [searchText]);\r\n\r\n const [dialogOpen, setDialogOpen] = useState(false);\r\n const [selectedRow, setSelectedRow] = useState<LoginAgentRowResponse | null>(null);\r\n const [sessions, setSessions] = useState<LoginSessionResponse[]>([]);\r\n const [sessionsLoading, setSessionsLoading] = useState(false);\r\n\r\n /* ----- regularize (close stuck session) state ----- */\r\n const [regularizeSessionId, setRegularizeSessionId] = useState<number | null>(null);\r\n const [regularizeTime, setRegularizeTime] = useState<Dayjs | null>(null);\r\n const [regularizing, setRegularizing] = useState(false);\r\n const [regularizeError, setRegularizeError] = useState(\"\");\r\n\r\n useEffect(() => {\r\n getQueues().then((data) => setQueues(data || [])).catch(() => setError(\"Failed to load queues\"));\r\n }, []);\r\n\r\n const handleQuickRangeChange = (range: QuickRange) => { setActiveQuickDate(range || null); };\r\n\r\n const handleRefresh = () => {\r\n if (activeQuickDate) {\r\n const now = dayjs();\r\n let sd = now.startOf(\"day\");\r\n const ed = now;\r\n if (activeQuickDate === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\r\n else if (activeQuickDate === \"month\") sd = now.startOf(\"month\").startOf(\"day\");\r\n // Setting the dates re-triggers the auto-fetch effect below.\r\n setStartDate(sd);\r\n setEndDate(ed);\r\n } else {\r\n fetchReport(page);\r\n }\r\n };\r\n\r\n const fetchReport = useCallback(\r\n async (pageNum: number) => {\r\n const sd = startDate;\r\n const ed = endDate;\r\n\r\n if (!sd || !ed) {\r\n setError(\"Select a valid date range\");\r\n return;\r\n }\r\n\r\n const params: LoginReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id: !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.userId)\r\n : undefined,\r\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n search: debouncedSearch || undefined,\r\n page: pageNum + 1,\r\n pageSize: rowsPerPage,\r\n };\r\n\r\n try {\r\n setError(\"\");\r\n setLoading(true);\r\n const res = await getLoginReport(params);\r\n const agents = deepFindArray<LoginAgentRowResponse>(res, [\"agents\"]);\r\n setReportData(agents);\r\n // Real total from the response (falls back defensively to the summary count).\r\n const total =\r\n (res as any)?.total ??\r\n (res as any)?.pagination?.total ??\r\n res?.summary?.totalAgentsLoggedIn;\r\n setTotalCount(typeof total === \"number\" ? total : agents.length);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to fetch login report\");\r\n setReportData([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [startDate, endDate, selectedAgents, isAllUsersSelected, selectedQueues, debouncedSearch, rowsPerPage],\r\n );\r\n\r\n useEffect(() => {\r\n setPage(0);\r\n fetchReport(0);\r\n }, [fetchReport]);\r\n\r\n const handlePageChange = useCallback(\r\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n setPage(newPage);\r\n fetchReport(newPage);\r\n },\r\n [fetchReport],\r\n );\r\n\r\n // Sorting is applied client-side to the current page; search + paging are server-side.\r\n const filteredData = useMemo(() => {\r\n const rows = [...reportData];\r\n rows.sort((a, b) => {\r\n const cmp = comparator(a, b, sortKey);\r\n return sortDir === \"asc\" ? cmp : -cmp;\r\n });\r\n return rows;\r\n }, [reportData, sortKey, sortDir]);\r\n\r\n const paginatedData = filteredData;\r\n\r\n const handleSort = (key: SortKey) => {\r\n if (sortKey === key) {\r\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n } else {\r\n setSortKey(key);\r\n setSortDir(\"asc\");\r\n }\r\n };\r\n\r\n const loadSessions = useCallback(async (agentId: string) => {\r\n setSessionsLoading(true);\r\n try {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n const data = await getAgentLoginSessions(agentId, {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n });\r\n setSessions(data);\r\n } catch {\r\n setSessions([]);\r\n } finally {\r\n setSessionsLoading(false);\r\n }\r\n }, [startDate, endDate]);\r\n\r\n const openDialog = async (row: LoginAgentRowResponse) => {\r\n setSelectedRow(row);\r\n setSessions([]);\r\n setRegularizeSessionId(null);\r\n setRegularizeError(\"\");\r\n setDialogOpen(true);\r\n await loadSessions(row.agentId);\r\n };\r\n\r\n const closeDialog = () => {\r\n setDialogOpen(false);\r\n setTimeout(() => {\r\n setSelectedRow(null);\r\n setSessions([]);\r\n setRegularizeSessionId(null);\r\n setRegularizeError(\"\");\r\n }, 300);\r\n };\r\n\r\n /* ================= REGULARIZE (close stuck session) ================= */\r\n\r\n const startRegularize = (session: LoginSessionResponse) => {\r\n if (session.sessionId == null) return;\r\n setRegularizeError(\"\");\r\n setRegularizeSessionId(session.sessionId);\r\n // Default the logout time to now (supervisor can edit before saving).\r\n setRegularizeTime(dayjs());\r\n };\r\n\r\n const cancelRegularize = () => {\r\n setRegularizeSessionId(null);\r\n setRegularizeTime(null);\r\n setRegularizeError(\"\");\r\n };\r\n\r\n const saveRegularize = async () => {\r\n if (regularizeSessionId == null || !regularizeTime || !regularizeTime.isValid()) {\r\n setRegularizeError(\"Select a valid logout time\");\r\n return;\r\n }\r\n try {\r\n setRegularizing(true);\r\n setRegularizeError(\"\");\r\n await regularizeLoginSession(regularizeSessionId, regularizeTime.toISOString());\r\n cancelRegularize();\r\n // Refresh the session list and the underlying report so the row reflects the change.\r\n if (selectedRow) await loadSessions(selectedRow.agentId);\r\n fetchReport(page);\r\n } catch (err: any) {\r\n setRegularizeError(err?.message || \"Failed to regularize login session\");\r\n } finally {\r\n setRegularizing(false);\r\n }\r\n };\r\n\r\n const handleExportExcel = async () => {\r\n const sd = startDate ?? dayjs();\r\n const ed = endDate ?? dayjs();\r\n const params: LoginReportParams = {\r\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id: !isAllUsersSelected && selectedAgents.length > 0\r\n ? selectedAgents.map((a) => a.userId)\r\n : undefined,\r\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n search: debouncedSearch || undefined,\r\n };\r\n try {\r\n await exportLoginReportToExcel(params);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n };\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", fontFamily: FONT }}>\r\n <PageHeader\r\n title=\"Login Report\"\r\n actions={\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n <SearchBar\r\n value={searchText}\r\n onChange={(val) => { setSearchText(val); setPage(0); }}\r\n placeholder=\"Search name, ID...\"\r\n width={250}\r\n />\r\n <SDKPermissionGuard\r\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE, SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_EXPORT]}\r\n showFallback={false}\r\n >\r\n <AppButton\r\n startIcon={<DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n disabled={!reportData.length}\r\n onClick={handleExportExcel}\r\n sx={{ height: 36 }}\r\n >\r\n Export Excel\r\n </AppButton>\r\n </SDKPermissionGuard>\r\n </Stack>\r\n }\r\n />\r\n\r\n <Box sx={{ flex: 1, overflow: \"auto\", py: 0.8, px: 0 }}>\r\n <Box sx={{ mb: 0.8 }}>\r\n <ReportFilterBar\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n quickRange={activeQuickDate || \"\"}\r\n onQuickRangeChange={handleQuickRangeChange}\r\n showAgentSelect\r\n selectedAgents={selectedAgents}\r\n onAgentsChange={setSelectedAgents}\r\n setIsAllUsersSelected={setIsAllUsersSelected}\r\n showQueueSelect\r\n queues={queues}\r\n selectedQueues={selectedQueues}\r\n onQueuesChange={setSelectedQueues}\r\n extra={\r\n <AppButton\r\n startIcon={<RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />}\r\n disabled={loading}\r\n onClick={handleRefresh}\r\n sx={{ height: 32 }}\r\n >\r\n Refresh\r\n </AppButton>\r\n }\r\n />\r\n\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mt: 1, fontFamily: FONT, fontSize: \"0.78rem\" }}>\r\n {error}\r\n </Alert>\r\n )}\r\n </Box>\r\n\r\n {loading && (\r\n <Box sx={{ textAlign: \"center\", py: 2.5 }}>\r\n <CircularProgress sx={{ color: COLORS.blue }} size={28} />\r\n </Box>\r\n )}\r\n\r\n <Paper\r\n elevation={0}\r\n sx={{\r\n borderRadius: \"8px\",\r\n border: \"1px solid #e0e7ef\",\r\n overflow: \"hidden\",\r\n mb: 2,\r\n }}\r\n >\r\n <TableContainer>\r\n <Table\r\n size=\"small\"\r\n sx={{\r\n minWidth: 1100,\r\n fontFamily: FONT,\r\n \"& .MuiTableCell-root\": {\r\n fontFamily: FONT,\r\n fontSize: \"0.75rem\",\r\n borderBottom: \"1px solid #eef1f6\",\r\n py: 0.6,\r\n px: 1,\r\n },\r\n }}\r\n >\r\n <TableHead>\r\n <TableRow>\r\n {(\r\n [\r\n { id: \"fullName\" as SortKey, label: \"User Name\" },\r\n { id: \"agentId\" as SortKey, label: \"User ID\" },\r\n { id: \"queueNames\" as SortKey, label: \"Queues\" },\r\n { id: \"numLogins\" as SortKey, label: \"Logins\" },\r\n { id: \"firstLoginTime\" as SortKey, label: \"First Login\" },\r\n { id: \"lastLogoutTime\" as SortKey, label: \"Last Logout\" },\r\n { id: \"workingDurationFormatted\" as SortKey, label: \"Working Duration\" },\r\n { id: \"breakDurationFormatted\" as SortKey, label: \"Break Duration\" },\r\n { id: \"loginDurationFormatted\" as SortKey, label: \"Login Duration\" },\r\n { id: \"utilisationPct\" as SortKey, label: \"Utilisation %\" },\r\n ] as { id: SortKey; label: string }[]\r\n ).map((col) => (\r\n <TableCell key={col.id} sx={headCellSx}>\r\n <TableSortLabel\r\n active={sortKey === col.id}\r\n direction={sortKey === col.id ? sortDir : \"asc\"}\r\n onClick={() => handleSort(col.id)}\r\n sx={{\r\n \"&.MuiTableSortLabel-root\": { color: \"#333\" },\r\n \"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\r\n \"&.Mui-active\": { color: \"#333\" },\r\n \"& .MuiTableSortLabel-icon\": { color: \"#333 !important\" },\r\n }}\r\n >\r\n {col.label}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n\r\n <TableBody>\r\n {paginatedData.map((row, idx) => {\r\n const isLoggedIn = !row.lastLogoutTime;\r\n return (\r\n <TableRow\r\n key={`${row.agentId}-${idx}`}\r\n hover\r\n sx={{\r\n backgroundColor: \"#fff\",\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n }}\r\n >\r\n <TableCell sx={{ fontWeight: 600, color: COLORS.navy, fontSize: \"0.75rem\" }}>\r\n {row.fullName || \"—\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>{row.agentId || \"—\"}</TableCell>\r\n <TableCell>\r\n {row.queueNames ? (\r\n <Chip\r\n label={row.queueNames}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: \"#f0ebfa\",\r\n color: COLORS.purple,\r\n fontWeight: 500,\r\n fontSize: \"0.67rem\",\r\n height: 22,\r\n }}\r\n />\r\n ) : (\r\n \"—\"\r\n )}\r\n </TableCell>\r\n <TableCell sx={{ textAlign: \"center\" }}>\r\n <Chip\r\n label={row.numLogins}\r\n size=\"small\"\r\n onClick={(e) => { e.stopPropagation(); openDialog(row); }}\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: COLORS.navy,\r\n color: \"#fff\",\r\n fontWeight: 600,\r\n minWidth: 28,\r\n height: 20,\r\n fontSize: \"0.67rem\",\r\n cursor: \"pointer\",\r\n \"&:hover\": { backgroundColor: COLORS.blue },\r\n }}\r\n />\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {row.firstLoginTime\r\n ? dayjs(row.firstLoginTime).format(\"DD MMM YYYY hh:mm A\")\r\n : \"—\"}\r\n </TableCell>\r\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\r\n {isLoggedIn ? (\r\n <Chip\r\n label=\"LOGGED-IN\"\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n backgroundColor: COLORS.green,\r\n color: \"#fff\",\r\n fontWeight: 600,\r\n fontSize: \"0.65rem\",\r\n height: 20,\r\n }}\r\n />\r\n ) : (\r\n dayjs(row.lastLogoutTime).format(\"DD MMM YYYY hh:mm A\")\r\n )}\r\n </TableCell>\r\n <TableCell\r\n sx={{ fontWeight: 600, color: COLORS.blue, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}\r\n >\r\n {row.workingDurationFormatted || \"—\"}\r\n </TableCell>\r\n <TableCell\r\n sx={{ fontWeight: 500, color: COLORS.amber, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}\r\n >\r\n {row.breakDurationFormatted || \"—\"}\r\n </TableCell>\r\n <TableCell sx={{ fontWeight: 500, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>\r\n {row.loginDurationFormatted || \"—\"}\r\n </TableCell>\r\n <TableCell sx={{ minWidth: 120 }}>\r\n {row.utilisationPct != null ? (() => {\r\n const pct = Math.min(row.utilisationPct, 100);\r\n const barColor =\r\n pct >= 80 ? \"#10b981\" : pct >= 60 ? \"#f59e0b\" : \"#ef4444\";\r\n const bgTint =\r\n pct >= 80 ? \"#d1fae5\" : pct >= 60 ? \"#fef3c7\" : \"#fee2e2\";\r\n return (\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}>\r\n <Box\r\n sx={{\r\n position: \"relative\",\r\n flex: 1,\r\n height: 7,\r\n borderRadius: 4,\r\n backgroundColor: bgTint,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n width: `${pct}%`,\r\n height: \"100%\",\r\n borderRadius: 4,\r\n background: `linear-gradient(90deg, ${barColor}cc, ${barColor})`,\r\n transition: \"width 0.4s ease\",\r\n }}\r\n />\r\n </Box>\r\n <Chip\r\n label={`${Math.round(pct)}%`}\r\n size=\"small\"\r\n sx={{\r\n fontFamily: FONT,\r\n height: 18,\r\n minWidth: 38,\r\n fontSize: \"0.63rem\",\r\n fontWeight: 700,\r\n backgroundColor: bgTint,\r\n color: barColor,\r\n \"& .MuiChip-label\": { px: 0.6 },\r\n }}\r\n />\r\n </Box>\r\n );\r\n })() : (\r\n \"—\"\r\n )}\r\n </TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n\r\n <TablePagination\r\n component=\"div\"\r\n count={totalCount}\r\n page={page}\r\n onPageChange={handlePageChange}\r\n rowsPerPage={rowsPerPage}\r\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\r\n onRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\r\n sx={{ borderTop: \"1px solid #eef1f6\", fontFamily: FONT, \"& .MuiTablePagination-displayedRows\": { fontFamily: FONT, fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontFamily: FONT, fontSize: \"0.73rem\" } }}\r\n />\r\n </Paper>\r\n\r\n <Dialog\r\n open={dialogOpen}\r\n onClose={(_e, reason) => { if (reason !== 'backdropClick') closeDialog(); }}\r\n maxWidth=\"md\"\r\n fullWidth\r\n PaperProps={{\r\n sx: {\r\n borderRadius: \"12px\",\r\n fontFamily: FONT,\r\n overflow: \"hidden\",\r\n boxShadow: \"0 8px 32px rgba(0,0,0,0.18)\",\r\n maxWidth: 450,\r\n },\r\n }}\r\n >\r\n <DialogTitle\r\n sx={{\r\n fontFamily: FONT,\r\n background: \"linear-gradient(135deg, var(--primary-color-dark, #14505b), var(--primary-color, #1A5F6C))\",\r\n color: \"#fff\",\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n py: 1.5,\r\n px: 2.5,\r\n }}\r\n >\r\n <Box>\r\n <Typography variant=\"h6\" sx={{ fontFamily: FONT, fontWeight: 700, fontSize: \"0.95rem\", letterSpacing: \"0.3px\" }}>\r\n Login Sessions\r\n </Typography>\r\n <Typography\r\n variant=\"body2\"\r\n sx={{ fontFamily: FONT, opacity: 0.9, fontSize: \"0.76rem\", mt: 0.3 }}\r\n >\r\n {selectedRow?.fullName} &bull; {selectedRow?.numLogins} session{selectedRow?.numLogins !== 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={<DownloadIcon sx={{ fontSize: \"0.85rem !important\" }} />}\r\n onClick={async () => {\r\n if (!selectedRow) return;\r\n try {\r\n await exportAgentLoginSessionsToExcel(selectedRow.agentId, {\r\n start_date: (startDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: (endDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n });\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n }}\r\n sx={{ whiteSpace: \"nowrap\" }}\r\n >\r\n Export to Excel\r\n </AppButton>\r\n <IconButton\r\n onClick={closeDialog}\r\n size=\"small\"\r\n sx={{\r\n color: \"#fff\",\r\n backgroundColor: \"rgba(255,255,255,0.1)\",\r\n \"&:hover\": { backgroundColor: \"rgba(255,255,255,0.2)\" },\r\n }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ p: 0, backgroundColor: \"#f8fafb\" }}>\r\n {sessionsLoading ? (\r\n <Box sx={{ p: 4, textAlign: \"center\" }}>\r\n <CircularProgress size={28} sx={{ color: \"var(--primary-color, #1A5F6C)\" }} />\r\n </Box>\r\n ) : sessions.length > 0 ? (\r\n <Box sx={{ p: 1.5, maxHeight: 300, overflowY: \"auto\" }}>\r\n {Object.entries(\r\n sessions.reduce<Record<string, LoginSessionResponse[]>>((acc, s) => {\r\n const dateKey = s.loginTime\r\n ? dayjs(s.loginTime).format(\"DD MMM YYYY\")\r\n : \"Unknown Date\";\r\n if (!acc[dateKey]) acc[dateKey] = [];\r\n acc[dateKey].push(s);\r\n return acc;\r\n }, {})\r\n ).map(([date, dateSessions]) => (\r\n <Paper\r\n key={date}\r\n elevation={0}\r\n sx={{\r\n mb: 1.5,\r\n borderRadius: \"10px\",\r\n border: \"1px solid #e4eaf0\",\r\n overflow: \"hidden\",\r\n backgroundColor: \"#fff\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n px: 1.5,\r\n py: 0.8,\r\n backgroundColor: \"#f0f5f4\",\r\n borderBottom: \"1px solid #e4eaf0\",\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontFamily: FONT,\r\n fontWeight: 700,\r\n fontSize: \"0.8rem\",\r\n color: \"var(--primary-color-dark, #14505b)\",\r\n letterSpacing: \"0.3px\",\r\n }}\r\n >\r\n {date}\r\n </Typography>\r\n </Box>\r\n <Box sx={{ px: 1.5, py: 1 }}>\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 2,\r\n pb: 0.5,\r\n mb: 0.5,\r\n borderBottom: \"1px solid #e4eaf0\",\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n flex: 1,\r\n fontFamily: FONT,\r\n fontSize: \"0.72rem\",\r\n fontWeight: 700,\r\n color: \"#555\",\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n }}\r\n >\r\n Login\r\n </Typography>\r\n <Typography\r\n sx={{\r\n flex: 1,\r\n fontFamily: FONT,\r\n fontSize: \"0.72rem\",\r\n fontWeight: 700,\r\n color: \"#555\",\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n }}\r\n >\r\n Logout\r\n </Typography>\r\n </Box>\r\n {dateSessions.map((s, i) => {\r\n const isOpenSession = !s.logoutTime;\r\n const isEditing = s.sessionId != null && regularizeSessionId === s.sessionId;\r\n return (\r\n <Box\r\n key={i}\r\n sx={{\r\n py: 0.6,\r\n borderBottom: i < dateSessions.length - 1 ? \"1px dashed #e8ecf0\" : \"none\",\r\n }}\r\n >\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\r\n <Typography\r\n component=\"span\"\r\n sx={{\r\n flex: 1,\r\n fontFamily: FONT,\r\n fontSize: \"0.78rem\",\r\n fontWeight: 500,\r\n color: s.loginTime ? COLORS.green : \"#9e9e9e\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 0.4,\r\n }}\r\n >\r\n <span style={{ fontSize: \"0.9rem\" }}>{\"↙\"}</span>\r\n {s.loginTime ? dayjs(s.loginTime).format(\"DD MMM YYYY h:mm:ss A\") : \"Missing\"}\r\n </Typography>\r\n <Box sx={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 0.4 }}>\r\n <Typography\r\n component=\"span\"\r\n sx={{\r\n fontFamily: FONT,\r\n fontSize: \"0.78rem\",\r\n fontWeight: 500,\r\n color: s.logoutTime ? COLORS.red : \"#9e9e9e\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 0.4,\r\n }}\r\n >\r\n <span style={{ fontSize: \"0.9rem\" }}>{\"↗\"}</span>\r\n {s.logoutTime\r\n ? dayjs(s.logoutTime).format(\"DD MMM YYYY h:mm:ss A\")\r\n : \"Missing\"}\r\n </Typography>\r\n {isOpenSession && s.sessionId != null && !isEditing && (\r\n <SDKPermissionGuard\r\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE]}\r\n showFallback={false}\r\n >\r\n <Tooltip title=\"Regularize — set logout time\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => startRegularize(s)}\r\n sx={{\r\n p: 0.4,\r\n color: \"var(--primary-color, #1A5F6C)\",\r\n borderRadius: \"6px\",\r\n \"&:hover\": { backgroundColor: \"rgba(26,95,108,0.08)\" },\r\n }}\r\n >\r\n <EditCalendarIcon sx={{ fontSize: \"1.05rem\" }} />\r\n </IconButton>\r\n </Tooltip>\r\n </SDKPermissionGuard>\r\n )}\r\n </Box>\r\n </Box>\r\n\r\n {isEditing && (\r\n <Box\r\n sx={{\r\n mt: 1,\r\n p: 1.25,\r\n borderRadius: \"10px\",\r\n backgroundColor: \"#f0f5f4\",\r\n border: \"1px solid #d7e3e1\",\r\n }}\r\n >\r\n <Typography\r\n sx={{\r\n fontFamily: FONT,\r\n fontSize: \"0.68rem\",\r\n fontWeight: 700,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \"0.5px\",\r\n color: \"var(--primary-color-dark, #14505b)\",\r\n mb: 0.75,\r\n }}\r\n >\r\n Set Logout Time\r\n </Typography>\r\n <DateTimePicker\r\n value={regularizeTime}\r\n onChange={(val) => setRegularizeTime(val)}\r\n minDateTime={s.loginTime ? dayjs(s.loginTime) : undefined}\r\n maxDateTime={dayjs()}\r\n ampm\r\n format=\"DD MMM YYYY hh:mm A\"\r\n slotProps={{\r\n textField: {\r\n size: \"small\",\r\n fullWidth: true,\r\n sx: {\r\n backgroundColor: \"#fff\",\r\n \"& .MuiOutlinedInput-root\": {\r\n borderRadius: \"8px\",\r\n fontFamily: FONT,\r\n fontSize: \"0.8rem\",\r\n \"&.Mui-focused fieldset\": { borderColor: \"var(--primary-color, #1A5F6C)\" },\r\n },\r\n },\r\n },\r\n actionBar: { actions: [\"clear\", \"cancel\", \"accept\"] },\r\n }}\r\n />\r\n {regularizeError && (\r\n <Typography sx={{ fontFamily: FONT, color: COLORS.red, fontSize: \"0.7rem\", mt: 0.6 }}>\r\n {regularizeError}\r\n </Typography>\r\n )}\r\n <Stack direction=\"row\" justifyContent=\"flex-end\" spacing={1} sx={{ mt: 1 }}>\r\n <AppButton\r\n variant=\"cancel\"\r\n size=\"small\"\r\n onClick={cancelRegularize}\r\n disabled={regularizing}\r\n >\r\n Cancel\r\n </AppButton>\r\n <AppButton\r\n size=\"small\"\r\n onClick={saveRegularize}\r\n disabled={regularizing}\r\n startIcon={\r\n regularizing\r\n ? <CircularProgress size={14} sx={{ color: \"#fff\" }} />\r\n : <CheckIcon sx={{ fontSize: \"0.95rem !important\" }} />\r\n }\r\n >\r\n {regularizing ? \"Saving…\" : \"Regularize\"}\r\n </AppButton>\r\n </Stack>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n </Paper>\r\n ))}\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 sessions found\r\n </Typography>\r\n </Box>\r\n )}\r\n </DialogContent>\r\n </Dialog>\r\n </Box>\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst LoginReport: React.FC = () => (\r\n <SDKProvider>\r\n <LoginReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default LoginReport;\r\n","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\n}), 'Check');","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 22H5c-1.11 0-2-.9-2-2l.01-14c0-1.1.88-2 1.99-2h1V2h2v2h8V2h2v2h1c1.1 0 2 .9 2 2v6h-2v-2H5v10h7zm10.13-5.01.71-.71c.39-.39.39-1.02 0-1.41l-.71-.71a.996.996 0 0 0-1.41 0l-.71.71zm-.71.71-5.3 5.3H14v-2.12l5.3-5.3z\"\n}), 'EditCalendar');","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\n/**\r\n * Regularize (close) a stuck open login session by setting its logout time.\r\n * Supervisor action from the login report — clears the agent's active session.\r\n */\r\nexport async function regularizeLoginSession(sessionId: number | string, logoutTime: string): Promise<void> {\r\n\tawait axiosInstance.patch(END_POINT.LOGIN_REPORT_REGULARIZE_SESSION(sessionId), { sessionId, logoutTime });\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","_jsx","dayjs","isoWeek","useState","useCallback"]}
@@ -1,8 +1,18 @@
1
+ import * as __ext_react from "react";
2
+ import * as __ext_react_dom from "react-dom";
3
+ import * as __ext_react_jsx from "react/jsx-runtime";
4
+ var __cjsExternals = { "react": __ext_react, "react-dom": __ext_react_dom, "react/jsx-runtime": __ext_react_jsx };
5
+ var require = function (id) {
6
+ var mod = __cjsExternals[id];
7
+ if (mod) return mod.default || mod;
8
+ throw new Error('Dynamic require of "' + id + '" is not supported');
9
+ };
10
+
1
11
  import {
2
12
  ReportFilterBar,
3
13
  headCellSx
4
- } from "./chunk-2M3YEXYA.mjs";
5
- import "./chunk-WTBVFN4H.mjs";
14
+ } from "./chunk-SUS5RUCA.mjs";
15
+ import "./chunk-VII5JNA6.mjs";
6
16
  import {
7
17
  Bar,
8
18
  CartesianGrid,
@@ -12,32 +22,32 @@ import {
12
22
  Tooltip,
13
23
  XAxis,
14
24
  YAxis
15
- } from "./chunk-DF5EFKXC.mjs";
25
+ } from "./chunk-45MLTWV7.mjs";
16
26
  import {
17
27
  FileDownload_default
18
- } from "./chunk-AOJRUZTO.mjs";
28
+ } from "./chunk-H22TUCN3.mjs";
19
29
  import {
20
30
  PageHeader
21
- } from "./chunk-VBIDPX5Z.mjs";
31
+ } from "./chunk-Y4PAUTZ4.mjs";
22
32
  import {
23
33
  AppButton
24
- } from "./chunk-NAZO4HKB.mjs";
34
+ } from "./chunk-ZSRD3ZXF.mjs";
25
35
  import {
26
36
  AdapterDayjs,
27
37
  LocalizationProvider,
28
38
  require_dayjs_min
29
- } from "./chunk-E6KYWWAI.mjs";
39
+ } from "./chunk-GTI2ZVQX.mjs";
30
40
  import {
31
41
  Refresh_default,
32
42
  Search_default
33
- } from "./chunk-YAQYTUTX.mjs";
43
+ } from "./chunk-HAOFUADN.mjs";
34
44
  import {
35
45
  SDKProvider
36
- } from "./chunk-VVDJLUYT.mjs";
46
+ } from "./chunk-M7FJYZF6.mjs";
37
47
  import {
38
48
  END_POINT,
39
49
  axios_default
40
- } from "./chunk-LHE4QGJJ.mjs";
50
+ } from "./chunk-KSVNZKRD.mjs";
41
51
  import {
42
52
  Alert_default,
43
53
  Box_default,
@@ -60,7 +70,7 @@ import {
60
70
  __spreadProps,
61
71
  __spreadValues,
62
72
  __toESM
63
- } from "./chunk-Q6G3MPS7.mjs";
73
+ } from "./chunk-ERSNXW5X.mjs";
64
74
 
65
75
  // call-control-sdk/lib/pages/managementDashboard/index.tsx
66
76
  import { useState, useEffect, useCallback, useMemo, useRef } from "react";
@@ -533,4 +543,4 @@ var managementDashboard_default = ManagementDashboard;
533
543
  export {
534
544
  managementDashboard_default as default
535
545
  };
536
- //# sourceMappingURL=managementDashboard-7EMQC2UA.mjs.map
546
+ //# sourceMappingURL=managementDashboard-SZFYULKA.mjs.map