ahs-cti 0.0.3 → 0.0.4

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 (52) hide show
  1. package/dist/{agentDetailReport-CP7WYOIX.mjs → agentDetailReport-JYBV3TF6.mjs} +5 -4
  2. package/dist/{agentPerformanceReport-F52KNRKW.mjs → agentPerformanceReport-6RO6STKU.mjs} +10 -8
  3. package/dist/{agentPerformanceReport-F52KNRKW.mjs.map → agentPerformanceReport-6RO6STKU.mjs.map} +1 -1
  4. package/dist/{auditReport-CJ23LXIZ.mjs → auditReport-PYRZU3NA.mjs} +3 -3
  5. package/dist/{callHistory-ZA3SCD7K.mjs → callHistory-4JI64TU7.mjs} +24 -7
  6. package/dist/callHistory-4JI64TU7.mjs.map +1 -0
  7. package/dist/{campaigns-PIXRNMM4.mjs → campaigns-JZE22SIM.mjs} +150 -70
  8. package/dist/campaigns-JZE22SIM.mjs.map +1 -0
  9. package/dist/{cdrReport-7TKZERRX.mjs → cdrReport-RJTURVVV.mjs} +49 -19
  10. package/dist/cdrReport-RJTURVVV.mjs.map +1 -0
  11. package/dist/{chunk-X376SOIZ.mjs → chunk-AJQBR3AZ.mjs} +14279 -9170
  12. package/dist/chunk-AJQBR3AZ.mjs.map +1 -0
  13. package/dist/{chunk-BU6FMNBY.mjs → chunk-ATAP77RC.mjs} +2 -2
  14. package/dist/{chunk-JAAPNDP2.mjs → chunk-BDQZYTAY.mjs} +32 -34
  15. package/dist/chunk-BDQZYTAY.mjs.map +1 -0
  16. package/dist/{chunk-NQL4VODC.mjs → chunk-FVVDDZCA.mjs} +2 -2
  17. package/dist/chunk-HAJ6SECI.mjs +418 -0
  18. package/dist/chunk-HAJ6SECI.mjs.map +1 -0
  19. package/dist/{chunk-L4LLUMYA.mjs → chunk-IBFF6DJA.mjs} +2 -2
  20. package/dist/chunk-JOZ4YQMR.mjs +116 -0
  21. package/dist/chunk-JOZ4YQMR.mjs.map +1 -0
  22. package/dist/{chunk-DBSNJ3QH.mjs → chunk-OVC42HVH.mjs} +4 -1
  23. package/dist/chunk-OVC42HVH.mjs.map +1 -0
  24. package/dist/{chunk-NUYGQI7D.mjs → chunk-PO6POUPL.mjs} +2 -2
  25. package/dist/{chunk-VZCHJLAW.mjs → chunk-UNTGXE6T.mjs} +2 -2
  26. package/dist/index.js +5955 -5685
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +16 -16
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/{liveStatus-IQIEZZE5.mjs → liveStatus-E7UP37FK.mjs} +4 -4
  31. package/dist/{loginReport-A4GUPW3G.mjs → loginReport-5QYHG6OM.mjs} +219 -66
  32. package/dist/loginReport-5QYHG6OM.mjs.map +1 -0
  33. package/dist/{managementDashboard-345DQMNO.mjs → managementDashboard-PARD3QHL.mjs} +8 -6
  34. package/dist/{managementDashboard-345DQMNO.mjs.map → managementDashboard-PARD3QHL.mjs.map} +1 -1
  35. package/package.json +1 -1
  36. package/dist/callHistory-ZA3SCD7K.mjs.map +0 -1
  37. package/dist/campaigns-PIXRNMM4.mjs.map +0 -1
  38. package/dist/cdrReport-7TKZERRX.mjs.map +0 -1
  39. package/dist/chunk-DBSNJ3QH.mjs.map +0 -1
  40. package/dist/chunk-GC3WM33W.mjs +0 -5783
  41. package/dist/chunk-GC3WM33W.mjs.map +0 -1
  42. package/dist/chunk-JAAPNDP2.mjs.map +0 -1
  43. package/dist/chunk-X376SOIZ.mjs.map +0 -1
  44. package/dist/loginReport-A4GUPW3G.mjs.map +0 -1
  45. /package/dist/{agentDetailReport-CP7WYOIX.mjs.map → agentDetailReport-JYBV3TF6.mjs.map} +0 -0
  46. /package/dist/{auditReport-CJ23LXIZ.mjs.map → auditReport-PYRZU3NA.mjs.map} +0 -0
  47. /package/dist/{chunk-BU6FMNBY.mjs.map → chunk-ATAP77RC.mjs.map} +0 -0
  48. /package/dist/{chunk-NQL4VODC.mjs.map → chunk-FVVDDZCA.mjs.map} +0 -0
  49. /package/dist/{chunk-L4LLUMYA.mjs.map → chunk-IBFF6DJA.mjs.map} +0 -0
  50. /package/dist/{chunk-NUYGQI7D.mjs.map → chunk-PO6POUPL.mjs.map} +0 -0
  51. /package/dist/{chunk-VZCHJLAW.mjs.map → chunk-UNTGXE6T.mjs.map} +0 -0
  52. /package/dist/{liveStatus-IQIEZZE5.mjs.map → liveStatus-E7UP37FK.mjs.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  useCallMonitoring
3
- } from "./chunk-BU6FMNBY.mjs";
3
+ } from "./chunk-ATAP77RC.mjs";
4
4
  import {
5
5
  SDKPermissionGuard
6
- } from "./chunk-NQL4VODC.mjs";
6
+ } from "./chunk-FVVDDZCA.mjs";
7
7
  import {
8
8
  SDKProvider,
9
9
  useToast
@@ -12,7 +12,7 @@ import {
12
12
  END_POINT,
13
13
  SDK_PERMISSIONS,
14
14
  axios_default
15
- } from "./chunk-DBSNJ3QH.mjs";
15
+ } from "./chunk-OVC42HVH.mjs";
16
16
  import {
17
17
  __spreadProps,
18
18
  __spreadValues
@@ -1074,4 +1074,4 @@ function LiveStatusPage(props) {
1074
1074
  export {
1075
1075
  LiveStatusPage as default
1076
1076
  };
1077
- //# sourceMappingURL=liveStatus-IQIEZZE5.mjs.map
1077
+ //# sourceMappingURL=liveStatus-E7UP37FK.mjs.map
@@ -2,18 +2,21 @@ import {
2
2
  ReportFilterBar,
3
3
  SearchBar,
4
4
  headCellSx
5
- } from "./chunk-GC3WM33W.mjs";
5
+ } from "./chunk-HAJ6SECI.mjs";
6
6
  import {
7
7
  SDKPermissionGuard
8
- } from "./chunk-NQL4VODC.mjs";
8
+ } from "./chunk-FVVDDZCA.mjs";
9
9
  import {
10
- AdapterDayjs,
11
- LocalizationProvider,
12
10
  PageHeader
13
- } from "./chunk-X376SOIZ.mjs";
11
+ } from "./chunk-JOZ4YQMR.mjs";
14
12
  import {
15
13
  AppButton
16
14
  } from "./chunk-HBR2JS4C.mjs";
