ahs-cti 0.0.2-beta.9 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +425 -294
  2. package/dist/agentDetailReport-XSBMOUMW.mjs +12 -0
  3. package/dist/agentDetailReport-XSBMOUMW.mjs.map +1 -0
  4. package/dist/agentPerformanceReport-UT6QZWYD.mjs +533 -0
  5. package/dist/agentPerformanceReport-UT6QZWYD.mjs.map +1 -0
  6. package/dist/auditReport-R67BYA4Z.mjs +15 -0
  7. package/dist/auditReport-R67BYA4Z.mjs.map +1 -0
  8. package/dist/callHistory-PHGY224F.mjs +805 -0
  9. package/dist/callHistory-PHGY224F.mjs.map +1 -0
  10. package/dist/campaigns-JSMYHHDF.mjs +3049 -0
  11. package/dist/campaigns-JSMYHHDF.mjs.map +1 -0
  12. package/dist/caroQualityAuditDashboard-7X44HRZL.mjs +66 -0
  13. package/dist/caroQualityAuditDashboard-7X44HRZL.mjs.map +1 -0
  14. package/dist/caroVoiceAI-OZAB7LK4.mjs +21 -0
  15. package/dist/caroVoiceAI-OZAB7LK4.mjs.map +1 -0
  16. package/dist/cdrReport-44LN5VUX.mjs +819 -0
  17. package/dist/cdrReport-44LN5VUX.mjs.map +1 -0
  18. package/dist/chunk-6ICPXSN6.mjs +61 -0
  19. package/dist/chunk-6ICPXSN6.mjs.map +1 -0
  20. package/dist/chunk-CXULBAK6.mjs +493 -0
  21. package/dist/chunk-CXULBAK6.mjs.map +1 -0
  22. package/dist/chunk-FVXHNBYV.mjs +82 -0
  23. package/dist/chunk-FVXHNBYV.mjs.map +1 -0
  24. package/dist/chunk-G6KDIN5W.mjs +749 -0
  25. package/dist/chunk-G6KDIN5W.mjs.map +1 -0
  26. package/dist/chunk-GGACEO3I.mjs +180 -0
  27. package/dist/chunk-GGACEO3I.mjs.map +1 -0
  28. package/dist/chunk-HBR2JS4C.mjs +95 -0
  29. package/dist/chunk-HBR2JS4C.mjs.map +1 -0
  30. package/dist/chunk-HRM6S6J2.mjs +61 -0
  31. package/dist/chunk-HRM6S6J2.mjs.map +1 -0
  32. package/dist/chunk-JOZ4YQMR.mjs +116 -0
  33. package/dist/chunk-JOZ4YQMR.mjs.map +1 -0
  34. package/dist/chunk-O2XGWZLT.mjs +1060 -0
  35. package/dist/chunk-O2XGWZLT.mjs.map +1 -0
  36. package/dist/chunk-RZZQ42MG.mjs +115 -0
  37. package/dist/chunk-RZZQ42MG.mjs.map +1 -0
  38. package/dist/chunk-UZF5Q3GR.mjs +678 -0
  39. package/dist/chunk-UZF5Q3GR.mjs.map +1 -0
  40. package/dist/chunk-VQCHBU2Q.mjs +27 -0
  41. package/dist/chunk-VQCHBU2Q.mjs.map +1 -0
  42. package/dist/chunk-WWWM33FY.mjs +57 -0
  43. package/dist/chunk-WWWM33FY.mjs.map +1 -0
  44. package/dist/index.d.mts +795 -112
  45. package/dist/index.d.ts +796 -112
  46. package/dist/index.js +13838 -2251
  47. package/dist/index.js.map +1 -1
  48. package/dist/index.mjs +2335 -2250
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/liveStatus-AHKS4XLW.mjs +1077 -0
  51. package/dist/liveStatus-AHKS4XLW.mjs.map +1 -0
  52. package/dist/loginReport-7GBMZP55.mjs +828 -0
  53. package/dist/loginReport-7GBMZP55.mjs.map +1 -0
  54. package/dist/managementDashboard-TYON77NW.mjs +529 -0
  55. package/dist/managementDashboard-TYON77NW.mjs.map +1 -0
  56. package/dist/qualityAuditDashboard-AGJH5VVN.mjs +66 -0
  57. package/dist/qualityAuditDashboard-AGJH5VVN.mjs.map +1 -0
  58. package/package.json +16 -6
