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
@@ -0,0 +1,990 @@
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
+
11
+ import {
12
+ ReportFilterBar,
13
+ SearchBar,
14
+ headCellSx
15
+ } from "./chunk-MCD5FQNY.mjs";
16
+ import {
17
+ SDKPermissionGuard
18
+ } from "./chunk-ADM2JJCP.mjs";
19
+ import {
20
+ PageHeader
21
+ } from "./chunk-KRXHK4AU.mjs";
22
+ import {
23
+ AppButton
24
+ } from "./chunk-LX6I32Y4.mjs";
25
+ import "./chunk-UTSRABCL.mjs";
26
+ import {
27
+ SDKProvider
28
+ } from "./chunk-4YF4IDV6.mjs";
29
+ import {
30
+ END_POINT,
31
+ SDK_PERMISSIONS,
32
+ axios_default,
33
+ deepFindArray
34
+ } from "./chunk-F7G2XFRU.mjs";
35
+ import "./chunk-S4J35V4B.mjs";
36
+
37
+ // call-control-sdk/lib/pages/loginReport/index.tsx
38
+ import { useCallback as useCallback2, useEffect, useMemo, useRef, useState as useState2 } from "react";
39
+ import {
40
+ Alert,
41
+ Box,
42
+ Chip,
43
+ CircularProgress,
44
+ Dialog,
45
+ DialogContent,
46
+ DialogTitle,
47
+ IconButton,
48
+ Paper,
49
+ Stack,
50
+ Table,
51
+ TableBody,
52
+ TableCell,
53
+ TableContainer,
54
+ TableHead,
55
+ TableRow,
56
+ TablePagination,
57
+ TableSortLabel,
58
+ Tooltip,
59
+ Typography
60
+ } from "@mui/material";
61
+ import CloseIcon from "@mui/icons-material/Close";
62
+ import CheckIcon from "@mui/icons-material/Check";
63
+ import EditCalendarIcon from "@mui/icons-material/EditCalendar";
64
+ import DownloadIcon from "@mui/icons-material/Download";
65
+ import RefreshIcon from "@mui/icons-material/Refresh";
66
+ import dayjs from "dayjs";
67
+ import isoWeek from "dayjs/plugin/isoWeek";
68
+ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
69
+ import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
70
+ import { DateTimePicker } from "@mui/x-date-pickers/DateTimePicker";
71
+
72
+ // call-control-sdk/lib/pages/loginReport/useLoginReport.ts
73
+ import { useCallback, useState } from "react";
74
+ async function fetchQueues() {
75
+ var _a;
76
+ const res = await axios_default.get(END_POINT.MASTER_QUEUES);
77
+ if (Array.isArray(res.data)) return res.data;
78
+ if (Array.isArray((_a = res.data) == null ? void 0 : _a.data)) return res.data.data;
79
+ return [];
80
+ }
81
+ async function getQueues() {
82
+ return fetchQueues();
83
+ }
84
+ async function getLoginReport(params) {
85
+ const qs = buildLoginReportQueryString(params);
86
+ const res = await axios_default.get(`${END_POINT.LOGIN_REPORT}${qs}`);
87
+ return res.data;
88
+ }
89
+ async function getAgentLoginSessions(agentId, params) {
90
+ const qs = buildSessionQueryString(params);
91
+ const res = await axios_default.get(
92
+ `${END_POINT.LOGIN_REPORT_AGENT_SESSIONS(agentId)}${qs}`
93
+ );
94
+ return Array.isArray(res.data) ? res.data : [];
95
+ }
96
+ async function regularizeLoginSession(sessionId, logoutTime) {
97
+ await axios_default.patch(END_POINT.LOGIN_REPORT_REGULARIZE_SESSION(sessionId), { sessionId, logoutTime });
98
+ }
99
+ async function exportLoginReportToExcel(params) {
100
+ var _a;
101
+ const qs = buildLoginReportQueryString(params);
102
+ const res = await axios_default.get(`${END_POINT.LOGIN_REPORT_EXPORT_EXCEL}${qs}`, { responseType: "blob" });
103
+ triggerBlobDownload(new Blob([res.data]), `login-report-${(_a = params.start_date) != null ? _a : "export"}.xlsx`);
104
+ }
105
+ async function exportAgentLoginSessionsToExcel(agentId, params) {
106
+ const qs = buildSessionQueryString(params);
107
+ const res = await axios_default.get(
108
+ `${END_POINT.LOGIN_REPORT_AGENT_SESSIONS_EXPORT_EXCEL(agentId)}${qs}`,
109
+ { responseType: "blob" }
110
+ );
111
+ triggerBlobDownload(new Blob([res.data]), `login_sessions_${agentId}.xlsx`);
112
+ }
113
+ function buildLoginReportQueryString(params) {
114
+ const qs = new URLSearchParams();
115
+ if (params.start_date) qs.append("start_date", params.start_date);
116
+ if (params.end_date) qs.append("end_date", params.end_date);
117
+ if (params.agent_id) for (const id of params.agent_id) qs.append("agent_id", id);
118
+ if (params.queue_id) for (const id of params.queue_id) qs.append("queue_id", String(id));
119
+ if (params.process_id) for (const id of params.process_id) qs.append("process_id", String(id));
120
+ if (params.search) qs.append("search", params.search);
121
+ if (params.page) qs.append("page", String(params.page));
122
+ if (params.pageSize) qs.append("pageSize", String(params.pageSize));
123
+ const str = qs.toString();
124
+ return str ? `?${str}` : "";
125
+ }
126
+ function buildSessionQueryString(params) {
127
+ const qs = new URLSearchParams();
128
+ if (params == null ? void 0 : params.start_date) qs.append("start_date", params.start_date);
129
+ if (params == null ? void 0 : params.end_date) qs.append("end_date", params.end_date);
130
+ const str = qs.toString();
131
+ return str ? `?${str}` : "";
132
+ }
133
+ function triggerBlobDownload(blob, filename) {
134
+ const url = URL.createObjectURL(blob);
135
+ const a = document.createElement("a");
136
+ a.href = url;
137
+ a.download = filename;
138
+ document.body.appendChild(a);
139
+ a.click();
140
+ a.remove();
141
+ URL.revokeObjectURL(url);
142
+ }
143
+
144
+ // call-control-sdk/lib/pages/loginReport/index.tsx
145
+ import { jsx, jsxs } from "react/jsx-runtime";
146
+ dayjs.extend(isoWeek);
147
+ var FONT = "'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif";
148
+ var COLORS = {
149
+ navy: "#0d2a56",
150
+ blue: "#1565c8",
151
+ green: "#0a9a62",
152
+ amber: "#c47c00",
153
+ red: "#cc2a2a",
154
+ purple: "#6b3fbf",
155
+ bg: "transparent",
156
+ surface: "transparent"
157
+ };
158
+ var DEFAULT_ROWS_PER_PAGE = 10;
159
+ var comparator = (a, b, key) => {
160
+ const av = a[key];
161
+ const bv = b[key];
162
+ if (typeof av === "number" && typeof bv === "number") return av - bv;
163
+ return String(av != null ? av : "").localeCompare(String(bv != null ? bv : ""));
164
+ };
165
+ function LoginReportContent() {
166
+ const [startDate, setStartDate] = useState2(dayjs().startOf("day"));
167
+ const [endDate, setEndDate] = useState2(dayjs());
168
+ const [activeQuickDate, setActiveQuickDate] = useState2("today");
169
+ const [searchText, setSearchText] = useState2("");
170
+ const [selectedAgents, setSelectedAgents] = useState2([]);
171
+ const [isAllUsersSelected, setIsAllUsersSelected] = useState2(false);
172
+ const [queues, setQueues] = useState2([]);
173
+ const [selectedQueues, setSelectedQueues] = useState2([]);
174
+ const [reportData, setReportData] = useState2([]);
175
+ const [loading, setLoading] = useState2(false);
176
+ const [error, setError] = useState2("");
177
+ const [page, setPage] = useState2(0);
178
+ const [rowsPerPage, setRowsPerPage] = useState2(DEFAULT_ROWS_PER_PAGE);
179
+ const [totalCount, setTotalCount] = useState2(-1);
180
+ const [sortKey, setSortKey] = useState2("fullName");
181
+ const [sortDir, setSortDir] = useState2("asc");
182
+ const [debouncedSearch, setDebouncedSearch] = useState2("");
183
+ const debounceRef = useRef(void 0);
184
+ useEffect(() => {
185
+ debounceRef.current = setTimeout(() => setDebouncedSearch(searchText.trim()), 400);
186
+ return () => clearTimeout(debounceRef.current);
187
+ }, [searchText]);
188
+ const [dialogOpen, setDialogOpen] = useState2(false);
189
+ const [selectedRow, setSelectedRow] = useState2(null);
190
+ const [sessions, setSessions] = useState2([]);
191
+ const [sessionsLoading, setSessionsLoading] = useState2(false);
192
+ const [regularizeSessionId, setRegularizeSessionId] = useState2(null);
193
+ const [regularizeTime, setRegularizeTime] = useState2(null);
194
+ const [regularizing, setRegularizing] = useState2(false);
195
+ const [regularizeError, setRegularizeError] = useState2("");
196
+ useEffect(() => {
197
+ getQueues().then((data) => setQueues(data || [])).catch(() => setError("Failed to load queues"));
198
+ }, []);
199
+ const handleQuickRangeChange = (range) => {
200
+ setActiveQuickDate(range || null);
201
+ };
202
+ const handleRefresh = () => {
203
+ if (activeQuickDate) {
204
+ const now = dayjs();
205
+ let sd = now.startOf("day");
206
+ const ed = now;
207
+ if (activeQuickDate === "week") sd = now.startOf("week").startOf("day");
208
+ else if (activeQuickDate === "month") sd = now.startOf("month").startOf("day");
209
+ setStartDate(sd);
210
+ setEndDate(ed);
211
+ } else {
212
+ fetchReport(page);
213
+ }
214
+ };
215
+ const fetchReport = useCallback2(
216
+ async (pageNum) => {
217
+ var _a, _b, _c, _d;
218
+ const sd = startDate;
219
+ const ed = endDate;
220
+ if (!sd || !ed) {
221
+ setError("Select a valid date range");
222
+ return;
223
+ }
224
+ const params = {
225
+ start_date: sd.format("YYYY-MM-DDTHH:mm:ss"),
226
+ end_date: ed.format("YYYY-MM-DDTHH:mm:ss"),
227
+ agent_id: !isAllUsersSelected && selectedAgents.length > 0 ? selectedAgents.map((a) => a.userId) : void 0,
228
+ queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : void 0,
229
+ search: debouncedSearch || void 0,
230
+ page: pageNum + 1,
231
+ pageSize: rowsPerPage
232
+ };
233
+ try {
234
+ setError("");
235
+ setLoading(true);
236
+ const res = await getLoginReport(params);
237
+ const agents = deepFindArray(res, ["agents"]);
238
+ setReportData(agents);
239
+ const total = (_d = (_b = res == null ? void 0 : res.total) != null ? _b : (_a = res == null ? void 0 : res.pagination) == null ? void 0 : _a.total) != null ? _d : (_c = res == null ? void 0 : res.summary) == null ? void 0 : _c.totalAgentsLoggedIn;
240
+ setTotalCount(typeof total === "number" ? total : agents.length);
241
+ } catch (err) {
242
+ setError((err == null ? void 0 : err.message) || "Failed to fetch login report");
243
+ setReportData([]);
244
+ } finally {
245
+ setLoading(false);
246
+ }
247
+ },
248
+ [startDate, endDate, selectedAgents, isAllUsersSelected, selectedQueues, debouncedSearch, rowsPerPage]
249
+ );
250
+ useEffect(() => {
251
+ setPage(0);
252
+ fetchReport(0);
253
+ }, [fetchReport]);
254
+ const handlePageChange = useCallback2(
255
+ (_event, newPage) => {
256
+ setPage(newPage);
257
+ fetchReport(newPage);
258
+ },
259
+ [fetchReport]
260
+ );
261
+ const filteredData = useMemo(() => {
262
+ const rows = [...reportData];
263
+ rows.sort((a, b) => {
264
+ const cmp = comparator(a, b, sortKey);
265
+ return sortDir === "asc" ? cmp : -cmp;
266
+ });
267
+ return rows;
268
+ }, [reportData, sortKey, sortDir]);
269
+ const paginatedData = filteredData;
270
+ const handleSort = (key) => {
271
+ if (sortKey === key) {
272
+ setSortDir((d) => d === "asc" ? "desc" : "asc");
273
+ } else {
274
+ setSortKey(key);
275
+ setSortDir("asc");
276
+ }
277
+ };
278
+ const loadSessions = useCallback2(async (agentId) => {
279
+ setSessionsLoading(true);
280
+ try {
281
+ const sd = startDate != null ? startDate : dayjs();
282
+ const ed = endDate != null ? endDate : dayjs();
283
+ const data = await getAgentLoginSessions(agentId, {
284
+ start_date: sd.format("YYYY-MM-DDTHH:mm:ss"),
285
+ end_date: ed.format("YYYY-MM-DDTHH:mm:ss")
286
+ });
287
+ setSessions(data);
288
+ } catch (e) {
289
+ setSessions([]);
290
+ } finally {
291
+ setSessionsLoading(false);
292
+ }
293
+ }, [startDate, endDate]);
294
+ const openDialog = async (row) => {
295
+ setSelectedRow(row);
296
+ setSessions([]);
297
+ setRegularizeSessionId(null);
298
+ setRegularizeError("");
299
+ setDialogOpen(true);
300
+ await loadSessions(row.agentId);
301
+ };
302
+ const closeDialog = () => {
303
+ setDialogOpen(false);
304
+ setTimeout(() => {
305
+ setSelectedRow(null);
306
+ setSessions([]);
307
+ setRegularizeSessionId(null);
308
+ setRegularizeError("");
309
+ }, 300);
310
+ };
311
+ const startRegularize = (session) => {
312
+ if (session.sessionId == null) return;
313
+ setRegularizeError("");
314
+ setRegularizeSessionId(session.sessionId);
315
+ setRegularizeTime(dayjs());
316
+ };
317
+ const cancelRegularize = () => {
318
+ setRegularizeSessionId(null);
319
+ setRegularizeTime(null);
320
+ setRegularizeError("");
321
+ };
322
+ const saveRegularize = async () => {
323
+ if (regularizeSessionId == null || !regularizeTime || !regularizeTime.isValid()) {
324
+ setRegularizeError("Select a valid logout time");
325
+ return;
326
+ }
327
+ try {
328
+ setRegularizing(true);
329
+ setRegularizeError("");
330
+ await regularizeLoginSession(regularizeSessionId, regularizeTime.toISOString());
331
+ cancelRegularize();
332
+ if (selectedRow) await loadSessions(selectedRow.agentId);
333
+ fetchReport(page);
334
+ } catch (err) {
335
+ setRegularizeError((err == null ? void 0 : err.message) || "Failed to regularize login session");
336
+ } finally {
337
+ setRegularizing(false);
338
+ }
339
+ };
340
+ const handleExportExcel = async () => {
341
+ const sd = startDate != null ? startDate : dayjs();
342
+ const ed = endDate != null ? endDate : dayjs();
343
+ const params = {
344
+ start_date: sd.format("YYYY-MM-DDTHH:mm:ss"),
345
+ end_date: ed.format("YYYY-MM-DDTHH:mm:ss"),
346
+ agent_id: !isAllUsersSelected && selectedAgents.length > 0 ? selectedAgents.map((a) => a.userId) : void 0,
347
+ queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : void 0,
348
+ search: debouncedSearch || void 0
349
+ };
350
+ try {
351
+ await exportLoginReportToExcel(params);
352
+ } catch (err) {
353
+ setError((err == null ? void 0 : err.message) || "Failed to export Excel");
354
+ }
355
+ };
356
+ return /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, children: /* @__PURE__ */ jsxs(Box, { sx: { height: "100%", display: "flex", flexDirection: "column", fontFamily: FONT }, children: [
357
+ /* @__PURE__ */ jsx(
358
+ PageHeader,
359
+ {
360
+ title: "Login Report",
361
+ actions: /* @__PURE__ */ jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, children: [
362
+ /* @__PURE__ */ jsx(
363
+ SearchBar,
364
+ {
365
+ value: searchText,
366
+ onChange: (val) => {
367
+ setSearchText(val);
368
+ setPage(0);
369
+ },
370
+ placeholder: "Search name, ID...",
371
+ width: 250
372
+ }
373
+ ),
374
+ /* @__PURE__ */ jsx(
375
+ SDKPermissionGuard,
376
+ {
377
+ permissions: [SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE, SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_EXPORT],
378
+ showFallback: false,
379
+ children: /* @__PURE__ */ jsx(
380
+ AppButton,
381
+ {
382
+ startIcon: /* @__PURE__ */ jsx(DownloadIcon, { sx: { fontSize: "0.95rem !important" } }),
383
+ disabled: !reportData.length,
384
+ onClick: handleExportExcel,
385
+ sx: { height: 36 },
386
+ children: "Export Excel"
387
+ }
388
+ )
389
+ }
390
+ )
391
+ ] })
392
+ }
393
+ ),
394
+ /* @__PURE__ */ jsxs(Box, { sx: { flex: 1, overflow: "auto", py: 0.8, px: 0 }, children: [
395
+ /* @__PURE__ */ jsxs(Box, { sx: { mb: 0.8 }, children: [
396
+ /* @__PURE__ */ jsx(
397
+ ReportFilterBar,
398
+ {
399
+ startDate,
400
+ endDate,
401
+ onStartChange: setStartDate,
402
+ onEndChange: setEndDate,
403
+ quickRange: activeQuickDate || "",
404
+ onQuickRangeChange: handleQuickRangeChange,
405
+ showAgentSelect: true,
406
+ selectedAgents,
407
+ onAgentsChange: setSelectedAgents,
408
+ setIsAllUsersSelected,
409
+ showQueueSelect: true,
410
+ queues,
411
+ selectedQueues,
412
+ onQueuesChange: setSelectedQueues,
413
+ extra: /* @__PURE__ */ jsx(
414
+ AppButton,
415
+ {
416
+ startIcon: /* @__PURE__ */ jsx(RefreshIcon, { sx: { fontSize: "0.9rem !important" } }),
417
+ disabled: loading,
418
+ onClick: handleRefresh,
419
+ sx: { height: 32 },
420
+ children: "Refresh"
421
+ }
422
+ )
423
+ }
424
+ ),
425
+ error && /* @__PURE__ */ jsx(Alert, { severity: "error", sx: { mt: 1, fontFamily: FONT, fontSize: "0.78rem" }, children: error })
426
+ ] }),
427
+ loading && /* @__PURE__ */ jsx(Box, { sx: { textAlign: "center", py: 2.5 }, children: /* @__PURE__ */ jsx(CircularProgress, { sx: { color: COLORS.blue }, size: 28 }) }),
428
+ /* @__PURE__ */ jsxs(
429
+ Paper,
430
+ {
431
+ elevation: 0,
432
+ sx: {
433
+ borderRadius: "8px",
434
+ border: "1px solid #e0e7ef",
435
+ overflow: "hidden",
436
+ mb: 2
437
+ },
438
+ children: [
439
+ /* @__PURE__ */ jsx(TableContainer, { children: /* @__PURE__ */ jsxs(
440
+ Table,
441
+ {
442
+ size: "small",
443
+ sx: {
444
+ minWidth: 1100,
445
+ fontFamily: FONT,
446
+ "& .MuiTableCell-root": {
447
+ fontFamily: FONT,
448
+ fontSize: "0.75rem",
449
+ borderBottom: "1px solid #eef1f6",
450
+ py: 0.6,
451
+ px: 1
452
+ }
453
+ },
454
+ children: [
455
+ /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsx(TableRow, { children: [
456
+ { id: "fullName", label: "User Name" },
457
+ { id: "agentId", label: "User ID" },
458
+ { id: "queueNames", label: "Queues" },
459
+ { id: "numLogins", label: "Logins" },
460
+ { id: "firstLoginTime", label: "First Login" },
461
+ { id: "lastLogoutTime", label: "Last Logout" },
462
+ { id: "workingDurationFormatted", label: "Working Duration" },
463
+ { id: "breakDurationFormatted", label: "Break Duration" },
464
+ { id: "loginDurationFormatted", label: "Login Duration" },
465
+ { id: "utilisationPct", label: "Utilisation %" }
466
+ ].map((col) => /* @__PURE__ */ jsx(TableCell, { sx: headCellSx, children: /* @__PURE__ */ jsx(
467
+ TableSortLabel,
468
+ {
469
+ active: sortKey === col.id,
470
+ direction: sortKey === col.id ? sortDir : "asc",
471
+ onClick: () => handleSort(col.id),
472
+ sx: {
473
+ "&.MuiTableSortLabel-root": { color: "#333" },
474
+ "&.MuiTableSortLabel-root:hover": { color: "#555" },
475
+ "&.Mui-active": { color: "#333" },
476
+ "& .MuiTableSortLabel-icon": { color: "#333 !important" }
477
+ },
478
+ children: col.label
479
+ }
480
+ ) }, col.id)) }) }),
481
+ /* @__PURE__ */ jsx(TableBody, { children: paginatedData.map((row, idx) => {
482
+ const isLoggedIn = !row.lastLogoutTime;
483
+ return /* @__PURE__ */ jsxs(
484
+ TableRow,
485
+ {
486
+ hover: true,
487
+ sx: {
488
+ backgroundColor: "#fff",
489
+ "&:hover": { backgroundColor: "#f0f7f8" }
490
+ },
491
+ children: [
492
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontWeight: 600, color: COLORS.navy, fontSize: "0.75rem" }, children: row.fullName || "\u2014" }),
493
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.73rem", color: "#4a5568" }, children: row.agentId || "\u2014" }),
494
+ /* @__PURE__ */ jsx(TableCell, { children: row.queueNames ? /* @__PURE__ */ jsx(
495
+ Chip,
496
+ {
497
+ label: row.queueNames,
498
+ size: "small",
499
+ sx: {
500
+ fontFamily: FONT,
501
+ backgroundColor: "#f0ebfa",
502
+ color: COLORS.purple,
503
+ fontWeight: 500,
504
+ fontSize: "0.67rem",
505
+ height: 22
506
+ }
507
+ }
508
+ ) : "\u2014" }),
509
+ /* @__PURE__ */ jsx(TableCell, { sx: { textAlign: "center" }, children: /* @__PURE__ */ jsx(
510
+ Chip,
511
+ {
512
+ label: row.numLogins,
513
+ size: "small",
514
+ onClick: (e) => {
515
+ e.stopPropagation();
516
+ openDialog(row);
517
+ },
518
+ sx: {
519
+ fontFamily: FONT,
520
+ backgroundColor: COLORS.navy,
521
+ color: "#fff",
522
+ fontWeight: 600,
523
+ minWidth: 28,
524
+ height: 20,
525
+ fontSize: "0.67rem",
526
+ cursor: "pointer",
527
+ "&:hover": { backgroundColor: COLORS.blue }
528
+ }
529
+ }
530
+ ) }),
531
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.73rem", color: "#4a5568" }, children: row.firstLoginTime ? dayjs(row.firstLoginTime).format("DD MMM YYYY hh:mm A") : "\u2014" }),
532
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.73rem", color: "#4a5568" }, children: isLoggedIn ? /* @__PURE__ */ jsx(
533
+ Chip,
534
+ {
535
+ label: "LOGGED-IN",
536
+ size: "small",
537
+ sx: {
538
+ fontFamily: FONT,
539
+ backgroundColor: COLORS.green,
540
+ color: "#fff",
541
+ fontWeight: 600,
542
+ fontSize: "0.65rem",
543
+ height: 20
544
+ }
545
+ }
546
+ ) : dayjs(row.lastLogoutTime).format("DD MMM YYYY hh:mm A") }),
547
+ /* @__PURE__ */ jsx(
548
+ TableCell,
549
+ {
550
+ sx: { fontWeight: 600, color: COLORS.blue, fontSize: "0.75rem", fontVariantNumeric: "tabular-nums" },
551
+ children: row.workingDurationFormatted || "\u2014"
552
+ }
553
+ ),
554
+ /* @__PURE__ */ jsx(
555
+ TableCell,
556
+ {
557
+ sx: { fontWeight: 500, color: COLORS.amber, fontSize: "0.75rem", fontVariantNumeric: "tabular-nums" },
558
+ children: row.breakDurationFormatted || "\u2014"
559
+ }
560
+ ),
561
+ /* @__PURE__ */ jsx(TableCell, { sx: { fontWeight: 500, fontSize: "0.75rem", fontVariantNumeric: "tabular-nums" }, children: row.loginDurationFormatted || "\u2014" }),
562
+ /* @__PURE__ */ jsx(TableCell, { sx: { minWidth: 120 }, children: row.utilisationPct != null ? (() => {
563
+ const pct = Math.min(row.utilisationPct, 100);
564
+ const barColor = pct >= 80 ? "#10b981" : pct >= 60 ? "#f59e0b" : "#ef4444";
565
+ const bgTint = pct >= 80 ? "#d1fae5" : pct >= 60 ? "#fef3c7" : "#fee2e2";
566
+ return /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 0.8 }, children: [
567
+ /* @__PURE__ */ jsx(
568
+ Box,
569
+ {
570
+ sx: {
571
+ position: "relative",
572
+ flex: 1,
573
+ height: 7,
574
+ borderRadius: 4,
575
+ backgroundColor: bgTint,
576
+ overflow: "hidden"
577
+ },
578
+ children: /* @__PURE__ */ jsx(
579
+ Box,
580
+ {
581
+ sx: {
582
+ width: `${pct}%`,
583
+ height: "100%",
584
+ borderRadius: 4,
585
+ background: `linear-gradient(90deg, ${barColor}cc, ${barColor})`,
586
+ transition: "width 0.4s ease"
587
+ }
588
+ }
589
+ )
590
+ }
591
+ ),
592
+ /* @__PURE__ */ jsx(
593
+ Chip,
594
+ {
595
+ label: `${Math.round(pct)}%`,
596
+ size: "small",
597
+ sx: {
598
+ fontFamily: FONT,
599
+ height: 18,
600
+ minWidth: 38,
601
+ fontSize: "0.63rem",
602
+ fontWeight: 700,
603
+ backgroundColor: bgTint,
604
+ color: barColor,
605
+ "& .MuiChip-label": { px: 0.6 }
606
+ }
607
+ }
608
+ )
609
+ ] });
610
+ })() : "\u2014" })
611
+ ]
612
+ },
613
+ `${row.agentId}-${idx}`
614
+ );
615
+ }) })
616
+ ]
617
+ }
618
+ ) }),
619
+ /* @__PURE__ */ jsx(
620
+ TablePagination,
621
+ {
622
+ component: "div",
623
+ count: totalCount,
624
+ page,
625
+ onPageChange: handlePageChange,
626
+ rowsPerPage,
627
+ rowsPerPageOptions: [10, 15, 25, 50, 100],
628
+ onRowsPerPageChange: (e) => {
629
+ setRowsPerPage(parseInt(e.target.value, 10));
630
+ setPage(0);
631
+ },
632
+ sx: { borderTop: "1px solid #eef1f6", fontFamily: FONT, "& .MuiTablePagination-displayedRows": { fontFamily: FONT, fontSize: "0.73rem" }, "& .MuiTablePagination-selectLabel": { fontFamily: FONT, fontSize: "0.73rem" } }
633
+ }
634
+ )
635
+ ]
636
+ }
637
+ ),
638
+ /* @__PURE__ */ jsxs(
639
+ Dialog,
640
+ {
641
+ open: dialogOpen,
642
+ onClose: (_e, reason) => {
643
+ if (reason !== "backdropClick") closeDialog();
644
+ },
645
+ maxWidth: "md",
646
+ fullWidth: true,
647
+ PaperProps: {
648
+ sx: {
649
+ borderRadius: "12px",
650
+ fontFamily: FONT,
651
+ overflow: "hidden",
652
+ boxShadow: "0 8px 32px rgba(0,0,0,0.18)",
653
+ maxWidth: 450
654
+ }
655
+ },
656
+ children: [
657
+ /* @__PURE__ */ jsxs(
658
+ DialogTitle,
659
+ {
660
+ sx: {
661
+ fontFamily: FONT,
662
+ background: "linear-gradient(135deg, var(--primary-color-dark, #14505b), var(--primary-color, #1A5F6C))",
663
+ color: "#fff",
664
+ display: "flex",
665
+ justifyContent: "space-between",
666
+ alignItems: "center",
667
+ py: 1.5,
668
+ px: 2.5
669
+ },
670
+ children: [
671
+ /* @__PURE__ */ jsxs(Box, { children: [
672
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", sx: { fontFamily: FONT, fontWeight: 700, fontSize: "0.95rem", letterSpacing: "0.3px" }, children: "Login Sessions" }),
673
+ /* @__PURE__ */ jsxs(
674
+ Typography,
675
+ {
676
+ variant: "body2",
677
+ sx: { fontFamily: FONT, opacity: 0.9, fontSize: "0.76rem", mt: 0.3 },
678
+ children: [
679
+ selectedRow == null ? void 0 : selectedRow.fullName,
680
+ " \u2022 ",
681
+ selectedRow == null ? void 0 : selectedRow.numLogins,
682
+ " session",
683
+ (selectedRow == null ? void 0 : selectedRow.numLogins) !== 1 ? "s" : ""
684
+ ]
685
+ }
686
+ )
687
+ ] }),
688
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
689
+ /* @__PURE__ */ jsx(
690
+ AppButton,
691
+ {
692
+ size: "small",
693
+ startIcon: /* @__PURE__ */ jsx(DownloadIcon, { sx: { fontSize: "0.85rem !important" } }),
694
+ onClick: async () => {
695
+ if (!selectedRow) return;
696
+ try {
697
+ await exportAgentLoginSessionsToExcel(selectedRow.agentId, {
698
+ start_date: (startDate != null ? startDate : dayjs()).format("YYYY-MM-DDTHH:mm:ss"),
699
+ end_date: (endDate != null ? endDate : dayjs()).format("YYYY-MM-DDTHH:mm:ss")
700
+ });
701
+ } catch (err) {
702
+ setError((err == null ? void 0 : err.message) || "Failed to export Excel");
703
+ }
704
+ },
705
+ sx: { whiteSpace: "nowrap" },
706
+ children: "Export to Excel"
707
+ }
708
+ ),
709
+ /* @__PURE__ */ jsx(
710
+ IconButton,
711
+ {
712
+ onClick: closeDialog,
713
+ size: "small",
714
+ sx: {
715
+ color: "#fff",
716
+ backgroundColor: "rgba(255,255,255,0.1)",
717
+ "&:hover": { backgroundColor: "rgba(255,255,255,0.2)" }
718
+ },
719
+ children: /* @__PURE__ */ jsx(CloseIcon, { fontSize: "small" })
720
+ }
721
+ )
722
+ ] })
723
+ ]
724
+ }
725
+ ),
726
+ /* @__PURE__ */ jsx(DialogContent, { sx: { p: 0, backgroundColor: "#f8fafb" }, children: sessionsLoading ? /* @__PURE__ */ jsx(Box, { sx: { p: 4, textAlign: "center" }, children: /* @__PURE__ */ jsx(CircularProgress, { size: 28, sx: { color: "var(--primary-color, #1A5F6C)" } }) }) : sessions.length > 0 ? /* @__PURE__ */ jsx(Box, { sx: { p: 1.5, maxHeight: 300, overflowY: "auto" }, children: Object.entries(
727
+ sessions.reduce((acc, s) => {
728
+ const dateKey = s.loginTime ? dayjs(s.loginTime).format("DD MMM YYYY") : "Unknown Date";
729
+ if (!acc[dateKey]) acc[dateKey] = [];
730
+ acc[dateKey].push(s);
731
+ return acc;
732
+ }, {})
733
+ ).map(([date, dateSessions]) => /* @__PURE__ */ jsxs(
734
+ Paper,
735
+ {
736
+ elevation: 0,
737
+ sx: {
738
+ mb: 1.5,
739
+ borderRadius: "10px",
740
+ border: "1px solid #e4eaf0",
741
+ overflow: "hidden",
742
+ backgroundColor: "#fff"
743
+ },
744
+ children: [
745
+ /* @__PURE__ */ jsx(
746
+ Box,
747
+ {
748
+ sx: {
749
+ px: 1.5,
750
+ py: 0.8,
751
+ backgroundColor: "#f0f5f4",
752
+ borderBottom: "1px solid #e4eaf0"
753
+ },
754
+ children: /* @__PURE__ */ jsx(
755
+ Typography,
756
+ {
757
+ sx: {
758
+ fontFamily: FONT,
759
+ fontWeight: 700,
760
+ fontSize: "0.8rem",
761
+ color: "var(--primary-color-dark, #14505b)",
762
+ letterSpacing: "0.3px"
763
+ },
764
+ children: date
765
+ }
766
+ )
767
+ }
768
+ ),
769
+ /* @__PURE__ */ jsxs(Box, { sx: { px: 1.5, py: 1 }, children: [
770
+ /* @__PURE__ */ jsxs(
771
+ Box,
772
+ {
773
+ sx: {
774
+ display: "flex",
775
+ alignItems: "center",
776
+ gap: 2,
777
+ pb: 0.5,
778
+ mb: 0.5,
779
+ borderBottom: "1px solid #e4eaf0"
780
+ },
781
+ children: [
782
+ /* @__PURE__ */ jsx(
783
+ Typography,
784
+ {
785
+ sx: {
786
+ flex: 1,
787
+ fontFamily: FONT,
788
+ fontSize: "0.72rem",
789
+ fontWeight: 700,
790
+ color: "#555",
791
+ textTransform: "uppercase",
792
+ letterSpacing: "0.5px"
793
+ },
794
+ children: "Login"
795
+ }
796
+ ),
797
+ /* @__PURE__ */ jsx(
798
+ Typography,
799
+ {
800
+ sx: {
801
+ flex: 1,
802
+ fontFamily: FONT,
803
+ fontSize: "0.72rem",
804
+ fontWeight: 700,
805
+ color: "#555",
806
+ textTransform: "uppercase",
807
+ letterSpacing: "0.5px"
808
+ },
809
+ children: "Logout"
810
+ }
811
+ )
812
+ ]
813
+ }
814
+ ),
815
+ dateSessions.map((s, i) => {
816
+ const isOpenSession = !s.logoutTime;
817
+ const isEditing = s.sessionId != null && regularizeSessionId === s.sessionId;
818
+ return /* @__PURE__ */ jsxs(
819
+ Box,
820
+ {
821
+ sx: {
822
+ py: 0.6,
823
+ borderBottom: i < dateSessions.length - 1 ? "1px dashed #e8ecf0" : "none"
824
+ },
825
+ children: [
826
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 2 }, children: [
827
+ /* @__PURE__ */ jsxs(
828
+ Typography,
829
+ {
830
+ component: "span",
831
+ sx: {
832
+ flex: 1,
833
+ fontFamily: FONT,
834
+ fontSize: "0.78rem",
835
+ fontWeight: 500,
836
+ color: s.loginTime ? COLORS.green : "#9e9e9e",
837
+ display: "flex",
838
+ alignItems: "center",
839
+ gap: 0.4
840
+ },
841
+ children: [
842
+ /* @__PURE__ */ jsx("span", { style: { fontSize: "0.9rem" }, children: "\u2199" }),
843
+ s.loginTime ? dayjs(s.loginTime).format("DD MMM YYYY h:mm:ss A") : "Missing"
844
+ ]
845
+ }
846
+ ),
847
+ /* @__PURE__ */ jsxs(Box, { sx: { flex: 1, display: "flex", alignItems: "center", justifyContent: "space-between", gap: 0.4 }, children: [
848
+ /* @__PURE__ */ jsxs(
849
+ Typography,
850
+ {
851
+ component: "span",
852
+ sx: {
853
+ fontFamily: FONT,
854
+ fontSize: "0.78rem",
855
+ fontWeight: 500,
856
+ color: s.logoutTime ? COLORS.red : "#9e9e9e",
857
+ display: "flex",
858
+ alignItems: "center",
859
+ gap: 0.4
860
+ },
861
+ children: [
862
+ /* @__PURE__ */ jsx("span", { style: { fontSize: "0.9rem" }, children: "\u2197" }),
863
+ s.logoutTime ? dayjs(s.logoutTime).format("DD MMM YYYY h:mm:ss A") : "Missing"
864
+ ]
865
+ }
866
+ ),
867
+ isOpenSession && s.sessionId != null && !isEditing && /* @__PURE__ */ jsx(
868
+ SDKPermissionGuard,
869
+ {
870
+ permissions: [SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE],
871
+ showFallback: false,
872
+ children: /* @__PURE__ */ jsx(Tooltip, { title: "Regularize \u2014 set logout time", children: /* @__PURE__ */ jsx(
873
+ IconButton,
874
+ {
875
+ size: "small",
876
+ onClick: () => startRegularize(s),
877
+ sx: {
878
+ p: 0.4,
879
+ color: "var(--primary-color, #1A5F6C)",
880
+ borderRadius: "6px",
881
+ "&:hover": { backgroundColor: "rgba(26,95,108,0.08)" }
882
+ },
883
+ children: /* @__PURE__ */ jsx(EditCalendarIcon, { sx: { fontSize: "1.05rem" } })
884
+ }
885
+ ) })
886
+ }
887
+ )
888
+ ] })
889
+ ] }),
890
+ isEditing && /* @__PURE__ */ jsxs(
891
+ Box,
892
+ {
893
+ sx: {
894
+ mt: 1,
895
+ p: 1.25,
896
+ borderRadius: "10px",
897
+ backgroundColor: "#f0f5f4",
898
+ border: "1px solid #d7e3e1"
899
+ },
900
+ children: [
901
+ /* @__PURE__ */ jsx(
902
+ Typography,
903
+ {
904
+ sx: {
905
+ fontFamily: FONT,
906
+ fontSize: "0.68rem",
907
+ fontWeight: 700,
908
+ textTransform: "uppercase",
909
+ letterSpacing: "0.5px",
910
+ color: "var(--primary-color-dark, #14505b)",
911
+ mb: 0.75
912
+ },
913
+ children: "Set Logout Time"
914
+ }
915
+ ),
916
+ /* @__PURE__ */ jsx(
917
+ DateTimePicker,
918
+ {
919
+ value: regularizeTime,
920
+ onChange: (val) => setRegularizeTime(val),
921
+ minDateTime: s.loginTime ? dayjs(s.loginTime) : void 0,
922
+ maxDateTime: dayjs(),
923
+ ampm: true,
924
+ format: "DD MMM YYYY hh:mm A",
925
+ slotProps: {
926
+ textField: {
927
+ size: "small",
928
+ fullWidth: true,
929
+ sx: {
930
+ backgroundColor: "#fff",
931
+ "& .MuiOutlinedInput-root": {
932
+ borderRadius: "8px",
933
+ fontFamily: FONT,
934
+ fontSize: "0.8rem",
935
+ "&.Mui-focused fieldset": { borderColor: "var(--primary-color, #1A5F6C)" }
936
+ }
937
+ }
938
+ },
939
+ actionBar: { actions: ["clear", "cancel", "accept"] }
940
+ }
941
+ }
942
+ ),
943
+ regularizeError && /* @__PURE__ */ jsx(Typography, { sx: { fontFamily: FONT, color: COLORS.red, fontSize: "0.7rem", mt: 0.6 }, children: regularizeError }),
944
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", justifyContent: "flex-end", spacing: 1, sx: { mt: 1 }, children: [
945
+ /* @__PURE__ */ jsx(
946
+ AppButton,
947
+ {
948
+ variant: "cancel",
949
+ size: "small",
950
+ onClick: cancelRegularize,
951
+ disabled: regularizing,
952
+ children: "Cancel"
953
+ }
954
+ ),
955
+ /* @__PURE__ */ jsx(
956
+ AppButton,
957
+ {
958
+ size: "small",
959
+ onClick: saveRegularize,
960
+ disabled: regularizing,
961
+ startIcon: regularizing ? /* @__PURE__ */ jsx(CircularProgress, { size: 14, sx: { color: "#fff" } }) : /* @__PURE__ */ jsx(CheckIcon, { sx: { fontSize: "0.95rem !important" } }),
962
+ children: regularizing ? "Saving\u2026" : "Regularize"
963
+ }
964
+ )
965
+ ] })
966
+ ]
967
+ }
968
+ )
969
+ ]
970
+ },
971
+ i
972
+ );
973
+ })
974
+ ] })
975
+ ]
976
+ },
977
+ date
978
+ )) }) : /* @__PURE__ */ jsx(Box, { sx: { p: 4, textAlign: "center" }, children: /* @__PURE__ */ jsx(Typography, { sx: { fontFamily: FONT, color: "#9e9e9e", fontStyle: "italic", fontSize: "0.82rem" }, children: "No sessions found" }) }) })
979
+ ]
980
+ }
981
+ )
982
+ ] })
983
+ ] }) });
984
+ }
985
+ var LoginReport = () => /* @__PURE__ */ jsx(SDKProvider, { children: /* @__PURE__ */ jsx(LoginReportContent, {}) });
986
+ var loginReport_default = LoginReport;
987
+ export {
988
+ loginReport_default as default
989
+ };
990
+ //# sourceMappingURL=loginReport-F47GUU53.mjs.map