chordia-ui 3.3.2 → 3.3.3
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/README.md +4 -0
- package/dist/SmallButton.cjs.js +1 -1
- package/dist/SmallButton.cjs.js.map +1 -1
- package/dist/SmallButton.es.js +170 -162
- package/dist/SmallButton.es.js.map +1 -1
- package/dist/components/chat.cjs.js +8 -8
- package/dist/components/chat.cjs.js.map +1 -1
- package/dist/components/chat.es.js +329 -335
- package/dist/components/chat.es.js.map +1 -1
- package/dist/components/data.cjs.js +1 -1
- package/dist/components/data.cjs.js.map +1 -1
- package/dist/components/data.es.js +83 -80
- package/dist/components/data.es.js.map +1 -1
- package/dist/components/layout.cjs.js +1 -1
- package/dist/components/layout.cjs.js.map +1 -1
- package/dist/components/layout.es.js +3 -1
- package/dist/components/layout.es.js.map +1 -1
- package/dist/index.cjs2.js +1 -1
- package/dist/index.cjs2.js.map +1 -1
- package/dist/index.es2.js +4 -4
- package/dist/index.es2.js.map +1 -1
- package/dist/pages/interactionDetails.cjs.js +2 -2
- package/dist/pages/interactionDetails.cjs.js.map +1 -1
- package/dist/pages/interactionDetails.es.js +117 -123
- package/dist/pages/interactionDetails.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/chat/ChatHistoryPanel.jsx +3 -3
- package/src/components/chat/ChatInterface.jsx +14 -14
- package/src/components/common/MessageThread.jsx +19 -19
- package/src/components/data/DataTable.jsx +18 -15
- package/src/components/layout/SplitPane.jsx +2 -0
- package/src/components/login/LoginPage.jsx +4 -4
- package/src/components/primitives/SmallButton.jsx +14 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.es.js","sources":["../../src/components/data/DataTableFilters.jsx","../../src/components/data/DataTable.jsx","../../src/components/data/SummaryStatsPanel.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, Filter, ArrowUp, ArrowDown } 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// 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({ children }) { return children; }\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 DataTable({ \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 // 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, // Configuration for filters (dateRangePicker, onWeekToDate, exportConfig, filterChipsConfig)\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 = 9;\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 const [filters, setFilters] = useState({});\n // Internal sorting state (only used for client-side sorting)\n const [internalSortField, setInternalSortField] = useState(null);\n const [internalSortDirection, setInternalSortDirection] = useState(\"asc\");\n \n // Sync internal filters when filterChipsConfig.filters changes (when chips are removed)\n// useEffect(() => {\n// if (isServerSideFiltering && filtersConfig?.filterChipsConfig?.filters) {\n// // Sync DataTable's internal filters with parent's filter chips\n// // This ensures input fields clear when chips are removed\n// setFilters(filtersConfig.filterChipsConfig.filters);\n// }\n// }, [filtersConfig?.filterChipsConfig?.filters, isServerSideFiltering]);\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 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 tableRef = useRef(null);\n\n // Helper to get column identifier (id or key)\n const getColumnId = (col) => col.id || col.key;\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 // 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 // Save immediately after drag\n saveColumnsToStorage(reordered);\n return reordered;\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 return data.filter((row) => {\n return Object.keys(filters).every((key) => {\n const filterValue = filters[key];\n if (!filterValue || filterValue.trim() === \"\") return true;\n \n const cellValue = row[key];\n if (cellValue === null || cellValue === undefined) return false;\n \n const cellValueStr = String(cellValue).toLowerCase();\n const filterValueLower = filterValue.toLowerCase().trim();\n \n // Support multiple keywords separated by spaces\n // All keywords must be present in the cell value\n const keywords = filterValueLower.split(/\\s+/).filter(k => k.length > 0);\n \n return keywords.every(keyword => cellValueStr.includes(keyword));\n });\n });\n }, [data, filters, 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 // Handle filter change\n const handleFilterChange = (id, value) => {\n // Remove filter if value is empty, otherwise update it\n const newFilters = value && value.trim() !== \"\"\n ? { ...filters, [id]: value }\n : Object.fromEntries(Object.entries(filters).filter(([key]) => key !== id));\n \n // Update local filter state\n setFilters(newFilters);\n \n // If server-side filtering, notify parent component\n if (isServerSideFiltering && onFilterChange) {\n onFilterChange(newFilters);\n }\n \n // Reset to first page on filter (works for both client and server-side pagination)\n if (onPageChange) {\n onPageChange(1);\n } else {\n setInternalPage(1);\n }\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 {\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: column.width || \"auto\",\n minWidth: column.width || \"auto\",\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: column.width || \"auto\",\n minWidth: column.width || \"auto\",\n }}\n className=\"sticky top-[57px] z-10 bg-[var(--paper-elevated)] 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 bg-[var(--paper)] 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)' }}\n autoComplete=\"off\"\n />\n </div>\n ) : (\n <div className=\"h-[34px]\"></div>\n )}\n </th>\n );\n }\n\n // Header row\n return (\n <th\n ref={setNodeRef}\n style={{\n ...style,\n padding: '12px 14px',\n textAlign: isActionColumn ? 'center' : 'left',\n fontWeight: 650,\n fontSize: '11px',\n letterSpacing: '0.14em',\n textTransform: 'uppercase',\n color: 'rgba(30, 33, 37, 0.62)',\n cursor: column.sortable !== false ? 'pointer' : 'default',\n width: column.width || 'auto',\n borderRight: '1px solid rgba(52, 58, 64, 0.06)',\n userSelect: 'none',\n background: 'rgba(255, 255, 255, 0.95)',\n borderBottom: '1px solid rgba(52, 58, 64, 0.12)',\n position: 'sticky',\n top: 0,\n zIndex: 10,\n fontFamily: 'var(--font-sans)',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n justifyContent: isActionColumn ? 'center' : 'flex-start',\n }}\n >\n {!isActionColumn && (\n <div\n {...attributes}\n {...listeners}\n style={{ cursor: 'grab', color: 'rgba(30, 33, 37, 0.32)' }}\n >\n <GripVertical size={12} />\n </div>\n )}\n <span \n onClick={() => column.sortable !== false && handleSort(columnId)}\n style={{ cursor: column.sortable !== false ? 'pointer' : 'default' }}\n >\n {column.label.toUpperCase()}\n </span>\n {column.sortable !== false && isSorted && (\n <span>\n {isAsc ? <ChevronUp size={12} /> : <ChevronDown size={12} />}\n </span>\n )}\n </div>\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 columnDropdownMenu = isColumnDropdownOpen ? (\n <div\n ref={columnDropdownMenuRef}\n className=\"flex flex-col bg-white overflow-auto z-[49] min-w-[220px]\"\n style={{\n position: \"fixed\",\n top: `${columnDropdownPosition.top}px`,\n left: `${columnDropdownPosition.left}px`,\n width: columnDropdownPosition.width || 220,\n maxHeight: `400px`,\n fontFamily: 'var(--font-sans)',\n borderRadius: '0 0 8px 8px', // Rounded corners only on bottom\n boxShadow: '4px 4px 6px 0px #6D70681A, -4px 0px 6px 0px #6D70681A',\n border: '1px solid rgba(52, 58, 64, 0.12)',\n borderTop: 'none', // No top border to connect seamlessly\n }}\n >\n {/* Render selected columns first, in their current order */}\n {visibleColumns.map((columnId, index) => {\n const col = columns.find(c => getColumnId(c) === columnId);\n if (!col) return null;\n const actualIndex = visibleColumns.indexOf(columnId);\n const isDragging = draggedColumnIndex === actualIndex;\n const isDragOver = dragOverColumnIndex === actualIndex;\n const isAction = columnId === ACTION_COLUMN_ID;\n \n return (\n <React.Fragment key={`selected-${columnId}-${index}`}>\n <div\n draggable={!isAction}\n onDragStart={isAction ? undefined : (e) => handleColumnDragStart(e, actualIndex)}\n onDragEnd={isAction ? undefined : handleColumnDragEnd}\n onDragOver={isAction ? undefined : (e) => handleColumnDragOver(e, actualIndex)}\n onDragLeave={isAction ? undefined : handleColumnDragLeave}\n onDrop={isAction ? undefined : (e) => handleColumnDrop(e, actualIndex)}\n className={`flex items-center gap-2 px-3 py-2 rounded transition-all ${\n isAction ? 'cursor-default opacity-100' : 'cursor-move'\n } ${\n !isAction && isDragging ? 'opacity-50' : ''\n } ${\n !isAction && isDragOver && draggedColumnIndex !== null && draggedColumnIndex !== actualIndex\n ? 'ring-2 ring-green-2 ring-offset-1'\n : ''\n }`}\n >\n {/* Drag icon (hidden for action column) */}\n {!isAction && (\n <svg\n className=\"h-4 w-4 text-gray-600 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 8h16M4 12h16M4 16h16\"\n />\n </svg>\n )}\n {/* Checkbox */}\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!isAction) {\n toggleColumnSelection(columnId);\n }\n }}\n className={`h-4 w-4 rounded-[2px] border flex items-center justify-center transition-colors flex-shrink-0 ${\n isAction\n ? 'bg-green-2 border-green-2 cursor-default'\n : pendingDeselection.has(columnId)\n ? 'bg-white border-gray-300'\n : 'bg-green-2 border-green-2'\n }`}\n >\n {!pendingDeselection.has(columnId) && (\n <svg\n className=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={3}\n style={{ color: '#1E2125' }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n </button>\n {/* Label */}\n <span className=\"text-sm text-gray-900 flex-1\" style={{ fontFamily: 'var(--font-sans)' }}>\n {col.label}\n </span>\n </div>\n {index < visibleColumns.length - 1 && <Separator />}\n </React.Fragment>\n );\n })}\n \n {/* Render unselected columns */}\n {columns\n .filter(col => !visibleColumns.includes(getColumnId(col)))\n .map((col, index) => {\n const columnId = getColumnId(col);\n const isPending = pendingSelection.has(columnId);\n const unselectedIndex = columns.filter(c => !visibleColumns.includes(getColumnId(c))).indexOf(col);\n return (\n <React.Fragment key={`unselected-${columnId}`}>\n {visibleColumns.length > 0 && unselectedIndex === 0 && <Separator />}\n <label\n className=\"flex items-center gap-2 px-3 py-2 hover:bg-gray-50 rounded cursor-pointer transition-colors\"\n onClick={(e) => {\n e.preventDefault();\n toggleColumnSelection(columnId);\n }}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n toggleColumnSelection(columnId);\n }}\n className={`h-4 w-4 rounded-[2px] border flex items-center justify-center transition-colors flex-shrink-0 ${\n isPending ? 'bg-green-2 border-green-2' : 'bg-white border-gray-300'\n }`}\n >\n {isPending && (\n <svg\n className=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={3}\n style={{ color: '#1E2125' }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n </button>\n {/* Label */}\n <span className=\"text-sm text-gray-900 flex-1\">{col.label}</span>\n </label>\n {unselectedIndex < columns.filter(c => !visibleColumns.includes(getColumnId(c))).length - 1 && <Separator />}\n </React.Fragment>\n );\n })}\n </div>\n ) : null;\n\n return (\n <div className=\"w-full\" style={{top:'130px', position: 'sticky', zIndex: 35, backgroundColor: \"#F4F1E6\"}}>\n {/* Column Visibility Dropdown and Filters */}\n {columns.length > 0 && (\n <div \n className=\"pt-2 pb-1\"\n style={{\n position: \"sticky\",\n zIndex: 35,\n backgroundColor: \"#F4F1E6\",\n }}\n >\n <div className=\"flex items-center gap-3 flex-wrap\">\n {/* Select Columns Dropdown */}\n <div className=\"flex-shrink-0\">\n {/* Dropdown Title */}\n <div className=\"mb-1 ml-1.5\">\n <p className=\"text-xs font-medium text-gray-600\" style={{ fontFamily: 'var(--font-sans)' }}>Select Columns</p>\n </div>\n <div\n ref={columnDropdownRef}\n className=\"inline-flex items-center justify-between gap-2 px-4 py-2.5 bg-white/80 cursor-pointer hover:bg-white transition-colors text-sm font-medium text-gray-900 border border-gray-300 min-w-[220px]\"\n onClick={() => setIsColumnDropdownOpen(!isColumnDropdownOpen)}\n style={{ \n fontFamily: 'var(--font-sans)',\n borderRadius: isColumnDropdownOpen ? '8px 8px 0 0' : '8px', // Rounded top corners when open, all corners when closed\n }}\n >\n <span>{displayText}</span>\n {/* <OpenCloseArrow isOpen={isColumnDropdownOpen} iconSize={16} /> */}\n {isColumnDropdownOpen ? <ChevronUp size={16} /> : <ChevronDown size={16} />}\n </div>\n {isColumnDropdownOpen && createPortal(columnDropdownMenu, document.body)}\n </div>\n\n {/* Vertical Line */}\n {filtersConfig && (\n <>\n <div className=\"h-9 mt-[1.5rem] w-px bg-gray-300 flex-shrink-0\"></div>\n <div className=\"flex-shrink-0 mt-[1.5rem]\">\n {/* Filters Component (Export, chips, Add Users, etc.) */}\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 </div>\n </div>\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 className=\"rounded-t-[14px]\" style={{\n border: '1px solid rgba(52, 58, 64, 0.12)',\n borderBottom: 'none',\n overflow: 'hidden',\n background: 'rgba(255, 255, 255, 0.82)',\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: '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 {/* Filter row - only show if there are filterable columns */}\n {hasFilterableColumns && (\n <tr>\n {orderedColumns.map((column) => {\n const columnId = getColumnId(column);\n const isFilterable = column.filterable === true;\n return (\n <th\n key={`filter-${columnId}`}\n style={{\n padding: '8px 14px',\n background: 'rgba(244, 241, 230, 0.35)',\n borderBottom: '1px solid rgba(52, 58, 64, 0.10)',\n position: 'sticky',\n top: '41px',\n zIndex: 10,\n width: column.width || 'auto',\n fontFamily: 'var(--font-sans)',\n }}\n >\n {isFilterable ? (\n <div style={{ position: 'relative' }}>\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 style={{\n width: '100%',\n padding: '4px 8px 4px 26px',\n fontSize: '11.5px',\n border: '1px solid rgba(52, 58, 64, 0.16)',\n borderRadius: '6px',\n background: 'rgba(255, 255, 255, 0.85)',\n color: 'rgba(30, 33, 37, 0.78)',\n outline: 'none',\n fontFamily: 'var(--font-sans)',\n }}\n onFocus={(e) => {\n e.target.style.borderColor = 'rgba(231, 212, 162, 0.65)';\n e.target.style.background = 'rgba(255, 255, 255, 1)';\n }}\n onBlur={(e) => {\n e.target.style.borderColor = 'rgba(52, 58, 64, 0.16)';\n e.target.style.background = 'rgba(255, 255, 255, 0.85)';\n }}\n autoComplete=\"off\"\n />\n <Filter\n size={11}\n style={{\n position: 'absolute',\n left: '8px',\n top: '50%',\n transform: 'translateY(-50%)',\n color: 'rgba(30, 33, 37, 0.42)',\n pointerEvents: 'none'\n }}\n />\n </div>\n ) : (\n <div className=\"h-[34px]\"></div>\n )}\n </th>\n );\n })}\n </tr>\n )}\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 rgba(52, 58, 64, 0.08)',\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 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 = column.width && column.width !== '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: column.width || 'auto',\n fontFamily: 'var(--font-sans)',\n ...(shouldUseTruncatedCell && { maxWidth: column.width || '200px', overflow: 'hidden' }),\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 <div className=\"border-t border-gray-200 bg-white rounded-b-[14px]\">\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={onPageSizeChange ? (newSize) => {\n setPageSize(newSize);\n setPage(1);\n } : (newSize) => {\n setPageSize(newSize);\n setPage(1);\n }}\n showPageSizeSelector={true}\n />\n </div>\n )}\n </div>\n );\n}\n\n","\"use client\";\n\n/**\n * SummaryStatsPanel component\n * Displays key interaction metrics in a compact grid layout.\n * Designed for right or left rails with 2-column default.\n * Optional left accent bar draws attention to specific metrics without judgment.\n */\n\nexport default function SummaryStatsPanel({\n title = 'Summary stats',\n stats = [],\n columns = 2\n}) {\n return (\n <div style={{ fontFamily: 'system-ui, -apple-system, sans-serif' }}>\n {/* Header */}\n <div\n className=\"text-[11px] tracking-[0.14em] uppercase mb-[10px]\"\n style={{ color: 'rgba(30, 33, 37, 0.42)', fontWeight: 650 }}\n >\n {title}\n </div>\n\n {/* Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,\n gap: '10px'\n }}\n >\n {stats.map((stat, i) => (\n <div\n key={i}\n style={{\n position: 'relative',\n border: '1px solid rgba(52, 58, 64, 0.12)',\n borderRadius: '12px',\n background: 'rgba(255, 255, 255, 0.72)',\n padding: stat.accentColor ? '10px 10px 10px 14px' : '10px',\n minHeight: '62px',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n gap: '5px',\n overflow: 'hidden'\n }}\n >\n {/* Optional accent indicator */}\n {stat.accentColor && (\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: '4px',\n background: stat.accentColor,\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px'\n }}\n />\n )}\n\n {/* Label */}\n <div\n className=\"text-[10px] tracking-[0.14em] uppercase\"\n style={{\n color: 'rgba(30, 33, 37, 0.42)',\n fontWeight: 650,\n lineHeight: 1.1,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n {stat.label}\n </div>\n\n {/* Value */}\n <div\n style={{\n fontSize: '13px',\n color: stat.valueStyle === 'muted' \n ? 'rgba(30, 33, 37, 0.56)' \n : 'rgba(30, 33, 37, 0.78)',\n fontWeight: 700,\n lineHeight: 1.15,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontFamily: stat.valueStyle === 'mono' \n ? 'ui-monospace, monospace' \n : 'inherit'\n }}\n >\n {stat.value}\n </div>\n\n {/* Subtext */}\n {stat.subtext && (\n <div\n style={{\n fontSize: '11px',\n color: 'rgba(30, 33, 37, 0.52)',\n lineHeight: 1.15,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n {stat.subtext}\n </div>\n )}\n </div>\n ))}\n </div>\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","Separator","useUserContext","Image","props","HoverBalloon","children","DataTable","data","columns","initialPageSize","onRowClick","totalCount","controlledPage","controlledPageSize","onPageChange","onPageSizeChange","onFilterChange","onMaxColumnsError","onSort","sortFields","tableId","isLoading","filtersConfig","userData","userId","TruncatedCell","React","content","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","useMemo","col","manualChangeFlagKey","useCallback","cols","saved","validColumns","colId","error","setFilters","internalSortField","setInternalSortField","internalSortDirection","setInternalSortDirection","sortFieldFromProps","columnId","sortField","sortDirection","columnOrder","setColumnOrder","enforceActionPosition","result","tableHasActionColumn","id","visibleColumns","setVisibleColumns","savedColumns","initial","isColumnDropdownOpen","setIsColumnDropdownOpen","columnDropdownPosition","setColumnDropdownPosition","pendingSelection","setPendingSelection","pendingDeselection","setPendingDeselection","draggedColumnIndex","setDraggedColumnIndex","dragOverColumnIndex","setDragOverColumnIndex","columnDropdownRef","columnDropdownMenuRef","toastTimeoutRef","activeId","setActiveId","tableRef","getColumnId","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","handleDragEnd","active","over","oldIndex","newIndex","reordered","arrayMove","saveColumnsToStorage","items","handleDragStart","filteredData","row","filterValue","cellValue","cellValueStr","k","keyword","sortedData","a","b","aVal","bVal","aStr","bStr","paginatedData","startIndex","endIndex","handleSort","field","handleFilterChange","newFilters","showMaxColumnsError","message","toggleColumnSelection","prevSet","current","updated","constrained","next","handleColumnDragStart","index","handleColumnDragEnd","handleColumnDragOver","handleColumnDragLeave","handleColumnDrop","dropIndex","visibleOrder","newColumns","hiddenColumns","columnIds","orderedColumns","hasFilterableColumns","updatePosition","rect","displayText","_a","SortableHeader","column","isHeaderRow","isActionColumn","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","style","CSS","isSorted","isAsc","isFilterable","GripVertical","ChevronUp","Filter","e","activeColumn","columnDropdownMenu","c","actualIndex","isDragOver","isAction","isPending","unselectedIndex","createPortal","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","rowIndex","renderValue","hasWidthConstraint","isStringValue","shouldUseTruncatedCell","displayValue","DragOverlay","Pagination","SummaryStatsPanel","title","stats","stat","i"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data.es.js","sources":["../../src/components/data/DataTableFilters.jsx","../../src/components/data/DataTable.jsx","../../src/components/data/SummaryStatsPanel.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, Filter, ArrowUp, ArrowDown } 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// 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({ children }) { return children; }\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 DataTable({ \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 // 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, // Configuration for filters (dateRangePicker, onWeekToDate, exportConfig, filterChipsConfig)\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 = 9;\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 const [filters, setFilters] = useState({});\n // Internal sorting state (only used for client-side sorting)\n const [internalSortField, setInternalSortField] = useState(null);\n const [internalSortDirection, setInternalSortDirection] = useState(\"asc\");\n \n // Sync internal filters when filterChipsConfig.filters changes (when chips are removed)\n// useEffect(() => {\n// if (isServerSideFiltering && filtersConfig?.filterChipsConfig?.filters) {\n// // Sync DataTable's internal filters with parent's filter chips\n// // This ensures input fields clear when chips are removed\n// setFilters(filtersConfig.filterChipsConfig.filters);\n// }\n// }, [filtersConfig?.filterChipsConfig?.filters, isServerSideFiltering]);\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 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 tableRef = useRef(null);\n\n // Helper to get column identifier (id or key)\n const getColumnId = (col) => col.id || col.key;\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 // 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 // Save immediately after drag\n saveColumnsToStorage(reordered);\n return reordered;\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 return data.filter((row) => {\n return Object.keys(filters).every((key) => {\n const filterValue = filters[key];\n if (!filterValue || filterValue.trim() === \"\") return true;\n \n const cellValue = row[key];\n if (cellValue === null || cellValue === undefined) return false;\n \n const cellValueStr = String(cellValue).toLowerCase();\n const filterValueLower = filterValue.toLowerCase().trim();\n \n // Support multiple keywords separated by spaces\n // All keywords must be present in the cell value\n const keywords = filterValueLower.split(/\\s+/).filter(k => k.length > 0);\n \n return keywords.every(keyword => cellValueStr.includes(keyword));\n });\n });\n }, [data, filters, 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 // Handle filter change\n const handleFilterChange = (id, value) => {\n // Remove filter if value is empty, otherwise update it\n const newFilters = value && value.trim() !== \"\"\n ? { ...filters, [id]: value }\n : Object.fromEntries(Object.entries(filters).filter(([key]) => key !== id));\n \n // Update local filter state\n setFilters(newFilters);\n \n // If server-side filtering, notify parent component\n if (isServerSideFiltering && onFilterChange) {\n onFilterChange(newFilters);\n }\n \n // Reset to first page on filter (works for both client and server-side pagination)\n if (onPageChange) {\n onPageChange(1);\n } else {\n setInternalPage(1);\n }\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 {\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: column.width || \"auto\",\n minWidth: column.width || \"auto\",\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: column.width || \"auto\",\n minWidth: column.width || \"auto\",\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 return (\n <th\n ref={setNodeRef}\n style={{\n ...style,\n padding: '12px 14px',\n textAlign: isActionColumn ? 'center' : 'left',\n fontWeight: 650,\n fontSize: '11px',\n letterSpacing: '0.14em',\n textTransform: 'uppercase',\n color: 'rgba(30, 33, 37, 0.62)',\n cursor: column.sortable !== false ? 'pointer' : 'default',\n width: column.width || 'auto',\n borderRight: '1px solid rgba(52, 58, 64, 0.06)',\n userSelect: 'none',\n background: 'var(--primary-foreground)',\n borderBottom: '1px solid rgba(52, 58, 64, 0.12)',\n position: 'sticky',\n top: 0,\n zIndex: 10,\n fontFamily: 'var(--font-sans)',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n justifyContent: isActionColumn ? 'center' : 'flex-start',\n }}\n >\n {!isActionColumn && (\n <div\n {...attributes}\n {...listeners}\n style={{ cursor: 'grab', color: 'rgba(30, 33, 37, 0.32)' }}\n >\n <GripVertical size={12} />\n </div>\n )}\n <span \n onClick={() => column.sortable !== false && handleSort(columnId)}\n style={{ cursor: column.sortable !== false ? 'pointer' : 'default' }}\n >\n {column.label.toUpperCase()}\n </span>\n {column.sortable !== false && isSorted && (\n <span>\n {isAsc ? <ChevronUp size={12} /> : <ChevronDown size={12} />}\n </span>\n )}\n </div>\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 columnDropdownMenu = isColumnDropdownOpen ? (\n <div\n ref={columnDropdownMenuRef}\n className=\"flex flex-col overflow-auto z-[49] min-w-[220px]\"\n style={{\n position: \"fixed\",\n top: `${columnDropdownPosition.top}px`,\n left: `${columnDropdownPosition.left}px`,\n width: columnDropdownPosition.width || 220,\n maxHeight: `400px`,\n fontFamily: 'var(--font-sans)',\n backgroundColor: \"var(--primary-foreground)\",\n borderRadius: '0 0 8px 8px', // Rounded corners only on bottom\n boxShadow: '4px 4px 6px 0px #6D70681A, -4px 0px 6px 0px #6D70681A',\n border: '1px solid rgba(52, 58, 64, 0.12)',\n borderTop: 'none', // No top border to connect seamlessly\n }}\n >\n {/* Render selected columns first, in their current order */}\n {visibleColumns.map((columnId, index) => {\n const col = columns.find(c => getColumnId(c) === columnId);\n if (!col) return null;\n const actualIndex = visibleColumns.indexOf(columnId);\n const isDragging = draggedColumnIndex === actualIndex;\n const isDragOver = dragOverColumnIndex === actualIndex;\n const isAction = columnId === ACTION_COLUMN_ID;\n \n return (\n <React.Fragment key={`selected-${columnId}-${index}`}>\n <div\n draggable={!isAction}\n onDragStart={isAction ? undefined : (e) => handleColumnDragStart(e, actualIndex)}\n onDragEnd={isAction ? undefined : handleColumnDragEnd}\n onDragOver={isAction ? undefined : (e) => handleColumnDragOver(e, actualIndex)}\n onDragLeave={isAction ? undefined : handleColumnDragLeave}\n onDrop={isAction ? undefined : (e) => handleColumnDrop(e, actualIndex)}\n className={`flex items-center gap-2 px-3 py-2 rounded transition-all ${\n isAction ? 'cursor-default opacity-100' : 'cursor-move'\n } ${\n !isAction && isDragging ? 'opacity-50' : ''\n } ${\n !isAction && isDragOver && draggedColumnIndex !== null && draggedColumnIndex !== actualIndex\n ? 'ring-2 ring-green-2 ring-offset-1'\n : ''\n }`}\n >\n {/* Drag icon (hidden for action column) */}\n {!isAction && (\n <svg\n className=\"h-4 w-4 text-gray-600 flex-shrink-0\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 8h16M4 12h16M4 16h16\"\n />\n </svg>\n )}\n {/* Checkbox */}\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (!isAction) {\n toggleColumnSelection(columnId);\n }\n }}\n className={`h-4 w-4 rounded-[2px] border flex items-center justify-center transition-colors flex-shrink-0 ${\n isAction\n ? 'bg-green-2 border-green-2 cursor-default'\n : pendingDeselection.has(columnId)\n ? 'bg-white border-gray-300'\n : 'bg-green-2 border-green-2'\n }`}\n >\n {!pendingDeselection.has(columnId) && (\n <svg\n className=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={3}\n style={{ color: '#1E2125' }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n </button>\n {/* Label */}\n <span className=\"text-sm text-gray-900 flex-1\" style={{ fontFamily: 'var(--font-sans)' }}>\n {col.label}\n </span>\n </div>\n {index < visibleColumns.length - 1 && <Separator />}\n </React.Fragment>\n );\n })}\n \n {/* Render unselected columns */}\n {columns\n .filter(col => !visibleColumns.includes(getColumnId(col)))\n .map((col, index) => {\n const columnId = getColumnId(col);\n const isPending = pendingSelection.has(columnId);\n const unselectedIndex = columns.filter(c => !visibleColumns.includes(getColumnId(c))).indexOf(col);\n return (\n <React.Fragment key={`unselected-${columnId}`}>\n {visibleColumns.length > 0 && unselectedIndex === 0 && <Separator />}\n <label\n className=\"flex items-center gap-2 px-3 py-2 hover:bg-gray-50 rounded cursor-pointer transition-colors\"\n onClick={(e) => {\n e.preventDefault();\n toggleColumnSelection(columnId);\n }}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n toggleColumnSelection(columnId);\n }}\n className={`h-4 w-4 rounded-[2px] border flex items-center justify-center transition-colors flex-shrink-0 ${\n isPending ? 'bg-green-2 border-green-2' : 'bg-white border-gray-300'\n }`}\n >\n {isPending && (\n <svg\n className=\"h-3 w-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n strokeWidth={3}\n style={{ color: '#1E2125' }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n </button>\n {/* Label */}\n <span className=\"text-sm text-gray-900 flex-1\">{col.label}</span>\n </label>\n {unselectedIndex < columns.filter(c => !visibleColumns.includes(getColumnId(c))).length - 1 && <Separator />}\n </React.Fragment>\n );\n })}\n </div>\n ) : null;\n\n return (\n <div className=\"w-full\" style={{top:'130px', position: 'sticky', zIndex: 35, backgroundColor: \"var(--primary-foreground)\"}}>\n {/* Column Visibility Dropdown and Filters */}\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 className=\"flex items-center gap-3 flex-wrap\">\n {/* Select Columns Dropdown */}\n <div className=\"flex-shrink-0\">\n {/* Dropdown Title */}\n <div className=\"mb-1 ml-1.5\">\n <p className=\"text-xs font-medium text-gray-600\" style={{ fontFamily: 'var(--font-sans)' }}>Select Columns</p>\n </div>\n <div\n ref={columnDropdownRef}\n className=\"inline-flex items-center justify-between gap-2 px-4 py-2.5 cursor-pointer transition-colors text-sm font-medium text-gray-900 border border-gray-300 min-w-[220px]\"\n onClick={() => setIsColumnDropdownOpen(!isColumnDropdownOpen)}\n style={{ \n fontFamily: 'var(--font-sans)',\n backgroundColor: \"var(--primary-foreground)\",\n borderRadius: isColumnDropdownOpen ? '8px 8px 0 0' : '8px', // Rounded top corners when open, all corners when closed\n }}\n >\n <span>{displayText}</span>\n {/* <OpenCloseArrow isOpen={isColumnDropdownOpen} iconSize={16} /> */}\n {isColumnDropdownOpen ? <ChevronUp size={16} /> : <ChevronDown size={16} />}\n </div>\n {isColumnDropdownOpen && createPortal(columnDropdownMenu, document.body)}\n </div>\n\n {/* Vertical Line */}\n {filtersConfig && (\n <>\n <div className=\"h-9 mt-[1.5rem] w-px bg-gray-300 flex-shrink-0\"></div>\n <div className=\"flex-shrink-0 mt-[1.5rem]\">\n {/* Filters Component (Export, chips, Add Users, etc.) */}\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 </div>\n </div>\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 className=\"rounded-t-[14px]\" style={{\n border: '1px solid rgba(52, 58, 64, 0.12)',\n borderBottom: '1px solid rgba(52, 58, 64, 0.12)',\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: '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 {/* Filter row - only show if there are filterable columns */}\n {hasFilterableColumns && (\n <tr>\n {orderedColumns.map((column) => {\n const columnId = getColumnId(column);\n const isFilterable = column.filterable === true;\n return (\n <th\n key={`filter-${columnId}`}\n style={{\n padding: '8px 14px',\n background: 'var(--primary-foreground)',\n borderBottom: '1px solid rgba(52, 58, 64, 0.10)',\n position: 'sticky',\n top: '41px',\n zIndex: 10,\n width: column.width || 'auto',\n fontFamily: 'var(--font-sans)',\n }}\n >\n {isFilterable ? (\n <div style={{ position: 'relative' }}>\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 style={{\n width: '100%',\n padding: '4px 8px 4px 26px',\n fontSize: '11.5px',\n border: '1px solid rgba(52, 58, 64, 0.16)',\n borderRadius: '6px',\n background: 'var(--primary-foreground)',\n color: 'rgba(30, 33, 37, 0.78)',\n outline: 'none',\n fontFamily: 'var(--font-sans)',\n }}\n onFocus={(e) => {\n e.target.style.borderColor = 'rgba(231, 212, 162, 0.65)';\n e.target.style.background = 'var(--primary-foreground)';\n }}\n onBlur={(e) => {\n e.target.style.borderColor = 'rgba(52, 58, 64, 0.16)';\n e.target.style.background = 'var(--primary-foreground)';\n }}\n autoComplete=\"off\"\n />\n <Filter\n size={11}\n style={{\n position: 'absolute',\n left: '8px',\n top: '50%',\n transform: 'translateY(-50%)',\n color: 'rgba(30, 33, 37, 0.42)',\n pointerEvents: 'none'\n }}\n />\n </div>\n ) : (\n <div className=\"h-[34px]\"></div>\n )}\n </th>\n );\n })}\n </tr>\n )}\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 rgba(52, 58, 64, 0.08)',\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 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 = column.width && column.width !== '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: column.width || 'auto',\n fontFamily: 'var(--font-sans)',\n ...(shouldUseTruncatedCell && { maxWidth: column.width || '200px', overflow: 'hidden' }),\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 <div className=\"border-t border-gray-200 rounded-b-[14px]\" style={{ backgroundColor: \"var(--primary-foreground)\" }}>\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={onPageSizeChange ? (newSize) => {\n setPageSize(newSize);\n setPage(1);\n } : (newSize) => {\n setPageSize(newSize);\n setPage(1);\n }}\n showPageSizeSelector={true}\n />\n </div>\n )}\n </div>\n );\n}\n\n","\"use client\";\n\n/**\n * SummaryStatsPanel component\n * Displays key interaction metrics in a compact grid layout.\n * Designed for right or left rails with 2-column default.\n * Optional left accent bar draws attention to specific metrics without judgment.\n */\n\nexport default function SummaryStatsPanel({\n title = 'Summary stats',\n stats = [],\n columns = 2\n}) {\n return (\n <div style={{ fontFamily: 'system-ui, -apple-system, sans-serif' }}>\n {/* Header */}\n <div\n className=\"text-[11px] tracking-[0.14em] uppercase mb-[10px]\"\n style={{ color: 'rgba(30, 33, 37, 0.42)', fontWeight: 650 }}\n >\n {title}\n </div>\n\n {/* Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,\n gap: '10px'\n }}\n >\n {stats.map((stat, i) => (\n <div\n key={i}\n style={{\n position: 'relative',\n border: '1px solid rgba(52, 58, 64, 0.12)',\n borderRadius: '12px',\n background: 'rgba(255, 255, 255, 0.72)',\n padding: stat.accentColor ? '10px 10px 10px 14px' : '10px',\n minHeight: '62px',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n gap: '5px',\n overflow: 'hidden'\n }}\n >\n {/* Optional accent indicator */}\n {stat.accentColor && (\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: '4px',\n background: stat.accentColor,\n borderTopLeftRadius: '12px',\n borderBottomLeftRadius: '12px'\n }}\n />\n )}\n\n {/* Label */}\n <div\n className=\"text-[10px] tracking-[0.14em] uppercase\"\n style={{\n color: 'rgba(30, 33, 37, 0.42)',\n fontWeight: 650,\n lineHeight: 1.1,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n {stat.label}\n </div>\n\n {/* Value */}\n <div\n style={{\n fontSize: '13px',\n color: stat.valueStyle === 'muted' \n ? 'rgba(30, 33, 37, 0.56)' \n : 'rgba(30, 33, 37, 0.78)',\n fontWeight: 700,\n lineHeight: 1.15,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n fontFamily: stat.valueStyle === 'mono' \n ? 'ui-monospace, monospace' \n : 'inherit'\n }}\n >\n {stat.value}\n </div>\n\n {/* Subtext */}\n {stat.subtext && (\n <div\n style={{\n fontSize: '11px',\n color: 'rgba(30, 33, 37, 0.52)',\n lineHeight: 1.15,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n {stat.subtext}\n </div>\n )}\n </div>\n ))}\n </div>\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","Separator","useUserContext","Image","props","HoverBalloon","children","DataTable","data","columns","initialPageSize","onRowClick","totalCount","controlledPage","controlledPageSize","onPageChange","onPageSizeChange","onFilterChange","onMaxColumnsError","onSort","sortFields","tableId","isLoading","filtersConfig","userData","userId","TruncatedCell","React","content","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","useMemo","col","manualChangeFlagKey","useCallback","cols","saved","validColumns","colId","error","setFilters","internalSortField","setInternalSortField","internalSortDirection","setInternalSortDirection","sortFieldFromProps","columnId","sortField","sortDirection","columnOrder","setColumnOrder","enforceActionPosition","result","tableHasActionColumn","id","visibleColumns","setVisibleColumns","savedColumns","initial","isColumnDropdownOpen","setIsColumnDropdownOpen","columnDropdownPosition","setColumnDropdownPosition","pendingSelection","setPendingSelection","pendingDeselection","setPendingDeselection","draggedColumnIndex","setDraggedColumnIndex","dragOverColumnIndex","setDragOverColumnIndex","columnDropdownRef","columnDropdownMenuRef","toastTimeoutRef","activeId","setActiveId","tableRef","getColumnId","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","handleDragEnd","active","over","oldIndex","newIndex","reordered","arrayMove","saveColumnsToStorage","items","handleDragStart","filteredData","row","filterValue","cellValue","cellValueStr","k","keyword","sortedData","a","b","aVal","bVal","aStr","bStr","paginatedData","startIndex","endIndex","handleSort","field","handleFilterChange","newFilters","showMaxColumnsError","message","toggleColumnSelection","prevSet","current","updated","constrained","next","handleColumnDragStart","index","handleColumnDragEnd","handleColumnDragOver","handleColumnDragLeave","handleColumnDrop","dropIndex","visibleOrder","newColumns","hiddenColumns","columnIds","orderedColumns","hasFilterableColumns","updatePosition","rect","displayText","_a","SortableHeader","column","isHeaderRow","isActionColumn","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","style","CSS","isSorted","isAsc","isFilterable","GripVertical","ChevronUp","Filter","e","activeColumn","columnDropdownMenu","c","actualIndex","isDragOver","isAction","isPending","unselectedIndex","createPortal","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","rowIndex","renderValue","hasWidthConstraint","isStringValue","shouldUseTruncatedCell","displayValue","DragOverlay","Pagination","SummaryStatsPanel","title","stats","stat","i"],"mappings":"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"}
|