@@ -0,0 +1,12 @@
1
+ import {
2
+ agentDetailReport_default
3
+ } from "./chunk-G6KDIN5W.mjs";
4
+ import "./chunk-JOZ4YQMR.mjs";
5
+ import "./chunk-HBR2JS4C.mjs";
6
+ import "./chunk-6ICPXSN6.mjs";
7
+ import "./chunk-O2XGWZLT.mjs";
8
+ import "./chunk-VQCHBU2Q.mjs";
9
+ export {
10
+ agentDetailReport_default as default
11
+ };
12
+ //# sourceMappingURL=agentDetailReport-XSBMOUMW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,533 @@
1
+ import {
2
+ ReportFilterBar,
3
+ SearchBar,
4
+ headCellSx,
5
+ reportBodyCellSx,
6
+ sortLabelSx
7
+ } from "./chunk-CXULBAK6.mjs";
8
+ import {
9
+ SDKPermissionGuard
10
+ } from "./chunk-GGACEO3I.mjs";
11
+ import {
12
+ agentDetailReport_default
13
+ } from "./chunk-G6KDIN5W.mjs";
14
+ import {
15
+ PageHeader
16
+ } from "./chunk-JOZ4YQMR.mjs";
17
+ import {
18
+ AppButton
19
+ } from "./chunk-HBR2JS4C.mjs";
20
+ import {
21
+ SDKProvider
22
+ } from "./chunk-6ICPXSN6.mjs";
23
+ import {
24
+ END_POINT,
25
+ SDK_PERMISSIONS,
26
+ axios_default
27
+ } from "./chunk-O2XGWZLT.mjs";
28
+ import {
29
+ __spreadProps,
30
+ __spreadValues
31
+ } from "./chunk-VQCHBU2Q.mjs";
32
+
33
+ // call-control-sdk/lib/pages/agentPerformanceReport/index.tsx
34
+ import { useState as useState2, useEffect, useCallback as useCallback2, useMemo, useRef } from "react";
35
+ import {
36
+ Box,
37
+ Paper,
38
+ Table,
39
+ TableBody,
40
+ TableCell,
41
+ TableContainer,
42
+ TableHead,
43
+ TableRow,
44
+ TableSortLabel,
45
+ TablePagination,
46
+ CircularProgress,
47
+ Alert,
48
+ Stack,
49
+ IconButton
50
+ } from "@mui/material";
51
+ import FileDownloadIcon from "@mui/icons-material/FileDownload";
52
+ import RefreshIcon from "@mui/icons-material/Refresh";
53
+ import VisibilityIcon from "@mui/icons-material/Visibility";
54
+ import dayjs from "dayjs";
55
+ import isoWeek from "dayjs/plugin/isoWeek";
56
+ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
57
+ import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
58
+
59
+ // call-control-sdk/lib/pages/agentPerformanceReport/useAgentPerformanceReport.ts
60
+ import { useCallback, useState } from "react";
61
+ function fmtSecs(s) {
62
+ if (!s || s <= 0) return "00:00:00";
63
+ const h = Math.floor(s / 3600);
64
+ const m = Math.floor(s % 3600 / 60);
65
+ const sc = Math.floor(s % 60);
66
+ return [h, m, sc].map((x) => String(x).padStart(2, "0")).join(":");
67
+ }
68
+ function validateReportPayload(payload) {
69
+ if (!payload.startDate || !payload.startTime) return { isValid: false, error: "Start date/time required" };
70
+ if (!payload.endDate || !payload.endTime) return { isValid: false, error: "End date/time required" };
71
+ if (!payload.loginUsersOnly && !payload.agents) return { isValid: false, error: "Select at least one agent" };
72
+ return { isValid: true };
73
+ }
74
+ function mapAgentPerfRow(a) {
75
+ var _a;
76
+ return {
77
+ agentDetails: { agentId: a.agentId, fullName: a.fullName, process: a.processName, queueNames: a.queueNames },
78
+ calls: { totalCalls: a.totalCalls, answered: a.answeredCalls, missed: a.missedCalls },
79
+ inCalls: { total: a.inCalls },
80
+ outCalls: { total: a.outCalls },
81
+ average: { holdTime: fmtSecs(a.holdTimeSeconds), wrapUp: fmtSecs(a.wrapupSeconds), aht: fmtSecs(a.ahtSeconds), ringing: "00:00:00", dialing: "00:00:00" },
82
+ loginDetails: { loggedInDuration: fmtSecs(a.loginDurationSeconds), talkTime: fmtSecs(a.talkTimeSeconds), idleTime: fmtSecs(a.idleTimeSeconds) },
83
+ breaks: { shortBreak: fmtSecs(a.breakTimeSeconds), breakCount: a.breakCount, lunch: "00:00:00", tea: "00:00:00", training: "00:00:00", meeting: "00:00:00" },
84
+ loginStats: { firstLogin: a.firstLoginTime || "", noOfLogins: 0 },
85
+ adherence: { pct: (_a = a.adherencePct) != null ? _a : null }
86
+ };
87
+ }
88
+ async function getUserPerformanceReportPaged(payload) {
89
+ var _a, _b, _c, _d, _e, _f, _g, _h;
90
+ const params = {
91
+ start_date: payload.startDate,
92
+ end_date: payload.endDate,
93
+ agent_id: payload.agents,
94
+ queue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : void 0,
95
+ page: (_a = payload.page) != null ? _a : 1,
96
+ pageSize: (_b = payload.pageSize) != null ? _b : 10,
97
+ search: payload.search
98
+ };
99
+ const res = await axios_default.get(
100
+ `${END_POINT.AGENT_PERFORMANCE_REPORT}${buildQs(params)}`
101
+ );
102
+ const data = res.data;
103
+ const agentsPage = data == null ? void 0 : data.agents;
104
+ const rawRows = Array.isArray(agentsPage) ? agentsPage : Array.isArray(agentsPage == null ? void 0 : agentsPage.data) ? agentsPage.data : [];
105
+ const rows = rawRows.map(mapAgentPerfRow);
106
+ const total = (_h = (_g = (_e = (_c = agentsPage == null ? void 0 : agentsPage.total) != null ? _c : data == null ? void 0 : data.total) != null ? _e : (_d = data == null ? void 0 : data.pagination) == null ? void 0 : _d.total) != null ? _g : (_f = data == null ? void 0 : data.summary) == null ? void 0 : _f.agentsLoggedIn) != null ? _h : rows.length;
107
+ return { rows, total };
108
+ }
109
+ async function fetchQueues() {
110
+ var _a;
111
+ const res = await axios_default.get(END_POINT.MASTER_QUEUES);
112
+ if (Array.isArray(res.data)) return res.data;
113
+ if (Array.isArray((_a = res.data) == null ? void 0 : _a.data)) return res.data.data;
114
+ return [];
115
+ }
116
+ async function fetchProcesses() {
117
+ var _a;
118
+ const res = await axios_default.get(END_POINT.MASTER_PROCESS);
119
+ if (Array.isArray(res.data)) return res.data;
120
+ if (Array.isArray((_a = res.data) == null ? void 0 : _a.data)) return res.data.data;
121
+ return [];
122
+ }
123
+ function buildQs(params) {
124
+ const qs = new URLSearchParams();
125
+ if (params.start_date) qs.append("start_date", params.start_date);
126
+ if (params.end_date) qs.append("end_date", params.end_date);
127
+ if (params.agent_id) for (const id of params.agent_id) qs.append("agent_id", id);
128
+ if (params.queue_id) for (const id of params.queue_id) qs.append("queue_id", String(id));
129
+ if (params.process_id) for (const id of params.process_id) qs.append("process_id", String(id));
130
+ if (params.top_n) qs.append("top_n", String(params.top_n));
131
+ if (params.search) qs.append("search", params.search);
132
+ if (params.page) qs.append("page", String(params.page));
133
+ if (params.pageSize) qs.append("pageSize", String(params.pageSize));
134
+ const str = qs.toString();
135
+ return str ? `?${str}` : "";
136
+ }
137
+ async function exportAgentPerformanceToExcel(params) {
138
+ var _a;
139
+ const res = await axios_default.get(
140
+ `${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${buildQs(params)}`,
141
+ { responseType: "blob" }
142
+ );
143
+ const url = URL.createObjectURL(new Blob([res.data]));
144
+ const a = document.createElement("a");
145
+ a.href = url;
146
+ a.download = `agent-performance-${(_a = params.start_date) != null ? _a : "export"}.xlsx`;
147
+ a.click();
148
+ URL.revokeObjectURL(url);
149
+ }
150
+
151
+ // call-control-sdk/lib/pages/agentPerformanceReport/index.tsx
152
+ import { jsx, jsxs } from "react/jsx-runtime";
153
+ dayjs.extend(isoWeek);
154
+ var C = {
155
+ navy: "#0d2a56",
156
+ blue: "#1565c8",
157
+ green: "#0a9a62",
158
+ amber: "#c47c00",
159
+ red: "#cc2a2a",
160
+ purple: "#6b3fbf",
161
+ teal: "#0b7a8f",
162
+ bg: "transparent",
163
+ surface: "#fff",
164
+ s2: "#f7f9fc",
165
+ s3: "#eef2f7",
166
+ b1: "rgba(20,50,100,.07)",
167
+ b2: "rgba(20,50,100,.13)",
168
+ t1: "#0d1e35",
169
+ t2: "#364f6e",
170
+ t3: "#7a93b5",
171
+ t4: "#bccad9",
172
+ blt: "#e8f0fc",
173
+ glt: "#e4f6ef",
174
+ alt: "#fdf3e0",
175
+ rlt: "#fde8e8",
176
+ plt: "#f0eafa",
177
+ tlt: "#e3f4f7"
178
+ };
179
+ function parseDur(d) {
180
+ if (!d || d === "00:00:00") return 0;
181
+ const p = d.split(":").map(Number);
182
+ if (p.length === 3) return p[0] * 3600 + p[1] * 60 + p[2];
183
+ if (p.length === 2) return p[0] * 60 + p[1];
184
+ return 0;
185
+ }
186
+ function fmtDur(s) {
187
+ if (!s || s <= 0) return "00:00:00";
188
+ const h = Math.floor(s / 3600);
189
+ const m = Math.floor(s % 3600 / 60);
190
+ const sc = Math.floor(s % 60);
191
+ return [h, m, sc].map((x) => String(x).padStart(2, "0")).join(":");
192
+ }
193
+ function getVal(row, key) {
194
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B;
195
+ switch (key) {
196
+ case "id":
197
+ return ((_a = row.agentDetails) == null ? void 0 : _a.agentId) || "";
198
+ case "name":
199
+ return ((_b = row.agentDetails) == null ? void 0 : _b.fullName) || "";
200
+ case "process":
201
+ return ((_c = row.agentDetails) == null ? void 0 : _c.process) || "";
202
+ case "queue":
203
+ return ((_d = row.agentDetails) == null ? void 0 : _d.queueNames) || "";
204
+ case "total":
205
+ return (_f = (_e = row.calls) == null ? void 0 : _e.totalCalls) != null ? _f : 0;
206
+ case "ans":
207
+ return (_h = (_g = row.calls) == null ? void 0 : _g.answered) != null ? _h : 0;
208
+ case "miss":
209
+ return (_j = (_i = row.calls) == null ? void 0 : _i.missed) != null ? _j : 0;
210
+ case "inTotal":
211
+ return (_l = (_k = row.inCalls) == null ? void 0 : _k.total) != null ? _l : 0;
212
+ case "outTotal":
213
+ return (_n = (_m = row.outCalls) == null ? void 0 : _m.total) != null ? _n : 0;
214
+ case "aht":
215
+ return parseDur(((_o = row.average) == null ? void 0 : _o.aht) || "00:00:00");
216
+ case "loginDur":
217
+ return parseDur(((_p = row.loginDetails) == null ? void 0 : _p.loggedInDuration) || "00:00:00");
218
+ case "talk":
219
+ return parseDur(((_q = row.loginDetails) == null ? void 0 : _q.talkTime) || "00:00:00");
220
+ case "hold":
221
+ return parseDur(((_r = row.average) == null ? void 0 : _r.holdTime) || "00:00:00");
222
+ case "wrapup":
223
+ return parseDur(((_s = row.average) == null ? void 0 : _s.wrapUp) || "00:00:00");
224
+ case "breakTime":
225
+ return parseDur(((_t = row.breaks) == null ? void 0 : _t.lunch) || "00:00:00") + parseDur(((_u = row.breaks) == null ? void 0 : _u.tea) || "00:00:00") + parseDur(((_v = row.breaks) == null ? void 0 : _v.training) || "00:00:00") + parseDur(((_w = row.breaks) == null ? void 0 : _w.meeting) || "00:00:00") + parseDur(((_x = row.breaks) == null ? void 0 : _x.shortBreak) || "00:00:00");
226
+ case "idle":
227
+ return parseDur(((_y = row.loginDetails) == null ? void 0 : _y.idleTime) || "00:00:00");
228
+ case "adherence":
229
+ return (_A = (_z = row.adherence) == null ? void 0 : _z.pct) != null ? _A : null;
230
+ case "firstLogin":
231
+ return ((_B = row.loginStats) == null ? void 0 : _B.firstLogin) || "";
232
+ default:
233
+ return "";
234
+ }
235
+ }
236
+ var COLUMNS = [
237
+ { key: "id", label: "User ID", group: "Agent" },
238
+ { key: "name", label: "Full Name", group: "Agent" },
239
+ { key: "queue", label: "Queues", group: "Agent" },
240
+ { key: "total", label: "Total Calls", group: "Calls", align: "right" },
241
+ { key: "ans", label: "Answered", group: "Calls", align: "right" },
242
+ { key: "miss", label: "Missed", group: "Calls", align: "right" },
243
+ { key: "inTotal", label: "Inbound", group: "Calls", align: "right" },
244
+ { key: "outTotal", label: "Outbound", group: "Calls", align: "right" },
245
+ { key: "aht", label: "AHT", group: "Time", align: "right" },
246
+ { key: "loginDur", label: "Login Dur", group: "Time", align: "right" },
247
+ { key: "talk", label: "Talk Time", group: "Time", align: "right" },
248
+ { key: "hold", label: "Hold Time", group: "Time", align: "right" },
249
+ { key: "wrapup", label: "Wrapup Time", group: "Time", align: "right" },
250
+ { key: "breakTime", label: "Break Time", group: "Breaks", align: "right" },
251
+ { key: "idle", label: "Idle Time", group: "Time", align: "right" },
252
+ { key: "firstLogin", label: "First Login", group: "Login" },
253
+ { key: "adherence", label: "Adherence %", group: "Agent", align: "right" }
254
+ ];
255
+ function AgentPerformanceReportContent() {
256
+ const [startDate, setStartDate] = useState2(dayjs().startOf("day"));
257
+ const [endDate, setEndDate] = useState2(dayjs());
258
+ const [quickRange, setQuickRange] = useState2("today");
259
+ const [selectedUsers, setSelectedUsers] = useState2([]);
260
+ const [isAllUsersSelected, setIsAllUsersSelected] = useState2(false);
261
+ const [processes, setProcesses] = useState2([]);
262
+ const [process, setProcess] = useState2("");
263
+ const [search, setSearch] = useState2("");
264
+ const [loginUsersOnly] = useState2(true);
265
+ const [queues, setQueues] = useState2([]);
266
+ const [selectedQueues, setSelectedQueues] = useState2([]);
267
+ const [data, setData] = useState2([]);
268
+ const [loading, setLoading] = useState2(false);
269
+ const [error, setError] = useState2("");
270
+ const [selectedAgent, setSelectedAgent] = useState2(null);
271
+ const [orderBy, setOrderBy] = useState2("total");
272
+ const [order, setOrder] = useState2("desc");
273
+ const [page, setPage] = useState2(0);
274
+ const [rowsPerPage, setRowsPerPage] = useState2(10);
275
+ const [totalCount, setTotalCount] = useState2(-1);
276
+ const [visibleCols] = useState2(new Set(COLUMNS.map((c) => c.key)));
277
+ const [debouncedSearch, setDebouncedSearch] = useState2("");
278
+ const debounceRef = useRef(void 0);
279
+ useEffect(() => {
280
+ debounceRef.current = setTimeout(() => setDebouncedSearch(search.trim()), 400);
281
+ return () => clearTimeout(debounceRef.current);
282
+ }, [search]);
283
+ useEffect(() => {
284
+ fetchProcesses().then((p) => {
285
+ const mapped = p.map((x) => ({ label: x.name, value: x.name }));
286
+ setProcesses(mapped);
287
+ if (mapped.length) setProcess(mapped[0].value);
288
+ }).catch(() => {
289
+ });
290
+ fetchQueues().then((data2) => setQueues(data2 || [])).catch(() => {
291
+ });
292
+ }, []);
293
+ const handleQuickRangeChange = (range) => {
294
+ setQuickRange(range);
295
+ };
296
+ const handleRefresh = () => {
297
+ if (quickRange === "today" || quickRange === "week" || quickRange === "month") {
298
+ const now = dayjs();
299
+ let sd = now.startOf("day");
300
+ const ed = now;
301
+ if (quickRange === "week") sd = now.startOf("week").startOf("day");
302
+ else if (quickRange === "month") sd = now.startOf("month").startOf("day");
303
+ setStartDate(sd);
304
+ setEndDate(ed);
305
+ } else {
306
+ fetchReport(page);
307
+ }
308
+ };
309
+ const fetchReport = useCallback2(async (pageNum) => {
310
+ const fromDate = startDate;
311
+ const toDate = endDate;
312
+ if (!fromDate || !toDate) {
313
+ setError("Select date range");
314
+ return;
315
+ }
316
+ const payload = {
317
+ startDate: fromDate.format("YYYY-MM-DDTHH:mm:ss"),
318
+ endDate: toDate.format("YYYY-MM-DDTHH:mm:ss"),
319
+ startTime: fromDate.format("HH:mm:ss"),
320
+ endTime: toDate.format("HH:mm:ss"),
321
+ process,
322
+ agents: isAllUsersSelected ? [] : selectedUsers.map((u) => u.userId),
323
+ loginUsersOnly,
324
+ queueIds: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : void 0,
325
+ search: debouncedSearch || void 0,
326
+ page: pageNum + 1,
327
+ pageSize: rowsPerPage
328
+ };
329
+ const valid = validateReportPayload(payload);
330
+ if (!valid.isValid) {
331
+ setError(valid.error || "Invalid");
332
+ return;
333
+ }
334
+ try {
335
+ setLoading(true);
336
+ setError("");
337
+ const { rows, total } = await getUserPerformanceReportPaged(payload);
338
+ setData(rows);
339
+ setTotalCount(typeof total === "number" ? total : rows.length);
340
+ } catch (err) {
341
+ setError((err == null ? void 0 : err.message) || "Failed to fetch report");
342
+ setData([]);
343
+ } finally {
344
+ setLoading(false);
345
+ }
346
+ }, [startDate, endDate, process, selectedUsers, isAllUsersSelected, selectedQueues, loginUsersOnly, debouncedSearch, rowsPerPage]);
347
+ useEffect(() => {
348
+ setPage(0);
349
+ fetchReport(0);
350
+ }, [fetchReport]);
351
+ const handlePageChange = useCallback2(
352
+ (_event, newPage) => {
353
+ setPage(newPage);
354
+ fetchReport(newPage);
355
+ },
356
+ [fetchReport]
357
+ );
358
+ const sorted = useMemo(() => {
359
+ return [...data].sort((a, b) => {
360
+ const av = getVal(a, orderBy);
361
+ const bv = getVal(b, orderBy);
362
+ if (typeof av === "number" && typeof bv === "number") return order === "asc" ? av - bv : bv - av;
363
+ return order === "asc" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));
364
+ });
365
+ }, [data, orderBy, order]);
366
+ const paged = sorted;
367
+ const handleSort = (key) => {
368
+ setOrder(orderBy === key && order === "asc" ? "desc" : "asc");
369
+ setOrderBy(key);
370
+ };
371
+ const handleExportExcel = async () => {
372
+ const fromDate = startDate;
373
+ const toDate = endDate;
374
+ if (!fromDate || !toDate) {
375
+ setError("Select date range");
376
+ return;
377
+ }
378
+ const params = {
379
+ start_date: fromDate.format("YYYY-MM-DDTHH:mm:ss"),
380
+ end_date: toDate.format("YYYY-MM-DDTHH:mm:ss"),
381
+ agent_id: !isAllUsersSelected && selectedUsers.length > 0 ? selectedUsers.map((u) => u.userId) : void 0,
382
+ queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : void 0,
383
+ search: debouncedSearch || void 0
384
+ };
385
+ try {
386
+ await exportAgentPerformanceToExcel(params);
387
+ } catch (err) {
388
+ setError((err == null ? void 0 : err.message) || "Failed to export Excel");
389
+ }
390
+ };
391
+ const renderCellValue = (row, col) => {
392
+ const v = getVal(row, col.key);
393
+ const durKeys = ["aht", "loginDur", "talk", "hold", "wrapup", "breakTime", "idle"];
394
+ if (durKeys.includes(col.key)) return fmtDur(v);
395
+ if (col.key === "adherence") return v != null ? `${v}%` : "\u2014";
396
+ if (col.key === "firstLogin") return v ? dayjs(v).format("DD MMM YYYY hh:mm A") : "";
397
+ return v != null ? v : "";
398
+ };
399
+ const activeCols = COLUMNS.filter((c) => visibleCols.has(c.key));
400
+ if (selectedAgent) {
401
+ return /* @__PURE__ */ jsx(
402
+ agentDetailReport_default,
403
+ {
404
+ agentRow: selectedAgent,
405
+ onBack: () => setSelectedAgent(null),
406
+ initialStartDate: startDate,
407
+ initialEndDate: endDate,
408
+ initialQuickRange: quickRange,
409
+ from: "REPORTS_LIST"
410
+ }
411
+ );
412
+ }
413
+ return /* @__PURE__ */ jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, children: /* @__PURE__ */ jsxs(Box, { sx: { background: C.bg, minHeight: "100vh" }, children: [
414
+ /* @__PURE__ */ jsx(
415
+ PageHeader,
416
+ {
417
+ title: " Performance Report",
418
+ actions: /* @__PURE__ */ jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, children: [
419
+ /* @__PURE__ */ jsx(
420
+ SearchBar,
421
+ {
422
+ value: search,
423
+ onChange: setSearch,
424
+ placeholder: "Search name, ID...",
425
+ width: 250
426
+ }
427
+ ),
428
+ /* @__PURE__ */ jsx(
429
+ SDKPermissionGuard,
430
+ {
431
+ permissions: [SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_EXPORT, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE],
432
+ showFallback: false,
433
+ children: /* @__PURE__ */ jsx(
434
+ AppButton,
435
+ {
436
+ startIcon: /* @__PURE__ */ jsx(FileDownloadIcon, { sx: { fontSize: "0.95rem !important" } }),
437
+ disabled: !data.length,
438
+ onClick: handleExportExcel,
439
+ sx: { height: 36 },
440
+ children: "Export Excel"
441
+ }
442
+ )
443
+ }
444
+ )
445
+ ] })
446
+ }
447
+ ),
448
+ /* @__PURE__ */ jsx(
449
+ ReportFilterBar,
450
+ {
451
+ startDate,
452
+ endDate,
453
+ onStartChange: setStartDate,
454
+ onEndChange: setEndDate,
455
+ quickRange,
456
+ onQuickRangeChange: handleQuickRangeChange,
457
+ showAgentSelect: true,
458
+ selectedAgents: selectedUsers,
459
+ onAgentsChange: setSelectedUsers,
460
+ setIsAllUsersSelected,
461
+ showQueueSelect: true,
462
+ queues,
463
+ selectedQueues,
464
+ onQueuesChange: setSelectedQueues,
465
+ showProcessSelect: true,
466
+ processes,
467
+ selectedProcess: process,
468
+ onProcessChange: setProcess,
469
+ extra: /* @__PURE__ */ jsx(
470
+ AppButton,
471
+ {
472
+ startIcon: /* @__PURE__ */ jsx(RefreshIcon, { sx: { fontSize: "0.9rem !important" } }),
473
+ disabled: loading,
474
+ onClick: handleRefresh,
475
+ sx: { height: 32 },
476
+ children: "Refresh"
477
+ }
478
+ )
479
+ }
480
+ ),
481
+ error && /* @__PURE__ */ jsx(Alert, { severity: "error", sx: { mx: 2.5, mt: 1.5 }, onClose: () => setError(""), children: error }),
482
+ /* @__PURE__ */ jsxs(Box, { sx: { py: 2, px: 1, overflow: "auto", position: "relative" }, children: [
483
+ loading && /* @__PURE__ */ jsx(Box, { sx: { position: "absolute", top: 0, left: 0, right: 0, bottom: 0, background: "rgba(240,244,248,0.7)", display: "flex", alignItems: "center", justifyContent: "center", zIndex: 10 }, children: /* @__PURE__ */ jsx(CircularProgress, {}) }),
484
+ /* @__PURE__ */ jsxs(Paper, { elevation: 0, sx: { borderRadius: "8px", border: "1px solid #e0e7ef", overflow: "hidden", mb: 2 }, children: [
485
+ /* @__PURE__ */ jsx(TableContainer, { children: /* @__PURE__ */ jsxs(Table, { size: "small", sx: {
486
+ minWidth: 1400,
487
+ "& .MuiTableCell-root": { fontSize: "0.75rem", borderBottom: "1px solid #eef1f6", py: 0.6, px: 1 }
488
+ }, children: [
489
+ /* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
490
+ activeCols.map((col) => /* @__PURE__ */ jsx(TableCell, { align: col.align || "left", sx: headCellSx, children: /* @__PURE__ */ jsx(TableSortLabel, { active: orderBy === col.key, direction: orderBy === col.key ? order : "asc", onClick: () => handleSort(col.key), sx: sortLabelSx, children: col.label }) }, col.key)),
491
+ /* @__PURE__ */ jsx(TableCell, { sx: __spreadProps(__spreadValues({}, headCellSx), { width: 48 }), children: "Detail" })
492
+ ] }) }),
493
+ /* @__PURE__ */ jsxs(TableBody, { children: [
494
+ paged.map((row, idx) => /* @__PURE__ */ jsxs(TableRow, { hover: true, onClick: () => setSelectedAgent(row), sx: {
495
+ backgroundColor: "#fff",
496
+ "&:hover": { backgroundColor: "#f0f7f8" },
497
+ cursor: "pointer"
498
+ }, children: [
499
+ activeCols.map((col) => /* @__PURE__ */ jsx(TableCell, { align: col.align || "left", sx: reportBodyCellSx, children: renderCellValue(row, col) }, col.key)),
500
+ /* @__PURE__ */ jsx(TableCell, { sx: reportBodyCellSx, align: "center", children: /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: (e) => {
501
+ e.stopPropagation();
502
+ setSelectedAgent(row);
503
+ }, sx: { color: C.blue }, children: /* @__PURE__ */ jsx(VisibilityIcon, { sx: { fontSize: 16 } }) }) })
504
+ ] }, idx)),
505
+ paged.length === 0 && /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: activeCols.length + 1, sx: { textAlign: "center", py: 4, color: C.t3, fontSize: 13 }, children: "No data found" }) })
506
+ ] })
507
+ ] }) }),
508
+ /* @__PURE__ */ jsx(
509
+ TablePagination,
510
+ {
511
+ component: "div",
512
+ count: totalCount,
513
+ page,
514
+ onPageChange: handlePageChange,
515
+ rowsPerPage,
516
+ onRowsPerPageChange: (e) => {
517
+ setRowsPerPage(parseInt(e.target.value, 10));
518
+ setPage(0);
519
+ },
520
+ rowsPerPageOptions: [10, 15, 25, 50, 100],
521
+ sx: { borderTop: "1px solid #eef1f6", "& .MuiTablePagination-displayedRows": { fontSize: "0.73rem" }, "& .MuiTablePagination-selectLabel": { fontSize: "0.73rem" } }
522
+ }
523
+ )
524
+ ] })
525
+ ] })
526
+ ] }) });
527
+ }
528
+ var AgentPerformanceReport = () => /* @__PURE__ */ jsx(SDKProvider, { children: /* @__PURE__ */ jsx(AgentPerformanceReportContent, {}) });
529
+ var agentPerformanceReport_default = AgentPerformanceReport;
530
+ export {
531
+ agentPerformanceReport_default as default
532
+ };
533
+ //# sourceMappingURL=agentPerformanceReport-UT6QZWYD.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../call-control-sdk/lib/pages/agentPerformanceReport/index.tsx","../call-control-sdk/lib/pages/agentPerformanceReport/useAgentPerformanceReport.ts"],"sourcesContent":["import React, { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport {\n Box, Paper, Table, TableBody, TableCell, TableContainer, TableHead,\n TableRow, TableSortLabel, TablePagination, CircularProgress, Alert,\n Stack, IconButton, Tooltip,\n} from \"@mui/material\";\nimport AppButton from \"../common/components/AppButton\";\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport isoWeek from \"dayjs/plugin/isoWeek\";\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\n\ndayjs.extend(isoWeek);\n\nimport {\n fetchQueues, fetchProcesses,\n getUserPerformanceReportPaged, validateReportPayload, exportAgentPerformanceToExcel,\n type Queue,\n} from \"./useAgentPerformanceReport\";\nimport type { AgentPerfReportParams, ReportData, ReportRequestPayload } from \"./types\";\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\nimport ReportFilterBar, { type QuickRange, type ProcessOption } from \"../common/components/ReportFilterBar\";\nimport { headCellSx as headSx, sortLabelSx, reportBodyCellSx as bodySx } 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\";\nimport AgentDetailReport from \"../agentDetailReport\";\n\nconst C = {\n navy: \"#0d2a56\", blue: \"#1565c8\", green: \"#0a9a62\", amber: \"#c47c00\",\n red: \"#cc2a2a\", purple: \"#6b3fbf\", teal: \"#0b7a8f\",\n bg: \"transparent\", surface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\n b1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\n t1: \"#0d1e35\", t2: \"#364f6e\", t3: \"#7a93b5\", t4: \"#bccad9\",\n blt: \"#e8f0fc\", glt: \"#e4f6ef\", alt: \"#fdf3e0\", rlt: \"#fde8e8\",\n plt: \"#f0eafa\", tlt: \"#e3f4f7\",\n};\n\ntype Order = \"asc\" | \"desc\";\ntype SortKey = string;\n\nfunction parseDur(d: string): number {\n if (!d || d === \"00:00:00\") return 0;\n const p = d.split(\":\").map(Number);\n if (p.length === 3) return p[0] * 3600 + p[1] * 60 + p[2];\n if (p.length === 2) return p[0] * 60 + p[1];\n return 0;\n}\n\nfunction fmtDur(s: number): string {\n if (!s || s <= 0) return \"00:00:00\";\n const h = Math.floor(s / 3600);\n const m = Math.floor((s % 3600) / 60);\n const sc = Math.floor(s % 60);\n return [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\n}\n\nfunction getVal(row: ReportData, key: string): any {\n switch (key) {\n case \"id\": return row.agentDetails?.agentId || \"\";\n case \"name\": return row.agentDetails?.fullName || \"\";\n case \"process\": return row.agentDetails?.process || \"\";\n case \"queue\": return row.agentDetails?.queueNames || \"\";\n case \"total\": return row.calls?.totalCalls ?? 0;\n case \"ans\": return row.calls?.answered ?? 0;\n case \"miss\": return row.calls?.missed ?? 0;\n case \"inTotal\": return row.inCalls?.total ?? 0;\n case \"outTotal\": return row.outCalls?.total ?? 0;\n case \"aht\": return parseDur(row.average?.aht || \"00:00:00\");\n case \"loginDur\": return parseDur(row.loginDetails?.loggedInDuration || \"00:00:00\");\n case \"talk\": return parseDur(row.loginDetails?.talkTime || \"00:00:00\");\n case \"hold\": return parseDur(row.average?.holdTime || \"00:00:00\");\n case \"wrapup\": return parseDur(row.average?.wrapUp || \"00:00:00\");\n case \"breakTime\": return parseDur(row.breaks?.lunch || \"00:00:00\") + parseDur(row.breaks?.tea || \"00:00:00\") + parseDur(row.breaks?.training || \"00:00:00\") + parseDur(row.breaks?.meeting || \"00:00:00\") + parseDur(row.breaks?.shortBreak || \"00:00:00\");\n case \"idle\": return parseDur(row.loginDetails?.idleTime || \"00:00:00\");\n case \"adherence\": return row.adherence?.pct ?? null;\n case \"firstLogin\": return row.loginStats?.firstLogin || \"\";\n default: return \"\";\n }\n}\n\ninterface ColDef { key: string; label: string; group: string; fmt?: (row: ReportData) => any; align?: \"left\" | \"right\" | \"center\"; }\n\nconst COLUMNS: ColDef[] = [\n { key: \"id\", label: \"User ID\", group: \"Agent\" },\n { key: \"name\", label: \"Full Name\", group: \"Agent\" },\n { key: \"queue\", label: \"Queues\", group: \"Agent\" },\n { key: \"total\", label: \"Total Calls\", group: \"Calls\", align: \"right\" },\n { key: \"ans\", label: \"Answered\", group: \"Calls\", align: \"right\" },\n { key: \"miss\", label: \"Missed\", group: \"Calls\", align: \"right\" },\n { key: \"inTotal\", label: \"Inbound\", group: \"Calls\", align: \"right\" },\n { key: \"outTotal\", label: \"Outbound\", group: \"Calls\", align: \"right\" },\n { key: \"aht\", label: \"AHT\", group: \"Time\", align: \"right\" },\n { key: \"loginDur\", label: \"Login Dur\", group: \"Time\", align: \"right\" },\n { key: \"talk\", label: \"Talk Time\", group: \"Time\", align: \"right\" },\n { key: \"hold\", label: \"Hold Time\", group: \"Time\", align: \"right\" },\n { key: \"wrapup\", label: \"Wrapup Time\", group: \"Time\", align: \"right\" },\n { key: \"breakTime\", label: \"Break Time\", group: \"Breaks\", align: \"right\" },\n { key: \"idle\", label: \"Idle Time\", group: \"Time\", align: \"right\" },\n { key: \"firstLogin\", label: \"First Login\", group: \"Login\" },\n { key: \"adherence\", label: \"Adherence %\", group: \"Agent\", align: \"right\" },\n];\n\nfunction AgentPerformanceReportContent() {\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\n const [quickRange, setQuickRange] = useState<string>(\"today\");\n const [selectedUsers, setSelectedUsers] = useState<AgentOption[]>([]);\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\n const [processes, setProcesses] = useState<ProcessOption[]>([]);\n const [process, setProcess] = useState(\"\");\n const [search, setSearch] = useState(\"\");\n const [loginUsersOnly] = useState(true);\n\n const [queues, setQueues] = useState<Queue[]>([]);\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\n\n const [data, setData] = useState<ReportData[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const [selectedAgent, setSelectedAgent] = useState<ReportData | null>(null);\n\n const [orderBy, setOrderBy] = useState<SortKey>(\"total\");\n const [order, setOrder] = useState<Order>(\"desc\");\n const [page, setPage] = useState(0);\n const [rowsPerPage, setRowsPerPage] = useState(10);\n const [totalCount, setTotalCount] = useState(-1);\n const [visibleCols] = useState<Set<string>>(new Set(COLUMNS.map((c) => c.key)));\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(search.trim()), 400);\n return () => clearTimeout(debounceRef.current);\n }, [search]);\n\n useEffect(() => {\n fetchProcesses().then((p) => {\n const mapped = p.map((x) => ({ label: x.name, value: x.name }));\n setProcesses(mapped);\n if (mapped.length) setProcess(mapped[0].value);\n }).catch(() => { });\n fetchQueues().then((data) => setQueues(data || [])).catch(() => { });\n }, []);\n\n const handleQuickRangeChange = (range: QuickRange) => {\n setQuickRange(range);\n };\n\n const handleRefresh = () => {\n if (quickRange === \"today\" || quickRange === \"week\" || quickRange === \"month\") {\n const now = dayjs();\n let sd = now.startOf(\"day\");\n const ed = now;\n if (quickRange === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\n else if (quickRange === \"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(async (pageNum: number) => {\n const fromDate = startDate;\n const toDate = endDate;\n if (!fromDate || !toDate) { setError(\"Select date range\"); return; }\n\n const payload: ReportRequestPayload = {\n startDate: fromDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\n endDate: toDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\n startTime: fromDate.format(\"HH:mm:ss\"),\n endTime: toDate.format(\"HH:mm:ss\"),\n process,\n agents: isAllUsersSelected ? [] : selectedUsers.map((u) => u.userId),\n loginUsersOnly,\n queueIds: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : undefined,\n search: debouncedSearch || undefined,\n page: pageNum + 1,\n pageSize: rowsPerPage,\n };\n\n const valid = validateReportPayload(payload);\n if (!valid.isValid) { setError(valid.error || \"Invalid\"); return; }\n\n try {\n setLoading(true);\n setError(\"\");\n const { rows, total } = await getUserPerformanceReportPaged(payload);\n setData(rows);\n setTotalCount(typeof total === \"number\" ? total : rows.length);\n } catch (err: any) {\n setError(err?.message || \"Failed to fetch report\");\n setData([]);\n } finally {\n setLoading(false);\n }\n }, [startDate, endDate, process, selectedUsers, isAllUsersSelected, selectedQueues, loginUsersOnly, debouncedSearch, rowsPerPage]);\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 // Search + paging are server-side; sorting is applied client-side to the current page.\n const sorted = useMemo(() => {\n return [...data].sort((a, b) => {\n const av = getVal(a, orderBy);\n const bv = getVal(b, orderBy);\n if (typeof av === \"number\" && typeof bv === \"number\") return order === \"asc\" ? av - bv : bv - av;\n return order === \"asc\" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));\n });\n }, [data, orderBy, order]);\n\n const paged = sorted;\n\n const handleSort = (key: string) => {\n setOrder(orderBy === key && order === \"asc\" ? \"desc\" : \"asc\");\n setOrderBy(key);\n };\n\n const handleExportExcel = async () => {\n const fromDate = startDate;\n const toDate = endDate;\n if (!fromDate || !toDate) { setError(\"Select date range\"); return; }\n const params: AgentPerfReportParams = {\n start_date: fromDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: toDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\n agent_id: !isAllUsersSelected && selectedUsers.length > 0\n ? selectedUsers.map((u) => u.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 exportAgentPerformanceToExcel(params);\n } catch (err: any) {\n setError(err?.message || \"Failed to export Excel\");\n }\n };\n\n const renderCellValue = (row: ReportData, col: ColDef) => {\n const v = getVal(row, col.key);\n const durKeys = [\"aht\", \"loginDur\", \"talk\", \"hold\", \"wrapup\", \"breakTime\", \"idle\"];\n if (durKeys.includes(col.key)) return fmtDur(v);\n if (col.key === \"adherence\") return v != null ? `${v}%` : \"—\";\n if (col.key === \"firstLogin\") return v ? dayjs(v).format(\"DD MMM YYYY hh:mm A\") : \"\";\n return v ?? \"\";\n };\n\n const activeCols = COLUMNS.filter((c) => visibleCols.has(c.key));\n\n if (selectedAgent) {\n return (\n <AgentDetailReport\n agentRow={selectedAgent}\n onBack={() => setSelectedAgent(null)}\n initialStartDate={startDate}\n initialEndDate={endDate}\n initialQuickRange={quickRange}\n from=\"REPORTS_LIST\"\n />\n );\n }\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box sx={{ background: C.bg, minHeight: \"100vh\" }}>\n <PageHeader\n title=\" Performance Report\"\n actions={\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <SearchBar\n value={search}\n onChange={setSearch}\n placeholder=\"Search name, ID...\"\n width={250}\n />\n <SDKPermissionGuard\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_EXPORT, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE]}\n showFallback={false}\n >\n <AppButton\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\n disabled={!data.length}\n onClick={handleExportExcel}\n sx={{ height: 36 }}\n >\n Export Excel\n </AppButton>\n </SDKPermissionGuard>\n </Stack>\n }\n />\n\n <ReportFilterBar\n startDate={startDate}\n endDate={endDate}\n onStartChange={setStartDate}\n onEndChange={setEndDate}\n quickRange={quickRange}\n onQuickRangeChange={handleQuickRangeChange}\n showAgentSelect\n selectedAgents={selectedUsers}\n onAgentsChange={setSelectedUsers}\n setIsAllUsersSelected={setIsAllUsersSelected}\n showQueueSelect\n queues={queues}\n selectedQueues={selectedQueues}\n onQueuesChange={setSelectedQueues}\n showProcessSelect\n processes={processes}\n selectedProcess={process}\n onProcessChange={setProcess}\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 && <Alert severity=\"error\" sx={{ mx: 2.5, mt: 1.5 }} onClose={() => setError(\"\")}>{error}</Alert>}\n\n <Box sx={{ py: 2, px: 1, overflow: \"auto\", position: \"relative\" }}>\n {loading && (\n <Box sx={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, background: \"rgba(240,244,248,0.7)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", zIndex: 10 }}>\n <CircularProgress />\n </Box>\n )}\n\n <Paper elevation={0} sx={{ borderRadius: \"8px\", border: \"1px solid #e0e7ef\", overflow: \"hidden\", mb: 2 }}>\n <TableContainer>\n <Table size=\"small\" sx={{\n minWidth: 1400,\n \"& .MuiTableCell-root\": { fontSize: \"0.75rem\", borderBottom: \"1px solid #eef1f6\", py: 0.6, px: 1 },\n }}>\n <TableHead>\n <TableRow>\n {activeCols.map((col) => (\n <TableCell key={col.key} align={col.align || \"left\"} sx={headSx}>\n <TableSortLabel active={orderBy === col.key} direction={orderBy === col.key ? order : \"asc\"} onClick={() => handleSort(col.key)} sx={sortLabelSx}>\n {col.label}\n </TableSortLabel>\n </TableCell>\n ))}\n <TableCell sx={{ ...headSx, width: 48 }}>Detail</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {paged.map((row, idx) => (\n <TableRow key={idx} hover onClick={() => setSelectedAgent(row)} sx={{\n backgroundColor: \"#fff\",\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\n cursor: \"pointer\",\n }}>\n {activeCols.map((col) => (\n <TableCell key={col.key} align={col.align || \"left\"} sx={bodySx}>\n {renderCellValue(row, col)}\n </TableCell>\n ))}\n <TableCell sx={bodySx} align=\"center\">\n <IconButton size=\"small\" onClick={(e) => { e.stopPropagation(); setSelectedAgent(row); }} sx={{ color: C.blue }}>\n <VisibilityIcon sx={{ fontSize: 16 }} />\n </IconButton>\n </TableCell>\n </TableRow>\n ))}\n {paged.length === 0 && (\n <TableRow><TableCell colSpan={activeCols.length + 1} sx={{ textAlign: \"center\", py: 4, color: C.t3, fontSize: 13 }}>No data found</TableCell></TableRow>\n )}\n </TableBody>\n </Table>\n </TableContainer>\n\n <TablePagination\n component=\"div\" count={totalCount} page={page}\n onPageChange={handlePageChange} rowsPerPage={rowsPerPage}\n onRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\n sx={{ borderTop: \"1px solid #eef1f6\", \"& .MuiTablePagination-displayedRows\": { fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontSize: \"0.73rem\" } }}\n />\n </Paper>\n </Box>\n </Box>\n </LocalizationProvider>\n );\n}\n\nconst AgentPerformanceReport: React.FC = () => (\n <SDKProvider>\n <AgentPerformanceReportContent />\n </SDKProvider>\n);\n\nexport default AgentPerformanceReport;\n","import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type { AgentPerfReportParams, AgentPerfReportResponse, AgentPerfRow, ReportData, ReportRequestPayload } from \"./types\";\r\n\r\nfunction fmtSecs(s: number): string {\r\n\tif (!s || s <= 0) return \"00:00:00\";\r\n\tconst h = Math.floor(s / 3600);\r\n\tconst m = Math.floor((s % 3600) / 60);\r\n\tconst sc = Math.floor(s % 60);\r\n\treturn [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\r\n}\r\n\r\nexport function validateReportPayload(payload: Partial<ReportRequestPayload>): { isValid: boolean; error?: string } {\r\n\tif (!payload.startDate || !payload.startTime) return { isValid: false, error: \"Start date/time required\" };\r\n\tif (!payload.endDate || !payload.endTime) return { isValid: false, error: \"End date/time required\" };\r\n\tif (!payload.loginUsersOnly && !payload.agents) return { isValid: false, error: \"Select at least one agent\" };\r\n\treturn { isValid: true };\r\n}\r\n\r\n// Map a raw AgentPerfRow into the legacy ReportData shape the table renders.\r\nfunction mapAgentPerfRow(a: AgentPerfRow): ReportData {\r\n\treturn {\r\n\t\tagentDetails: { agentId: a.agentId, fullName: a.fullName, process: a.processName, queueNames: a.queueNames },\r\n\t\tcalls: { totalCalls: a.totalCalls, answered: a.answeredCalls, missed: a.missedCalls },\r\n\t\tinCalls: { total: a.inCalls },\r\n\t\toutCalls: { total: a.outCalls },\r\n\t\taverage: { holdTime: fmtSecs(a.holdTimeSeconds), wrapUp: fmtSecs(a.wrapupSeconds), aht: fmtSecs(a.ahtSeconds), ringing: \"00:00:00\", dialing: \"00:00:00\" },\r\n\t\tloginDetails: { loggedInDuration: fmtSecs(a.loginDurationSeconds), talkTime: fmtSecs(a.talkTimeSeconds), idleTime: fmtSecs(a.idleTimeSeconds) },\r\n\t\tbreaks: { shortBreak: fmtSecs(a.breakTimeSeconds), breakCount: a.breakCount, lunch: \"00:00:00\", tea: \"00:00:00\", training: \"00:00:00\", meeting: \"00:00:00\" },\r\n\t\tloginStats: { firstLogin: a.firstLoginTime || \"\", noOfLogins: 0 },\r\n\t\tadherence: { pct: a.adherencePct ?? null },\r\n\t};\r\n}\r\n\r\nexport async function getUserPerformanceReport(payload: ReportRequestPayload): Promise<ReportData[]> {\r\n\tconst params: AgentPerfReportParams = {\r\n\t\tstart_date: payload.startDate,\r\n\t\tend_date: payload.endDate,\r\n\t\tagent_id: payload.agents,\r\n\t\tqueue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : undefined,\r\n\t\t// Always send page + pageSize; callers that don't paginate get the full list.\r\n\t\tpage: payload.page ?? 1,\r\n\t\tpageSize: payload.pageSize ?? 500,\r\n\t\tsearch: payload.search,\r\n\t};\r\n\t// Use the combined endpoint, which honours page/pageSize/search.\r\n\tconst res = await axiosInstance.get<AgentPerfReportResponse>(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT}${buildQs(params)}`,\r\n\t);\r\n\tconst agentsPage: any = (res.data as any)?.agents;\r\n\tconst agents: AgentPerfRow[] = Array.isArray(agentsPage)\r\n\t\t? agentsPage\r\n\t\t: Array.isArray(agentsPage?.data)\r\n\t\t\t? agentsPage.data\r\n\t\t\t: [];\r\n\treturn agents.map(mapAgentPerfRow);\r\n}\r\n\r\n/**\r\n * Paginated variant — returns the mapped rows for the current page plus the\r\n * real total (so the table shows \"1–25 of N\").\r\n */\r\nexport async function getUserPerformanceReportPaged(\r\n\tpayload: ReportRequestPayload,\r\n): Promise<{ rows: ReportData[]; total: number }> {\r\n\tconst params: AgentPerfReportParams = {\r\n\t\tstart_date: payload.startDate,\r\n\t\tend_date: payload.endDate,\r\n\t\tagent_id: payload.agents,\r\n\t\tqueue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : undefined,\r\n\t\tpage: payload.page ?? 1,\r\n\t\tpageSize: payload.pageSize ?? 10,\r\n\t\tsearch: payload.search,\r\n\t};\r\n\tconst res = await axiosInstance.get<AgentPerfReportResponse>(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT}${buildQs(params)}`,\r\n\t);\r\n\tconst data = res.data;\r\n\t// `agents` is a paginated envelope ({ data, total, ... }); support a bare array for older shapes.\r\n\tconst agentsPage: any = (data as any)?.agents;\r\n\tconst rawRows: AgentPerfRow[] = Array.isArray(agentsPage)\r\n\t\t? agentsPage\r\n\t\t: Array.isArray(agentsPage?.data)\r\n\t\t\t? agentsPage.data\r\n\t\t\t: [];\r\n\tconst rows = rawRows.map(mapAgentPerfRow);\r\n\tconst total =\r\n\t\tagentsPage?.total ??\r\n\t\t(data as any)?.total ??\r\n\t\t(data as any)?.pagination?.total ??\r\n\t\tdata?.summary?.agentsLoggedIn ??\r\n\t\trows.length;\r\n\treturn { rows, total };\r\n}\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 interface Process {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\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 fetchProcesses(): Promise<Process[]> {\r\n\tconst res = await axiosInstance.get(END_POINT.MASTER_PROCESS);\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\nfunction buildQs(params: AgentPerfReportParams): 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.top_n) qs.append(\"top_n\", String(params.top_n));\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\nexport function useAgentPerformanceReport() {\r\n\tconst [agents, setAgents] = useState<AgentPerfRow[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchAgents = useCallback(async (params: AgentPerfReportParams) => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<AgentPerfRow[]>(\r\n\t\t\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_AGENTS}${params}`,\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\tsetError(err?.response?.data?.message || err?.message || \"Failed to fetch performance report\");\r\n\t\t\tsetAgents([]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst exportExcel = useCallback(async (params: AgentPerfReportParams) => {\r\n\t\tconst res = await axiosInstance.get(\r\n\t\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${buildQs(params)}`,\r\n\t\t\t{ responseType: \"blob\" },\r\n\t\t);\r\n\t\tconst url = URL.createObjectURL(new Blob([res.data]));\r\n\t\tconst a = document.createElement(\"a\");\r\n\t\ta.href = url;\r\n\t\ta.download = `agent-performance-${params.start_date ?? \"export\"}.xlsx`;\r\n\t\ta.click();\r\n\t\tURL.revokeObjectURL(url);\r\n\t}, []);\r\n\r\n\treturn { agents, loading, error, setError, fetchAgents, exportExcel };\r\n}\r\n\r\nexport async function exportAgentPerformanceToExcel(params: AgentPerfReportParams): Promise<void> {\r\n\tconst res = await axiosInstance.get(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${buildQs(params)}`,\r\n\t\t{ responseType: \"blob\" },\r\n\t);\r\n\tconst url = URL.createObjectURL(new Blob([res.data]));\r\n\tconst a = document.createElement(\"a\");\r\n\ta.href = url;\r\n\ta.download = `agent-performance-${params.start_date ?? \"export\"}.xlsx`;\r\n\ta.click();\r\n\tURL.revokeObjectURL(url);\r\n}\r\n"],"mappings":"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","names":["useState","useCallback","useState","data","useCallback"]}