15
+ import {
16
+ AdapterDayjs,
17
+ DateTimePicker,
18
+ LocalizationProvider
19
+ } from "./chunk-AJQBR3AZ.mjs";
17
20
  import {
18
21
  SDKProvider
19
22
  } from "./chunk-6ICPXSN6.mjs";
@@ -22,7 +25,7 @@ import {
22
25
  SDK_PERMISSIONS,
23
26
  axios_default,
24
27
  deepFindArray
25
- } from "./chunk-DBSNJ3QH.mjs";
28
+ } from "./chunk-OVC42HVH.mjs";
26
29
  import "./chunk-UB5HSUGK.mjs";
27
30
 
28
31
  // call-control-sdk/lib/pages/loginReport/index.tsx
@@ -46,9 +49,12 @@ import {
46
49
  TableRow,
47
50
  TablePagination,
48
51
  TableSortLabel,
52
+ Tooltip,
49
53
  Typography
50
54
  } from "@mui/material";
51
55
  import CloseIcon from "@mui/icons-material/Close";
56
+ import CheckIcon from "@mui/icons-material/Check";
57
+ import EditCalendarIcon from "@mui/icons-material/EditCalendar";
52
58
  import DownloadIcon from "@mui/icons-material/Download";
53
59
  import RefreshIcon from "@mui/icons-material/Refresh";
54
60
  import dayjs from "dayjs";
@@ -78,6 +84,9 @@ async function getAgentLoginSessions(agentId, params) {
78
84
  );
79
85
  return Array.isArray(res.data) ? res.data : [];
80
86
  }
