chordia-ui 3.7.2 → 3.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/CustomFilterChips.cjs.js +1 -1
  2. package/dist/CustomFilterChips.cjs.js.map +1 -1
  3. package/dist/CustomFilterChips.es.js +239 -125
  4. package/dist/CustomFilterChips.es.js.map +1 -1
  5. package/dist/DataTable2.cjs.js +2 -0
  6. package/dist/DataTable2.cjs.js.map +1 -0
  7. package/dist/DataTable2.es.js +1863 -0
  8. package/dist/DataTable2.es.js.map +1 -0
  9. package/dist/components/UpdatedInteractionDetails.cjs.js +2 -2
  10. package/dist/components/UpdatedInteractionDetails.cjs.js.map +1 -1
  11. package/dist/components/UpdatedInteractionDetails.es.js +14 -13
  12. package/dist/components/UpdatedInteractionDetails.es.js.map +1 -1
  13. package/dist/components/data.cjs.js +1 -1
  14. package/dist/components/data.cjs.js.map +1 -1
  15. package/dist/components/data.es.js +157 -153
  16. package/dist/components/data.es.js.map +1 -1
  17. package/dist/components/performance.cjs.js +1 -1
  18. package/dist/components/performance.cjs.js.map +1 -1
  19. package/dist/components/performance.es.js +1900 -480
  20. package/dist/components/performance.es.js.map +1 -1
  21. package/dist/index.cjs.js +1 -1
  22. package/dist/index.es.js +94 -89
  23. package/dist/index.es.js.map +1 -1
  24. package/package.json +1 -1
  25. package/src/components/UpdatedInteractionDetails/UpdatedInteractionDetails.jsx +13 -13
  26. package/src/components/UpdatedInteractionDetails/UpdatedThreads.jsx +1 -0
  27. package/src/components/common/CustomFilterChips.jsx +5 -1
  28. package/src/components/common/Pagination.jsx +152 -39
  29. package/src/components/data/DataTable2.jsx +2449 -0
  30. package/src/components/data/DataTableFilters2.jsx +186 -0
  31. package/src/components/data/index.js +2 -0
  32. package/src/components/index.js +2 -2
  33. package/src/components/performance/PerformanceDetailsPage.jsx +940 -0
  34. package/src/components/performance/PerformancePanel.jsx +423 -297
  35. package/src/components/performance/SupervisorSelect.jsx +386 -0
  36. package/src/components/performance/index.js +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable2.cjs.js","sources":["../src/components/data/DataTableFilters.jsx","../src/components/data/DataTable2.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useEffect, useRef, Suspense } from \"react\";\nimport { Download, ChevronDown, CalendarClock, CalendarDays } from \"lucide-react\";\nimport { createPortal } from \"react-dom\";\nimport { CustomFilterChips } from \"../common\";\n\n/**\n * DataTableFilters Component\n * Displays filter buttons (Week to Date, Select Date Range, Export) and filter chips\n * \n * @param {Object} props\n * @param {React.ReactNode} props.dateRangePicker - DateRangePicker component (wrapped in Suspense)\n * @param {Function} props.onWeekToDate - Handler for \"Week to Date\" button\n * @param {Object} props.exportConfig - Export configuration\n * @param {boolean} props.exportConfig.isExporting - Whether export is in progress\n * @param {Function} props.exportConfig.onExport - Export handler (type) => void\n * @param {Array} props.exportConfig.types - Export types array (default: ['csv'])\n * @param {Object} props.filterChipsConfig - Filter chips configuration\n * @param {Object} props.filterChipsConfig.filters - Current filter values\n * @param {Function} props.filterChipsConfig.onChange - Filter chips change handler\n * @param {Function} props.filterChipsConfig.onClear - Clear all filters handler\n * @param {Array} props.filterChipsConfig.customFilters - Custom filter chips (e.g., date range)\n */\nexport default function DataTableFilters({\n dateRangePicker,\n onWeekToDate,\n exportConfig,\n filterChipsConfig,\n trailingActions, // Optional extra actions rendered after Export (e.g., Add Users button)\n}) {\n const [showExportMenu, setShowExportMenu] = useState(false);\n const exportButtonRef = useRef(null);\n const exportMenuRef = useRef(null);\n\n // Handle click outside to close export menu\n useEffect(() => {\n const handleClickOutside = (event) => {\n if (\n exportMenuRef.current &&\n !exportMenuRef.current.contains(event.target) &&\n exportButtonRef.current &&\n !exportButtonRef.current.contains(event.target)\n ) {\n setShowExportMenu(false);\n }\n };\n\n if (showExportMenu) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [showExportMenu]);\n\n const openExportMenu = () => {\n setShowExportMenu((prev) => !prev);\n };\n\n const handleExport = (type) => {\n setShowExportMenu(false);\n if (exportConfig?.onExport) {\n exportConfig.onExport(type);\n }\n };\n\n // Check if there are any filter chips to display\n const hasFilterChips = () => {\n if (!filterChipsConfig?.filters) return false;\n \n const filters = filterChipsConfig.filters;\n const customFilters = filterChipsConfig.customFilters || [];\n \n // Check if any regular filters have values\n const hasRegularFilters = Object.entries(filters).some(([key, value]) => {\n if (Array.isArray(value) && value.length) return true;\n if (typeof value === \"string\" && value.trim() !== \"\") return true;\n if (value && typeof value === \"object\" && (value.min != null || value.max != null)) return true;\n return false;\n });\n \n // Check if any custom filters are active\n const hasCustomFilters = customFilters.some(filterObj => filterObj.active);\n \n return hasRegularFilters || hasCustomFilters;\n };\n\n const shouldShowChips = hasFilterChips();\n\n return (\n <div className=\"flex items-center gap-3 flex-wrap\">\n {/* Week to Date Button */}\n {onWeekToDate && (\n <button\n onClick={onWeekToDate}\n className=\"inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white/80 px-4 py-2.5 transition-colors hover:bg-white text-sm font-medium text-gray-900\"\n style={{ fontFamily: 'var(--font-sans)' }}\n >\n <CalendarClock size={16} />\n <span>Week to Date</span>\n </button>\n )}\n\n {/* Select Date Range */}\n {dateRangePicker && (\n <Suspense\n fallback={\n <div className=\"inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white/80 px-4 py-2.5 text-sm font-medium text-gray-400\">\n <CalendarClock size={16} />\n <span>Loading...</span>\n </div>\n }\n >\n {dateRangePicker}\n </Suspense>\n )}\n\n {/* Export Button */}\n {exportConfig && (\n <div className=\"relative\">\n <button\n ref={exportButtonRef}\n onClick={openExportMenu}\n disabled={exportConfig.isExporting}\n className=\"inline-flex items-center justify-between gap-2 rounded-lg border border-gray-300 bg-white/80 px-4 py-2.5 transition-colors hover:bg-white text-sm font-medium text-gray-900 disabled:opacity-50 disabled:cursor-not-allowed min-w-[120px]\"\n style={{ fontFamily: 'var(--font-sans)' }}\n >\n <div className=\"flex items-center gap-2\">\n <Download size={16} />\n <span>{exportConfig.isExporting ? \"Exporting...\" : \"Export\"}</span>\n </div>\n <ChevronDown size={16} />\n </button>\n {showExportMenu && (\n <div\n ref={exportMenuRef}\n className=\"absolute top-full right-0 mt-2 bg-white rounded-lg shadow-lg border border-gray-200 py-1 z-50 min-w-[120px]\"\n >\n {(exportConfig.types || [\"csv\"]).map((type) => (\n <button\n key={type}\n onClick={() => handleExport(type)}\n className=\"w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-50 transition-colors\"\n style={{ fontFamily: 'var(--font-sans)' }}\n >\n Export {type.toUpperCase()}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Filter chips + optional trailing actions (e.g., Add Users / Add Agent) */}\n {(shouldShowChips || trailingActions) && (\n <>\n {/* Vertical line only when there are actual chips; this avoids double lines\n when we only show trailingActions (like Add Agent) with no chips. */}\n {shouldShowChips && (\n <div className=\"h-9 mt-1 w-px bg-gray-300 flex-shrink-0\"></div>\n )}\n\n {/* Filter Chips + trailing actions */}\n <div className=\"flex items-center gap-3 justify-end\">\n {shouldShowChips && filterChipsConfig && (\n <CustomFilterChips\n filters={filterChipsConfig.filters}\n onChange={filterChipsConfig.onChange}\n onClear={filterChipsConfig.onClear}\n customFilters={filterChipsConfig.customFilters || []}\n fieldOptions={filterChipsConfig.fieldOptions || {}}\n />\n )}\n {trailingActions && (\n <div className=\"flex-shrink-0\">\n {trailingActions}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\n","\"use client\";\n\nimport React, { useState, useMemo, useRef, useEffect, useCallback } from \"react\";\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragOverlay,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n horizontalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { GripVertical, ChevronUp, ChevronDown, ListFilter, ArrowUp, ArrowDown, Settings2, Search, Check, X, ArrowUpDown } from \"lucide-react\";\nimport { createPortal } from \"react-dom\";\nimport Pagination from \"../common/Pagination.jsx\";\n// TODO: surface column limit errors via callback prop (onMaxColumnsError)\n// TODO: replace with framework-agnostic component\nfunction OpenCloseArrow({ isOpen, iconSize }) { return null; }\n// TODO: replace with framework-agnostic component\nfunction Separator() { return <div style={{ height: 1, background: \"rgba(52,58,64,0.08)\" }} />; }\n\n// ─── Typed-filter helpers ──────────────────────────────────────────────────\nfunction parseNumberLike(s) {\n if (s === null || s === undefined) return NaN;\n const cleaned = String(s).replace(/[,$%]|pp/gi, \"\").trim();\n const n = parseFloat(cleaned);\n return Number.isFinite(n) ? n : NaN;\n}\n\nfunction parseDurationToSeconds(s) {\n if (s === null || s === undefined) return NaN;\n const str = String(s).trim();\n // HH:MM:SS or MM:SS\n const colon = str.match(/^(\\d+):(\\d+)(?::(\\d+))?$/);\n if (colon) {\n const a = +colon[1], b = +colon[2], c = colon[3] != null ? +colon[3] : null;\n return c != null ? a * 3600 + b * 60 + c : a * 60 + b;\n }\n // 1d 2h 3m 4s\n let total = 0;\n let matched = false;\n const dM = str.match(/(\\d+)\\s*d\\b/i);\n const hM = str.match(/(\\d+)\\s*h\\b/i);\n const mM = str.match(/(\\d+)\\s*m(?!s)\\b/i);\n const sM = str.match(/(\\d+)\\s*s\\b/i);\n if (dM) { total += +dM[1] * 86400; matched = true; }\n if (hM) { total += +hM[1] * 3600; matched = true; }\n if (mM) { total += +mM[1] * 60; matched = true; }\n if (sM) { total += +sM[1]; matched = true; }\n return matched ? total : NaN;\n}\n\nfunction parseDateLike(s) {\n if (!s) return null;\n const str = String(s).trim();\n // MM/DD/YYYY or M/D/YY\n const slash = str.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{2,4})$/);\n if (slash) {\n const yyyy = slash[3].length === 2 ? 2000 + +slash[3] : +slash[3];\n const d = new Date(yyyy, +slash[1] - 1, +slash[2]);\n return isNaN(d.getTime()) ? null : d;\n }\n const d = new Date(str);\n return isNaN(d.getTime()) ? null : d;\n}\n\nfunction detectFilterType(values) {\n if (!values || values.length === 0) return \"text\";\n const sample = values.slice(0, 25);\n const allMatch = (test) => sample.every(test);\n if (allMatch((v) => /^\\d{1,2}\\/\\d{1,2}\\/\\d{2,4}$/.test(v) || /^\\d{4}-\\d{2}-\\d{2}/.test(v))) return \"date\";\n if (allMatch((v) => /^\\d+\\s*[dhms]\\b/i.test(v) || /^\\d+:\\d+(:\\d+)?$/.test(v))) return \"duration\";\n if (allMatch((v) => /^-?[\\d,.]+(%|pp)?$/i.test(v))) return \"number\";\n return \"text\";\n}\n\nfunction isFilterActive(filter) {\n if (!filter) return false;\n if (Array.isArray(filter)) return filter.length > 0;\n if (filter.type === \"range\") return filter.min !== \"\" && filter.min !== undefined && filter.min !== null\n || filter.max !== \"\" && filter.max !== undefined && filter.max !== null;\n if (filter.type === \"durationRange\") return (filter.minSec !== \"\" && filter.minSec != null) || (filter.maxSec !== \"\" && filter.maxSec != null);\n if (filter.type === \"dateRange\") return Boolean(filter.from || filter.to);\n return false;\n}\n\nfunction secondsToHMS(sec) {\n if (sec == null || sec === \"\" || isNaN(sec)) return \"\";\n const n = Number(sec);\n const h = Math.floor(n / 3600);\n const m = Math.floor((n % 3600) / 60);\n const s = Math.floor(n % 60);\n if (h > 0) return `${h}h ${m}m`;\n if (m > 0) return `${m}m ${s}s`;\n return `${s}s`;\n}\n\nfunction chipSummary(filter) {\n if (!filter) return \"\";\n if (Array.isArray(filter)) return filter.length === 0 ? \"\" : String(filter[0]);\n if (filter.type === \"range\") {\n const lo = filter.min !== \"\" && filter.min != null ? filter.min : null;\n const hi = filter.max !== \"\" && filter.max != null ? filter.max : null;\n if (lo != null && hi != null) return `${lo} – ${hi}`;\n if (lo != null) return `≥ ${lo}`;\n if (hi != null) return `≤ ${hi}`;\n return \"\";\n }\n if (filter.type === \"durationRange\") {\n const lo = filter.minSec !== \"\" && filter.minSec != null ? secondsToHMS(filter.minSec) : null;\n const hi = filter.maxSec !== \"\" && filter.maxSec != null ? secondsToHMS(filter.maxSec) : null;\n if (lo && hi) return `${lo} – ${hi}`;\n if (lo) return `≥ ${lo}`;\n if (hi) return `≤ ${hi}`;\n return \"\";\n }\n if (filter.type === \"dateRange\") {\n if (filter.from && filter.to) return `${filter.from} – ${filter.to}`;\n if (filter.from) return `from ${filter.from}`;\n if (filter.to) return `to ${filter.to}`;\n return \"\";\n }\n return \"\";\n}\n\nfunction chipExtraCount(filter) {\n if (Array.isArray(filter)) return Math.max(0, filter.length - 1);\n return 0;\n}\n\nfunction chipExtraValues(filter) {\n if (Array.isArray(filter)) return filter.slice(1).map(String).join(\", \");\n return \"\";\n}\n\nfunction ExtraValuesBadge({ count, values }) {\n const [hover, setHover] = useState(false);\n return (\n <span\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 22,\n minWidth: 22,\n padding: \"0 6px\",\n background: \"#D8D8D8\",\n color: \"#0B0B0B\",\n borderRadius: 14,\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1,\n cursor: \"pointer\",\n }}\n >\n +{count}\n {hover && (\n <span\n role=\"tooltip\"\n style={{\n position: \"absolute\",\n bottom: \"calc(100% + 6px)\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"#1E2125\",\n color: \"#FFFFFF\",\n fontFamily: \"var(--font-sans)\",\n fontSize: 12,\n fontWeight: 400,\n lineHeight: \"20px\",\n padding: \"6px 10px\",\n borderRadius: 8,\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n zIndex: 100,\n boxShadow: \"0 6px 16px rgba(11, 11, 11, 0.18)\",\n }}\n >\n {values}\n </span>\n )}\n </span>\n );\n}\n\nfunction RangeInputs({ leftLabel, rightLabel, leftValue, rightValue, onLeftChange, onRightChange, type = \"number\", placeholderLeft = \"Min\", placeholderRight = \"Max\" }) {\n const fieldStyle = {\n width: \"100%\",\n height: 32,\n borderRadius: 8,\n border: \"1px solid #D9D9D9\",\n background: \"#FFFFFF\",\n padding: \"0 10px\",\n fontFamily: \"var(--font-sans)\",\n fontSize: 14,\n color: \"#0B0B0B\",\n outline: \"none\",\n boxSizing: \"border-box\",\n };\n const labelStyle = { fontSize: 12, color: \"#676767\", marginBottom: 4, fontFamily: \"var(--font-sans)\" };\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n <span style={labelStyle}>{leftLabel}</span>\n <input\n type={type}\n value={leftValue}\n onChange={(e) => onLeftChange(e.target.value)}\n placeholder={placeholderLeft}\n style={fieldStyle}\n />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n <span style={labelStyle}>{rightLabel}</span>\n <input\n type={type}\n value={rightValue}\n onChange={(e) => onRightChange(e.target.value)}\n placeholder={placeholderRight}\n style={fieldStyle}\n />\n </div>\n </div>\n );\n}\n\nfunction FilterValuePicker({ column, columnId, filterType = \"text\", position, popoverRef, distinctValues, initialValue, onApply, onCancel }) {\n const isText = filterType === \"text\";\n const isNumber = filterType === \"number\";\n const isDate = filterType === \"date\";\n const isDuration = filterType === \"duration\";\n\n // ── State per filterType ────────────────────────────────────────────\n const [staged, setStaged] = useState(() =>\n isText ? new Set(Array.isArray(initialValue) ? initialValue : []) : new Set()\n );\n const [query, setQuery] = useState(\"\");\n const [rangeMin, setRangeMin] = useState(() => (isNumber && initialValue?.type === \"range\" && initialValue.min != null ? initialValue.min : \"\"));\n const [rangeMax, setRangeMax] = useState(() => (isNumber && initialValue?.type === \"range\" && initialValue.max != null ? initialValue.max : \"\"));\n const [durMin, setDurMin] = useState(() => (isDuration && initialValue?.type === \"durationRange\" && initialValue.minSec != null ? initialValue.minSec : \"\"));\n const [durMax, setDurMax] = useState(() => (isDuration && initialValue?.type === \"durationRange\" && initialValue.maxSec != null ? initialValue.maxSec : \"\"));\n const [dateFrom, setDateFrom] = useState(() => (isDate && initialValue?.type === \"dateRange\" ? initialValue.from || \"\" : \"\"));\n const [dateTo, setDateTo] = useState(() => (isDate && initialValue?.type === \"dateRange\" ? initialValue.to || \"\" : \"\"));\n\n useEffect(() => {\n if (isText) setStaged(new Set(Array.isArray(initialValue) ? initialValue : []));\n }, [columnId, isText]);\n\n const filteredValues = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return distinctValues;\n return distinctValues.filter((v) => String(v).toLowerCase().includes(q));\n }, [distinctValues, query]);\n\n const toggle = (value) => {\n setStaged((prev) => {\n const next = new Set(prev);\n if (next.has(value)) next.delete(value); else next.add(value);\n return next;\n });\n };\n\n const reset = () => {\n if (isText) setStaged(new Set());\n if (isNumber) { setRangeMin(\"\"); setRangeMax(\"\"); }\n if (isDuration) { setDurMin(\"\"); setDurMax(\"\"); }\n if (isDate) { setDateFrom(\"\"); setDateTo(\"\"); }\n setQuery(\"\");\n };\n\n const apply = () => {\n if (isText) return onApply(Array.from(staged));\n if (isNumber) return onApply({ type: \"range\", min: rangeMin === \"\" ? \"\" : Number(rangeMin), max: rangeMax === \"\" ? \"\" : Number(rangeMax) });\n if (isDuration) return onApply({ type: \"durationRange\", minSec: durMin === \"\" ? \"\" : Number(durMin), maxSec: durMax === \"\" ? \"\" : Number(durMax) });\n if (isDate) return onApply({ type: \"dateRange\", from: dateFrom, to: dateTo });\n };\n\n return (\n <div\n ref={popoverRef}\n role=\"dialog\"\n aria-label={`Filter ${column.label || columnId}`}\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n zIndex: 50,\n width: isText ? 240 : 280,\n background: \"#FFFFFF\",\n border: \"1px solid #E6E6E6\",\n borderRadius: 10,\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 10,\n boxShadow: \"0 8px 24px rgba(11, 11, 11, 0.10)\",\n fontFamily: \"var(--font-sans)\",\n }}\n >\n {isText && (\n <>\n <div\n style={{\n background: \"#D8D8D8\",\n height: 32,\n borderRadius: 10,\n padding: 1,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <div\n style={{\n background: \"#FFFFFF\",\n flex: 1,\n height: 30,\n borderRadius: 10,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"0 8px\",\n }}\n >\n <Search size={16} color=\"#989898\" strokeWidth={2} />\n <input\n autoFocus\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search\"\n style={{\n flex: 1,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontSize: 14,\n color: \"#0B0B0B\",\n minWidth: 0,\n fontFamily: \"var(--font-sans)\",\n }}\n />\n </div>\n </div>\n\n <div style={{ maxHeight: 220, overflowY: \"auto\", display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {filteredValues.length === 0 ? (\n <div style={{ fontSize: 13, color: \"#676767\", padding: \"8px 4px\", textAlign: \"center\" }}>\n No values\n </div>\n ) : (\n filteredValues.map((value) => {\n const checked = staged.has(value);\n return (\n <label\n key={value}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"6px 4px\",\n cursor: \"pointer\",\n borderRadius: 6,\n }}\n >\n <span\n style={{\n width: 20,\n height: 20,\n borderRadius: 4,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: checked ? \"#0B0B0B\" : \"#FFFFFF\",\n border: `1px solid ${checked ? \"#0B0B0B\" : \"#676767\"}`,\n flexShrink: 0,\n }}\n >\n {checked && <Check size={14} color=\"#FFFFFF\" strokeWidth={3} />}\n </span>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => toggle(value)}\n style={{ position: \"absolute\", opacity: 0, pointerEvents: \"none\" }}\n tabIndex={-1}\n />\n <span\n onClick={(e) => { e.preventDefault(); toggle(value); }}\n style={{\n fontSize: 14,\n lineHeight: \"20px\",\n color: \"#0B0B0B\",\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {value}\n </span>\n </label>\n );\n })\n )}\n </div>\n </>\n )}\n\n {isNumber && (\n <RangeInputs\n leftLabel=\"Min\"\n rightLabel=\"Max\"\n leftValue={rangeMin}\n rightValue={rangeMax}\n onLeftChange={setRangeMin}\n onRightChange={setRangeMax}\n type=\"number\"\n />\n )}\n\n {isDuration && (\n <>\n <div style={{ fontSize: 12, color: \"#676767\" }}>Duration in seconds</div>\n <RangeInputs\n leftLabel=\"Min (sec)\"\n rightLabel=\"Max (sec)\"\n leftValue={durMin}\n rightValue={durMax}\n onLeftChange={setDurMin}\n onRightChange={setDurMax}\n type=\"number\"\n placeholderLeft=\"0\"\n placeholderRight=\"3600\"\n />\n </>\n )}\n\n {isDate && (\n <RangeInputs\n leftLabel=\"From\"\n rightLabel=\"To\"\n leftValue={dateFrom}\n rightValue={dateTo}\n onLeftChange={setDateFrom}\n onRightChange={setDateTo}\n type=\"date\"\n placeholderLeft=\"\"\n placeholderRight=\"\"\n />\n )}\n\n <div style={{ height: 1, background: \"#D9D9D9\", margin: \"0 -12px\" }} />\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" }}>\n <button\n type=\"button\"\n onClick={reset}\n style={{\n background: \"transparent\",\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n fontSize: 14,\n fontWeight: 500,\n color: \"#323232\",\n fontFamily: \"var(--font-sans)\",\n }}\n >\n Reset\n </button>\n <button\n type=\"button\"\n onClick={apply}\n style={{\n background: \"#0B0B0B\",\n color: \"#FFFFFF\",\n border: \"none\",\n borderRadius: 10,\n height: 28,\n padding: \"0 14px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"var(--font-sans)\",\n }}\n >\n Apply\n </button>\n </div>\n </div>\n );\n}\nfunction ResizeColumnsIcon({ size = 10, color = \"currentColor\" }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ display: \"block\" }}\n aria-hidden=\"true\"\n >\n <path d=\"M3.5 8H12.5\" stroke={color} strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <path d=\"M5 6.5L3.5 8L5 9.5\" stroke={color} strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M11 6.5L12.5 8L11 9.5\" stroke={color} strokeWidth=\"1.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M6.8 3V13\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <path d=\"M9.2 3V13\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n// TODO: replace with framework-agnostic context\nconst useUserContext = () => ({ userData: { email: \"anonymous\" } });\n// TODO: replace with framework-agnostic image\nconst Image = (props) => <img {...props} />;\nimport DataTableFilters from \"./DataTableFilters\";\n// TODO: replace with framework-agnostic tooltip\nfunction HoverBalloon({\n children,\n content,\n direction = \"top\",\n align = \"center\",\n styling,\n indicatorColor,\n}) {\n const tooltipText =\n typeof content === \"string\" ? content : content != null ? String(content) : \"\";\n const resolvedArrowColor =\n typeof indicatorColor === \"string\" &&\n (indicatorColor.startsWith(\"#\") ||\n indicatorColor.startsWith(\"rgb\") ||\n indicatorColor.startsWith(\"hsl\") ||\n indicatorColor.startsWith(\"var(\"))\n ? indicatorColor\n : \"var(--Grey-Strong, #2E3236)\";\n const [isVisible, setIsVisible] = useState(false);\n const [mounted, setMounted] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0, arrowLeft: 0, placement: \"top\" });\n const triggerRef = useRef(null);\n const tooltipRef = useRef(null);\n\n if (!tooltipText) return children;\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const updatePosition = useCallback(() => {\n if (!triggerRef.current || !tooltipRef.current || typeof window === \"undefined\") return;\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const viewportPadding = 8;\n const gap = 10;\n const tooltipWidth = tooltipRect.width;\n const tooltipHeight = tooltipRect.height;\n\n const spaceAbove = triggerRect.top;\n const spaceBelow = viewportHeight - triggerRect.bottom;\n const preferredPlacement = direction === \"bottom\" ? \"bottom\" : \"top\";\n\n let placement = preferredPlacement;\n if (preferredPlacement === \"top\" && spaceAbove < tooltipHeight + gap + viewportPadding && spaceBelow > spaceAbove) {\n placement = \"bottom\";\n } else if (preferredPlacement === \"bottom\" && spaceBelow < tooltipHeight + gap + viewportPadding && spaceAbove > spaceBelow) {\n placement = \"top\";\n }\n\n let anchorX = triggerRect.left + triggerRect.width / 2;\n if (align === \"start\") anchorX = triggerRect.left;\n if (align === \"end\") anchorX = triggerRect.right;\n\n let top = placement === \"top\"\n ? triggerRect.top - tooltipHeight - gap\n : triggerRect.bottom + gap;\n let left = align === \"start\"\n ? anchorX\n : align === \"end\"\n ? anchorX - tooltipWidth\n : anchorX - tooltipWidth / 2;\n\n top = Math.max(viewportPadding, Math.min(top, viewportHeight - tooltipHeight - viewportPadding));\n left = Math.max(viewportPadding, Math.min(left, viewportWidth - tooltipWidth - viewportPadding));\n\n const arrowLeft = Math.max(10, Math.min(anchorX - left, tooltipWidth - 10));\n setPosition({ top, left, arrowLeft, placement });\n }, [align, direction]);\n\n useEffect(() => {\n if (!isVisible || !mounted) return;\n\n updatePosition();\n\n const handleReposition = () => updatePosition();\n window.addEventListener(\"resize\", handleReposition);\n window.addEventListener(\"scroll\", handleReposition, true);\n\n return () => {\n window.removeEventListener(\"resize\", handleReposition);\n window.removeEventListener(\"scroll\", handleReposition, true);\n };\n }, [isVisible, mounted, updatePosition]);\n\n return (\n <span\n ref={triggerRef}\n style={{ display: \"block\", width: \"100%\" }}\n onMouseEnter={() => setIsVisible(true)}\n onMouseLeave={() => setIsVisible(false)}\n >\n {children}\n {isVisible && mounted && createPortal(\n <span\n ref={tooltipRef}\n style={{\n position: \"fixed\",\n top: `${position.top}px`,\n left: `${position.left}px`,\n background: \"var(--Grey-Strong, #2E3236)\",\n color: \"var(--Grey-White, #FFF)\",\n fontSize: \"12px\",\n lineHeight: 1.3,\n fontWeight: 500,\n padding: \"8px 10px\",\n borderRadius: \"6px\",\n whiteSpace: \"normal\",\n maxWidth: \"320px\",\n width: \"max-content\",\n boxShadow: \"0 6px 18px rgba(0, 0, 0, 0.2)\",\n zIndex: 99999,\n pointerEvents: \"none\",\n ...(typeof styling === \"object\" ? styling : {}),\n }}\n >\n {tooltipText}\n <span\n style={{\n position: \"absolute\",\n left: `${position.arrowLeft}px`,\n transform: \"translateX(-50%)\",\n width: 0,\n height: 0,\n borderLeft: \"6px solid transparent\",\n borderRight: \"6px solid transparent\",\n ...(position.placement === \"top\"\n ? {\n top: \"100%\",\n borderTop: `7px solid ${resolvedArrowColor}`,\n }\n : {\n bottom: \"100%\",\n borderBottom: `7px solid ${resolvedArrowColor}`,\n }),\n }}\n />\n </span>,\n document.body\n )}\n </span>\n );\n}\n\n/**\n * DataTable Component\n * Interactive table with column reordering, filtering, sorting, sticky headers, and pagination\n * Follows \"No Judgment\" principle - scores and counts displayed uniformly\n */\nexport default function DataTable2({\n data = [], \n columns = [], \n initialPageSize = 10, \n onRowClick,\n // Server-side pagination props (optional)\n totalCount = null, // Total count from server (null = use client-side pagination)\n page: controlledPage = null, // Controlled page (null = use internal state)\n pageSize: controlledPageSize = null, // Controlled pageSize (null = use internal state)\n onPageChange = null, // Callback for page changes (null = use internal state)\n onPageSizeChange = null, // Callback for pageSize changes (null = use internal state)\n onFilterChange = null, // Callback for filter changes (null = use client-side filtering)\n columnFilters = null, // Controlled inline header filters (columnId -> value). Used to rehydrate inputs in server-side filtering mode.\n // Optional callback to surface column limit errors to host app\n onMaxColumnsError = null,\n // Server-side sorting props (optional)\n onSort = null, // Callback for sort changes (null = use client-side sorting)\n sortFields = [], // Array of [field, direction] tuples from parent (null = use internal state)\n tableId = null, // Optional unique identifier for localStorage persistence (e.g., \"history\", \"agents\")\n isLoading = false, // Loading state to show overlay inside table\n // Filter props (optional)\n filtersConfig = null, // Top toolbar filter config (chips/date/export). Note: this is different from `columnFilters` for inline header inputs.\n // Column resize (optional) — min/max in px; columns may override with column.minWidth / column.maxWidth\n columnResizeMinWidth = 100,\n columnResizeMaxWidth = 280,\n}) {\n // Get user email for user-specific storage\n const { userData } = useUserContext();\n const userId = userData?.email || 'anonymous';\n\n // Component to show tooltip only when text is actually truncated\n const TruncatedCell = React.memo(({ children, content, className = \"\" }) => {\n const textRef = useRef(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useEffect(() => {\n const checkTruncation = () => {\n if (textRef.current) {\n const isOverflowing = textRef.current.scrollWidth > textRef.current.clientWidth;\n setIsTruncated(isOverflowing);\n }\n };\n\n checkTruncation();\n const timeoutId = setTimeout(checkTruncation, 0);\n\n window.addEventListener('resize', checkTruncation);\n return () => {\n clearTimeout(timeoutId);\n window.removeEventListener('resize', checkTruncation);\n };\n }, [children, content]);\n\n const textElement = (\n <span className={`truncate block ${className}`} ref={textRef}>\n {children}\n </span>\n );\n\n if (isTruncated && content) {\n return (\n <HoverBalloon\n content={content}\n styling=\"bg-green-2 text-gray-900 px-3 py-2 text-sm rounded-lg shadow-md border border-gray-300 max-w-xs whitespace-normal\"\n indicatorColor=\"bg-green-2\"\n direction=\"top\"\n >\n {textElement}\n </HoverBalloon>\n );\n }\n\n return textElement;\n });\n TruncatedCell.displayName = 'TruncatedCell';\n\n // Use controlled pagination if props provided, otherwise use internal state\n const isServerSidePagination = totalCount !== null && onPageChange !== null;\n // Use server-side filtering if onFilterChange is provided\n const isServerSideFiltering = onFilterChange !== null;\n // Use server-side sorting if onSort is provided\n const isServerSideSorting = onSort !== null;\n const [internalPage, setInternalPage] = useState(1);\n const [internalPageSize, setInternalPageSize] = useState(initialPageSize);\n \n const page = controlledPage !== null ? controlledPage : internalPage;\n const pageSize = controlledPageSize !== null ? controlledPageSize : internalPageSize;\n \n const setPage = (newPage) => {\n if (onPageChange) {\n onPageChange(newPage);\n } else {\n setInternalPage(newPage);\n }\n };\n \n const setPageSize = (newSize) => {\n if (onPageSizeChange) {\n onPageSizeChange(newSize);\n } else {\n setInternalPageSize(newSize);\n }\n };\n \n const MAX_COLUMNS = 50;\n \n const ACTION_COLUMN_ID = 'action';\n\n // Refs for localStorage persistence\n const userHasManuallyChangedColumns = useRef(false);\n \n // Generate unique storage key for this table (includes userId)\n const storageKey = useMemo(() => {\n if (tableId) {\n return `dataTable_columns_${tableId}:${userId}`;\n }\n // Fallback: use column keys to create unique identifier\n const columnKeys = columns.map(col => (col.id || col.key)).sort().join('_');\n return `dataTable_columns_${columnKeys}:${userId}`;\n }, [tableId, columns, userId]);\n \n const manualChangeFlagKey = useMemo(() => {\n if (tableId) {\n return `dataTable_manual_change_${tableId}:${userId}`;\n }\n return null;\n }, [tableId, userId]);\n\n // Load saved column visibility from localStorage\n const loadSavedColumns = useCallback((key, cols) => {\n if (typeof window === 'undefined' || !key || !cols || cols.length === 0) return null;\n try {\n const saved = localStorage.getItem(key);\n if (saved) {\n const savedColumns = JSON.parse(saved);\n // Validate that saved columns still exist in current columns\n const validColumns = savedColumns.filter(colId => \n cols.some(col => (col.id || col.key) === colId)\n );\n if (validColumns.length > 0) {\n return validColumns;\n }\n }\n } catch (error) {\n console.warn('Failed to load saved columns from localStorage:', error);\n }\n return null;\n }, []);\n \n // filters: { [columnId]: string[] } — array of selected values per column\n const [filters, setFilters] = useState({});\n // Free-text global search applied to all visible string-cells\n const [globalQuery, setGlobalQuery] = useState(\"\");\n // Which column header has its filter popover open (columnId or null)\n const [openFilterColumnId, setOpenFilterColumnId] = useState(null);\n const [filterPopoverPosition, setFilterPopoverPosition] = useState({ top: 0, left: 0 });\n const filterPopoverRef = useRef(null);\n const filterIconRefs = useRef({});\n // Internal sorting state (only used for client-side sorting)\n const [internalSortField, setInternalSortField] = useState(null);\n const [internalSortDirection, setInternalSortDirection] = useState(\"asc\");\n\n const setColumnFilter = useCallback((columnId, value) => {\n const active = isFilterActive(value);\n setFilters((prev) => {\n const next = { ...prev };\n if (!active) delete next[columnId];\n else next[columnId] = value;\n return next;\n });\n if (onPageChange) onPageChange(1); else setInternalPage(1);\n if (isServerSideFiltering && onFilterChange) {\n onFilterChange(\n active\n ? { ...filters, [columnId]: value }\n : Object.fromEntries(Object.entries(filters).filter(([k]) => k !== columnId))\n );\n }\n }, [filters, onFilterChange, isServerSideFiltering, onPageChange]);\n\n const clearAllFilters = useCallback(() => {\n setFilters({});\n setGlobalQuery(\"\");\n if (onPageChange) onPageChange(1); else setInternalPage(1);\n if (isServerSideFiltering && onFilterChange) onFilterChange({});\n }, [onFilterChange, isServerSideFiltering, onPageChange]);\n\n const getDistinctValuesForColumn = useCallback((columnId) => {\n if (!data || data.length === 0) return [];\n const seen = new Set();\n const out = [];\n for (const row of data) {\n const v = row[columnId];\n if (v === null || v === undefined) continue;\n const s = typeof v === \"object\" ? JSON.stringify(v) : String(v);\n if (!seen.has(s)) {\n seen.add(s);\n out.push(s);\n }\n }\n return out.sort((a, b) => a.localeCompare(b));\n }, [data]);\n\n const getColumnFilterType = useCallback((columnId) => {\n const col = columns.find((c) => getColumnId(c) === columnId);\n if (col && col.filterType) return col.filterType;\n return detectFilterType(getDistinctValuesForColumn(columnId));\n }, [columns, getDistinctValuesForColumn]);\n\n const openFilterPopoverFor = useCallback((columnId, anchorEl) => {\n if (!anchorEl) {\n setOpenFilterColumnId(columnId);\n return;\n }\n const rect = anchorEl.getBoundingClientRect();\n setFilterPopoverPosition({ top: rect.bottom + 6, left: rect.left });\n setOpenFilterColumnId((prev) => (prev === columnId ? null : columnId));\n }, []);\n\n // Outside click closes filter popover\n useEffect(() => {\n if (!openFilterColumnId) return;\n const onMouseDown = (e) => {\n if (filterPopoverRef.current && filterPopoverRef.current.contains(e.target)) return;\n const anchor = filterIconRefs.current[openFilterColumnId];\n if (anchor && anchor.contains(e.target)) return;\n setOpenFilterColumnId(null);\n };\n document.addEventListener(\"mousedown\", onMouseDown);\n return () => document.removeEventListener(\"mousedown\", onMouseDown);\n }, [openFilterColumnId]);\n \n // Normalize inline filters by removing empty/null values.\n // Example usage (server-side mode):\n // <DataTable onFilterChange={handleFilterChange} columnFilters={dataTableFilters} />\n const normalizeColumnFilters = useCallback((incomingFilters) => {\n if (!incomingFilters || typeof incomingFilters !== \"object\") return {};\n return Object.fromEntries(\n Object.entries(incomingFilters).filter(([, value]) => {\n if (value === null || value === undefined) return false;\n if (typeof value === \"string\") return value.trim() !== \"\";\n return true; // allow numbers/booleans\n })\n );\n }, []);\n\n const areFiltersEqual = useCallback((a, b) => {\n const aKeys = Object.keys(a || {});\n const bKeys = Object.keys(b || {});\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => a[key] === b[key]);\n }, []);\n\n // Sync internal inline filter input UI from controlled prop in server-side mode.\n // This does not trigger onFilterChange and therefore does not create callback loops.\n useEffect(() => {\n if (!isServerSideFiltering || columnFilters === null) return;\n const normalizedFilters = normalizeColumnFilters(columnFilters);\n setFilters((prev) => (areFiltersEqual(prev, normalizedFilters) ? prev : normalizedFilters));\n }, [isServerSideFiltering, columnFilters, normalizeColumnFilters, areFiltersEqual]);\n \n // Get current sort state (from props if server-side, otherwise from internal state)\n // For server-side sorting, we need to map the sortField back to the column key\n // because History.js's handleSort maps some keys (e.g., \"evaluation.csat_score\" -> \"csat_score\")\n // but we need to compare against the original column key\n const getSortFieldForComparison = useCallback((sortFieldFromProps, columnId) => {\n // Reverse mapping: if sortField is \"csat_score\", it should match column \"evaluation.csat_score\"\n if (sortFieldFromProps === \"csat_score\" && columnId === \"evaluation.csat_score\") {\n return columnId;\n }\n // For other fields, use as-is (they should match)\n return sortFieldFromProps;\n }, []);\n \n const sortField = isServerSideSorting && sortFields.length > 0 ? sortFields[0][0] : internalSortField;\n const sortDirection = isServerSideSorting && sortFields.length > 0 ? sortFields[0][1] : internalSortDirection;\n // Support both 'id' and 'key' for column identifiers\n const [columnOrder, setColumnOrder] = useState(() => \n columns.map((col) => col.id || col.key)\n );\n const enforceActionPosition = useCallback((cols) => {\n if (!cols || cols.length === 0) return cols;\n\n // De-duplicate and enforce max column limit first\n let result = Array.from(new Set(cols));\n if (result.length > MAX_COLUMNS) {\n result = result.slice(0, MAX_COLUMNS);\n }\n\n const allColumnIds = columns.map((col) => col.id || col.key);\n const tableHasActionColumn = allColumnIds.includes(ACTION_COLUMN_ID);\n const hasAction = result.includes(ACTION_COLUMN_ID);\n\n // If the table defines an action column, always include it in the visible set,\n // counting toward the MAX_COLUMNS cap.\n if (!hasAction && tableHasActionColumn) {\n if (result.length >= MAX_COLUMNS) {\n // Replace the last non-action entry with the action column\n result = [...result.slice(0, MAX_COLUMNS - 1), ACTION_COLUMN_ID];\n } else {\n result = [...result, ACTION_COLUMN_ID];\n }\n }\n\n // Ensure the action column is always rendered last\n const withoutAction = result.filter((id) => id !== ACTION_COLUMN_ID);\n return [...withoutAction, ACTION_COLUMN_ID];\n }, [columns]);\n\n // Column selection state - load persisted columns if they exist, otherwise default to first 9\n const [visibleColumns, setVisibleColumns] = useState(() => {\n // Try to load persisted columns immediately on mount\n if (typeof window !== 'undefined' && tableId) {\n try {\n // Check if user has manually changed columns before\n const hasManualChange = localStorage.getItem(`dataTable_manual_change_${tableId}:${userId}`) === 'true';\n \n if (hasManualChange) {\n // User has manually changed columns, load persisted selection immediately\n const saved = localStorage.getItem(`dataTable_columns_${tableId}:${userId}`);\n if (saved) {\n const savedColumns = JSON.parse(saved);\n if (Array.isArray(savedColumns) && savedColumns.length > 0) {\n userHasManuallyChangedColumns.current = true;\n // Validate saved columns exist in current columns\n const validColumns = savedColumns.filter(colId => \n columns.some(col => (col.id || col.key) === colId)\n );\n if (validColumns.length > 0) {\n return validColumns.slice(0, MAX_COLUMNS);\n }\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load saved columns from localStorage:', error);\n }\n }\n \n // If no persisted columns, default to first 9 columns\n const columnIds = columns.map((col) => col.id || col.key);\n const initial = columnIds.slice(0, MAX_COLUMNS);\n return enforceActionPosition(initial);\n });\n const [isColumnDropdownOpen, setIsColumnDropdownOpen] = useState(false);\n const [columnDropdownPosition, setColumnDropdownPosition] = useState({ top: 0, left: 0, width: 0 });\n const [pendingSelection, setPendingSelection] = useState(new Set());\n const [pendingDeselection, setPendingDeselection] = useState(new Set());\n // Snapshot of the columns visible on first mount; used as the Reset target\n const initialVisibleColumnsRef = useRef(null);\n if (initialVisibleColumnsRef.current === null) {\n initialVisibleColumnsRef.current = [...visibleColumns];\n }\n const [draggedColumnIndex, setDraggedColumnIndex] = useState(null);\n const [dragOverColumnIndex, setDragOverColumnIndex] = useState(null);\n const columnDropdownRef = useRef(null);\n const columnDropdownMenuRef = useRef(null);\n const toastTimeoutRef = useRef(null);\n const [activeId, setActiveId] = useState(null);\n const [columnWidths, setColumnWidths] = useState({});\n const tableRef = useRef(null);\n const resizeStateRef = useRef(null);\n\n // Helper to get column identifier (id or key)\n const getColumnId = (col) => col.id || col.key;\n const toPixelWidth = useCallback((value) => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (trimmed.endsWith(\"px\")) {\n const parsed = parseFloat(trimmed);\n return Number.isFinite(parsed) ? parsed : null;\n }\n const parsed = parseFloat(trimmed);\n return Number.isFinite(parsed) && `${parsed}` === trimmed ? parsed : null;\n }\n return null;\n }, []);\n const getResolvedColumnWidth = useCallback((columnId, fallbackWidth) => {\n if (columnWidths[columnId] != null) return `${columnWidths[columnId]}px`;\n if (typeof fallbackWidth === \"number\") return `${fallbackWidth}px`;\n return fallbackWidth || \"auto\";\n }, [columnWidths]);\n\n const handleResizeMove = useCallback((event) => {\n if (!resizeStateRef.current) return;\n const { columnId, startX, startWidth, minWidth, maxWidth } = resizeStateRef.current;\n const delta = event.clientX - startX;\n const nextWidth = Math.round(startWidth + delta);\n const clamped = Math.min(maxWidth, Math.max(minWidth, nextWidth));\n setColumnWidths((prev) => ({ ...prev, [columnId]: clamped }));\n }, []);\n\n const stopResize = useCallback(() => {\n resizeStateRef.current = null;\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n document.removeEventListener(\"mousemove\", handleResizeMove);\n document.removeEventListener(\"mouseup\", stopResize);\n }, [handleResizeMove]);\n\n const startResize = useCallback((event, column, currentWidth) => {\n event.preventDefault();\n event.stopPropagation();\n const columnId = column.id || column.key;\n const colMin = toPixelWidth(column.minWidth) ?? columnResizeMinWidth;\n const colMax = toPixelWidth(column.maxWidth) ?? columnResizeMaxWidth;\n const minWidth = Math.min(colMin, colMax);\n const maxWidth = Math.max(colMin, colMax);\n const widthFromDom = event.currentTarget.closest(\"th\")?.getBoundingClientRect().width || 0;\n const parsed = toPixelWidth(currentWidth);\n const base =\n parsed != null\n ? parsed\n : Math.max(minWidth, Math.round(widthFromDom) || minWidth);\n const startWidth = Math.min(maxWidth, Math.max(minWidth, base));\n resizeStateRef.current = { columnId, startX: event.clientX, startWidth, minWidth, maxWidth };\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n document.addEventListener(\"mousemove\", handleResizeMove);\n document.addEventListener(\"mouseup\", stopResize);\n }, [columnResizeMaxWidth, columnResizeMinWidth, handleResizeMove, stopResize, toPixelWidth]);\n\n useEffect(() => () => stopResize(), [stopResize]);\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n // Handle column drag end (table-level drag and drop)\n const handleDragEnd = (event) => {\n const { active, over } = event;\n if (over && active.id !== over.id) {\n if (active.id === ACTION_COLUMN_ID || over.id === ACTION_COLUMN_ID) {\n showMaxColumnsError(\"Cannot drop columns on the Action column\");\n setActiveId(null);\n return;\n }\n // Mark that user has manually changed columns\n userHasManuallyChangedColumns.current = true;\n \n // Update visibleColumns order when dragging in table header\n setVisibleColumns((prev) => {\n const oldIndex = prev.indexOf(active.id);\n const newIndex = prev.indexOf(over.id);\n if (oldIndex !== -1 && newIndex !== -1) {\n const reordered = arrayMove(prev, oldIndex, newIndex);\n const constrained = enforceActionPosition(reordered);\n // Save immediately after drag\n saveColumnsToStorage(constrained);\n return constrained;\n }\n return prev;\n });\n \n // Also update columnOrder for consistency\n setColumnOrder((items) => {\n const oldIndex = items.indexOf(active.id);\n const newIndex = items.indexOf(over.id);\n return arrayMove(items, oldIndex, newIndex);\n });\n }\n setActiveId(null);\n };\n\n // Handle column drag start\n const handleDragStart = (event) => {\n setActiveId(event.active.id);\n };\n\n // Filter data based on filter inputs - supports multiple keywords\n // For server-side filtering, skip client-side filtering (data is already filtered by server)\n const filteredData = useMemo(() => {\n if (isServerSideFiltering) {\n // Server-side filtering: data is already filtered, use as-is\n return data || [];\n }\n \n // Client-side filtering: filter the data locally\n if (!data || data.length === 0) return [];\n \n const globalQ = globalQuery.trim().toLowerCase();\n const filterEntries = Object.entries(filters).filter(([, f]) => isFilterActive(f));\n\n return data.filter((row) => {\n for (const [key, filter] of filterEntries) {\n const cellValue = row[key];\n if (cellValue === null || cellValue === undefined) return false;\n // Text-values filter (legacy / default)\n if (Array.isArray(filter)) {\n const cellStr = String(cellValue);\n if (!filter.some((v) => String(v) === cellStr)) return false;\n continue;\n }\n if (filter.type === \"range\") {\n const n = parseNumberLike(cellValue);\n if (isNaN(n)) return false;\n if (filter.min !== \"\" && filter.min != null && n < Number(filter.min)) return false;\n if (filter.max !== \"\" && filter.max != null && n > Number(filter.max)) return false;\n continue;\n }\n if (filter.type === \"durationRange\") {\n const sec = parseDurationToSeconds(cellValue);\n if (isNaN(sec)) return false;\n if (filter.minSec !== \"\" && filter.minSec != null && sec < Number(filter.minSec)) return false;\n if (filter.maxSec !== \"\" && filter.maxSec != null && sec > Number(filter.maxSec)) return false;\n continue;\n }\n if (filter.type === \"dateRange\") {\n const d = parseDateLike(cellValue);\n if (!d) return false;\n if (filter.from) {\n const from = new Date(filter.from + \"T00:00:00\");\n if (d < from) return false;\n }\n if (filter.to) {\n const to = new Date(filter.to + \"T23:59:59\");\n if (d > to) return false;\n }\n continue;\n }\n }\n // Global search — substring match across any cell value\n if (globalQ) {\n const anyMatch = Object.values(row).some((v) => {\n if (v === null || v === undefined) return false;\n return String(v).toLowerCase().includes(globalQ);\n });\n if (!anyMatch) return false;\n }\n return true;\n });\n }, [data, filters, globalQuery, isServerSideFiltering]);\n\n // Sort filtered data\n // For server-side sorting, skip client-side sorting (data is already sorted by server)\n const sortedData = useMemo(() => {\n if (isServerSideSorting) {\n // Server-side sorting: data is already sorted, use as-is\n return filteredData;\n }\n \n // Client-side sorting: sort the filtered data locally\n if (!sortField) return filteredData;\n \n return [...filteredData].sort((a, b) => {\n const aVal = a[sortField];\n const bVal = b[sortField];\n \n // Handle null/undefined\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n \n // Handle numbers\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n return sortDirection === \"asc\" ? aVal - bVal : bVal - aVal;\n }\n \n // Handle strings\n const aStr = String(aVal).toLowerCase();\n const bStr = String(bVal).toLowerCase();\n \n if (sortDirection === \"asc\") {\n return aStr.localeCompare(bStr);\n } else {\n return bStr.localeCompare(aStr);\n }\n });\n }, [filteredData, sortField, sortDirection, isServerSideSorting]);\n\n // Paginate sorted data\n // For server-side pagination, use data as-is (already paginated by server)\n // For client-side pagination, paginate the sorted data\n const paginatedData = useMemo(() => {\n if (isServerSidePagination) {\n // Server-side: data is already paginated, use as-is\n // Use data directly (not sortedData) since server handles sorting\n return data || [];\n } else {\n // Client-side: paginate the sorted data\n const startIndex = (page - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n return sortedData.slice(startIndex, endIndex);\n }\n }, [data, sortedData, page, pageSize, isServerSidePagination]);\n\n // Handle header click for sorting\n const handleSort = (field) => {\n if (isServerSideSorting && onSort) {\n // Server-side sorting: call parent's onSort callback\n onSort(field);\n // Reset to first page on sort (if pagination is controlled)\n if (onPageChange) {\n onPageChange(1);\n } else {\n setInternalPage(1);\n }\n } else {\n // Client-side sorting: update internal state\n if (internalSortField === field) {\n setInternalSortDirection(internalSortDirection === \"asc\" ? \"desc\" : \"asc\");\n } else {\n setInternalSortField(field);\n setInternalSortDirection(\"asc\");\n }\n setPage(1); // Reset to first page on sort\n }\n };\n\n // Legacy handler kept for any callers that still pass a string value;\n // it splits on whitespace and treats the resulting tokens as the selected values.\n const handleFilterChange = (id, value) => {\n const tokens = (value || \"\")\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter(Boolean);\n setColumnFilter(id, tokens);\n };\n\n // Surface max columns limit error via callback, throttled to once per 3s\n const showMaxColumnsError = (message) => {\n if (toastTimeoutRef.current) return;\n if (typeof onMaxColumnsError === 'function') {\n onMaxColumnsError(message);\n }\n toastTimeoutRef.current = setTimeout(() => {\n toastTimeoutRef.current = null;\n }, 3000);\n };\n\n // Save columns to localStorage\n const saveColumnsToStorage = useCallback((cols) => {\n if (typeof window !== 'undefined' && storageKey && cols.length > 0 && userHasManuallyChangedColumns.current) {\n try {\n localStorage.setItem(storageKey, JSON.stringify(cols));\n if (manualChangeFlagKey) {\n localStorage.setItem(manualChangeFlagKey, 'true');\n }\n } catch (error) {\n console.warn('Failed to save columns to localStorage:', error);\n }\n }\n }, [storageKey, manualChangeFlagKey]);\n\n // Toggle column selection with smooth transitions\n const toggleColumnSelection = (columnId) => {\n // Prevent toggling the action column visibility; it should always be shown\n if (columnId === ACTION_COLUMN_ID) {\n return;\n }\n // Mark that user has manually changed columns\n userHasManuallyChangedColumns.current = true;\n \n setVisibleColumns(prev => {\n // Unselecting: show unchecked state first, then remove from selected list\n if (prev.includes(columnId)) {\n // Clear any pending throttling timeout when unselecting\n if (toastTimeoutRef.current) {\n clearTimeout(toastTimeoutRef.current);\n toastTimeoutRef.current = null;\n }\n // toast.dismiss(\"max-columns-toast\");\n\n // Don't allow deselecting all columns\n if (prev.length === 1) return prev;\n \n // Show unchecked state first, then remove after delay\n setPendingDeselection(prevSet => new Set(prevSet).add(columnId));\n setTimeout(() => {\n setVisibleColumns(current => {\n const updated = current.filter(id => id !== columnId);\n const constrained = enforceActionPosition(updated);\n // Save immediately after user change\n saveColumnsToStorage(constrained);\n return constrained;\n });\n setPendingDeselection(prevSet => {\n const next = new Set(prevSet);\n next.delete(columnId);\n return next;\n });\n }, 200); // 200ms delay for smooth transition\n \n return prev; // Return current state, actual removal happens in setTimeout\n }\n \n // Selecting: check if we're at the maximum limit\n if (prev.length >= MAX_COLUMNS) {\n showMaxColumnsError(\"Maximum 9 column selection allowed\");\n return prev;\n }\n \n // Show checked state first, then add to selected list after delay\n setPendingSelection(prevSet => new Set(prevSet).add(columnId));\n setTimeout(() => {\n setVisibleColumns(current => {\n const updated = !current.includes(columnId) ? [...current, columnId] : current;\n const constrained = enforceActionPosition(updated);\n // Save immediately after user change\n saveColumnsToStorage(constrained);\n return constrained;\n });\n setPendingSelection(prevSet => {\n const next = new Set(prevSet);\n next.delete(columnId);\n return next;\n });\n }, 200); // 200ms delay for smooth transition\n \n return prev; // Return current state, actual addition happens in setTimeout\n });\n };\n\n // Column drag handlers for reordering in dropdown\n const handleColumnDragStart = (e, index) => {\n if (visibleColumns[index] === ACTION_COLUMN_ID) return;\n setDraggedColumnIndex(index);\n };\n\n const handleColumnDragEnd = () => {\n setDraggedColumnIndex(null);\n setDragOverColumnIndex(null);\n };\n\n const handleColumnDragOver = (e, index) => {\n e.preventDefault();\n if (draggedColumnIndex !== null && draggedColumnIndex !== index) {\n setDragOverColumnIndex(index);\n }\n };\n\n const handleColumnDragLeave = () => {\n setDragOverColumnIndex(null);\n };\n\n const handleColumnDrop = (e, dropIndex) => {\n e.preventDefault();\n if (\n draggedColumnIndex !== null &&\n draggedColumnIndex !== dropIndex &&\n visibleColumns[dropIndex] !== ACTION_COLUMN_ID &&\n visibleColumns[draggedColumnIndex] !== ACTION_COLUMN_ID\n ) {\n // Mark that user has manually changed columns\n userHasManuallyChangedColumns.current = true;\n \n setVisibleColumns(prev => {\n const reordered = arrayMove(prev, draggedColumnIndex, dropIndex);\n const constrained = enforceActionPosition(reordered);\n // Save immediately after drag\n saveColumnsToStorage(constrained);\n return constrained;\n });\n }\n setDraggedColumnIndex(null);\n setDragOverColumnIndex(null);\n };\n\n // Update columnOrder when visibleColumns changes\n useEffect(() => {\n setColumnOrder(prev => {\n // Keep visible columns in their current order, append any new ones\n const visibleOrder = visibleColumns.filter(id => prev.includes(id));\n const newColumns = visibleColumns.filter(id => !prev.includes(id));\n const hiddenColumns = prev.filter(id => !visibleColumns.includes(id));\n return [...visibleOrder, ...newColumns, ...hiddenColumns];\n });\n }, [visibleColumns]);\n\n // Save to localStorage whenever visibleColumns changes (only if user has manually changed columns)\n useEffect(() => {\n if (typeof window !== 'undefined' && storageKey && visibleColumns.length > 0 && userHasManuallyChangedColumns.current) {\n try {\n const constrained = enforceActionPosition(visibleColumns);\n localStorage.setItem(storageKey, JSON.stringify(constrained));\n if (manualChangeFlagKey) {\n localStorage.setItem(manualChangeFlagKey, 'true');\n }\n } catch (error) {\n console.warn('Failed to save columns to localStorage:', error);\n }\n }\n }, [visibleColumns, storageKey, manualChangeFlagKey]);\n\n // Initialize visibleColumns when columns become available (if not already initialized)\n useEffect(() => {\n // Only initialize if columns are available and visibleColumns is empty\n if (columns.length > 0 && visibleColumns.length === 0) {\n // Check if user has manually changed columns before\n if (typeof window !== 'undefined' && tableId) {\n try {\n const hasManualChange = localStorage.getItem(`dataTable_manual_change_${tableId}:${userId}`) === 'true';\n if (hasManualChange) {\n const saved = localStorage.getItem(`dataTable_columns_${tableId}:${userId}`);\n if (saved) {\n const savedColumns = JSON.parse(saved);\n if (Array.isArray(savedColumns) && savedColumns.length > 0) {\n // Validate saved columns exist in current columns\n const validColumns = savedColumns.filter(colId => \n columns.some(col => (col.id || col.key) === colId)\n );\n if (validColumns.length > 0) {\n userHasManuallyChangedColumns.current = true;\n setVisibleColumns(validColumns.slice(0, MAX_COLUMNS));\n return;\n }\n }\n }\n }\n } catch (error) {\n console.warn('Failed to load saved columns from localStorage:', error);\n }\n }\n \n // Default to first 9 columns if no saved columns\n const columnIds = columns.map((col) => col.id || col.key);\n setVisibleColumns(enforceActionPosition(columnIds.slice(0, MAX_COLUMNS)));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [columns, tableId, userId, enforceActionPosition]);\n\n // Get ordered columns based on visibleColumns and columnOrder\n const orderedColumns = useMemo(() => {\n // Filter to only show visible columns, maintaining their order\n const cols = visibleColumns\n .map((id) => columns.find((col) => getColumnId(col) === id))\n .filter(Boolean);\n return enforceActionPosition(cols.map(getColumnId))\n .map((id) => columns.find((col) => getColumnId(col) === id))\n .filter(Boolean);\n }, [columns, visibleColumns]);\n\n // Check if any columns are filterable\n const hasFilterableColumns = useMemo(() => {\n return orderedColumns.some((col) => col.filterable === true);\n }, [orderedColumns]);\n\n // Column dropdown position management\n useEffect(() => {\n if (!isColumnDropdownOpen || !columnDropdownRef.current) return;\n\n const updatePosition = () => {\n if (columnDropdownRef.current) {\n const rect = columnDropdownRef.current.getBoundingClientRect();\n // For position: fixed, use viewport coordinates directly (no scroll offset needed)\n // This ensures the dropdown scrolls with the button\n // Connect menu directly to button (no gap)\n setColumnDropdownPosition({\n top: rect.bottom, // No gap - connect directly\n left: rect.left,\n width: Math.max(rect.width || 220, 220),\n });\n }\n };\n\n updatePosition();\n \n // Use simple scroll listeners like Dropdown component for smooth scrolling\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [isColumnDropdownOpen]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event) => {\n if (\n isColumnDropdownOpen &&\n columnDropdownRef.current &&\n !columnDropdownRef.current.contains(event.target) &&\n columnDropdownMenuRef.current &&\n !columnDropdownMenuRef.current.contains(event.target)\n ) {\n setIsColumnDropdownOpen(false);\n }\n };\n\n if (isColumnDropdownOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isColumnDropdownOpen]);\n\n // Display text for dropdown button\n const displayText = visibleColumns.length === 1 \n ? columns.find(col => (col.id || col.key) === visibleColumns[0])?.label || \"1 selected\"\n : `${visibleColumns.length} selected`;\n\n // Sortable header cell component\n function SortableHeader({ column, isHeaderRow = true }) {\n const columnId = getColumnId(column);\n const isActionColumn = columnId === ACTION_COLUMN_ID;\n const resolvedWidth = getResolvedColumnWidth(columnId, column.width);\n const [isHeaderHovered, setIsHeaderHovered] = useState(false);\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: columnId });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n width: resolvedWidth,\n minWidth: resolvedWidth,\n };\n\n // For server-side sorting, check if the sortField matches this column\n // Handle reverse mapping (e.g., \"csat_score\" matches \"evaluation.csat_score\")\n let isSorted = false;\n if (isServerSideSorting && sortFields.length > 0) {\n const sortFieldFromProps = sortFields[0][0];\n // Direct match\n if (sortFieldFromProps === columnId) {\n isSorted = true;\n }\n // Reverse mapping: \"csat_score\" matches \"evaluation.csat_score\"\n else if (sortFieldFromProps === \"csat_score\" && columnId === \"evaluation.csat_score\") {\n isSorted = true;\n }\n } else {\n // Client-side sorting: direct comparison\n isSorted = sortField === columnId;\n }\n \n const isAsc = sortDirection === \"asc\";\n const isFilterable = column.filterable === true; // Only filterable if explicitly set to true\n\n // Filter row\n if (!isHeaderRow) {\n return (\n <th\n style={{\n width: resolvedWidth,\n minWidth: resolvedWidth,\n backgroundColor: \"var(--primary-foreground)\",\n }}\n className=\"sticky top-[57px] z-10 border-b border-[var(--border-strong)] px-4 py-2 text-left\"\n >\n {isFilterable ? (\n <div className=\"relative\">\n <Filter\n size={12}\n className=\"absolute left-2 top-1/2 -translate-y-1/2 text-[var(--text-faint)] pointer-events-none\"\n />\n <input\n type=\"text\"\n placeholder=\"Filter...\"\n value={filters[columnId] || \"\"}\n onChange={(e) => {\n e.stopPropagation();\n handleFilterChange(columnId, e.target.value);\n }}\n onKeyDown={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n className=\"w-full pl-7 pr-2 py-1.5 text-xs border border-[var(--border)] rounded text-[var(--text-ink)] placeholder:text-[var(--text-faint)] focus:outline-none focus:border-[var(--border-hover)] focus:ring-1 focus:ring-[var(--focus)] transition-colors\"\n style={{ fontFamily: 'var(--font-sans)', backgroundColor: \"var(--primary-foreground)\" }}\n autoComplete=\"off\"\n />\n </div>\n ) : (\n <div className=\"h-[34px]\"></div>\n )}\n </th>\n );\n }\n\n // Header row\n const filterPopoverOpen = openFilterColumnId === columnId;\n const hasActiveFilter = isFilterActive(filters[columnId]);\n const showSortBtn = column.sortable !== false && (isHeaderHovered || isSorted);\n const showFilterBtn = column.filterable !== false && !isActionColumn && (isHeaderHovered || filterPopoverOpen || hasActiveFilter);\n return (\n <th\n ref={setNodeRef}\n onMouseEnter={() => setIsHeaderHovered(true)}\n onMouseLeave={() => setIsHeaderHovered(false)}\n style={{\n ...style,\n padding: '0 12px',\n height: 36,\n textAlign: isActionColumn ? 'center' : 'left',\n fontWeight: 500,\n fontSize: '14px',\n letterSpacing: 'normal',\n textTransform: 'none',\n color: '#0b0b0b',\n cursor: column.sortable !== false ? 'pointer' : 'default',\n width: resolvedWidth,\n borderRight: 'none',\n userSelect: 'none',\n background: isHeaderHovered || filterPopoverOpen ? '#e6e6e6' : '#f2f2f0',\n borderBottom: '1px solid #e6e6e6',\n position: 'sticky',\n top: 0,\n zIndex: 10,\n fontFamily: 'var(--font-sans)',\n transition: 'background 100ms ease',\n }}\n >\n {/* Left edge separator (1px × 16px, vertically centered) */}\n {!isActionColumn && (\n <span\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n left: 0,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: 1,\n height: 16,\n background: \"#e6e6e6\",\n pointerEvents: \"none\",\n }}\n />\n )}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n justifyContent: isActionColumn ? 'center' : 'flex-start',\n position: 'relative',\n minHeight: 20,\n }}\n >\n {!isActionColumn && (\n <div\n {...attributes}\n {...listeners}\n style={{ cursor: 'grab', color: 'rgba(11, 11, 11, 0.36)', display: 'inline-flex', alignItems: 'center' }}\n >\n <GripVertical size={14} />\n </div>\n )}\n <span\n onClick={() => column.sortable !== false && handleSort(columnId)}\n style={{ cursor: column.sortable !== false ? 'pointer' : 'default', flex: 1, lineHeight: '20px' }}\n >\n {column.label}\n </span>\n {showSortBtn && (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); handleSort(columnId); }}\n title=\"Sort\"\n style={{\n background: \"transparent\",\n border: \"none\",\n padding: 4,\n borderRadius: 4,\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: isSorted ? \"#0b0b0b\" : \"rgba(11, 11, 11, 0.55)\",\n }}\n >\n {isSorted\n ? (isAsc ? <ArrowUp size={14} strokeWidth={1.75} /> : <ArrowDown size={14} strokeWidth={1.75} />)\n : <ArrowUpDown size={14} strokeWidth={1.75} />}\n </button>\n )}\n {showFilterBtn && (\n <button\n type=\"button\"\n ref={(el) => { filterIconRefs.current[columnId] = el; }}\n onClick={(e) => { e.stopPropagation(); openFilterPopoverFor(columnId, e.currentTarget); }}\n title=\"Filter\"\n style={{\n position: \"relative\",\n background: filterPopoverOpen || hasActiveFilter ? \"#D8D8D8\" : \"transparent\",\n border: \"none\",\n padding: 4,\n borderRadius: 4,\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: hasActiveFilter ? \"#0b0b0b\" : \"rgba(11, 11, 11, 0.7)\",\n }}\n >\n <ListFilter size={14} strokeWidth={1.75} />\n {hasActiveFilter && (\n <span\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n top: 0,\n right: 0,\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#0B0B0B\",\n }}\n />\n )}\n </button>\n )}\n </div>\n {/* Right edge separator (1px × 16px, vertically centered, on the cell's right edge) */}\n {!isActionColumn && (\n <span\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n right: 0,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: 1,\n height: 16,\n background: \"#e6e6e6\",\n pointerEvents: \"none\",\n }}\n />\n )}\n {/* Resize handle — sits right at the cell's right edge, away from the filter icon */}\n {!isActionColumn && (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${column.label || columnId} column`}\n title=\"Drag to resize column\"\n onMouseDown={(e) => startResize(e, column, resolvedWidth)}\n onClick={(e) => e.stopPropagation()}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(30, 33, 37, 0.18)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n style={{\n position: \"absolute\",\n top: 0,\n right: -2,\n width: 4,\n height: \"100%\",\n cursor: \"col-resize\",\n zIndex: 4,\n background: \"transparent\",\n }}\n />\n )}\n </th>\n );\n }\n\n // Drag overlay for column header\n const activeColumn = activeId ? columns.find((col) => getColumnId(col) === activeId) : null;\n\n // Column dropdown menu\n const renderColumnRow = ({ col, columnId, isSelected, draggable, isAction, actualIndex }) => {\n const isDragging = draggable && draggedColumnIndex === actualIndex;\n const isDragOver = draggable && dragOverColumnIndex === actualIndex && draggedColumnIndex !== null && draggedColumnIndex !== actualIndex;\n const isPending = isSelected ? pendingDeselection.has(columnId) : pendingSelection.has(columnId);\n // Visual checked state: selected and not pending deselect, OR unselected and pending select\n const checked = isSelected ? !pendingDeselection.has(columnId) : pendingSelection.has(columnId);\n return (\n <div\n draggable={draggable}\n onDragStart={draggable ? (e) => handleColumnDragStart(e, actualIndex) : undefined}\n onDragEnd={draggable ? handleColumnDragEnd : undefined}\n onDragOver={draggable ? (e) => handleColumnDragOver(e, actualIndex) : undefined}\n onDragLeave={draggable ? handleColumnDragLeave : undefined}\n onDrop={draggable ? (e) => handleColumnDrop(e, actualIndex) : undefined}\n onClick={() => { if (!isAction) toggleColumnSelection(columnId); }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"2px 0\",\n cursor: isAction ? \"default\" : (draggable ? \"grab\" : \"pointer\"),\n opacity: isDragging ? 0.5 : 1,\n background: isDragOver ? \"#F2F2F0\" : \"transparent\",\n borderRadius: 6,\n }}\n >\n {/* Drag handle — visible only for selected (sortable) items */}\n <span\n style={{\n width: 16,\n height: 16,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#989898\",\n visibility: draggable ? \"visible\" : \"hidden\",\n flexShrink: 0,\n }}\n >\n <GripVertical size={14} strokeWidth={1.75} />\n </span>\n {/* Checkbox 20x20 */}\n <span\n style={{\n width: 20,\n height: 20,\n borderRadius: 4,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: checked ? \"#0B0B0B\" : \"#FFFFFF\",\n border: `1px solid ${checked ? \"#0B0B0B\" : \"#676767\"}`,\n flexShrink: 0,\n marginLeft: 8,\n }}\n >\n {checked && <Check size={14} color=\"#FFFFFF\" strokeWidth={3} />}\n </span>\n <span\n style={{\n flex: 1,\n fontFamily: \"var(--font-sans)\",\n fontSize: 14,\n lineHeight: \"20px\",\n color: \"#0B0B0B\",\n marginLeft: 8,\n }}\n >\n {col.label}\n </span>\n </div>\n );\n };\n\n const columnDropdownMenu = isColumnDropdownOpen ? (\n <div\n ref={columnDropdownMenuRef}\n style={{\n position: \"fixed\",\n top: `${columnDropdownPosition.top}px`,\n left: `${columnDropdownPosition.left}px`,\n width: 217,\n maxHeight: 400,\n overflow: \"auto\",\n zIndex: 49,\n background: \"#FFFFFF\",\n border: \"1px solid #E6E6E6\",\n borderRadius: 10,\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n fontFamily: \"var(--font-sans)\",\n boxShadow: \"0 8px 24px rgba(11, 11, 11, 0.08)\",\n }}\n >\n {/* Selected columns — draggable */}\n {visibleColumns.map((columnId, index) => {\n const col = columns.find((c) => getColumnId(c) === columnId);\n if (!col) return null;\n const isAction = columnId === ACTION_COLUMN_ID;\n return (\n <React.Fragment key={`selected-${columnId}-${index}`}>\n {renderColumnRow({\n col,\n columnId,\n isSelected: true,\n draggable: !isAction,\n isAction,\n actualIndex: index,\n })}\n </React.Fragment>\n );\n })}\n\n {/* Unselected columns */}\n {columns\n .filter((col) => !visibleColumns.includes(getColumnId(col)))\n .map((col) => {\n const columnId = getColumnId(col);\n return (\n <React.Fragment key={`unselected-${columnId}`}>\n {renderColumnRow({\n col,\n columnId,\n isSelected: false,\n draggable: false,\n isAction: false,\n actualIndex: -1,\n })}\n </React.Fragment>\n );\n })}\n\n {/* Footer — divider + Reset + Apply */}\n <div style={{ height: 1, background: \"#D9D9D9\", margin: \"0 -12px\" }} />\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: 30,\n }}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n // Restore visible columns to the initial snapshot, drop staged toggles\n const snapshot = initialVisibleColumnsRef.current\n ? [...initialVisibleColumnsRef.current]\n : columns.map(getColumnId).slice(0, MAX_COLUMNS);\n userHasManuallyChangedColumns.current = false;\n setVisibleColumns(enforceActionPosition(snapshot));\n setPendingSelection(new Set());\n setPendingDeselection(new Set());\n if (typeof window !== \"undefined\" && storageKey) {\n try { localStorage.removeItem(storageKey); } catch (_) {}\n }\n }}\n style={{\n background: \"transparent\",\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n fontFamily: \"var(--font-sans)\",\n fontSize: 14,\n fontWeight: 500,\n color: \"#323232\",\n }}\n >\n Reset\n </button>\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsColumnDropdownOpen(false);\n }}\n style={{\n background: \"#2E3236\",\n color: \"#FFFFFF\",\n border: \"none\",\n borderRadius: 10,\n height: 28,\n padding: \"0 14px\",\n fontFamily: \"var(--font-sans)\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n Apply\n </button>\n </div>\n </div>\n ) : null;\n\n const openFilterColumn = openFilterColumnId\n ? columns.find((c) => getColumnId(c) === openFilterColumnId)\n : null;\n const filterPopoverNode = openFilterColumn\n ? (\n <FilterValuePicker\n key={openFilterColumnId}\n column={openFilterColumn}\n columnId={openFilterColumnId}\n filterType={getColumnFilterType(openFilterColumnId)}\n position={filterPopoverPosition}\n popoverRef={filterPopoverRef}\n distinctValues={getDistinctValuesForColumn(openFilterColumnId)}\n initialValue={filters[openFilterColumnId]}\n onApply={(value) => {\n setColumnFilter(openFilterColumnId, value);\n setOpenFilterColumnId(null);\n }}\n onCancel={() => setOpenFilterColumnId(null)}\n />\n )\n : null;\n\n return (\n <div className=\"w-full\" style={{top:'130px', position: 'sticky', zIndex: 35, backgroundColor: \"var(--primary-foreground)\"}}>\n {/* Filter popover (anchored under the active column header) */}\n {filterPopoverNode && createPortal(filterPopoverNode, document.body)}\n {/* Toolbar: Columns dropdown + Search */}\n {columns.length > 0 && (\n <div\n className=\"pt-2 pb-1\"\n style={{\n position: \"sticky\",\n zIndex: 35,\n backgroundColor: \"var(--primary-foreground)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 16,\n flexWrap: \"wrap\",\n }}\n >\n {filtersConfig && (\n <div style={{ marginRight: \"auto\" }}>\n <DataTableFilters\n dateRangePicker={filtersConfig.dateRangePicker}\n onWeekToDate={filtersConfig.onWeekToDate}\n exportConfig={filtersConfig.exportConfig}\n filterChipsConfig={filtersConfig.filterChipsConfig}\n trailingActions={filtersConfig.trailingActions}\n />\n </div>\n )}\n\n {/* Columns button — compact */}\n <div style={{ position: \"relative\" }}>\n <button\n ref={columnDropdownRef}\n type=\"button\"\n onClick={() => setIsColumnDropdownOpen(!isColumnDropdownOpen)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 10,\n height: 32,\n padding: \"0 16px\",\n background: \"#FFFFFF\",\n border: \"1px solid #D9D9D9\",\n borderRadius: 10,\n cursor: \"pointer\",\n fontFamily: \"var(--font-sans)\",\n fontSize: 14,\n fontWeight: 600,\n color: \"#2E3236\",\n whiteSpace: \"nowrap\",\n }}\n >\n <Settings2 size={20} strokeWidth={1.75} />\n Columns\n </button>\n {isColumnDropdownOpen && createPortal(columnDropdownMenu, document.body)}\n </div>\n\n {/* Search input */}\n <div\n style={{\n background: \"#D8D8D8\",\n width: 260,\n height: 32,\n borderRadius: 11,\n padding: 1,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <div\n style={{\n background: \"#FFFFFF\",\n flex: 1,\n height: 30,\n borderRadius: 10,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"0 8px\",\n }}\n >\n <Search size={18} color=\"#989898\" strokeWidth={1.75} />\n <input\n type=\"text\"\n placeholder=\"Search\"\n value={globalQuery}\n onChange={(e) => {\n setGlobalQuery(e.target.value);\n if (onPageChange) onPageChange(1); else setInternalPage(1);\n }}\n style={{\n flex: 1,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontFamily: \"var(--font-sans)\",\n fontSize: 14,\n color: \"#0B0B0B\",\n minWidth: 0,\n }}\n />\n </div>\n </div>\n </div>\n </div>\n )}\n {/* Filter chip strip — appears below the toolbar when any filter is active */}\n {Object.keys(filters).length > 0 && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexWrap: \"wrap\",\n padding: \"8px 0\",\n }}\n >\n {Object.entries(filters).map(([colId, filter]) => {\n const col = columns.find((c) => getColumnId(c) === colId);\n if (!col || !isFilterActive(filter)) return null;\n const first = chipSummary(filter);\n const extra = chipExtraCount(filter);\n const extraValues = chipExtraValues(filter);\n return (\n <span\n key={`chip-${colId}`}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 28,\n padding: \"0 12px\",\n borderRadius: 20,\n border: \"1px solid #B2B2B0\",\n background: \"#F2F2F0\",\n fontFamily: \"var(--font-sans)\",\n fontSize: 14,\n lineHeight: \"20px\",\n color: \"#0B0B0B\",\n whiteSpace: \"nowrap\",\n }}\n >\n <span>\n <span style={{ color: \"#676767\" }}>{col.label}: </span>\n <span>{first}</span>\n </span>\n {extra > 0 && (\n <ExtraValuesBadge count={extra} values={extraValues} />\n )}\n <button\n type=\"button\"\n onClick={() => setColumnFilter(colId, [])}\n aria-label={`Remove ${col.label} filter`}\n style={{\n background: \"transparent\",\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n display: \"inline-flex\",\n color: \"#676767\",\n }}\n >\n <X size={14} strokeWidth={2} />\n </button>\n </span>\n );\n })}\n <button\n type=\"button\"\n onClick={clearAllFilters}\n style={{\n marginLeft: \"auto\",\n background: \"transparent\",\n border: \"none\",\n padding: \"0 4px\",\n cursor: \"pointer\",\n fontFamily: \"var(--font-sans)\",\n fontSize: 14,\n fontWeight: 500,\n color: \"#323232\",\n }}\n >\n Reset\n </button>\n </div>\n )}\n\n {/* Only render table if we have columns */}\n {columns.length > 0 && orderedColumns.length > 0 ? (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <div style={{\n borderRadius: 8,\n border: '1px solid #E6E6E6',\n overflow: 'hidden',\n background: 'var(--primary-foreground)',\n position: 'relative',\n top: '0.5rem',\n }}>\n {/* Loading overlay */}\n {isLoading && (\n <div style={{\n position: 'absolute',\n inset: 0,\n background: 'rgba(255, 255, 255, 0.9)',\n backdropFilter: 'blur(2px)',\n zIndex: 20,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '14px'\n }}>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '12px'\n }}>\n <p style={{\n fontSize: '13px',\n color: 'rgba(30, 33, 37, 0.6)',\n margin: 0\n }}>Loading...</p>\n <Image\n src=\"/BrandLoading.gif\"\n alt=\"Loading\"\n width={50}\n height={50}\n unoptimized\n className=\"mt-1\"\n />\n </div>\n </div>\n )}\n <div className=\"overflow-x-auto custom-thin-scrollbar-hidden\" ref={tableRef} style={{ maxHeight: '500px', overflowY: 'auto', position: 'relative', zIndex: 1 }}>\n <table style={{\n width: 'auto',\n minWidth: '100%',\n borderCollapse: 'collapse',\n fontSize: '13px',\n fontFamily: 'var(--font-sans)'\n }}>\n <thead>\n {/* Header row with column labels */}\n <tr>\n <SortableContext\n items={visibleColumns}\n strategy={horizontalListSortingStrategy}\n >\n {orderedColumns.map((column) => (\n <SortableHeader key={`header-${getColumnId(column)}`} column={column} isHeaderRow={true} />\n ))}\n </SortableContext>\n </tr>\n </thead>\n <tbody>\n {!isLoading && paginatedData.length === 0 ? (\n <tr>\n <td\n colSpan={orderedColumns.length}\n style={{\n padding: '32px',\n textAlign: 'center',\n color: 'rgba(30, 33, 37, 0.42)',\n fontSize: '12px',\n fontFamily: 'var(--font-sans)',\n }}\n >\n No results found\n </td>\n </tr>\n ) : !isLoading && paginatedData.length > 0 ? (\n paginatedData.map((row, rowIndex) => (\n <tr\n key={rowIndex}\n data-row-id={row.id || rowIndex}\n style={{\n borderBottom: '1px solid #e6e6e6',\n cursor: onRowClick ? 'pointer' : 'default',\n transition: 'background 0.15s ease'\n }}\n onClick={onRowClick ? (e) => {\n e.stopPropagation();\n onRowClick(row, rowIndex);\n } : undefined}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(231, 212, 162, 0.12)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent';\n }}\n >\n {orderedColumns.map((column) => {\n const columnId = getColumnId(column);\n const resolvedWidth = getResolvedColumnWidth(columnId, column.width);\n const cellValue = row[columnId];\n const renderValue = column.render\n ? column.render(cellValue, row)\n : cellValue;\n\n // Only show tooltip for string values that might be truncated\n const hasWidthConstraint = resolvedWidth && resolvedWidth !== 'auto';\n const isStringValue = typeof renderValue === 'string' && renderValue.trim() !== '';\n const shouldUseTruncatedCell = hasWidthConstraint && isStringValue;\n\n const displayValue = shouldUseTruncatedCell ? (\n <TruncatedCell content={renderValue}>\n {renderValue}\n </TruncatedCell>\n ) : renderValue;\n\n return (\n <td\n key={columnId}\n style={{\n padding: '10px 14px',\n color: 'rgba(30, 33, 37, 0.78)',\n fontSize: '13px',\n borderRight: '1px solid rgba(52, 58, 64, 0.04)',\n width: resolvedWidth,\n fontFamily: 'var(--font-sans)',\n ...(shouldUseTruncatedCell && { maxWidth: resolvedWidth || '200px' }),\n }}\n >\n {displayValue}\n </td>\n );\n })}\n </tr>\n ))\n ) : null}\n </tbody>\n </table>\n </div>\n </div>\n\n <DragOverlay>\n {activeColumn ? (\n <div className=\"bg-[var(--paper-high)] border border-[var(--border-strong)] rounded px-4 py-2 shadow-lg\">\n <div className=\"flex items-center gap-2\">\n <GripVertical size={14} className=\"text-[var(--text-faint)]\" />\n <span className=\"text-sm font-semibold text-[var(--text-ink)]\">\n {activeColumn.label}\n </span>\n </div>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n ) : null}\n\n {(isServerSidePagination ? totalCount > 0 : sortedData.length > 0) && (\n <Pagination\n page={page}\n pageSizeOptions={[5, 10, 20, 50, 100]}\n pageSize={pageSize}\n totalCount={isServerSidePagination ? totalCount : sortedData.length}\n currentDataLength={paginatedData.length}\n onPageChange={setPage}\n onPageSizeChange={(newSize) => {\n setPageSize(newSize);\n setPage(1);\n }}\n showPageSizeSelector={true}\n />\n )}\n </div>\n );\n}\n\n"],"names":["DataTableFilters","dateRangePicker","onWeekToDate","exportConfig","filterChipsConfig","trailingActions","showExportMenu","setShowExportMenu","useState","exportButtonRef","useRef","exportMenuRef","useEffect","handleClickOutside","event","openExportMenu","prev","handleExport","type","shouldShowChips","filters","customFilters","hasRegularFilters","key","value","hasCustomFilters","filterObj","jsxs","jsx","CalendarClock","Suspense","Download","ChevronDown","Fragment","CustomFilterChips","parseNumberLike","cleaned","n","parseDurationToSeconds","str","colon","a","b","c","total","matched","dM","hM","mM","sM","parseDateLike","slash","yyyy","d","detectFilterType","values","sample","allMatch","test","v","isFilterActive","filter","secondsToHMS","sec","h","m","s","chipSummary","lo","hi","chipExtraCount","chipExtraValues","ExtraValuesBadge","count","hover","setHover","RangeInputs","leftLabel","rightLabel","leftValue","rightValue","onLeftChange","onRightChange","placeholderLeft","placeholderRight","fieldStyle","labelStyle","e","FilterValuePicker","column","columnId","filterType","position","popoverRef","distinctValues","initialValue","onApply","onCancel","isText","isNumber","isDate","isDuration","staged","setStaged","query","setQuery","rangeMin","setRangeMin","rangeMax","setRangeMax","durMin","setDurMin","durMax","setDurMax","dateFrom","setDateFrom","dateTo","setDateTo","filteredValues","useMemo","q","toggle","next","reset","apply","Search","checked","Check","useUserContext","Image","props","HoverBalloon","children","content","direction","align","styling","indicatorColor","tooltipText","resolvedArrowColor","isVisible","setIsVisible","mounted","setMounted","setPosition","triggerRef","tooltipRef","updatePosition","useCallback","triggerRect","tooltipRect","viewportWidth","viewportHeight","viewportPadding","gap","tooltipWidth","tooltipHeight","spaceAbove","spaceBelow","preferredPlacement","placement","anchorX","top","left","arrowLeft","handleReposition","createPortal","DataTable2","data","columns","initialPageSize","onRowClick","totalCount","controlledPage","controlledPageSize","onPageChange","onPageSizeChange","onFilterChange","columnFilters","onMaxColumnsError","onSort","sortFields","tableId","isLoading","filtersConfig","columnResizeMinWidth","columnResizeMaxWidth","userData","userId","TruncatedCell","React","className","textRef","isTruncated","setIsTruncated","checkTruncation","isOverflowing","timeoutId","textElement","isServerSidePagination","isServerSideFiltering","isServerSideSorting","internalPage","setInternalPage","internalPageSize","setInternalPageSize","page","pageSize","setPage","newPage","setPageSize","newSize","MAX_COLUMNS","ACTION_COLUMN_ID","userHasManuallyChangedColumns","storageKey","col","manualChangeFlagKey","cols","saved","validColumns","colId","error","setFilters","globalQuery","setGlobalQuery","openFilterColumnId","setOpenFilterColumnId","filterPopoverPosition","setFilterPopoverPosition","filterPopoverRef","filterIconRefs","internalSortField","setInternalSortField","internalSortDirection","setInternalSortDirection","setColumnFilter","active","k","clearAllFilters","getDistinctValuesForColumn","seen","out","row","getColumnFilterType","getColumnId","openFilterPopoverFor","anchorEl","rect","onMouseDown","anchor","normalizeColumnFilters","incomingFilters","areFiltersEqual","aKeys","bKeys","normalizedFilters","sortFieldFromProps","sortField","sortDirection","columnOrder","setColumnOrder","enforceActionPosition","result","tableHasActionColumn","id","visibleColumns","setVisibleColumns","savedColumns","initial","isColumnDropdownOpen","setIsColumnDropdownOpen","columnDropdownPosition","setColumnDropdownPosition","pendingSelection","setPendingSelection","pendingDeselection","setPendingDeselection","initialVisibleColumnsRef","draggedColumnIndex","setDraggedColumnIndex","dragOverColumnIndex","setDragOverColumnIndex","columnDropdownRef","columnDropdownMenuRef","toastTimeoutRef","activeId","setActiveId","columnWidths","setColumnWidths","tableRef","resizeStateRef","toPixelWidth","trimmed","parsed","getResolvedColumnWidth","fallbackWidth","handleResizeMove","startX","startWidth","minWidth","maxWidth","delta","nextWidth","clamped","stopResize","startResize","currentWidth","colMin","colMax","widthFromDom","_a","base","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","handleDragEnd","over","showMaxColumnsError","oldIndex","newIndex","reordered","arrayMove","constrained","saveColumnsToStorage","items","handleDragStart","filteredData","globalQ","filterEntries","f","cellValue","cellStr","from","to","sortedData","aVal","bVal","aStr","bStr","paginatedData","startIndex","endIndex","handleSort","field","handleFilterChange","tokens","t","message","toggleColumnSelection","prevSet","current","updated","handleColumnDragStart","index","handleColumnDragEnd","handleColumnDragOver","handleColumnDragLeave","handleColumnDrop","dropIndex","visibleOrder","newColumns","hiddenColumns","columnIds","orderedColumns","SortableHeader","isHeaderRow","isActionColumn","resolvedWidth","isHeaderHovered","setIsHeaderHovered","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","style","CSS","isSorted","isAsc","isFilterable","filterPopoverOpen","hasActiveFilter","showSortBtn","showFilterBtn","GripVertical","ArrowUp","ArrowDown","ArrowUpDown","el","ListFilter","activeColumn","renderColumnRow","isSelected","draggable","isAction","actualIndex","isDragOver","columnDropdownMenu","snapshot","openFilterColumn","filterPopoverNode","Settings2","first","extra","extraValues","X","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","rowIndex","renderValue","hasWidthConstraint","isStringValue","shouldUseTruncatedCell","displayValue","DragOverlay","Pagination"],"mappings":"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"}