ahs-cti 1.0.1-beta.2 → 1.0.1-beta.21
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-XUNWPSQW.mjs +10 -0
- package/dist/agentDetailReport-XUNWPSQW.mjs.map +1 -0
- package/dist/agentPerformanceReport-4WNLHIFT.mjs +597 -0
- package/dist/agentPerformanceReport-4WNLHIFT.mjs.map +1 -0
- package/dist/{callHistory-A5CBDPZR.mjs → callHistory-3CMW24B6.mjs} +27 -34
- package/dist/callHistory-3CMW24B6.mjs.map +1 -0
- package/dist/campaigns-FR7EIRXI.mjs +2664 -0
- package/dist/campaigns-FR7EIRXI.mjs.map +1 -0
- package/dist/cdrReport-6OBRKAYS.mjs +965 -0
- package/dist/cdrReport-6OBRKAYS.mjs.map +1 -0
- package/dist/chunk-AEDSLIHI.mjs +49 -0
- package/dist/chunk-AEDSLIHI.mjs.map +1 -0
- package/dist/chunk-FVNDPJUU.mjs +95 -0
- package/dist/chunk-FVNDPJUU.mjs.map +1 -0
- package/dist/chunk-I4CJTHZR.mjs +138 -0
- package/dist/chunk-I4CJTHZR.mjs.map +1 -0
- package/dist/chunk-RZZQ42MG.mjs +115 -0
- package/dist/chunk-RZZQ42MG.mjs.map +1 -0
- package/dist/chunk-U2DJ5WRK.mjs +1219 -0
- package/dist/chunk-U2DJ5WRK.mjs.map +1 -0
- package/dist/{chunk-FFYJ4LWU.mjs → chunk-YREOEULC.mjs} +127 -12
- package/dist/chunk-YREOEULC.mjs.map +1 -0
- package/dist/index.d.mts +630 -527
- package/dist/index.d.ts +631 -528
- package/dist/index.js +7409 -602
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +406 -512
- package/dist/index.mjs.map +1 -1
- package/dist/loginReport-MHNHB5F6.mjs +969 -0
- package/dist/loginReport-MHNHB5F6.mjs.map +1 -0
- package/package.json +16 -1
- package/dist/callHistory-A5CBDPZR.mjs.map +0 -1
- package/dist/chunk-FFYJ4LWU.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/cdrReport/index.tsx","../call-control-sdk/lib/pages/cdrReport/useCdrReport.ts","../call-control-sdk/lib/pages/cdrReport/types.ts","../call-control-sdk/lib/pages/cdrReport/styles.ts"],"sourcesContent":["import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport {\r\n\tAlert,\r\n\tBox,\r\n\tCheckbox,\r\n\tChip,\r\n\tCircularProgress,\r\n\tFormControl,\r\n\tIconButton,\r\n\tInputAdornment,\r\n\tInputLabel,\r\n\tMenuItem,\r\n\tPaper,\r\n\tSelect,\r\n\tStack,\r\n\tTable,\r\n\tTableBody,\r\n\tTableCell,\r\n\tTableContainer,\r\n\tTableHead,\r\n\tTablePagination,\r\n\tTableRow,\r\n\tTableSortLabel,\r\n\tTextField,\r\n\tTooltip,\r\n\tTypography,\r\n} from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport { DateTimePicker } from \"@mui/x-date-pickers/DateTimePicker\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPageHeader } from \"../../components/SDKPageHeader\";\r\nimport { SDKButton } from \"../../components/SDKButton\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\n\r\nimport { useCdrFilters, useCdrReport } from \"./useCdrReport\";\r\nimport type {\r\n\tCdrAgentFilterOption,\r\n\tCdrQueueFilterOption,\r\n\tCdrRecordResponse,\r\n\tCdrReportParams,\r\n\tQuickRange,\r\n\tSortDir,\r\n\tSortKey,\r\n} from \"./types\";\r\nimport { DEFAULT_PAGE_SIZE, ROWS_PER_PAGE_OPTIONS } from \"./types\";\r\nimport {\r\n\tCOLORS,\r\n\tFONT,\r\n\talertSx,\r\n\tcallTypePillSx,\r\n\tcellDateSx,\r\n\tcellDurationSx,\r\n\tcellHoldSx,\r\n\tcellNumberSx,\r\n\tcellTalkSx,\r\n\tcontentSx,\r\n\tdatePickerSx,\r\n\tdateSeparatorSx,\r\n\tfilterBarBoxSx,\r\n\tfilterBarSx,\r\n\theadCellSx,\r\n\tloadingBoxSx,\r\n\tmultiSelectFormSx,\r\n\tmultiSelectLabelSx,\r\n\tmultiSelectMenuPropsSx,\r\n\tmultiSelectSx,\r\n\tpageContainerSx,\r\n\tpaginationSx,\r\n\tqueueChipSx,\r\n\tquickBtnSx,\r\n\tsearchBarSx,\r\n\tsortLabelSx,\r\n\tstatusPillSx,\r\n\ttablePaperSx,\r\n\ttableRowSx,\r\n\ttableSx,\r\n\ttransferNoSx,\r\n\ttransferYesSx,\r\n} from \"./styles\";\r\n\r\ndayjs.extend(isoWeek);\r\n\r\nconst AGENT_SELECT_ALL_ID = -999;\r\n\r\n// ─── Sort comparator ─────────────────────────────────────────────────────────\r\n\r\nconst comparator = (a: CdrRecordResponse, b: CdrRecordResponse, key: SortKey): number => {\r\n\tconst av = a[key as keyof CdrRecordResponse];\r\n\tconst bv = b[key as keyof CdrRecordResponse];\r\n\tif (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\r\n\tif (typeof av === \"boolean\" && typeof bv === \"boolean\") return (av ? 1 : 0) - (bv ? 1 : 0);\r\n\treturn String(av ?? \"\").localeCompare(String(bv ?? \"\"));\r\n};\r\n\r\n// ─── Recording cell ──────────────────────────────────────────────────────────\r\n\r\ninterface RecordingCellProps {\r\n\tcallUuid: string;\r\n\trecordingPath: string | null;\r\n\tfetchRecording: (uuid: string) => Promise<Blob>;\r\n}\r\n\r\nconst RecordingCell = memo(function RecordingCell({\r\n\tcallUuid, recordingPath, fetchRecording,\r\n}: RecordingCellProps) {\r\n\tconst [audioUrl, setAudioUrl] = useState<string | null>(null);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(false);\r\n\tconst unavailable = recordingPath === null;\r\n\r\n\tconst handlePlay = async () => {\r\n\t\tif (audioUrl) return;\r\n\t\ttry {\r\n\t\t\tsetLoading(true);\r\n\t\t\tsetError(false);\r\n\t\t\tconst blob = await fetchRecording(callUuid);\r\n\t\t\tsetAudioUrl(URL.createObjectURL(blob));\r\n\t\t} catch {\r\n\t\t\tsetError(true);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst handleDownload = async () => {\r\n\t\ttry {\r\n\t\t\tconst blob = audioUrl\r\n\t\t\t\t? await fetch(audioUrl).then((r) => r.blob())\r\n\t\t\t\t: await fetchRecording(callUuid);\r\n\t\t\tconst url = URL.createObjectURL(blob);\r\n\t\t\tconst a = document.createElement(\"a\");\r\n\t\t\ta.href = url;\r\n\t\t\ta.download = `recording_${callUuid}.wav`;\r\n\t\t\ta.click();\r\n\t\t\tURL.revokeObjectURL(url);\r\n\t\t} catch {\r\n\t\t\t/* swallow */\r\n\t\t}\r\n\t};\r\n\r\n\tif (audioUrl) {\r\n\t\treturn (\r\n\t\t\t<Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n\t\t\t\t<audio\r\n\t\t\t\t\tcontrols\r\n\t\t\t\t\tautoPlay\r\n\t\t\t\t\tsrc={audioUrl}\r\n\t\t\t\t\tonEnded={() => {\r\n\t\t\t\t\t\tif (audioUrl.startsWith(\"blob:\")) URL.revokeObjectURL(audioUrl);\r\n\t\t\t\t\t\tsetAudioUrl(null);\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tstyle={{ width: 180, height: 30 }}\r\n\t\t\t\t/>\r\n\t\t\t\t<Tooltip title=\"Download\">\r\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleDownload} sx={{ color: COLORS.blue, p: 0.4 }}>\r\n\t\t\t\t\t\t<FileDownloadIcon sx={{ fontSize: 16 }} />\r\n\t\t\t\t\t</IconButton>\r\n\t\t\t\t</Tooltip>\r\n\t\t\t</Box>\r\n\t\t);\r\n\t}\r\n\r\n\tconst disabled = loading || error || unavailable;\r\n\tconst playTitle = unavailable || error ? \"Recording Unavailable\" : \"Play\";\r\n\tconst dlTitle = unavailable || error ? \"Recording Unavailable\" : \"Download\";\r\n\r\n\treturn (\r\n\t\t<Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.3 }}>\r\n\t\t\t<Tooltip title={playTitle}>\r\n\t\t\t\t<span>\r\n\t\t\t\t\t<IconButton size=\"small\" onClick={handlePlay} disabled={disabled}\r\n\t\t\t\t\t\tsx={{ color: unavailable ? \"#b0b8c8\" : COLORS.green, p: 0.4 }}>\r\n\t\t\t\t\t\t{loading ? <CircularProgress size={14} /> : <PlayArrowIcon sx={{ fontSize: 16 }} />}\r\n\t\t\t\t\t</IconButton>\r\n\t\t\t\t</span>\r\n\t\t\t</Tooltip>\r\n\t\t\t<Tooltip title={dlTitle}>\r\n\t\t\t\t<span>\r\n\t\t\t\t\t<IconButton size=\"small\" onClick={handleDownload} disabled={disabled}\r\n\t\t\t\t\t\tsx={{ color: unavailable ? \"#b0b8c8\" : COLORS.blue, p: 0.4 }}>\r\n\t\t\t\t\t\t<FileDownloadIcon sx={{ fontSize: 16 }} />\r\n\t\t\t\t\t</IconButton>\r\n\t\t\t\t</span>\r\n\t\t\t</Tooltip>\r\n\t\t</Box>\r\n\t);\r\n});\r\n\r\n// ─── Filter bar (visually identical to ReportFilterBar) ──────────────────────\r\n\r\ninterface FilterBarProps {\r\n\tstartDate: Dayjs | null;\r\n\tendDate: Dayjs | null;\r\n\tonStartChange: (val: Dayjs | null) => void;\r\n\tonEndChange: (val: Dayjs | null) => void;\r\n\tquickRange: QuickRange;\r\n\tonQuickRangeChange: (range: QuickRange) => void;\r\n\tagents: CdrAgentFilterOption[];\r\n\tselectedAgentIds: number[];\r\n\tonAgentsChange: (ids: number[]) => void;\r\n\tqueues: CdrQueueFilterOption[];\r\n\tselectedQueueIds: number[];\r\n\tonQueuesChange: (ids: number[]) => void;\r\n}\r\n\r\nconst FilterBar = memo(function FilterBar({\r\n\tstartDate, endDate, onStartChange, onEndChange,\r\n\tquickRange, onQuickRangeChange,\r\n\tagents, selectedAgentIds, onAgentsChange,\r\n\tqueues, selectedQueueIds, onQueuesChange,\r\n}: FilterBarProps) {\r\n\tconst setQuick = (range: QuickRange) => {\r\n\t\tonQuickRangeChange(range);\r\n\t\tconst today = dayjs();\r\n\t\tlet sd: Dayjs = today.startOf(\"day\");\r\n\t\tconst ed: Dayjs = today;\r\n\t\tif (range === \"week\") sd = today.startOf(\"week\").startOf(\"day\");\r\n\t\telse if (range === \"month\") sd = today.startOf(\"month\").startOf(\"day\");\r\n\t\tonStartChange(sd);\r\n\t\tonEndChange(ed);\r\n\t};\r\n\r\n\tconst now = dayjs();\r\n\r\n\tconst clampFuture = (v: Dayjs | null): Dayjs | null => {\r\n\t\tif (!v) return v;\r\n\t\tconst current = dayjs();\r\n\t\treturn v.isAfter(current) ? current : v;\r\n\t};\r\n\r\n\tconst handleStartChange = (v: Dayjs | null) => {\r\n\t\tconst clamped = clampFuture(v);\r\n\t\tonStartChange(clamped);\r\n\t\tonQuickRangeChange(\"\");\r\n\t\tif (clamped && endDate && endDate.isBefore(clamped)) {\r\n\t\t\tonEndChange(clamped);\r\n\t\t}\r\n\t};\r\n\r\n\tconst handleEndChange = (v: Dayjs | null) => {\r\n\t\tlet clamped = clampFuture(v);\r\n\t\tif (clamped && startDate && clamped.isBefore(startDate)) {\r\n\t\t\tclamped = startDate;\r\n\t\t}\r\n\t\tonEndChange(clamped);\r\n\t\tonQuickRangeChange(\"\");\r\n\t};\r\n\r\n\tconst startMax = endDate && endDate.isBefore(now) ? endDate : now;\r\n\tconst allAgentsSelected = agents.length > 0 && selectedAgentIds.length === agents.length;\r\n\tconst allQueuesSelected = queues.length > 0 && selectedQueueIds.length === queues.length;\r\n\r\n\treturn (\r\n\t\t<Box sx={filterBarSx}>\r\n\t\t\t{/* Date range pickers */}\r\n\t\t\t<DateTimePicker\r\n\t\t\t\tvalue={startDate}\r\n\t\t\t\tonChange={(v) => handleStartChange(v as Dayjs | null)}\r\n\t\t\t\tdisableFuture\r\n\t\t\t\tmaxDateTime={startMax}\r\n\t\t\t\tformat=\"DD-MM-YYYY hh:mm A\"\r\n\t\t\t\tslotProps={{ textField: { size: \"small\", sx: datePickerSx } }}\r\n\t\t\t/>\r\n\t\t\t<Typography sx={dateSeparatorSx}>to</Typography>\r\n\t\t\t<DateTimePicker\r\n\t\t\t\tvalue={endDate}\r\n\t\t\t\tonChange={(v) => handleEndChange(v as Dayjs | null)}\r\n\t\t\t\tdisableFuture\r\n\t\t\t\tmaxDateTime={now}\r\n\t\t\t\t{...(startDate ? { minDateTime: startDate } : {})}\r\n\t\t\t\tformat=\"DD-MM-YYYY hh:mm A\"\r\n\t\t\t\tslotProps={{ textField: { size: \"small\", sx: datePickerSx } }}\r\n\t\t\t/>\r\n\r\n\t\t\t{/* Quick range buttons — match AppButton primary/outlined */}\r\n\t\t\t<SDKButton\r\n\t\t\t\tvariant={quickRange === \"today\" ? \"primary\" : \"outlined\"}\r\n\t\t\t\tonClick={() => setQuick(\"today\")}\r\n\t\t\t\tsx={quickBtnSx}\r\n\t\t\t>\r\n\t\t\t\tToday\r\n\t\t\t</SDKButton>\r\n\t\t\t<SDKButton\r\n\t\t\t\tvariant={quickRange === \"week\" ? \"primary\" : \"outlined\"}\r\n\t\t\t\tonClick={() => setQuick(\"week\")}\r\n\t\t\t\tsx={quickBtnSx}\r\n\t\t\t>\r\n\t\t\t\tThis Week\r\n\t\t\t</SDKButton>\r\n\t\t\t<SDKButton\r\n\t\t\t\tvariant={quickRange === \"month\" ? \"primary\" : \"outlined\"}\r\n\t\t\t\tonClick={() => setQuick(\"month\")}\r\n\t\t\t\tsx={quickBtnSx}\r\n\t\t\t>\r\n\t\t\t\tThis Month\r\n\t\t\t</SDKButton>\r\n\r\n\t\t\t{/* Agents multi-select — matches AgentMultiSelect from main app */}\r\n\t\t\t<FormControl size=\"small\" sx={multiSelectFormSx}>\r\n\t\t\t\t<InputLabel sx={multiSelectLabelSx}>Agents</InputLabel>\r\n\t\t\t\t<Select\r\n\t\t\t\t\tmultiple\r\n\t\t\t\t\tvalue={selectedAgentIds}\r\n\t\t\t\t\tlabel=\"Agents\"\r\n\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\tconst ids = e.target.value as number[];\r\n\t\t\t\t\t\tif (ids.includes(AGENT_SELECT_ALL_ID)) {\r\n\t\t\t\t\t\t\tonAgentsChange(allAgentsSelected ? [] : agents.map((a) => a.id));\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tonAgentsChange(ids);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\trenderValue={(selected) => {\r\n\t\t\t\t\t\tconst sel = selected as number[];\r\n\t\t\t\t\t\tif (sel.length === 0 || sel.length === agents.length) return \"All Agents\";\r\n\t\t\t\t\t\treturn `${sel.length} Agent(s)`;\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tsx={multiSelectSx}\r\n\t\t\t\t\tMenuProps={{ PaperProps: { sx: multiSelectMenuPropsSx } }}\r\n\t\t\t\t>\r\n\t\t\t\t\t<MenuItem value={AGENT_SELECT_ALL_ID}>\r\n\t\t\t\t\t\t<Checkbox\r\n\t\t\t\t\t\t\tchecked={allAgentsSelected}\r\n\t\t\t\t\t\t\tindeterminate={selectedAgentIds.length > 0 && !allAgentsSelected}\r\n\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\tSelect All\r\n\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t{agents.map((a) => (\r\n\t\t\t\t\t\t<MenuItem key={a.id} value={a.id}>\r\n\t\t\t\t\t\t\t<Checkbox checked={selectedAgentIds.includes(a.id)} size=\"small\" />\r\n\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\tnoWrap\r\n\t\t\t\t\t\t\t\tsx={{ fontSize: \"0.76rem\", maxWidth: 180 }}\r\n\t\t\t\t\t\t\t\ttitle={a.fullName || a.userId}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{a.fullName || a.userId}\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</Select>\r\n\t\t\t</FormControl>\r\n\r\n\t\t\t{/* Queues multi-select — matches ReportFilterBar */}\r\n\t\t\t<FormControl size=\"small\" sx={multiSelectFormSx}>\r\n\t\t\t\t<InputLabel sx={multiSelectLabelSx}>All Queues</InputLabel>\r\n\t\t\t\t<Select\r\n\t\t\t\t\tmultiple\r\n\t\t\t\t\tvalue={selectedQueueIds}\r\n\t\t\t\t\tlabel=\"All Queues\"\r\n\t\t\t\t\tsx={multiSelectSx}\r\n\t\t\t\t\tMenuProps={{ PaperProps: { sx: multiSelectMenuPropsSx } }}\r\n\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\tconst ids = e.target.value as number[];\r\n\t\t\t\t\t\tif (ids.includes(-1)) {\r\n\t\t\t\t\t\t\tonQueuesChange(allQueuesSelected ? [] : queues.map((q) => q.id));\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tonQueuesChange(ids);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\trenderValue={(selected) => {\r\n\t\t\t\t\t\tconst sel = selected as number[];\r\n\t\t\t\t\t\tif (sel.length === 0) return \"All Queues\";\r\n\t\t\t\t\t\tif (sel.length === queues.length) return \"All Queues\";\r\n\t\t\t\t\t\treturn `${sel.length} Queue(s)`;\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<MenuItem value={-1}>\r\n\t\t\t\t\t\t<Checkbox\r\n\t\t\t\t\t\t\tchecked={selectedQueueIds.length === queues.length && queues.length > 0}\r\n\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\tSelect All\r\n\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t{queues.map((q) => (\r\n\t\t\t\t\t\t<MenuItem key={q.id} value={q.id}>\r\n\t\t\t\t\t\t\t<Checkbox checked={selectedQueueIds.includes(q.id)} size=\"small\" />\r\n\t\t\t\t\t\t\t{q.name}\r\n\t\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</Select>\r\n\t\t\t</FormControl>\r\n\t\t</Box>\r\n\t);\r\n});\r\n\r\n// ─── Search bar (matches SearchBar component) ────────────────────────────────\r\n\r\ninterface SearchBarLocalProps {\r\n\tvalue: string;\r\n\tonChange: (v: string) => void;\r\n}\r\n\r\nconst SearchBarLocal = memo(function SearchBarLocal({ value, onChange }: SearchBarLocalProps) {\r\n\treturn (\r\n\t\t<TextField\r\n\t\t\tsize=\"small\"\r\n\t\t\tplaceholder=\"Search phone, agent...\"\r\n\t\t\tvalue={value}\r\n\t\t\tonChange={(e) => onChange(e.target.value)}\r\n\t\t\tslotProps={{\r\n\t\t\t\tinput: {\r\n\t\t\t\t\tstartAdornment: (\r\n\t\t\t\t\t\t<InputAdornment position=\"start\">\r\n\t\t\t\t\t\t\t<SearchIcon sx={{ color: \"#1A5F6C\", fontSize: 18 }} />\r\n\t\t\t\t\t\t</InputAdornment>\r\n\t\t\t\t\t),\r\n\t\t\t\t\tendAdornment: value ? (\r\n\t\t\t\t\t\t<InputAdornment position=\"end\">\r\n\t\t\t\t\t\t\t<IconButton size=\"small\" onClick={() => onChange(\"\")} edge=\"end\">\r\n\t\t\t\t\t\t\t\t<CloseIcon sx={{ fontSize: 16, color: \"#94a3b8\" }} />\r\n\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t</InputAdornment>\r\n\t\t\t\t\t) : undefined,\r\n\t\t\t\t},\r\n\t\t\t}}\r\n\t\t\tsx={searchBarSx}\r\n\t\t/>\r\n\t);\r\n});\r\n\r\n// ─── Main content ────────────────────────────────────────────────────────────\r\n\r\nconst CdrReportContent = memo(function CdrReportContent() {\r\n\t// Filter state\r\n\tconst [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n\tconst [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n\tconst [quickRange, setQuickRange] = useState<QuickRange>(\"today\");\r\n\tconst [searchText, setSearchText] = useState(\"\");\r\n\tconst [selectedAgentIds, setSelectedAgentIds] = useState<number[]>([]);\r\n\tconst [selectedQueueIds, setSelectedQueueIds] = useState<number[]>([]);\r\n\r\n\t// Table state\r\n\tconst [page, setPage] = useState(0);\r\n\tconst [rowsPerPage, setRowsPerPage] = useState<number>(DEFAULT_PAGE_SIZE);\r\n\tconst [sortKey, setSortKey] = useState<SortKey>(\"callStartTime\");\r\n\tconst [sortDir, setSortDir] = useState<SortDir>(\"desc\");\r\n\r\n\t// Debounced search\r\n\tconst [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n\tconst debounceRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\r\n\r\n\tuseEffect(() => {\r\n\t\tdebounceRef.current = setTimeout(() => setDebouncedSearch(searchText.trim()), 400);\r\n\t\treturn () => { if (debounceRef.current) clearTimeout(debounceRef.current); };\r\n\t}, [searchText]);\r\n\r\n\t// Data hooks\r\n\tconst {\r\n\t\trecords, totalRecords, loading, error, setError,\r\n\t\tfetchRecords, exportExcel, fetchRecording,\r\n\t} = useCdrReport();\r\n\r\n\tconst { agents, queues, fetchAll: fetchFilters } = useCdrFilters();\r\n\r\n\tuseEffect(() => {\r\n\t\tfetchFilters();\r\n\t}, [fetchFilters]);\r\n\r\n\tconst buildParams = useCallback((pageNum: number): CdrReportParams => {\r\n\t\tconst sd = startDate ?? dayjs();\r\n\t\tconst ed = endDate ?? dayjs();\r\n\t\treturn {\r\n\t\t\tstart_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\tend_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\tagent_id: selectedAgentIds.length > 0 ? selectedAgentIds : undefined,\r\n\t\t\tqueue_id: selectedQueueIds.length > 0 ? selectedQueueIds : undefined,\r\n\t\t\tsearch: debouncedSearch || undefined,\r\n\t\t\tpage: pageNum + 1,\r\n\t\t\tpage_size: rowsPerPage,\r\n\t\t};\r\n\t}, [startDate, endDate, selectedAgentIds, selectedQueueIds, debouncedSearch, rowsPerPage]);\r\n\r\n\tuseEffect(() => {\r\n\t\tsetPage(0);\r\n\t\tfetchRecords(buildParams(0));\r\n\t}, [buildParams, fetchRecords]);\r\n\r\n\tconst handlePageChange = useCallback(\r\n\t\t(_e: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n\t\t\tsetPage(newPage);\r\n\t\t\tfetchRecords(buildParams(newPage));\r\n\t\t},\r\n\t\t[buildParams, fetchRecords],\r\n\t);\r\n\r\n\tconst handleRowsPerPageChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n\t\tsetRowsPerPage(parseInt(e.target.value, 10));\r\n\t\tsetPage(0);\r\n\t}, []);\r\n\r\n\tconst handleSort = useCallback((key: SortKey) => {\r\n\t\tsetSortKey((prevKey) => {\r\n\t\t\tif (prevKey === key) {\r\n\t\t\t\tsetSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n\t\t\t\treturn prevKey;\r\n\t\t\t}\r\n\t\t\tsetSortDir(\"asc\");\r\n\t\t\treturn key;\r\n\t\t});\r\n\t}, []);\r\n\r\n\tconst sortedRecords = useMemo(() => {\r\n\t\tconst rows = [...records];\r\n\t\trows.sort((a, b) => {\r\n\t\t\tconst cmp = comparator(a, b, sortKey);\r\n\t\t\treturn sortDir === \"asc\" ? cmp : -cmp;\r\n\t\t});\r\n\t\treturn rows;\r\n\t}, [records, sortKey, sortDir]);\r\n\r\n\tconst handleExportExcel = useCallback(async () => {\r\n\t\tconst sd = startDate ?? dayjs();\r\n\t\tconst ed = endDate ?? dayjs();\r\n\t\ttry {\r\n\t\t\tawait exportExcel({\r\n\t\t\t\tstart_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t\tend_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t\tagent_id: selectedAgentIds.length > 0 ? selectedAgentIds : undefined,\r\n\t\t\t\tqueue_id: selectedQueueIds.length > 0 ? selectedQueueIds : undefined,\r\n\t\t\t\tsearch: debouncedSearch || undefined,\r\n\t\t\t});\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(err?.message || \"Failed to export Excel\");\r\n\t\t}\r\n\t}, [startDate, endDate, selectedAgentIds, selectedQueueIds, debouncedSearch, exportExcel, setError]);\r\n\r\n\tconst columns: { id: SortKey; label: string }[] = [\r\n\t\t{ id: \"phoneNumber\", label: \"Phone Number\" },\r\n\t\t{ id: \"callStartTime\", label: \"Call Start\" },\r\n\t\t{ id: \"callType\", label: \"Call Type\" },\r\n\t\t{ id: \"callStatus\", label: \"Status\" },\r\n\t\t{ id: \"agentName\", label: \"User Name\" },\r\n\t\t{ id: \"queueName\", label: \"Queues\" },\r\n\t\t{ id: \"extension\", label: \"Extension\" },\r\n\t\t{ id: \"talkDurationFmt\", label: \"Talk Duration\" },\r\n\t\t{ id: \"holdDurationFmt\", label: \"Hold Duration\" },\r\n\t\t{ id: \"ringingDurationFmt\", label: \"Ringing Duration\" },\r\n\t\t{ id: \"queueDurationFmt\", label: \"Queue Duration\" },\r\n\t\t{ id: \"wrapupDurationFmt\", label: \"Wrapup Duration\" },\r\n\t\t{ id: \"disposition\", label: \"Disposition\" },\r\n\t\t{ id: \"remarks\", label: \"Remarks\" },\r\n\t\t{ id: \"wasTransferred\", label: \"Transferred\" },\r\n\t];\r\n\r\n\treturn (\r\n\t\t<LocalizationProvider dateAdapter={AdapterDayjs}>\r\n\t\t\t<Box sx={pageContainerSx}>\r\n\t\t\t\t{/* Page header */}\r\n\t\t\t\t<SDKPageHeader\r\n\t\t\t\t\ttitle=\"CDR Report\"\r\n\t\t\t\t\tactions={\r\n\t\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n\t\t\t\t\t\t\t<SearchBarLocal value={searchText} onChange={setSearchText} />\r\n\t\t\t\t\t\t\t<SDKPermissionGuard\r\n\t\t\t\t\t\t\t\tpermissions={[\r\n\t\t\t\t\t\t\t\t\tSDK_PERMISSIONS.REPORTS_CDR_EXPORT,\r\n\t\t\t\t\t\t\t\t\tSDK_PERMISSIONS.REPORTS_CDR_MANAGE,\r\n\t\t\t\t\t\t\t\t]}\r\n\t\t\t\t\t\t\t\tshowFallback={false}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<SDKButton\r\n\t\t\t\t\t\t\t\t\tstartIcon={<DownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n\t\t\t\t\t\t\t\t\tdisabled={!records.length}\r\n\t\t\t\t\t\t\t\t\tonClick={handleExportExcel}\r\n\t\t\t\t\t\t\t\t\tsx={{ height: 36 }}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\tExport Excel\r\n\t\t\t\t\t\t\t\t</SDKButton>\r\n\t\t\t\t\t\t\t</SDKPermissionGuard>\r\n\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t}\r\n\t\t\t\t/>\r\n\r\n\t\t\t\t<Box sx={contentSx}>\r\n\t\t\t\t\t{/* Filter bar */}\r\n\t\t\t\t\t<Box sx={filterBarBoxSx}>\r\n\t\t\t\t\t\t<FilterBar\r\n\t\t\t\t\t\t\tstartDate={startDate}\r\n\t\t\t\t\t\t\tendDate={endDate}\r\n\t\t\t\t\t\t\tonStartChange={setStartDate}\r\n\t\t\t\t\t\t\tonEndChange={setEndDate}\r\n\t\t\t\t\t\t\tquickRange={quickRange}\r\n\t\t\t\t\t\t\tonQuickRangeChange={setQuickRange}\r\n\t\t\t\t\t\t\tagents={agents}\r\n\t\t\t\t\t\t\tselectedAgentIds={selectedAgentIds}\r\n\t\t\t\t\t\t\tonAgentsChange={setSelectedAgentIds}\r\n\t\t\t\t\t\t\tqueues={queues}\r\n\t\t\t\t\t\t\tselectedQueueIds={selectedQueueIds}\r\n\t\t\t\t\t\t\tonQueuesChange={setSelectedQueueIds}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t{error && <Alert severity=\"error\" sx={alertSx}>{error}</Alert>}\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{loading && (\r\n\t\t\t\t\t\t<Box sx={loadingBoxSx}>\r\n\t\t\t\t\t\t\t<CircularProgress sx={{ color: COLORS.blue }} size={28} />\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t{/* Main table */}\r\n\t\t\t\t\t<Paper elevation={0} sx={tablePaperSx}>\r\n\t\t\t\t\t\t<TableContainer>\r\n\t\t\t\t\t\t\t<Table size=\"small\" sx={tableSx}>\r\n\t\t\t\t\t\t\t\t<TableHead>\r\n\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t{columns.map((col) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell key={col.id} sx={headCellSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableSortLabel\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive={sortKey === col.id}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdirection={sortKey === col.id ? sortDir : \"asc\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSort(col.id)}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={sortLabelSx}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{col.label}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableSortLabel>\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...(headCellSx as object), minWidth: 220 }}>Recording</TableCell>\r\n\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t</TableHead>\r\n\t\t\t\t\t\t\t\t<TableBody>\r\n\t\t\t\t\t\t\t\t\t{!loading && sortedRecords.length === 0 ? (\r\n\t\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell colSpan={columns.length + 1} align=\"center\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ py: 4, color: \"#999\", fontFamily: FONT, fontSize: \"0.85rem\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\tNo CDR records for the selected filters.\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\tsortedRecords.map((row, idx) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<TableRow key={row.callUuid || idx} hover sx={tableRowSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellNumberSx}>{row.phoneNumber || \"\"}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellDateSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.callStartTime\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? dayjs(row.callStartTime).format(\"DD MMM YYYY hh:mm A\")\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.callType ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Chip label={row.callType} size=\"small\" sx={callTypePillSx(row.callType)} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.callStatus ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Chip label={row.callStatus} size=\"small\" sx={statusPillSx(row.callStatus)} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellDateSx}>{row.agentName || \"\"}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.queueName ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Chip label={row.queueName} size=\"small\" sx={queueChipSx} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellDateSx}>{row.extension || \"\"}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellTalkSx}>{row.talkDurationFmt || \"\"}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellHoldSx}>{row.holdDurationFmt || \"\"}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellDurationSx}>{row.ringingDurationFmt || \"\"}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellDurationSx}>{row.queueDurationFmt || \"\"}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellDurationSx}>{row.wrapupDurationFmt || \"\"}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellDateSx}>{row.disposition || \"\"}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={cellDateSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.remarks ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Tooltip title={row.remarks}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span style={{ display: \"inline-block\", maxWidth: 180, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\", verticalAlign: \"bottom\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{row.remarks}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : \"\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Chip\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={row.wasTransferred ? \"Yes\" : \"No\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={row.wasTransferred ? transferYesSx : transferNoSx}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.callUuid ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<RecordingCell\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcallUuid={row.callUuid}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trecordingPath={row.recordingPath}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfetchRecording={fetchRecording}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</TableBody>\r\n\t\t\t\t\t\t\t</Table>\r\n\t\t\t\t\t\t</TableContainer>\r\n\r\n\t\t\t\t\t\t<TablePagination\r\n\t\t\t\t\t\t\tcomponent=\"div\"\r\n\t\t\t\t\t\t\tcount={totalRecords}\r\n\t\t\t\t\t\t\tpage={page}\r\n\t\t\t\t\t\t\tonPageChange={handlePageChange}\r\n\t\t\t\t\t\t\trowsPerPage={rowsPerPage}\r\n\t\t\t\t\t\t\trowsPerPageOptions={[...ROWS_PER_PAGE_OPTIONS]}\r\n\t\t\t\t\t\t\tonRowsPerPageChange={handleRowsPerPageChange}\r\n\t\t\t\t\t\t\tsx={paginationSx}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</Paper>\r\n\t\t\t\t</Box>\r\n\t\t\t</Box>\r\n\t\t</LocalizationProvider>\r\n\t);\r\n});\r\n\r\n// ─── Default export wrapped with SDKProvider ─────────────────────────────────\r\n\r\nconst CdrReport: React.FC = () => (\r\n\t<SDKProvider>\r\n\t\t<CdrReportContent />\r\n\t</SDKProvider>\r\n);\r\n\r\nexport default CdrReport;\r\n","import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type {\r\n\tCdrAgentFilterOption,\r\n\tCdrQueueFilterOption,\r\n\tCdrRecordsPage,\r\n\tCdrReportParams,\r\n} from \"./types\";\r\n\r\n// ─── Build query string for CDR endpoints ────────────────────────────────────\r\n\r\nfunction buildCdrQuery(params: CdrReportParams): 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) {\r\n\t\tfor (const id of params.agent_id) qs.append(\"agent_id\", String(id));\r\n\t}\r\n\tif (params.queue_id) {\r\n\t\tfor (const id of params.queue_id) qs.append(\"queue_id\", String(id));\r\n\t}\r\n\tif (params.call_type) qs.append(\"call_type\", params.call_type);\r\n\tif (params.status) qs.append(\"status\", params.status);\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.page_size) qs.append(\"page_size\", String(params.page_size));\r\n\tconst str = qs.toString();\r\n\treturn str ? `?${str}` : \"\";\r\n}\r\n\r\n// ─── CDR records hook ────────────────────────────────────────────────────────\r\n\r\nexport function useCdrReport() {\r\n\tconst [records, setRecords] = useState<CdrRecordsPage[\"data\"]>([]);\r\n\tconst [totalRecords, setTotalRecords] = useState(0);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchRecords = useCallback(async (params: CdrReportParams): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst qs = buildCdrQuery(params);\r\n\t\t\tconst res = await axiosInstance.get<CdrRecordsPage>(`${END_POINT.CDR_REPORT_RECORDS}${qs}`);\r\n\t\t\tsetRecords(res.data?.data ?? []);\r\n\t\t\tsetTotalRecords(res.data?.total ?? 0);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(\r\n\t\t\t\terr?.response?.data?.message\r\n\t\t\t\t?? err?.response?.data?.detail\r\n\t\t\t\t?? err?.message\r\n\t\t\t\t?? \"Failed to fetch CDR report\"\r\n\t\t\t);\r\n\t\t\tsetRecords([]);\r\n\t\t\tsetTotalRecords(0);\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: CdrReportParams): Promise<void> => {\r\n\t\tconst qs = buildCdrQuery(params);\r\n\t\tconst res = await axiosInstance.get(`${END_POINT.CDR_REPORT_EXPORT_EXCEL}${qs}`, {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\tconst blob = res.data as Blob;\r\n\t\tconst url = window.URL.createObjectURL(blob);\r\n\t\tconst a = document.createElement(\"a\");\r\n\t\ta.href = url;\r\n\t\ta.download = `cdr-report-${params.start_date ?? \"export\"}.xlsx`;\r\n\t\tdocument.body.appendChild(a);\r\n\t\ta.click();\r\n\t\ta.remove();\r\n\t\twindow.URL.revokeObjectURL(url);\r\n\t}, []);\r\n\r\n\tconst fetchRecording = useCallback(async (callUuid: string): Promise<Blob> => {\r\n\t\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\treturn res.data;\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\trecords,\r\n\t\ttotalRecords,\r\n\t\tloading,\r\n\t\terror,\r\n\t\tsetError,\r\n\t\tfetchRecords,\r\n\t\texportExcel,\r\n\t\tfetchRecording,\r\n\t};\r\n}\r\n\r\n// ─── CDR filter options hook (agents + queues) ───────────────────────────────\r\n//\r\n// The main app's CdrReport uses the general user-list and master-queue endpoints\r\n// (NOT a CDR-specific filter endpoint). We mirror that here.\r\n// - agents: GET /api/v1/users/?role=AGENT → filter to role === \"AGENT\"\r\n// - queues: GET /api/v1/master/queue\r\n\r\ninterface UserListItem {\r\n\tid: number;\r\n\tuserId: string;\r\n\tfirstName?: string;\r\n\tlastName?: string;\r\n\trole?: string | { name?: string } | null;\r\n}\r\n\r\ninterface QueueListItem {\r\n\tid: number;\r\n\tname: string;\r\n}\r\n\r\nexport function useCdrFilters() {\r\n\tconst [agents, setAgents] = useState<CdrAgentFilterOption[]>([]);\r\n\tconst [queues, setQueues] = useState<CdrQueueFilterOption[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst fetchAgents = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<UserListItem[] | { data: UserListItem[] }>(\r\n\t\t\t\tEND_POINT.USERS_LIST,\r\n\t\t\t\t{ params: { role: \"AGENT\" } },\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tconst mapped: CdrAgentFilterOption[] = (raw as UserListItem[])\r\n\t\t\t\t.filter((u) => {\r\n\t\t\t\t\tconst roleName = typeof u.role === \"object\" && u.role !== null ? u.role.name : u.role;\r\n\t\t\t\t\treturn roleName === \"AGENT\";\r\n\t\t\t\t})\r\n\t\t\t\t.map((u) => ({\r\n\t\t\t\t\tid: u.id,\r\n\t\t\t\t\tuserId: u.userId,\r\n\t\t\t\t\tfullName: [u.firstName, u.lastName].filter(Boolean).join(\" \") || u.userId,\r\n\t\t\t\t}));\r\n\t\t\tsetAgents(mapped);\r\n\t\t} catch {\r\n\t\t\tsetAgents([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchQueues = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<QueueListItem[] | { data: QueueListItem[] }>(\r\n\t\t\t\tEND_POINT.MASTER_QUEUES,\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tsetQueues((raw as QueueListItem[]).map((q) => ({ id: q.id, name: q.name })));\r\n\t\t} catch {\r\n\t\t\tsetQueues([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchAll = useCallback(async (): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tawait Promise.all([fetchAgents(), fetchQueues()]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, [fetchAgents, fetchQueues]);\r\n\r\n\treturn { agents, queues, loading, fetchAgents, fetchQueues, fetchAll };\r\n}\r\n","// ─── CDR record (server response) ────────────────────────────────────────────\r\n\r\nexport interface CdrRecordResponse {\r\n\tcallUuid: string;\r\n\tphoneNumber: string | null;\r\n\tcallStartTime: string | null;\r\n\tconnectTime: string | null;\r\n\tcallType: string | null;\r\n\tcallStatus: string | null;\r\n\tagentName: string | null;\r\n\tagentUserId: string | null;\r\n\tqueueName: string | null;\r\n\textension: string | null;\r\n\ttalkDurationSeconds: number;\r\n\ttalkDurationFmt: string;\r\n\tholdDurationSeconds: number;\r\n\tholdDurationFmt: string;\r\n\tmuteDurationSeconds: number;\r\n\tmuteDurationFmt: string;\r\n\twrapupDurationSeconds: number;\r\n\twrapupDurationFmt: string;\r\n\tringingDurationSeconds: number;\r\n\tringingDurationFmt: string;\r\n\tqueueDurationSeconds: number;\r\n\tqueueDurationFmt: string;\r\n\tivrDurationSeconds: number;\r\n\tivrDurationFmt: string;\r\n\tdisposition: string | null;\r\n\tremarks: string | null;\r\n\twasTransferred: boolean;\r\n\trecordingPath: string | null;\r\n\thangupInitiator: string | null;\r\n}\r\n\r\nexport interface CdrRecordsPage {\r\n\tdata: CdrRecordResponse[];\r\n\ttotal: number;\r\n\tpage: number;\r\n\tpageSize: number;\r\n\ttotalPages: number;\r\n}\r\n\r\n// ─── Filter / query params ───────────────────────────────────────────────────\r\n\r\nexport interface CdrReportParams {\r\n\tstart_date?: string;\r\n\tend_date?: string;\r\n\tagent_id?: number[];\r\n\tqueue_id?: number[];\r\n\tcall_type?: string;\r\n\tstatus?: string;\r\n\tsearch?: string;\r\n\tpage?: number;\r\n\tpage_size?: number;\r\n}\r\n\r\n// ─── Filter options ──────────────────────────────────────────────────────────\r\n\r\nexport interface CdrAgentFilterOption {\r\n\tid: number;\r\n\tuserId: string;\r\n\tfullName: string;\r\n}\r\n\r\nexport interface CdrQueueFilterOption {\r\n\tid: number;\r\n\tname: string;\r\n}\r\n\r\n// ─── Local UI helper shape ───────────────────────────────────────────────────\r\n\r\nexport interface AgentOption {\r\n\tid: number;\r\n\tuserId: string;\r\n\tdisplayName: string;\r\n}\r\n\r\n// ─── Sort helpers ────────────────────────────────────────────────────────────\r\n\r\nexport type SortKey =\r\n\t| \"phoneNumber\"\r\n\t| \"callStartTime\"\r\n\t| \"callType\"\r\n\t| \"callStatus\"\r\n\t| \"agentName\"\r\n\t| \"queueName\"\r\n\t| \"extension\"\r\n\t| \"talkDurationFmt\"\r\n\t| \"holdDurationFmt\"\r\n\t| \"ringingDurationFmt\"\r\n\t| \"queueDurationFmt\"\r\n\t| \"wrapupDurationFmt\"\r\n\t| \"disposition\"\r\n\t| \"remarks\"\r\n\t| \"wasTransferred\";\r\n\r\nexport type SortDir = \"asc\" | \"desc\";\r\n\r\nexport type QuickRange = \"today\" | \"week\" | \"month\" | \"\";\r\n\r\n// ─── Constants ───────────────────────────────────────────────────────────────\r\n\r\nexport const DEFAULT_PAGE_SIZE = 15;\r\n\r\nexport const ROWS_PER_PAGE_OPTIONS = [5, 10, 20, 25, 50] as const;\r\n","import type { SxProps, Theme } from \"@mui/material/styles\";\r\n\r\n// ─── Palette (matches main app CdrReport) ────────────────────────────────────\r\n\r\nexport const FONT = \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n\r\nexport const COLORS = {\r\n\tnavy: \"#0d2a56\",\r\n\tblue: \"#1565c8\",\r\n\tgreen: \"#0a9a62\",\r\n\tamber: \"#c47c00\",\r\n\tred: \"#cc2a2a\",\r\n\tpurple: \"#6b3fbf\",\r\n\tbg: \"transparent\",\r\n\tsurface: \"transparent\",\r\n} as const;\r\n\r\n// ─── Outer layout ────────────────────────────────────────────────────────────\r\n\r\nexport const pageContainerSx: SxProps<Theme> = {\r\n\theight: \"100%\",\r\n\tdisplay: \"flex\",\r\n\tflexDirection: \"column\",\r\n\tfontFamily: FONT,\r\n};\r\n\r\nexport const contentSx: SxProps<Theme> = {\r\n\tflex: 1,\r\n\toverflow: \"auto\",\r\n\tpy: 0.8,\r\n\tpx: 0,\r\n};\r\n\r\n// ─── Filter bar (matches ReportFilterBar — no border/background container) ───\r\n\r\nexport const FILTER_HEIGHT = 32;\r\n\r\nexport const filterBarSx: SxProps<Theme> = {\r\n\tpy: 0.6,\r\n\tpx: 1,\r\n\tdisplay: \"flex\",\r\n\talignItems: \"center\",\r\n\tgap: 1,\r\n\tflexWrap: \"wrap\",\r\n\trowGap: 1,\r\n};\r\n\r\nexport const filterBarBoxSx: SxProps<Theme> = {\r\n\tmb: 0.8,\r\n};\r\n\r\n// Date picker styling (matches main DateRangePicker)\r\nexport const datePickerSx = {\r\n\twidth: 170,\r\n\t\"& .MuiOutlinedInput-root\": { borderRadius: \"6px\", height: FILTER_HEIGHT, px: 0.5 },\r\n\t\"& .MuiInputBase-input\": { py: 0, px: \"4px\", fontSize: \"0.72rem\" },\r\n\t\"& .MuiInputAdornment-root\": { ml: 0 },\r\n\t\"& .MuiInputAdornment-root .MuiSvgIcon-root\": { fontSize: \"0.8rem\" },\r\n\t\"& .MuiOutlinedInput-notchedOutline\": { borderColor: \"#c0c8d4\" },\r\n\t\"& .MuiPickersSectionList-root\": { py: \"4px\", px: 0, fontSize: 12 },\r\n};\r\n\r\nexport const dateSeparatorSx: SxProps<Theme> = {\r\n\tfontSize: \"0.72rem\",\r\n\tcolor: \"#7a8599\",\r\n};\r\n\r\n// Quick range button — matches ReportFilterBar\r\nexport const quickBtnSx: SxProps<Theme> = {\r\n\theight: FILTER_HEIGHT,\r\n\twhiteSpace: \"nowrap\",\r\n};\r\n\r\n// Multi-select dropdown styling\r\nexport const multiSelectFormSx: SxProps<Theme> = {\r\n\tminWidth: 130,\r\n};\r\n\r\nexport const multiSelectSx: SxProps<Theme> = {\r\n\tfontSize: \"0.76rem\",\r\n\theight: FILTER_HEIGHT,\r\n\tborderRadius: \"6px\",\r\n};\r\n\r\nexport const multiSelectMenuPropsSx = {\r\n\tmaxHeight: 280,\r\n\t\"& .MuiMenuItem-root\": { fontSize: \"0.76rem\", minHeight: 32, py: 0.3 },\r\n};\r\n\r\nexport const multiSelectLabelSx: SxProps<Theme> = {\r\n\tfontSize: \"0.76rem\",\r\n};\r\n\r\n// ─── Search bar (matches SearchBar component) ────────────────────────────────\r\n\r\nexport const searchBarSx: SxProps<Theme> = {\r\n\twidth: 250,\r\n\t\"& .MuiOutlinedInput-root\": {\r\n\t\tborderRadius: \"50px\",\r\n\t\theight: 36,\r\n\t\tbackgroundColor: \"#f5f7f8\",\r\n\t\t\"& fieldset\": { borderColor: \"#dde3e8\" },\r\n\t\t\"&:hover fieldset\": { borderColor: \"#1A5F6C\" },\r\n\t\t\"&.Mui-focused fieldset\": { borderColor: \"#1A5F6C\", borderWidth: \"1.5px\" },\r\n\t},\r\n\t\"& .MuiInputBase-input\": {\r\n\t\tfontSize: \"0.85rem\",\r\n\t\t\"&::placeholder\": { color: \"#94a3b8\", opacity: 1 },\r\n\t},\r\n};\r\n\r\n// ─── Table (matches main app exactly) ────────────────────────────────────────\r\n\r\nexport const tablePaperSx: SxProps<Theme> = {\r\n\tborderRadius: \"8px\",\r\n\tborder: \"1px solid #e0e7ef\",\r\n\toverflow: \"hidden\",\r\n\tmb: 2,\r\n};\r\n\r\nexport const tableSx: SxProps<Theme> = {\r\n\tminWidth: 1400,\r\n\tfontFamily: FONT,\r\n\t\"& .MuiTableCell-root\": {\r\n\t\tfontFamily: FONT,\r\n\t\tfontSize: \"0.75rem\",\r\n\t\tborderBottom: \"1px solid #eef1f6\",\r\n\t\tpy: 0.6,\r\n\t\tpx: 1,\r\n\t\twhiteSpace: \"nowrap\",\r\n\t},\r\n};\r\n\r\n// Identical to headCellSx in @utils/tableStyles\r\nexport const headCellSx: SxProps<Theme> = {\r\n\tfontFamily: \"poppins, Arial, sans-serif\",\r\n\tbgcolor: \"#f1f1f1\",\r\n\tcolor: \"#333\",\r\n\tfontWeight: 600,\r\n\twhiteSpace: \"nowrap\",\r\n\tfontSize: \"14px\",\r\n};\r\n\r\nexport const sortLabelSx: SxProps<Theme> = {\r\n\t\"&.MuiTableSortLabel-root\": { color: \"#333\" },\r\n\t\"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\r\n\t\"&.Mui-active\": { color: \"#333\" },\r\n\t\"& .MuiTableSortLabel-icon\": { color: \"#333 !important\" },\r\n};\r\n\r\nexport const tableRowSx: SxProps<Theme> = {\r\n\tbackgroundColor: \"#fff\",\r\n\t\"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n};\r\n\r\nexport const cellNumberSx: SxProps<Theme> = {\r\n\tfontWeight: 600,\r\n\tcolor: COLORS.navy,\r\n\tfontSize: \"0.75rem\",\r\n};\r\n\r\nexport const cellDateSx: SxProps<Theme> = {\r\n\tfontSize: \"0.73rem\",\r\n\tcolor: \"#4a5568\",\r\n};\r\n\r\nexport const cellTalkSx: SxProps<Theme> = {\r\n\tfontWeight: 600,\r\n\tcolor: COLORS.blue,\r\n\tfontSize: \"0.75rem\",\r\n\tfontVariantNumeric: \"tabular-nums\",\r\n};\r\n\r\nexport const cellHoldSx: SxProps<Theme> = {\r\n\tfontWeight: 500,\r\n\tcolor: COLORS.amber,\r\n\tfontSize: \"0.75rem\",\r\n\tfontVariantNumeric: \"tabular-nums\",\r\n};\r\n\r\nexport const cellDurationSx: SxProps<Theme> = {\r\n\tfontWeight: 500,\r\n\tfontSize: \"0.75rem\",\r\n\tfontVariantNumeric: \"tabular-nums\",\r\n};\r\n\r\n// ─── Pills ───────────────────────────────────────────────────────────────────\r\n\r\nexport const callTypePillSx = (value: string) => {\r\n\tconst v = (value || \"\").toLowerCase();\r\n\tlet color = \"#6b7b8d\";\r\n\tlet bg = \"transparent\";\r\n\tif (v.includes(\"inbound\")) { color = COLORS.green; bg = \"#e6f7ef\"; }\r\n\telse if (v.includes(\"outbound\")) { color = COLORS.blue; bg = \"#e3eefa\"; }\r\n\telse if (v.includes(\"internal\")) { color = COLORS.purple; bg = \"#f0e8ff\"; }\r\n\treturn {\r\n\t\tfontFamily: FONT,\r\n\t\tbgcolor: bg,\r\n\t\tcolor,\r\n\t\tfontWeight: 600,\r\n\t\tfontSize: \"0.65rem\",\r\n\t\theight: 20,\r\n\t\tborderRadius: \"6px\",\r\n\t};\r\n};\r\n\r\nexport const statusPillSx = (value: string) => {\r\n\tconst v = (value || \"\").toLowerCase();\r\n\tlet color = \"#6b7b8d\";\r\n\tlet bg = \"transparent\";\r\n\tif (v.includes(\"answered\")) { color = COLORS.green; bg = \"#e6f7ef\"; }\r\n\telse if (v.includes(\"abandoned\") || v.includes(\"missed\")) { color = COLORS.red; bg = \"#fce8e8\"; }\r\n\treturn {\r\n\t\tfontFamily: FONT,\r\n\t\tbgcolor: bg,\r\n\t\tcolor,\r\n\t\tfontWeight: 600,\r\n\t\tfontSize: \"0.65rem\",\r\n\t\theight: 20,\r\n\t\tborderRadius: \"6px\",\r\n\t};\r\n};\r\n\r\nexport const queueChipSx: SxProps<Theme> = {\r\n\tfontFamily: FONT,\r\n\tbackgroundColor: \"#f0ebfa\",\r\n\tcolor: COLORS.purple,\r\n\tfontWeight: 500,\r\n\tfontSize: \"0.67rem\",\r\n\theight: 22,\r\n};\r\n\r\nexport const transferYesSx: SxProps<Theme> = {\r\n\tfontFamily: FONT,\r\n\tbackgroundColor: \"#e6f7ef\",\r\n\tcolor: COLORS.green,\r\n\tfontWeight: 600,\r\n\tfontSize: \"0.65rem\",\r\n\theight: 20,\r\n\tborderRadius: \"6px\",\r\n};\r\n\r\nexport const transferNoSx: SxProps<Theme> = {\r\n\tfontFamily: FONT,\r\n\tbackgroundColor: \"transparent\",\r\n\tcolor: \"#6b7b8d\",\r\n\tfontWeight: 600,\r\n\tfontSize: \"0.65rem\",\r\n\theight: 20,\r\n\tborderRadius: \"6px\",\r\n};\r\n\r\n// ─── Pagination ──────────────────────────────────────────────────────────────\r\n\r\nexport const paginationSx: SxProps<Theme> = {\r\n\tborderTop: \"1px solid #eef1f6\",\r\n\tfontFamily: FONT,\r\n\t\"& .MuiTablePagination-displayedRows\": { fontFamily: FONT, fontSize: \"0.73rem\" },\r\n\t\"& .MuiTablePagination-selectLabel\": { fontFamily: FONT, fontSize: \"0.73rem\" },\r\n};\r\n\r\n// ─── Misc ────────────────────────────────────────────────────────────────────\r\n\r\nexport const alertSx: SxProps<Theme> = {\r\n\tmt: 1,\r\n\tfontFamily: FONT,\r\n\tfontSize: \"0.78rem\",\r\n};\r\n\r\nexport const loadingBoxSx: SxProps<Theme> = {\r\n\ttextAlign: \"center\",\r\n\tpy: 2.5,\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAgB,MAAM,eAAAA,cAAa,WAAW,SAAS,QAAQ,YAAAC,iBAAgB;AAC/E;AAAA,EACC;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,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,OAAO,eAAe;AACtB,OAAO,kBAAkB;AACzB,OAAO,sBAAsB;AAC7B,OAAO,mBAAmB;AAC1B,OAAO,gBAAgB;AAEvB,OAAO,WAAsB;AAC7B,OAAO,aAAa;AACpB,SAAS,4BAA4B;AACrC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;;;ACrC/B,SAAS,aAAa,gBAAgB;AAYtC,SAAS,cAAc,QAAiC;AACvD,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,UAAU;AACpB,eAAW,MAAM,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,EAAE,CAAC;AAAA,EACnE;AACA,MAAI,OAAO,UAAU;AACpB,eAAW,MAAM,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,EAAE,CAAC;AAAA,EACnE;AACA,MAAI,OAAO,UAAW,IAAG,OAAO,aAAa,OAAO,SAAS;AAC7D,MAAI,OAAO,OAAQ,IAAG,OAAO,UAAU,OAAO,MAAM;AACpD,MAAI,OAAO,OAAQ,IAAG,OAAO,UAAU,OAAO,MAAM;AACpD,MAAI,OAAO,KAAM,IAAG,OAAO,QAAQ,OAAO,OAAO,IAAI,CAAC;AACtD,MAAI,OAAO,UAAW,IAAG,OAAO,aAAa,OAAO,OAAO,SAAS,CAAC;AACrE,QAAM,MAAM,GAAG,SAAS;AACxB,SAAO,MAAM,IAAI,GAAG,KAAK;AAC1B;AAIO,SAAS,eAAe;AAC9B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAiC,CAAC,CAAC;AACjE,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AAErC,QAAM,eAAe,YAAY,OAAO,WAA2C;AAvCpF;AAwCE,eAAW,IAAI;AACf,aAAS,EAAE;AACX,QAAI;AACH,YAAM,KAAK,cAAc,MAAM;AAC/B,YAAM,MAAM,MAAM,cAAc,IAAoB,GAAG,UAAU,kBAAkB,GAAG,EAAE,EAAE;AAC1F,kBAAW,eAAI,SAAJ,mBAAU,SAAV,YAAkB,CAAC,CAAC;AAC/B,uBAAgB,eAAI,SAAJ,mBAAU,UAAV,YAAmB,CAAC;AAAA,IACrC,SAAS,KAAU;AAClB;AAAA,SACC,wDAAK,aAAL,mBAAe,SAAf,mBAAqB,YAArB,aACG,sCAAK,aAAL,mBAAe,SAAf,mBAAqB,WADxB,YAEG,2BAAK,YAFR,YAGG;AAAA,MACJ;AACA,iBAAW,CAAC,CAAC;AACb,sBAAgB,CAAC;AAAA,IAClB,UAAE;AACD,iBAAW,KAAK;AAAA,IACjB;AAAA,EACD,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,OAAO,WAA2C;AA7DnF;AA8DE,UAAM,KAAK,cAAc,MAAM;AAC/B,UAAM,MAAM,MAAM,cAAc,IAAI,GAAG,UAAU,uBAAuB,GAAG,EAAE,IAAI;AAAA,MAChF,cAAc;AAAA,IACf,CAAC;AACD,UAAM,OAAO,IAAI;AACjB,UAAM,MAAM,OAAO,IAAI,gBAAgB,IAAI;AAC3C,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,WAAW,eAAc,YAAO,eAAP,YAAqB,QAAQ;AACxD,aAAS,KAAK,YAAY,CAAC;AAC3B,MAAE,MAAM;AACR,MAAE,OAAO;AACT,WAAO,IAAI,gBAAgB,GAAG;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiB,YAAY,OAAO,aAAoC;AAC7E,UAAM,MAAM,MAAM,cAAc,IAAI,UAAU,kBAAkB,QAAQ,GAAG;AAAA,MAC1E,cAAc;AAAA,IACf,CAAC;AACD,WAAO,IAAI;AAAA,EACZ,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAsBO,SAAS,gBAAgB;AAC/B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAiC,CAAC,CAAC;AAC/D,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAiC,CAAC,CAAC;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,QAAM,cAAc,YAAY,YAA2B;AAzH5D;AA0HE,QAAI;AACH,YAAM,MAAM,MAAM,cAAc;AAAA,QAC/B,UAAU;AAAA,QACV,EAAE,QAAQ,EAAE,MAAM,QAAQ,EAAE;AAAA,MAC7B;AACA,YAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,IAC/B,IAAI,OACJ,MAAM,SAAS,SAAI,SAAJ,mBAAkB,IAAI,IACnC,IAAI,KAAa,OAClB,CAAC;AACL,YAAM,SAAkC,IACtC,OAAO,CAAC,MAAM;AACd,cAAM,WAAW,OAAO,EAAE,SAAS,YAAY,EAAE,SAAS,OAAO,EAAE,KAAK,OAAO,EAAE;AACjF,eAAO,aAAa;AAAA,MACrB,CAAC,EACA,IAAI,CAAC,OAAO;AAAA,QACZ,IAAI,EAAE;AAAA,QACN,QAAQ,EAAE;AAAA,QACV,UAAU,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,EAAE;AAAA,MACpE,EAAE;AACH,gBAAU,MAAM;AAAA,IACjB,SAAQ;AACP,gBAAU,CAAC,CAAC;AAAA,IACb;AAAA,EACD,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,YAA2B;AApJ5D;AAqJE,QAAI;AACH,YAAM,MAAM,MAAM,cAAc;AAAA,QAC/B,UAAU;AAAA,MACX;AACA,YAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,IAC/B,IAAI,OACJ,MAAM,SAAS,SAAI,SAAJ,mBAAkB,IAAI,IACnC,IAAI,KAAa,OAClB,CAAC;AACL,gBAAW,IAAwB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IAC5E,SAAQ;AACP,gBAAU,CAAC,CAAC;AAAA,IACb;AAAA,EACD,GAAG,CAAC,CAAC;AAEL,QAAM,WAAW,YAAY,YAA2B;AACvD,eAAW,IAAI;AACf,QAAI;AACH,YAAM,QAAQ,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC;AAAA,IACjD,UAAE;AACD,iBAAW,KAAK;AAAA,IACjB;AAAA,EACD,GAAG,CAAC,aAAa,WAAW,CAAC;AAE7B,SAAO,EAAE,QAAQ,QAAQ,SAAS,aAAa,aAAa,SAAS;AACtE;;;ACxEO,IAAM,oBAAoB;AAE1B,IAAM,wBAAwB,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE;;;ACpGhD,IAAM,OAAO;AAEb,IAAM,SAAS;AAAA,EACrB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,SAAS;AACV;AAIO,IAAM,kBAAkC;AAAA,EAC9C,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AACb;AAEO,IAAM,YAA4B;AAAA,EACxC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,IAAI;AACL;AAIO,IAAM,gBAAgB;AAEtB,IAAM,cAA8B;AAAA,EAC1C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AACT;AAEO,IAAM,iBAAiC;AAAA,EAC7C,IAAI;AACL;AAGO,IAAM,eAAe;AAAA,EAC3B,OAAO;AAAA,EACP,4BAA4B,EAAE,cAAc,OAAO,QAAQ,eAAe,IAAI,IAAI;AAAA,EAClF,yBAAyB,EAAE,IAAI,GAAG,IAAI,OAAO,UAAU,UAAU;AAAA,EACjE,6BAA6B,EAAE,IAAI,EAAE;AAAA,EACrC,8CAA8C,EAAE,UAAU,SAAS;AAAA,EACnE,sCAAsC,EAAE,aAAa,UAAU;AAAA,EAC/D,iCAAiC,EAAE,IAAI,OAAO,IAAI,GAAG,UAAU,GAAG;AACnE;AAEO,IAAM,kBAAkC;AAAA,EAC9C,UAAU;AAAA,EACV,OAAO;AACR;AAGO,IAAM,aAA6B;AAAA,EACzC,QAAQ;AAAA,EACR,YAAY;AACb;AAGO,IAAM,oBAAoC;AAAA,EAChD,UAAU;AACX;AAEO,IAAM,gBAAgC;AAAA,EAC5C,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AACf;AAEO,IAAM,yBAAyB;AAAA,EACrC,WAAW;AAAA,EACX,uBAAuB,EAAE,UAAU,WAAW,WAAW,IAAI,IAAI,IAAI;AACtE;AAEO,IAAM,qBAAqC;AAAA,EACjD,UAAU;AACX;AAIO,IAAM,cAA8B;AAAA,EAC1C,OAAO;AAAA,EACP,4BAA4B;AAAA,IAC3B,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,cAAc,EAAE,aAAa,UAAU;AAAA,IACvC,oBAAoB,EAAE,aAAa,UAAU;AAAA,IAC7C,0BAA0B,EAAE,aAAa,WAAW,aAAa,QAAQ;AAAA,EAC1E;AAAA,EACA,yBAAyB;AAAA,IACxB,UAAU;AAAA,IACV,kBAAkB,EAAE,OAAO,WAAW,SAAS,EAAE;AAAA,EAClD;AACD;AAIO,IAAM,eAA+B;AAAA,EAC3C,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,IAAI;AACL;AAEO,IAAM,UAA0B;AAAA,EACtC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,wBAAwB;AAAA,IACvB,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,cAAc;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,YAAY;AAAA,EACb;AACD;AAGO,IAAM,aAA6B;AAAA,EACzC,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AACX;AAEO,IAAM,cAA8B;AAAA,EAC1C,4BAA4B,EAAE,OAAO,OAAO;AAAA,EAC5C,kCAAkC,EAAE,OAAO,OAAO;AAAA,EAClD,gBAAgB,EAAE,OAAO,OAAO;AAAA,EAChC,6BAA6B,EAAE,OAAO,kBAAkB;AACzD;AAEO,IAAM,aAA6B;AAAA,EACzC,iBAAiB;AAAA,EACjB,WAAW,EAAE,iBAAiB,UAAU;AACzC;AAEO,IAAM,eAA+B;AAAA,EAC3C,YAAY;AAAA,EACZ,OAAO,OAAO;AAAA,EACd,UAAU;AACX;AAEO,IAAM,aAA6B;AAAA,EACzC,UAAU;AAAA,EACV,OAAO;AACR;AAEO,IAAM,aAA6B;AAAA,EACzC,YAAY;AAAA,EACZ,OAAO,OAAO;AAAA,EACd,UAAU;AAAA,EACV,oBAAoB;AACrB;AAEO,IAAM,aAA6B;AAAA,EACzC,YAAY;AAAA,EACZ,OAAO,OAAO;AAAA,EACd,UAAU;AAAA,EACV,oBAAoB;AACrB;AAEO,IAAM,iBAAiC;AAAA,EAC7C,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,oBAAoB;AACrB;AAIO,IAAM,iBAAiB,CAAC,UAAkB;AAChD,QAAM,KAAK,SAAS,IAAI,YAAY;AACpC,MAAI,QAAQ;AACZ,MAAI,KAAK;AACT,MAAI,EAAE,SAAS,SAAS,GAAG;AAAE,YAAQ,OAAO;AAAO,SAAK;AAAA,EAAW,WAC1D,EAAE,SAAS,UAAU,GAAG;AAAE,YAAQ,OAAO;AAAM,SAAK;AAAA,EAAW,WAC/D,EAAE,SAAS,UAAU,GAAG;AAAE,YAAQ,OAAO;AAAQ,SAAK;AAAA,EAAW;AAC1E,SAAO;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc;AAAA,EACf;AACD;AAEO,IAAM,eAAe,CAAC,UAAkB;AAC9C,QAAM,KAAK,SAAS,IAAI,YAAY;AACpC,MAAI,QAAQ;AACZ,MAAI,KAAK;AACT,MAAI,EAAE,SAAS,UAAU,GAAG;AAAE,YAAQ,OAAO;AAAO,SAAK;AAAA,EAAW,WAC3D,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,QAAQ,GAAG;AAAE,YAAQ,OAAO;AAAK,SAAK;AAAA,EAAW;AAChG,SAAO;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc;AAAA,EACf;AACD;AAEO,IAAM,cAA8B;AAAA,EAC1C,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,OAAO,OAAO;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AACT;AAEO,IAAM,gBAAgC;AAAA,EAC5C,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,OAAO,OAAO;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AACf;AAEO,IAAM,eAA+B;AAAA,EAC3C,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AACf;AAIO,IAAM,eAA+B;AAAA,EAC3C,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,uCAAuC,EAAE,YAAY,MAAM,UAAU,UAAU;AAAA,EAC/E,qCAAqC,EAAE,YAAY,MAAM,UAAU,UAAU;AAC9E;AAIO,IAAM,UAA0B;AAAA,EACtC,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,UAAU;AACX;AAEO,IAAM,eAA+B;AAAA,EAC3C,WAAW;AAAA,EACX,IAAI;AACL;;;AHvHG,SACC,KADD;AA9DH,MAAM,OAAO,OAAO;AAEpB,IAAM,sBAAsB;AAI5B,IAAM,aAAa,CAAC,GAAsB,GAAsB,QAAyB;AACxF,QAAM,KAAK,EAAE,GAA8B;AAC3C,QAAM,KAAK,EAAE,GAA8B;AAC3C,MAAI,OAAO,OAAO,YAAY,OAAO,OAAO,SAAU,QAAO,KAAK;AAClE,MAAI,OAAO,OAAO,aAAa,OAAO,OAAO,UAAW,SAAQ,KAAK,IAAI,MAAM,KAAK,IAAI;AACxF,SAAO,OAAO,kBAAM,EAAE,EAAE,cAAc,OAAO,kBAAM,EAAE,CAAC;AACvD;AAUA,IAAM,gBAAgB,KAAK,SAASC,eAAc;AAAA,EACjD;AAAA,EAAU;AAAA,EAAe;AAC1B,GAAuB;AACtB,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAwB,IAAI;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,KAAK;AACxC,QAAM,cAAc,kBAAkB;AAEtC,QAAM,aAAa,YAAY;AAC9B,QAAI,SAAU;AACd,QAAI;AACH,iBAAW,IAAI;AACf,eAAS,KAAK;AACd,YAAM,OAAO,MAAM,eAAe,QAAQ;AAC1C,kBAAY,IAAI,gBAAgB,IAAI,CAAC;AAAA,IACtC,SAAQ;AACP,eAAS,IAAI;AAAA,IACd,UAAE;AACD,iBAAW,KAAK;AAAA,IACjB;AAAA,EACD;AAEA,QAAM,iBAAiB,YAAY;AAClC,QAAI;AACH,YAAM,OAAO,WACV,MAAM,MAAM,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAC1C,MAAM,eAAe,QAAQ;AAChC,YAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,OAAO;AACT,QAAE,WAAW,aAAa,QAAQ;AAClC,QAAE,MAAM;AACR,UAAI,gBAAgB,GAAG;AAAA,IACxB,SAAQ;AAAA,IAER;AAAA,EACD;AAEA,MAAI,UAAU;AACb,WACC,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GAC1D;AAAA;AAAA,QAAC;AAAA;AAAA,UACA,UAAQ;AAAA,UACR,UAAQ;AAAA,UACR,KAAK;AAAA,UACL,SAAS,MAAM;AACd,gBAAI,SAAS,WAAW,OAAO,EAAG,KAAI,gBAAgB,QAAQ;AAC9D,wBAAY,IAAI;AAAA,UACjB;AAAA,UACA,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG;AAAA;AAAA,MACjC;AAAA,MACA,oBAAC,WAAQ,OAAM,YACd,8BAAC,cAAW,MAAK,SAAQ,SAAS,gBAAgB,IAAI,EAAE,OAAO,OAAO,MAAM,GAAG,IAAI,GAClF,8BAAC,oBAAiB,IAAI,EAAE,UAAU,GAAG,GAAG,GACzC,GACD;AAAA,OACD;AAAA,EAEF;AAEA,QAAM,WAAW,WAAW,SAAS;AACrC,QAAM,YAAY,eAAe,QAAQ,0BAA0B;AACnE,QAAM,UAAU,eAAe,QAAQ,0BAA0B;AAEjE,SACC,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GAC1D;AAAA,wBAAC,WAAQ,OAAO,WACf,8BAAC,UACA;AAAA,MAAC;AAAA;AAAA,QAAW,MAAK;AAAA,QAAQ,SAAS;AAAA,QAAY;AAAA,QAC7C,IAAI,EAAE,OAAO,cAAc,YAAY,OAAO,OAAO,GAAG,IAAI;AAAA,QAC3D,oBAAU,oBAAC,oBAAiB,MAAM,IAAI,IAAK,oBAAC,iBAAc,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,IAClF,GACD,GACD;AAAA,IACA,oBAAC,WAAQ,OAAO,SACf,8BAAC,UACA;AAAA,MAAC;AAAA;AAAA,QAAW,MAAK;AAAA,QAAQ,SAAS;AAAA,QAAgB;AAAA,QACjD,IAAI,EAAE,OAAO,cAAc,YAAY,OAAO,MAAM,GAAG,IAAI;AAAA,QAC3D,8BAAC,oBAAiB,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,IACzC,GACD,GACD;AAAA,KACD;AAEF,CAAC;AAmBD,IAAM,YAAY,KAAK,SAASC,WAAU;AAAA,EACzC;AAAA,EAAW;AAAA,EAAS;AAAA,EAAe;AAAA,EACnC;AAAA,EAAY;AAAA,EACZ;AAAA,EAAQ;AAAA,EAAkB;AAAA,EAC1B;AAAA,EAAQ;AAAA,EAAkB;AAC3B,GAAmB;AAClB,QAAM,WAAW,CAAC,UAAsB;AACvC,uBAAmB,KAAK;AACxB,UAAM,QAAQ,MAAM;AACpB,QAAI,KAAY,MAAM,QAAQ,KAAK;AACnC,UAAM,KAAY;AAClB,QAAI,UAAU,OAAQ,MAAK,MAAM,QAAQ,MAAM,EAAE,QAAQ,KAAK;AAAA,aACrD,UAAU,QAAS,MAAK,MAAM,QAAQ,OAAO,EAAE,QAAQ,KAAK;AACrE,kBAAc,EAAE;AAChB,gBAAY,EAAE;AAAA,EACf;AAEA,QAAM,MAAM,MAAM;AAElB,QAAM,cAAc,CAAC,MAAkC;AACtD,QAAI,CAAC,EAAG,QAAO;AACf,UAAM,UAAU,MAAM;AACtB,WAAO,EAAE,QAAQ,OAAO,IAAI,UAAU;AAAA,EACvC;AAEA,QAAM,oBAAoB,CAAC,MAAoB;AAC9C,UAAM,UAAU,YAAY,CAAC;AAC7B,kBAAc,OAAO;AACrB,uBAAmB,EAAE;AACrB,QAAI,WAAW,WAAW,QAAQ,SAAS,OAAO,GAAG;AACpD,kBAAY,OAAO;AAAA,IACpB;AAAA,EACD;AAEA,QAAM,kBAAkB,CAAC,MAAoB;AAC5C,QAAI,UAAU,YAAY,CAAC;AAC3B,QAAI,WAAW,aAAa,QAAQ,SAAS,SAAS,GAAG;AACxD,gBAAU;AAAA,IACX;AACA,gBAAY,OAAO;AACnB,uBAAmB,EAAE;AAAA,EACtB;AAEA,QAAM,WAAW,WAAW,QAAQ,SAAS,GAAG,IAAI,UAAU;AAC9D,QAAM,oBAAoB,OAAO,SAAS,KAAK,iBAAiB,WAAW,OAAO;AAClF,QAAM,oBAAoB,OAAO,SAAS,KAAK,iBAAiB,WAAW,OAAO;AAElF,SACC,qBAAC,OAAI,IAAI,aAER;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,kBAAkB,CAAiB;AAAA,QACpD,eAAa;AAAA,QACb,aAAa;AAAA,QACb,QAAO;AAAA,QACP,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,IAAI,aAAa,EAAE;AAAA;AAAA,IAC7D;AAAA,IACA,oBAAC,cAAW,IAAI,iBAAiB,gBAAE;AAAA,IACnC;AAAA,MAAC;AAAA;AAAA,QACA,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,gBAAgB,CAAiB;AAAA,QAClD,eAAa;AAAA,QACb,aAAa;AAAA,SACR,YAAY,EAAE,aAAa,UAAU,IAAI,CAAC,IAL/C;AAAA,QAMA,QAAO;AAAA,QACP,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,IAAI,aAAa,EAAE;AAAA;AAAA,IAC7D;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACA,SAAS,eAAe,UAAU,YAAY;AAAA,QAC9C,SAAS,MAAM,SAAS,OAAO;AAAA,QAC/B,IAAI;AAAA,QACJ;AAAA;AAAA,IAED;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,SAAS,eAAe,SAAS,YAAY;AAAA,QAC7C,SAAS,MAAM,SAAS,MAAM;AAAA,QAC9B,IAAI;AAAA,QACJ;AAAA;AAAA,IAED;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACA,SAAS,eAAe,UAAU,YAAY;AAAA,QAC9C,SAAS,MAAM,SAAS,OAAO;AAAA,QAC/B,IAAI;AAAA,QACJ;AAAA;AAAA,IAED;AAAA,IAGA,qBAAC,eAAY,MAAK,SAAQ,IAAI,mBAC7B;AAAA,0BAAC,cAAW,IAAI,oBAAoB,oBAAM;AAAA,MAC1C;AAAA,QAAC;AAAA;AAAA,UACA,UAAQ;AAAA,UACR,OAAO;AAAA,UACP,OAAM;AAAA,UACN,UAAU,CAAC,MAAM;AAChB,kBAAM,MAAM,EAAE,OAAO;AACrB,gBAAI,IAAI,SAAS,mBAAmB,GAAG;AACtC,6BAAe,oBAAoB,CAAC,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,YAChE,OAAO;AACN,6BAAe,GAAG;AAAA,YACnB;AAAA,UACD;AAAA,UACA,aAAa,CAAC,aAAa;AAC1B,kBAAM,MAAM;AACZ,gBAAI,IAAI,WAAW,KAAK,IAAI,WAAW,OAAO,OAAQ,QAAO;AAC7D,mBAAO,GAAG,IAAI,MAAM;AAAA,UACrB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,EAAE,YAAY,EAAE,IAAI,uBAAuB,EAAE;AAAA,UAExD;AAAA,iCAAC,YAAS,OAAO,qBAChB;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACA,SAAS;AAAA,kBACT,eAAe,iBAAiB,SAAS,KAAK,CAAC;AAAA,kBAC/C,MAAK;AAAA;AAAA,cACN;AAAA,cAAE;AAAA,eAEH;AAAA,YACC,OAAO,IAAI,CAAC,MACZ,qBAAC,YAAoB,OAAO,EAAE,IAC7B;AAAA,kCAAC,YAAS,SAAS,iBAAiB,SAAS,EAAE,EAAE,GAAG,MAAK,SAAQ;AAAA,cACjE;AAAA,gBAAC;AAAA;AAAA,kBACA,QAAM;AAAA,kBACN,IAAI,EAAE,UAAU,WAAW,UAAU,IAAI;AAAA,kBACzC,OAAO,EAAE,YAAY,EAAE;AAAA,kBAEtB,YAAE,YAAY,EAAE;AAAA;AAAA,cAClB;AAAA,iBARc,EAAE,EASjB,CACA;AAAA;AAAA;AAAA,MACF;AAAA,OACD;AAAA,IAGA,qBAAC,eAAY,MAAK,SAAQ,IAAI,mBAC7B;AAAA,0BAAC,cAAW,IAAI,oBAAoB,wBAAU;AAAA,MAC9C;AAAA,QAAC;AAAA;AAAA,UACA,UAAQ;AAAA,UACR,OAAO;AAAA,UACP,OAAM;AAAA,UACN,IAAI;AAAA,UACJ,WAAW,EAAE,YAAY,EAAE,IAAI,uBAAuB,EAAE;AAAA,UACxD,UAAU,CAAC,MAAM;AAChB,kBAAM,MAAM,EAAE,OAAO;AACrB,gBAAI,IAAI,SAAS,EAAE,GAAG;AACrB,6BAAe,oBAAoB,CAAC,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,YAChE,OAAO;AACN,6BAAe,GAAG;AAAA,YACnB;AAAA,UACD;AAAA,UACA,aAAa,CAAC,aAAa;AAC1B,kBAAM,MAAM;AACZ,gBAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,gBAAI,IAAI,WAAW,OAAO,OAAQ,QAAO;AACzC,mBAAO,GAAG,IAAI,MAAM;AAAA,UACrB;AAAA,UAEA;AAAA,iCAAC,YAAS,OAAO,IAChB;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACA,SAAS,iBAAiB,WAAW,OAAO,UAAU,OAAO,SAAS;AAAA,kBACtE,MAAK;AAAA;AAAA,cACN;AAAA,cAAE;AAAA,eAEH;AAAA,YACC,OAAO,IAAI,CAAC,MACZ,qBAAC,YAAoB,OAAO,EAAE,IAC7B;AAAA,kCAAC,YAAS,SAAS,iBAAiB,SAAS,EAAE,EAAE,GAAG,MAAK,SAAQ;AAAA,cAChE,EAAE;AAAA,iBAFW,EAAE,EAGjB,CACA;AAAA;AAAA;AAAA,MACF;AAAA,OACD;AAAA,KACD;AAEF,CAAC;AASD,IAAM,iBAAiB,KAAK,SAASC,gBAAe,EAAE,OAAO,SAAS,GAAwB;AAC7F,SACC;AAAA,IAAC;AAAA;AAAA,MACA,MAAK;AAAA,MACL,aAAY;AAAA,MACZ;AAAA,MACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,MACxC,WAAW;AAAA,QACV,OAAO;AAAA,UACN,gBACC,oBAAC,kBAAe,UAAS,SACxB,8BAAC,cAAW,IAAI,EAAE,OAAO,WAAW,UAAU,GAAG,GAAG,GACrD;AAAA,UAED,cAAc,QACb,oBAAC,kBAAe,UAAS,OACxB,8BAAC,cAAW,MAAK,SAAQ,SAAS,MAAM,SAAS,EAAE,GAAG,MAAK,OAC1D,8BAAC,aAAU,IAAI,EAAE,UAAU,IAAI,OAAO,UAAU,GAAG,GACpD,GACD,IACG;AAAA,QACL;AAAA,MACD;AAAA,MACA,IAAI;AAAA;AAAA,EACL;AAEF,CAAC;AAID,IAAM,mBAAmB,KAAK,SAASC,oBAAmB;AAEzD,QAAM,CAAC,WAAW,YAAY,IAAIH,UAAuB,MAAM,EAAE,QAAQ,KAAK,CAAC;AAC/E,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAuB,MAAM,CAAC;AAC5D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAqB,OAAO;AAChE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,EAAE;AAC/C,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAmB,CAAC,CAAC;AACrE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAmB,CAAC,CAAC;AAGrE,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,CAAC;AAClC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAiB,iBAAiB;AACxE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkB,eAAe;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkB,MAAM;AAGtD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,EAAE;AACzD,QAAM,cAAc,OAAkD,MAAS;AAE/E,YAAU,MAAM;AACf,gBAAY,UAAU,WAAW,MAAM,mBAAmB,WAAW,KAAK,CAAC,GAAG,GAAG;AACjF,WAAO,MAAM;AAAE,UAAI,YAAY,QAAS,cAAa,YAAY,OAAO;AAAA,IAAG;AAAA,EAC5E,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM;AAAA,IACL;AAAA,IAAS;AAAA,IAAc;AAAA,IAAS;AAAA,IAAO;AAAA,IACvC;AAAA,IAAc;AAAA,IAAa;AAAA,EAC5B,IAAI,aAAa;AAEjB,QAAM,EAAE,QAAQ,QAAQ,UAAU,aAAa,IAAI,cAAc;AAEjE,YAAU,MAAM;AACf,iBAAa;AAAA,EACd,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,cAAcI,aAAY,CAAC,YAAqC;AACrE,UAAM,KAAK,gCAAa,MAAM;AAC9B,UAAM,KAAK,4BAAW,MAAM;AAC5B,WAAO;AAAA,MACN,YAAY,GAAG,OAAO,qBAAqB;AAAA,MAC3C,UAAU,GAAG,OAAO,qBAAqB;AAAA,MACzC,UAAU,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,MAC3D,UAAU,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,MAC3D,QAAQ,mBAAmB;AAAA,MAC3B,MAAM,UAAU;AAAA,MAChB,WAAW;AAAA,IACZ;AAAA,EACD,GAAG,CAAC,WAAW,SAAS,kBAAkB,kBAAkB,iBAAiB,WAAW,CAAC;AAEzF,YAAU,MAAM;AACf,YAAQ,CAAC;AACT,iBAAa,YAAY,CAAC,CAAC;AAAA,EAC5B,GAAG,CAAC,aAAa,YAAY,CAAC;AAE9B,QAAM,mBAAmBA;AAAA,IACxB,CAAC,IAAgD,YAAoB;AACpE,cAAQ,OAAO;AACf,mBAAa,YAAY,OAAO,CAAC;AAAA,IAClC;AAAA,IACA,CAAC,aAAa,YAAY;AAAA,EAC3B;AAEA,QAAM,0BAA0BA,aAAY,CAAC,MAA2C;AACvF,mBAAe,SAAS,EAAE,OAAO,OAAO,EAAE,CAAC;AAC3C,YAAQ,CAAC;AAAA,EACV,GAAG,CAAC,CAAC;AAEL,QAAM,aAAaA,aAAY,CAAC,QAAiB;AAChD,eAAW,CAAC,YAAY;AACvB,UAAI,YAAY,KAAK;AACpB,mBAAW,CAAC,MAAO,MAAM,QAAQ,SAAS,KAAM;AAChD,eAAO;AAAA,MACR;AACA,iBAAW,KAAK;AAChB,aAAO;AAAA,IACR,CAAC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,QAAQ,MAAM;AACnC,UAAM,OAAO,CAAC,GAAG,OAAO;AACxB,SAAK,KAAK,CAAC,GAAG,MAAM;AACnB,YAAM,MAAM,WAAW,GAAG,GAAG,OAAO;AACpC,aAAO,YAAY,QAAQ,MAAM,CAAC;AAAA,IACnC,CAAC;AACD,WAAO;AAAA,EACR,GAAG,CAAC,SAAS,SAAS,OAAO,CAAC;AAE9B,QAAM,oBAAoBA,aAAY,YAAY;AACjD,UAAM,KAAK,gCAAa,MAAM;AAC9B,UAAM,KAAK,4BAAW,MAAM;AAC5B,QAAI;AACH,YAAM,YAAY;AAAA,QACjB,YAAY,GAAG,OAAO,qBAAqB;AAAA,QAC3C,UAAU,GAAG,OAAO,qBAAqB;AAAA,QACzC,UAAU,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,QAC3D,UAAU,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,QAC3D,QAAQ,mBAAmB;AAAA,MAC5B,CAAC;AAAA,IACF,SAAS,KAAU;AAClB,gBAAS,2BAAK,YAAW,wBAAwB;AAAA,IAClD;AAAA,EACD,GAAG,CAAC,WAAW,SAAS,kBAAkB,kBAAkB,iBAAiB,aAAa,QAAQ,CAAC;AAEnG,QAAM,UAA4C;AAAA,IACjD,EAAE,IAAI,eAAe,OAAO,eAAe;AAAA,IAC3C,EAAE,IAAI,iBAAiB,OAAO,aAAa;AAAA,IAC3C,EAAE,IAAI,YAAY,OAAO,YAAY;AAAA,IACrC,EAAE,IAAI,cAAc,OAAO,SAAS;AAAA,IACpC,EAAE,IAAI,aAAa,OAAO,YAAY;AAAA,IACtC,EAAE,IAAI,aAAa,OAAO,SAAS;AAAA,IACnC,EAAE,IAAI,aAAa,OAAO,YAAY;AAAA,IACtC,EAAE,IAAI,mBAAmB,OAAO,gBAAgB;AAAA,IAChD,EAAE,IAAI,mBAAmB,OAAO,gBAAgB;AAAA,IAChD,EAAE,IAAI,sBAAsB,OAAO,mBAAmB;AAAA,IACtD,EAAE,IAAI,oBAAoB,OAAO,iBAAiB;AAAA,IAClD,EAAE,IAAI,qBAAqB,OAAO,kBAAkB;AAAA,IACpD,EAAE,IAAI,eAAe,OAAO,cAAc;AAAA,IAC1C,EAAE,IAAI,WAAW,OAAO,UAAU;AAAA,IAClC,EAAE,IAAI,kBAAkB,OAAO,cAAc;AAAA,EAC9C;AAEA,SACC,oBAAC,wBAAqB,aAAa,cAClC,+BAAC,OAAI,IAAI,iBAER;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,OAAM;AAAA,QACN,SACC,qBAAC,SAAM,WAAU,OAAM,YAAW,UAAS,SAAS,GACnD;AAAA,8BAAC,kBAAe,OAAO,YAAY,UAAU,eAAe;AAAA,UAC5D;AAAA,YAAC;AAAA;AAAA,cACA,aAAa;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,gBAAgB;AAAA,cACjB;AAAA,cACA,cAAc;AAAA,cAEd;AAAA,gBAAC;AAAA;AAAA,kBACA,WAAW,oBAAC,gBAAa,IAAI,EAAE,UAAU,qBAAqB,GAAG;AAAA,kBACjE,UAAU,CAAC,QAAQ;AAAA,kBACnB,SAAS;AAAA,kBACT,IAAI,EAAE,QAAQ,GAAG;AAAA,kBACjB;AAAA;AAAA,cAED;AAAA;AAAA,UACD;AAAA,WACD;AAAA;AAAA,IAEF;AAAA,IAEA,qBAAC,OAAI,IAAI,WAER;AAAA,2BAAC,OAAI,IAAI,gBACR;AAAA;AAAA,UAAC;AAAA;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe;AAAA,YACf,aAAa;AAAA,YACb;AAAA,YACA,oBAAoB;AAAA,YACpB;AAAA,YACA;AAAA,YACA,gBAAgB;AAAA,YAChB;AAAA,YACA;AAAA,YACA,gBAAgB;AAAA;AAAA,QACjB;AAAA,QACC,SAAS,oBAAC,SAAM,UAAS,SAAQ,IAAI,SAAU,iBAAM;AAAA,SACvD;AAAA,MAEC,WACA,oBAAC,OAAI,IAAI,cACR,8BAAC,oBAAiB,IAAI,EAAE,OAAO,OAAO,KAAK,GAAG,MAAM,IAAI,GACzD;AAAA,MAID,qBAAC,SAAM,WAAW,GAAG,IAAI,cACxB;AAAA,4BAAC,kBACA,+BAAC,SAAM,MAAK,SAAQ,IAAI,SACvB;AAAA,8BAAC,aACA,+BAAC,YACC;AAAA,oBAAQ,IAAI,CAAC,QACb,oBAAC,aAAuB,IAAI,YAC3B;AAAA,cAAC;AAAA;AAAA,gBACA,QAAQ,YAAY,IAAI;AAAA,gBACxB,WAAW,YAAY,IAAI,KAAK,UAAU;AAAA,gBAC1C,SAAS,MAAM,WAAW,IAAI,EAAE;AAAA,gBAChC,IAAI;AAAA,gBAEH,cAAI;AAAA;AAAA,YACN,KARe,IAAI,EASpB,CACA;AAAA,YACD,oBAAC,aAAU,IAAI,iCAAM,aAAN,EAA6B,UAAU,IAAI,IAAG,uBAAS;AAAA,aACvE,GACD;AAAA,UACA,oBAAC,aACC,WAAC,WAAW,cAAc,WAAW,IACrC,oBAAC,YACA;AAAA,YAAC;AAAA;AAAA,cAAU,SAAS,QAAQ,SAAS;AAAA,cAAG,OAAM;AAAA,cAC7C,IAAI,EAAE,IAAI,GAAG,OAAO,QAAQ,YAAY,MAAM,UAAU,UAAU;AAAA,cAAG;AAAA;AAAA,UAEtE,GACD,IAEA,cAAc,IAAI,CAAC,KAAK,QACvB,qBAAC,YAAmC,OAAK,MAAC,IAAI,YAC7C;AAAA,gCAAC,aAAU,IAAI,cAAe,cAAI,eAAe,IAAG;AAAA,YACpD,oBAAC,aAAU,IAAI,YACb,cAAI,gBACF,MAAM,IAAI,aAAa,EAAE,OAAO,qBAAqB,IACrD,IACJ;AAAA,YACA,oBAAC,aACC,cAAI,WACJ,oBAAC,QAAK,OAAO,IAAI,UAAU,MAAK,SAAQ,IAAI,eAAe,IAAI,QAAQ,GAAG,IACvE,MACL;AAAA,YACA,oBAAC,aACC,cAAI,aACJ,oBAAC,QAAK,OAAO,IAAI,YAAY,MAAK,SAAQ,IAAI,aAAa,IAAI,UAAU,GAAG,IACzE,MACL;AAAA,YACA,oBAAC,aAAU,IAAI,YAAa,cAAI,aAAa,IAAG;AAAA,YAChD,oBAAC,aACC,cAAI,YACJ,oBAAC,QAAK,OAAO,IAAI,WAAW,MAAK,SAAQ,IAAI,aAAa,IACvD,MACL;AAAA,YACA,oBAAC,aAAU,IAAI,YAAa,cAAI,aAAa,IAAG;AAAA,YAChD,oBAAC,aAAU,IAAI,YAAa,cAAI,mBAAmB,IAAG;AAAA,YACtD,oBAAC,aAAU,IAAI,YAAa,cAAI,mBAAmB,IAAG;AAAA,YACtD,oBAAC,aAAU,IAAI,gBAAiB,cAAI,sBAAsB,IAAG;AAAA,YAC7D,oBAAC,aAAU,IAAI,gBAAiB,cAAI,oBAAoB,IAAG;AAAA,YAC3D,oBAAC,aAAU,IAAI,gBAAiB,cAAI,qBAAqB,IAAG;AAAA,YAC5D,oBAAC,aAAU,IAAI,YAAa,cAAI,eAAe,IAAG;AAAA,YAClD,oBAAC,aAAU,IAAI,YACb,cAAI,UACJ,oBAAC,WAAQ,OAAO,IAAI,SACnB,8BAAC,UAAK,OAAO,EAAE,SAAS,gBAAgB,UAAU,KAAK,UAAU,UAAU,cAAc,YAAY,YAAY,UAAU,eAAe,SAAS,GACjJ,cAAI,SACN,GACD,IACG,IACL;AAAA,YACA,oBAAC,aACA;AAAA,cAAC;AAAA;AAAA,gBACA,OAAO,IAAI,iBAAiB,QAAQ;AAAA,gBACpC,MAAK;AAAA,gBACL,IAAI,IAAI,iBAAiB,gBAAgB;AAAA;AAAA,YAC1C,GACD;AAAA,YACA,oBAAC,aACC,cAAI,WACJ;AAAA,cAAC;AAAA;AAAA,gBACA,UAAU,IAAI;AAAA,gBACd,eAAe,IAAI;AAAA,gBACnB;AAAA;AAAA,YACD,IACG,MACL;AAAA,eAtDc,IAAI,YAAY,GAuD/B,CACA,GAEH;AAAA,WACD,GACD;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACA,WAAU;AAAA,YACV,OAAO;AAAA,YACP;AAAA,YACA,cAAc;AAAA,YACd;AAAA,YACA,oBAAoB,CAAC,GAAG,qBAAqB;AAAA,YAC7C,qBAAqB;AAAA,YACrB,IAAI;AAAA;AAAA,QACL;AAAA,SACD;AAAA,OACD;AAAA,KACD,GACD;AAEF,CAAC;AAID,IAAM,YAAsB,MAC3B,oBAAC,eACA,8BAAC,oBAAiB,GACnB;AAGD,IAAO,oBAAQ;","names":["useCallback","useState","RecordingCell","useState","FilterBar","SearchBarLocal","CdrReportContent","useCallback"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
sdkStateManager
|
|
3
|
+
} from "./chunk-YREOEULC.mjs";
|
|
4
|
+
|
|
5
|
+
// call-control-sdk/lib/hooks/useGetCallerData.ts
|
|
6
|
+
import { useState, useEffect } from "react";
|
|
7
|
+
var useGetCallerData = () => {
|
|
8
|
+
var _a, _b;
|
|
9
|
+
const sdkState = sdkStateManager.getState();
|
|
10
|
+
const { process_id, process_name, status, phone_number, agent_id, call_id, call_details } = sdkState.callData;
|
|
11
|
+
const initialCallData = {
|
|
12
|
+
phone_number,
|
|
13
|
+
status,
|
|
14
|
+
callReferenceId: call_id,
|
|
15
|
+
agent_id,
|
|
16
|
+
process_id,
|
|
17
|
+
process_name,
|
|
18
|
+
call_details,
|
|
19
|
+
auto_wrapup_time: (_b = (_a = sdkState.backendCallControls) == null ? void 0 : _a.auto_wrapup_time) != null ? _b : null,
|
|
20
|
+
socket_info: sdkState.callData
|
|
21
|
+
};
|
|
22
|
+
const [callData, setCallData] = useState(initialCallData);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
const unsubscribe = sdkStateManager.subscribe(() => {
|
|
25
|
+
var _a2, _b2;
|
|
26
|
+
const state = sdkStateManager.getState();
|
|
27
|
+
const { process_id: process_id2, process_name: process_name2, status: status2, phone_number: phone_number2, agent_id: agent_id2, call_id: call_id2, call_details: call_details2, auto_wrapup_time } = state.callData;
|
|
28
|
+
const currentCallData = {
|
|
29
|
+
phone_number: phone_number2,
|
|
30
|
+
status: status2,
|
|
31
|
+
callReferenceId: call_id2,
|
|
32
|
+
agent_id: agent_id2,
|
|
33
|
+
process_id: process_id2,
|
|
34
|
+
process_name: process_name2,
|
|
35
|
+
call_details: call_details2,
|
|
36
|
+
auto_wrapup_time: (_b2 = auto_wrapup_time != null ? auto_wrapup_time : (_a2 = state.backendCallControls) == null ? void 0 : _a2.auto_wrapup_time) != null ? _b2 : null,
|
|
37
|
+
socket_info: state.callData
|
|
38
|
+
};
|
|
39
|
+
setCallData(currentCallData);
|
|
40
|
+
});
|
|
41
|
+
return unsubscribe;
|
|
42
|
+
}, []);
|
|
43
|
+
return callData;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export {
|
|
47
|
+
useGetCallerData
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=chunk-AEDSLIHI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/hooks/useGetCallerData.ts"],"sourcesContent":["import { useState, useEffect } from \"react\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport type { CallData } from \"../../types\";\r\n\r\nexport const useGetCallerData = (): CallData => {\r\n\tconst sdkState = sdkStateManager.getState();\r\n\tconst { process_id, process_name, status, phone_number, agent_id, call_id, call_details } =\r\n\t\tsdkState.callData;\r\n\tconst initialCallData = {\r\n\t\tphone_number,\r\n\t\tstatus,\r\n\t\tcallReferenceId: call_id,\r\n\t\tagent_id,\r\n\t\tprocess_id,\r\n\t\tprocess_name,\r\n\t\tcall_details,\r\n\t\tauto_wrapup_time: sdkState.backendCallControls?.auto_wrapup_time ?? null,\r\n\t\tsocket_info: sdkState.callData,\r\n\t};\r\n\tconst [callData, setCallData] = useState<CallData>(initialCallData);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst unsubscribe = sdkStateManager.subscribe(() => {\r\n\t\t\tconst state = sdkStateManager.getState();\r\n\t\t\tconst { process_id, process_name, status, phone_number, agent_id, call_id, call_details, auto_wrapup_time } =\r\n\t\t\t\tstate.callData;\r\n\t\t\tconst currentCallData = {\r\n\t\t\t\tphone_number,\r\n\t\t\t\tstatus,\r\n\t\t\t\tcallReferenceId: call_id,\r\n\t\t\t\tagent_id,\r\n\t\t\t\tprocess_id,\r\n\t\t\t\tprocess_name,\r\n\t\t\t\tcall_details,\r\n\t\t\t\tauto_wrapup_time: auto_wrapup_time ?? state.backendCallControls?.auto_wrapup_time ?? null,\r\n\t\t\t\tsocket_info: state.callData,\r\n\t\t\t};\r\n\t\t\tsetCallData(currentCallData);\r\n\t\t});\r\n\r\n\t\treturn unsubscribe;\r\n\t}, []);\r\n\r\n\treturn callData;\r\n};\r\n"],"mappings":";;;;;AAAA,SAAS,UAAU,iBAAiB;AAI7B,IAAM,mBAAmB,MAAgB;AAJhD;AAKC,QAAM,WAAW,gBAAgB,SAAS;AAC1C,QAAM,EAAE,YAAY,cAAc,QAAQ,cAAc,UAAU,SAAS,aAAa,IACvF,SAAS;AACV,QAAM,kBAAkB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAkB,oBAAS,wBAAT,mBAA8B,qBAA9B,YAAkD;AAAA,IACpE,aAAa,SAAS;AAAA,EACvB;AACA,QAAM,CAAC,UAAU,WAAW,IAAI,SAAmB,eAAe;AAElE,YAAU,MAAM;AACf,UAAM,cAAc,gBAAgB,UAAU,MAAM;AAtBtD,UAAAA,KAAAC;AAuBG,YAAM,QAAQ,gBAAgB,SAAS;AACvC,YAAM,EAAE,YAAAC,aAAY,cAAAC,eAAc,QAAAC,SAAQ,cAAAC,eAAc,UAAAC,WAAU,SAAAC,UAAS,cAAAC,eAAc,iBAAiB,IACzG,MAAM;AACP,YAAM,kBAAkB;AAAA,QACvB,cAAAH;AAAA,QACA,QAAAD;AAAA,QACA,iBAAiBG;AAAA,QACjB,UAAAD;AAAA,QACA,YAAAJ;AAAA,QACA,cAAAC;AAAA,QACA,cAAAK;AAAA,QACA,mBAAkBP,MAAA,+CAAoBD,MAAA,MAAM,wBAAN,gBAAAA,IAA2B,qBAA/C,OAAAC,MAAmE;AAAA,QACrF,aAAa,MAAM;AAAA,MACpB;AACA,kBAAY,eAAe;AAAA,IAC5B,CAAC;AAED,WAAO;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,SAAO;AACR;","names":["_a","_b","process_id","process_name","status","phone_number","agent_id","call_id","call_details"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// call-control-sdk/lib/components/SDKButton.tsx
|
|
2
|
+
import { Button, useTheme } from "@mui/material";
|
|
3
|
+
import { alpha } from "@mui/material/styles";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
var muiVariant = {
|
|
6
|
+
primary: "contained",
|
|
7
|
+
danger: "contained",
|
|
8
|
+
cancel: "text",
|
|
9
|
+
outlined: "outlined"
|
|
10
|
+
};
|
|
11
|
+
function SDKButton({
|
|
12
|
+
children,
|
|
13
|
+
variant = "primary",
|
|
14
|
+
onClick,
|
|
15
|
+
startIcon,
|
|
16
|
+
endIcon,
|
|
17
|
+
disabled = false,
|
|
18
|
+
type = "button",
|
|
19
|
+
size = "medium",
|
|
20
|
+
fullWidth = false,
|
|
21
|
+
sx
|
|
22
|
+
}) {
|
|
23
|
+
const theme = useTheme();
|
|
24
|
+
const primary = theme.palette.primary.main;
|
|
25
|
+
const primaryDark = theme.palette.primary.dark;
|
|
26
|
+
const styles = {
|
|
27
|
+
primary: {
|
|
28
|
+
textTransform: "none",
|
|
29
|
+
fontWeight: 600,
|
|
30
|
+
backgroundColor: primary,
|
|
31
|
+
borderRadius: "30px",
|
|
32
|
+
fontSize: "0.82rem",
|
|
33
|
+
px: 2,
|
|
34
|
+
boxShadow: `0 2px 8px ${alpha(primary, 0.25)}`,
|
|
35
|
+
"&:hover": {
|
|
36
|
+
backgroundColor: primaryDark,
|
|
37
|
+
boxShadow: `0 4px 12px ${alpha(primary, 0.35)}`
|
|
38
|
+
},
|
|
39
|
+
"&.Mui-disabled": {
|
|
40
|
+
backgroundColor: alpha(primary, 0.4),
|
|
41
|
+
color: "#fff"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
danger: {
|
|
45
|
+
textTransform: "none",
|
|
46
|
+
fontWeight: 600,
|
|
47
|
+
backgroundColor: "#d32f2f",
|
|
48
|
+
borderRadius: "8px",
|
|
49
|
+
fontSize: "0.82rem",
|
|
50
|
+
px: 2,
|
|
51
|
+
"&:hover": { backgroundColor: "#b71c1c" },
|
|
52
|
+
"&.Mui-disabled": { backgroundColor: "#e57373", color: "#fff" }
|
|
53
|
+
},
|
|
54
|
+
cancel: {
|
|
55
|
+
textTransform: "none",
|
|
56
|
+
fontWeight: 600,
|
|
57
|
+
color: "#666",
|
|
58
|
+
borderRadius: "30px",
|
|
59
|
+
fontSize: "0.82rem",
|
|
60
|
+
px: 2,
|
|
61
|
+
border: "1px solid #d0d0d0",
|
|
62
|
+
"&:hover": { backgroundColor: "#f5f5f5", borderColor: "#bbb" }
|
|
63
|
+
},
|
|
64
|
+
outlined: {
|
|
65
|
+
textTransform: "none",
|
|
66
|
+
fontWeight: 600,
|
|
67
|
+
color: primary,
|
|
68
|
+
borderColor: primary,
|
|
69
|
+
borderRadius: "30px",
|
|
70
|
+
fontSize: "0.82rem",
|
|
71
|
+
px: 2,
|
|
72
|
+
"&:hover": { borderColor: primaryDark, backgroundColor: alpha(primary, 0.05) }
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
return /* @__PURE__ */ jsx(
|
|
76
|
+
Button,
|
|
77
|
+
{
|
|
78
|
+
variant: muiVariant[variant],
|
|
79
|
+
onClick,
|
|
80
|
+
startIcon,
|
|
81
|
+
endIcon,
|
|
82
|
+
disabled,
|
|
83
|
+
type,
|
|
84
|
+
size,
|
|
85
|
+
fullWidth,
|
|
86
|
+
sx: [styles[variant], ...Array.isArray(sx) ? sx : [sx]],
|
|
87
|
+
children
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export {
|
|
93
|
+
SDKButton
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=chunk-FVNDPJUU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/components/SDKButton.tsx"],"sourcesContent":["import React from \"react\";\r\nimport { Button, SxProps, Theme, useTheme } from \"@mui/material\";\r\nimport { alpha } from \"@mui/material/styles\";\r\n\r\ntype SDKButtonVariant = \"primary\" | \"danger\" | \"cancel\" | \"outlined\";\r\n\r\ninterface SDKButtonProps {\r\n\tchildren: React.ReactNode;\r\n\tvariant?: SDKButtonVariant;\r\n\tonClick?: React.MouseEventHandler<HTMLButtonElement>;\r\n\tstartIcon?: React.ReactNode;\r\n\tendIcon?: React.ReactNode;\r\n\tdisabled?: boolean;\r\n\ttype?: \"button\" | \"submit\" | \"reset\";\r\n\tsize?: \"small\" | \"medium\" | \"large\";\r\n\tfullWidth?: boolean;\r\n\tsx?: SxProps<Theme>;\r\n}\r\n\r\nconst muiVariant: Record<SDKButtonVariant, \"contained\" | \"outlined\" | \"text\"> = {\r\n\tprimary: \"contained\",\r\n\tdanger: \"contained\",\r\n\tcancel: \"text\",\r\n\toutlined: \"outlined\",\r\n};\r\n\r\nexport function SDKButton({\r\n\tchildren,\r\n\tvariant = \"primary\",\r\n\tonClick,\r\n\tstartIcon,\r\n\tendIcon,\r\n\tdisabled = false,\r\n\ttype = \"button\",\r\n\tsize = \"medium\",\r\n\tfullWidth = false,\r\n\tsx,\r\n}: SDKButtonProps) {\r\n\tconst theme = useTheme();\r\n\tconst primary = theme.palette.primary.main;\r\n\tconst primaryDark = theme.palette.primary.dark;\r\n\r\n\tconst styles: Record<SDKButtonVariant, SxProps<Theme>> = {\r\n\t\tprimary: {\r\n\t\t\ttextTransform: \"none\",\r\n\t\t\tfontWeight: 600,\r\n\t\t\tbackgroundColor: primary,\r\n\t\t\tborderRadius: \"30px\",\r\n\t\t\tfontSize: \"0.82rem\",\r\n\t\t\tpx: 2,\r\n\t\t\tboxShadow: `0 2px 8px ${alpha(primary, 0.25)}`,\r\n\t\t\t\"&:hover\": {\r\n\t\t\t\tbackgroundColor: primaryDark,\r\n\t\t\t\tboxShadow: `0 4px 12px ${alpha(primary, 0.35)}`,\r\n\t\t\t},\r\n\t\t\t\"&.Mui-disabled\": {\r\n\t\t\t\tbackgroundColor: alpha(primary, 0.4),\r\n\t\t\t\tcolor: \"#fff\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tdanger: {\r\n\t\t\ttextTransform: \"none\",\r\n\t\t\tfontWeight: 600,\r\n\t\t\tbackgroundColor: \"#d32f2f\",\r\n\t\t\tborderRadius: \"8px\",\r\n\t\t\tfontSize: \"0.82rem\",\r\n\t\t\tpx: 2,\r\n\t\t\t\"&:hover\": { backgroundColor: \"#b71c1c\" },\r\n\t\t\t\"&.Mui-disabled\": { backgroundColor: \"#e57373\", color: \"#fff\" },\r\n\t\t},\r\n\t\tcancel: {\r\n\t\t\ttextTransform: \"none\",\r\n\t\t\tfontWeight: 600,\r\n\t\t\tcolor: \"#666\",\r\n\t\t\tborderRadius: \"30px\",\r\n\t\t\tfontSize: \"0.82rem\",\r\n\t\t\tpx: 2,\r\n\t\t\tborder: \"1px solid #d0d0d0\",\r\n\t\t\t\"&:hover\": { backgroundColor: \"#f5f5f5\", borderColor: \"#bbb\" },\r\n\t\t},\r\n\t\toutlined: {\r\n\t\t\ttextTransform: \"none\",\r\n\t\t\tfontWeight: 600,\r\n\t\t\tcolor: primary,\r\n\t\t\tborderColor: primary,\r\n\t\t\tborderRadius: \"30px\",\r\n\t\t\tfontSize: \"0.82rem\",\r\n\t\t\tpx: 2,\r\n\t\t\t\"&:hover\": { borderColor: primaryDark, backgroundColor: alpha(primary, 0.05) },\r\n\t\t},\r\n\t};\r\n\r\n\treturn (\r\n\t\t<Button\r\n\t\t\tvariant={muiVariant[variant]}\r\n\t\t\tonClick={onClick}\r\n\t\t\tstartIcon={startIcon}\r\n\t\t\tendIcon={endIcon}\r\n\t\t\tdisabled={disabled}\r\n\t\t\ttype={type}\r\n\t\t\tsize={size}\r\n\t\t\tfullWidth={fullWidth}\r\n\t\t\tsx={[styles[variant], ...(Array.isArray(sx) ? sx : [sx])]}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</Button>\r\n\t);\r\n}\r\n"],"mappings":";AACA,SAAS,QAAwB,gBAAgB;AACjD,SAAS,aAAa;AA2FpB;AA1EF,IAAM,aAA0E;AAAA,EAC/E,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AACX;AAEO,SAAS,UAAU;AAAA,EACzB;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AACD,GAAmB;AAClB,QAAM,QAAQ,SAAS;AACvB,QAAM,UAAU,MAAM,QAAQ,QAAQ;AACtC,QAAM,cAAc,MAAM,QAAQ,QAAQ;AAE1C,QAAM,SAAmD;AAAA,IACxD,SAAS;AAAA,MACR,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,WAAW,aAAa,MAAM,SAAS,IAAI,CAAC;AAAA,MAC5C,WAAW;AAAA,QACV,iBAAiB;AAAA,QACjB,WAAW,cAAc,MAAM,SAAS,IAAI,CAAC;AAAA,MAC9C;AAAA,MACA,kBAAkB;AAAA,QACjB,iBAAiB,MAAM,SAAS,GAAG;AAAA,QACnC,OAAO;AAAA,MACR;AAAA,IACD;AAAA,IACA,QAAQ;AAAA,MACP,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,WAAW,EAAE,iBAAiB,UAAU;AAAA,MACxC,kBAAkB,EAAE,iBAAiB,WAAW,OAAO,OAAO;AAAA,IAC/D;AAAA,IACA,QAAQ;AAAA,MACP,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,WAAW,EAAE,iBAAiB,WAAW,aAAa,OAAO;AAAA,IAC9D;AAAA,IACA,UAAU;AAAA,MACT,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,cAAc;AAAA,MACd,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,WAAW,EAAE,aAAa,aAAa,iBAAiB,MAAM,SAAS,IAAI,EAAE;AAAA,IAC9E;AAAA,EACD;AAEA,SACC;AAAA,IAAC;AAAA;AAAA,MACA,SAAS,WAAW,OAAO;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,CAAC,OAAO,OAAO,GAAG,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,CAAC,EAAE,CAAE;AAAA,MAEvD;AAAA;AAAA,EACF;AAEF;","names":[]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import {
|
|
2
|
+
sdkStateManager
|
|
3
|
+
} from "./chunk-YREOEULC.mjs";
|
|
4
|
+
|
|
5
|
+
// call-control-sdk/lib/hooks/useSDKPermissions.ts
|
|
6
|
+
import { useState, useEffect, useCallback } from "react";
|
|
7
|
+
function useSDKPermissions() {
|
|
8
|
+
var _a, _b;
|
|
9
|
+
const [state, setState] = useState(() => sdkStateManager.getState());
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
const unsubscribe = sdkStateManager.subscribe(() => {
|
|
12
|
+
setState(sdkStateManager.getState());
|
|
13
|
+
});
|
|
14
|
+
return unsubscribe;
|
|
15
|
+
}, []);
|
|
16
|
+
const hasPermission = useCallback(
|
|
17
|
+
(permission) => sdkStateManager.hasPermission(permission),
|
|
18
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
19
|
+
[state.userPermissions]
|
|
20
|
+
);
|
|
21
|
+
const hasAnyPermission = useCallback(
|
|
22
|
+
(permissions) => sdkStateManager.hasAnyPermission(permissions),
|
|
23
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
24
|
+
[state.userPermissions]
|
|
25
|
+
);
|
|
26
|
+
const hasAllPermissions = useCallback(
|
|
27
|
+
(permissions) => sdkStateManager.hasAllPermissions(permissions),
|
|
28
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
29
|
+
[state.userPermissions]
|
|
30
|
+
);
|
|
31
|
+
const hasMenuFeature = useCallback(
|
|
32
|
+
(code) => sdkStateManager.hasMenuFeature(code),
|
|
33
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
34
|
+
[state.menuEntitlements]
|
|
35
|
+
);
|
|
36
|
+
return {
|
|
37
|
+
permissions: (_a = state.userPermissions) != null ? _a : [],
|
|
38
|
+
menuEntitlements: (_b = state.menuEntitlements) != null ? _b : [],
|
|
39
|
+
isLoaded: state.isPermissionsLoaded,
|
|
40
|
+
hasPermission,
|
|
41
|
+
hasAnyPermission,
|
|
42
|
+
hasAllPermissions,
|
|
43
|
+
hasMenuFeature
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// call-control-sdk/lib/components/SDKAccessDenied.tsx
|
|
48
|
+
import { Box, Typography } from "@mui/material";
|
|
49
|
+
import LockOutlinedIcon from "@mui/icons-material/LockOutlined";
|
|
50
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
51
|
+
var SDKAccessDenied = ({
|
|
52
|
+
message = "You don't have permission to view this page."
|
|
53
|
+
}) => /* @__PURE__ */ jsxs(
|
|
54
|
+
Box,
|
|
55
|
+
{
|
|
56
|
+
sx: {
|
|
57
|
+
display: "flex",
|
|
58
|
+
flexDirection: "column",
|
|
59
|
+
alignItems: "center",
|
|
60
|
+
justifyContent: "center",
|
|
61
|
+
minHeight: 300,
|
|
62
|
+
gap: 2,
|
|
63
|
+
p: 4
|
|
64
|
+
},
|
|
65
|
+
children: [
|
|
66
|
+
/* @__PURE__ */ jsx(LockOutlinedIcon, { sx: { fontSize: 56, color: "text.disabled" } }),
|
|
67
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", fontWeight: 600, color: "text.secondary", children: "Access Denied" }),
|
|
68
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.disabled", sx: { textAlign: "center" }, children: message })
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
// call-control-sdk/lib/components/SDKPermissionGuard.tsx
|
|
74
|
+
import { Fragment, jsx as jsx2 } from "react/jsx-runtime";
|
|
75
|
+
var SDKPermissionGuard = ({
|
|
76
|
+
children,
|
|
77
|
+
permission,
|
|
78
|
+
permissions,
|
|
79
|
+
requireAll = false,
|
|
80
|
+
menuFeature,
|
|
81
|
+
requireAllMenus = false,
|
|
82
|
+
fallback,
|
|
83
|
+
showFallback = true,
|
|
84
|
+
onDenied
|
|
85
|
+
}) => {
|
|
86
|
+
const { isLoaded, hasPermission, hasAnyPermission, hasAllPermissions, hasMenuFeature } = useSDKPermissions();
|
|
87
|
+
if (!isLoaded) return null;
|
|
88
|
+
const isAllowed = checkAccess({
|
|
89
|
+
permission,
|
|
90
|
+
permissions,
|
|
91
|
+
requireAll,
|
|
92
|
+
menuFeature,
|
|
93
|
+
requireAllMenus,
|
|
94
|
+
hasPermission,
|
|
95
|
+
hasAnyPermission,
|
|
96
|
+
hasAllPermissions,
|
|
97
|
+
hasMenuFeature
|
|
98
|
+
});
|
|
99
|
+
if (!isAllowed) {
|
|
100
|
+
onDenied == null ? void 0 : onDenied();
|
|
101
|
+
if (fallback !== void 0) return /* @__PURE__ */ jsx2(Fragment, { children: fallback });
|
|
102
|
+
if (showFallback) return /* @__PURE__ */ jsx2(SDKAccessDenied, {});
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
return /* @__PURE__ */ jsx2(Fragment, { children });
|
|
106
|
+
};
|
|
107
|
+
function checkAccess({
|
|
108
|
+
permission,
|
|
109
|
+
permissions,
|
|
110
|
+
requireAll,
|
|
111
|
+
menuFeature,
|
|
112
|
+
requireAllMenus,
|
|
113
|
+
hasPermission,
|
|
114
|
+
hasAnyPermission,
|
|
115
|
+
hasAllPermissions,
|
|
116
|
+
hasMenuFeature
|
|
117
|
+
}) {
|
|
118
|
+
const menuCodes = menuFeature ? Array.isArray(menuFeature) ? menuFeature : [menuFeature] : [];
|
|
119
|
+
const hasNoGuards = !permission && (!permissions || permissions.length === 0) && menuCodes.length === 0;
|
|
120
|
+
if (hasNoGuards) return true;
|
|
121
|
+
if (menuCodes.length > 0) {
|
|
122
|
+
const menuGranted = requireAllMenus ? menuCodes.every((c) => hasMenuFeature(c)) : menuCodes.some((c) => hasMenuFeature(c));
|
|
123
|
+
if (!menuGranted) return false;
|
|
124
|
+
}
|
|
125
|
+
if (permission && !hasPermission(permission)) return false;
|
|
126
|
+
if (permissions && permissions.length > 0) {
|
|
127
|
+
const granted = requireAll ? hasAllPermissions(permissions) : hasAnyPermission(permissions);
|
|
128
|
+
if (!granted) return false;
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export {
|
|
134
|
+
useSDKPermissions,
|
|
135
|
+
SDKAccessDenied,
|
|
136
|
+
SDKPermissionGuard
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=chunk-I4CJTHZR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/hooks/useSDKPermissions.ts","../call-control-sdk/lib/components/SDKAccessDenied.tsx","../call-control-sdk/lib/components/SDKPermissionGuard.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\n\r\nexport interface SDKPermissionsHook {\r\n permissions: string[];\r\n menuEntitlements: Array<{ code: string; name: string; enabled: boolean }>;\r\n isLoaded: boolean;\r\n hasPermission: (permission: string) => boolean;\r\n hasAnyPermission: (permissions: string[]) => boolean;\r\n hasAllPermissions: (permissions: string[]) => boolean;\r\n hasMenuFeature: (code: string) => boolean;\r\n}\r\n\r\nexport function useSDKPermissions(): SDKPermissionsHook {\r\n const [state, setState] = useState(() => sdkStateManager.getState());\r\n\r\n useEffect(() => {\r\n const unsubscribe = sdkStateManager.subscribe(() => {\r\n setState(sdkStateManager.getState());\r\n });\r\n return unsubscribe;\r\n }, []);\r\n\r\n const hasPermission = useCallback(\r\n (permission: string) => sdkStateManager.hasPermission(permission),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.userPermissions],\r\n );\r\n\r\n const hasAnyPermission = useCallback(\r\n (permissions: string[]) => sdkStateManager.hasAnyPermission(permissions),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.userPermissions],\r\n );\r\n\r\n const hasAllPermissions = useCallback(\r\n (permissions: string[]) => sdkStateManager.hasAllPermissions(permissions),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.userPermissions],\r\n );\r\n\r\n const hasMenuFeature = useCallback(\r\n (code: string) => sdkStateManager.hasMenuFeature(code),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.menuEntitlements],\r\n );\r\n\r\n return {\r\n permissions: state.userPermissions ?? [],\r\n menuEntitlements: state.menuEntitlements ?? [],\r\n isLoaded: state.isPermissionsLoaded,\r\n hasPermission,\r\n hasAnyPermission,\r\n hasAllPermissions,\r\n hasMenuFeature,\r\n };\r\n}\r\n","import React from \"react\";\r\nimport { Box, Typography } from \"@mui/material\";\r\nimport LockOutlinedIcon from \"@mui/icons-material/LockOutlined\";\r\n\r\ninterface SDKAccessDeniedProps {\r\n message?: string;\r\n}\r\n\r\nexport const SDKAccessDenied: React.FC<SDKAccessDeniedProps> = ({\r\n message = \"You don't have permission to view this page.\",\r\n}) => (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n minHeight: 300,\r\n gap: 2,\r\n p: 4,\r\n }}\r\n >\r\n <LockOutlinedIcon sx={{ fontSize: 56, color: \"text.disabled\" }} />\r\n <Typography variant=\"h6\" fontWeight={600} color=\"text.secondary\">\r\n Access Denied\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.disabled\" sx={{ textAlign: \"center\" }}>\r\n {message}\r\n </Typography>\r\n </Box>\r\n);\r\n","import React from \"react\";\r\nimport { useSDKPermissions } from \"../hooks/useSDKPermissions\";\r\nimport { SDKAccessDenied } from \"./SDKAccessDenied\";\r\n\r\ninterface SDKPermissionGuardProps {\r\n children?: React.ReactNode;\r\n /** Single permission code (e.g. \"calls:inbound\") */\r\n permission?: string;\r\n /** Multiple permission codes — ANY match grants access by default */\r\n permissions?: string[];\r\n /** When true, ALL permissions must be granted */\r\n requireAll?: boolean;\r\n /** One or more menu feature codes — ANY match grants access by default */\r\n menuFeature?: string | string[];\r\n /** When true, ALL menu features must be enabled */\r\n requireAllMenus?: boolean;\r\n /** Custom fallback rendered when access is denied */\r\n fallback?: React.ReactNode;\r\n /** Show the default Access Denied UI when denied. Defaults to true. */\r\n showFallback?: boolean;\r\n /** Callback fired when the guard denies access */\r\n onDenied?: () => void;\r\n}\r\n\r\nexport const SDKPermissionGuard: React.FC<SDKPermissionGuardProps> = ({\r\n children,\r\n permission,\r\n permissions,\r\n requireAll = false,\r\n menuFeature,\r\n requireAllMenus = false,\r\n fallback,\r\n showFallback = true,\r\n onDenied,\r\n}) => {\r\n const { isLoaded, hasPermission, hasAnyPermission, hasAllPermissions, hasMenuFeature } =\r\n useSDKPermissions();\r\n\r\n if (!isLoaded) return null;\r\n\r\n const isAllowed = checkAccess({\r\n permission,\r\n permissions,\r\n requireAll,\r\n menuFeature,\r\n requireAllMenus,\r\n hasPermission,\r\n hasAnyPermission,\r\n hasAllPermissions,\r\n hasMenuFeature,\r\n });\r\n\r\n if (!isAllowed) {\r\n onDenied?.();\r\n if (fallback !== undefined) return <>{fallback}</>;\r\n if (showFallback) return <SDKAccessDenied />;\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n\r\nfunction checkAccess({\r\n permission,\r\n permissions,\r\n requireAll,\r\n menuFeature,\r\n requireAllMenus,\r\n hasPermission,\r\n hasAnyPermission,\r\n hasAllPermissions,\r\n hasMenuFeature,\r\n}: {\r\n permission?: string;\r\n permissions?: string[];\r\n requireAll: boolean;\r\n menuFeature?: string | string[];\r\n requireAllMenus: boolean;\r\n hasPermission: (p: string) => boolean;\r\n hasAnyPermission: (p: string[]) => boolean;\r\n hasAllPermissions: (p: string[]) => boolean;\r\n hasMenuFeature: (c: string) => boolean;\r\n}): boolean {\r\n const menuCodes = menuFeature\r\n ? Array.isArray(menuFeature) ? menuFeature : [menuFeature]\r\n : [];\r\n\r\n const hasNoGuards =\r\n !permission &&\r\n (!permissions || permissions.length === 0) &&\r\n menuCodes.length === 0;\r\n\r\n if (hasNoGuards) return true;\r\n\r\n if (menuCodes.length > 0) {\r\n const menuGranted = requireAllMenus\r\n ? menuCodes.every((c) => hasMenuFeature(c))\r\n : menuCodes.some((c) => hasMenuFeature(c));\r\n if (!menuGranted) return false;\r\n }\r\n\r\n if (permission && !hasPermission(permission)) return false;\r\n\r\n if (permissions && permissions.length > 0) {\r\n const granted = requireAll ? hasAllPermissions(permissions) : hasAnyPermission(permissions);\r\n if (!granted) return false;\r\n }\r\n\r\n return true;\r\n}\r\n"],"mappings":"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","names":["jsx"]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// call-control-sdk/lib/components/SDKPageHeader.tsx
|
|
2
|
+
import { Box, IconButton, Typography } from "@mui/material";
|
|
3
|
+
import ArrowBackIcon from "@mui/icons-material/ArrowBack";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
function SDKPageHeader({
|
|
6
|
+
title,
|
|
7
|
+
subtitle,
|
|
8
|
+
avatar,
|
|
9
|
+
showBack = false,
|
|
10
|
+
onBack,
|
|
11
|
+
actions,
|
|
12
|
+
count,
|
|
13
|
+
countLabel = "items"
|
|
14
|
+
}) {
|
|
15
|
+
return /* @__PURE__ */ jsx(Box, { sx: { px: { xs: 2, md: 2.5 }, py: "14px" }, children: /* @__PURE__ */ jsxs(
|
|
16
|
+
Box,
|
|
17
|
+
{
|
|
18
|
+
sx: {
|
|
19
|
+
display: "flex",
|
|
20
|
+
alignItems: { xs: "flex-start", sm: "center" },
|
|
21
|
+
justifyContent: "space-between",
|
|
22
|
+
flexDirection: { xs: "column", sm: "row" },
|
|
23
|
+
gap: 1
|
|
24
|
+
},
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1.25, minWidth: 0 }, children: [
|
|
27
|
+
showBack && /* @__PURE__ */ jsx(
|
|
28
|
+
IconButton,
|
|
29
|
+
{
|
|
30
|
+
onClick: onBack,
|
|
31
|
+
size: "small",
|
|
32
|
+
sx: {
|
|
33
|
+
width: 30,
|
|
34
|
+
height: 30,
|
|
35
|
+
flexShrink: 0,
|
|
36
|
+
border: "none",
|
|
37
|
+
borderRadius: "6px",
|
|
38
|
+
backgroundColor: "action.hover",
|
|
39
|
+
color: "text.secondary",
|
|
40
|
+
"&:hover": { backgroundColor: "action.selected", color: "text.primary" },
|
|
41
|
+
transition: "all 0.15s ease"
|
|
42
|
+
},
|
|
43
|
+
children: /* @__PURE__ */ jsx(ArrowBackIcon, { sx: { fontSize: 15 } })
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
avatar,
|
|
47
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
48
|
+
/* @__PURE__ */ jsx(
|
|
49
|
+
Typography,
|
|
50
|
+
{
|
|
51
|
+
sx: {
|
|
52
|
+
fontWeight: 700,
|
|
53
|
+
fontSize: { xs: "1.25rem", sm: "1.5rem", lg: "1.75rem" },
|
|
54
|
+
color: "text.primary",
|
|
55
|
+
lineHeight: 1.3,
|
|
56
|
+
whiteSpace: "nowrap",
|
|
57
|
+
overflow: "hidden",
|
|
58
|
+
textOverflow: "ellipsis",
|
|
59
|
+
pl: !showBack ? 0 : 2
|
|
60
|
+
},
|
|
61
|
+
children: title
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
subtitle && /* @__PURE__ */ jsx(
|
|
65
|
+
Typography,
|
|
66
|
+
{
|
|
67
|
+
sx: {
|
|
68
|
+
fontSize: "0.78rem",
|
|
69
|
+
color: "text.secondary",
|
|
70
|
+
pl: !showBack ? 0 : 2,
|
|
71
|
+
mt: 0.2,
|
|
72
|
+
lineHeight: 1.4
|
|
73
|
+
},
|
|
74
|
+
children: subtitle
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
] })
|
|
78
|
+
] }),
|
|
79
|
+
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1, flexShrink: 0 }, children: [
|
|
80
|
+
count !== void 0 && /* @__PURE__ */ jsxs(
|
|
81
|
+
Box,
|
|
82
|
+
{
|
|
83
|
+
sx: {
|
|
84
|
+
display: "flex",
|
|
85
|
+
alignItems: "center",
|
|
86
|
+
gap: "5px",
|
|
87
|
+
px: "10px",
|
|
88
|
+
height: 32,
|
|
89
|
+
border: "1px solid",
|
|
90
|
+
borderColor: "divider",
|
|
91
|
+
borderRadius: "6px",
|
|
92
|
+
backgroundColor: "background.paper",
|
|
93
|
+
whiteSpace: "nowrap"
|
|
94
|
+
},
|
|
95
|
+
children: [
|
|
96
|
+
/* @__PURE__ */ jsx(Box, { sx: { width: 6, height: 6, borderRadius: "50%", backgroundColor: "#1A5F6C", flexShrink: 0 } }),
|
|
97
|
+
/* @__PURE__ */ jsxs(Typography, { sx: { fontSize: "0.75rem", color: "text.secondary" }, children: [
|
|
98
|
+
count,
|
|
99
|
+
" ",
|
|
100
|
+
countLabel
|
|
101
|
+
] })
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
actions
|
|
106
|
+
] })
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
) });
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export {
|
|
113
|
+
SDKPageHeader
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=chunk-RZZQ42MG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/components/SDKPageHeader.tsx"],"sourcesContent":["import React from \"react\";\r\nimport { Box, IconButton, Typography } from \"@mui/material\";\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\n\r\ninterface SDKPageHeaderProps {\r\n\ttitle: string;\r\n\tsubtitle?: React.ReactNode;\r\n\tavatar?: React.ReactNode;\r\n\tshowBack?: boolean;\r\n\tonBack?: () => void;\r\n\tactions?: React.ReactNode;\r\n\tcount?: number;\r\n\tcountLabel?: string;\r\n}\r\n\r\nexport function SDKPageHeader({\r\n\ttitle,\r\n\tsubtitle,\r\n\tavatar,\r\n\tshowBack = false,\r\n\tonBack,\r\n\tactions,\r\n\tcount,\r\n\tcountLabel = \"items\",\r\n}: SDKPageHeaderProps) {\r\n\treturn (\r\n\t\t<Box sx={{ px: { xs: 2, md: 2.5 }, py: \"14px\" }}>\r\n\t\t\t<Box\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\talignItems: { xs: \"flex-start\", sm: \"center\" },\r\n\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\tflexDirection: { xs: \"column\", sm: \"row\" },\r\n\t\t\t\t\tgap: 1,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t{/* Left: back + avatar + title */}\r\n\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1.25, minWidth: 0 }}>\r\n\t\t\t\t\t{showBack && (\r\n\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\tonClick={onBack}\r\n\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\twidth: 30, height: 30, flexShrink: 0,\r\n\t\t\t\t\t\t\t\tborder: \"none\", borderRadius: \"6px\",\r\n\t\t\t\t\t\t\t\tbackgroundColor: \"action.hover\", color: \"text.secondary\",\r\n\t\t\t\t\t\t\t\t\"&:hover\": { backgroundColor: \"action.selected\", color: \"text.primary\" },\r\n\t\t\t\t\t\t\t\ttransition: \"all 0.15s ease\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<ArrowBackIcon sx={{ fontSize: 15 }} />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t{avatar}\r\n\r\n\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\tfontWeight: 700,\r\n\t\t\t\t\t\t\t\tfontSize: { xs: \"1.25rem\", sm: \"1.5rem\", lg: \"1.75rem\" },\r\n\t\t\t\t\t\t\t\tcolor: \"text.primary\",\r\n\t\t\t\t\t\t\t\tlineHeight: 1.3,\r\n\t\t\t\t\t\t\t\twhiteSpace: \"nowrap\",\r\n\t\t\t\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\r\n\t\t\t\t\t\t\t\tpl: !showBack ? 0 : 2,\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{title}\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t{subtitle && (\r\n\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tfontSize: \"0.78rem\",\r\n\t\t\t\t\t\t\t\t\tcolor: \"text.secondary\",\r\n\t\t\t\t\t\t\t\t\tpl: !showBack ? 0 : 2,\r\n\t\t\t\t\t\t\t\t\tmt: 0.2,\r\n\t\t\t\t\t\t\t\t\tlineHeight: 1.4,\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{subtitle}\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Box>\r\n\r\n\t\t\t\t{/* Right: count chip + actions */}\r\n\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, flexShrink: 0 }}>\r\n\t\t\t\t\t{count !== undefined && (\r\n\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\tdisplay: \"flex\", alignItems: \"center\", gap: \"5px\",\r\n\t\t\t\t\t\t\t\tpx: \"10px\", height: 32,\r\n\t\t\t\t\t\t\t\tborder: \"1px solid\", borderColor: \"divider\",\r\n\t\t\t\t\t\t\t\tborderRadius: \"6px\", backgroundColor: \"background.paper\",\r\n\t\t\t\t\t\t\t\twhiteSpace: \"nowrap\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<Box sx={{ width: 6, height: 6, borderRadius: \"50%\", backgroundColor: \"#1A5F6C\", flexShrink: 0 }} />\r\n\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\" }}>\r\n\t\t\t\t\t\t\t\t{count} {countLabel}\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{actions}\r\n\t\t\t\t</Box>\r\n\t\t\t</Box>\r\n\t\t</Box>\r\n\t);\r\n}\r\n"],"mappings":";AACA,SAAS,KAAK,YAAY,kBAAkB;AAC5C,OAAO,mBAAmB;AAgDnB,cAMF,YANE;AAnCA,SAAS,cAAc;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACd,GAAuB;AACtB,SACC,oBAAC,OAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,OAAO,GAC7C;AAAA,IAAC;AAAA;AAAA,MACA,IAAI;AAAA,QACH,SAAS;AAAA,QACT,YAAY,EAAE,IAAI,cAAc,IAAI,SAAS;AAAA,QAC7C,gBAAgB;AAAA,QAChB,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,QACzC,KAAK;AAAA,MACN;AAAA,MAGA;AAAA,6BAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,UAAU,EAAE,GACvE;AAAA,sBACA;AAAA,YAAC;AAAA;AAAA,cACA,SAAS;AAAA,cACT,MAAK;AAAA,cACL,IAAI;AAAA,gBACH,OAAO;AAAA,gBAAI,QAAQ;AAAA,gBAAI,YAAY;AAAA,gBACnC,QAAQ;AAAA,gBAAQ,cAAc;AAAA,gBAC9B,iBAAiB;AAAA,gBAAgB,OAAO;AAAA,gBACxC,WAAW,EAAE,iBAAiB,mBAAmB,OAAO,eAAe;AAAA,gBACvE,YAAY;AAAA,cACb;AAAA,cAEA,8BAAC,iBAAc,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,UACtC;AAAA,UAGA;AAAA,UAED,qBAAC,OACA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACA,IAAI;AAAA,kBACH,YAAY;AAAA,kBACZ,UAAU,EAAE,IAAI,WAAW,IAAI,UAAU,IAAI,UAAU;AAAA,kBACvD,OAAO;AAAA,kBACP,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,cAAc;AAAA,kBACd,IAAI,CAAC,WAAW,IAAI;AAAA,gBACrB;AAAA,gBAEC;AAAA;AAAA,YACF;AAAA,YACC,YACA;AAAA,cAAC;AAAA;AAAA,gBACA,IAAI;AAAA,kBACH,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,IAAI,CAAC,WAAW,IAAI;AAAA,kBACpB,IAAI;AAAA,kBACJ,YAAY;AAAA,gBACb;AAAA,gBAEC;AAAA;AAAA,YACF;AAAA,aAEF;AAAA,WACD;AAAA,QAGA,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,YAAY,EAAE,GACtE;AAAA,oBAAU,UACV;AAAA,YAAC;AAAA;AAAA,cACA,IAAI;AAAA,gBACH,SAAS;AAAA,gBAAQ,YAAY;AAAA,gBAAU,KAAK;AAAA,gBAC5C,IAAI;AAAA,gBAAQ,QAAQ;AAAA,gBACpB,QAAQ;AAAA,gBAAa,aAAa;AAAA,gBAClC,cAAc;AAAA,gBAAO,iBAAiB;AAAA,gBACtC,YAAY;AAAA,cACb;AAAA,cAEA;AAAA,oCAAC,OAAI,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,OAAO,iBAAiB,WAAW,YAAY,EAAE,GAAG;AAAA,gBAClG,qBAAC,cAAW,IAAI,EAAE,UAAU,WAAW,OAAO,iBAAiB,GAC7D;AAAA;AAAA,kBAAM;AAAA,kBAAE;AAAA,mBACV;AAAA;AAAA;AAAA,UACD;AAAA,UAEA;AAAA,WACF;AAAA;AAAA;AAAA,EACD,GACD;AAEF;","names":[]}
|