87
+ async function regularizeLoginSession(sessionId, logoutTime) {
88
+ await axios_default.patch(END_POINT.LOGIN_REPORT_REGULARIZE_SESSION(sessionId), { sessionId, logoutTime });
89
+ }
81
90
  async function exportLoginReportToExcel(params) {
82
91
  var _a;
83
92
  const qs = buildLoginReportQueryString(params);
@@ -171,6 +180,10 @@ function LoginReportContent() {
171
180
  const [selectedRow, setSelectedRow] = useState2(null);
172
181
  const [sessions, setSessions] = useState2([]);
173
182
  const [sessionsLoading, setSessionsLoading] = useState2(false);
183
+ const [regularizeSessionId, setRegularizeSessionId] = useState2(null);
184
+ const [regularizeTime, setRegularizeTime] = useState2(null);
185
+ const [regularizing, setRegularizing] = useState2(false);
186
+ const [regularizeError, setRegularizeError] = useState2("");
174
187
  useEffect(() => {
175
188
  getQueues().then((data) => setQueues(data || [])).catch(() => setError("Failed to load queues"));
176
189
  }, []);
@@ -253,15 +266,12 @@ function LoginReportContent() {
253
266
  setSortDir("asc");
254
267
  }
255
268
  };
256
- const openDialog = async (row) => {
257
- setSelectedRow(row);
258
- setSessions([]);
259
- setDialogOpen(true);
269
+ const loadSessions = useCallback2(async (agentId) => {
260
270
  setSessionsLoading(true);
261
271
  try {
262
272
  const sd = startDate != null ? startDate : dayjs();
263
273
  const ed = endDate != null ? endDate : dayjs();
264
- const data = await getAgentLoginSessions(row.agentId, {
274
+ const data = await getAgentLoginSessions(agentId, {
265
275
  start_date: sd.format("YYYY-MM-DDTHH:mm:ss"),
266
276
  end_date: ed.format("YYYY-MM-DDTHH:mm:ss")
267
277
  });
@@ -271,14 +281,53 @@ function LoginReportContent() {
271
281
  } finally {
272
282
  setSessionsLoading(false);
273
283
  }
284
+ }, [startDate, endDate]);
285
+ const openDialog = async (row) => {
286
+ setSelectedRow(row);
287
+ setSessions([]);
288
+ setRegularizeSessionId(null);
289
+ setRegularizeError("");
290
+ setDialogOpen(true);
291
+ await loadSessions(row.agentId);
274
292
  };
275
293
  const closeDialog = () => {
276
294
  setDialogOpen(false);
277
295
  setTimeout(() => {
278
296
  setSelectedRow(null);
279
297
  setSessions([]);
298
+ setRegularizeSessionId(null);
299
+ setRegularizeError("");
280
300
  }, 300);
281
301
  };
302
+ const startRegularize = (session) => {
303
+ if (session.sessionId == null) return;
304
+ setRegularizeError("");
305
+ setRegularizeSessionId(session.sessionId);
306
+ setRegularizeTime(dayjs());
307
+ };
308
+ const cancelRegularize = () => {
309
+ setRegularizeSessionId(null);
310
+ setRegularizeTime(null);
311
+ setRegularizeError("");
312
+ };
313
+ const saveRegularize = async () => {
314
+ if (regularizeSessionId == null || !regularizeTime || !regularizeTime.isValid()) {
315
+ setRegularizeError("Select a valid logout time");
316
+ return;
317
+ }
318
+ try {
319
+ setRegularizing(true);
320
+ setRegularizeError("");
321
+ await regularizeLoginSession(regularizeSessionId, regularizeTime.toISOString());
322
+ cancelRegularize();
323
+ if (selectedRow) await loadSessions(selectedRow.agentId);
324
+ fetchReport(page);
325
+ } catch (err) {
326
+ setRegularizeError((err == null ? void 0 : err.message) || "Failed to regularize login session");
327
+ } finally {
328
+ setRegularizing(false);
329
+ }
330
+ };
282
331
  const handleExportExcel = async () => {
283
332
  const sd = startDate != null ? startDate : dayjs();
284
333
  const ed = endDate != null ? endDate : dayjs();
@@ -754,61 +803,165 @@ function LoginReportContent() {
754
803
  ]
755
804
  }
756
805
  ),
757
- dateSessions.map((s, i) => /* @__PURE__ */ jsxs(
758
- Box,
759
- {
760
- sx: {
761
- display: "flex",
762
- alignItems: "center",
763
- gap: 2,
764
- py: 0.6,
765
- borderBottom: i < dateSessions.length - 1 ? "1px dashed #e8ecf0" : "none"
806
+ dateSessions.map((s, i) => {
807
+ const isOpenSession = !s.logoutTime;
808
+ const isEditing = s.sessionId != null && regularizeSessionId === s.sessionId;
809
+ return /* @__PURE__ */ jsxs(
810
+ Box,
811
+ {
812
+ sx: {
813
+ py: 0.6,
814
+ borderBottom: i < dateSessions.length - 1 ? "1px dashed #e8ecf0" : "none"
815
+ },
816
+ children: [
817
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 2 }, children: [
818
+ /* @__PURE__ */ jsxs(
819
+ Typography,
820
+ {
821
+ component: "span",
822
+ sx: {
823
+ flex: 1,
824
+ fontFamily: FONT,
825
+ fontSize: "0.78rem",
826
+ fontWeight: 500,
827
+ color: s.loginTime ? COLORS.green : "#9e9e9e",
828
+ display: "flex",
829
+ alignItems: "center",
830
+ gap: 0.4
831
+ },
832
+ children: [
833
+ /* @__PURE__ */ jsx("span", { style: { fontSize: "0.9rem" }, children: "\u2199" }),
834
+ s.loginTime ? dayjs(s.loginTime).format("DD MMM YYYY h:mm:ss A") : "Missing"
835
+ ]
836
+ }
837
+ ),
838
+ /* @__PURE__ */ jsxs(Box, { sx: { flex: 1, display: "flex", alignItems: "center", justifyContent: "space-between", gap: 0.4 }, children: [
839
+ /* @__PURE__ */ jsxs(
840
+ Typography,
841
+ {
842
+ component: "span",
843
+ sx: {
844
+ fontFamily: FONT,
845
+ fontSize: "0.78rem",
846
+ fontWeight: 500,
847
+ color: s.logoutTime ? COLORS.red : "#9e9e9e",
848
+ display: "flex",
849
+ alignItems: "center",
850
+ gap: 0.4
851
+ },
852
+ children: [
853
+ /* @__PURE__ */ jsx("span", { style: { fontSize: "0.9rem" }, children: "\u2197" }),
854
+ s.logoutTime ? dayjs(s.logoutTime).format("DD MMM YYYY h:mm:ss A") : "Missing"
855
+ ]
856
+ }
857
+ ),
858
+ isOpenSession && s.sessionId != null && !isEditing && /* @__PURE__ */ jsx(
859
+ SDKPermissionGuard,
860
+ {
861
+ permissions: [SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE],
862
+ showFallback: false,
863
+ children: /* @__PURE__ */ jsx(Tooltip, { title: "Regularize \u2014 set logout time", children: /* @__PURE__ */ jsx(
864
+ IconButton,
865
+ {
866
+ size: "small",
867
+ onClick: () => startRegularize(s),
868
+ sx: {
869
+ p: 0.4,
870
+ color: "var(--primary-color, #1A5F6C)",
871
+ borderRadius: "6px",
872
+ "&:hover": { backgroundColor: "rgba(26,95,108,0.08)" }
873
+ },
874
+ children: /* @__PURE__ */ jsx(EditCalendarIcon, { sx: { fontSize: "1.05rem" } })
875
+ }
876
+ ) })
877
+ }
878
+ )
879
+ ] })
880
+ ] }),
881
+ isEditing && /* @__PURE__ */ jsxs(
882
+ Box,
883
+ {
884
+ sx: {
885
+ mt: 1,
886
+ p: 1.25,
887
+ borderRadius: "10px",
888
+ backgroundColor: "#f0f5f4",
889
+ border: "1px solid #d7e3e1"
890
+ },
891
+ children: [
892
+ /* @__PURE__ */ jsx(
893
+ Typography,
894
+ {
895
+ sx: {
896
+ fontFamily: FONT,
897
+ fontSize: "0.68rem",
898
+ fontWeight: 700,
899
+ textTransform: "uppercase",
900
+ letterSpacing: "0.5px",
901
+ color: "var(--primary-color-dark, #14505b)",
902
+ mb: 0.75
903
+ },
904
+ children: "Set Logout Time"
905
+ }
906
+ ),
907
+ /* @__PURE__ */ jsx(
908
+ DateTimePicker,
909
+ {
910
+ value: regularizeTime,
911
+ onChange: (val) => setRegularizeTime(val),
912
+ minDateTime: s.loginTime ? dayjs(s.loginTime) : void 0,
913
+ maxDateTime: dayjs(),
914
+ ampm: true,
915
+ format: "DD MMM YYYY hh:mm A",
916
+ slotProps: {
917
+ textField: {
918
+ size: "small",
919
+ fullWidth: true,
920
+ sx: {
921
+ backgroundColor: "#fff",
922
+ "& .MuiOutlinedInput-root": {
923
+ borderRadius: "8px",
924
+ fontFamily: FONT,
925
+ fontSize: "0.8rem",
926
+ "&.Mui-focused fieldset": { borderColor: "var(--primary-color, #1A5F6C)" }
927
+ }
928
+ }
929
+ },
930
+ actionBar: { actions: ["clear", "cancel", "accept"] }
931
+ }
932
+ }
933
+ ),
934
+ regularizeError && /* @__PURE__ */ jsx(Typography, { sx: { fontFamily: FONT, color: COLORS.red, fontSize: "0.7rem", mt: 0.6 }, children: regularizeError }),
935
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", justifyContent: "flex-end", spacing: 1, sx: { mt: 1 }, children: [
936
+ /* @__PURE__ */ jsx(
937
+ AppButton,
938
+ {
939
+ variant: "cancel",
940
+ size: "small",
941
+ onClick: cancelRegularize,
942
+ disabled: regularizing,
943
+ children: "Cancel"
944
+ }
945
+ ),
946
+ /* @__PURE__ */ jsx(
947
+ AppButton,
948
+ {
949
+ size: "small",
950
+ onClick: saveRegularize,
951
+ disabled: regularizing,
952
+ startIcon: regularizing ? /* @__PURE__ */ jsx(CircularProgress, { size: 14, sx: { color: "#fff" } }) : /* @__PURE__ */ jsx(CheckIcon, { sx: { fontSize: "0.95rem !important" } }),
953
+ children: regularizing ? "Saving\u2026" : "Regularize"
954
+ }
955
+ )
956
+ ] })
957
+ ]
958
+ }
959
+ )
960
+ ]
766
961
  },
767
- children: [
768
- /* @__PURE__ */ jsxs(
769
- Typography,
770
- {
771
- component: "span",
772
- sx: {
773
- flex: 1,
774
- fontFamily: FONT,
775
- fontSize: "0.78rem",
776
- fontWeight: 500,
777
- color: s.loginTime ? COLORS.green : "#9e9e9e",
778
- display: "flex",
779
- alignItems: "center",
780
- gap: 0.4
781
- },
782
- children: [
783
- /* @__PURE__ */ jsx("span", { style: { fontSize: "0.9rem" }, children: "\u2199" }),
784
- s.loginTime ? dayjs(s.loginTime).format("DD MMM YYYY h:mm:ss A") : "Missing"
785
- ]
786
- }
787
- ),
788
- /* @__PURE__ */ jsxs(
789
- Typography,
790
- {
791
- component: "span",
792
- sx: {
793
- flex: 1,
794
- fontFamily: FONT,
795
- fontSize: "0.78rem",
796
- fontWeight: 500,
797
- color: s.logoutTime ? COLORS.red : "#9e9e9e",
798
- display: "flex",
799
- alignItems: "center",
800
- gap: 0.4
801
- },
802
- children: [
803
- /* @__PURE__ */ jsx("span", { style: { fontSize: "0.9rem" }, children: "\u2197" }),
804
- s.logoutTime ? dayjs(s.logoutTime).format("DD MMM YYYY h:mm:ss A") : "Missing"
805
- ]
806
- }
807
- )
808
- ]
809
- },
810
- i
811
- ))
962
+ i
963
+ );
964
+ })
812
965
  ] })
