ahs-cti 0.0.2 → 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.
- package/dist/{agentDetailReport-XSBMOUMW.mjs → agentDetailReport-JYBV3TF6.mjs} +5 -4
- package/dist/{agentPerformanceReport-UT6QZWYD.mjs → agentPerformanceReport-6RO6STKU.mjs} +10 -8
- package/dist/{agentPerformanceReport-UT6QZWYD.mjs.map → agentPerformanceReport-6RO6STKU.mjs.map} +1 -1
- package/dist/{auditReport-R67BYA4Z.mjs → auditReport-PYRZU3NA.mjs} +4 -4
- package/dist/{callHistory-PHGY224F.mjs → callHistory-4JI64TU7.mjs} +25 -8
- package/dist/callHistory-4JI64TU7.mjs.map +1 -0
- package/dist/{campaigns-JSMYHHDF.mjs → campaigns-JZE22SIM.mjs} +151 -71
- package/dist/campaigns-JZE22SIM.mjs.map +1 -0
- package/dist/{caroQualityAuditDashboard-7X44HRZL.mjs → caroQualityAuditDashboard-NRWY6SEC.mjs} +2 -2
- package/dist/{caroVoiceAI-OZAB7LK4.mjs → caroVoiceAI-Z5BDDDSY.mjs} +2 -2
- package/dist/{cdrReport-44LN5VUX.mjs → cdrReport-RJTURVVV.mjs} +49 -19
- package/dist/cdrReport-RJTURVVV.mjs.map +1 -0
- package/dist/chunk-AJQBR3AZ.mjs +22234 -0
- package/dist/chunk-AJQBR3AZ.mjs.map +1 -0
- package/dist/{chunk-FVXHNBYV.mjs → chunk-ATAP77RC.mjs} +2 -2
- package/dist/{chunk-G6KDIN5W.mjs → chunk-BDQZYTAY.mjs} +32 -34
- package/dist/chunk-BDQZYTAY.mjs.map +1 -0
- package/dist/{chunk-GGACEO3I.mjs → chunk-FVVDDZCA.mjs} +2 -2
- package/dist/{chunk-CXULBAK6.mjs → chunk-HAJ6SECI.mjs} +47 -122
- package/dist/chunk-HAJ6SECI.mjs.map +1 -0
- package/dist/{chunk-WWWM33FY.mjs → chunk-IBFF6DJA.mjs} +3 -3
- package/dist/{chunk-O2XGWZLT.mjs → chunk-OVC42HVH.mjs} +5 -2
- package/dist/chunk-OVC42HVH.mjs.map +1 -0
- package/dist/{chunk-UZF5Q3GR.mjs → chunk-PO6POUPL.mjs} +3 -3
- package/dist/chunk-UB5HSUGK.mjs +65 -0
- package/dist/{chunk-HRM6S6J2.mjs → chunk-UNTGXE6T.mjs} +2 -2
- package/dist/index.js +27618 -2176
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -20
- package/dist/index.mjs.map +1 -1
- package/dist/{liveStatus-AHKS4XLW.mjs → liveStatus-E7UP37FK.mjs} +5 -5
- package/dist/{loginReport-7GBMZP55.mjs → loginReport-5QYHG6OM.mjs} +219 -66
- package/dist/loginReport-5QYHG6OM.mjs.map +1 -0
- package/dist/{managementDashboard-TYON77NW.mjs → managementDashboard-PARD3QHL.mjs} +8 -6
- package/dist/{managementDashboard-TYON77NW.mjs.map → managementDashboard-PARD3QHL.mjs.map} +1 -1
- package/dist/{qualityAuditDashboard-AGJH5VVN.mjs → qualityAuditDashboard-ZJEEAMBS.mjs} +2 -2
- package/package.json +1 -1
- package/dist/callHistory-PHGY224F.mjs.map +0 -1
- package/dist/campaigns-JSMYHHDF.mjs.map +0 -1
- package/dist/cdrReport-44LN5VUX.mjs.map +0 -1
- package/dist/chunk-CXULBAK6.mjs.map +0 -1
- package/dist/chunk-G6KDIN5W.mjs.map +0 -1
- package/dist/chunk-O2XGWZLT.mjs.map +0 -1
- package/dist/chunk-VQCHBU2Q.mjs +0 -27
- package/dist/loginReport-7GBMZP55.mjs.map +0 -1
- /package/dist/{agentDetailReport-XSBMOUMW.mjs.map → agentDetailReport-JYBV3TF6.mjs.map} +0 -0
- /package/dist/{auditReport-R67BYA4Z.mjs.map → auditReport-PYRZU3NA.mjs.map} +0 -0
- /package/dist/{caroQualityAuditDashboard-7X44HRZL.mjs.map → caroQualityAuditDashboard-NRWY6SEC.mjs.map} +0 -0
- /package/dist/{caroVoiceAI-OZAB7LK4.mjs.map → caroVoiceAI-Z5BDDDSY.mjs.map} +0 -0
- /package/dist/{chunk-FVXHNBYV.mjs.map → chunk-ATAP77RC.mjs.map} +0 -0
- /package/dist/{chunk-GGACEO3I.mjs.map → chunk-FVVDDZCA.mjs.map} +0 -0
- /package/dist/{chunk-WWWM33FY.mjs.map → chunk-IBFF6DJA.mjs.map} +0 -0
- /package/dist/{chunk-UZF5Q3GR.mjs.map → chunk-PO6POUPL.mjs.map} +0 -0
- /package/dist/{chunk-VQCHBU2Q.mjs.map → chunk-UB5HSUGK.mjs.map} +0 -0
- /package/dist/{chunk-HRM6S6J2.mjs.map → chunk-UNTGXE6T.mjs.map} +0 -0
- /package/dist/{liveStatus-AHKS4XLW.mjs.map → liveStatus-E7UP37FK.mjs.map} +0 -0
- /package/dist/{qualityAuditDashboard-AGJH5VVN.mjs.map → qualityAuditDashboard-ZJEEAMBS.mjs.map} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useCallMonitoring
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ATAP77RC.mjs";
|
|
4
4
|
import {
|
|
5
5
|
SDKPermissionGuard
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-FVVDDZCA.mjs";
|
|
7
7
|
import {
|
|
8
8
|
SDKProvider,
|
|
9
9
|
useToast
|
|
@@ -12,11 +12,11 @@ import {
|
|
|
12
12
|
END_POINT,
|
|
13
13
|
SDK_PERMISSIONS,
|
|
14
14
|
axios_default
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-OVC42HVH.mjs";
|
|
16
16
|
import {
|
|
17
17
|
__spreadProps,
|
|
18
18
|
__spreadValues
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-UB5HSUGK.mjs";
|
|
20
20
|
|
|
21
21
|
// call-control-sdk/lib/pages/liveStatus/index.tsx
|
|
22
22
|
import React, { useCallback as useCallback2, useState as useState2, useEffect as useEffect2 } from "react";
|
|
@@ -1074,4 +1074,4 @@ function LiveStatusPage(props) {
|
|
|
1074
1074
|
export {
|
|
1075
1075
|
LiveStatusPage as default
|
|
1076
1076
|
};
|
|
1077
|
-
//# sourceMappingURL=liveStatus-
|
|
1077
|
+
//# sourceMappingURL=liveStatus-E7UP37FK.mjs.map
|
|
@@ -2,16 +2,21 @@ import {
|
|
|
2
2
|
ReportFilterBar,
|
|
3
3
|
SearchBar,
|
|
4
4
|
headCellSx
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-HAJ6SECI.mjs";
|
|
6
6
|
import {
|
|
7
7
|
SDKPermissionGuard
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-FVVDDZCA.mjs";
|
|
9
9
|
import {
|
|
10
10
|
PageHeader
|
|
11
11
|
} from "./chunk-JOZ4YQMR.mjs";
|
|
12
12
|
import {
|
|
13
13
|
AppButton
|
|
14
14
|
} from "./chunk-HBR2JS4C.mjs";
|
|
15
|
+
import {
|
|
16
|
+
AdapterDayjs,
|
|
17
|
+
DateTimePicker,
|
|
18
|
+
LocalizationProvider
|
|
19
|
+
} from "./chunk-AJQBR3AZ.mjs";
|
|
15
20
|
import {
|
|
16
21
|
SDKProvider
|
|
17
22
|
} from "./chunk-6ICPXSN6.mjs";
|
|
@@ -20,8 +25,8 @@ import {
|
|
|
20
25
|
SDK_PERMISSIONS,
|
|
21
26
|
axios_default,
|
|
22
27
|
deepFindArray
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
28
|
+
} from "./chunk-OVC42HVH.mjs";
|
|
29
|
+
import "./chunk-UB5HSUGK.mjs";
|
|
25
30
|
|
|
26
31
|
// call-control-sdk/lib/pages/loginReport/index.tsx
|
|
27
32
|
import { useCallback as useCallback2, useEffect, useMemo, useRef, useState as useState2 } from "react";
|
|
@@ -44,15 +49,16 @@ import {
|
|
|
44
49
|
TableRow,
|
|
45
50
|
TablePagination,
|
|
46
51
|
TableSortLabel,
|
|
52
|
+
Tooltip,
|
|
47
53
|
Typography
|
|
48
54
|
} from "@mui/material";
|
|
49
55
|
import CloseIcon from "@mui/icons-material/Close";
|
|
56
|
+
import CheckIcon from "@mui/icons-material/Check";
|
|
57
|
+
import EditCalendarIcon from "@mui/icons-material/EditCalendar";
|
|
50
58
|
import DownloadIcon from "@mui/icons-material/Download";
|
|
51
59
|
import RefreshIcon from "@mui/icons-material/Refresh";
|
|
52
60
|
import dayjs from "dayjs";
|
|
53
61
|
import isoWeek from "dayjs/plugin/isoWeek";
|
|
54
|
-
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
|
|
55
|
-
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
|
|
56
62
|
|
|
57
63
|
// call-control-sdk/lib/pages/loginReport/useLoginReport.ts
|
|
58
64
|
import { useCallback, useState } from "react";
|
|
@@ -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
|
|
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(
|
|
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) =>
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
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
|
-
|
|
768
|
-
|
|
769
|
-
|
|
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-
|
|
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} • {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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAgB,eAAAA,cAAa,WAAW,SAAS,QAAQ,YAAAC,iBAAgB;AACzE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,OAAO,eAAe;AACtB,OAAO,eAAe;AACtB,OAAO,sBAAsB;AAE7B,OAAO,kBAAkB;AACzB,OAAO,iBAAiB;AAExB,OAAO,WAAsB;AAC7B,OAAO,aAAa;;;ACjCpB,SAAS,aAAa,gBAAgB;AAkBtC,eAAsB,cAAgC;AAlBtD;AAmBC,QAAM,MAAM,MAAM,cAAc,IAAI,UAAU,aAAa;AAC3D,MAAI,MAAM,QAAQ,IAAI,IAAI,EAAG,QAAO,IAAI;AACxC,MAAI,MAAM,SAAQ,SAAI,SAAJ,mBAAU,IAAI,EAAG,QAAO,IAAI,KAAK;AACnD,SAAO,CAAC;AACT;AAEA,eAAsB,YAA8B;AACnD,SAAO,YAAY;AACpB;AAYA,eAAsB,eAAe,QAAyD;AAC7F,QAAM,KAAK,4BAA4B,MAAM;AAC7C,QAAM,MAAM,MAAM,cAAc,IAAyB,GAAG,UAAU,YAAY,GAAG,EAAE,EAAE;AACzF,SAAO,IAAI;AACZ;AAEA,eAAsB,sBACrB,SACA,QACkC;AAClC,QAAM,KAAK,wBAAwB,MAAM;AACzC,QAAM,MAAM,MAAM,cAAc;AAAA,IAC/B,GAAG,UAAU,4BAA4B,OAAO,CAAC,GAAG,EAAE;AAAA,EACvD;AACA,SAAO,MAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC;AAC9C;AAMA,eAAsB,uBAAuB,WAA4B,YAAmC;AAC3G,QAAM,cAAc,MAAM,UAAU,gCAAgC,SAAS,GAAG,EAAE,WAAW,WAAW,CAAC;AAC1G;AAEA,eAAsB,yBAAyB,QAA0C;AAhEzF;AAiEC,QAAM,KAAK,4BAA4B,MAAM;AAC7C,QAAM,MAAM,MAAM,cAAc,IAAI,GAAG,UAAU,yBAAyB,GAAG,EAAE,IAAI,EAAE,cAAc,OAAO,CAAC;AAC3G,sBAAoB,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,iBAAgB,YAAO,eAAP,YAAqB,QAAQ,OAAO;AAC/F;AAEA,eAAsB,gCACrB,SACA,QACgB;AAChB,QAAM,KAAK,wBAAwB,MAAM;AACzC,QAAM,MAAM,MAAM,cAAc;AAAA,IAC/B,GAAG,UAAU,yCAAyC,OAAO,CAAC,GAAG,EAAE;AAAA,IACnE,EAAE,cAAc,OAAO;AAAA,EACxB;AACA,sBAAoB,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,kBAAkB,OAAO,OAAO;AAC3E;AAEA,SAAS,4BAA4B,QAAmC;AACvE,QAAM,KAAK,IAAI,gBAAgB;AAC/B,MAAI,OAAO,WAAY,IAAG,OAAO,cAAc,OAAO,UAAU;AAChE,MAAI,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,QAAQ;AAC1D,MAAI,OAAO,SAAU,YAAW,MAAM,OAAO,SAAU,IAAG,OAAO,YAAY,EAAE;AAC/E,MAAI,OAAO,SAAU,YAAW,MAAM,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,EAAE,CAAC;AACvF,MAAI,OAAO,WAAY,YAAW,MAAM,OAAO,WAAY,IAAG,OAAO,cAAc,OAAO,EAAE,CAAC;AAC7F,MAAI,OAAO,OAAQ,IAAG,OAAO,UAAU,OAAO,MAAM;AACpD,MAAI,OAAO,KAAM,IAAG,OAAO,QAAQ,OAAO,OAAO,IAAI,CAAC;AACtD,MAAI,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,OAAO,QAAQ,CAAC;AAClE,QAAM,MAAM,GAAG,SAAS;AACxB,SAAO,MAAM,IAAI,GAAG,KAAK;AAC1B;AAEA,SAAS,wBAAwB,QAA6D;AAC7F,QAAM,KAAK,IAAI,gBAAgB;AAC/B,MAAI,iCAAQ,WAAY,IAAG,OAAO,cAAc,OAAO,UAAU;AACjE,MAAI,iCAAQ,SAAU,IAAG,OAAO,YAAY,OAAO,QAAQ;AAC3D,QAAM,MAAM,GAAG,SAAS;AACxB,SAAO,MAAM,IAAI,GAAG,KAAK;AAC1B;AAEA,SAAS,oBAAoB,MAAY,UAAwB;AAChE,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW;AACb,WAAS,KAAK,YAAY,CAAC;AAC3B,IAAE,MAAM;AACR,IAAE,OAAO;AACT,MAAI,gBAAgB,GAAG;AACxB;;;ADkOY,SACE,KADF;AAzRZ,MAAM,OAAO,OAAO;AAiBpB,IAAM,OAAO;AAEb,IAAM,SAAS;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,SAAS;AACX;AAEA,IAAM,wBAAwB;AAE9B,IAAM,aAAa,CAAC,GAA0B,GAA0B,QAAyB;AAC/F,QAAM,KAAK,EAAE,GAAG;AAChB,QAAM,KAAK,EAAE,GAAG;AAChB,MAAI,OAAO,OAAO,YAAY,OAAO,OAAO,SAAU,QAAO,KAAK;AAClE,SAAO,OAAO,kBAAM,EAAE,EAAE,cAAc,OAAO,kBAAM,EAAE,CAAC;AACxD;AAEA,SAAS,qBAAqB;AAC5B,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAuB,MAAM,EAAE,QAAQ,KAAK,CAAC;AAC/E,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAuB,MAAM,CAAC;AAC5D,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAA4C,OAAO;AACjG,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,EAAE;AAE/C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAwB,CAAC,CAAC;AACtE,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,KAAK;AAElE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAkB,CAAC,CAAC;AAChD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAkB,CAAC,CAAC;AAEhE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAkC,CAAC,CAAC;AACxE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AAErC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,CAAC;AAClC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,qBAAqB;AACpE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,EAAE;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkB,UAAU;AAC1D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkB,KAAK;AAGrD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,EAAE;AACzD,QAAM,cAAc,OAAsC,MAAS;AAEnE,YAAU,MAAM;AACd,gBAAY,UAAU,WAAW,MAAM,mBAAmB,WAAW,KAAK,CAAC,GAAG,GAAG;AACjF,WAAO,MAAM,aAAa,YAAY,OAAO;AAAA,EAC/C,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAuC,IAAI;AACjF,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAiC,CAAC,CAAC;AACnE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,KAAK;AAG5D,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,UAAwB,IAAI;AAClF,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAuB,IAAI;AACvE,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,EAAE;AAEzD,YAAU,MAAM;AACd,cAAU,EAAE,KAAK,CAAC,SAAS,UAAU,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACjG,GAAG,CAAC,CAAC;AAEL,QAAM,yBAAyB,CAAC,UAAsB;AAAE,uBAAmB,SAAS,IAAI;AAAA,EAAG;AAE3F,QAAM,gBAAgB,MAAM;AAC1B,QAAI,iBAAiB;AACnB,YAAM,MAAM,MAAM;AAClB,UAAI,KAAK,IAAI,QAAQ,KAAK;AAC1B,YAAM,KAAK;AACX,UAAI,oBAAoB,OAAQ,MAAK,IAAI,QAAQ,MAAM,EAAE,QAAQ,KAAK;AAAA,eAC7D,oBAAoB,QAAS,MAAK,IAAI,QAAQ,OAAO,EAAE,QAAQ,KAAK;AAE7E,mBAAa,EAAE;AACf,iBAAW,EAAE;AAAA,IACf,OAAO;AACL,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,cAAcC;AAAA,IAClB,OAAO,YAAoB;AAjK/B;AAkKM,YAAM,KAAK;AACX,YAAM,KAAK;AAEX,UAAI,CAAC,MAAM,CAAC,IAAI;AACd,iBAAS,2BAA2B;AACpC;AAAA,MACF;AAEA,YAAM,SAA4B;AAAA,QAChC,YAAY,GAAG,OAAO,qBAAqB;AAAA,QAC3C,UAAU,GAAG,OAAO,qBAAqB;AAAA,QACzC,UAAU,CAAC,sBAAsB,eAAe,SAAS,IACrD,eAAe,IAAI,CAAC,MAAM,EAAE,MAAM,IAClC;AAAA,QACJ,UAAU,eAAe,SAAS,KAAK,eAAe,SAAS,OAAO,SAClE,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,IAC9B;AAAA,QACJ,QAAQ,mBAAmB;AAAA,QAC3B,MAAM,UAAU;AAAA,QAChB,UAAU;AAAA,MACZ;AAEA,UAAI;AACF,iBAAS,EAAE;AACX,mBAAW,IAAI;AACf,cAAM,MAAM,MAAM,eAAe,MAAM;AACvC,cAAM,SAAS,cAAqC,KAAK,CAAC,QAAQ,CAAC;AACnE,sBAAc,MAAM;AAEpB,cAAM,SACH,sCAAa,UAAb,aACA,gCAAa,eAAb,mBAAyB,UADzB,aAED,gCAAK,YAAL,mBAAc;AAChB,sBAAc,OAAO,UAAU,WAAW,QAAQ,OAAO,MAAM;AAAA,MACjE,SAAS,KAAU;AACjB,kBAAS,2BAAK,YAAW,8BAA8B;AACvD,sBAAc,CAAC,CAAC;AAAA,MAClB,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,WAAW,SAAS,gBAAgB,oBAAoB,gBAAgB,iBAAiB,WAAW;AAAA,EACvG;AAEA,YAAU,MAAM;AACd,YAAQ,CAAC;AACT,gBAAY,CAAC;AAAA,EACf,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,mBAAmBA;AAAA,IACvB,CAAC,QAAoD,YAAoB;AACvE,cAAQ,OAAO;AACf,kBAAY,OAAO;AAAA,IACrB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,eAAe,QAAQ,MAAM;AACjC,UAAM,OAAO,CAAC,GAAG,UAAU;AAC3B,SAAK,KAAK,CAAC,GAAG,MAAM;AAClB,YAAM,MAAM,WAAW,GAAG,GAAG,OAAO;AACpC,aAAO,YAAY,QAAQ,MAAM,CAAC;AAAA,IACpC,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,YAAY,SAAS,OAAO,CAAC;AAEjC,QAAM,gBAAgB;AAEtB,QAAM,aAAa,CAAC,QAAiB;AACnC,QAAI,YAAY,KAAK;AACnB,iBAAW,CAAC,MAAO,MAAM,QAAQ,SAAS,KAAM;AAAA,IAClD,OAAO;AACL,iBAAW,GAAG;AACd,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,eAAeA,aAAY,OAAO,YAAoB;AAC1D,uBAAmB,IAAI;AACvB,QAAI;AACF,YAAM,KAAK,gCAAa,MAAM;AAC9B,YAAM,KAAK,4BAAW,MAAM;AAC5B,YAAM,OAAO,MAAM,sBAAsB,SAAS;AAAA,QAChD,YAAY,GAAG,OAAO,qBAAqB;AAAA,QAC3C,UAAU,GAAG,OAAO,qBAAqB;AAAA,MAC3C,CAAC;AACD,kBAAY,IAAI;AAAA,IAClB,SAAQ;AACN,kBAAY,CAAC,CAAC;AAAA,IAChB,UAAE;AACA,yBAAmB,KAAK;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,QAAM,aAAa,OAAO,QAA+B;AACvD,mBAAe,GAAG;AAClB,gBAAY,CAAC,CAAC;AACd,2BAAuB,IAAI;AAC3B,uBAAmB,EAAE;AACrB,kBAAc,IAAI;AAClB,UAAM,aAAa,IAAI,OAAO;AAAA,EAChC;AAEA,QAAM,cAAc,MAAM;AACxB,kBAAc,KAAK;AACnB,eAAW,MAAM;AACf,qBAAe,IAAI;AACnB,kBAAY,CAAC,CAAC;AACd,6BAAuB,IAAI;AAC3B,yBAAmB,EAAE;AAAA,IACvB,GAAG,GAAG;AAAA,EACR;AAIA,QAAM,kBAAkB,CAAC,YAAkC;AACzD,QAAI,QAAQ,aAAa,KAAM;AAC/B,uBAAmB,EAAE;AACrB,2BAAuB,QAAQ,SAAS;AAExC,sBAAkB,MAAM,CAAC;AAAA,EAC3B;AAEA,QAAM,mBAAmB,MAAM;AAC7B,2BAAuB,IAAI;AAC3B,sBAAkB,IAAI;AACtB,uBAAmB,EAAE;AAAA,EACvB;AAEA,QAAM,iBAAiB,YAAY;AACjC,QAAI,uBAAuB,QAAQ,CAAC,kBAAkB,CAAC,eAAe,QAAQ,GAAG;AAC/E,yBAAmB,4BAA4B;AAC/C;AAAA,IACF;AACA,QAAI;AACF,sBAAgB,IAAI;AACpB,yBAAmB,EAAE;AACrB,YAAM,uBAAuB,qBAAqB,eAAe,YAAY,CAAC;AAC9E,uBAAiB;AAEjB,UAAI,YAAa,OAAM,aAAa,YAAY,OAAO;AACvD,kBAAY,IAAI;AAAA,IAClB,SAAS,KAAU;AACjB,0BAAmB,2BAAK,YAAW,oCAAoC;AAAA,IACzE,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,oBAAoB,YAAY;AACpC,UAAM,KAAK,gCAAa,MAAM;AAC9B,UAAM,KAAK,4BAAW,MAAM;AAC5B,UAAM,SAA4B;AAAA,MAChC,YAAY,GAAG,OAAO,qBAAqB;AAAA,MAC3C,UAAU,GAAG,OAAO,qBAAqB;AAAA,MACzC,UAAU,CAAC,sBAAsB,eAAe,SAAS,IACrD,eAAe,IAAI,CAAC,MAAM,EAAE,MAAM,IAClC;AAAA,MACJ,UAAU,eAAe,SAAS,KAAK,eAAe,SAAS,OAAO,SAClE,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,IAC9B;AAAA,MACJ,QAAQ,mBAAmB;AAAA,IAC7B;AACA,QAAI;AACF,YAAM,yBAAyB,MAAM;AAAA,IACvC,SAAS,KAAU;AACjB,gBAAS,2BAAK,YAAW,wBAAwB;AAAA,IACnD;AAAA,EACF;AAEA,SACE,oBAAC,wBAAqB,aAAa,cACjC,+BAAC,OAAI,IAAI,EAAE,QAAQ,QAAQ,SAAS,QAAQ,eAAe,UAAU,YAAY,KAAK,GACpF;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SACE,qBAAC,SAAM,WAAU,OAAM,YAAW,UAAS,SAAS,GAClD;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU,CAAC,QAAQ;AAAE,8BAAc,GAAG;AAAG,wBAAQ,CAAC;AAAA,cAAG;AAAA,cACrD,aAAY;AAAA,cACZ,OAAO;AAAA;AAAA,UACT;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,aAAa,CAAC,gBAAgB,4BAA4B,gBAAgB,0BAA0B;AAAA,cACpG,cAAc;AAAA,cAEd;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,oBAAC,gBAAa,IAAI,EAAE,UAAU,qBAAqB,GAAG;AAAA,kBACjE,UAAU,CAAC,WAAW;AAAA,kBACtB,SAAS;AAAA,kBACT,IAAI,EAAE,QAAQ,GAAG;AAAA,kBAClB;AAAA;AAAA,cAED;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA,IAEJ;AAAA,IAEA,qBAAC,OAAI,IAAI,EAAE,MAAM,GAAG,UAAU,QAAQ,IAAI,KAAK,IAAI,EAAE,GACnD;AAAA,2BAAC,OAAI,IAAI,EAAE,IAAI,IAAI,GACjB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,eAAe;AAAA,YACf,aAAa;AAAA,YACb,YAAY,mBAAmB;AAAA,YAC/B,oBAAoB;AAAA,YACpB,iBAAe;AAAA,YACf;AAAA,YACA,gBAAgB;AAAA,YAChB;AAAA,YACA,iBAAe;AAAA,YACf;AAAA,YACA;AAAA,YACA,gBAAgB;AAAA,YAChB,OACE;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,oBAAC,eAAY,IAAI,EAAE,UAAU,oBAAoB,GAAG;AAAA,gBAC/D,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,IAAI,EAAE,QAAQ,GAAG;AAAA,gBAClB;AAAA;AAAA,YAED;AAAA;AAAA,QAEJ;AAAA,QAEC,SACC,oBAAC,SAAM,UAAS,SAAQ,IAAI,EAAE,IAAI,GAAG,YAAY,MAAM,UAAU,UAAU,GACxE,iBACH;AAAA,SAEJ;AAAA,MAEC,WACC,oBAAC,OAAI,IAAI,EAAE,WAAW,UAAU,IAAI,IAAI,GACtC,8BAAC,oBAAiB,IAAI,EAAE,OAAO,OAAO,KAAK,GAAG,MAAM,IAAI,GAC1D;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,IAAI;AAAA,YACF,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,IAAI;AAAA,UACN;AAAA,UAEA;AAAA,gCAAC,kBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,wBAAwB;AAAA,oBACtB,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,cAAc;AAAA,oBACd,IAAI;AAAA,oBACJ,IAAI;AAAA,kBACN;AAAA,gBACF;AAAA,gBAEA;AAAA,sCAAC,aACC,8BAAC,YAEG;AAAA,oBACE,EAAE,IAAI,YAAuB,OAAO,YAAY;AAAA,oBAChD,EAAE,IAAI,WAAsB,OAAO,UAAU;AAAA,oBAC7C,EAAE,IAAI,cAAyB,OAAO,SAAS;AAAA,oBAC/C,EAAE,IAAI,aAAwB,OAAO,SAAS;AAAA,oBAC9C,EAAE,IAAI,kBAA6B,OAAO,cAAc;AAAA,oBACxD,EAAE,IAAI,kBAA6B,OAAO,cAAc;AAAA,oBACxD,EAAE,IAAI,4BAAuC,OAAO,mBAAmB;AAAA,oBACvE,EAAE,IAAI,0BAAqC,OAAO,iBAAiB;AAAA,oBACnE,EAAE,IAAI,0BAAqC,OAAO,iBAAiB;AAAA,oBACnE,EAAE,IAAI,kBAA6B,OAAO,gBAAgB;AAAA,kBAC5D,EACA,IAAI,CAAC,QACL,oBAAC,aAAuB,IAAI,YAC1B;AAAA,oBAAC;AAAA;AAAA,sBACC,QAAQ,YAAY,IAAI;AAAA,sBACxB,WAAW,YAAY,IAAI,KAAK,UAAU;AAAA,sBAC1C,SAAS,MAAM,WAAW,IAAI,EAAE;AAAA,sBAChC,IAAI;AAAA,wBACF,4BAA4B,EAAE,OAAO,OAAO;AAAA,wBAC5C,kCAAkC,EAAE,OAAO,OAAO;AAAA,wBAClD,gBAAgB,EAAE,OAAO,OAAO;AAAA,wBAChC,6BAA6B,EAAE,OAAO,kBAAkB;AAAA,sBAC1D;AAAA,sBAEC,cAAI;AAAA;AAAA,kBACP,KAbc,IAAI,EAcpB,CACD,GACH,GACF;AAAA,kBAEA,oBAAC,aACE,wBAAc,IAAI,CAAC,KAAK,QAAQ;AAC/B,0BAAM,aAAa,CAAC,IAAI;AACxB,2BACE;AAAA,sBAAC;AAAA;AAAA,wBAEC,OAAK;AAAA,wBACL,IAAI;AAAA,0BACF,iBAAiB;AAAA,0BACjB,WAAW,EAAE,iBAAiB,UAAU;AAAA,wBAC1C;AAAA,wBAEA;AAAA,8CAAC,aAAU,IAAI,EAAE,YAAY,KAAK,OAAO,OAAO,MAAM,UAAU,UAAU,GACvE,cAAI,YAAY,UACnB;AAAA,0BACA,oBAAC,aAAU,IAAI,EAAE,UAAU,WAAW,OAAO,UAAU,GAAI,cAAI,WAAW,UAAI;AAAA,0BAC9E,oBAAC,aACE,cAAI,aACH;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO,IAAI;AAAA,8BACX,MAAK;AAAA,8BACL,IAAI;AAAA,gCACF,YAAY;AAAA,gCACZ,iBAAiB;AAAA,gCACjB,OAAO,OAAO;AAAA,gCACd,YAAY;AAAA,gCACZ,UAAU;AAAA,gCACV,QAAQ;AAAA,8BACV;AAAA;AAAA,0BACF,IAEA,UAEJ;AAAA,0BACA,oBAAC,aAAU,IAAI,EAAE,WAAW,SAAS,GACnC;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO,IAAI;AAAA,8BACX,MAAK;AAAA,8BACL,SAAS,CAAC,MAAM;AAAE,kCAAE,gBAAgB;AAAG,2CAAW,GAAG;AAAA,8BAAG;AAAA,8BACxD,IAAI;AAAA,gCACF,YAAY;AAAA,gCACZ,iBAAiB,OAAO;AAAA,gCACxB,OAAO;AAAA,gCACP,YAAY;AAAA,gCACZ,UAAU;AAAA,gCACV,QAAQ;AAAA,gCACR,UAAU;AAAA,gCACV,QAAQ;AAAA,gCACR,WAAW,EAAE,iBAAiB,OAAO,KAAK;AAAA,8BAC5C;AAAA;AAAA,0BACF,GACF;AAAA,0BACA,oBAAC,aAAU,IAAI,EAAE,UAAU,WAAW,OAAO,UAAU,GACpD,cAAI,iBACD,MAAM,IAAI,cAAc,EAAE,OAAO,qBAAqB,IACtD,UACN;AAAA,0BACA,oBAAC,aAAU,IAAI,EAAE,UAAU,WAAW,OAAO,UAAU,GACpD,uBACC;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAM;AAAA,8BACN,MAAK;AAAA,8BACL,IAAI;AAAA,gCACF,YAAY;AAAA,gCACZ,iBAAiB,OAAO;AAAA,gCACxB,OAAO;AAAA,gCACP,YAAY;AAAA,gCACZ,UAAU;AAAA,gCACV,QAAQ;AAAA,8BACV;AAAA;AAAA,0BACF,IAEA,MAAM,IAAI,cAAc,EAAE,OAAO,qBAAqB,GAE1D;AAAA,0BACA;AAAA,4BAAC;AAAA;AAAA,8BACC,IAAI,EAAE,YAAY,KAAK,OAAO,OAAO,MAAM,UAAU,WAAW,oBAAoB,eAAe;AAAA,8BAElG,cAAI,4BAA4B;AAAA;AAAA,0BACnC;AAAA,0BACA;AAAA,4BAAC;AAAA;AAAA,8BACC,IAAI,EAAE,YAAY,KAAK,OAAO,OAAO,OAAO,UAAU,WAAW,oBAAoB,eAAe;AAAA,8BAEnG,cAAI,0BAA0B;AAAA;AAAA,0BACjC;AAAA,0BACA,oBAAC,aAAU,IAAI,EAAE,YAAY,KAAK,UAAU,WAAW,oBAAoB,eAAe,GACvF,cAAI,0BAA0B,UACjC;AAAA,0BACA,oBAAC,aAAU,IAAI,EAAE,UAAU,IAAI,GAC5B,cAAI,kBAAkB,QAAQ,MAAM;AACnC,kCAAM,MAAM,KAAK,IAAI,IAAI,gBAAgB,GAAG;AAC5C,kCAAM,WACJ,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY;AAClD,kCAAM,SACJ,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY;AAClD,mCACE,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GACzD;AAAA;AAAA,gCAAC;AAAA;AAAA,kCACC,IAAI;AAAA,oCACF,UAAU;AAAA,oCACV,MAAM;AAAA,oCACN,QAAQ;AAAA,oCACR,cAAc;AAAA,oCACd,iBAAiB;AAAA,oCACjB,UAAU;AAAA,kCACZ;AAAA,kCAEA;AAAA,oCAAC;AAAA;AAAA,sCACC,IAAI;AAAA,wCACF,OAAO,GAAG,GAAG;AAAA,wCACb,QAAQ;AAAA,wCACR,cAAc;AAAA,wCACd,YAAY,0BAA0B,QAAQ,OAAO,QAAQ;AAAA,wCAC7D,YAAY;AAAA,sCACd;AAAA;AAAA,kCACF;AAAA;AAAA,8BACF;AAAA,8BACA;AAAA,gCAAC;AAAA;AAAA,kCACC,OAAO,GAAG,KAAK,MAAM,GAAG,CAAC;AAAA,kCACzB,MAAK;AAAA,kCACL,IAAI;AAAA,oCACF,YAAY;AAAA,oCACZ,QAAQ;AAAA,oCACR,UAAU;AAAA,oCACV,UAAU;AAAA,oCACV,YAAY;AAAA,oCACZ,iBAAiB;AAAA,oCACjB,OAAO;AAAA,oCACP,oBAAoB,EAAE,IAAI,IAAI;AAAA,kCAChC;AAAA;AAAA,8BACF;AAAA,+BACF;AAAA,0BAEJ,GAAG,IACD,UAEJ;AAAA;AAAA;AAAA,sBAnIK,GAAG,IAAI,OAAO,IAAI,GAAG;AAAA,oBAoI5B;AAAA,kBAEJ,CAAC,GACH;AAAA;AAAA;AAAA,YACF,GACF;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBACP;AAAA,gBACA,cAAc;AAAA,gBACd;AAAA,gBACA,oBAAoB,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,gBACxC,qBAAqB,CAAC,MAAM;AAAE,iCAAe,SAAS,EAAE,OAAO,OAAO,EAAE,CAAC;AAAG,0BAAQ,CAAC;AAAA,gBAAG;AAAA,gBACxF,IAAI,EAAE,WAAW,qBAAqB,YAAY,MAAM,uCAAuC,EAAE,YAAY,MAAM,UAAU,UAAU,GAAG,qCAAqC,EAAE,YAAY,MAAM,UAAU,UAAU,EAAE;AAAA;AAAA,YAC3N;AAAA;AAAA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,SAAS,CAAC,IAAI,WAAW;AAAE,gBAAI,WAAW,gBAAiB,aAAY;AAAA,UAAG;AAAA,UAC1E,UAAS;AAAA,UACT,WAAS;AAAA,UACT,YAAY;AAAA,YACV,IAAI;AAAA,cACF,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,WAAW;AAAA,cACX,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,kBACF,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,gBAAgB;AAAA,kBAChB,YAAY;AAAA,kBACZ,IAAI;AAAA,kBACJ,IAAI;AAAA,gBACN;AAAA,gBAEA;AAAA,uCAAC,OACC;AAAA,wCAAC,cAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,MAAM,YAAY,KAAK,UAAU,WAAW,eAAe,QAAQ,GAAG,4BAEjH;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,IAAI,EAAE,YAAY,MAAM,SAAS,KAAK,UAAU,WAAW,IAAI,IAAI;AAAA,wBAElE;AAAA,qEAAa;AAAA,0BAAS;AAAA,0BAAS,2CAAa;AAAA,0BAAU;AAAA,2BAAS,2CAAa,eAAc,IAAI,MAAM;AAAA;AAAA;AAAA,oBACvG;AAAA,qBACF;AAAA,kBACA,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GACzD;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAW,oBAAC,gBAAa,IAAI,EAAE,UAAU,qBAAqB,GAAG;AAAA,wBACjE,SAAS,YAAY;AACnB,8BAAI,CAAC,YAAa;AAClB,8BAAI;AACF,kCAAM,gCAAgC,YAAY,SAAS;AAAA,8BACzD,aAAa,gCAAa,MAAM,GAAG,OAAO,qBAAqB;AAAA,8BAC/D,WAAW,4BAAW,MAAM,GAAG,OAAO,qBAAqB;AAAA,4BAC7D,CAAC;AAAA,0BACH,SAAS,KAAU;AACjB,sCAAS,2BAAK,YAAW,wBAAwB;AAAA,0BACnD;AAAA,wBACF;AAAA,wBACA,IAAI,EAAE,YAAY,SAAS;AAAA,wBAC5B;AAAA;AAAA,oBAED;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,MAAK;AAAA,wBACL,IAAI;AAAA,0BACF,OAAO;AAAA,0BACP,iBAAiB;AAAA,0BACjB,WAAW,EAAE,iBAAiB,wBAAwB;AAAA,wBACxD;AAAA,wBAEA,8BAAC,aAAU,UAAS,SAAQ;AAAA;AAAA,oBAC9B;AAAA,qBACF;AAAA;AAAA;AAAA,YACF;AAAA,YAEA,oBAAC,iBAAc,IAAI,EAAE,GAAG,GAAG,iBAAiB,UAAU,GACnD,4BACC,oBAAC,OAAI,IAAI,EAAE,GAAG,GAAG,WAAW,SAAS,GACnC,8BAAC,oBAAiB,MAAM,IAAI,IAAI,EAAE,OAAO,gCAAgC,GAAG,GAC9E,IACE,SAAS,SAAS,IACpB,oBAAC,OAAI,IAAI,EAAE,GAAG,KAAK,WAAW,KAAK,WAAW,OAAO,GAClD,iBAAO;AAAA,cACN,SAAS,OAA+C,CAAC,KAAK,MAAM;AAClE,sBAAM,UAAU,EAAE,YACd,MAAM,EAAE,SAAS,EAAE,OAAO,aAAa,IACvC;AACJ,oBAAI,CAAC,IAAI,OAAO,EAAG,KAAI,OAAO,IAAI,CAAC;AACnC,oBAAI,OAAO,EAAE,KAAK,CAAC;AACnB,uBAAO;AAAA,cACT,GAAG,CAAC,CAAC;AAAA,YACP,EAAE,IAAI,CAAC,CAAC,MAAM,YAAY,MACxB;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAW;AAAA,gBACX,IAAI;AAAA,kBACF,IAAI;AAAA,kBACJ,cAAc;AAAA,kBACd,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,iBAAiB;AAAA,gBACnB;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,wBACF,IAAI;AAAA,wBACJ,IAAI;AAAA,wBACJ,iBAAiB;AAAA,wBACjB,cAAc;AAAA,sBAChB;AAAA,sBAEA;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAI;AAAA,4BACF,YAAY;AAAA,4BACZ,YAAY;AAAA,4BACZ,UAAU;AAAA,4BACV,OAAO;AAAA,4BACP,eAAe;AAAA,0BACjB;AAAA,0BAEC;AAAA;AAAA,sBACH;AAAA;AAAA,kBACF;AAAA,kBACA,qBAAC,OAAI,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GACxB;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,IAAI;AAAA,0BACF,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,KAAK;AAAA,0BACL,IAAI;AAAA,0BACJ,IAAI;AAAA,0BACJ,cAAc;AAAA,wBAChB;AAAA,wBAEA;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,IAAI;AAAA,gCACF,MAAM;AAAA,gCACN,YAAY;AAAA,gCACZ,UAAU;AAAA,gCACV,YAAY;AAAA,gCACZ,OAAO;AAAA,gCACP,eAAe;AAAA,gCACf,eAAe;AAAA,8BACjB;AAAA,8BACD;AAAA;AAAA,0BAED;AAAA,0BACA;AAAA,4BAAC;AAAA;AAAA,8BACC,IAAI;AAAA,gCACF,MAAM;AAAA,gCACN,YAAY;AAAA,gCACZ,UAAU;AAAA,gCACV,YAAY;AAAA,gCACZ,OAAO;AAAA,gCACP,eAAe;AAAA,gCACf,eAAe;AAAA,8BACjB;AAAA,8BACD;AAAA;AAAA,0BAED;AAAA;AAAA;AAAA,oBACF;AAAA,oBACC,aAAa,IAAI,CAAC,GAAG,MAAM;AAC1B,4BAAM,gBAAgB,CAAC,EAAE;AACzB,4BAAM,YAAY,EAAE,aAAa,QAAQ,wBAAwB,EAAE;AACnE,6BACE;AAAA,wBAAC;AAAA;AAAA,0BAEC,IAAI;AAAA,4BACF,IAAI;AAAA,4BACJ,cAAc,IAAI,aAAa,SAAS,IAAI,uBAAuB;AAAA,0BACrE;AAAA,0BAEA;AAAA,iDAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA;AAAA,gCAAC;AAAA;AAAA,kCACC,WAAU;AAAA,kCACV,IAAI;AAAA,oCACF,MAAM;AAAA,oCACN,YAAY;AAAA,oCACZ,UAAU;AAAA,oCACV,YAAY;AAAA,oCACZ,OAAO,EAAE,YAAY,OAAO,QAAQ;AAAA,oCACpC,SAAS;AAAA,oCACT,YAAY;AAAA,oCACZ,KAAK;AAAA,kCACP;AAAA,kCAEA;AAAA,wDAAC,UAAK,OAAO,EAAE,UAAU,SAAS,GAAI,oBAAI;AAAA,oCACzC,EAAE,YAAY,MAAM,EAAE,SAAS,EAAE,OAAO,uBAAuB,IAAI;AAAA;AAAA;AAAA,8BACtE;AAAA,8BACA,qBAAC,OAAI,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,KAAK,IAAI,GACnG;AAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,WAAU;AAAA,oCACV,IAAI;AAAA,sCACF,YAAY;AAAA,sCACZ,UAAU;AAAA,sCACV,YAAY;AAAA,sCACZ,OAAO,EAAE,aAAa,OAAO,MAAM;AAAA,sCACnC,SAAS;AAAA,sCACT,YAAY;AAAA,sCACZ,KAAK;AAAA,oCACP;AAAA,oCAEA;AAAA,0DAAC,UAAK,OAAO,EAAE,UAAU,SAAS,GAAI,oBAAI;AAAA,sCACzC,EAAE,aACC,MAAM,EAAE,UAAU,EAAE,OAAO,uBAAuB,IAClD;AAAA;AAAA;AAAA,gCACN;AAAA,gCACC,iBAAiB,EAAE,aAAa,QAAQ,CAAC,aACxC;AAAA,kCAAC;AAAA;AAAA,oCACC,aAAa,CAAC,gBAAgB,0BAA0B;AAAA,oCACxD,cAAc;AAAA,oCAEd,8BAAC,WAAQ,OAAM,qCACb;AAAA,sCAAC;AAAA;AAAA,wCACC,MAAK;AAAA,wCACL,SAAS,MAAM,gBAAgB,CAAC;AAAA,wCAChC,IAAI;AAAA,0CACF,GAAG;AAAA,0CACH,OAAO;AAAA,0CACP,cAAc;AAAA,0CACd,WAAW,EAAE,iBAAiB,uBAAuB;AAAA,wCACvD;AAAA,wCAEA,8BAAC,oBAAiB,IAAI,EAAE,UAAU,UAAU,GAAG;AAAA;AAAA,oCACjD,GACF;AAAA;AAAA,gCACF;AAAA,iCAEJ;AAAA,+BACF;AAAA,4BAEC,aACC;AAAA,8BAAC;AAAA;AAAA,gCACC,IAAI;AAAA,kCACF,IAAI;AAAA,kCACJ,GAAG;AAAA,kCACH,cAAc;AAAA,kCACd,iBAAiB;AAAA,kCACjB,QAAQ;AAAA,gCACV;AAAA,gCAEA;AAAA;AAAA,oCAAC;AAAA;AAAA,sCACC,IAAI;AAAA,wCACF,YAAY;AAAA,wCACZ,UAAU;AAAA,wCACV,YAAY;AAAA,wCACZ,eAAe;AAAA,wCACf,eAAe;AAAA,wCACf,OAAO;AAAA,wCACP,IAAI;AAAA,sCACN;AAAA,sCACD;AAAA;AAAA,kCAED;AAAA,kCACA;AAAA,oCAAC;AAAA;AAAA,sCACC,OAAO;AAAA,sCACP,UAAU,CAAC,QAAQ,kBAAkB,GAAG;AAAA,sCACxC,aAAa,EAAE,YAAY,MAAM,EAAE,SAAS,IAAI;AAAA,sCAChD,aAAa,MAAM;AAAA,sCACnB,MAAI;AAAA,sCACJ,QAAO;AAAA,sCACP,WAAW;AAAA,wCACT,WAAW;AAAA,0CACT,MAAM;AAAA,0CACN,WAAW;AAAA,0CACX,IAAI;AAAA,4CACF,iBAAiB;AAAA,4CACjB,4BAA4B;AAAA,8CAC1B,cAAc;AAAA,8CACd,YAAY;AAAA,8CACZ,UAAU;AAAA,8CACV,0BAA0B,EAAE,aAAa,gCAAgC;AAAA,4CAC3E;AAAA,0CACF;AAAA,wCACF;AAAA,wCACA,WAAW,EAAE,SAAS,CAAC,SAAS,UAAU,QAAQ,EAAE;AAAA,sCACtD;AAAA;AAAA,kCACF;AAAA,kCACC,mBACC,oBAAC,cAAW,IAAI,EAAE,YAAY,MAAM,OAAO,OAAO,KAAK,UAAU,UAAU,IAAI,IAAI,GAChF,2BACH;AAAA,kCAEF,qBAAC,SAAM,WAAU,OAAM,gBAAe,YAAW,SAAS,GAAG,IAAI,EAAE,IAAI,EAAE,GACvE;AAAA;AAAA,sCAAC;AAAA;AAAA,wCACC,SAAQ;AAAA,wCACR,MAAK;AAAA,wCACL,SAAS;AAAA,wCACT,UAAU;AAAA,wCACX;AAAA;AAAA,oCAED;AAAA,oCACA;AAAA,sCAAC;AAAA;AAAA,wCACC,MAAK;AAAA,wCACL,SAAS;AAAA,wCACT,UAAU;AAAA,wCACV,WACE,eACI,oBAAC,oBAAiB,MAAM,IAAI,IAAI,EAAE,OAAO,OAAO,GAAG,IACnD,oBAAC,aAAU,IAAI,EAAE,UAAU,qBAAqB,GAAG;AAAA,wCAGxD,yBAAe,iBAAY;AAAA;AAAA,oCAC9B;AAAA,qCACF;AAAA;AAAA;AAAA,4BACF;AAAA;AAAA;AAAA,wBA3IG;AAAA,sBA6IP;AAAA,oBAEJ,CAAC;AAAA,qBACH;AAAA;AAAA;AAAA,cAzNK;AAAA,YA0NP,CACD,GACH,IAEA,oBAAC,OAAI,IAAI,EAAE,GAAG,GAAG,WAAW,SAAS,GACnC,8BAAC,cAAW,IAAI,EAAE,YAAY,MAAM,OAAO,WAAW,WAAW,UAAU,UAAU,UAAU,GAAG,+BAElG,GACF,GAEJ;AAAA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;AAEA,IAAM,cAAwB,MAC5B,oBAAC,eACC,8BAAC,sBAAmB,GACtB;AAGF,IAAO,sBAAQ;","names":["useCallback","useState","useState","useCallback"]}
|
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ReportFilterBar,
|
|
3
3
|
headCellSx
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-HAJ6SECI.mjs";
|
|
5
5
|
import {
|
|
6
6
|
PageHeader
|
|
7
7
|
} from "./chunk-JOZ4YQMR.mjs";
|
|
8
8
|
import {
|
|
9
9
|
AppButton
|
|
10
10
|
} from "./chunk-HBR2JS4C.mjs";
|
|
11
|
+
import {
|
|
12
|
+
AdapterDayjs,
|
|
13
|
+
LocalizationProvider
|
|
14
|
+
} from "./chunk-AJQBR3AZ.mjs";
|
|
11
15
|
import {
|
|
12
16
|
SDKProvider
|
|
13
17
|
} from "./chunk-6ICPXSN6.mjs";
|
|
14
18
|
import {
|
|
15
19
|
END_POINT,
|
|
16
20
|
axios_default
|
|
17
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-OVC42HVH.mjs";
|
|
18
22
|
import {
|
|
19
23
|
__spreadProps,
|
|
20
24
|
__spreadValues
|
|
21
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-UB5HSUGK.mjs";
|
|
22
26
|
|
|
23
27
|
// call-control-sdk/lib/pages/managementDashboard/index.tsx
|
|
24
28
|
import { useState, useEffect, useCallback, useMemo, useRef } from "react";
|
|
@@ -43,8 +47,6 @@ import {
|
|
|
43
47
|
FormControlLabel
|
|
44
48
|
} from "@mui/material";
|
|
45
49
|
import dayjs from "dayjs";
|
|
46
|
-
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
|
|
47
|
-
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
|
|
48
50
|
import {
|
|
49
51
|
ComposedChart,
|
|
50
52
|
Bar,
|
|
@@ -526,4 +528,4 @@ var managementDashboard_default = ManagementDashboard;
|
|
|
526
528
|
export {
|
|
527
529
|
managementDashboard_default as default
|
|
528
530
|
};
|
|
529
|
-
//# sourceMappingURL=managementDashboard-
|
|
531
|
+
//# sourceMappingURL=managementDashboard-PARD3QHL.mjs.map
|