lite-table-js 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/utils.js","../src/hooks/useSorting.js","../src/hooks/useFilters.js","../src/hooks/usePagination.js","../src/hooks/useSelection.js","../src/hooks/useColumnManager.js","../src/hooks/usePersistence.js","../src/hooks/usePresets.js","../src/themes.js","../src/hooks/useTheme.js","../src/hooks/useVirtualization.js","../src/hooks/useRowGrouping.js","../src/hooks/useTreeData.js","../src/hooks/useEditing.js","../src/hooks/useChartConfig.js","../src/hooks/useDataTable.js","../src/exportUtils.js","../src/components/Toolbar.jsx","../src/components/BulkActions.jsx","../src/components/ColumnFilter.jsx","../src/components/FloatingFilterRow.jsx","../src/components/DataTableHeader.jsx","../src/components/CellTooltip.jsx","../src/components/TableCell.jsx","../src/components/PortalDropdown.jsx","../src/components/DataTableRow.jsx","../src/components/GroupRow.jsx","../src/components/TableView.jsx","../src/components/GridView.jsx","../src/components/ListView.jsx","../src/components/DataTablePagination.jsx","../src/components/SidebarPanel.jsx","../src/components/PresetManager.jsx","../src/components/ContextMenu.jsx","../src/components/StatusBar.jsx","../src/hooks/useChartData.js","../src/components/DataChart.jsx","../src/components/ChartPanel.jsx","../src/components/ChartBuilderModal.jsx","../src/components/DataTable.jsx","../src/plugins.js"],"sourcesContent":["// ─── Nested Data Access ───────────────────────────────────────────────\r\n\r\n/**\r\n * @param {Object} obj\r\n * @param {string} path\r\n * @returns {*}\r\n */\r\nexport function getNestedValue(obj, path) {\r\n return path.split('.').reduce((acc, part) => acc?.[part], obj);\r\n}\r\n\r\n/**\r\n * @param {*} row\r\n * @param {*} column\r\n * @returns {*}\r\n */\r\nexport function getCellValue(row, column) {\r\n if (column.accessorFn) return column.accessorFn(row);\r\n if (column.accessorKey) return getNestedValue(row, column.accessorKey);\r\n return undefined;\r\n}\r\n\r\n// ─── Row Key Extraction ───────────────────────────────────────────────\r\n\r\n/**\r\n * @param {*} row\r\n * @param {string | Function | undefined} rowKey\r\n * @param {number} index\r\n * @returns {string}\r\n */\r\nexport function getRowKey(row, rowKey, index) {\r\n if (typeof rowKey === 'function') return rowKey(row);\r\n if (typeof rowKey === 'string') return String(getNestedValue(row, rowKey));\r\n if (row.id !== undefined) return String(row.id);\r\n if (row._id !== undefined) return String(row._id);\r\n if (row.key !== undefined) return String(row.key);\r\n return String(index);\r\n}\r\n\r\n// ─── Sorting ──────────────────────────────────────────────────────────\r\n\r\n/**\r\n * @param {Array} data\r\n * @param {Array} sorts\r\n * @param {Array} columns\r\n * @returns {Array}\r\n */\r\nexport function sortData(data, sorts, columns) {\r\n if (!sorts.length) return data;\r\n\r\n const sorted = [...data];\r\n sorted.sort((a, b) => {\r\n for (const sort of sorts) {\r\n if (!sort.direction) continue;\r\n const col = columns.find((c) => c.id === sort.columnId);\r\n if (!col) continue;\r\n\r\n if (col.sortFn) {\r\n const result = col.sortFn(a, b, sort.direction);\r\n if (result !== 0) return result;\r\n continue;\r\n }\r\n\r\n const valA = getCellValue(a, col);\r\n const valB = getCellValue(b, col);\r\n const result = compareValues(valA, valB);\r\n if (result !== 0) return sort.direction === 'asc' ? result : -result;\r\n }\r\n return 0;\r\n });\r\n\r\n return sorted;\r\n}\r\n\r\n/** @param {*} a @param {*} b @returns {number} */\r\nfunction compareValues(a, b) {\r\n if (a == null && b == null) return 0;\r\n if (a == null) return -1;\r\n if (b == null) return 1;\r\n if (typeof a === 'string' && typeof b === 'string') {\r\n return a.localeCompare(b, undefined, { sensitivity: 'base' });\r\n }\r\n if (typeof a === 'number' && typeof b === 'number') return a - b;\r\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\r\n return String(a).localeCompare(String(b));\r\n}\r\n\r\n// ─── Filtering ────────────────────────────────────────────────────────\r\n\r\n/**\r\n * @param {Array} data\r\n * @param {Array} filters\r\n * @param {string} globalSearch\r\n * @param {Array} columns\r\n * @returns {Array}\r\n */\r\nexport function filterData(data, filters, globalSearch, columns) {\r\n let result = data;\r\n\r\n if (globalSearch.trim()) {\r\n const search = globalSearch.toLowerCase();\r\n result = result.filter((row) =>\r\n columns.some((col) => {\r\n const val = getCellValue(row, col);\r\n return val != null && String(val).toLowerCase().includes(search);\r\n })\r\n );\r\n }\r\n\r\n for (const filter of filters) {\r\n const col = columns.find((c) => c.id === filter.columnId);\r\n if (!col) continue;\r\n result = result.filter((row) => {\r\n const val = getCellValue(row, col);\r\n return matchFilter(val, filter);\r\n });\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction matchFilter(value, filter) {\r\n const { value: filterVal, operator = 'contains' } = filter;\r\n if (filterVal == null || filterVal === '' || (Array.isArray(filterVal) && !filterVal.length)) {\r\n return true;\r\n }\r\n if (Array.isArray(filterVal)) {\r\n return filterVal.includes(value);\r\n }\r\n const strVal = String(value ?? '').toLowerCase();\r\n const strFilter = String(filterVal).toLowerCase();\r\n\r\n switch (operator) {\r\n case 'eq': return value === filterVal;\r\n case 'neq': return value !== filterVal;\r\n case 'gt': return Number(value) > Number(filterVal);\r\n case 'gte': return Number(value) >= Number(filterVal);\r\n case 'lt': return Number(value) < Number(filterVal);\r\n case 'lte': return Number(value) <= Number(filterVal);\r\n case 'contains': return strVal.includes(strFilter);\r\n case 'startsWith': return strVal.startsWith(strFilter);\r\n case 'endsWith': return strVal.endsWith(strFilter);\r\n default: return strVal.includes(strFilter);\r\n }\r\n}\r\n\r\n// ─── Pagination ───────────────────────────────────────────────────────\r\n\r\nexport function paginateData(data, page, pageSize) {\r\n const start = (page - 1) * pageSize;\r\n return data.slice(start, start + pageSize);\r\n}\r\n\r\n// ─── Grouping ─────────────────────────────────────────────────────────\r\n\r\nexport function groupData(data, groupBy) {\r\n const groups = new Map();\r\n for (const row of data) {\r\n const key = getNestedValue(row, groupBy);\r\n const group = groups.get(key) ?? [];\r\n group.push(row);\r\n groups.set(key, group);\r\n }\r\n return groups;\r\n}\r\n\r\n// ─── Export ───────────────────────────────────────────────────────────\r\n\r\nexport function exportToCSV(data, columns, filename = 'export') {\r\n const headers = columns.map((c) => c.header);\r\n const rows = data.map((row) =>\r\n columns.map((col) => {\r\n const val = getCellValue(row, col);\r\n const str = String(val ?? '');\r\n return str.includes(',') || str.includes('\"') || str.includes('\\n')\r\n ? `\"${str.replace(/\"/g, '\"\"')}\"`\r\n : str;\r\n })\r\n );\r\n const csv = [headers.join(','), ...rows.map((r) => r.join(','))].join('\\n');\r\n downloadFile(csv, `${filename}.csv`, 'text/csv');\r\n}\r\n\r\nexport function exportToJSON(data, filename = 'export') {\r\n const json = JSON.stringify(data, null, 2);\r\n downloadFile(json, `${filename}.json`, 'application/json');\r\n}\r\n\r\nfunction downloadFile(content, filename, mimeType) {\r\n const blob = new Blob([content], { type: mimeType });\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\nexport function handleExport(format, data, columns, onExport) {\r\n if (onExport) {\r\n onExport(format, data);\r\n return;\r\n }\r\n switch (format) {\r\n case 'csv':\r\n exportToCSV(data, columns);\r\n break;\r\n case 'excel':\r\n exportToCSV(data, columns, 'export');\r\n break;\r\n case 'pdf':\r\n console.warn('PDF export requires a custom onExport handler');\r\n break;\r\n }\r\n}\r\n\r\n// ─── Column Helpers ───────────────────────────────────────────────────\r\n\r\nexport function reorderArray(arr, fromIndex, toIndex) {\r\n const result = [...arr];\r\n const [removed] = result.splice(fromIndex, 1);\r\n result.splice(toIndex, 0, removed);\r\n return result;\r\n}\r\n\r\nexport function clamp(value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport { sortData } from '../utils.js';\r\n\r\nexport function useSorting({ config, columns }) {\r\n const [internalSort, setInternalSort] = useState(config?.defaultSort ?? []);\r\n\r\n const isControlled = config?.sort !== undefined;\r\n const sorting = isControlled ? config.sort : internalSort;\r\n\r\n const toggleSort = useCallback(\r\n (columnId) => {\r\n const col = columns.find((c) => c.id === columnId);\r\n if (!col?.sortable) return;\r\n\r\n const existing = sorting.find((s) => s.columnId === columnId);\r\n let next;\r\n\r\n if (!existing) {\r\n const newSort = { columnId, direction: 'asc' };\r\n next = config?.multi ? [...sorting, newSort] : [newSort];\r\n } else if (existing.direction === 'asc') {\r\n next = sorting.map((s) =>\r\n s.columnId === columnId ? { ...s, direction: 'desc' } : s\r\n );\r\n } else {\r\n next = sorting.filter((s) => s.columnId !== columnId);\r\n }\r\n\r\n if (isControlled) {\r\n config?.onSortChange?.(next);\r\n } else {\r\n setInternalSort(next);\r\n }\r\n },\r\n [sorting, columns, config, isControlled]\r\n );\r\n\r\n const getSortDirection = useCallback(\r\n (columnId) => sorting.find((s) => s.columnId === columnId)?.direction ?? null,\r\n [sorting]\r\n );\r\n\r\n const setSorting = useCallback(\r\n (next) => {\r\n if (isControlled) { config?.onSortChange?.(next); } else { setInternalSort(next); }\r\n },\r\n [config, isControlled]\r\n );\r\n\r\n const applySorting = useCallback(\r\n (data) => sortData(data, sorting, columns),\r\n [sorting, columns]\r\n );\r\n\r\n return useMemo(\r\n () => ({ sorting, toggleSort, getSortDirection, setSorting, applySorting }),\r\n [sorting, toggleSort, getSortDirection, setSorting, applySorting]\r\n );\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport { filterData } from '../utils.js';\r\n\r\nexport function useFilters({ config, columns }) {\r\n const [internalFilters, setInternalFilters] = useState([]);\r\n const [internalSearch, setInternalSearch] = useState('');\r\n const [presets, setPresets] = useState(config?.presets ?? []);\r\n\r\n const isFilterControlled = config?.filters !== undefined;\r\n const isSearchControlled = config?.globalSearch !== undefined;\r\n\r\n const filters = isFilterControlled ? config.filters : internalFilters;\r\n const globalSearch = isSearchControlled ? config.globalSearch : internalSearch;\r\n\r\n const setFilter = useCallback(\r\n (columnId, value, operator) => {\r\n const next = filters.filter((f) => f.columnId !== columnId);\r\n if (value !== '' && value != null && !(Array.isArray(value) && !value.length)) {\r\n next.push({ columnId, value, operator });\r\n }\r\n if (isFilterControlled) { config?.onFilterChange?.(next); } else { setInternalFilters(next); }\r\n },\r\n [filters, config, isFilterControlled]\r\n );\r\n\r\n const setFilters = useCallback(\r\n (next) => {\r\n if (isFilterControlled) { config?.onFilterChange?.(next); } else { setInternalFilters(next); }\r\n },\r\n [config, isFilterControlled]\r\n );\r\n\r\n const clearFilters = useCallback(() => {\r\n if (isFilterControlled) { config?.onFilterChange?.([]); } else { setInternalFilters([]); }\r\n if (isSearchControlled) { config?.onGlobalSearchChange?.(''); } else { setInternalSearch(''); }\r\n }, [config, isFilterControlled, isSearchControlled]);\r\n\r\n const setGlobalSearch = useCallback(\r\n (value) => {\r\n if (isSearchControlled) { config?.onGlobalSearchChange?.(value); } else { setInternalSearch(value); }\r\n },\r\n [config, isSearchControlled]\r\n );\r\n\r\n const getFilterValue = useCallback(\r\n (columnId) => filters.find((f) => f.columnId === columnId)?.value ?? '',\r\n [filters]\r\n );\r\n\r\n const applyFilters = useCallback(\r\n (data) => filterData(data, filters, globalSearch, columns),\r\n [filters, globalSearch, columns]\r\n );\r\n\r\n const savePreset = useCallback(\r\n (name) => {\r\n const preset = { id: `preset_${Date.now()}`, name, filters: [...filters], globalSearch };\r\n setPresets((prev) => [...prev, preset]);\r\n config?.onPresetSave?.(preset);\r\n return preset;\r\n },\r\n [filters, globalSearch, config]\r\n );\r\n\r\n const loadPreset = useCallback(\r\n (preset) => {\r\n if (isFilterControlled) { config?.onFilterChange?.(preset.filters); } else { setInternalFilters(preset.filters); }\r\n if (preset.globalSearch !== undefined) { setGlobalSearch(preset.globalSearch); }\r\n },\r\n [config, isFilterControlled, setGlobalSearch]\r\n );\r\n\r\n const deletePreset = useCallback(\r\n (presetId) => {\r\n setPresets((prev) => prev.filter((p) => p.id !== presetId));\r\n config?.onPresetDelete?.(presetId);\r\n },\r\n [config]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n filters, globalSearch, setFilter, setFilters, clearFilters, setGlobalSearch,\r\n getFilterValue, applyFilters, presets, savePreset, loadPreset, deletePreset,\r\n }),\r\n [filters, globalSearch, setFilter, setFilters, clearFilters, setGlobalSearch,\r\n getFilterValue, applyFilters, presets, savePreset, loadPreset, deletePreset]\r\n );\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport { paginateData } from '../utils.js';\r\n\r\nexport function usePagination({ config, totalItems }) {\r\n const [internalPage, setInternalPage] = useState(1);\r\n const [internalPageSize, setInternalPageSize] = useState(config?.pageSize ?? 10);\r\n\r\n const isPageControlled = config?.page !== undefined;\r\n const isPageSizeControlled = config?.onPageSizeChange !== undefined && config?.pageSize !== undefined;\r\n\r\n const page = isPageControlled ? config.page : internalPage;\r\n const pageSize = isPageSizeControlled ? config.pageSize : internalPageSize;\r\n const pageSizeOptions = config?.pageSizeOptions ?? [10, 25, 50, 100];\r\n\r\n const total = config?.totalItems ?? totalItems;\r\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\r\n\r\n const setPage = useCallback(\r\n (p) => {\r\n const clamped = Math.max(1, Math.min(p, totalPages));\r\n if (isPageControlled) { config?.onPageChange?.(clamped); } else { setInternalPage(clamped); }\r\n },\r\n [totalPages, config, isPageControlled]\r\n );\r\n\r\n const setPageSize = useCallback(\r\n (size) => {\r\n setInternalPageSize(size);\r\n config?.onPageSizeChange?.(size);\r\n if (isPageControlled) { config?.onPageChange?.(1); } else { setInternalPage(1); }\r\n },\r\n [config, isPageControlled]\r\n );\r\n\r\n const applyPagination = useCallback(\r\n (data) => paginateData(data, page, pageSize),\r\n [page, pageSize]\r\n );\r\n\r\n const effectivePage = page > totalPages ? 1 : page;\r\n\r\n return useMemo(\r\n () => ({\r\n page: effectivePage, pageSize, totalPages, totalItems: total, pageSizeOptions,\r\n setPage, setPageSize, applyPagination,\r\n isInfinite: config?.infinite ?? false, hasMore: config?.hasMore ?? false, onLoadMore: config?.onLoadMore,\r\n }),\r\n [effectivePage, pageSize, totalPages, total, pageSizeOptions, setPage, setPageSize, applyPagination, config]\r\n );\r\n}\r\n","import { useState, useCallback, useMemo, useRef } from 'react';\r\nimport { getRowKey } from '../utils.js';\r\n\r\nexport function useSelection({ config, data }) {\r\n const [internalKeys, setInternalKeys] = useState([]);\r\n const lastClickedRef = useRef(null);\r\n\r\n const mode = config?.mode ?? 'none';\r\n const isControlled = config?.selectedKeys !== undefined;\r\n const selectedKeys = isControlled ? config.selectedKeys : internalKeys;\r\n\r\n const getKey = useCallback(\r\n (row, index) => getRowKey(row, config?.rowKey, index),\r\n [config?.rowKey]\r\n );\r\n\r\n const updateSelection = useCallback(\r\n (keys) => {\r\n const rows = data.filter((row, i) => keys.includes(getKey(row, i)));\r\n if (isControlled) { config?.onSelectionChange?.(keys, rows); }\r\n else { setInternalKeys(keys); config?.onSelectionChange?.(keys, rows); }\r\n },\r\n [data, getKey, config, isControlled]\r\n );\r\n\r\n const toggleRow = useCallback(\r\n (rowKey) => {\r\n if (mode === 'none') return;\r\n if (mode === 'single') {\r\n updateSelection(selectedKeys.includes(rowKey) ? [] : [rowKey]);\r\n } else {\r\n const next = selectedKeys.includes(rowKey)\r\n ? selectedKeys.filter((k) => k !== rowKey) : [...selectedKeys, rowKey];\r\n updateSelection(next);\r\n }\r\n lastClickedRef.current = rowKey;\r\n },\r\n [mode, selectedKeys, updateSelection]\r\n );\r\n\r\n const selectRange = useCallback(\r\n (targetKey, pageData) => {\r\n if (mode !== 'multiple') { toggleRow(targetKey); return; }\r\n const lastKey = lastClickedRef.current;\r\n if (!lastKey) { toggleRow(targetKey); return; }\r\n const pageKeys = pageData.map((row, i) => getKey(row, i));\r\n const fromIdx = pageKeys.indexOf(lastKey);\r\n const toIdx = pageKeys.indexOf(targetKey);\r\n if (fromIdx === -1 || toIdx === -1) { toggleRow(targetKey); return; }\r\n const start = Math.min(fromIdx, toIdx);\r\n const end = Math.max(fromIdx, toIdx);\r\n const rangeKeys = pageKeys.slice(start, end + 1);\r\n updateSelection([...new Set([...selectedKeys, ...rangeKeys])]);\r\n lastClickedRef.current = targetKey;\r\n },\r\n [mode, selectedKeys, getKey, updateSelection, toggleRow]\r\n );\r\n\r\n const toggleAll = useCallback(\r\n (pageData) => {\r\n if (mode !== 'multiple') return;\r\n const pageKeys = pageData.map((row, i) => getKey(row, i));\r\n const allSelected = pageKeys.every((k) => selectedKeys.includes(k));\r\n if (allSelected) { updateSelection(selectedKeys.filter((k) => !pageKeys.includes(k))); }\r\n else { updateSelection([...new Set([...selectedKeys, ...pageKeys])]); }\r\n },\r\n [mode, selectedKeys, getKey, updateSelection]\r\n );\r\n\r\n const isSelected = useCallback((rowKey) => selectedKeys.includes(rowKey), [selectedKeys]);\r\n\r\n const isAllSelected = useCallback(\r\n (pageData) => {\r\n if (!pageData.length) return false;\r\n return pageData.every((row, i) => selectedKeys.includes(getKey(row, i)));\r\n },\r\n [selectedKeys, getKey]\r\n );\r\n\r\n const isSomeSelected = useCallback(\r\n (pageData) => {\r\n if (!pageData.length) return false;\r\n const pageKeys = pageData.map((row, i) => getKey(row, i));\r\n return pageKeys.some((k) => selectedKeys.includes(k)) && !pageKeys.every((k) => selectedKeys.includes(k));\r\n },\r\n [selectedKeys, getKey]\r\n );\r\n\r\n const clearSelection = useCallback(() => { updateSelection([]); lastClickedRef.current = null; }, [updateSelection]);\r\n\r\n const selectedRows = useMemo(\r\n () => data.filter((row, i) => selectedKeys.includes(getKey(row, i))),\r\n [data, selectedKeys, getKey]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n mode, selectedKeys, selectedRows, toggleRow, selectRange, toggleAll,\r\n isSelected, isAllSelected, isSomeSelected, clearSelection, getKey,\r\n showCheckbox: config?.showCheckbox ?? mode !== 'none',\r\n }),\r\n [mode, selectedKeys, selectedRows, toggleRow, selectRange, toggleAll, isSelected, isAllSelected, isSomeSelected, clearSelection, getKey, config]\r\n );\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport { reorderArray, clamp } from '../utils.js';\r\n\r\nexport function useColumnManager({ columns, enableVisibility = false, enableResizing = false, enableReordering = false }) {\r\n const [hiddenColumns, setHiddenColumns] = useState(() => {\r\n const hidden = new Set();\r\n columns.forEach((col) => { if (col.visible === false) hidden.add(col.id); });\r\n return hidden;\r\n });\r\n\r\n const [columnOrder, setColumnOrder] = useState(() => columns.map((c) => c.id));\r\n\r\n const [columnWidths, setColumnWidths] = useState(() => {\r\n const widths = {};\r\n columns.forEach((col) => { if (col.width) widths[col.id] = col.width; });\r\n return widths;\r\n });\r\n\r\n const toggleColumnVisibility = useCallback(\r\n (columnId) => {\r\n if (!enableVisibility) return;\r\n setHiddenColumns((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(columnId)) next.delete(columnId); else next.add(columnId);\r\n return next;\r\n });\r\n },\r\n [enableVisibility]\r\n );\r\n\r\n const reorderColumns = useCallback(\r\n (fromIndex, toIndex) => { if (enableReordering) setColumnOrder((prev) => reorderArray(prev, fromIndex, toIndex)); },\r\n [enableReordering]\r\n );\r\n\r\n const reorderColumnsById = useCallback(\r\n (fromId, toId) => {\r\n if (!enableReordering || fromId === toId) return;\r\n setColumnOrder((prev) => {\r\n const fromIdx = prev.indexOf(fromId);\r\n const toIdx = prev.indexOf(toId);\r\n if (fromIdx === -1 || toIdx === -1) return prev;\r\n return reorderArray(prev, fromIdx, toIdx);\r\n });\r\n },\r\n [enableReordering]\r\n );\r\n\r\n const resizeColumn = useCallback(\r\n (columnId, width) => {\r\n if (!enableResizing) return;\r\n const col = columns.find((c) => c.id === columnId);\r\n const min = col?.minWidth ?? 50;\r\n const max = col?.maxWidth ?? 1000;\r\n setColumnWidths((prev) => ({ ...prev, [columnId]: clamp(width, min, max) }));\r\n },\r\n [enableResizing, columns]\r\n );\r\n\r\n const visibleColumns = useMemo(() => {\r\n const ordered = columnOrder\r\n .map((id) => columns.find((c) => c.id === id))\r\n .filter((c) => c != null && !hiddenColumns.has(c.id));\r\n const orderedIds = new Set(columnOrder);\r\n const extras = columns.filter((c) => !orderedIds.has(c.id) && !hiddenColumns.has(c.id));\r\n return [...ordered, ...extras];\r\n }, [columns, columnOrder, hiddenColumns]);\r\n\r\n const pinnedLeft = useMemo(() => visibleColumns.filter((c) => c.pin === 'left'), [visibleColumns]);\r\n const pinnedRight = useMemo(() => visibleColumns.filter((c) => c.pin === 'right'), [visibleColumns]);\r\n const unpinned = useMemo(() => visibleColumns.filter((c) => !c.pin), [visibleColumns]);\r\n\r\n const setHiddenColumnIds = useCallback((ids) => setHiddenColumns(new Set(ids)), []);\r\n const setColumnOrderIds = useCallback((ids) => setColumnOrder(ids), []);\r\n const setColumnWidthMap = useCallback((widths) => setColumnWidths(widths), []);\r\n\r\n return useMemo(\r\n () => ({\r\n visibleColumns, pinnedLeft, pinnedRight, unpinned, hiddenColumns, columnOrder, columnWidths,\r\n toggleColumnVisibility, reorderColumns, reorderColumnsById, resizeColumn,\r\n setHiddenColumnIds, setColumnOrderIds, setColumnWidthMap,\r\n enableVisibility, enableResizing, enableReordering, allColumns: columns,\r\n }),\r\n [visibleColumns, pinnedLeft, pinnedRight, unpinned, hiddenColumns, columnOrder, columnWidths,\r\n toggleColumnVisibility, reorderColumns, reorderColumnsById, resizeColumn,\r\n setHiddenColumnIds, setColumnOrderIds, setColumnWidthMap,\r\n enableVisibility, enableResizing, enableReordering, columns]\r\n );\r\n}\r\n","import { useEffect, useCallback } from 'react';\r\n\r\nexport function usePersistence({ persistKey, syncUrl, state, onRestore }) {\r\n const saveToStorage = useCallback(() => {\r\n if (!persistKey) return;\r\n try {\r\n const serialized = {\r\n sorting: state.sorting, filters: state.filters, globalSearch: state.globalSearch,\r\n page: state.page, pageSize: state.pageSize, viewMode: state.viewMode,\r\n hiddenColumns: Array.from(state.hiddenColumns), columnOrder: state.columnOrder,\r\n };\r\n localStorage.setItem(`datatable_${persistKey}`, JSON.stringify(serialized));\r\n } catch { /* Storage full or unavailable */ }\r\n }, [persistKey, state]);\r\n\r\n const loadFromStorage = useCallback(() => {\r\n if (!persistKey) return null;\r\n try {\r\n const raw = localStorage.getItem(`datatable_${persistKey}`);\r\n if (!raw) return null;\r\n const parsed = JSON.parse(raw);\r\n return {\r\n ...parsed,\r\n hiddenColumns: parsed.hiddenColumns ? new Set(parsed.hiddenColumns) : undefined,\r\n };\r\n } catch { return null; }\r\n }, [persistKey]);\r\n\r\n const syncToUrl = useCallback(() => {\r\n if (!syncUrl) return;\r\n const params = new URLSearchParams();\r\n if (state.page > 1) params.set('page', String(state.page));\r\n if (state.pageSize !== 10) params.set('pageSize', String(state.pageSize));\r\n if (state.globalSearch) params.set('q', state.globalSearch);\r\n if (state.sorting.length) params.set('sort', JSON.stringify(state.sorting));\r\n if (state.filters.length) params.set('filters', JSON.stringify(state.filters));\r\n if (state.viewMode !== 'table') params.set('view', state.viewMode);\r\n const search = params.toString();\r\n const newUrl = search ? `${window.location.pathname}?${search}` : window.location.pathname;\r\n window.history.replaceState(null, '', newUrl);\r\n }, [syncUrl, state]);\r\n\r\n const loadFromUrl = useCallback(() => {\r\n if (!syncUrl) return null;\r\n try {\r\n const params = new URLSearchParams(window.location.search);\r\n const result = {};\r\n const page = params.get('page'); if (page) result.page = Number(page);\r\n const pageSize = params.get('pageSize'); if (pageSize) result.pageSize = Number(pageSize);\r\n const q = params.get('q'); if (q) result.globalSearch = q;\r\n const sort = params.get('sort'); if (sort) result.sorting = JSON.parse(sort);\r\n const filters = params.get('filters'); if (filters) result.filters = JSON.parse(filters);\r\n const view = params.get('view'); if (view) result.viewMode = view;\r\n return Object.keys(result).length ? result : null;\r\n } catch { return null; }\r\n }, [syncUrl]);\r\n\r\n useEffect(() => { saveToStorage(); syncToUrl(); }, [saveToStorage, syncToUrl]);\r\n\r\n useEffect(() => {\r\n const urlState = loadFromUrl();\r\n const storageState = loadFromStorage();\r\n const restored = { ...storageState, ...urlState };\r\n if (Object.keys(restored).length) onRestore?.(restored);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return { saveToStorage, loadFromStorage, syncToUrl, loadFromUrl };\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\n\r\nconst STORAGE_PREFIX = 'datatable_presets_';\r\n\r\nfunction getStorageKey(tableId) { return `${STORAGE_PREFIX}${tableId}`; }\r\n\r\nfunction loadPresetsFromStorage(tableId) {\r\n try { const raw = localStorage.getItem(getStorageKey(tableId)); return raw ? JSON.parse(raw) : []; }\r\n catch { return []; }\r\n}\r\n\r\nfunction savePresetsToStorage(tableId, presets) {\r\n try { localStorage.setItem(getStorageKey(tableId), JSON.stringify(presets)); } catch { /* */ }\r\n}\r\n\r\nexport function usePresets({ tableId }) {\r\n const [presets, setPresets] = useState(() => loadPresetsFromStorage(tableId));\r\n\r\n const savePreset = useCallback((name, config) => {\r\n const now = Date.now();\r\n const preset = { id: `preset_${now}_${Math.random().toString(36).slice(2, 8)}`, name, config, createdAt: now, updatedAt: now };\r\n setPresets((prev) => { const next = [...prev, preset]; savePresetsToStorage(tableId, next); return next; });\r\n return preset;\r\n }, [tableId]);\r\n\r\n const loadPreset = useCallback((name) => {\r\n const preset = presets.find((p) => p.name === name);\r\n return preset?.config ?? null;\r\n }, [presets]);\r\n\r\n const loadPresetById = useCallback((id) => {\r\n const preset = presets.find((p) => p.id === id);\r\n return preset?.config ?? null;\r\n }, [presets]);\r\n\r\n const updatePreset = useCallback((id, config) => {\r\n setPresets((prev) => {\r\n const next = prev.map((p) => p.id === id ? { ...p, config: { ...p.config, ...config }, updatedAt: Date.now() } : p);\r\n savePresetsToStorage(tableId, next); return next;\r\n });\r\n }, [tableId]);\r\n\r\n const deletePreset = useCallback((id) => {\r\n setPresets((prev) => { const next = prev.filter((p) => p.id !== id); savePresetsToStorage(tableId, next); return next; });\r\n }, [tableId]);\r\n\r\n const renamePreset = useCallback((id, name) => {\r\n setPresets((prev) => {\r\n const next = prev.map((p) => p.id === id ? { ...p, name, updatedAt: Date.now() } : p);\r\n savePresetsToStorage(tableId, next); return next;\r\n });\r\n }, [tableId]);\r\n\r\n const clearAllPresets = useCallback(() => { setPresets([]); savePresetsToStorage(tableId, []); }, [tableId]);\r\n\r\n return useMemo(\r\n () => ({ presets, savePreset, loadPreset, loadPresetById, updatePreset, deletePreset, renamePreset, clearAllPresets }),\r\n [presets, savePreset, loadPreset, loadPresetById, updatePreset, deletePreset, renamePreset, clearAllPresets]\r\n );\r\n}\r\n","// ─── Color Palettes ───────────────────────────────────────────────────\r\n\r\nconst LIGHT_COLORS = {\r\n background: '#ffffff', foreground: '#111827', primary: '#2563eb', primaryLight: '#eff6ff',\r\n border: '#e5e7eb', muted: '#f3f4f6', hover: '#f9fafb', selected: '#eff6ff',\r\n surface: '#f9fafb', textSecondary: '#6b7280',\r\n};\r\n\r\nconst DARK_COLORS = {\r\n background: '#111827', foreground: '#f3f4f6', primary: '#3b82f6', primaryLight: '#1e3a5f',\r\n border: '#374151', muted: '#1f2937', hover: '#1f2937', selected: '#1e3a5f',\r\n surface: '#1f2937', textSecondary: '#9ca3af',\r\n};\r\n\r\nconst QUARTZ_COLORS = {\r\n background: '#ffffff', foreground: '#1e1b4b', primary: '#7c3aed', primaryLight: '#ede9fe',\r\n border: '#ddd6fe', muted: '#f5f3ff', hover: '#f5f3ff', selected: '#ede9fe',\r\n surface: '#f8f7ff', textSecondary: '#6d28d9',\r\n};\r\n\r\nconst ALPINE_COLORS = {\r\n background: '#ffffff', foreground: '#1a1a2e', primary: '#0f766e', primaryLight: '#f0fdfa',\r\n border: '#e2e8f0', muted: '#f8fafc', hover: '#f1f5f9', selected: '#f0fdfa',\r\n surface: '#f8fafc', textSecondary: '#64748b',\r\n};\r\n\r\nconst DEFAULT_TYPOGRAPHY = {\r\n fontFamily: 'inherit', fontSize: '0.875rem', headerFontSize: '0.75rem', headerFontWeight: 600,\r\n};\r\n\r\nconst DEFAULT_SPACING = {\r\n cellPaddingX: '1rem', cellPaddingY: '0.5rem', compactCellPaddingY: '0.25rem', rowHeight: '2.5rem',\r\n};\r\n\r\nfunction colorsToVars(colors) {\r\n return {\r\n '--dt-bg': colors.background, '--dt-surface': colors.surface, '--dt-border': colors.border,\r\n '--dt-text': colors.foreground, '--dt-text-secondary': colors.textSecondary,\r\n '--dt-brand': colors.primary, '--dt-brand-light': colors.primaryLight,\r\n '--dt-hover': colors.hover, '--dt-selected': colors.selected, '--dt-muted': colors.muted,\r\n };\r\n}\r\n\r\nfunction buildTheme(name, colors, typography = DEFAULT_TYPOGRAPHY, spacing = DEFAULT_SPACING, extra) {\r\n return {\r\n name, colors, typography, spacing,\r\n header: {\r\n backgroundColor: colors.surface, color: colors.textSecondary,\r\n borderBottom: `1px solid ${colors.border}`, fontWeight: typography.headerFontWeight,\r\n fontSize: typography.headerFontSize, textTransform: 'uppercase', letterSpacing: '0.05em',\r\n },\r\n row: {\r\n backgroundColor: colors.background, color: colors.foreground,\r\n borderBottom: `1px solid ${colors.muted}`, fontFamily: typography.fontFamily, fontSize: typography.fontSize,\r\n },\r\n cell: { padding: `${spacing.cellPaddingY} ${spacing.cellPaddingX}`, fontSize: typography.fontSize },\r\n selectedRow: { backgroundColor: colors.selected },\r\n hoverRow: { backgroundColor: colors.hover },\r\n stripedRow: { backgroundColor: colors.muted },\r\n toolbar: { backgroundColor: colors.background, borderBottom: `1px solid ${colors.border}` },\r\n pagination: { backgroundColor: colors.background, borderTop: `1px solid ${colors.border}` },\r\n tooltip: {\r\n backgroundColor: colors.foreground, color: colors.background, padding: '0.375rem 0.625rem',\r\n borderRadius: '0.375rem', fontSize: '0.75rem', boxShadow: '0 4px 6px -1px rgba(0,0,0,0.1)',\r\n },\r\n cssVariables: colorsToVars(colors),\r\n ...extra,\r\n };\r\n}\r\n\r\n// ─── Built-in Themes ──────────────────────────────────────────────────\r\n\r\nexport const lightTheme = buildTheme('light', LIGHT_COLORS);\r\nexport const darkTheme = buildTheme('dark', DARK_COLORS);\r\nexport const quartzTheme = buildTheme('quartz', QUARTZ_COLORS);\r\nexport const alpineTheme = buildTheme('alpine', ALPINE_COLORS, {\r\n ...DEFAULT_TYPOGRAPHY, fontFamily: \"'Inter', system-ui, sans-serif\", headerFontWeight: 700,\r\n}, { ...DEFAULT_SPACING, cellPaddingY: '0.625rem' });\r\n\r\nexport const builtInThemes = { light: lightTheme, dark: darkTheme, quartz: quartzTheme, alpine: alpineTheme };\r\n\r\n/**\r\n * Deep-merge overrides onto a base theme.\r\n * @param {Object} base\r\n * @param {Object} overrides\r\n * @returns {Object}\r\n */\r\nexport function createTheme(base, overrides) {\r\n const mergedColors = base.colors && overrides.colors\r\n ? { ...base.colors, ...overrides.colors } : overrides.colors ?? base.colors;\r\n const mergedTypography = base.typography && overrides.typography\r\n ? { ...base.typography, ...overrides.typography } : overrides.typography ?? base.typography;\r\n const mergedSpacing = base.spacing && overrides.spacing\r\n ? { ...base.spacing, ...overrides.spacing } : overrides.spacing ?? base.spacing;\r\n\r\n return {\r\n ...base, ...overrides,\r\n colors: mergedColors, typography: mergedTypography, spacing: mergedSpacing,\r\n header: { ...base.header, ...overrides.header },\r\n row: { ...base.row, ...overrides.row },\r\n cell: { ...base.cell, ...overrides.cell },\r\n selectedRow: { ...base.selectedRow, ...overrides.selectedRow },\r\n hoverRow: { ...base.hoverRow, ...overrides.hoverRow },\r\n stripedRow: { ...base.stripedRow, ...overrides.stripedRow },\r\n toolbar: { ...base.toolbar, ...overrides.toolbar },\r\n pagination: { ...base.pagination, ...overrides.pagination },\r\n tooltip: { ...base.tooltip, ...overrides.tooltip },\r\n cssVariables: { ...base.cssVariables, ...overrides.cssVariables },\r\n conditionalRules: [...(base.conditionalRules ?? []), ...(overrides.conditionalRules ?? [])],\r\n rowRules: [...(base.rowRules ?? []), ...(overrides.rowRules ?? [])],\r\n };\r\n}\r\n","import { useMemo, useState, useCallback } from 'react';\r\nimport { builtInThemes } from '../themes.js';\r\n\r\nconst STORAGE_KEY_PREFIX = 'datatable_theme_';\r\n\r\nexport function useTheme({ themeConfig, persistKey }) {\r\n const [activeThemeName, setActiveThemeName] = useState(() => {\r\n if (persistKey) {\r\n try { return localStorage.getItem(`${STORAGE_KEY_PREFIX}${persistKey}`) ?? themeConfig?.name ?? 'light'; }\r\n catch { /* ignore */ }\r\n }\r\n return themeConfig?.name ?? 'light';\r\n });\r\n\r\n const switchTheme = useCallback((name) => {\r\n setActiveThemeName(name);\r\n if (persistKey) { try { localStorage.setItem(`${STORAGE_KEY_PREFIX}${persistKey}`, name); } catch { /* */ } }\r\n }, [persistKey]);\r\n\r\n const resolvedTheme = useMemo(() => {\r\n if (themeConfig) return themeConfig;\r\n return builtInThemes[activeThemeName] ?? builtInThemes.light;\r\n }, [themeConfig, activeThemeName]);\r\n\r\n const cssVarStyle = useMemo(() => resolvedTheme?.cssVariables ?? undefined, [resolvedTheme]);\r\n\r\n const getRowStyle = useMemo(() => {\r\n return (row, rowIndex, isSelected, isStriped) => {\r\n let style = { ...resolvedTheme.row };\r\n if (isSelected && resolvedTheme.selectedRow) style = { ...style, ...resolvedTheme.selectedRow };\r\n else if (isStriped && rowIndex % 2 === 1 && resolvedTheme.stripedRow) style = { ...style, ...resolvedTheme.stripedRow };\r\n if (resolvedTheme.conditionalRules) {\r\n for (const rule of resolvedTheme.conditionalRules) { if (rule.condition(row) && rule.style) style = { ...style, ...rule.style }; }\r\n }\r\n if (resolvedTheme.rowRules) {\r\n for (const rule of resolvedTheme.rowRules) { if (rule.condition(row) && rule.style) style = { ...style, ...rule.style }; }\r\n }\r\n return style;\r\n };\r\n }, [resolvedTheme]);\r\n\r\n const getCellStyle = useMemo(() => {\r\n return (row, column) => {\r\n let style = { ...resolvedTheme.cell };\r\n if (resolvedTheme.conditionalRules) {\r\n for (const rule of resolvedTheme.conditionalRules) { if (rule.condition(row, column) && rule.style) style = { ...style, ...rule.style }; }\r\n }\r\n return style;\r\n };\r\n }, [resolvedTheme]);\r\n\r\n const getHeaderStyle = useMemo(() => () => ({ ...resolvedTheme.header }), [resolvedTheme]);\r\n\r\n const getConditionalClassName = useMemo(() => {\r\n const hasRules = resolvedTheme.conditionalRules?.length || resolvedTheme.rowRules?.length;\r\n if (!hasRules) return () => '';\r\n return (row, column) => {\r\n const classes = [];\r\n if (resolvedTheme.conditionalRules) {\r\n for (const rule of resolvedTheme.conditionalRules) { if (rule.condition(row, column) && rule.className) classes.push(rule.className); }\r\n }\r\n if (!column && resolvedTheme.rowRules) {\r\n for (const rule of resolvedTheme.rowRules) { if (rule.condition(row) && rule.className) classes.push(rule.className); }\r\n }\r\n return classes.join(' ');\r\n };\r\n }, [resolvedTheme]);\r\n\r\n return useMemo(\r\n () => ({\r\n themeConfig: resolvedTheme, activeThemeName, switchTheme, cssVarStyle,\r\n headerStyle: resolvedTheme.header, toolbarStyle: resolvedTheme.toolbar,\r\n paginationStyle: resolvedTheme.pagination, tooltipStyle: resolvedTheme.tooltip,\r\n getRowStyle, getCellStyle, getHeaderStyle, getConditionalClassName,\r\n }),\r\n [resolvedTheme, activeThemeName, switchTheme, cssVarStyle, getRowStyle, getCellStyle, getHeaderStyle, getConditionalClassName]\r\n );\r\n}\r\n","import { useState, useCallback, useRef, useMemo, useEffect } from 'react';\r\n\r\nexport function useVirtualization({ totalItems, config }) {\r\n const enabled = config?.enabled ?? false;\r\n const rowHeight = config?.rowHeight ?? 40;\r\n const overscan = config?.overscan ?? 5;\r\n\r\n const containerRef = useRef(null);\r\n const [scrollTop, setScrollTop] = useState(0);\r\n const [containerHeight, setContainerHeight] = useState(0);\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n const el = containerRef.current;\r\n if (!el) return;\r\n const observer = new ResizeObserver((entries) => {\r\n for (const entry of entries) setContainerHeight(entry.contentRect.height);\r\n });\r\n observer.observe(el);\r\n setContainerHeight(el.clientHeight);\r\n return () => observer.disconnect();\r\n }, [enabled]);\r\n\r\n const handleScroll = useCallback(() => {\r\n if (!enabled || !containerRef.current) return;\r\n setScrollTop(containerRef.current.scrollTop);\r\n }, [enabled]);\r\n\r\n const virtualRange = useMemo(() => {\r\n if (!enabled) return { startIndex: 0, endIndex: totalItems, offsetTop: 0, totalHeight: 0, visibleCount: totalItems };\r\n const totalHeight = totalItems * rowHeight;\r\n const visibleCount = Math.ceil(containerHeight / rowHeight);\r\n const startIndex = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);\r\n const endIndex = Math.min(totalItems, startIndex + visibleCount + overscan * 2);\r\n const offsetTop = startIndex * rowHeight;\r\n return { startIndex, endIndex, offsetTop, totalHeight, visibleCount };\r\n }, [enabled, totalItems, rowHeight, containerHeight, scrollTop, overscan]);\r\n\r\n const getVirtualItems = useCallback(\r\n (data) => { if (!enabled) return data; return data.slice(virtualRange.startIndex, virtualRange.endIndex); },\r\n [enabled, virtualRange]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n enabled, containerRef, handleScroll, virtualRange, getVirtualItems, rowHeight,\r\n spacerStyle: enabled ? { height: virtualRange.totalHeight, position: 'relative' } : undefined,\r\n offsetStyle: enabled ? { transform: `translateY(${virtualRange.offsetTop}px)` } : undefined,\r\n }),\r\n [enabled, handleScroll, virtualRange, getVirtualItems, rowHeight]\r\n );\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport { getNestedValue, getCellValue } from '../utils.js';\r\n\r\nfunction computeAggregate(values, type) {\r\n if (!values.length) return null;\r\n switch (type) {\r\n case 'sum': return values.reduce((a, b) => Number(a) + Number(b), 0);\r\n case 'avg': return values.reduce((a, b) => Number(a) + Number(b), 0) / values.length;\r\n case 'count': return values.length;\r\n case 'min': return Math.min(...values.map(Number));\r\n case 'max': return Math.max(...values.map(Number));\r\n case 'first': return values[0];\r\n case 'last': return values[values.length - 1];\r\n default: return values.length;\r\n }\r\n}\r\n\r\nexport function useRowGrouping({ config, columns }) {\r\n const [expandedGroups, setExpandedGroups] = useState(() => {\r\n if (config?.defaultExpanded) return new Set(['__all__']);\r\n return new Set();\r\n });\r\n\r\n const isGroupExpanded = useCallback(\r\n (groupKey) => expandedGroups.has('__all__') || expandedGroups.has(groupKey),\r\n [expandedGroups]\r\n );\r\n\r\n const toggleGroup = useCallback((groupKey) => {\r\n setExpandedGroups((prev) => {\r\n const next = new Set(prev);\r\n if (next.has('__all__')) { next.delete('__all__'); next.delete(groupKey); return next; }\r\n if (next.has(groupKey)) next.delete(groupKey); else next.add(groupKey);\r\n return next;\r\n });\r\n }, []);\r\n\r\n const expandAllGroups = useCallback(() => setExpandedGroups(new Set(['__all__'])), []);\r\n const collapseAllGroups = useCallback(() => setExpandedGroups(new Set()), []);\r\n\r\n const applyGrouping = useCallback(\r\n (data) => {\r\n if (!config?.groupBy?.length) return data;\r\n const groupByFields = config.groupBy;\r\n const aggregations = config.aggregations ?? {};\r\n\r\n function buildGroups(rows, level, parentKey) {\r\n if (level >= groupByFields.length) return rows;\r\n const field = groupByFields[level];\r\n const groups = new Map();\r\n for (const row of rows) {\r\n const val = getNestedValue(row, field);\r\n const key = val ?? '__null__';\r\n if (!groups.has(key)) groups.set(key, []);\r\n groups.get(key).push(row);\r\n }\r\n const result = [];\r\n for (const [groupValue, groupRows] of groups) {\r\n const groupKey = `${parentKey}${field}:${groupValue}`;\r\n const aggregates = {};\r\n for (const [colId, aggType] of Object.entries(aggregations)) {\r\n const col = columns.find((c) => c.id === colId);\r\n if (col) {\r\n const values = groupRows.map((r) => getCellValue(r, col));\r\n aggregates[colId] = computeAggregate(values, aggType);\r\n }\r\n }\r\n result.push({\r\n __isGroupRow: true, __groupKey: groupKey, __groupValue: groupValue,\r\n __groupField: field, __level: level, __children: groupRows, __aggregates: aggregates,\r\n });\r\n if (isGroupExpanded(groupKey)) result.push(...buildGroups(groupRows, level + 1, `${groupKey}/`));\r\n }\r\n return result;\r\n }\r\n return buildGroups(data, 0, '');\r\n },\r\n [config, columns, isGroupExpanded]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n enabled: !!config?.groupBy?.length, expandedGroups, isGroupExpanded,\r\n toggleGroup, expandAllGroups, collapseAllGroups, applyGrouping,\r\n }),\r\n [config, expandedGroups, isGroupExpanded, toggleGroup, expandAllGroups, collapseAllGroups, applyGrouping]\r\n );\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport { getNestedValue } from '../utils.js';\r\n\r\nexport function useTreeData({ config, rowKey }) {\r\n const [expandedNodes, setExpandedNodes] = useState(() => {\r\n if (config?.defaultExpanded) return new Set(['__all__']);\r\n return new Set();\r\n });\r\n\r\n const getKey = useCallback(\r\n (row, index) => {\r\n if (typeof rowKey === 'function') return rowKey(row);\r\n if (typeof rowKey === 'string') return String(getNestedValue(row, rowKey));\r\n if (row.id !== undefined) return String(row.id);\r\n return String(index);\r\n },\r\n [rowKey]\r\n );\r\n\r\n const isNodeExpanded = useCallback(\r\n (key) => expandedNodes.has('__all__') || expandedNodes.has(key),\r\n [expandedNodes]\r\n );\r\n\r\n const toggleNode = useCallback((key) => {\r\n setExpandedNodes((prev) => {\r\n const next = new Set(prev);\r\n if (next.has('__all__')) { next.delete('__all__'); next.delete(key); return next; }\r\n if (next.has(key)) next.delete(key); else next.add(key);\r\n return next;\r\n });\r\n }, []);\r\n\r\n const flattenTree = useCallback(\r\n (data) => {\r\n if (!config) return data.map((row, i) => ({ row, level: 0, hasChildren: false, isExpanded: false, treeKey: getKey(row, i) }));\r\n const childrenField = config.childrenField;\r\n const result = [];\r\n function walk(rows, level, parentIndex) {\r\n rows.forEach((row, i) => {\r\n const key = getKey(row, parentIndex + i);\r\n const children = getNestedValue(row, childrenField);\r\n const hasChildren = Array.isArray(children) && children.length > 0;\r\n const isExpanded = hasChildren && isNodeExpanded(key);\r\n result.push({ row, level, hasChildren, isExpanded, treeKey: key });\r\n if (isExpanded && children) walk(children, level + 1, result.length);\r\n });\r\n }\r\n walk(data, 0, 0);\r\n return result;\r\n },\r\n [config, getKey, isNodeExpanded]\r\n );\r\n\r\n const indentSize = config?.indentSize ?? 24;\r\n\r\n return useMemo(\r\n () => ({ enabled: !!config, flattenTree, toggleNode, isNodeExpanded, expandedNodes, indentSize }),\r\n [config, flattenTree, toggleNode, isNodeExpanded, expandedNodes, indentSize]\r\n );\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport { getCellValue } from '../utils.js';\r\n\r\nexport function useEditing({ config, columns, data, getKey }) {\r\n const [editingCell, setEditingCell] = useState(null);\r\n const [editingRowKey, setEditingRowKey] = useState(null);\r\n const [pendingEdits, setPendingEdits] = useState({});\r\n const [validationErrors, setValidationErrors] = useState({});\r\n\r\n const startCellEdit = useCallback((rowKey, columnId) => setEditingCell({ rowKey, columnId }), []);\r\n\r\n const saveCellEdit = useCallback(\r\n (rowKey, columnId, value) => {\r\n const col = columns.find((c) => c.id === columnId);\r\n const row = data.find((r, i) => getKey(r, i) === rowKey);\r\n const rule = col?.validation ?? config?.validation?.[columnId];\r\n if (rule && row && col) {\r\n const error = rule.validate(value, row, col);\r\n if (error) { setValidationErrors((prev) => ({ ...prev, [columnId]: error })); return error; }\r\n }\r\n setValidationErrors((prev) => { const next = { ...prev }; delete next[columnId]; return next; });\r\n setEditingCell(null);\r\n return null;\r\n },\r\n [columns, data, getKey, config?.validation]\r\n );\r\n\r\n const cancelCellEdit = useCallback(() => { setEditingCell(null); setValidationErrors({}); }, []);\r\n\r\n const startRowEdit = useCallback(\r\n (rowKey) => {\r\n if (!config?.enabled) return;\r\n const row = data.find((r, i) => getKey(r, i) === rowKey);\r\n if (!row) return;\r\n const initial = {};\r\n columns.forEach((col) => { if (col.editable) initial[col.id] = getCellValue(row, col); });\r\n setEditingRowKey(rowKey); setPendingEdits(initial); setValidationErrors({});\r\n },\r\n [config?.enabled, data, getKey, columns]\r\n );\r\n\r\n const updatePendingEdit = useCallback((columnId, value) => {\r\n setPendingEdits((prev) => ({ ...prev, [columnId]: value }));\r\n setValidationErrors((prev) => { if (!prev[columnId]) return prev; const next = { ...prev }; delete next[columnId]; return next; });\r\n }, []);\r\n\r\n const validateRow = useCallback(() => {\r\n if (!editingRowKey) return false;\r\n const row = data.find((r, i) => getKey(r, i) === editingRowKey);\r\n if (!row) return false;\r\n const errors = {};\r\n columns.forEach((col) => {\r\n if (!col.editable) return;\r\n const rule = col.validation ?? config?.validation?.[col.id];\r\n if (!rule) return;\r\n const error = rule.validate(pendingEdits[col.id], row, col);\r\n if (error) errors[col.id] = error;\r\n });\r\n setValidationErrors(errors);\r\n return Object.keys(errors).length === 0;\r\n }, [editingRowKey, data, getKey, columns, config?.validation, pendingEdits]);\r\n\r\n const saveRowEdit = useCallback(async () => {\r\n if (!editingRowKey || !config?.onSave) return false;\r\n if (!validateRow()) return false;\r\n await config.onSave(editingRowKey, pendingEdits);\r\n setEditingRowKey(null); setPendingEdits({}); setValidationErrors({});\r\n return true;\r\n }, [editingRowKey, config, validateRow, pendingEdits]);\r\n\r\n const cancelRowEdit = useCallback(() => {\r\n config?.onCancel?.(editingRowKey ?? '');\r\n setEditingRowKey(null); setPendingEdits({}); setValidationErrors({});\r\n }, [config, editingRowKey]);\r\n\r\n const isEditingRow = useCallback((rowKey) => editingRowKey === rowKey, [editingRowKey]);\r\n const getCellError = useCallback((columnId) => validationErrors[columnId] ?? null, [validationErrors]);\r\n\r\n return useMemo(\r\n () => ({\r\n editingCell, startCellEdit, saveCellEdit, cancelCellEdit,\r\n editingRowKey, pendingEdits, validationErrors,\r\n startRowEdit, updatePendingEdit, validateRow, saveRowEdit, cancelRowEdit,\r\n isEditingRow, getCellError,\r\n }),\r\n [editingCell, startCellEdit, saveCellEdit, cancelCellEdit,\r\n editingRowKey, pendingEdits, validationErrors,\r\n startRowEdit, updatePendingEdit, validateRow, saveRowEdit, cancelRowEdit,\r\n isEditingRow, getCellError]\r\n );\r\n}\r\n","import { useState, useCallback, useMemo } from 'react';\r\n\r\nconst STORAGE_PREFIX = 'datatable_charts_';\r\n\r\nfunction loadCharts(tableId) {\r\n try { const raw = localStorage.getItem(`${STORAGE_PREFIX}${tableId}`); return raw ? JSON.parse(raw) : []; }\r\n catch { return []; }\r\n}\r\n\r\nfunction saveCharts(tableId, charts) {\r\n try { localStorage.setItem(`${STORAGE_PREFIX}${tableId}`, JSON.stringify(charts)); } catch { /* */ }\r\n}\r\n\r\nexport function useChartConfig({ tableId } = {}) {\r\n const storageKey = tableId ?? '__default__';\r\n const [charts, setCharts] = useState(() => loadCharts(storageKey));\r\n const [builderOpen, setBuilderOpen] = useState(false);\r\n const [editingChartId, setEditingChartId] = useState(null);\r\n\r\n const addChart = useCallback((config) => {\r\n const instance = { id: `chart_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`, config: { ...config, id: undefined }, createdAt: Date.now() };\r\n setCharts((prev) => { const next = [...prev, instance]; saveCharts(storageKey, next); return next; });\r\n return instance;\r\n }, [storageKey]);\r\n\r\n const updateChart = useCallback((id, config) => {\r\n setCharts((prev) => { const next = prev.map((c) => c.id === id ? { ...c, config: { ...c.config, ...config } } : c); saveCharts(storageKey, next); return next; });\r\n }, [storageKey]);\r\n\r\n const removeChart = useCallback((id) => {\r\n setCharts((prev) => { const next = prev.filter((c) => c.id !== id); saveCharts(storageKey, next); return next; });\r\n }, [storageKey]);\r\n\r\n const clearCharts = useCallback(() => { setCharts([]); saveCharts(storageKey, []); }, [storageKey]);\r\n\r\n const openBuilder = useCallback((chartId) => { setEditingChartId(chartId ?? null); setBuilderOpen(true); }, []);\r\n const closeBuilder = useCallback(() => { setBuilderOpen(false); setEditingChartId(null); }, []);\r\n\r\n const editingChart = useMemo(\r\n () => editingChartId ? charts.find((c) => c.id === editingChartId) ?? null : null,\r\n [editingChartId, charts]\r\n );\r\n\r\n return useMemo(\r\n () => ({ charts, addChart, updateChart, removeChart, clearCharts, builderOpen, openBuilder, closeBuilder, editingChart, editingChartId }),\r\n [charts, addChart, updateChart, removeChart, clearCharts, builderOpen, openBuilder, closeBuilder, editingChart, editingChartId]\r\n );\r\n}\r\n","import { useState, useMemo, useCallback, useEffect } from 'react';\r\nimport { useSorting } from './useSorting.js';\r\nimport { useFilters } from './useFilters.js';\r\nimport { usePagination } from './usePagination.js';\r\nimport { useSelection } from './useSelection.js';\r\nimport { useColumnManager } from './useColumnManager.js';\r\nimport { usePersistence } from './usePersistence.js';\r\nimport { usePresets } from './usePresets.js';\r\nimport { useTheme } from './useTheme.js';\r\nimport { useVirtualization } from './useVirtualization.js';\r\nimport { useRowGrouping } from './useRowGrouping.js';\r\nimport { useTreeData } from './useTreeData.js';\r\nimport { useEditing } from './useEditing.js';\r\nimport { useChartConfig } from './useChartConfig.js';\r\nimport { getRowKey } from '../utils.js';\r\n\r\nexport function useDataTable(props) {\r\n const {\r\n data, columns, mode = 'client', serverSide, loading: externalLoading = false,\r\n sorting: sortConfig, filtering: filterConfig, pagination: paginationConfig,\r\n selection: selectionConfig, expandable, plugins = [],\r\n viewMode: controlledViewMode, onViewModeChange,\r\n columnVisibility = false, columnResizing = false, columnReordering = false,\r\n persistKey, syncUrl, themeConfig,\r\n rowGrouping: rowGroupingConfig, treeData: treeDataConfig,\r\n rowPinning: rowPinningConfig, virtualization: virtualizationConfig,\r\n rowEditing: rowEditConfig,\r\n } = props;\r\n\r\n const [internalViewMode, setInternalViewMode] = useState(controlledViewMode ?? 'table');\r\n const viewMode = controlledViewMode ?? internalViewMode;\r\n const setViewMode = useCallback((m) => {\r\n if (onViewModeChange) onViewModeChange(m); else setInternalViewMode(m);\r\n }, [onViewModeChange]);\r\n\r\n const [internalExpanded, setInternalExpanded] = useState([]);\r\n const expandedKeys = expandable?.expandedKeys ?? internalExpanded;\r\n const toggleExpand = useCallback((rowKey) => {\r\n const next = expandedKeys.includes(rowKey) ? expandedKeys.filter((k) => k !== rowKey) : [...expandedKeys, rowKey];\r\n if (expandable?.onExpandChange) expandable.onExpandChange(next); else setInternalExpanded(next);\r\n }, [expandedKeys, expandable]);\r\n\r\n const getKey = useCallback((row, index) => getRowKey(row, selectionConfig?.rowKey, index), [selectionConfig?.rowKey]);\r\n const editing = useEditing({ config: rowEditConfig, columns, data, getKey });\r\n const editingCell = editing.editingCell;\r\n const setEditingCell = editing.startCellEdit;\r\n\r\n const columnManager = useColumnManager({ columns, enableVisibility: columnVisibility, enableResizing: columnResizing, enableReordering: columnReordering });\r\n const sorting = useSorting({ config: sortConfig, columns });\r\n const filtering = useFilters({ config: filterConfig, columns });\r\n const theme = useTheme({ themeConfig });\r\n const rowGrouping = useRowGrouping({ config: rowGroupingConfig, columns });\r\n const treeData = useTreeData({ config: treeDataConfig, rowKey: selectionConfig?.rowKey });\r\n const presets = usePresets({ tableId: persistKey ?? '__default__' });\r\n const chartConfig = useChartConfig({ tableId: persistKey });\r\n\r\n const [pinnedTop, setPinnedTop] = useState(rowPinningConfig?.pinnedTop ?? []);\r\n const [pinnedBottom, setPinnedBottom] = useState(rowPinningConfig?.pinnedBottom ?? []);\r\n\r\n const pinRow = useCallback((rowKey, position) => {\r\n setPinnedTop((prev) => prev.filter((k) => k !== rowKey));\r\n setPinnedBottom((prev) => prev.filter((k) => k !== rowKey));\r\n if (position === 'top') setPinnedTop((prev) => [...prev, rowKey]);\r\n if (position === 'bottom') setPinnedBottom((prev) => [...prev, rowKey]);\r\n rowPinningConfig?.onPinChange?.(\r\n position === 'top' ? [...pinnedTop, rowKey] : pinnedTop.filter((k) => k !== rowKey),\r\n position === 'bottom' ? [...pinnedBottom, rowKey] : pinnedBottom.filter((k) => k !== rowKey)\r\n );\r\n }, [pinnedTop, pinnedBottom, rowPinningConfig]);\r\n\r\n const [serverData, setServerData] = useState([]);\r\n const [serverTotal, setServerTotal] = useState(0);\r\n const [serverLoading, setServerLoading] = useState(false);\r\n\r\n const filteredData = useMemo(() => mode === 'server' ? serverData : filtering.applyFilters(data), [mode, data, serverData, filtering]);\r\n const sortedData = useMemo(() => mode === 'server' ? filteredData : sorting.applySorting(filteredData), [mode, filteredData, sorting]);\r\n\r\n const pluginProcessedData = useMemo(() => {\r\n let result = sortedData;\r\n for (const plugin of plugins) { if (plugin.processData) result = plugin.processData(result, state); }\r\n return result;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [sortedData, plugins]);\r\n\r\n const totalItems = mode === 'server' ? serverTotal : pluginProcessedData.length;\r\n const pagination = usePagination({ config: paginationConfig, totalItems });\r\n\r\n const paginatedData = useMemo(() => {\r\n if (mode === 'server') return pluginProcessedData;\r\n if (pagination.isInfinite) return pluginProcessedData;\r\n return pagination.applyPagination(pluginProcessedData);\r\n }, [mode, pluginProcessedData, pagination]);\r\n\r\n const virtualization = useVirtualization({ totalItems: paginatedData.length, config: virtualizationConfig });\r\n const selection = useSelection({ config: selectionConfig, data });\r\n\r\n useEffect(() => {\r\n if (mode !== 'server' || !serverSide?.onFetch) return;\r\n let cancelled = false;\r\n setServerLoading(true);\r\n serverSide.onFetch({\r\n page: pagination.page, pageSize: pagination.pageSize,\r\n sort: sorting.sorting, filters: filtering.filters, globalSearch: filtering.globalSearch,\r\n }).then((result) => {\r\n if (!cancelled) { setServerData(result.data); setServerTotal(result.totalItems); }\r\n }).finally(() => { if (!cancelled) setServerLoading(false); });\r\n return () => { cancelled = true; };\r\n }, [mode, serverSide, pagination.page, pagination.pageSize, sorting.sorting, filtering.filters, filtering.globalSearch]);\r\n\r\n const state = useMemo(() => ({\r\n data, processedData: paginatedData, columns, visibleColumns: columnManager.visibleColumns,\r\n sorting: sorting.sorting, filters: filtering.filters, globalSearch: filtering.globalSearch,\r\n page: pagination.page, pageSize: pagination.pageSize, totalItems,\r\n selectedKeys: selection.selectedKeys, expandedKeys, viewMode,\r\n columnOrder: columnManager.columnOrder, columnWidths: columnManager.columnWidths, editingCell,\r\n }), [data, paginatedData, columns, columnManager, sorting, filtering, pagination, totalItems, selection, expandedKeys, viewMode, editingCell]);\r\n\r\n usePersistence({ persistKey, syncUrl, state: {\r\n sorting: sorting.sorting, filters: filtering.filters, globalSearch: filtering.globalSearch,\r\n page: pagination.page, pageSize: pagination.pageSize, viewMode,\r\n hiddenColumns: columnManager.hiddenColumns, columnOrder: columnManager.columnOrder,\r\n }});\r\n\r\n const getCurrentPresetConfig = useCallback(() => ({\r\n columnOrder: columnManager.columnOrder, hiddenColumns: Array.from(columnManager.hiddenColumns),\r\n columnWidths: columnManager.columnWidths, sorting: sorting.sorting,\r\n filters: filtering.filters, globalSearch: filtering.globalSearch,\r\n pageSize: pagination.pageSize, viewMode,\r\n }), [columnManager, sorting, filtering, pagination, viewMode]);\r\n\r\n const applyPreset = useCallback((id) => {\r\n const cfg = presets.loadPresetById(id);\r\n if (!cfg) return;\r\n if (cfg.columnOrder?.length) columnManager.setColumnOrderIds(cfg.columnOrder);\r\n if (cfg.hiddenColumns) columnManager.setHiddenColumnIds(cfg.hiddenColumns);\r\n if (cfg.columnWidths) columnManager.setColumnWidthMap(cfg.columnWidths);\r\n sorting.setSorting(cfg.sorting ?? []);\r\n filtering.setFilters(cfg.filters ?? []);\r\n filtering.setGlobalSearch(cfg.globalSearch ?? '');\r\n if (cfg.pageSize) pagination.setPageSize(cfg.pageSize);\r\n if (cfg.viewMode) setViewMode(cfg.viewMode);\r\n }, [presets, columnManager, sorting, filtering, pagination, setViewMode]);\r\n\r\n const pinnedTopRows = useMemo(() => paginatedData.filter((row, i) => pinnedTop.includes(getKey(row, i))), [paginatedData, pinnedTop, getKey]);\r\n const pinnedBottomRows = useMemo(() => paginatedData.filter((row, i) => pinnedBottom.includes(getKey(row, i))), [paginatedData, pinnedBottom, getKey]);\r\n const unpinnedData = useMemo(() => paginatedData.filter((row, i) => {\r\n const key = getKey(row, i);\r\n return !pinnedTop.includes(key) && !pinnedBottom.includes(key);\r\n }), [paginatedData, pinnedTop, pinnedBottom, getKey]);\r\n\r\n return {\r\n state, processedData: paginatedData, allFilteredData: pluginProcessedData,\r\n loading: externalLoading || serverLoading,\r\n sorting, filtering, pagination, selection, columnManager,\r\n viewMode, setViewMode, expandedKeys, toggleExpand,\r\n editingCell, setEditingCell, editing,\r\n theme, rowGrouping, treeData, presets, chartConfig, virtualization,\r\n pinnedTopRows, pinnedBottomRows, unpinnedData, pinRow,\r\n getKey, getCurrentPresetConfig, applyPreset, plugins,\r\n };\r\n}\r\n","import { getCellValue } from './utils.js';\r\n\r\nfunction downloadBlob(blob, filename) {\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\nfunction resolveColumns(allColumns, columnIds) {\r\n if (!columnIds?.length) return allColumns;\r\n return columnIds\r\n .map((id) => allColumns.find((c) => c.id === id))\r\n .filter((c) => c != null);\r\n}\r\n\r\nfunction extractRows(data, columns) {\r\n return data.map((row) =>\r\n columns.map((col) => {\r\n const val = getCellValue(row, col);\r\n return String(val ?? '');\r\n })\r\n );\r\n}\r\n\r\n/**\r\n * Export data to CSV format.\r\n * @param {Array} data\r\n * @param {Array} columns\r\n * @param {string[]} [columnIds]\r\n * @param {string} [filename]\r\n */\r\nexport function exportToCSV(data, columns, columnIds, filename = 'export') {\r\n const cols = resolveColumns(columns, columnIds);\r\n const headers = cols.map((c) => c.header);\r\n const rows = extractRows(data, cols);\r\n\r\n const escapeCsv = (str) =>\r\n str.includes(',') || str.includes('\"') || str.includes('\\n')\r\n ? `\"${str.replace(/\"/g, '\"\"')}\"`\r\n : str;\r\n\r\n const csv = [\r\n headers.map(escapeCsv).join(','),\r\n ...rows.map((r) => r.map(escapeCsv).join(',')),\r\n ].join('\\n');\r\n\r\n const blob = new Blob(['\\uFEFF' + csv], { type: 'text/csv;charset=utf-8;' });\r\n downloadBlob(blob, `${filename}.csv`);\r\n}\r\n\r\n/**\r\n * Export data to Excel (.xlsx) format using the xlsx library.\r\n * @param {Array} data\r\n * @param {Array} columns\r\n * @param {string[]} [columnIds]\r\n * @param {string} [filename]\r\n * @param {string} [sheetName]\r\n */\r\nexport async function exportToExcel(data, columns, columnIds, filename = 'export', sheetName = 'Sheet1') {\r\n const cols = resolveColumns(columns, columnIds);\r\n const headers = cols.map((c) => c.header);\r\n const rows = extractRows(data, cols);\r\n\r\n try {\r\n const XLSX = await import('xlsx');\r\n const wsData = [headers, ...rows];\r\n const ws = XLSX.utils.aoa_to_sheet(wsData);\r\n\r\n ws['!cols'] = headers.map((h, i) => {\r\n const maxLen = Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length));\r\n return { wch: Math.min(maxLen + 2, 50) };\r\n });\r\n\r\n const wb = XLSX.utils.book_new();\r\n XLSX.utils.book_append_sheet(wb, ws, sheetName);\r\n XLSX.writeFile(wb, `${filename}.xlsx`);\r\n } catch {\r\n console.warn('xlsx library not available, falling back to CSV export');\r\n exportToCSV(data, columns, columnIds, filename);\r\n }\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Search, X, LayoutGrid, List, Table2, Download, SlidersHorizontal, RotateCcw } from 'lucide-react';\r\n\r\nexport function Toolbar({\r\n globalSearch,\r\n onSearchChange,\r\n searchDebounce = 300,\r\n viewMode,\r\n onViewModeChange,\r\n views = ['table', 'grid', 'list'],\r\n exportFormats,\r\n onExport,\r\n hasActiveFilters = false,\r\n onClearFilters,\r\n pluginToolbar,\r\n className = '',\r\n}) {\r\n const [localSearch, setLocalSearch] = useState(globalSearch);\r\n const [showExportMenu, setShowExportMenu] = useState(false);\r\n\r\n // Debounced search\r\n useEffect(() => {\r\n const timer = setTimeout(() => onSearchChange(localSearch), searchDebounce);\r\n return () => clearTimeout(timer);\r\n }, [localSearch, searchDebounce, onSearchChange]);\r\n\r\n // Sync external changes\r\n useEffect(() => {\r\n setLocalSearch(globalSearch);\r\n }, [globalSearch]);\r\n\r\n const viewIcons = {\r\n table: <Table2 className=\"h-4 w-4\" />,\r\n grid: <LayoutGrid className=\"h-4 w-4\" />,\r\n list: <List className=\"h-4 w-4\" />,\r\n };\r\n\r\n return (\r\n <div className={`flex flex-wrap items-center gap-2 px-4 py-3 border-b border-[var(--app-border,#e5e7eb)] ${className}`}>\r\n {/* Search */}\r\n <div className=\"relative flex-1 min-w-[200px] max-w-md\">\r\n <Search className=\"h-4 w-4 text-gray-400 absolute left-3 top-1/2 -translate-y-1/2\" />\r\n <input\r\n type=\"text\"\r\n value={localSearch}\r\n onChange={(e) => setLocalSearch(e.target.value)}\r\n placeholder=\"Search...\"\r\n className=\"w-full h-9 pl-9 pr-8 text-sm rounded-md border border-gray-300 dark:border-gray-600 focus:outline-none focus:ring-2 focus:ring-brand-500 focus:border-brand-500 bg-[var(--app-bg)]\"\r\n aria-label=\"Search table\"\r\n />\r\n {localSearch && (\r\n <button\r\n type=\"button\"\r\n onClick={() => { setLocalSearch(''); onSearchChange(''); }}\r\n className=\"absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600\"\r\n aria-label=\"Clear search\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Active filters indicator */}\r\n {hasActiveFilters && (\r\n <button\r\n type=\"button\"\r\n onClick={onClearFilters}\r\n className=\"inline-flex items-center gap-1 px-2 py-1.5 text-xs font-medium text-brand-700 bg-brand-50 rounded-md hover:bg-brand-100 transition-colors\"\r\n >\r\n <SlidersHorizontal className=\"h-3 w-3\" />\r\n Filters active\r\n <RotateCcw className=\"h-3 w-3 ml-1\" />\r\n </button>\r\n )}\r\n\r\n {/* Plugin toolbar */}\r\n {pluginToolbar}\r\n\r\n <div className=\"flex items-center gap-1 ml-auto\">\r\n\r\n {/* Export */}\r\n {exportFormats && exportFormats.length > 0 && onExport && (\r\n <ExportMenu\r\n formats={exportFormats}\r\n onExport={onExport}\r\n isOpen={showExportMenu}\r\n onToggleOpen={() => setShowExportMenu((v) => !v)}\r\n onClose={() => setShowExportMenu(false)}\r\n />\r\n )}\r\n\r\n {/* View toggle */}\r\n {views.length > 1 && (\r\n <div className=\"flex items-center border border-gray-300 dark:border-gray-600 rounded-md overflow-hidden\">\r\n {views.map((v) => (\r\n <button\r\n key={v}\r\n type=\"button\"\r\n onClick={() => onViewModeChange(v)}\r\n className={`p-2 transition-colors ${\r\n viewMode === v\r\n ? 'bg-brand-600 text-white'\r\n : 'bg-[var(--app-bg)] text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700'\r\n }`}\r\n title={`${v.charAt(0).toUpperCase() + v.slice(1)} view`}\r\n aria-label={`Switch to ${v} view`}\r\n aria-pressed={viewMode === v}\r\n >\r\n {viewIcons[v]}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Export Menu ───────────────────────────────────────────────────────\r\n\r\nfunction ExportMenu({\r\n formats,\r\n onExport,\r\n isOpen,\r\n onToggleOpen,\r\n onClose,\r\n}) {\r\n const ref = React.useRef(null);\r\n\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handler = (e) => {\r\n if (ref.current && !ref.current.contains(e.target)) onClose();\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [isOpen, onClose]);\r\n\r\n const labels = {\r\n csv: 'Export CSV',\r\n excel: 'Export Excel',\r\n pdf: 'Export PDF',\r\n };\r\n\r\n return (\r\n <div className=\"relative\" ref={ref}>\r\n <button\r\n type=\"button\"\r\n onClick={onToggleOpen}\r\n className=\"p-2 text-gray-500 hover:text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md transition-colors\"\r\n aria-label=\"Export data\"\r\n >\r\n <Download className=\"h-4 w-4\" />\r\n </button>\r\n {isOpen && (\r\n <div className=\"absolute right-0 top-full mt-1 z-50 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 min-w-[140px]\">\r\n {formats.map((format) => (\r\n <button\r\n key={format}\r\n type=\"button\"\r\n onClick={() => { onExport(format); onClose(); }}\r\n className=\"w-full text-left px-3 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\r\n >\r\n {labels[format]}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { X } from 'lucide-react';\r\n\r\nexport function BulkActions({ selectedCount, selectedRows, actions, onClearSelection }) {\r\n if (selectedCount === 0) return null;\r\n return (\r\n <div className=\"flex items-center gap-3 px-4 py-2 bg-brand-50 dark:bg-brand-900/20 border-b border-brand-200 dark:border-brand-800 animate-in slide-in-from-top-1\">\r\n <span className=\"text-sm font-medium text-brand-700 dark:text-brand-300\">{selectedCount} selected</span>\r\n <div className=\"flex items-center gap-2\">\r\n {actions.map((action) => (\r\n <button key={action.id} type=\"button\" onClick={() => action.onClick(selectedRows)}\r\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md transition-colors ${action.variant === 'danger' ? 'text-red-700 bg-red-100 hover:bg-red-200 dark:text-red-300 dark:bg-red-900/30 dark:hover:bg-red-900/50' : 'text-brand-700 bg-brand-100 hover:bg-brand-200 dark:text-brand-300 dark:bg-brand-900/30 dark:hover:bg-brand-900/50'}`}>\r\n {action.icon}{action.label}\r\n </button>\r\n ))}\r\n </div>\r\n <button type=\"button\" onClick={onClearSelection} className=\"ml-auto p-1 text-gray-400 hover:text-gray-600 transition-colors\" aria-label=\"Clear selection\">\r\n <X className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useCallback } from 'react';\r\nimport { Filter, X } from 'lucide-react';\r\n\r\nexport function ColumnFilter({ column, value, onChange }) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const filterType = column.filterType ?? 'text';\r\n const hasValue = value !== '' && value != null && !(Array.isArray(value) && !value.length);\r\n\r\n if (column.filterComponent) {\r\n const CustomFilter = column.filterComponent;\r\n return (\r\n <CustomFilter\r\n column={column}\r\n value={value}\r\n onChange={(v) => onChange(column.id, v)}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"relative inline-block\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setIsOpen((v) => !v)}\r\n className={`p-1 rounded transition-colors ${\r\n hasValue\r\n ? 'text-brand-600 bg-brand-50'\r\n : 'text-gray-400 hover:text-gray-600 hover:bg-gray-100'\r\n }`}\r\n aria-label={`Filter ${column.header}`}\r\n >\r\n <Filter className=\"h-3.5 w-3.5\" />\r\n </button>\r\n {isOpen && (\r\n <FilterDropdown\r\n column={column}\r\n filterType={filterType}\r\n value={value}\r\n onChange={onChange}\r\n onClose={() => setIsOpen(false)}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction FilterDropdown({\r\n column,\r\n filterType,\r\n value,\r\n onChange,\r\n onClose,\r\n}) {\r\n const ref = React.useRef(null);\r\n\r\n React.useEffect(() => {\r\n const handler = (e) => {\r\n if (ref.current && !ref.current.contains(e.target)) onClose();\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [onClose]);\r\n\r\n const handleClear = useCallback(() => {\r\n onChange(column.id, '');\r\n onClose();\r\n }, [column.id, onChange, onClose]);\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className=\"absolute left-0 top-full mt-1 z-50 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-3 min-w-[200px]\"\r\n >\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-xs font-medium text-gray-500\">Filter: {column.header}</span>\r\n <button type=\"button\" onClick={handleClear} className=\"text-xs text-gray-400 hover:text-gray-600\">\r\n <X className=\"h-3 w-3\" />\r\n </button>\r\n </div>\r\n {filterType === 'text' && (\r\n <input\r\n type=\"text\"\r\n value={String(value ?? '')}\r\n onChange={(e) => onChange(column.id, e.target.value, 'contains')}\r\n placeholder={`Filter ${column.header}...`}\r\n className=\"w-full px-2 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg)]\"\r\n autoFocus\r\n />\r\n )}\r\n {filterType === 'number' && (\r\n <input\r\n type=\"number\"\r\n value={String(value ?? '')}\r\n onChange={(e) => onChange(column.id, e.target.value ? Number(e.target.value) : '', 'eq')}\r\n placeholder={`Filter ${column.header}...`}\r\n className=\"w-full px-2 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg)]\"\r\n autoFocus\r\n />\r\n )}\r\n {filterType === 'date' && (\r\n <input\r\n type=\"date\"\r\n value={String(value ?? '')}\r\n onChange={(e) => onChange(column.id, e.target.value, 'eq')}\r\n className=\"w-full px-2 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg)]\"\r\n />\r\n )}\r\n {filterType === 'select' && column.filterOptions && (\r\n <select\r\n value={String(value ?? '')}\r\n onChange={(e) => onChange(column.id, e.target.value, 'eq')}\r\n className=\"w-full px-2 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg)]\"\r\n >\r\n <option value=\"\">All</option>\r\n {column.filterOptions.map((opt) => (\r\n <option key={opt.value} value={opt.value}>{opt.label}</option>\r\n ))}\r\n </select>\r\n )}\r\n {filterType === 'multi-select' && column.filterOptions && (\r\n <MultiSelectFilter\r\n options={column.filterOptions}\r\n value={Array.isArray(value) ? value : []}\r\n onChange={(v) => onChange(column.id, v)}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction MultiSelectFilter({\r\n options,\r\n value,\r\n onChange,\r\n}) {\r\n const toggle = (optValue) => {\r\n const next = value.includes(optValue)\r\n ? value.filter((v) => v !== optValue)\r\n : [...value, optValue];\r\n onChange(next);\r\n };\r\n\r\n return (\r\n <div className=\"max-h-48 overflow-y-auto space-y-1\">\r\n {options.map((opt) => (\r\n <label key={opt.value} className=\"flex items-center gap-2 px-1 py-0.5 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-700 rounded\">\r\n <input\r\n type=\"checkbox\"\r\n checked={value.includes(opt.value)}\r\n onChange={() => toggle(opt.value)}\r\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-brand-600 focus:ring-brand-600\"\r\n />\r\n <span className=\"text-sm text-gray-700 dark:text-gray-300\">{opt.label}</span>\r\n </label>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\r\nimport { X } from 'lucide-react';\r\n\r\nexport function FloatingFilterRow({\r\n columns,\r\n getFilterValue,\r\n onFilterChange,\r\n showCheckbox = false,\r\n showExpandToggle = false,\r\n showActions = false,\r\n compact = false,\r\n}) {\r\n const py = compact ? 'py-1' : 'py-1.5';\r\n\r\n return (\r\n <tr className=\"bg-[var(--app-surface,#f9fafb)] border-b border-[var(--app-border,#e5e7eb)]\">\r\n {showCheckbox && <td className={`px-4 ${py}`} />}\r\n {showExpandToggle && <td className={`px-2 ${py}`} />}\r\n {columns.map((col) => (\r\n <td key={col.id} className={`px-2 ${py}`}>\r\n {col.filterable !== false && col.filterType ? (\r\n <FloatingFilterInput\r\n column={col}\r\n value={getFilterValue(col.id)}\r\n onChange={onFilterChange}\r\n />\r\n ) : null}\r\n </td>\r\n ))}\r\n {showActions && <td className={`px-4 ${py}`} />}\r\n </tr>\r\n );\r\n}\r\n\r\n// ─── Individual Filter Input ──────────────────────────────────────────\r\n\r\nfunction FloatingFilterInput({\r\n column,\r\n value,\r\n onChange,\r\n}) {\r\n const filterType = column.filterType ?? 'text';\r\n const [localValue, setLocalValue] = useState(String(value ?? ''));\r\n const debounceRef = useRef();\r\n\r\n // Sync external value changes\r\n useEffect(() => {\r\n setLocalValue(String(value ?? ''));\r\n }, [value]);\r\n\r\n const handleTextChange = useCallback(\r\n (val) => {\r\n setLocalValue(val);\r\n clearTimeout(debounceRef.current);\r\n debounceRef.current = setTimeout(() => {\r\n onChange(column.id, val, 'contains');\r\n }, 300);\r\n },\r\n [column.id, onChange]\r\n );\r\n\r\n const handleClear = useCallback(() => {\r\n setLocalValue('');\r\n clearTimeout(debounceRef.current);\r\n onChange(column.id, '');\r\n }, [column.id, onChange]);\r\n\r\n // Custom filter component\r\n if (column.filterComponent) {\r\n const CustomFilter = column.filterComponent;\r\n return (\r\n <CustomFilter\r\n column={column}\r\n value={value}\r\n onChange={(v) => onChange(column.id, v)}\r\n />\r\n );\r\n }\r\n\r\n if (filterType === 'select') {\r\n return (\r\n <select\r\n value={String(value ?? '')}\r\n onChange={(e) => onChange(column.id, e.target.value, 'eq')}\r\n className=\"w-full px-1.5 py-1 text-xs border border-gray-200 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg,white)] text-gray-700\"\r\n aria-label={`Filter ${column.header}`}\r\n >\r\n <option value=\"\">All</option>\r\n {column.filterOptions?.map((opt) => (\r\n <option key={opt.value} value={opt.value}>{opt.label}</option>\r\n ))}\r\n </select>\r\n );\r\n }\r\n\r\n if (filterType === 'number') {\r\n return (\r\n <div className=\"relative\">\r\n <input\r\n type=\"number\"\r\n value={localValue}\r\n onChange={(e) => {\r\n setLocalValue(e.target.value);\r\n onChange(column.id, e.target.value ? Number(e.target.value) : '', 'eq');\r\n }}\r\n placeholder=\"...\"\r\n className=\"w-full px-1.5 py-1 text-xs border border-gray-200 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg,white)] pr-5\"\r\n aria-label={`Filter ${column.header}`}\r\n />\r\n {localValue && (\r\n <ClearButton onClick={handleClear} />\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n if (filterType === 'date') {\r\n return (\r\n <input\r\n type=\"date\"\r\n value={String(value ?? '')}\r\n onChange={(e) => onChange(column.id, e.target.value, 'eq')}\r\n className=\"w-full px-1.5 py-1 text-xs border border-gray-200 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg,white)]\"\r\n aria-label={`Filter ${column.header}`}\r\n />\r\n );\r\n }\r\n\r\n // Default: text input with debounce\r\n return (\r\n <div className=\"relative\">\r\n <input\r\n type=\"text\"\r\n value={localValue}\r\n onChange={(e) => handleTextChange(e.target.value)}\r\n placeholder=\"Filter...\"\r\n className=\"w-full px-1.5 py-1 text-xs border border-gray-200 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg,white)] pr-5\"\r\n aria-label={`Filter ${column.header}`}\r\n />\r\n {localValue && (\r\n <ClearButton onClick={handleClear} />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction ClearButton({ onClick }) {\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n className=\"absolute right-1 top-1/2 -translate-y-1/2 p-0.5 text-gray-400 hover:text-gray-600 rounded\"\r\n aria-label=\"Clear filter\"\r\n >\r\n <X className=\"h-3 w-3\" />\r\n </button>\r\n );\r\n}\r\n","import React, { useCallback, useRef, useState, memo, useMemo } from 'react';\r\nimport { ArrowUp, ArrowDown, ArrowUpDown, GripVertical } from 'lucide-react';\r\nimport { ColumnFilter } from './ColumnFilter.jsx';\r\nimport { FloatingFilterRow } from './FloatingFilterRow.jsx';\r\n\r\n/** MIME type used for the column drag data transfer */\r\nconst COLUMN_DND_TYPE = 'application/x-datatable-column';\r\n\r\nfunction DataTableHeaderInner({\r\n columns,\r\n getSortDirection,\r\n onSort,\r\n columnWidths,\r\n onResize,\r\n enableResizing = false,\r\n enableReordering = false,\r\n onReorder,\r\n onReorderById,\r\n showCheckbox = false,\r\n isAllSelected = false,\r\n isSomeSelected = false,\r\n onToggleAll,\r\n showExpandToggle = false,\r\n showActions = false,\r\n compact = false,\r\n getFilterValue,\r\n onFilterChange,\r\n floatingFilters = false,\r\n showColumnGroups = false,\r\n}) {\r\n // ─── Drag & Drop State ──────────────────────────────────────────\r\n const [dragSourceId, setDragSourceId] = useState(null);\r\n const [dropTargetId, setDropTargetId] = useState(null);\r\n const [dropSide, setDropSide] = useState(null);\r\n const headerRefs = useRef(new Map());\r\n\r\n // ─── Drag Handlers ──────────────────────────────────────────────\r\n\r\n const handleDragStart = useCallback(\r\n (e, columnId) => {\r\n if (!enableReordering) return;\r\n setDragSourceId(columnId);\r\n e.dataTransfer.setData(COLUMN_DND_TYPE, columnId);\r\n e.dataTransfer.effectAllowed = 'move';\r\n\r\n const el = headerRefs.current.get(columnId);\r\n if (el) {\r\n const ghost = el.cloneNode(true);\r\n ghost.style.position = 'absolute';\r\n ghost.style.top = '-9999px';\r\n ghost.style.left = '-9999px';\r\n ghost.style.opacity = '0.85';\r\n ghost.style.background = 'var(--app-surface, #f9fafb)';\r\n ghost.style.border = '1px solid var(--app-border, #e5e7eb)';\r\n ghost.style.borderRadius = '6px';\r\n ghost.style.padding = '8px 12px';\r\n ghost.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)';\r\n ghost.style.whiteSpace = 'nowrap';\r\n document.body.appendChild(ghost);\r\n e.dataTransfer.setDragImage(ghost, 20, 20);\r\n requestAnimationFrame(() => document.body.removeChild(ghost));\r\n }\r\n },\r\n [enableReordering]\r\n );\r\n\r\n const handleDragOver = useCallback(\r\n (e, columnId) => {\r\n if (!enableReordering || !dragSourceId || dragSourceId === columnId) return;\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n const el = headerRefs.current.get(columnId);\r\n if (el) {\r\n const rect = el.getBoundingClientRect();\r\n const midpoint = rect.left + rect.width / 2;\r\n setDropTargetId(columnId);\r\n setDropSide(e.clientX < midpoint ? 'left' : 'right');\r\n }\r\n },\r\n [enableReordering, dragSourceId]\r\n );\r\n\r\n const handleDragLeave = useCallback(\r\n (e, columnId) => {\r\n const relatedTarget = e.relatedTarget;\r\n const el = headerRefs.current.get(columnId);\r\n if (el && relatedTarget && el.contains(relatedTarget)) return;\r\n if (dropTargetId === columnId) { setDropTargetId(null); setDropSide(null); }\r\n },\r\n [dropTargetId]\r\n );\r\n\r\n const handleDrop = useCallback(\r\n (e, columnId) => {\r\n e.preventDefault();\r\n const fromId = e.dataTransfer.getData(COLUMN_DND_TYPE);\r\n if (!fromId || fromId === columnId) { resetDragState(); return; }\r\n\r\n if (onReorderById) {\r\n const targetIndex = columns.findIndex((c) => c.id === columnId);\r\n const sourceIndex = columns.findIndex((c) => c.id === fromId);\r\n if (targetIndex !== -1 && sourceIndex !== -1) onReorderById(fromId, columnId);\r\n } else if (onReorder) {\r\n const fromIndex = columns.findIndex((c) => c.id === fromId);\r\n const toIndex = columns.findIndex((c) => c.id === columnId);\r\n if (fromIndex !== -1 && toIndex !== -1) onReorder(fromIndex, toIndex);\r\n }\r\n resetDragState();\r\n },\r\n [columns, onReorder, onReorderById]\r\n );\r\n\r\n const handleDragEnd = useCallback(() => resetDragState(), []);\r\n\r\n const resetDragState = () => {\r\n setDragSourceId(null); setDropTargetId(null); setDropSide(null);\r\n };\r\n\r\n const setHeaderRef = useCallback(\r\n (columnId) => (el) => {\r\n if (el) headerRefs.current.set(columnId, el);\r\n else headerRefs.current.delete(columnId);\r\n },\r\n []\r\n );\r\n\r\n // ─── Column Groups ───────────────────────────────────────────────\r\n const columnGroups = useMemo(() => {\r\n if (!showColumnGroups) return null;\r\n const hasGroups = columns.some((c) => c.group);\r\n if (!hasGroups) return null;\r\n\r\n const groups = [];\r\n let currentGroup;\r\n let span = 0;\r\n\r\n columns.forEach((col, i) => {\r\n if (col.group !== currentGroup) {\r\n if (span > 0) groups.push({ label: currentGroup ?? '', colSpan: span });\r\n currentGroup = col.group;\r\n span = 1;\r\n } else {\r\n span++;\r\n }\r\n if (i === columns.length - 1) {\r\n groups.push({ label: currentGroup ?? '', colSpan: span });\r\n }\r\n });\r\n\r\n return groups;\r\n }, [columns, showColumnGroups]);\r\n\r\n // ─── Render ─────────────────────────────────────────────────────\r\n\r\n const py = compact ? 'py-2' : 'py-3';\r\n\r\n return (\r\n <thead className=\"bg-[var(--app-surface,#f9fafb)] border-b border-[var(--app-border,#e5e7eb)]\">\r\n {/* Column group header row */}\r\n {columnGroups && (\r\n <tr className=\"border-b border-[var(--app-border,#e5e7eb)]\">\r\n {showCheckbox && <th className=\"px-4 py-1\" />}\r\n {showExpandToggle && <th className=\"px-2 py-1\" />}\r\n {columnGroups.map((group, i) => (\r\n <th\r\n key={`${group.label}-${i}`}\r\n colSpan={group.colSpan}\r\n className=\"px-4 py-1.5 text-center text-[10px] font-bold uppercase tracking-widest text-gray-400 border-x border-[var(--app-border,#e5e7eb)] first:border-l-0 last:border-r-0\"\r\n >\r\n {group.label}\r\n </th>\r\n ))}\r\n {showActions && <th className=\"px-4 py-1\" />}\r\n </tr>\r\n )}\r\n <tr>\r\n {showCheckbox && (\r\n <th className={`px-4 ${py} w-12`}>\r\n <input\r\n type=\"checkbox\"\r\n checked={isAllSelected}\r\n ref={(el) => { if (el) el.indeterminate = isSomeSelected; }}\r\n onChange={onToggleAll}\r\n className=\"h-4 w-4 rounded border-gray-300 text-brand-600 focus:ring-brand-600\"\r\n aria-label=\"Select all rows\"\r\n />\r\n </th>\r\n )}\r\n {showExpandToggle && <th className={`px-2 ${py} w-10`} />}\r\n {columns.map((col) => {\r\n const sortDir = getSortDirection(col.id);\r\n const width = columnWidths[col.id];\r\n const style = width ? { width, minWidth: width } : {};\r\n\r\n const isDragSource = dragSourceId === col.id;\r\n const isDropTarget = dropTargetId === col.id;\r\n const isDropLeft = isDropTarget && dropSide === 'left';\r\n const isDropRight = isDropTarget && dropSide === 'right';\r\n\r\n const hasFilter = col.filterable !== false && col.filterType && getFilterValue && onFilterChange;\r\n\r\n return (\r\n <th\r\n key={col.id}\r\n ref={setHeaderRef(col.id)}\r\n className={`\r\n px-4 ${py} text-left text-xs font-semibold uppercase tracking-wider\r\n text-[var(--app-text-secondary,#6b7280)] select-none relative group\r\n transition-opacity duration-150\r\n ${isDragSource ? 'opacity-30' : ''}\r\n ${enableReordering ? 'cursor-grab active:cursor-grabbing' : ''}\r\n `}\r\n style={style}\r\n draggable={enableReordering}\r\n onDragStart={(e) => handleDragStart(e, col.id)}\r\n onDragOver={(e) => handleDragOver(e, col.id)}\r\n onDragLeave={(e) => handleDragLeave(e, col.id)}\r\n onDrop={(e) => handleDrop(e, col.id)}\r\n onDragEnd={handleDragEnd}\r\n >\r\n {isDropLeft && (\r\n <div className=\"absolute left-0 top-1 bottom-1 w-0.5 bg-brand-500 rounded-full z-10 animate-pulse\" />\r\n )}\r\n {isDropRight && (\r\n <div className=\"absolute right-0 top-1 bottom-1 w-0.5 bg-brand-500 rounded-full z-10 animate-pulse\" />\r\n )}\r\n\r\n <div className=\"flex items-center gap-1\">\r\n {enableReordering && (\r\n <GripVertical\r\n className={`h-3.5 w-3.5 shrink-0 transition-all duration-150\r\n ${isDragSource ? 'text-brand-500 opacity-100' : 'text-gray-400 opacity-0 group-hover:opacity-100'}\r\n `}\r\n />\r\n )}\r\n {col.headerCell ? (\r\n col.headerCell({ column: col, sortDirection: sortDir, onSort: () => onSort(col.id) })\r\n ) : (\r\n <button\r\n type=\"button\"\r\n className={`flex items-center gap-1 ${col.sortable !== false ? 'cursor-pointer hover:text-[var(--app-text)]' : 'cursor-default'}`}\r\n onClick={() => col.sortable !== false && onSort(col.id)}\r\n disabled={col.sortable === false}\r\n onDragStart={(e) => { e.stopPropagation(); e.preventDefault(); }}\r\n >\r\n <span>{col.header}</span>\r\n {col.sortable !== false && <SortIcon direction={sortDir} />}\r\n </button>\r\n )}\r\n {/* Inline filter icon — sits right next to the sort icon */}\r\n {hasFilter && (\r\n <div\r\n onClick={(e) => e.stopPropagation()}\r\n onDragStart={(e) => { e.stopPropagation(); e.preventDefault(); }}\r\n draggable={false}\r\n >\r\n <ColumnFilter\r\n column={col}\r\n value={getFilterValue(col.id)}\r\n onChange={onFilterChange}\r\n />\r\n </div>\r\n )}\r\n {enableResizing && col.resizable !== false && (\r\n <ResizeHandle\r\n columnId={col.id}\r\n currentWidth={width ?? col.width ?? 150}\r\n onResize={onResize}\r\n />\r\n )}\r\n </div>\r\n </th>\r\n );\r\n })}\r\n {showActions && (\r\n <th className={`px-4 ${py} text-right text-xs font-semibold uppercase tracking-wider text-[var(--app-text-secondary,#6b7280)] w-24`}>\r\n Actions\r\n </th>\r\n )}\r\n </tr>\r\n {/* Floating filter row */}\r\n {floatingFilters && getFilterValue && onFilterChange && (\r\n <FloatingFilterRow\r\n columns={columns}\r\n getFilterValue={getFilterValue}\r\n onFilterChange={onFilterChange}\r\n showCheckbox={showCheckbox}\r\n showExpandToggle={showExpandToggle}\r\n showActions={showActions}\r\n compact={compact}\r\n />\r\n )}\r\n </thead>\r\n );\r\n}\r\n\r\nexport const DataTableHeader = memo(DataTableHeaderInner);\r\n\r\n// ─── Sort Icon ────────────────────────────────────────────────────────\r\n\r\nfunction SortIcon({ direction }) {\r\n if (direction === 'asc') return <ArrowUp className=\"h-3.5 w-3.5\" />;\r\n if (direction === 'desc') return <ArrowDown className=\"h-3.5 w-3.5\" />;\r\n return <ArrowUpDown className=\"h-3.5 w-3.5 opacity-30\" />;\r\n}\r\n\r\n// ─── Resize Handle ────────────────────────────────────────────────────\r\n\r\nfunction ResizeHandle({\r\n columnId,\r\n currentWidth,\r\n onResize,\r\n}) {\r\n const startX = useRef(0);\r\n const startWidth = useRef(currentWidth);\r\n\r\n const handleMouseDown = useCallback(\r\n (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n startX.current = e.clientX;\r\n startWidth.current = currentWidth;\r\n\r\n const handleMouseMove = (ev) => {\r\n const diff = ev.clientX - startX.current;\r\n onResize(columnId, startWidth.current + diff);\r\n };\r\n const handleMouseUp = () => {\r\n document.removeEventListener('mousemove', handleMouseMove);\r\n document.removeEventListener('mouseup', handleMouseUp);\r\n };\r\n document.addEventListener('mousemove', handleMouseMove);\r\n document.addEventListener('mouseup', handleMouseUp);\r\n },\r\n [columnId, currentWidth, onResize]\r\n );\r\n\r\n return (\r\n <div\r\n className=\"absolute right-0 top-0 bottom-0 w-1 cursor-col-resize hover:bg-brand-500 opacity-0 group-hover:opacity-100 transition-opacity\"\r\n onMouseDown={handleMouseDown}\r\n draggable={false}\r\n onDragStart={(e) => { e.stopPropagation(); e.preventDefault(); }}\r\n role=\"separator\"\r\n aria-orientation=\"vertical\"\r\n />\r\n );\r\n}\r\n","import { useState, useRef, useCallback } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nexport function CellTooltip({ content, children, delay = 400, style, disabled = false }) {\r\n const [visible, setVisible] = useState(false);\r\n const [pos, setPos] = useState({ top: 0, left: 0 });\r\n const timerRef = useRef();\r\n const triggerRef = useRef(null);\r\n\r\n const show = useCallback(() => {\r\n if (disabled || !content) return;\r\n timerRef.current = setTimeout(() => {\r\n const el = triggerRef.current;\r\n if (!el) return;\r\n const rect = el.getBoundingClientRect();\r\n const top = rect.top - 6;\r\n let left = rect.left + rect.width / 2;\r\n left = Math.max(60, Math.min(left, window.innerWidth - 60));\r\n setPos({ top, left });\r\n setVisible(true);\r\n }, delay);\r\n }, [content, delay, disabled]);\r\n\r\n const hide = useCallback(() => { clearTimeout(timerRef.current); setVisible(false); }, []);\r\n\r\n return (\r\n <>\r\n <span ref={triggerRef} onMouseEnter={show} onMouseLeave={hide} onFocus={show} onBlur={hide} className=\"contents\">\r\n {children}\r\n </span>\r\n {visible && content && createPortal(\r\n <div role=\"tooltip\" className=\"fixed z-[99999] pointer-events-none animate-in fade-in duration-150\"\r\n style={{ top: pos.top, left: pos.left, transform: 'translate(-50%, -100%)', ...defaultTooltipStyle, ...style }}>\r\n {content}\r\n </div>,\r\n document.body\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nconst defaultTooltipStyle = {\r\n backgroundColor: '#1f2937', color: '#f9fafb', padding: '0.375rem 0.625rem',\r\n borderRadius: '0.375rem', fontSize: '0.75rem', maxWidth: '300px',\r\n whiteSpace: 'pre-wrap', boxShadow: '0 4px 6px -1px rgba(0,0,0,0.1)',\r\n};\r\n","import React, { useState, useCallback, memo } from 'react';\r\nimport { getCellValue } from '../utils.js';\r\nimport { CellTooltip } from './CellTooltip.jsx';\r\n\r\nfunction TableCellInner({\r\n row,\r\n rowIndex,\r\n column,\r\n isEditing,\r\n onStartEdit,\r\n onSaveEdit,\r\n onCancelEdit,\r\n width,\r\n className = '',\r\n validationError,\r\n pendingValue,\r\n onPendingChange,\r\n enableTooltip = false,\r\n tooltipStyle,\r\n themeCellStyle,\r\n}) {\r\n const value = getCellValue(row, column);\r\n\r\n const alignClass =\r\n column.align === 'center' ? 'text-center' :\r\n column.align === 'right' ? 'text-right' : 'text-left';\r\n\r\n const baseStyle = {\r\n ...(width ? { width, minWidth: width } : {}),\r\n ...themeCellStyle,\r\n };\r\n const errorBorder = validationError ? 'ring-1 ring-red-400' : '';\r\n\r\n // Row editing mode: use pendingValue and onPendingChange\r\n if (isEditing && onPendingChange !== undefined) {\r\n if (column.editCell) {\r\n const editProps = {\r\n value: pendingValue ?? value,\r\n row,\r\n column,\r\n onSave: (v) => { onPendingChange(v); },\r\n onCancel: onCancelEdit,\r\n error: validationError,\r\n };\r\n return (\r\n <td className={`px-4 py-2 ${alignClass} ${column.className ?? ''} ${className}`} style={baseStyle}>\r\n {column.editCell(editProps)}\r\n {validationError && <p className=\"text-xs text-red-500 mt-0.5\">{validationError}</p>}\r\n </td>\r\n );\r\n }\r\n return (\r\n <td className={`px-4 py-2 ${alignClass} ${column.className ?? ''} ${className}`} style={baseStyle}>\r\n <InlineEditor\r\n value={pendingValue ?? value}\r\n onSave={(v) => onPendingChange(v)}\r\n onCancel={onCancelEdit}\r\n error={validationError}\r\n />\r\n </td>\r\n );\r\n }\r\n\r\n // Single cell editing with custom editor\r\n if (isEditing && column.editCell) {\r\n const editProps = {\r\n value,\r\n row,\r\n column,\r\n onSave: onSaveEdit,\r\n onCancel: onCancelEdit,\r\n error: validationError,\r\n };\r\n return (\r\n <td className={`px-4 py-2 ${alignClass} ${column.className ?? ''} ${className}`} style={baseStyle}>\r\n {column.editCell(editProps)}\r\n {validationError && <p className=\"text-xs text-red-500 mt-0.5\">{validationError}</p>}\r\n </td>\r\n );\r\n }\r\n\r\n // Single cell editing with default editor\r\n if (isEditing && column.editable) {\r\n return (\r\n <td className={`px-4 py-2 ${alignClass} ${column.className ?? ''} ${className} ${errorBorder}`} style={baseStyle}>\r\n <InlineEditor value={value} onSave={onSaveEdit} onCancel={onCancelEdit} error={validationError} />\r\n </td>\r\n );\r\n }\r\n\r\n // ─── Display mode with optional tooltip ─────────────────────────\r\n const content = column.cell\r\n ? column.cell({ value, row, rowIndex, column })\r\n : (value ?? '—');\r\n\r\n // Resolve tooltip content\r\n const tooltipContent = resolveTooltip(column, value, row, rowIndex, enableTooltip);\r\n\r\n return (\r\n <td\r\n className={`px-4 py-2 text-sm text-[var(--app-text)] ${alignClass} ${column.className ?? ''} ${className}`}\r\n style={baseStyle}\r\n onDoubleClick={column.editable ? onStartEdit : undefined}\r\n >\r\n {tooltipContent ? (\r\n <CellTooltip content={tooltipContent} style={tooltipStyle}>\r\n {content}\r\n </CellTooltip>\r\n ) : (\r\n content\r\n )}\r\n </td>\r\n );\r\n}\r\n\r\nexport const DataTableCell = memo(TableCellInner);\r\n\r\n// ─── Tooltip Resolver ─────────────────────────────────────────────────\r\n\r\nfunction resolveTooltip(\r\n column,\r\n value,\r\n row,\r\n rowIndex,\r\n enableTooltip,\r\n) {\r\n if (!column.tooltip && !enableTooltip) return null;\r\n\r\n if (typeof column.tooltip === 'function') {\r\n return column.tooltip({ value, row, rowIndex, column }) || null;\r\n }\r\n\r\n if (column.tooltip === true) {\r\n return value != null ? String(value) : null;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// ─── Simple Inline Editor ─────────────────────────────────────────────\r\n\r\nfunction InlineEditor({\r\n value,\r\n onSave,\r\n onCancel,\r\n error,\r\n}) {\r\n const [editValue, setEditValue] = useState(String(value ?? ''));\r\n\r\n const handleKeyDown = useCallback(\r\n (e) => {\r\n if (e.key === 'Enter') onSave(editValue);\r\n if (e.key === 'Escape') onCancel();\r\n },\r\n [editValue, onSave, onCancel]\r\n );\r\n\r\n return (\r\n <div>\r\n <input\r\n type=\"text\"\r\n value={editValue}\r\n onChange={(e) => setEditValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n onBlur={() => onSave(editValue)}\r\n className={`w-full px-2 py-1 text-sm border rounded focus:outline-none focus:ring-1 bg-[var(--app-bg)] ${\r\n error\r\n ? 'border-red-400 focus:ring-red-400'\r\n : 'border-brand-500 focus:ring-brand-500'\r\n }`}\r\n autoFocus\r\n />\r\n {error && <p className=\"text-xs text-red-500 mt-0.5\">{error}</p>}\r\n </div>\r\n );\r\n}\r\n","import { useState, useEffect, useRef, useCallback } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nexport function PortalDropdown({ anchorRef, open, onClose, children, align = 'right', offset = 4, minWidth = 140, className = '' }) {\r\n const dropdownRef = useRef(null);\r\n const [position, setPosition] = useState({ top: 0, left: 0 });\r\n const [flipY, setFlipY] = useState(false);\r\n const [visible, setVisible] = useState(false);\r\n\r\n const computePosition = useCallback(() => {\r\n const anchor = anchorRef.current;\r\n const dropdown = dropdownRef.current;\r\n if (!anchor || !dropdown) return;\r\n const rect = anchor.getBoundingClientRect();\r\n const dropRect = dropdown.getBoundingClientRect();\r\n const viewportH = window.innerHeight;\r\n const viewportW = window.innerWidth;\r\n const spaceBelow = viewportH - rect.bottom - offset;\r\n const spaceAbove = rect.top - offset;\r\n const shouldFlip = spaceBelow < dropRect.height && spaceAbove > spaceBelow;\r\n setFlipY(shouldFlip);\r\n const top = shouldFlip ? rect.top - dropRect.height - offset : rect.bottom + offset;\r\n let left = align === 'right' ? rect.right - dropRect.width : rect.left;\r\n left = Math.max(8, Math.min(left, viewportW - dropRect.width - 8));\r\n setPosition({ top, left });\r\n setVisible(true);\r\n }, [anchorRef, align, offset]);\r\n\r\n useEffect(() => {\r\n if (!open) { setVisible(false); return; }\r\n const frame = requestAnimationFrame(computePosition);\r\n const handleUpdate = () => computePosition();\r\n window.addEventListener('scroll', handleUpdate, true);\r\n window.addEventListener('resize', handleUpdate);\r\n return () => { cancelAnimationFrame(frame); window.removeEventListener('scroll', handleUpdate, true); window.removeEventListener('resize', handleUpdate); };\r\n }, [open, computePosition]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e) => {\r\n const target = e.target;\r\n if (dropdownRef.current && !dropdownRef.current.contains(target) && anchorRef.current && !anchorRef.current.contains(target)) onClose();\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open, onClose, anchorRef]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e) => { if (e.key === 'Escape') onClose(); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open, onClose]);\r\n\r\n if (!open) return null;\r\n\r\n return createPortal(\r\n <div ref={dropdownRef} role=\"menu\"\r\n className={`fixed z-[9999] bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 transition-opacity duration-150 ${visible ? 'opacity-100' : 'opacity-0'} ${flipY ? 'origin-bottom' : 'origin-top'} ${className}`}\r\n style={{ top: position.top, left: position.left, minWidth }}>\r\n {children}\r\n </div>,\r\n document.body\r\n );\r\n}\r\n","import React, { memo, useCallback, useRef } from 'react';\r\nimport { ChevronRight, ChevronDown, MoreVertical } from 'lucide-react';\r\nimport { DataTableCell } from './TableCell.jsx';\r\nimport { PortalDropdown } from './PortalDropdown.jsx';\r\n\r\nfunction DataTableRowInner({\r\n row,\r\n rowIndex,\r\n rowKey,\r\n columns,\r\n columnWidths,\r\n isSelected,\r\n isExpanded,\r\n showCheckbox,\r\n showExpandToggle,\r\n rowActions,\r\n onToggleSelect,\r\n onShiftSelect,\r\n onToggleExpand,\r\n onClick,\r\n onDoubleClick,\r\n editingCell,\r\n onStartEdit,\r\n onSaveEdit,\r\n onCancelEdit,\r\n expandContent,\r\n striped = false,\r\n compact = false,\r\n rowClassName = '',\r\n rowStyle,\r\n onContextMenu,\r\n validationErrors,\r\n pendingEdits,\r\n isEditingRow = false,\r\n onPendingChange,\r\n enableTooltips = false,\r\n tooltipStyle,\r\n getCellStyle,\r\n}) {\r\n const [showActionsMenu, setShowActionsMenu] = React.useState(false);\r\n const actionBtnRef = useRef(null);\r\n\r\n const handleClick = useCallback(() => onClick?.(row), [onClick, row]);\r\n const handleDoubleClick = useCallback(() => onDoubleClick?.(row), [onDoubleClick, row]);\r\n\r\n const py = compact ? 'py-1' : 'py-2';\r\n const bgClass = isSelected\r\n ? 'bg-brand-50 dark:bg-brand-900/20'\r\n : striped && rowIndex % 2 === 1\r\n ? 'bg-gray-50/50 dark:bg-gray-800/30'\r\n : 'bg-[var(--app-bg,white)]';\r\n\r\n const hasActions = rowActions && rowActions.some((a) => !a.hidden?.(row));\r\n\r\n return (\r\n <>\r\n <tr\r\n className={`border-b border-[var(--app-border,#e5e7eb)] hover:bg-[var(--app-hover,#f3f4f6)] transition-colors ${bgClass} ${onClick ? 'cursor-pointer' : ''} ${rowClassName}`}\r\n style={rowStyle}\r\n onClick={handleClick}\r\n onDoubleClick={handleDoubleClick}\r\n onContextMenu={onContextMenu}\r\n role=\"row\"\r\n aria-selected={isSelected}\r\n >\r\n {showCheckbox && (\r\n <td className={`px-4 ${py} w-12`}>\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onChange={(e) => {\r\n if (e.nativeEvent instanceof MouseEvent && e.nativeEvent.shiftKey && onShiftSelect) {\r\n onShiftSelect(rowKey);\r\n } else {\r\n onToggleSelect(rowKey);\r\n }\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"h-4 w-4 rounded border-gray-300 text-brand-600 focus:ring-brand-600\"\r\n aria-label={`Select row ${rowIndex + 1}`}\r\n />\r\n </td>\r\n )}\r\n {showExpandToggle && (\r\n <td className={`px-2 ${py} w-10`}>\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onToggleExpand(rowKey);\r\n }}\r\n className=\"p-1 rounded hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors\"\r\n aria-label={isExpanded ? 'Collapse row' : 'Expand row'}\r\n aria-expanded={isExpanded}\r\n >\r\n {isExpanded ? (\r\n <ChevronDown className=\"h-4 w-4 text-gray-500\" />\r\n ) : (\r\n <ChevronRight className=\"h-4 w-4 text-gray-500\" />\r\n )}\r\n </button>\r\n </td>\r\n )}\r\n {columns.map((col) => {\r\n const isCellEditing = isEditingRow\r\n ? col.editable ?? false\r\n : editingCell?.rowKey === rowKey && editingCell?.columnId === col.id;\r\n\r\n return (\r\n <DataTableCell\r\n key={col.id}\r\n row={row}\r\n rowIndex={rowIndex}\r\n column={col}\r\n width={columnWidths[col.id]}\r\n isEditing={isCellEditing}\r\n onStartEdit={() => onStartEdit(rowKey, col.id)}\r\n onSaveEdit={(value) => onSaveEdit(rowKey, col.id, value)}\r\n onCancelEdit={onCancelEdit}\r\n validationError={validationErrors?.[col.id]}\r\n pendingValue={isEditingRow ? pendingEdits?.[col.id] : undefined}\r\n onPendingChange={isEditingRow && onPendingChange ? (v) => onPendingChange(col.id, v) : undefined}\r\n enableTooltip={enableTooltips}\r\n tooltipStyle={tooltipStyle}\r\n themeCellStyle={getCellStyle?.(row, col)}\r\n />\r\n );\r\n })}\r\n {hasActions && (\r\n <td className={`px-4 ${py} text-right`}>\r\n <div className=\"inline-block\">\r\n <button\r\n ref={actionBtnRef}\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setShowActionsMenu((v) => !v);\r\n }}\r\n className=\"p-1 rounded hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors\"\r\n aria-label=\"Row actions\"\r\n aria-haspopup=\"menu\"\r\n aria-expanded={showActionsMenu}\r\n >\r\n <MoreVertical className=\"h-4 w-4 text-gray-500\" />\r\n </button>\r\n <PortalDropdown\r\n anchorRef={actionBtnRef}\r\n open={showActionsMenu}\r\n onClose={() => setShowActionsMenu(false)}\r\n align=\"right\"\r\n >\r\n <RowActionsMenuItems\r\n row={row}\r\n actions={rowActions}\r\n onClose={() => setShowActionsMenu(false)}\r\n />\r\n </PortalDropdown>\r\n </div>\r\n </td>\r\n )}\r\n {!hasActions && rowActions && <td className={`px-4 ${py}`} />}\r\n </tr>\r\n {isExpanded && expandContent && (\r\n <tr className=\"bg-gray-50/50 dark:bg-gray-800/20\">\r\n <td\r\n colSpan={columns.length + (showCheckbox ? 1 : 0) + (showExpandToggle ? 1 : 0) + (rowActions ? 1 : 0)}\r\n className=\"px-8 py-4\"\r\n >\r\n {expandContent}\r\n </td>\r\n </tr>\r\n )}\r\n </>\r\n );\r\n}\r\n\r\nexport const DataTableRow = memo(DataTableRowInner);\r\n\r\n// ─── Row Actions Menu Items ───────────────────────────────────────────\r\n\r\nfunction RowActionsMenuItems({\r\n row,\r\n actions,\r\n onClose,\r\n}) {\r\n const visibleActions = actions.filter((a) => !a.hidden?.(row));\r\n\r\n return (\r\n <>\r\n {visibleActions.map((action) => (\r\n <button\r\n key={action.id}\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n action.onClick(row);\r\n onClose();\r\n }}\r\n disabled={action.disabled?.(row)}\r\n className={`w-full text-left px-3 py-2 text-sm flex items-center gap-2 transition-colors\r\n ${action.variant === 'danger'\r\n ? 'text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20'\r\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700'\r\n }\r\n ${action.disabled?.(row) ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}\r\n `}\r\n role=\"menuitem\"\r\n >\r\n {action.icon}\r\n {action.label}\r\n </button>\r\n ))}\r\n </>\r\n );\r\n}\r\n","import { ChevronRight, ChevronDown } from 'lucide-react';\r\n\r\nexport function GroupRowComponent({ group, colSpan, isExpanded, onToggle, renderGroupHeader }) {\r\n const indent = group.__level * 24;\r\n return (\r\n <tr className=\"bg-gray-50 dark:bg-gray-800/50 border-b border-[var(--app-border,#e5e7eb)]\">\r\n <td colSpan={colSpan} className=\"px-4 py-2\">\r\n <div className=\"flex items-center gap-2\" style={{ paddingLeft: indent }}>\r\n <button type=\"button\" onClick={() => onToggle(group.__groupKey)}\r\n className=\"p-0.5 rounded hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors\"\r\n aria-label={isExpanded ? 'Collapse group' : 'Expand group'} aria-expanded={isExpanded}>\r\n {isExpanded ? <ChevronDown className=\"h-4 w-4 text-gray-500\" /> : <ChevronRight className=\"h-4 w-4 text-gray-500\" />}\r\n </button>\r\n {renderGroupHeader ? renderGroupHeader(group.__groupKey, group.__groupValue, group.__children, group.__level) : (\r\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\r\n {group.__groupField}: {String(group.__groupValue ?? 'N/A')}\r\n <span className=\"ml-2 text-xs text-gray-400 font-normal\">({group.__children.length} items)</span>\r\n {Object.entries(group.__aggregates).length > 0 && (\r\n <span className=\"ml-3 text-xs text-gray-400\">\r\n {Object.entries(group.__aggregates).map(([key, val]) => (\r\n <span key={key} className=\"ml-2\">{key}: {typeof val === 'number' ? val.toLocaleString() : String(val)}</span>\r\n ))}\r\n </span>\r\n )}\r\n </span>\r\n )}\r\n </div>\r\n </td>\r\n </tr>\r\n );\r\n}\r\n","import React, { useCallback, useRef, useEffect, useMemo } from 'react';\r\nimport { DataTableHeader } from './DataTableHeader.jsx';\r\nimport { DataTableRow } from './DataTableRow.jsx';\r\nimport { GroupRowComponent } from './GroupRow.jsx';\r\n\r\nexport function TableView({ table, props, onContextMenu }) {\r\n const {\r\n processedData,\r\n sorting,\r\n filtering,\r\n selection,\r\n columnManager,\r\n expandedKeys,\r\n toggleExpand,\r\n editingCell,\r\n setEditingCell,\r\n getKey,\r\n pagination,\r\n // Enhanced features\r\n theme: themeSystem,\r\n rowGrouping,\r\n treeData,\r\n virtualization,\r\n pinnedTopRows,\r\n pinnedBottomRows,\r\n unpinnedData,\r\n } = table;\r\n\r\n const {\r\n expandable,\r\n rowActions,\r\n onRowClick,\r\n onRowDoubleClick,\r\n onCellEdit,\r\n striped = false,\r\n compact = false,\r\n maxHeight,\r\n bordered = false,\r\n rowClassName,\r\n rowPinning: rowPinningConfig,\r\n rowGrouping: rowGroupingConfig,\r\n treeData: treeDataConfig,\r\n enableTooltips = false,\r\n onRowReorder: _onRowReorder,\r\n floatingFilters = false,\r\n } = props;\r\n\r\n // Use virtualization container ref if enabled, otherwise local ref\r\n const localContainerRef = useRef(null);\r\n const containerRef = virtualization.enabled\r\n ? virtualization.containerRef\r\n : localContainerRef;\r\n\r\n // Infinite scroll\r\n useEffect(() => {\r\n if (!pagination.isInfinite || !pagination.hasMore || !pagination.onLoadMore) return;\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const handleScroll = () => {\r\n const { scrollTop, scrollHeight, clientHeight } = container;\r\n if (scrollHeight - scrollTop - clientHeight < 100) {\r\n pagination.onLoadMore?.();\r\n }\r\n };\r\n\r\n container.addEventListener('scroll', handleScroll);\r\n return () => container.removeEventListener('scroll', handleScroll);\r\n }, [pagination, containerRef]);\r\n\r\n const handleStartEdit = useCallback(\r\n (rowKey, columnId) => {\r\n setEditingCell({ rowKey, columnId });\r\n },\r\n [setEditingCell]\r\n );\r\n\r\n const handleSaveEdit = useCallback(\r\n (rowKey, columnId, value) => {\r\n onCellEdit?.(rowKey, columnId, value);\r\n setEditingCell(null);\r\n },\r\n [onCellEdit, setEditingCell]\r\n );\r\n\r\n const handleCancelEdit = useCallback(() => setEditingCell(null), [setEditingCell]);\r\n\r\n const showExpandToggle = expandable?.enabled ?? false;\r\n const hasActions = !!rowActions?.length;\r\n const hasPinnedRows = !!(rowPinningConfig && (pinnedTopRows.length || pinnedBottomRows.length));\r\n\r\n // Determine which data to render\r\n const dataToRender = hasPinnedRows ? unpinnedData : processedData;\r\n\r\n // Apply row grouping if enabled\r\n const groupedData = useMemo(() => {\r\n if (rowGrouping.enabled) {\r\n return rowGrouping.applyGrouping(dataToRender);\r\n }\r\n return dataToRender;\r\n }, [rowGrouping, dataToRender]);\r\n\r\n // Apply virtualization\r\n const virtualData = useMemo(() => {\r\n if (virtualization.enabled) {\r\n return virtualization.getVirtualItems(groupedData);\r\n }\r\n return groupedData;\r\n }, [virtualization, groupedData]);\r\n\r\n // Tree data flattening\r\n const treeRows = useMemo(() => {\r\n if (treeData.enabled && treeDataConfig) {\r\n return treeData.flattenTree(virtualData);\r\n }\r\n return null;\r\n }, [treeData, treeDataConfig, virtualData]);\r\n\r\n const containerStyle = maxHeight\r\n ? { maxHeight, overflow: 'auto' }\r\n : virtualization.enabled\r\n ? { height: '100%', overflow: 'auto' }\r\n : {};\r\n\r\n const colSpan = columnManager.visibleColumns.length\r\n + (selection.showCheckbox ? 1 : 0)\r\n + (showExpandToggle ? 1 : 0)\r\n + (hasActions ? 1 : 0);\r\n\r\n const renderRow = (row, index, extraClassName = '') => {\r\n const key = getKey(row, index);\r\n const resolvedClassName = typeof rowClassName === 'function'\r\n ? rowClassName(row)\r\n : rowClassName ?? '';\r\n\r\n // Tree data indentation\r\n const treeRow = treeRows?.find((tr) => tr.treeKey === key);\r\n\r\n // Row editing state\r\n const isRowEditing = table.editing.isEditingRow(key);\r\n\r\n // Theme-resolved row style\r\n const themeRowStyle = themeSystem.getRowStyle(row, index, selection.isSelected(key), striped);\r\n const themeRowClassName = themeSystem.getConditionalClassName(row);\r\n\r\n return (\r\n <DataTableRow\r\n key={key}\r\n row={row}\r\n rowIndex={index}\r\n rowKey={key}\r\n columns={columnManager.visibleColumns}\r\n columnWidths={columnManager.columnWidths}\r\n isSelected={selection.isSelected(key)}\r\n isExpanded={expandedKeys.includes(key)}\r\n showCheckbox={selection.showCheckbox}\r\n showExpandToggle={showExpandToggle || (treeRow?.hasChildren ?? false)}\r\n rowActions={rowActions}\r\n onToggleSelect={selection.toggleRow}\r\n onShiftSelect={(targetKey) => selection.selectRange(targetKey, processedData)}\r\n onToggleExpand={treeRow ? () => treeData.toggleNode(key) : toggleExpand}\r\n onClick={onRowClick}\r\n onDoubleClick={onRowDoubleClick}\r\n editingCell={editingCell}\r\n onStartEdit={handleStartEdit}\r\n onSaveEdit={handleSaveEdit}\r\n onCancelEdit={handleCancelEdit}\r\n expandContent={expandable?.render?.(row)}\r\n striped={striped}\r\n compact={compact}\r\n rowClassName={`${resolvedClassName} ${themeRowClassName} ${extraClassName}`}\r\n rowStyle={themeRowStyle}\r\n onContextMenu={onContextMenu ? (e) => onContextMenu(e, row) : undefined}\r\n isEditingRow={isRowEditing}\r\n validationErrors={isRowEditing ? table.editing.validationErrors : undefined}\r\n pendingEdits={isRowEditing ? table.editing.pendingEdits : undefined}\r\n onPendingChange={isRowEditing ? table.editing.updatePendingEdit : undefined}\r\n enableTooltips={enableTooltips}\r\n tooltipStyle={themeSystem.tooltipStyle}\r\n getCellStyle={themeSystem.getCellStyle}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n style={containerStyle}\r\n className=\"overflow-x-auto\"\r\n onScroll={virtualization.enabled ? virtualization.handleScroll : undefined}\r\n >\r\n {/* Virtualization spacer */}\r\n {virtualization.enabled && (\r\n <div style={virtualization.spacerStyle}>\r\n <div style={virtualization.offsetStyle}>\r\n <TableContent />\r\n </div>\r\n </div>\r\n )}\r\n {!virtualization.enabled && <TableContent />}\r\n </div>\r\n );\r\n\r\n function TableContent() {\r\n return (\r\n <table\r\n className={`w-full text-sm ${bordered ? 'border-collapse' : ''}`}\r\n role=\"grid\"\r\n aria-label={props.ariaLabel ?? 'Data table'}\r\n >\r\n <DataTableHeader\r\n columns={columnManager.visibleColumns}\r\n getSortDirection={sorting.getSortDirection}\r\n onSort={sorting.toggleSort}\r\n columnWidths={columnManager.columnWidths}\r\n onResize={columnManager.resizeColumn}\r\n enableResizing={columnManager.enableResizing}\r\n enableReordering={columnManager.enableReordering}\r\n onReorder={columnManager.reorderColumns}\r\n onReorderById={columnManager.reorderColumnsById}\r\n showCheckbox={selection.showCheckbox}\r\n isAllSelected={selection.isAllSelected(processedData)}\r\n isSomeSelected={selection.isSomeSelected(processedData)}\r\n onToggleAll={() => selection.toggleAll(processedData)}\r\n showExpandToggle={showExpandToggle}\r\n showActions={hasActions}\r\n compact={compact}\r\n getFilterValue={filtering.getFilterValue}\r\n onFilterChange={filtering.setFilter}\r\n floatingFilters={floatingFilters}\r\n showColumnGroups\r\n />\r\n <tbody>\r\n {/* Pinned top rows */}\r\n {hasPinnedRows && pinnedTopRows.map((row, i) =>\r\n renderRow(row, i, 'bg-blue-50/50 dark:bg-blue-900/10')\r\n )}\r\n {hasPinnedRows && pinnedTopRows.length > 0 && (\r\n <tr>\r\n <td colSpan={colSpan} className=\"h-0.5 bg-blue-200 dark:bg-blue-800\" />\r\n </tr>\r\n )}\r\n\r\n {/* Main rows (with grouping support) */}\r\n {treeRows\r\n ? treeRows.map((treeRow, index) =>\r\n renderRow(treeRow.row, index)\r\n )\r\n : virtualData.map((item, index) => {\r\n const grouped = item;\r\n if (grouped.__isGroupRow) {\r\n return (\r\n <GroupRowComponent\r\n key={grouped.__groupKey}\r\n group={grouped}\r\n colSpan={colSpan}\r\n isExpanded={rowGrouping.isGroupExpanded(grouped.__groupKey)}\r\n onToggle={rowGrouping.toggleGroup}\r\n renderGroupHeader={rowGroupingConfig?.renderGroupHeader}\r\n />\r\n );\r\n }\r\n return renderRow(item, index);\r\n })\r\n }\r\n\r\n {/* Pinned bottom rows */}\r\n {hasPinnedRows && pinnedBottomRows.length > 0 && (\r\n <tr>\r\n <td colSpan={colSpan} className=\"h-0.5 bg-blue-200 dark:bg-blue-800\" />\r\n </tr>\r\n )}\r\n {hasPinnedRows && pinnedBottomRows.map((row, i) =>\r\n renderRow(row, i, 'bg-blue-50/50 dark:bg-blue-900/10')\r\n )}\r\n </tbody>\r\n </table>\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport { getCellValue } from '../utils.js';\r\n\r\nexport function GridView({ table, props }) {\r\n const { processedData, selection, columnManager, getKey } = table;\r\n const { renderGridCard, onRowClick, theme } = props;\r\n\r\n return (\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 p-4\">\r\n {processedData.map((row, index) => {\r\n const key = getKey(row, index);\r\n const isSelected = selection.isSelected(key);\r\n\r\n if (renderGridCard) {\r\n return (\r\n <div\r\n key={key}\r\n className={`${isSelected ? 'ring-2 ring-brand-500' : ''} ${onRowClick ? 'cursor-pointer' : ''}`}\r\n onClick={() => onRowClick?.(row)}\r\n >\r\n {renderGridCard(row)}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n key={key}\r\n className={`bg-[var(--app-bg,white)] border border-[var(--app-border,#e5e7eb)] rounded-lg p-4 shadow-sm hover:shadow-md transition-shadow\r\n ${isSelected ? 'ring-2 ring-brand-500' : ''}\r\n ${onRowClick ? 'cursor-pointer' : ''}\r\n ${theme?.gridCard ?? ''}\r\n `}\r\n onClick={() => onRowClick?.(row)}\r\n role=\"article\"\r\n >\r\n {selection.showCheckbox && (\r\n <div className=\"mb-3\">\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onChange={() => selection.toggleRow(key)}\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"h-4 w-4 rounded border-gray-300 text-brand-600 focus:ring-brand-600\"\r\n aria-label={`Select item ${index + 1}`}\r\n />\r\n </div>\r\n )}\r\n <div className=\"space-y-2\">\r\n {columnManager.visibleColumns.slice(0, 6).map((col) => {\r\n const value = getCellValue(row, col);\r\n const content = col.cell\r\n ? col.cell({ value, row, rowIndex: index, column: col })\r\n : (value ?? '—');\r\n\r\n return (\r\n <div key={col.id}>\r\n <span className=\"text-xs font-medium text-gray-500 uppercase\">{col.header}</span>\r\n <div className=\"text-sm text-[var(--app-text)]\">{content}</div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\nimport { getCellValue } from '../utils.js';\r\n\r\nexport function ListView({ table, props }) {\r\n const { processedData, selection, columnManager, getKey } = table;\r\n const { renderListItem, onRowClick, theme } = props;\r\n\r\n return (\r\n <div className=\"divide-y divide-[var(--app-border,#e5e7eb)]\">\r\n {processedData.map((row, index) => {\r\n const key = getKey(row, index);\r\n const isSelected = selection.isSelected(key);\r\n\r\n if (renderListItem) {\r\n return (\r\n <div\r\n key={key}\r\n className={`${isSelected ? 'bg-brand-50 dark:bg-brand-900/20' : ''} ${onRowClick ? 'cursor-pointer' : ''}`}\r\n >\r\n {renderListItem(row)}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n key={key}\r\n className={`flex items-center gap-4 px-4 py-3 hover:bg-[var(--app-hover,#f3f4f6)] transition-colors\r\n ${isSelected ? 'bg-brand-50 dark:bg-brand-900/20' : ''}\r\n ${onRowClick ? 'cursor-pointer' : ''}\r\n ${theme?.listItem ?? ''}\r\n `}\r\n onClick={() => onRowClick?.(row)}\r\n role=\"listitem\"\r\n >\r\n {selection.showCheckbox && (\r\n <input\r\n type=\"checkbox\"\r\n checked={isSelected}\r\n onChange={() => selection.toggleRow(key)}\r\n onClick={(e) => e.stopPropagation()}\r\n className=\"h-4 w-4 rounded border-gray-300 text-brand-600 focus:ring-brand-600 shrink-0\"\r\n aria-label={`Select item ${index + 1}`}\r\n />\r\n )}\r\n <div className=\"flex-1 flex items-center gap-6 min-w-0\">\r\n {columnManager.visibleColumns.slice(0, 5).map((col) => {\r\n const value = getCellValue(row, col);\r\n const content = col.cell\r\n ? col.cell({ value, row, rowIndex: index, column: col })\r\n : (value ?? '—');\r\n\r\n return (\r\n <div key={col.id} className=\"min-w-0\">\r\n <span className=\"text-xs text-gray-500 block\">{col.header}</span>\r\n <div className=\"text-sm text-[var(--app-text)] truncate\">{content}</div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';\r\n\r\nexport function DataTablePagination({\r\n page,\r\n pageSize,\r\n totalPages,\r\n totalItems,\r\n pageSizeOptions,\r\n onPageChange,\r\n onPageSizeChange,\r\n}) {\r\n const startItem = (page - 1) * pageSize + 1;\r\n const endItem = Math.min(page * pageSize, totalItems);\r\n\r\n const getPageNumbers = () => {\r\n if (totalPages <= 7) {\r\n return Array.from({ length: totalPages }, (_, i) => i + 1);\r\n }\r\n const pages = [1];\r\n if (page > 3) pages.push('...');\r\n const start = Math.max(2, page - 1);\r\n const end = Math.min(totalPages - 1, page + 1);\r\n for (let i = start; i <= end; i++) pages.push(i);\r\n if (page < totalPages - 2) pages.push('...');\r\n pages.push(totalPages);\r\n return pages;\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between px-4 py-3 border-t border-[var(--app-border,#e5e7eb)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"text-sm text-gray-500\">\r\n {startItem}–{endItem} of {totalItems}\r\n </span>\r\n <select\r\n value={pageSize}\r\n onChange={(e) => onPageSizeChange(Number(e.target.value))}\r\n className=\"h-8 px-2 text-sm border border-gray-300 dark:border-gray-600 rounded-md bg-[var(--app-bg)] focus:outline-none focus:ring-1 focus:ring-brand-500\"\r\n aria-label=\"Rows per page\"\r\n >\r\n {pageSizeOptions.map((size) => (\r\n <option key={size} value={size}>{size} / page</option>\r\n ))}\r\n </select>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <PaginationButton\r\n onClick={() => onPageChange(1)}\r\n disabled={page <= 1}\r\n aria-label=\"First page\"\r\n >\r\n <ChevronsLeft className=\"h-4 w-4\" />\r\n </PaginationButton>\r\n <PaginationButton\r\n onClick={() => onPageChange(page - 1)}\r\n disabled={page <= 1}\r\n aria-label=\"Previous page\"\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </PaginationButton>\r\n {getPageNumbers().map((p, i) =>\r\n p === '...' ? (\r\n <span key={`ellipsis-${i}`} className=\"px-2 text-sm text-gray-400\">…</span>\r\n ) : (\r\n <PaginationButton\r\n key={p}\r\n onClick={() => onPageChange(p)}\r\n active={p === page}\r\n aria-label={`Page ${p}`}\r\n aria-current={p === page ? 'page' : undefined}\r\n >\r\n {p}\r\n </PaginationButton>\r\n )\r\n )}\r\n <PaginationButton\r\n onClick={() => onPageChange(page + 1)}\r\n disabled={page >= totalPages}\r\n aria-label=\"Next page\"\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </PaginationButton>\r\n <PaginationButton\r\n onClick={() => onPageChange(totalPages)}\r\n disabled={page >= totalPages}\r\n aria-label=\"Last page\"\r\n >\r\n <ChevronsRight className=\"h-4 w-4\" />\r\n </PaginationButton>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction PaginationButton({\r\n children,\r\n onClick,\r\n disabled = false,\r\n active = false,\r\n ...rest\r\n}) {\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={onClick}\r\n disabled={disabled}\r\n className={`inline-flex items-center justify-center h-8 min-w-[32px] px-2 text-sm rounded-md transition-colors\r\n ${active\r\n ? 'bg-brand-600 text-white font-medium'\r\n : disabled\r\n ? 'text-gray-300 dark:text-gray-600 cursor-not-allowed'\r\n : 'text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700'\r\n }`}\r\n {...rest}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport { X, Columns3, SlidersHorizontal, GripVertical } from 'lucide-react';\r\n\r\nexport function SidebarPanel({\r\n panels,\r\n activePanel,\r\n onClose,\r\n columns,\r\n hiddenColumns,\r\n columnOrder,\r\n onToggleColumn,\r\n onReorderColumns,\r\n filters,\r\n onFilterChange,\r\n onClearFilters,\r\n}) {\r\n const panel = panels.find((p) => p.type === activePanel);\r\n if (!panel) return null;\r\n\r\n return (\r\n <div className=\"w-64 border-l border-[var(--app-border,#e5e7eb)] bg-[var(--app-bg,white)] flex flex-col overflow-hidden shrink-0\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-[var(--app-border,#e5e7eb)]\">\r\n <span className=\"text-sm font-semibold text-[var(--app-text)]\">{panel.title}</span>\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n className=\"p-1 text-gray-400 hover:text-gray-600 rounded transition-colors\"\r\n aria-label=\"Close panel\"\r\n >\r\n <X className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"flex-1 overflow-y-auto p-3\">\r\n {panel.type === 'columns' && columns && onToggleColumn && (\r\n <ColumnPanel\r\n columns={columns}\r\n hiddenColumns={hiddenColumns ?? new Set()}\r\n onToggle={onToggleColumn}\r\n />\r\n )}\r\n {panel.type === 'filters' && columns && onFilterChange && (\r\n <FilterPanel\r\n columns={columns}\r\n filters={filters ?? []}\r\n onFilterChange={onFilterChange}\r\n onClearFilters={onClearFilters}\r\n />\r\n )}\r\n {panel.type === 'custom' && panel.render?.()}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Column Panel ─────────────────────────────────────────────────────\r\n\r\nfunction ColumnPanel({\r\n columns,\r\n hiddenColumns,\r\n onToggle,\r\n}) {\r\n return (\r\n <div className=\"space-y-1\">\r\n <p className=\"text-xs text-gray-500 mb-2\">Toggle column visibility</p>\r\n {columns.map((col) => (\r\n <label\r\n key={col.id}\r\n className=\"flex items-center gap-2 px-2 py-1.5 rounded cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-700\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={!hiddenColumns.has(col.id)}\r\n onChange={() => onToggle(col.id)}\r\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-brand-600 focus:ring-brand-600\"\r\n />\r\n <span className=\"text-sm text-gray-700 dark:text-gray-300 truncate\">{col.header}</span>\r\n </label>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Filter Panel ─────────────────────────────────────────────────────\r\n\r\nfunction FilterPanel({\r\n columns,\r\n filters,\r\n onFilterChange,\r\n onClearFilters,\r\n}) {\r\n const filterableColumns = columns.filter((c) => c.filterable !== false && c.filterType);\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n {onClearFilters && filters.length > 0 && (\r\n <button\r\n type=\"button\"\r\n onClick={onClearFilters}\r\n className=\"text-xs text-brand-600 hover:text-brand-700 underline\"\r\n >\r\n Clear all filters\r\n </button>\r\n )}\r\n {filterableColumns.length === 0 && (\r\n <p className=\"text-xs text-gray-400\">No filterable columns</p>\r\n )}\r\n {filterableColumns.map((col) => {\r\n const currentFilter = filters.find((f) => f.columnId === col.id);\r\n const value = currentFilter?.value ?? '';\r\n\r\n return (\r\n <div key={col.id}>\r\n <label className=\"text-xs font-medium text-gray-500 block mb-1\">{col.header}</label>\r\n {(col.filterType === 'text' || col.filterType === 'number') && (\r\n <input\r\n type={col.filterType === 'number' ? 'number' : 'text'}\r\n value={String(value)}\r\n onChange={(e) => onFilterChange(col.id, e.target.value, 'contains')}\r\n placeholder={`Filter...`}\r\n className=\"w-full px-2 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg)]\"\r\n />\r\n )}\r\n {col.filterType === 'select' && col.filterOptions && (\r\n <select\r\n value={String(value)}\r\n onChange={(e) => onFilterChange(col.id, e.target.value, 'eq')}\r\n className=\"w-full px-2 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg)]\"\r\n >\r\n <option value=\"\">All</option>\r\n {col.filterOptions.map((opt) => (\r\n <option key={opt.value} value={opt.value}>{opt.label}</option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from 'react';\r\nimport { Bookmark, Trash2, Save, Check, Edit3 } from 'lucide-react';\r\n\r\nexport function PresetManager({\r\n presets,\r\n onSave,\r\n onLoad,\r\n onDelete,\r\n onRename,\r\n getCurrentConfig,\r\n}) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [newName, setNewName] = useState('');\r\n const [editingId, setEditingId] = useState(null);\r\n const [editName, setEditName] = useState('');\r\n const ref = React.useRef(null);\r\n\r\n React.useEffect(() => {\r\n if (!isOpen) return;\r\n const handler = (e) => {\r\n if (ref.current && !ref.current.contains(e.target)) {\r\n setIsOpen(false);\r\n setEditingId(null);\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [isOpen]);\r\n\r\n const handleSave = () => {\r\n if (!newName.trim()) return;\r\n onSave(newName.trim(), getCurrentConfig());\r\n setNewName('');\r\n };\r\n\r\n const handleRename = (id) => {\r\n if (!editName.trim()) return;\r\n onRename(id, editName.trim());\r\n setEditingId(null);\r\n };\r\n\r\n return (\r\n <div className=\"relative\" ref={ref}>\r\n <button\r\n type=\"button\"\r\n onClick={() => setIsOpen((v) => !v)}\r\n className=\"inline-flex items-center gap-1.5 px-3 py-2 text-sm text-gray-600 hover:text-gray-800 hover:bg-gray-100 rounded-md transition-colors\"\r\n aria-label=\"Table presets\"\r\n title=\"Table presets\"\r\n >\r\n <Bookmark className=\"h-4 w-4\" />\r\n Presets\r\n {presets.length > 0 && (\r\n <span className=\"ml-1 text-xs bg-gray-200 text-gray-600 rounded-full px-1.5 py-0.5\">\r\n {presets.length}\r\n </span>\r\n )}\r\n </button>\r\n {isOpen && (\r\n <div className=\"absolute right-0 top-full mt-1 z-50 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-3 min-w-[280px]\">\r\n {/* Save new preset */}\r\n <div className=\"flex items-center gap-2 mb-3\">\r\n <input\r\n type=\"text\"\r\n value={newName}\r\n onChange={(e) => setNewName(e.target.value)}\r\n onKeyDown={(e) => e.key === 'Enter' && handleSave()}\r\n placeholder=\"Save current view as...\"\r\n className=\"flex-1 px-2 py-1.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg)]\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={!newName.trim()}\r\n className=\"p-1.5 text-brand-600 hover:bg-brand-50 rounded disabled:opacity-50\"\r\n aria-label=\"Save preset\"\r\n >\r\n <Save className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n\r\n {/* Preset list */}\r\n {presets.length === 0 ? (\r\n <p className=\"text-xs text-gray-400 text-center py-2\">No saved presets</p>\r\n ) : (\r\n <div className=\"space-y-1 max-h-64 overflow-y-auto\">\r\n {presets.map((preset) => (\r\n <div\r\n key={preset.id}\r\n className=\"flex items-center justify-between px-2 py-1.5 rounded hover:bg-gray-50 dark:hover:bg-gray-700 group\"\r\n >\r\n {editingId === preset.id ? (\r\n <div className=\"flex items-center gap-1 flex-1\">\r\n <input\r\n type=\"text\"\r\n value={editName}\r\n onChange={(e) => setEditName(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') handleRename(preset.id);\r\n if (e.key === 'Escape') setEditingId(null);\r\n }}\r\n className=\"flex-1 px-1 py-0.5 text-sm border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-brand-500 bg-[var(--app-bg)]\"\r\n autoFocus\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => handleRename(preset.id)}\r\n className=\"p-1 text-green-600 hover:bg-green-50 rounded\"\r\n >\r\n <Check className=\"h-3 w-3\" />\r\n </button>\r\n </div>\r\n ) : (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={() => { onLoad(preset.id); setIsOpen(false); }}\r\n className=\"text-sm text-gray-700 dark:text-gray-300 truncate flex-1 text-left\"\r\n title={`Load \"${preset.name}\"`}\r\n >\r\n {preset.name}\r\n </button>\r\n <div className=\"flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\r\n <button\r\n type=\"button\"\r\n onClick={() => { setEditingId(preset.id); setEditName(preset.name); }}\r\n className=\"p-1 text-gray-400 hover:text-gray-600\"\r\n aria-label={`Rename preset ${preset.name}`}\r\n >\r\n <Edit3 className=\"h-3 w-3\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => onDelete(preset.id)}\r\n className=\"p-1 text-gray-400 hover:text-red-500\"\r\n aria-label={`Delete preset ${preset.name}`}\r\n >\r\n <Trash2 className=\"h-3 w-3\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useRef } from 'react';\r\n\r\nexport function ContextMenu({ x, y, row, items, onClose }) {\r\n const ref = useRef(null);\r\n\r\n useEffect(() => {\r\n const handler = (e) => { if (ref.current && !ref.current.contains(e.target)) onClose(); };\r\n const escHandler = (e) => { if (e.key === 'Escape') onClose(); };\r\n document.addEventListener('mousedown', handler);\r\n document.addEventListener('keydown', escHandler);\r\n return () => { document.removeEventListener('mousedown', handler); document.removeEventListener('keydown', escHandler); };\r\n }, [onClose]);\r\n\r\n useEffect(() => {\r\n if (!ref.current) return;\r\n const rect = ref.current.getBoundingClientRect();\r\n const el = ref.current;\r\n if (rect.right > window.innerWidth) el.style.left = `${x - rect.width}px`;\r\n if (rect.bottom > window.innerHeight) el.style.top = `${y - rect.height}px`;\r\n }, [x, y]);\r\n\r\n const visibleItems = items.filter((item) => !item.hidden?.(row));\r\n if (!visibleItems.length) return null;\r\n\r\n return (\r\n <div ref={ref} className=\"fixed z-[9999] bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-xl py-1 min-w-[160px] animate-in fade-in zoom-in-95 duration-100\"\r\n style={{ left: x, top: y }} role=\"menu\">\r\n {visibleItems.map((item) => {\r\n if (item.separator) return <div key={item.id} className=\"my-1 border-t border-gray-200 dark:border-gray-700\" role=\"separator\" />;\r\n return (\r\n <button key={item.id} type=\"button\" onClick={() => { item.onClick(row); onClose(); }} disabled={item.disabled?.(row)}\r\n className={`w-full text-left px-3 py-2 text-sm flex items-center gap-2 transition-colors ${item.variant === 'danger' ? 'text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20' : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700'} ${item.disabled?.(row) ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\r\n role=\"menuitem\">\r\n {item.icon && <span className=\"w-4 h-4 flex-shrink-0\">{item.icon}</span>}\r\n {item.label}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import { useMemo } from 'react';\r\n\r\nexport function StatusBar({ config, data, state }) {\r\n const dynamicItems = useMemo(() => config.computeItems?.(data, state) ?? [], [config, data, state]);\r\n const allItems = useMemo(() => [...(config.items ?? []), ...dynamicItems], [config.items, dynamicItems]);\r\n if (!allItems.length) return null;\r\n\r\n return (\r\n <div className={`flex items-center gap-4 px-4 py-2 text-xs text-gray-500 border-t border-[var(--app-border,#e5e7eb)] bg-[var(--app-surface,#f9fafb)] ${config.className ?? ''}`}\r\n role=\"status\" aria-label=\"Table status\">\r\n {allItems.map((item) => (\r\n <div key={item.id} className=\"flex items-center gap-1.5\">\r\n {item.icon && <span className=\"w-3.5 h-3.5 flex-shrink-0\">{item.icon}</span>}\r\n <span className=\"text-gray-400\">{item.label}:</span>\r\n <span className=\"font-medium text-gray-600\">{item.value}</span>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import { useMemo } from 'react';\r\nimport { getCellValue } from '../utils.js';\r\n\r\nexport const DEFAULT_COLORS = [\r\n '#6366f1', '#f59e0b', '#10b981', '#ef4444', '#8b5cf6',\r\n '#06b6d4', '#f97316', '#84cc16', '#ec4899', '#14b8a6',\r\n];\r\n\r\nfunction toNumber(val) {\r\n if (typeof val === 'number') return val;\r\n if (typeof val === 'boolean') return val ? 1 : 0;\r\n const n = Number(val);\r\n return isNaN(n) ? 0 : n;\r\n}\r\n\r\nfunction aggregate(values, fn) {\r\n if (!values.length) return 0;\r\n switch (fn) {\r\n case 'sum': return values.reduce((a, b) => a + b, 0);\r\n case 'avg': return values.reduce((a, b) => a + b, 0) / values.length;\r\n case 'count': return values.length;\r\n case 'min': return Math.min(...values);\r\n case 'max': return Math.max(...values);\r\n default: return values.reduce((a, b) => a + b, 0);\r\n }\r\n}\r\n\r\nfunction aggregateData(data, config, columns, labelCol, dataCols) {\r\n const groupCol = columns.find((c) => c.id === config.groupBy);\r\n if (!groupCol) return [];\r\n const groups = new Map();\r\n data.forEach((row) => {\r\n const key = String(getCellValue(row, groupCol) ?? 'Unknown');\r\n const arr = groups.get(key) ?? [];\r\n arr.push(row);\r\n groups.set(key, arr);\r\n });\r\n const agg = config.aggregation ?? 'sum';\r\n return Array.from(groups.entries()).map(([groupKey, rows]) => {\r\n const point = { label: groupKey };\r\n dataCols.forEach((col) => {\r\n const values = rows.map((r) => toNumber(getCellValue(r, col)));\r\n point[col.id] = aggregate(values, agg);\r\n });\r\n return point;\r\n });\r\n}\r\n\r\nexport function useChartData({ data, config, columns }) {\r\n const chartData = useMemo(() => {\r\n if (!data.length || !config.labelColumn || !config.dataColumns.length) return [];\r\n const labelCol = columns.find((c) => c.id === config.labelColumn);\r\n if (!labelCol) return [];\r\n const dataCols = config.dataColumns.map((id) => columns.find((c) => c.id === id)).filter((c) => c != null);\r\n if (!dataCols.length) return [];\r\n if (config.groupBy) return aggregateData(data, config, columns, labelCol, dataCols);\r\n return data.map((row) => {\r\n const point = { label: String(getCellValue(row, labelCol) ?? '') };\r\n dataCols.forEach((col) => { point[col.id] = toNumber(getCellValue(row, col)); });\r\n return point;\r\n });\r\n }, [data, config, columns]);\r\n\r\n const series = useMemo(() => {\r\n return config.dataColumns.map((id, i) => {\r\n const col = columns.find((c) => c.id === id);\r\n return { key: id, name: col?.header ?? id, color: config.colors?.[i] ?? DEFAULT_COLORS[i % DEFAULT_COLORS.length] };\r\n });\r\n }, [config.dataColumns, config.colors, columns]);\r\n\r\n return { chartData, series };\r\n}\r\n","import { useMemo, useRef, useCallback } from 'react';\r\nimport {\r\n ResponsiveContainer,\r\n BarChart, Bar,\r\n LineChart, Line,\r\n PieChart, Pie, Cell,\r\n AreaChart, Area,\r\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\r\n} from 'recharts';\r\nimport { Download, X, Edit3 } from 'lucide-react';\r\nimport { useChartData, DEFAULT_COLORS } from '../hooks/useChartData.js';\r\n\r\nexport function DataChart({\r\n data,\r\n config,\r\n columns,\r\n onRemove,\r\n onEdit,\r\n className = '',\r\n}) {\r\n const { chartData, series } = useChartData({ data, config, columns });\r\n const chartRef = useRef(null);\r\n const height = config.height ?? 300;\r\n\r\n const handleExportPng = useCallback(async () => {\r\n if (!chartRef.current) return;\r\n try {\r\n const { toPng } = await import('html-to-image');\r\n const dataUrl = await toPng(chartRef.current, { backgroundColor: '#ffffff' });\r\n const link = document.createElement('a');\r\n link.download = `${config.title || 'chart'}.png`;\r\n link.href = dataUrl;\r\n link.click();\r\n } catch {\r\n // html-to-image not available or export failed\r\n }\r\n }, [config.title]);\r\n\r\n if (!chartData.length) {\r\n return (\r\n <div className={`flex items-center justify-center h-48 text-sm text-gray-400 border border-dashed border-gray-300 rounded-lg ${className}`}>\r\n No data to display\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={`bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden ${className}`}>\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-gray-100 dark:border-gray-800\">\r\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate\">\r\n {config.title || 'Chart'}\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n onClick={handleExportPng}\r\n className=\"p-1 text-gray-400 hover:text-gray-600 rounded transition-colors\"\r\n title=\"Export as PNG\"\r\n >\r\n <Download className=\"h-3.5 w-3.5\" />\r\n </button>\r\n {onEdit && (\r\n <button\r\n type=\"button\"\r\n onClick={onEdit}\r\n className=\"p-1 text-gray-400 hover:text-brand-600 rounded transition-colors\"\r\n title=\"Edit chart\"\r\n >\r\n <Edit3 className=\"h-3.5 w-3.5\" />\r\n </button>\r\n )}\r\n {onRemove && (\r\n <button\r\n type=\"button\"\r\n onClick={onRemove}\r\n className=\"p-1 text-gray-400 hover:text-red-500 rounded transition-colors\"\r\n title=\"Remove chart\"\r\n >\r\n <X className=\"h-3.5 w-3.5\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Chart */}\r\n <div ref={chartRef} className=\"px-2 py-3\">\r\n <ResponsiveContainer width=\"100%\" height={height}>\r\n {renderChart(config, chartData, series)}\r\n </ResponsiveContainer>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Chart Renderers ──────────────────────────────────────────────────\r\n\r\nfunction renderChart(config, data, series) {\r\n const showLegend = config.showLegend ?? true;\r\n const showTooltip = config.showTooltip ?? true;\r\n\r\n switch (config.type) {\r\n case 'bar':\r\n return (\r\n <BarChart data={data}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e7eb\" />\r\n <XAxis dataKey=\"label\" tick={{ fontSize: 12 }} />\r\n <YAxis tick={{ fontSize: 12 }} />\r\n {showTooltip && <Tooltip />}\r\n {showLegend && <Legend />}\r\n {series.map((s) => (\r\n <Bar\r\n key={s.key}\r\n dataKey={s.key}\r\n name={s.name}\r\n fill={s.color}\r\n stackId={config.stacked ? 'stack' : undefined}\r\n radius={[2, 2, 0, 0]}\r\n />\r\n ))}\r\n </BarChart>\r\n );\r\n\r\n case 'line':\r\n return (\r\n <LineChart data={data}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e7eb\" />\r\n <XAxis dataKey=\"label\" tick={{ fontSize: 12 }} />\r\n <YAxis tick={{ fontSize: 12 }} />\r\n {showTooltip && <Tooltip />}\r\n {showLegend && <Legend />}\r\n {series.map((s) => (\r\n <Line\r\n key={s.key}\r\n type=\"monotone\"\r\n dataKey={s.key}\r\n name={s.name}\r\n stroke={s.color}\r\n strokeWidth={2}\r\n dot={{ r: 3 }}\r\n activeDot={{ r: 5 }}\r\n />\r\n ))}\r\n </LineChart>\r\n );\r\n\r\n case 'area':\r\n return (\r\n <AreaChart data={data}>\r\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#e5e7eb\" />\r\n <XAxis dataKey=\"label\" tick={{ fontSize: 12 }} />\r\n <YAxis tick={{ fontSize: 12 }} />\r\n {showTooltip && <Tooltip />}\r\n {showLegend && <Legend />}\r\n {series.map((s) => (\r\n <Area\r\n key={s.key}\r\n type=\"monotone\"\r\n dataKey={s.key}\r\n name={s.name}\r\n stroke={s.color}\r\n fill={s.color}\r\n fillOpacity={0.15}\r\n stackId={config.stacked ? 'stack' : undefined}\r\n />\r\n ))}\r\n </AreaChart>\r\n );\r\n\r\n case 'pie':\r\n return (\r\n <PieChart>\r\n {showTooltip && <Tooltip />}\r\n {showLegend && <Legend />}\r\n <Pie\r\n data={data}\r\n dataKey={series[0]?.key ?? 'value'}\r\n nameKey=\"label\"\r\n cx=\"50%\"\r\n cy=\"50%\"\r\n outerRadius=\"80%\"\r\n label={({ name, percent }) => `${name} ${(percent * 100).toFixed(0)}%`}\r\n labelLine={false}\r\n >\r\n {data.map((_, i) => (\r\n <Cell\r\n key={i}\r\n fill={config.colors?.[i] ?? DEFAULT_COLORS[i % DEFAULT_COLORS.length]}\r\n />\r\n ))}\r\n </Pie>\r\n </PieChart>\r\n );\r\n\r\n default:\r\n return (\r\n <BarChart data={data}>\r\n <XAxis dataKey=\"label\" />\r\n <YAxis />\r\n {series.map((s) => (\r\n <Bar key={s.key} dataKey={s.key} fill={s.color} />\r\n ))}\r\n </BarChart>\r\n );\r\n }\r\n}\r\n","import { BarChart3, Plus } from 'lucide-react';\r\nimport { DataChart } from './DataChart.jsx';\r\n\r\nexport function ChartPanel({\r\n charts,\r\n data,\r\n columns,\r\n onAddChart,\r\n onEditChart,\r\n onRemoveChart,\r\n}) {\r\n if (!charts.length) {\r\n return (\r\n <div className=\"border-t border-gray-200 dark:border-gray-700 px-4 py-6\">\r\n <div className=\"flex flex-col items-center justify-center text-center\">\r\n <BarChart3 className=\"h-8 w-8 text-gray-300 mb-2\" />\r\n <p className=\"text-sm text-gray-400 mb-3\">No charts yet</p>\r\n <button\r\n type=\"button\"\r\n onClick={onAddChart}\r\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium text-brand-600 bg-brand-50 rounded-lg hover:bg-brand-100 transition-colors\"\r\n >\r\n <Plus className=\"h-4 w-4\" />\r\n Create Chart\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"border-t border-gray-200 dark:border-gray-700 p-4\">\r\n <div className=\"flex items-center justify-between mb-3\">\r\n <span className=\"text-xs font-medium text-gray-500 uppercase tracking-wide\">\r\n Charts ({charts.length})\r\n </span>\r\n <button\r\n type=\"button\"\r\n onClick={onAddChart}\r\n className=\"inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-brand-600 hover:bg-brand-50 rounded transition-colors\"\r\n >\r\n <Plus className=\"h-3.5 w-3.5\" />\r\n Add\r\n </button>\r\n </div>\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n {charts.map((chart) => (\r\n <DataChart\r\n key={chart.id}\r\n data={data}\r\n config={chart.config}\r\n columns={columns}\r\n onEdit={() => onEditChart(chart.id)}\r\n onRemove={() => onRemoveChart(chart.id)}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useMemo, useCallback, useEffect } from 'react';\r\nimport { X, BarChart3, LineChart as LineChartIcon, PieChart as PieChartIcon, AreaChart as AreaChartIcon } from 'lucide-react';\r\nimport { DataChart } from './DataChart.jsx';\r\n\r\nconst CHART_TYPES = [\r\n { type: 'bar', label: 'Bar', icon: <BarChart3 className=\"h-5 w-5\" /> },\r\n { type: 'line', label: 'Line', icon: <LineChartIcon className=\"h-5 w-5\" /> },\r\n { type: 'area', label: 'Area', icon: <AreaChartIcon className=\"h-5 w-5\" /> },\r\n { type: 'pie', label: 'Pie', icon: <PieChartIcon className=\"h-5 w-5\" /> },\r\n];\r\n\r\nconst AGGREGATIONS = [\r\n { value: '', label: 'None' },\r\n { value: 'sum', label: 'Sum' },\r\n { value: 'avg', label: 'Average' },\r\n { value: 'count', label: 'Count' },\r\n { value: 'min', label: 'Min' },\r\n { value: 'max', label: 'Max' },\r\n];\r\n\r\nexport function ChartBuilderModal({\r\n open,\r\n onClose,\r\n onSave,\r\n onUpdate,\r\n columns,\r\n data,\r\n editingChart,\r\n}) {\r\n const [chartType, setChartType] = useState('bar');\r\n const [title, setTitle] = useState('');\r\n const [labelColumn, setLabelColumn] = useState('');\r\n const [dataColumns, setDataColumns] = useState([]);\r\n const [groupBy, setGroupBy] = useState('');\r\n const [aggregation, setAggregation] = useState('');\r\n const [showLegend, setShowLegend] = useState(true);\r\n const [showTooltip, setShowTooltip] = useState(true);\r\n const [stacked, setStacked] = useState(false);\r\n\r\n useEffect(() => {\r\n if (editingChart) {\r\n const c = editingChart.config;\r\n setChartType(c.type);\r\n setTitle(c.title ?? '');\r\n setLabelColumn(c.labelColumn);\r\n setDataColumns(c.dataColumns);\r\n setGroupBy(c.groupBy ?? '');\r\n setAggregation(c.aggregation ?? '');\r\n setShowLegend(c.showLegend ?? true);\r\n setShowTooltip(c.showTooltip ?? true);\r\n setStacked(c.stacked ?? false);\r\n } else if (open) {\r\n setChartType('bar');\r\n setTitle('');\r\n setLabelColumn('');\r\n setDataColumns([]);\r\n setGroupBy('');\r\n setAggregation('');\r\n setShowLegend(true);\r\n setShowTooltip(true);\r\n setStacked(false);\r\n }\r\n }, [editingChart, open]);\r\n\r\n const previewConfig = useMemo(() => ({\r\n type: chartType,\r\n title: title || 'Preview',\r\n labelColumn,\r\n dataColumns,\r\n groupBy: groupBy || undefined,\r\n aggregation: aggregation || undefined,\r\n showLegend,\r\n showTooltip,\r\n stacked,\r\n height: 240,\r\n }), [chartType, title, labelColumn, dataColumns, groupBy, aggregation, showLegend, showTooltip, stacked]);\r\n\r\n const canSave = labelColumn && dataColumns.length > 0;\r\n\r\n const handleSave = useCallback(() => {\r\n if (!canSave) return;\r\n const config = {\r\n type: chartType,\r\n title: title || undefined,\r\n labelColumn,\r\n dataColumns,\r\n groupBy: groupBy || undefined,\r\n aggregation: aggregation || undefined,\r\n showLegend,\r\n showTooltip,\r\n stacked,\r\n };\r\n if (editingChart && onUpdate) {\r\n onUpdate(editingChart.id, config);\r\n } else {\r\n onSave(config);\r\n }\r\n onClose();\r\n }, [canSave, chartType, title, labelColumn, dataColumns, groupBy, aggregation, showLegend, showTooltip, stacked, editingChart, onUpdate, onSave, onClose]);\r\n\r\n const toggleDataColumn = (colId) => {\r\n setDataColumns((prev) =>\r\n prev.includes(colId) ? prev.filter((c) => c !== colId) : [...prev, colId]\r\n );\r\n };\r\n\r\n if (!open) return null;\r\n\r\n const selectClass = 'w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-500 bg-white dark:bg-gray-800';\r\n const inputClass = selectClass;\r\n\r\n return (\r\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center\">\r\n <div className=\"absolute inset-0 bg-black/40\" onClick={onClose} />\r\n <div className=\"relative bg-white dark:bg-gray-900 rounded-xl shadow-2xl w-full max-w-4xl max-h-[90vh] overflow-hidden flex flex-col\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-gray-200 dark:border-gray-700\">\r\n <h2 className=\"text-lg font-semibold text-gray-900 dark:text-gray-100\">\r\n {editingChart ? 'Edit Chart' : 'Create Chart'}\r\n </h2>\r\n <button type=\"button\" onClick={onClose} className=\"p-1 text-gray-400 hover:text-gray-600 rounded\">\r\n <X className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n\r\n {/* Body */}\r\n <div className=\"flex-1 overflow-y-auto p-6\">\r\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\r\n {/* Left: Config */}\r\n <div className=\"space-y-4\">\r\n {/* Chart Type */}\r\n <div>\r\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide mb-2\">Chart Type</label>\r\n <div className=\"flex gap-2\">\r\n {CHART_TYPES.map((ct) => (\r\n <button\r\n key={ct.type}\r\n type=\"button\"\r\n onClick={() => setChartType(ct.type)}\r\n className={`flex flex-col items-center gap-1 px-4 py-2.5 rounded-lg border-2 transition-colors ${\r\n chartType === ct.type\r\n ? 'border-brand-500 bg-brand-50 text-brand-700'\r\n : 'border-gray-200 text-gray-500 hover:border-gray-300'\r\n }`}\r\n >\r\n {ct.icon}\r\n <span className=\"text-xs font-medium\">{ct.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Title */}\r\n <div>\r\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide mb-1\">Title</label>\r\n <input type=\"text\" value={title} onChange={(e) => setTitle(e.target.value)} placeholder=\"Chart title...\" className={inputClass} />\r\n </div>\r\n\r\n {/* Label Column */}\r\n <div>\r\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide mb-1\">\r\n {chartType === 'pie' ? 'Label Column' : 'X-Axis Column'}\r\n </label>\r\n <select value={labelColumn} onChange={(e) => setLabelColumn(e.target.value)} className={selectClass}>\r\n <option value=\"\">Select column...</option>\r\n {columns.map((col) => (\r\n <option key={col.id} value={col.id}>{col.header}</option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Data Columns */}\r\n <div>\r\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide mb-1\">\r\n {chartType === 'pie' ? 'Value Column' : 'Y-Axis Columns'}\r\n </label>\r\n <div className=\"flex flex-wrap gap-1.5 p-2 border border-gray-300 rounded-lg min-h-[40px] bg-white dark:bg-gray-800\">\r\n {columns.map((col) => (\r\n <button\r\n key={col.id}\r\n type=\"button\"\r\n onClick={() => toggleDataColumn(col.id)}\r\n className={`px-2.5 py-1 text-xs rounded-md transition-colors ${\r\n dataColumns.includes(col.id)\r\n ? 'bg-brand-100 text-brand-700 font-medium'\r\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200'\r\n }`}\r\n >\r\n {col.header}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Group By + Aggregation */}\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <div>\r\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide mb-1\">Group By</label>\r\n <select value={groupBy} onChange={(e) => setGroupBy(e.target.value)} className={selectClass}>\r\n <option value=\"\">None</option>\r\n {columns.map((col) => (\r\n <option key={col.id} value={col.id}>{col.header}</option>\r\n ))}\r\n </select>\r\n </div>\r\n <div>\r\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide mb-1\">Aggregation</label>\r\n <select value={aggregation} onChange={(e) => setAggregation(e.target.value)} className={selectClass}>\r\n {AGGREGATIONS.map((a) => (\r\n <option key={a.value} value={a.value}>{a.label}</option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n\r\n {/* Toggles */}\r\n <div className=\"flex flex-wrap gap-4\">\r\n <Toggle label=\"Legend\" checked={showLegend} onChange={setShowLegend} />\r\n <Toggle label=\"Tooltip\" checked={showTooltip} onChange={setShowTooltip} />\r\n {(chartType === 'bar' || chartType === 'area') && (\r\n <Toggle label=\"Stacked\" checked={stacked} onChange={setStacked} />\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Right: Live Preview */}\r\n <div>\r\n <label className=\"block text-xs font-medium text-gray-500 uppercase tracking-wide mb-2\">Live Preview</label>\r\n <DataChart data={data} config={previewConfig} columns={columns} />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Footer */}\r\n <div className=\"flex items-center justify-end gap-3 px-6 py-4 border-t border-gray-200 dark:border-gray-700\">\r\n <button type=\"button\" onClick={onClose} className=\"px-4 py-2 text-sm text-gray-600 hover:text-gray-800 rounded-lg transition-colors\">\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={!canSave}\r\n className=\"px-4 py-2 text-sm font-medium text-white bg-brand-600 rounded-lg hover:bg-brand-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n {editingChart ? 'Update Chart' : 'Create Chart'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction Toggle({ label, checked, onChange }) {\r\n return (\r\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={(e) => onChange(e.target.checked)}\r\n className=\"h-4 w-4 rounded border-gray-300 text-brand-600 focus:ring-brand-500\"\r\n />\r\n <span className=\"text-sm text-gray-600\">{label}</span>\r\n </label>\r\n );\r\n}\r\n","import { useMemo, useState, useCallback } from 'react';\r\nimport { AlertCircle, Database, RefreshCw } from 'lucide-react';\r\nimport { useDataTable } from '../hooks/useDataTable.js';\r\nimport { handleExport } from '../utils.js';\r\nimport { exportToCSV, exportToExcel } from '../exportUtils.js';\r\nimport { Toolbar } from './Toolbar.jsx';\r\nimport { BulkActions } from './BulkActions.jsx';\r\nimport { TableView } from './TableView.jsx';\r\nimport { GridView } from './GridView.jsx';\r\nimport { ListView } from './ListView.jsx';\r\nimport { DataTablePagination } from './DataTablePagination.jsx';\r\nimport { SidebarPanel } from './SidebarPanel.jsx';\r\nimport { PresetManager } from './PresetManager.jsx';\r\nimport { ContextMenu } from './ContextMenu.jsx';\r\nimport { StatusBar } from './StatusBar.jsx';\r\nimport { ChartPanel } from './ChartPanel.jsx';\r\nimport { ChartBuilderModal } from './ChartBuilderModal.jsx';\r\n\r\nexport function DataTable(props) {\r\n const {\r\n loading = false,\r\n error = null,\r\n onRetry,\r\n bulkActions,\r\n exportFormats,\r\n onExport,\r\n views = ['table'],\r\n theme,\r\n emptyText = 'No data found',\r\n emptyIcon: EmptyIcon = Database,\r\n className = '',\r\n filtering: filterConfig,\r\n columnVisibility = false,\r\n plugins = [],\r\n ariaLabel,\r\n ariaDescribedBy,\r\n // Enhanced features\r\n sidebarPanels,\r\n contextMenu,\r\n persistKey,\r\n statusBar: statusBarConfig,\r\n } = props;\r\n\r\n const table = useDataTable(props);\r\n\r\n const {\r\n processedData,\r\n allFilteredData,\r\n sorting: _sorting,\r\n filtering,\r\n pagination,\r\n selection,\r\n columnManager,\r\n viewMode,\r\n setViewMode,\r\n presets,\r\n getCurrentPresetConfig,\r\n applyPreset,\r\n theme: themeSystem,\r\n chartConfig,\r\n } = table;\r\n\r\n // ─── Sidebar State ────────────────────────────────────────────────\r\n const [activeSidebarPanel, setActiveSidebarPanel] = useState(null);\r\n\r\n // ─── Context Menu State ───────────────────────────────────────────\r\n const [ctxMenu, setCtxMenu] = useState(null);\r\n\r\n const handleContextMenu = useCallback(\r\n (e, row) => {\r\n if (!contextMenu?.length) return;\r\n e.preventDefault();\r\n setCtxMenu({ x: e.clientX, y: e.clientY, row });\r\n },\r\n [contextMenu]\r\n );\r\n\r\n // ─── Export handler ───────────────────────────────────────────────\r\n const onExportHandler = useMemo(\r\n () => (format) => {\r\n if (onExport) {\r\n onExport(format, allFilteredData);\r\n return;\r\n }\r\n const cols = columnManager.visibleColumns;\r\n switch (format) {\r\n case 'csv':\r\n exportToCSV(allFilteredData, cols);\r\n break;\r\n case 'excel':\r\n exportToExcel(allFilteredData, cols);\r\n break;\r\n default:\r\n handleExport(format, allFilteredData, cols, onExport);\r\n }\r\n },\r\n [allFilteredData, columnManager.visibleColumns, onExport]\r\n );\r\n\r\n // Plugin toolbar\r\n const pluginToolbar = useMemo(\r\n () => plugins.map((p) => p.renderToolbar?.(table.state)).filter(Boolean),\r\n [plugins, table.state]\r\n );\r\n\r\n // Plugin footer\r\n const pluginFooter = useMemo(\r\n () => plugins.map((p) => p.renderFooter?.(table.state)).filter(Boolean),\r\n [plugins, table.state]\r\n );\r\n\r\n const hasActiveFilters = filtering.filters.length > 0 || filtering.globalSearch.length > 0;\r\n\r\n // Theme CSS variables\r\n const wrapperStyle = themeSystem.cssVarStyle ?? {};\r\n\r\n return (\r\n <div\r\n className={`bg-[var(--dt-bg,var(--app-bg,white))] border border-[var(--dt-border,var(--app-border,#e5e7eb))] rounded-lg shadow-sm overflow-hidden flex ${theme?.wrapper ?? ''} ${className}`}\r\n style={wrapperStyle}\r\n role=\"region\"\r\n aria-label={ariaLabel ?? 'Data table'}\r\n aria-describedby={ariaDescribedBy}\r\n >\r\n {/* Main content area */}\r\n <div className=\"flex-1 flex flex-col min-w-0 overflow-hidden\">\r\n {/* Toolbar */}\r\n <Toolbar\r\n globalSearch={filtering.globalSearch}\r\n onSearchChange={filtering.setGlobalSearch}\r\n searchDebounce={filterConfig?.searchDebounce}\r\n viewMode={viewMode}\r\n onViewModeChange={setViewMode}\r\n views={views}\r\n exportFormats={exportFormats}\r\n onExport={onExportHandler}\r\n columns={columnManager.allColumns}\r\n hiddenColumns={columnManager.hiddenColumns}\r\n onToggleColumn={columnManager.toggleColumnVisibility}\r\n enableColumnVisibility={columnVisibility}\r\n hasActiveFilters={hasActiveFilters}\r\n onClearFilters={filtering.clearFilters}\r\n pluginToolbar={\r\n <>\r\n {pluginToolbar}\r\n {/* Preset Manager */}\r\n {persistKey && (\r\n <PresetManager\r\n presets={presets.presets}\r\n onSave={presets.savePreset}\r\n onLoad={applyPreset}\r\n onDelete={presets.deletePreset}\r\n onRename={presets.renamePreset}\r\n getCurrentConfig={getCurrentPresetConfig}\r\n />\r\n )}\r\n {/* Sidebar panel toggles */}\r\n {sidebarPanels?.map((panel) => (\r\n <button\r\n key={panel.type}\r\n type=\"button\"\r\n onClick={() => setActiveSidebarPanel(\r\n activeSidebarPanel === panel.type ? null : panel.type\r\n )}\r\n className={`p-2 rounded-md transition-colors ${\r\n activeSidebarPanel === panel.type\r\n ? 'bg-brand-100 text-brand-700'\r\n : 'text-gray-500 hover:text-gray-700 hover:bg-gray-100'\r\n }`}\r\n title={panel.title}\r\n aria-label={panel.title}\r\n aria-pressed={activeSidebarPanel === panel.type}\r\n >\r\n {panel.icon}\r\n </button>\r\n ))}\r\n </>\r\n }\r\n className={theme?.toolbar}\r\n />\r\n\r\n {/* Bulk Actions */}\r\n {bulkActions && bulkActions.length > 0 && (\r\n <BulkActions\r\n selectedCount={selection.selectedKeys.length}\r\n selectedRows={selection.selectedRows}\r\n actions={bulkActions}\r\n onClearSelection={selection.clearSelection}\r\n />\r\n )}\r\n\r\n {/* Error State */}\r\n {error && (\r\n <div className=\"flex flex-col items-center justify-center py-16 px-6\">\r\n <AlertCircle className=\"h-12 w-12 text-red-400 mb-4\" />\r\n <p className=\"text-sm text-red-600 mb-4\">{error}</p>\r\n {onRetry && (\r\n <button\r\n type=\"button\"\r\n onClick={onRetry}\r\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-brand-600 rounded-md hover:bg-brand-700 transition-colors\"\r\n >\r\n <RefreshCw className=\"h-4 w-4\" />\r\n Retry\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Loading State */}\r\n {!error && loading && (\r\n <div className=\"p-4\">\r\n <LoadingSkeleton rows={pagination.pageSize} columns={columnManager.visibleColumns.length} />\r\n </div>\r\n )}\r\n\r\n {/* Empty State */}\r\n {!error && !loading && processedData.length === 0 && (\r\n <div className=\"flex flex-col items-center justify-center py-16 px-6\">\r\n <div className=\"w-14 h-14 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center mb-4\">\r\n <EmptyIcon className=\"h-7 w-7 text-gray-400\" />\r\n </div>\r\n <p className=\"text-sm text-gray-500\">{emptyText}</p>\r\n {hasActiveFilters && (\r\n <button\r\n type=\"button\"\r\n onClick={filtering.clearFilters}\r\n className=\"mt-3 text-sm text-brand-600 hover:text-brand-700 underline\"\r\n >\r\n Clear all filters\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Data Views */}\r\n {!error && !loading && processedData.length > 0 && (\r\n <>\r\n {viewMode === 'table' && (\r\n <TableView table={table} props={props} onContextMenu={handleContextMenu} />\r\n )}\r\n {viewMode === 'grid' && <GridView table={table} props={props} />}\r\n {viewMode === 'list' && <ListView table={table} props={props} />}\r\n </>\r\n )}\r\n\r\n {/* Status Bar (top position) */}\r\n {statusBarConfig?.position === 'top' && (\r\n <StatusBar config={statusBarConfig} data={allFilteredData} state={table.state} />\r\n )}\r\n\r\n {/* Pagination */}\r\n {!error && !pagination.isInfinite && processedData.length > 0 && (\r\n <DataTablePagination\r\n page={pagination.page}\r\n pageSize={pagination.pageSize}\r\n totalPages={pagination.totalPages}\r\n totalItems={pagination.totalItems}\r\n pageSizeOptions={pagination.pageSizeOptions}\r\n onPageChange={pagination.setPage}\r\n onPageSizeChange={pagination.setPageSize}\r\n />\r\n )}\r\n\r\n {/* Status Bar (bottom position, default) */}\r\n {statusBarConfig && statusBarConfig.position !== 'top' && (\r\n <StatusBar config={statusBarConfig} data={allFilteredData} state={table.state} />\r\n )}\r\n\r\n {/* Plugin Footer */}\r\n {pluginFooter.length > 0 && (\r\n <div className=\"border-t border-[var(--app-border,#e5e7eb)]\">{pluginFooter}</div>\r\n )}\r\n\r\n {/* Charts */}\r\n {persistKey && (\r\n <ChartPanel\r\n charts={chartConfig.charts}\r\n data={allFilteredData}\r\n columns={columnManager.allColumns}\r\n onAddChart={() => chartConfig.openBuilder()}\r\n onEditChart={(id) => chartConfig.openBuilder(id)}\r\n onRemoveChart={chartConfig.removeChart}\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Sidebar Panel */}\r\n {sidebarPanels && activeSidebarPanel && (\r\n <SidebarPanel\r\n panels={sidebarPanels}\r\n activePanel={activeSidebarPanel}\r\n onClose={() => setActiveSidebarPanel(null)}\r\n columns={columnManager.allColumns}\r\n hiddenColumns={columnManager.hiddenColumns}\r\n columnOrder={columnManager.columnOrder}\r\n onToggleColumn={columnManager.toggleColumnVisibility}\r\n onReorderColumns={columnManager.reorderColumnsById}\r\n filters={filtering.filters}\r\n onFilterChange={filtering.setFilter}\r\n onClearFilters={filtering.clearFilters}\r\n />\r\n )}\r\n\r\n {/* Context Menu */}\r\n {ctxMenu && contextMenu && (\r\n <ContextMenu\r\n x={ctxMenu.x}\r\n y={ctxMenu.y}\r\n row={ctxMenu.row}\r\n items={contextMenu}\r\n onClose={() => setCtxMenu(null)}\r\n />\r\n )}\r\n\r\n {/* Chart Builder Modal */}\r\n {persistKey && (\r\n <ChartBuilderModal\r\n open={chartConfig.builderOpen}\r\n onClose={chartConfig.closeBuilder}\r\n onSave={chartConfig.addChart}\r\n onUpdate={chartConfig.updateChart}\r\n columns={columnManager.allColumns}\r\n data={allFilteredData}\r\n editingChart={chartConfig.editingChart}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Loading Skeleton ─────────────────────────────────────────────────\r\n\r\nfunction LoadingSkeleton({ rows, columns }) {\r\n return (\r\n <div className=\"space-y-3\" role=\"status\" aria-label=\"Loading data\">\r\n {/* Header skeleton */}\r\n <div className=\"flex gap-4 px-2\">\r\n {Array.from({ length: Math.min(columns, 6) }).map((_, i) => (\r\n <div key={i} className=\"h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse flex-1\" />\r\n ))}\r\n </div>\r\n {/* Row skeletons */}\r\n {Array.from({ length: Math.min(rows, 8) }).map((_, rowIdx) => (\r\n <div key={rowIdx} className=\"flex gap-4 px-2\">\r\n {Array.from({ length: Math.min(columns, 6) }).map((_, colIdx) => (\r\n <div\r\n key={colIdx}\r\n className=\"h-8 bg-gray-100 dark:bg-gray-800 rounded animate-pulse flex-1\"\r\n style={{ animationDelay: `${(rowIdx * 50) + (colIdx * 25)}ms` }}\r\n />\r\n ))}\r\n </div>\r\n ))}\r\n <span className=\"sr-only\">Loading...</span>\r\n </div>\r\n );\r\n}\r\n","import { groupData } from './utils.js';\r\nimport React from 'react';\r\n\r\n/** Row numbering plugin — adds a virtual \"#\" column showing row index. */\r\nexport function createRowNumberPlugin() {\r\n return { name: 'row-number' };\r\n}\r\n\r\n/** Row grouping plugin — groups data by a field and injects group headers. */\r\nexport function createGroupingPlugin(groupByField, renderGroupHeader) {\r\n return {\r\n name: 'grouping',\r\n processData: (data, _state) => {\r\n const groups = groupData(data, groupByField);\r\n const result = [];\r\n groups.forEach((rows) => { result.push(...rows); });\r\n return result;\r\n },\r\n };\r\n}\r\n\r\n/** Selection summary plugin — renders a footer showing selection count. */\r\nexport function createSelectionSummaryPlugin() {\r\n return {\r\n name: 'selection-summary',\r\n renderFooter: (state) => {\r\n if (state.selectedKeys.length === 0) return null;\r\n return React.createElement(\r\n 'div',\r\n { className: 'px-4 py-2 text-sm text-gray-500' },\r\n `${state.selectedKeys.length} of ${state.totalItems} row(s) selected`\r\n );\r\n },\r\n };\r\n}\r\n\r\n/** Data transformation plugin — apply a custom transform to data. */\r\nexport function createTransformPlugin(name, transform) {\r\n return { name, processData: (data) => transform(data) };\r\n}\r\n"],"mappings":"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"}