813
966
  ]
814
967
  },
@@ -825,4 +978,4 @@ var loginReport_default = LoginReport;
825
978
  export {
826
979
  loginReport_default as default
827
980
  };
828
- //# sourceMappingURL=loginReport-A4GUPW3G.mjs.map
981
+ //# sourceMappingURL=loginReport-5QYHG6OM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../call-control-sdk/lib/pages/loginReport/index.tsx","../call-control-sdk/lib/pages/loginReport/useLoginReport.ts"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Alert,\n Box,\n Chip,\n CircularProgress,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n Paper,\n Stack,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n TablePagination,\n TableSortLabel,\n Tooltip,\n Typography,\n} from \"@mui/material\";\nimport AppButton from \"../common/components/AppButton\";\n\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport CheckIcon from \"@mui/icons-material/Check\";\nimport EditCalendarIcon from \"@mui/icons-material/EditCalendar\";\nimport ReportFilterBar, { type QuickRange } from \"../common/components/ReportFilterBar\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\n\nimport dayjs, { Dayjs } from \"dayjs\";\nimport isoWeek from \"dayjs/plugin/isoWeek\";\n\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\nimport { DateTimePicker } from \"@mui/x-date-pickers/DateTimePicker\";\nimport {\n getLoginReport,\n getAgentLoginSessions,\n exportLoginReportToExcel,\n exportAgentLoginSessionsToExcel,\n regularizeLoginSession,\n getQueues,\n type Queue,\n} from \"./useLoginReport\";\nimport type { LoginReportParams, LoginAgentRowResponse, LoginSessionResponse } from \"./types\";\nimport { deepFindArray } from \"../../services/axios\";\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\nimport { headCellSx } from \"../common/utils/tableStyles\";\nimport PageHeader from \"../common/components/PageHeader\";\nimport SearchBar from \"../common/components/SearchBar\";\n\nimport { SDKProvider } from \"../../components/SDKProvider\";\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\n\ndayjs.extend(isoWeek);\n\ntype SortKey =\n | \"fullName\"\n | \"agentId\"\n | \"processNames\"\n | \"queueNames\"\n | \"numLogins\"\n | \"firstLoginTime\"\n | \"lastLogoutTime\"\n | \"workingDurationFormatted\"\n | \"breakDurationFormatted\"\n | \"loginDurationFormatted\"\n | \"utilisationPct\";\n\ntype SortDir = \"asc\" | \"desc\";\n\nconst FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\n\nconst COLORS = {\n navy: \"#0d2a56\",\n blue: \"#1565c8\",\n green: \"#0a9a62\",\n amber: \"#c47c00\",\n red: \"#cc2a2a\",\n purple: \"#6b3fbf\",\n bg: \"transparent\",\n surface: \"transparent\",\n} as const;\n\nconst DEFAULT_ROWS_PER_PAGE = 10;\n\nconst comparator = (a: LoginAgentRowResponse, b: LoginAgentRowResponse, key: SortKey): number => {\n const av = a[key];\n const bv = b[key];\n if (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\n return String(av ?? \"\").localeCompare(String(bv ?? \"\"));\n};\n\nfunction LoginReportContent() {\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\n const [activeQuickDate, setActiveQuickDate] = useState<\"today\" | \"week\" | \"month\" | null>(\"today\");\n const [searchText, setSearchText] = useState(\"\");\n\n const [selectedAgents, setSelectedAgents] = useState<AgentOption[]>([]);\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\n\n const [queues, setQueues] = useState<Queue[]>([]);\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\n\n const [reportData, setReportData] = useState<LoginAgentRowResponse[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const [page, setPage] = useState(0);\n const [rowsPerPage, setRowsPerPage] = useState(DEFAULT_ROWS_PER_PAGE);\n const [totalCount, setTotalCount] = useState(-1);\n const [sortKey, setSortKey] = useState<SortKey>(\"fullName\");\n const [sortDir, setSortDir] = useState<SortDir>(\"asc\");\n\n // Debounced search (sent to the server)\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n debounceRef.current = setTimeout(() => setDebouncedSearch(searchText.trim()), 400);\n return () => clearTimeout(debounceRef.current);\n }, [searchText]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedRow, setSelectedRow] = useState<LoginAgentRowResponse | null>(null);\n const [sessions, setSessions] = useState<LoginSessionResponse[]>([]);\n const [sessionsLoading, setSessionsLoading] = useState(false);\n\n /* ----- regularize (close stuck session) state ----- */\n const [regularizeSessionId, setRegularizeSessionId] = useState<number | null>(null);\n const [regularizeTime, setRegularizeTime] = useState<Dayjs | null>(null);\n const [regularizing, setRegularizing] = useState(false);\n const [regularizeError, setRegularizeError] = useState(\"\");\n\n useEffect(() => {\n getQueues().then((data) => setQueues(data || [])).catch(() => setError(\"Failed to load queues\"));\n }, []);\n\n const handleQuickRangeChange = (range: QuickRange) => { setActiveQuickDate(range || null); };\n\n const handleRefresh = () => {\n if (activeQuickDate) {\n const now = dayjs();\n let sd = now.startOf(\"day\");\n const ed = now;\n if (activeQuickDate === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\n else if (activeQuickDate === \"month\") sd = now.startOf(\"month\").startOf(\"day\");\n // Setting the dates re-triggers the auto-fetch effect below.\n setStartDate(sd);\n setEndDate(ed);\n } else {\n fetchReport(page);\n }\n };\n\n const fetchReport = useCallback(\n async (pageNum: number) => {\n const sd = startDate;\n const ed = endDate;\n\n if (!sd || !ed) {\n setError(\"Select a valid date range\");\n return;\n }\n\n const params: LoginReportParams = {\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\n agent_id: !isAllUsersSelected && selectedAgents.length > 0\n ? selectedAgents.map((a) => a.userId)\n : undefined,\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\n ? selectedQueues.map((q) => q.id)\n : undefined,\n search: debouncedSearch || undefined,\n page: pageNum + 1,\n pageSize: rowsPerPage,\n };\n\n try {\n setError(\"\");\n setLoading(true);\n const res = await getLoginReport(params);\n const agents = deepFindArray<LoginAgentRowResponse>(res, [\"agents\"]);\n setReportData(agents);\n // Real total from the response (falls back defensively to the summary count).\n const total =\n (res as any)?.total ??\n (res as any)?.pagination?.total ??\n res?.summary?.totalAgentsLoggedIn;\n setTotalCount(typeof total === \"number\" ? total : agents.length);\n } catch (err: any) {\n setError(err?.message || \"Failed to fetch login report\");\n setReportData([]);\n } finally {\n setLoading(false);\n }\n },\n [startDate, endDate, selectedAgents, isAllUsersSelected, selectedQueues, debouncedSearch, rowsPerPage],\n );\n\n useEffect(() => {\n setPage(0);\n fetchReport(0);\n }, [fetchReport]);\n\n const handlePageChange = useCallback(\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\n setPage(newPage);\n fetchReport(newPage);\n },\n [fetchReport],\n );\n\n // Sorting is applied client-side to the current page; search + paging are server-side.\n const filteredData = useMemo(() => {\n const rows = [...reportData];\n rows.sort((a, b) => {\n const cmp = comparator(a, b, sortKey);\n return sortDir === \"asc\" ? cmp : -cmp;\n });\n return rows;\n }, [reportData, sortKey, sortDir]);\n\n const paginatedData = filteredData;\n\n const handleSort = (key: SortKey) => {\n if (sortKey === key) {\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\n } else {\n setSortKey(key);\n setSortDir(\"asc\");\n }\n };\n\n const loadSessions = useCallback(async (agentId: string) => {\n setSessionsLoading(true);\n try {\n const sd = startDate ?? dayjs();\n const ed = endDate ?? dayjs();\n const data = await getAgentLoginSessions(agentId, {\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\n });\n setSessions(data);\n } catch {\n setSessions([]);\n } finally {\n setSessionsLoading(false);\n }\n }, [startDate, endDate]);\n\n const openDialog = async (row: LoginAgentRowResponse) => {\n setSelectedRow(row);\n setSessions([]);\n setRegularizeSessionId(null);\n setRegularizeError(\"\");\n setDialogOpen(true);\n await loadSessions(row.agentId);\n };\n\n const closeDialog = () => {\n setDialogOpen(false);\n setTimeout(() => {\n setSelectedRow(null);\n setSessions([]);\n setRegularizeSessionId(null);\n setRegularizeError(\"\");\n }, 300);\n };\n\n /* ================= REGULARIZE (close stuck session) ================= */\n\n const startRegularize = (session: LoginSessionResponse) => {\n if (session.sessionId == null) return;\n setRegularizeError(\"\");\n setRegularizeSessionId(session.sessionId);\n // Default the logout time to now (supervisor can edit before saving).\n setRegularizeTime(dayjs());\n };\n\n const cancelRegularize = () => {\n setRegularizeSessionId(null);\n setRegularizeTime(null);\n setRegularizeError(\"\");\n };\n\n const saveRegularize = async () => {\n if (regularizeSessionId == null || !regularizeTime || !regularizeTime.isValid()) {\n setRegularizeError(\"Select a valid logout time\");\n return;\n }\n try {\n setRegularizing(true);\n setRegularizeError(\"\");\n await regularizeLoginSession(regularizeSessionId, regularizeTime.toISOString());\n cancelRegularize();\n // Refresh the session list and the underlying report so the row reflects the change.\n if (selectedRow) await loadSessions(selectedRow.agentId);\n fetchReport(page);\n } catch (err: any) {\n setRegularizeError(err?.message || \"Failed to regularize login session\");\n } finally {\n setRegularizing(false);\n }\n };\n\n const handleExportExcel = async () => {\n const sd = startDate ?? dayjs();\n const ed = endDate ?? dayjs();\n const params: LoginReportParams = {\n start_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\n agent_id: !isAllUsersSelected && selectedAgents.length > 0\n ? selectedAgents.map((a) => a.userId)\n : undefined,\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\n ? selectedQueues.map((q) => q.id)\n : undefined,\n search: debouncedSearch || undefined,\n };\n try {\n await exportLoginReportToExcel(params);\n } catch (err: any) {\n setError(err?.message || \"Failed to export Excel\");\n }\n };\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box sx={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", fontFamily: FONT }}>\n <PageHeader\n title=\"Login Report\"\n actions={\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <SearchBar\n value={searchText}\n onChange={(val) => { setSearchText(val); setPage(0); }}\n placeholder=\"Search name, ID...\"\n width={250}\n />\n <SDKPermissionGuard\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE, SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_EXPORT]}\n showFallback={false}\n >\n <AppButton\n startIcon={<DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\n disabled={!reportData.length}\n onClick={handleExportExcel}\n sx={{ height: 36 }}\n >\n Export Excel\n </AppButton>\n </SDKPermissionGuard>\n </Stack>\n }\n />\n\n <Box sx={{ flex: 1, overflow: \"auto\", py: 0.8, px: 0 }}>\n <Box sx={{ mb: 0.8 }}>\n <ReportFilterBar\n startDate={startDate}\n endDate={endDate}\n onStartChange={setStartDate}\n onEndChange={setEndDate}\n quickRange={activeQuickDate || \"\"}\n onQuickRangeChange={handleQuickRangeChange}\n showAgentSelect\n selectedAgents={selectedAgents}\n onAgentsChange={setSelectedAgents}\n setIsAllUsersSelected={setIsAllUsersSelected}\n showQueueSelect\n queues={queues}\n selectedQueues={selectedQueues}\n onQueuesChange={setSelectedQueues}\n extra={\n <AppButton\n startIcon={<RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />}\n disabled={loading}\n onClick={handleRefresh}\n sx={{ height: 32 }}\n >\n Refresh\n </AppButton>\n }\n />\n\n {error && (\n <Alert severity=\"error\" sx={{ mt: 1, fontFamily: FONT, fontSize: \"0.78rem\" }}>\n {error}\n </Alert>\n )}\n </Box>\n\n {loading && (\n <Box sx={{ textAlign: \"center\", py: 2.5 }}>\n <CircularProgress sx={{ color: COLORS.blue }} size={28} />\n </Box>\n )}\n\n <Paper\n elevation={0}\n sx={{\n borderRadius: \"8px\",\n border: \"1px solid #e0e7ef\",\n overflow: \"hidden\",\n mb: 2,\n }}\n >\n <TableContainer>\n <Table\n size=\"small\"\n sx={{\n minWidth: 1100,\n fontFamily: FONT,\n \"& .MuiTableCell-root\": {\n fontFamily: FONT,\n fontSize: \"0.75rem\",\n borderBottom: \"1px solid #eef1f6\",\n py: 0.6,\n px: 1,\n },\n }}\n >\n <TableHead>\n <TableRow>\n {(\n [\n { id: \"fullName\" as SortKey, label: \"User Name\" },\n { id: \"agentId\" as SortKey, label: \"User ID\" },\n { id: \"queueNames\" as SortKey, label: \"Queues\" },\n { id: \"numLogins\" as SortKey, label: \"Logins\" },\n { id: \"firstLoginTime\" as SortKey, label: \"First Login\" },\n { id: \"lastLogoutTime\" as SortKey, label: \"Last Logout\" },\n { id: \"workingDurationFormatted\" as SortKey, label: \"Working Duration\" },\n { id: \"breakDurationFormatted\" as SortKey, label: \"Break Duration\" },\n { id: \"loginDurationFormatted\" as SortKey, label: \"Login Duration\" },\n { id: \"utilisationPct\" as SortKey, label: \"Utilisation %\" },\n ] as { id: SortKey; label: string }[]\n ).map((col) => (\n <TableCell key={col.id} sx={headCellSx}>\n <TableSortLabel\n active={sortKey === col.id}\n direction={sortKey === col.id ? sortDir : \"asc\"}\n onClick={() => handleSort(col.id)}\n sx={{\n \"&.MuiTableSortLabel-root\": { color: \"#333\" },\n \"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\n \"&.Mui-active\": { color: \"#333\" },\n \"& .MuiTableSortLabel-icon\": { color: \"#333 !important\" },\n }}\n >\n {col.label}\n </TableSortLabel>\n </TableCell>\n ))}\n </TableRow>\n </TableHead>\n\n <TableBody>\n {paginatedData.map((row, idx) => {\n const isLoggedIn = !row.lastLogoutTime;\n return (\n <TableRow\n key={`${row.agentId}-${idx}`}\n hover\n sx={{\n backgroundColor: \"#fff\",\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\n }}\n >\n <TableCell sx={{ fontWeight: 600, color: COLORS.navy, fontSize: \"0.75rem\" }}>\n {row.fullName || \"—\"}\n </TableCell>\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>{row.agentId || \"—\"}</TableCell>\n <TableCell>\n {row.queueNames ? (\n <Chip\n label={row.queueNames}\n size=\"small\"\n sx={{\n fontFamily: FONT,\n backgroundColor: \"#f0ebfa\",\n color: COLORS.purple,\n fontWeight: 500,\n fontSize: \"0.67rem\",\n height: 22,\n }}\n />\n ) : (\n \"—\"\n )}\n </TableCell>\n <TableCell sx={{ textAlign: \"center\" }}>\n <Chip\n label={row.numLogins}\n size=\"small\"\n onClick={(e) => { e.stopPropagation(); openDialog(row); }}\n sx={{\n fontFamily: FONT,\n backgroundColor: COLORS.navy,\n color: \"#fff\",\n fontWeight: 600,\n minWidth: 28,\n height: 20,\n fontSize: \"0.67rem\",\n cursor: \"pointer\",\n \"&:hover\": { backgroundColor: COLORS.blue },\n }}\n />\n </TableCell>\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\n {row.firstLoginTime\n ? dayjs(row.firstLoginTime).format(\"DD MMM YYYY hh:mm A\")\n : \"—\"}\n </TableCell>\n <TableCell sx={{ fontSize: \"0.73rem\", color: \"#4a5568\" }}>\n {isLoggedIn ? (\n <Chip\n label=\"LOGGED-IN\"\n size=\"small\"\n sx={{\n fontFamily: FONT,\n backgroundColor: COLORS.green,\n color: \"#fff\",\n fontWeight: 600,\n fontSize: \"0.65rem\",\n height: 20,\n }}\n />\n ) : (\n dayjs(row.lastLogoutTime).format(\"DD MMM YYYY hh:mm A\")\n )}\n </TableCell>\n <TableCell\n sx={{ fontWeight: 600, color: COLORS.blue, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}\n >\n {row.workingDurationFormatted || \"—\"}\n </TableCell>\n <TableCell\n sx={{ fontWeight: 500, color: COLORS.amber, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}\n >\n {row.breakDurationFormatted || \"—\"}\n </TableCell>\n <TableCell sx={{ fontWeight: 500, fontSize: \"0.75rem\", fontVariantNumeric: \"tabular-nums\" }}>\n {row.loginDurationFormatted || \"—\"}\n </TableCell>\n <TableCell sx={{ minWidth: 120 }}>\n {row.utilisationPct != null ? (() => {\n const pct = Math.min(row.utilisationPct, 100);\n const barColor =\n pct >= 80 ? \"#10b981\" : pct >= 60 ? \"#f59e0b\" : \"#ef4444\";\n const bgTint =\n pct >= 80 ? \"#d1fae5\" : pct >= 60 ? \"#fef3c7\" : \"#fee2e2\";\n return (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}>\n <Box\n sx={{\n position: \"relative\",\n flex: 1,\n height: 7,\n borderRadius: 4,\n backgroundColor: bgTint,\n overflow: \"hidden\",\n }}\n >\n <Box\n sx={{\n width: `${pct}%`,\n height: \"100%\",\n borderRadius: 4,\n background: `linear-gradient(90deg, ${barColor}cc, ${barColor})`,\n transition: \"width 0.4s ease\",\n }}\n />\n </Box>\n <Chip\n label={`${Math.round(pct)}%`}\n size=\"small\"\n sx={{\n fontFamily: FONT,\n height: 18,\n minWidth: 38,\n fontSize: \"0.63rem\",\n fontWeight: 700,\n backgroundColor: bgTint,\n color: barColor,\n \"& .MuiChip-label\": { px: 0.6 },\n }}\n />\n </Box>\n );\n })() : (\n \"—\"\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </TableContainer>\n\n <TablePagination\n component=\"div\"\n count={totalCount}\n page={page}\n onPageChange={handlePageChange}\n rowsPerPage={rowsPerPage}\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\n onRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\n sx={{ borderTop: \"1px solid #eef1f6\", fontFamily: FONT, \"& .MuiTablePagination-displayedRows\": { fontFamily: FONT, fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontFamily: FONT, fontSize: \"0.73rem\" } }}\n />\n </Paper>\n\n <Dialog\n open={dialogOpen}\n onClose={(_e, reason) => { if (reason !== 'backdropClick') closeDialog(); }}\n maxWidth=\"md\"\n fullWidth\n PaperProps={{\n sx: {\n borderRadius: \"12px\",\n fontFamily: FONT,\n overflow: \"hidden\",\n boxShadow: \"0 8px 32px rgba(0,0,0,0.18)\",\n maxWidth: 450,\n },\n }}\n >\n <DialogTitle\n sx={{\n fontFamily: FONT,\n background: \"linear-gradient(135deg, var(--primary-color-dark, #14505b), var(--primary-color, #1A5F6C))\",\n color: \"#fff\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n py: 1.5,\n px: 2.5,\n }}\n >\n <Box>\n <Typography variant=\"h6\" sx={{ fontFamily: FONT, fontWeight: 700, fontSize: \"0.95rem\", letterSpacing: \"0.3px\" }}>\n Login Sessions\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{ fontFamily: FONT, opacity: 0.9, fontSize: \"0.76rem\", mt: 0.3 }}\n >\n {selectedRow?.fullName} &bull; {selectedRow?.numLogins} session{selectedRow?.numLogins !== 1 ? \"s\" : \"\"}\n </Typography>\n </Box>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\n <AppButton\n size=\"small\"\n startIcon={<DownloadIcon sx={{ fontSize: \"0.85rem !important\" }} />}\n onClick={async () => {\n if (!selectedRow) return;\n try {\n await exportAgentLoginSessionsToExcel(selectedRow.agentId, {\n start_date: (startDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: (endDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\n });\n } catch (err: any) {\n setError(err?.message || \"Failed to export Excel\");\n }\n }}\n sx={{ whiteSpace: \"nowrap\" }}\n >\n Export to Excel\n </AppButton>\n <IconButton\n onClick={closeDialog}\n size=\"small\"\n sx={{\n color: \"#fff\",\n backgroundColor: \"rgba(255,255,255,0.1)\",\n \"&:hover\": { backgroundColor: \"rgba(255,255,255,0.2)\" },\n }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </DialogTitle>\n\n <DialogContent sx={{ p: 0, backgroundColor: \"#f8fafb\" }}>\n {sessionsLoading ? (\n <Box sx={{ p: 4, textAlign: \"center\" }}>\n <CircularProgress size={28} sx={{ color: \"var(--primary-color, #1A5F6C)\" }} />\n </Box>\n ) : sessions.length > 0 ? (\n <Box sx={{ p: 1.5, maxHeight: 300, overflowY: \"auto\" }}>\n {Object.entries(\n sessions.reduce<Record<string, LoginSessionResponse[]>>((acc, s) => {\n const dateKey = s.loginTime\n ? dayjs(s.loginTime).format(\"DD MMM YYYY\")\n : \"Unknown Date\";\n if (!acc[dateKey]) acc[dateKey] = [];\n acc[dateKey].push(s);\n return acc;\n }, {})\n ).map(([date, dateSessions]) => (\n <Paper\n key={date}\n elevation={0}\n sx={{\n mb: 1.5,\n borderRadius: \"10px\",\n border: \"1px solid #e4eaf0\",\n overflow: \"hidden\",\n backgroundColor: \"#fff\",\n }}\n >\n <Box\n sx={{\n px: 1.5,\n py: 0.8,\n backgroundColor: \"#f0f5f4\",\n borderBottom: \"1px solid #e4eaf0\",\n }}\n >\n <Typography\n sx={{\n fontFamily: FONT,\n fontWeight: 700,\n fontSize: \"0.8rem\",\n color: \"var(--primary-color-dark, #14505b)\",\n letterSpacing: \"0.3px\",\n }}\n >\n {date}\n </Typography>\n </Box>\n <Box sx={{ px: 1.5, py: 1 }}>\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n pb: 0.5,\n mb: 0.5,\n borderBottom: \"1px solid #e4eaf0\",\n }}\n >\n <Typography\n sx={{\n flex: 1,\n fontFamily: FONT,\n fontSize: \"0.72rem\",\n fontWeight: 700,\n color: \"#555\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.5px\",\n }}\n >\n Login\n </Typography>\n <Typography\n sx={{\n flex: 1,\n fontFamily: FONT,\n fontSize: \"0.72rem\",\n fontWeight: 700,\n color: \"#555\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.5px\",\n }}\n >\n Logout\n </Typography>\n </Box>\n {dateSessions.map((s, i) => {\n const isOpenSession = !s.logoutTime;\n const isEditing = s.sessionId != null && regularizeSessionId === s.sessionId;\n return (\n <Box\n key={i}\n sx={{\n py: 0.6,\n borderBottom: i < dateSessions.length - 1 ? \"1px dashed #e8ecf0\" : \"none\",\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\n <Typography\n component=\"span\"\n sx={{\n flex: 1,\n fontFamily: FONT,\n fontSize: \"0.78rem\",\n fontWeight: 500,\n color: s.loginTime ? COLORS.green : \"#9e9e9e\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.4,\n }}\n >\n <span style={{ fontSize: \"0.9rem\" }}>{\"↙\"}</span>\n {s.loginTime ? dayjs(s.loginTime).format(\"DD MMM YYYY h:mm:ss A\") : \"Missing\"}\n </Typography>\n <Box sx={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 0.4 }}>\n <Typography\n component=\"span\"\n sx={{\n fontFamily: FONT,\n fontSize: \"0.78rem\",\n fontWeight: 500,\n color: s.logoutTime ? COLORS.red : \"#9e9e9e\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.4,\n }}\n >\n <span style={{ fontSize: \"0.9rem\" }}>{\"↗\"}</span>\n {s.logoutTime\n ? dayjs(s.logoutTime).format(\"DD MMM YYYY h:mm:ss A\")\n : \"Missing\"}\n </Typography>\n {isOpenSession && s.sessionId != null && !isEditing && (\n <SDKPermissionGuard\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE]}\n showFallback={false}\n >\n <Tooltip title=\"Regularize — set logout time\">\n <IconButton\n size=\"small\"\n onClick={() => startRegularize(s)}\n sx={{\n p: 0.4,\n color: \"var(--primary-color, #1A5F6C)\",\n borderRadius: \"6px\",\n \"&:hover\": { backgroundColor: \"rgba(26,95,108,0.08)\" },\n }}\n >\n <EditCalendarIcon sx={{ fontSize: \"1.05rem\" }} />\n </IconButton>\n </Tooltip>\n </SDKPermissionGuard>\n )}\n </Box>\n </Box>\n\n {isEditing && (\n <Box\n sx={{\n mt: 1,\n p: 1.25,\n borderRadius: \"10px\",\n backgroundColor: \"#f0f5f4\",\n border: \"1px solid #d7e3e1\",\n }}\n >\n <Typography\n sx={{\n fontFamily: FONT,\n fontSize: \"0.68rem\",\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \"0.5px\",\n color: \"var(--primary-color-dark, #14505b)\",\n mb: 0.75,\n }}\n >\n Set Logout Time\n </Typography>\n <DateTimePicker\n value={regularizeTime}\n onChange={(val) => setRegularizeTime(val)}\n minDateTime={s.loginTime ? dayjs(s.loginTime) : undefined}\n maxDateTime={dayjs()}\n ampm\n format=\"DD MMM YYYY hh:mm A\"\n slotProps={{\n textField: {\n size: \"small\",\n fullWidth: true,\n sx: {\n backgroundColor: \"#fff\",\n \"& .MuiOutlinedInput-root\": {\n borderRadius: \"8px\",\n fontFamily: FONT,\n fontSize: \"0.8rem\",\n \"&.Mui-focused fieldset\": { borderColor: \"var(--primary-color, #1A5F6C)\" },\n },\n },\n },\n actionBar: { actions: [\"clear\", \"cancel\", \"accept\"] },\n }}\n />\n {regularizeError && (\n <Typography sx={{ fontFamily: FONT, color: COLORS.red, fontSize: \"0.7rem\", mt: 0.6 }}>\n {regularizeError}\n </Typography>\n )}\n <Stack direction=\"row\" justifyContent=\"flex-end\" spacing={1} sx={{ mt: 1 }}>\n <AppButton\n variant=\"cancel\"\n size=\"small\"\n onClick={cancelRegularize}\n disabled={regularizing}\n >\n Cancel\n </AppButton>\n <AppButton\n size=\"small\"\n onClick={saveRegularize}\n disabled={regularizing}\n startIcon={\n regularizing\n ? <CircularProgress size={14} sx={{ color: \"#fff\" }} />\n : <CheckIcon sx={{ fontSize: \"0.95rem !important\" }} />\n }\n >\n {regularizing ? \"Saving…\" : \"Regularize\"}\n </AppButton>\n </Stack>\n </Box>\n )}\n </Box>\n );\n })}\n </Box>\n </Paper>\n ))}\n </Box>\n ) : (\n <Box sx={{ p: 4, textAlign: \"center\" }}>\n <Typography sx={{ fontFamily: FONT, color: \"#9e9e9e\", fontStyle: \"italic\", fontSize: \"0.82rem\" }}>\n No sessions found\n </Typography>\n </Box>\n )}\n </DialogContent>\n </Dialog>\n </Box>\n </Box>\n </LocalizationProvider>\n );\n}\n\nconst LoginReport: React.FC = () => (\n <SDKProvider>\n <LoginReportContent />\n </SDKProvider>\n);\n\nexport default LoginReport;\n","import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type {\r\n\tLoginAgentRowResponse,\r\n\tLoginReportParams,\r\n\tLoginReportResponse,\r\n\tLoginSessionResponse,\r\n} from \"./types\";\r\n\r\nexport interface Queue {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tprocessId?: number;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport async function fetchQueues(): Promise<Queue[]> {\r\n\tconst res = await axiosInstance.get(END_POINT.MASTER_QUEUES);\r\n\tif (Array.isArray(res.data)) return res.data;\r\n\tif (Array.isArray(res.data?.data)) return res.data.data;\r\n\treturn [];\r\n}\r\n\r\nexport async function getQueues(): Promise<Queue[]> {\r\n\treturn fetchQueues();\r\n}\r\n\r\nexport async function getLoginReportAgents(params: LoginReportParams): Promise<LoginAgentRowResponse[]> {\r\n\tconst qs = buildLoginReportQueryString(params);\r\n\tconst res = await axiosInstance.get<LoginAgentRowResponse[]>(`${END_POINT.LOGIN_REPORT_AGENTS}${qs}`);\r\n\treturn Array.isArray(res.data) ? res.data : [];\r\n}\r\n\r\n/**\r\n * Combined login report — returns summary + the current page of agent rows.\r\n * Used for server-side pagination (the combined endpoint honours page/pageSize/search).\r\n */\r\nexport async function getLoginReport(params: LoginReportParams): Promise<LoginReportResponse> {\r\n\tconst qs = buildLoginReportQueryString(params);\r\n\tconst res = await axiosInstance.get<LoginReportResponse>(`${END_POINT.LOGIN_REPORT}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\nexport async function getAgentLoginSessions(\r\n\tagentId: string,\r\n\tparams?: { start_date?: string; end_date?: string },\r\n): Promise<LoginSessionResponse[]> {\r\n\tconst qs = buildSessionQueryString(params);\r\n\tconst res = await axiosInstance.get<LoginSessionResponse[]>(\r\n\t\t`${END_POINT.LOGIN_REPORT_AGENT_SESSIONS(agentId)}${qs}`,\r\n\t);\r\n\treturn Array.isArray(res.data) ? res.data : [];\r\n}\r\n\r\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","useState","useCallback"]}
@@ -1,22 +1,24 @@
1
1
  import {
2
2
  ReportFilterBar,
3
3
  headCellSx
4
- } from "./chunk-GC3WM33W.mjs";
4
+ } from "./chunk-HAJ6SECI.mjs";
5
5
  import {
6
- AdapterDayjs,
7
- LocalizationProvider,
8
6
  PageHeader
9
- } from "./chunk-X376SOIZ.mjs";
7
+ } from "./chunk-JOZ4YQMR.mjs";
10
8
  import {
11
9
  AppButton
12
10
  } from "./chunk-HBR2JS4C.mjs";
11
+ import {
12
+ AdapterDayjs,
13
+ LocalizationProvider
14
+ } from "./chunk-AJQBR3AZ.mjs";
13
15
  import {
14
16
  SDKProvider
15
17
  } from "./chunk-6ICPXSN6.mjs";
16
18
  import {
17
19
  END_POINT,
18
20
  axios_default
19
- } from "./chunk-DBSNJ3QH.mjs";
21
+ } from "./chunk-OVC42HVH.mjs";
20
22
  import {
21
23
  __spreadProps,
22
24
  __spreadValues
@@ -526,4 +528,4 @@ var managementDashboard_default = ManagementDashboard;
526
528
  export {
527
529
  managementDashboard_default as default
528
530
  };
529
- //# sourceMappingURL=managementDashboard-345DQMNO.mjs.map
531
+ //# sourceMappingURL=managementDashboard-PARD3QHL.mjs.map