dishui 0.0.84 → 0.0.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/components/Input/index.js +52 -62
  2. package/dist/components/Input/index.js.map +1 -1
  3. package/dist/components/LayoutSuite/index.d.ts +10 -0
  4. package/dist/components/LayoutSuite/index.js +27 -18
  5. package/dist/components/LayoutSuite/index.js.map +1 -1
  6. package/dist/components/Markdown/markdownComponents.js +1 -0
  7. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  8. package/dist/components/Markdown/useMarkdownSource.js +46 -31
  9. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  10. package/dist/components/Markdown/useMarkmapRenderer.js +44 -31
  11. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  12. package/dist/components/Markdown/useMermaidRenderer.js +49 -31
  13. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  14. package/dist/components/ProtectedRoute/index.d.ts +2 -1
  15. package/dist/components/ProtectedRoute/index.js +16 -6
  16. package/dist/components/ProtectedRoute/index.js.map +1 -1
  17. package/dist/components/Select/index.d.ts +6 -0
  18. package/dist/components/Select/index.js +166 -136
  19. package/dist/components/Select/index.js.map +1 -1
  20. package/dist/components/Tabs/index.d.ts +12 -1
  21. package/dist/components/Tabs/index.js +42 -17
  22. package/dist/components/Tabs/index.js.map +1 -1
  23. package/dist/components/pro/ArticleContextMenu/index.js +7 -7
  24. package/dist/components/pro/CodeEditor/editors/CodeEditor.js +200 -189
  25. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  26. package/dist/components/pro/CodeEditor/types.d.ts +3 -0
  27. package/dist/components/pro/DataTable/DataTable.d.ts +1 -1
  28. package/dist/components/pro/DataTable/DataTable.js +98 -240
  29. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  30. package/dist/components/pro/DataTable/components/TableBody.js +14 -16
  31. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  32. package/dist/components/pro/DataTable/components/TablePagination.d.ts +3 -9
  33. package/dist/components/pro/DataTable/components/TablePagination.js +29 -25
  34. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  35. package/dist/components/pro/DataTable/tanstack-table.d.ts +2 -2
  36. package/dist/components/pro/DataTable/tanstack-table.js +29 -21
  37. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  38. package/dist/components/pro/DataTable/treeDataUtils.d.ts +2 -0
  39. package/dist/components/pro/DataTable/treeDataUtils.js +18 -19
  40. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  41. package/dist/components/pro/DataTable/types.d.ts +24 -0
  42. package/dist/components/pro/DataTable/useDataTableModel.d.ts +16 -0
  43. package/dist/components/pro/DataTable/useDataTableModel.js +148 -0
  44. package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -0
  45. package/dist/components/pro/FileExplorer/Breadcrumb.js +12 -12
  46. package/dist/components/pro/Flow/nodes/DataNodeView.js +87 -82
  47. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  48. package/dist/components/pro/Flow/nodes/MediaContent.js +1 -1
  49. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  50. package/dist/components/pro/Flow/nodes/MediaOverlay.js +1 -1
  51. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  52. package/dist/components/pro/Flow/nodes/Model3DView.js +69 -63
  53. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  54. package/dist/components/pro/Flow/nodes/chartGeometryBudget.d.ts +14 -0
  55. package/dist/components/pro/Flow/nodes/chartGeometryBudget.js +76 -0
  56. package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -0
  57. package/dist/components/pro/Flow/nodes/demandRender.d.ts +11 -0
  58. package/dist/components/pro/Flow/nodes/demandRender.js +26 -0
  59. package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -0
  60. package/dist/components/pro/RichTextEditor/SlashMenu.js +68 -58
  61. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  62. package/dist/contexts/AppContext.d.ts +1 -0
  63. package/dist/contexts/AppContext.js +144 -145
  64. package/dist/contexts/AppContext.js.map +1 -1
  65. package/dist/contexts/authentication.d.ts +7 -0
  66. package/dist/contexts/authentication.js +22 -0
  67. package/dist/contexts/authentication.js.map +1 -0
  68. package/dist/dishui.css +1 -1
  69. package/dist/hooks/useControllableState.d.ts +6 -14
  70. package/dist/hooks/useControllableState.js +21 -15
  71. package/dist/hooks/useControllableState.js.map +1 -1
  72. package/dist/hooks/useTableColumns.d.ts +3 -3
  73. package/dist/hooks/useTableColumns.js +2 -2
  74. package/dist/hooks/useTableColumns.js.map +1 -1
  75. package/dist/hooks/useTableData.d.ts +11 -4
  76. package/dist/hooks/useTableData.js +44 -26
  77. package/dist/hooks/useTableData.js.map +1 -1
  78. package/dist/index-nostyled.d.ts +2 -2
  79. package/dist/index.d.ts +2 -2
  80. package/dist/index.js +97 -97
  81. package/dist/utils/i18n.js +1 -1
  82. package/dist/utils/i18n.js.map +1 -1
  83. package/dist/utils/routerBuilder.d.ts +7 -5
  84. package/dist/utils/routerBuilder.js +11 -15
  85. package/dist/utils/routerBuilder.js.map +1 -1
  86. package/dist/utils/safeStorage.d.ts +8 -0
  87. package/dist/utils/safeStorage.js +45 -0
  88. package/dist/utils/safeStorage.js.map +1 -0
  89. package/package.json +22 -5
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","names":[],"sources":["../../../../src/components/pro/DataTable/DataTable.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport {\n useReactTable,\n ColumnFiltersState,\n SortingState,\n VisibilityState,\n RowSelectionState,\n OnChangeFn,\n Updater,\n SortingFnOption,\n SortingFn,\n} from './tanstack-table';\nimport Table from '../../Table';\nimport { TableToolbar } from './components/TableToolbar';\nimport { TableHeader } from './components/TableHeader';\nimport { TableBody } from './components/TableBody';\nimport { TablePagination } from './components/TablePagination';\nimport { DataTableProps } from './types';\nimport type {\n DataTableApi,\n DataTableCellContext,\n DataTableExtension,\n DataTableMenuItem,\n} from './extension';\nimport { useControllableState, deepEqual } from '../../../hooks/useControllableState';\nimport { treeRowAnimationStyles, findAllChildRowIds, flattenTreeData, createTreeSortingFns } from './treeDataUtils';\nimport { useColumnDragReorder } from './useColumnDragReorder';\n\nexport * from './types';\n\nfunction DataTable<T extends object>({\n data,\n columns,\n className = '',\n enableSorting = true,\n enableFiltering = true,\n enablePagination = true,\n enableSelection = true,\n enableColumnReordering = true,\n enableColumnResizing = true,\n manualFiltering = false,\n enableExpanding = false,\n subDataKey = 'subs',\n onRowExpand,\n expandedRows = {},\n onExpandedRowsChange,\n getRowId,\n indentSize = 16,\n enableTreeSort = true,\n toolbar = {\n enabled: false,\n enableColumnSelector: false,\n enableFiltering: false,\n enableBulkActions: false,\n },\n customFilterPanel,\n onRowClick,\n onRowDoubleClick,\n onRowMouseEnter,\n onRowMouseLeave,\n onCellClick,\n onCellDoubleClick,\n onCellMouseEnter,\n onCellMouseLeave,\n onColumnClick,\n onColumnMouseEnter,\n onColumnMouseLeave,\n onTableClick,\n onTableMouseEnter,\n onTableMouseLeave,\n pageSize = 10,\n pageIndex = 0,\n onPageChange,\n onPageSizeChange,\n selectedRows = {},\n onRowSelectionChange,\n sortingState = [],\n onSortingChange,\n columnFilters = [],\n onColumnFiltersChange,\n columnVisibility = {},\n onColumnVisibilityChange,\n columnOrder = [],\n onColumnOrderChange,\n extensions = [],\n}: DataTableProps<T>) {\n const [sorting, setSorting] = useControllableState<SortingState>(\n sortingState, onSortingChange, deepEqual,\n );\n const [rowSelection, setRowSelection] = useControllableState<RowSelectionState>(\n selectedRows, onRowSelectionChange, deepEqual,\n );\n const [columnFiltersState, setColumnFiltersState] = useControllableState<ColumnFiltersState>(\n columnFilters, onColumnFiltersChange, deepEqual,\n );\n const [visibilityState, setVisibilityState] = useControllableState<VisibilityState>(\n columnVisibility, onColumnVisibilityChange, deepEqual,\n );\n const [columnOrderState, setColumnOrderState] = useControllableState<string[]>(\n columnOrder, onColumnOrderChange, deepEqual,\n );\n const [expandedRowsState, setExpandedRowsState] = useControllableState<Record<string, boolean>>(\n expandedRows, onExpandedRowsChange, deepEqual,\n );\n\n const [activeFilter, setActiveFilter] = useState<string | null>(null);\n const hasInitializedRef = useRef(false);\n\n const {\n draggedColumnId,\n handleDragStart,\n handleDragOver,\n handleDrop,\n } = useColumnDragReorder(columnOrderState, setColumnOrderState);\n\n const handleSortingChange = useCallback<OnChangeFn<SortingState>>((updater) => {\n setSorting((old) => (typeof updater === 'function' ? updater(old) : updater));\n }, [setSorting]);\n\n useEffect(() => {\n if (!hasInitializedRef.current && columns.length > 0) {\n if (columnOrder.length === 0 && columnOrderState.length === 0) {\n hasInitializedRef.current = true;\n const initialOrder = columns.map(col =>\n 'accessorKey' in col ? col.accessorKey as string : col.id as string,\n );\n setColumnOrderState(initialOrder);\n } else {\n hasInitializedRef.current = true;\n }\n }\n }, [columns]);\n\n const handleRowExpand = (rowId: string, row: T) => {\n const newExpandedState = !(expandedRowsState[rowId] || false);\n const newExpandedRows = { ...expandedRowsState, [rowId]: newExpandedState };\n\n if (!newExpandedState) {\n const childRows = findAllChildRowIds(row, rowId, subDataKey, getRowId);\n childRows.forEach(childId => { newExpandedRows[childId] = false; });\n }\n\n setExpandedRowsState(newExpandedRows);\n onRowExpand?.(row, newExpandedState);\n };\n\n const flattenData = useCallback(\n (items: T[], depth = 0, parentId = '', isParentExpanded = true, result: any[] = [], onlyTopLevel = false) =>\n flattenTreeData(items, expandedRowsState, subDataKey, getRowId, depth, parentId, isParentExpanded, result, onlyTopLevel),\n [expandedRowsState, getRowId, subDataKey],\n );\n\n const flattenedData = useMemo(\n () => (enableExpanding ? flattenData(data) : data),\n [data, enableExpanding, flattenData],\n );\n\n const topLevelData = useMemo(\n () => (enableExpanding ? flattenData(data, 0, '', true, [], true) : data),\n [data, enableExpanding, flattenData],\n );\n\n const [internalPageIndex, setInternalPageIndex] = useState(pageIndex);\n const [internalPageSize, setInternalPageSize] = useState(pageSize);\n\n useEffect(() => { if (pageIndex !== internalPageIndex) setInternalPageIndex(pageIndex); }, [pageIndex]);\n useEffect(() => { if (pageSize !== internalPageSize) setInternalPageSize(pageSize); }, [pageSize]);\n\n const currentPageData = useMemo(() => {\n if (!enablePagination) return flattenedData;\n\n const startIndex = internalPageIndex * internalPageSize;\n const endIndex = startIndex + internalPageSize;\n const currentPageTopLevelData = topLevelData.slice(startIndex, endIndex);\n\n if (enableExpanding) {\n const rowsMap = new Map();\n currentPageTopLevelData.forEach((topRow: any) => rowsMap.set(topRow.__id, topRow));\n currentPageTopLevelData.forEach((topRow: any) => {\n if (expandedRowsState[topRow.__id]) {\n flattenedData.forEach((row: any) => {\n if (row.__parentId?.startsWith(topRow.__id)) rowsMap.set(row.__id, row);\n });\n }\n });\n const result: any[] = [];\n flattenedData.forEach((row: any) => { if (rowsMap.has(row.__id)) result.push(row); });\n return result;\n }\n\n return currentPageTopLevelData;\n }, [flattenedData, topLevelData, internalPageIndex, internalPageSize, enablePagination, enableExpanding, expandedRowsState]);\n\n const processedColumns = useMemo(() => {\n if (!enableExpanding || !enableTreeSort) return columns;\n return columns.map(column => {\n if (column.enableSorting === false) return column;\n return { ...column, sortFn: 'treeSortAsc' as SortingFnOption<T> };\n });\n }, [columns, enableExpanding, enableTreeSort]);\n\n const customSortFns = useMemo(\n () =>\n enableExpanding && enableTreeSort\n ? (createTreeSortingFns<T>() as Record<string, SortingFn<T>>)\n : undefined,\n [enableExpanding, enableTreeSort],\n );\n\n const tableCore = useMemo(() => ({\n data: currentPageData,\n columns: processedColumns,\n pageCount: Math.ceil(topLevelData.length / internalPageSize),\n manualPagination: true,\n manualFiltering,\n state: {\n sorting,\n rowSelection,\n columnFilters: columnFiltersState,\n columnVisibility: visibilityState,\n columnOrder: columnOrderState.length > 0 ? columnOrderState : undefined,\n pagination: { pageIndex: internalPageIndex, pageSize: internalPageSize },\n },\n enableRowSelection: enableSelection,\n onRowSelectionChange: setRowSelection,\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: setColumnFiltersState,\n onColumnVisibilityChange: setVisibilityState,\n onPaginationChange: (updater: Updater<{ pageIndex: number; pageSize: number }>) => {\n const currentPagination = { pageIndex: internalPageIndex, pageSize: internalPageSize };\n const newPagination = typeof updater === 'function' ? updater(currentPagination) : updater;\n\n if (newPagination.pageSize !== internalPageSize) {\n setInternalPageSize(newPagination.pageSize);\n onPageSizeChange?.(newPagination.pageSize);\n }\n if (newPagination.pageIndex !== internalPageIndex) {\n setInternalPageIndex(newPagination.pageIndex);\n onPageChange?.(newPagination.pageIndex);\n }\n },\n // v9:自定义排序函数注册表(由 useReactTable 包装器合入 features 的 sortFns)。\n sortFns: customSortFns,\n initialState: { pagination: { pageIndex: 0, pageSize: internalPageSize } },\n }), [\n currentPageData, processedColumns, sorting, rowSelection, columnFiltersState,\n visibilityState, columnOrderState, enableSelection, enablePagination, customSortFns,\n manualFiltering, handleSortingChange, internalPageSize, internalPageIndex, onPageChange,\n onPageSizeChange, topLevelData,\n ]);\n\n const table = useReactTable<T>(tableCore as any);\n\n // --- 扩展 API -----------------------------------------------------------\n const resolveRowId = useCallback(\n (row: T, index: number): string => {\n if (getRowId) return getRowId(row, index);\n const anyRow = row as any;\n if (anyRow && anyRow.__id != null) return String(anyRow.__id);\n return String(index);\n },\n [getRowId],\n );\n\n const extensionApi: DataTableApi<T> = useMemo(() => {\n const selectedRowData = table\n .getSelectedRowModel()\n .rows.map((r) => r.original);\n return {\n table,\n data,\n rows: table.getRowModel().rows,\n selectedRows: selectedRowData,\n getRowId: resolveRowId,\n };\n }, [table, data, resolveRowId, rowSelection]);\n\n // --- 右键菜单(由扩展贡献) --------------------------------------------\n const [contextMenu, setContextMenu] = useState<{\n x: number;\n y: number;\n items: DataTableMenuItem<T>[];\n ctx: DataTableCellContext<T>;\n } | null>(null);\n\n useEffect(() => {\n if (!contextMenu) return;\n const close = () => setContextMenu(null);\n window.addEventListener('click', close);\n window.addEventListener('scroll', close, true);\n return () => {\n window.removeEventListener('click', close);\n window.removeEventListener('scroll', close, true);\n };\n }, [contextMenu]);\n\n const handleCellContextMenu = useCallback(\n (e: React.MouseEvent, row: T, column: any, rowIndex: number) => {\n if (extensions.length === 0) return;\n const columnId = column?.id ?? '';\n const value =\n column?.id != null ? (row as any)[column.id] : undefined;\n const ctx: DataTableCellContext<T> = {\n value,\n row,\n rowId: resolveRowId(row, rowIndex),\n rowIndex,\n columnId,\n };\n const items = extensions.flatMap(\n (ext) => ext.contextMenu?.(ctx, extensionApi) ?? [],\n );\n if (!items.length) return;\n e.preventDefault();\n setContextMenu({ x: e.clientX, y: e.clientY, items, ctx });\n },\n [extensions, extensionApi, resolveRowId],\n );\n\n // 收集工具栏 / 底部 / 主体接管的扩展贡献。\n const toolbarExtras = extensions\n .map((ext) =>\n ext.toolbar ? { name: ext.name, node: ext.toolbar(extensionApi) } : null,\n )\n .filter((x): x is { name: string; node: React.ReactNode } => !!x && !!x.node);\n\n const footerExtras = extensions\n .map((ext) =>\n ext.footer ? { name: ext.name, node: ext.footer(extensionApi) } : null,\n )\n .filter((x): x is { name: string; node: React.ReactNode } => !!x && !!x.node);\n\n let overrideContent: React.ReactNode | undefined = undefined;\n for (const ext of extensions) {\n const out = ext.renderContent?.(extensionApi);\n if (out !== undefined) {\n overrideContent = out;\n break;\n }\n }\n\n const handlePageChange = (newPage: number) => {\n if (internalPageIndex === newPage) return;\n setInternalPageIndex(newPage);\n onPageChange?.(newPage);\n };\n\n const toggleColumnVisibility = (columnId: string) => {\n table.getColumn(columnId)?.toggleVisibility();\n };\n\n useEffect(() => {\n const styleElement = document.createElement('style');\n styleElement.textContent = treeRowAnimationStyles;\n document.head.appendChild(styleElement);\n return () => { document.head.removeChild(styleElement); };\n }, []);\n\n return (\n <div className={`w-full ${className}`}>\n <TableToolbar\n toolbar={toolbar}\n table={table}\n columns={columns}\n columnOrderState={columnOrderState}\n visibilityState={visibilityState}\n activeFilter={activeFilter}\n setActiveFilter={setActiveFilter}\n customFilterPanel={customFilterPanel}\n draggedColumnId={draggedColumnId}\n handleDragStart={handleDragStart}\n toggleColumnVisibility={toggleColumnVisibility}\n rowSelection={rowSelection}\n data={data}\n enableColumnReordering={enableColumnReordering}\n handleDrop={handleDrop}\n />\n\n {/* 扩展贡献的工具栏控件 */}\n {toolbarExtras.length > 0 && (\n <div className=\"flex flex-wrap items-start gap-3 mb-4\">\n {toolbarExtras.map((item) => (\n <React.Fragment key={item.name}>{item.node}</React.Fragment>\n ))}\n </div>\n )}\n\n {overrideContent !== undefined ? (\n // 扩展接管了主体渲染(如 Pivot 透视模式)。\n <div className=\"w-full\">{overrideContent}</div>\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <Table className=\"table-sm w-full\">\n <TableHeader\n table={table}\n visibilityState={visibilityState}\n enableSorting={enableSorting}\n enableColumnReordering={enableColumnReordering}\n draggedColumnId={draggedColumnId}\n onColumnMouseEnter={onColumnMouseEnter}\n onColumnMouseLeave={onColumnMouseLeave}\n handleDragStart={handleDragStart}\n handleDragOver={handleDragOver}\n handleDrop={handleDrop}\n />\n <TableBody\n table={table}\n expandedRowsState={expandedRowsState}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n onRowMouseEnter={onRowMouseEnter}\n onRowMouseLeave={onRowMouseLeave}\n onCellClick={onCellClick}\n onCellDoubleClick={onCellDoubleClick}\n onCellMouseEnter={onCellMouseEnter}\n onCellMouseLeave={onCellMouseLeave}\n enableExpanding={enableExpanding}\n indentSize={indentSize}\n handleRowExpand={handleRowExpand}\n extensions={extensions}\n extensionApi={extensionApi}\n getRowId={resolveRowId}\n onCellContextMenu={handleCellContextMenu}\n />\n </Table>\n </div>\n\n <TablePagination\n enablePagination={enablePagination}\n table={table}\n internalPageIndex={internalPageIndex}\n internalPageSize={internalPageSize}\n handlePageChange={handlePageChange}\n setInternalPageSize={setInternalPageSize}\n setInternalPageIndex={setInternalPageIndex}\n onPageSizeChange={onPageSizeChange}\n onPageChange={onPageChange}\n />\n </>\n )}\n\n {/* 扩展贡献的底部控件 */}\n {footerExtras.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-3 mt-4\">\n {footerExtras.map((item) => (\n <React.Fragment key={item.name}>{item.node}</React.Fragment>\n ))}\n </div>\n )}\n\n {/* 扩展贡献的右键菜单 */}\n {contextMenu && (\n <ul\n className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 z-1000 p-1\"\n style={{\n position: 'fixed',\n top: contextMenu.y,\n left: contextMenu.x,\n minWidth: 160,\n }}\n >\n {contextMenu.items.map((item) =>\n item.separator ? (\n <li key={item.key} className=\"my-1 border-t border-base-300\" />\n ) : (\n <li key={item.key}>\n <button\n type=\"button\"\n disabled={item.disabled}\n onClick={() => {\n item.onSelect?.(contextMenu.ctx);\n setContextMenu(null);\n }}\n >\n {item.label}\n </button>\n </li>\n ),\n )}\n </ul>\n )}\n </div>\n );\n}\n\nexport default DataTable;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DataTable.js","names":[],"sources":["../../../../src/components/pro/DataTable/DataTable.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport Table from '../../Table';\nimport { TableToolbar } from './components/TableToolbar';\nimport { TableHeader } from './components/TableHeader';\nimport { TableBody } from './components/TableBody';\nimport { TablePagination } from './components/TablePagination';\nimport { DataTableProps } from './types';\nimport type {\n DataTableApi,\n DataTableCellContext,\n\n DataTableMenuItem,\n} from './extension';\nimport { treeRowAnimationStyles } from './treeDataUtils';\nimport { useDataTableModel } from './useDataTableModel';\nimport { useColumnDragReorder } from './useColumnDragReorder';\n\nexport * from './types';\n\nfunction DataTable<T extends object>(props: DataTableProps<T>) {\n const {\n data,\n columns,\n className = '',\n enableSorting = true,\n enablePagination = true,\n enableColumnReordering = true,\n enableExpanding = false,\n indentSize = 16,\n toolbar = {\n enabled: false,\n enableColumnSelector: false,\n enableFiltering: false,\n enableBulkActions: false,\n },\n customFilterPanel,\n onRowClick,\n onRowDoubleClick,\n onRowMouseEnter,\n onRowMouseLeave,\n onCellClick,\n onCellDoubleClick,\n onCellMouseEnter,\n onCellMouseLeave,\n onColumnMouseEnter,\n onColumnMouseLeave,\n extensions = [],\n } = props;\n const {\n table, rowSelection, visibilityState, columnOrderState, setColumnOrderState,\n expandedRowsState, handleRowExpand, resolveRowId, handlePaginationChange,\n } = useDataTableModel(props);\n const [activeFilter, setActiveFilter] = useState<string | null>(null);\n\n const {\n draggedColumnId,\n handleDragStart,\n handleDragOver,\n handleDrop,\n } = useColumnDragReorder(columnOrderState, setColumnOrderState);\n\n // The v9 table instance is stable: take fresh row snapshots on every render,\n // including sort/filter/page/expand changes, not only selection changes.\n const extensionApi: DataTableApi<T> = {\n table,\n data,\n rows: table.getRowModel().rows,\n selectedRows: table.getSelectedRowModel().flatRows.map(row => row.original),\n getRowId: resolveRowId,\n };\n\n // --- 右键菜单(由扩展贡献) --------------------------------------------\n const [contextMenu, setContextMenu] = useState<{\n x: number;\n y: number;\n items: DataTableMenuItem<T>[];\n ctx: DataTableCellContext<T>;\n } | null>(null);\n\n useEffect(() => {\n if (!contextMenu) return;\n const close = () => setContextMenu(null);\n window.addEventListener('click', close);\n window.addEventListener('scroll', close, true);\n return () => {\n window.removeEventListener('click', close);\n window.removeEventListener('scroll', close, true);\n };\n }, [contextMenu]);\n\n const handleCellContextMenu = useCallback(\n (e: React.MouseEvent, row: T, column: any, rowIndex: number) => {\n if (extensions.length === 0) return;\n const columnId = column?.id ?? '';\n const value =\n column?.id != null ? (row as any)[column.id] : undefined;\n const ctx: DataTableCellContext<T> = {\n value,\n row,\n rowId: resolveRowId(row, rowIndex),\n rowIndex,\n columnId,\n };\n const items = extensions.flatMap(\n (ext) => ext.contextMenu?.(ctx, extensionApi) ?? [],\n );\n if (!items.length) return;\n e.preventDefault();\n setContextMenu({ x: e.clientX, y: e.clientY, items, ctx });\n },\n [extensions, extensionApi, resolveRowId],\n );\n\n // 收集工具栏 / 底部 / 主体接管的扩展贡献。\n const toolbarExtras = extensions\n .map((ext) =>\n ext.toolbar ? { name: ext.name, node: ext.toolbar(extensionApi) } : null,\n )\n .filter((x): x is { name: string; node: React.ReactNode } => !!x && !!x.node);\n\n const footerExtras = extensions\n .map((ext) =>\n ext.footer ? { name: ext.name, node: ext.footer(extensionApi) } : null,\n )\n .filter((x): x is { name: string; node: React.ReactNode } => !!x && !!x.node);\n\n let overrideContent: React.ReactNode | undefined = undefined;\n for (const ext of extensions) {\n const out = ext.renderContent?.(extensionApi);\n if (out !== undefined) {\n overrideContent = out;\n break;\n }\n }\n\n\n const toggleColumnVisibility = (columnId: string) => {\n table.getColumn(columnId)?.toggleVisibility();\n };\n\n useEffect(() => {\n const styleElement = document.createElement('style');\n styleElement.textContent = treeRowAnimationStyles;\n document.head.appendChild(styleElement);\n return () => { document.head.removeChild(styleElement); };\n }, []);\n\n return (\n <div className={`w-full ${className}`}>\n <TableToolbar\n toolbar={toolbar}\n table={table}\n columns={columns}\n columnOrderState={columnOrderState}\n visibilityState={visibilityState}\n activeFilter={activeFilter}\n setActiveFilter={setActiveFilter}\n customFilterPanel={customFilterPanel}\n draggedColumnId={draggedColumnId}\n handleDragStart={handleDragStart}\n toggleColumnVisibility={toggleColumnVisibility}\n rowSelection={rowSelection}\n data={data}\n enableColumnReordering={enableColumnReordering}\n handleDrop={handleDrop}\n />\n\n {/* 扩展贡献的工具栏控件 */}\n {toolbarExtras.length > 0 && (\n <div className=\"flex flex-wrap items-start gap-3 mb-4\">\n {toolbarExtras.map((item) => (\n <React.Fragment key={item.name}>{item.node}</React.Fragment>\n ))}\n </div>\n )}\n\n {overrideContent !== undefined ? (\n // 扩展接管了主体渲染(如 Pivot 透视模式)。\n <div className=\"w-full\">{overrideContent}</div>\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <Table className=\"table-sm w-full\">\n <TableHeader\n table={table}\n visibilityState={visibilityState}\n enableSorting={enableSorting}\n enableColumnReordering={enableColumnReordering}\n draggedColumnId={draggedColumnId}\n onColumnMouseEnter={onColumnMouseEnter}\n onColumnMouseLeave={onColumnMouseLeave}\n handleDragStart={handleDragStart}\n handleDragOver={handleDragOver}\n handleDrop={handleDrop}\n />\n <TableBody\n table={table}\n expandedRowsState={expandedRowsState}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n onRowMouseEnter={onRowMouseEnter}\n onRowMouseLeave={onRowMouseLeave}\n onCellClick={onCellClick}\n onCellDoubleClick={onCellDoubleClick}\n onCellMouseEnter={onCellMouseEnter}\n onCellMouseLeave={onCellMouseLeave}\n enableExpanding={enableExpanding}\n indentSize={indentSize}\n handleRowExpand={handleRowExpand}\n extensions={extensions}\n extensionApi={extensionApi}\n getRowId={resolveRowId}\n onCellContextMenu={handleCellContextMenu}\n />\n </Table>\n </div>\n\n <TablePagination\n enablePagination={enablePagination}\n table={table}\n onPaginationChange={handlePaginationChange}\n />\n </>\n )}\n\n {/* 扩展贡献的底部控件 */}\n {footerExtras.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-3 mt-4\">\n {footerExtras.map((item) => (\n <React.Fragment key={item.name}>{item.node}</React.Fragment>\n ))}\n </div>\n )}\n\n {/* 扩展贡献的右键菜单 */}\n {contextMenu && (\n <ul\n className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 z-1000 p-1\"\n style={{\n position: 'fixed',\n top: contextMenu.y,\n left: contextMenu.x,\n minWidth: 160,\n }}\n >\n {contextMenu.items.map((item) =>\n item.separator ? (\n <li key={item.key} className=\"my-1 border-t border-base-300\" />\n ) : (\n <li key={item.key}>\n <button\n type=\"button\"\n disabled={item.disabled}\n onClick={() => {\n item.onSelect?.(contextMenu.ctx);\n setContextMenu(null);\n }}\n >\n {item.label}\n </button>\n </li>\n ),\n )}\n </ul>\n )}\n </div>\n );\n}\n\nexport default DataTable;\n"],"mappings":"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"}
@@ -10,30 +10,28 @@ function o({ table: o, expandedRowsState: s, onRowClick: c, onRowDoubleClick: l,
10
10
  className: "text-center py-4",
11
11
  children: "没有数据"
12
12
  }) }) : o.getRowModel().rows.map((o, w) => {
13
- let T = o.original, E = T.__depth || 0, D = T.__hasChildren || !1, O = T.__id, k = D && s[O] || !1, A = E > 0, j = T.__parentId, M = !j || s[j] || !1, N = `
13
+ let T = o.depth, E = o.subRows.length > 0, D = o.id, O = E && s[D] || !1, k = `
14
14
  ${o.getIsSelected() ? "bg-primary/10" : ""}
15
- ${D && k ? "tree-row-expanded" : ""}
16
- `;
17
- if (A && !M) return null;
18
- let P = x ? x(o.original, w) : String(O ?? w), F = {
15
+ ${E && O ? "tree-row-expanded" : ""}
16
+ `, A = x ? x(o.original, w) : o.id, j = {
19
17
  row: o.original,
20
- rowId: P,
18
+ rowId: A,
21
19
  rowIndex: w,
22
20
  selected: o.getIsSelected()
23
- }, I = C ? y.reduce((e, t) => Object.assign(e, t.rowProps?.(F, b) ?? {}), {}) : {}, L = /* @__PURE__ */ i(e.Row, {
24
- className: N,
21
+ }, M = C ? y.reduce((e, t) => Object.assign(e, t.rowProps?.(j, b) ?? {}), {}) : {}, N = /* @__PURE__ */ i(e.Row, {
22
+ className: k,
25
23
  onClick: c ? (e) => c(o.original, e) : void 0,
26
24
  onDoubleClick: l ? (e) => l(o.original, e) : void 0,
27
25
  onMouseEnter: u ? (e) => u(o.original, e) : void 0,
28
26
  onMouseLeave: d ? (e) => d(o.original, e) : void 0,
29
- ...I,
27
+ ...M,
30
28
  children: o.getVisibleCells().map((n, s) => {
31
29
  let c = s === 0, l;
32
30
  if (C) {
33
31
  let e = {
34
32
  value: n.getValue(),
35
33
  row: o.original,
36
- rowId: P,
34
+ rowId: A,
37
35
  rowIndex: w,
38
36
  columnId: n.column.id
39
37
  };
@@ -57,9 +55,9 @@ function o({ table: o, expandedRowsState: s, onRowClick: c, onRowDoubleClick: l,
57
55
  children: /* @__PURE__ */ a("div", {
58
56
  className: "flex items-center",
59
57
  onContextMenu: S ? (e) => S(e, o.original, n.column, w) : void 0,
60
- children: [c && g && /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i("div", { style: { width: `${E * _}px` } }), D ? /* @__PURE__ */ i("button", {
58
+ children: [c && g && /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i("div", { style: { width: `${T * _}px` } }), E ? /* @__PURE__ */ i("button", {
61
59
  onClick: (e) => {
62
- e.stopPropagation(), v(O, o.original);
60
+ e.stopPropagation(), v(D, o.original);
63
61
  },
64
62
  className: "mr-2 focus:outline-none",
65
63
  children: /* @__PURE__ */ i("svg", {
@@ -70,7 +68,7 @@ function o({ table: o, expandedRowsState: s, onRowClick: c, onRowDoubleClick: l,
70
68
  stroke: "currentColor",
71
69
  style: {
72
70
  transition: "transform 0.3s ease",
73
- transform: k ? "rotate(90deg)" : "rotate(0deg)"
71
+ transform: O ? "rotate(90deg)" : "rotate(0deg)"
74
72
  },
75
73
  children: /* @__PURE__ */ i("path", {
76
74
  strokeLinecap: "round",
@@ -85,10 +83,10 @@ function o({ table: o, expandedRowsState: s, onRowClick: c, onRowDoubleClick: l,
85
83
  })
86
84
  }, o.id);
87
85
  if (C) {
88
- let e = y.reduce((e, t) => t.wrapRow?.(e, F, b) ?? e, L);
89
- if (e !== L) return /* @__PURE__ */ i(n.Fragment, { children: e }, o.id);
86
+ let e = y.reduce((e, t) => t.wrapRow?.(e, j, b) ?? e, N);
87
+ if (e !== N) return /* @__PURE__ */ i(n.Fragment, { children: e }, o.id);
90
88
  }
91
- return L;
89
+ return N;
92
90
  }) });
93
91
  }
94
92
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"TableBody.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TableBody.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable, flexRender } from '../tanstack-table';\nimport Table from '../../../Table';\nimport { RowEventHandler, CellEventHandler } from '../types';\nimport type {\n DataTableApi,\n DataTableCellContext,\n DataTableExtension,\n DataTableRowContext,\n} from '../extension';\n\ninterface TableBodyProps<T extends object> {\n table: TanStackTable<T>;\n expandedRowsState: Record<string, boolean>;\n onRowClick?: RowEventHandler;\n onRowDoubleClick?: RowEventHandler;\n onRowMouseEnter?: RowEventHandler;\n onRowMouseLeave?: RowEventHandler;\n onCellClick?: CellEventHandler;\n onCellDoubleClick?: CellEventHandler;\n onCellMouseEnter?: CellEventHandler;\n onCellMouseLeave?: CellEventHandler;\n enableExpanding: boolean;\n indentSize: number;\n handleRowExpand: (rowId: string, row: T) => void;\n // 扩展系统\n extensions?: DataTableExtension<T>[];\n extensionApi?: DataTableApi<T>;\n getRowId?: (row: T, index: number) => string;\n onCellContextMenu?: (\n e: React.MouseEvent,\n row: T,\n column: any,\n rowIndex: number,\n ) => void;\n}\n\nexport function TableBody<T extends object>({\n table,\n expandedRowsState,\n onRowClick,\n onRowDoubleClick,\n onRowMouseEnter,\n onRowMouseLeave,\n onCellClick,\n onCellDoubleClick,\n onCellMouseEnter,\n onCellMouseLeave,\n enableExpanding,\n indentSize,\n handleRowExpand,\n extensions = [],\n extensionApi,\n getRowId,\n onCellContextMenu,\n}: TableBodyProps<T>) {\n const hasExtensions = extensions.length > 0 && !!extensionApi;\n\n return (\n <Table.Body>\n {table.getRowModel().rows.length === 0 ? (\n <Table.Row>\n <Table.Cell colSpan={table.getAllColumns().length} className=\"text-center py-4\">\n 没有数据\n </Table.Cell>\n </Table.Row>\n ) : (\n table.getRowModel().rows.map((row, rowIndex) => {\n const rowData = row.original as any;\n const depth = rowData.__depth || 0;\n const hasChildren = rowData.__hasChildren || false;\n const rowId = rowData.__id;\n const isExpanded = hasChildren && expandedRowsState[rowId] || false;\n const isChildRow = depth > 0;\n const parentId = rowData.__parentId;\n const parentExpanded = parentId ? expandedRowsState[parentId] || false : true;\n\n // 根据层级和展开状态应用不同的CSS类\n const rowClassName = `\n ${row.getIsSelected() ? 'bg-primary/10' : ''}\n ${hasChildren ? (isExpanded ? 'tree-row-expanded' : '') : ''}\n `;\n\n // 如果是子行且父行未展开,则不显示\n if (isChildRow && !parentExpanded) {\n return null;\n }\n\n // 扩展的行级上下文与注入属性\n const resolvedRowId = getRowId\n ? getRowId(row.original, rowIndex)\n : String(rowId ?? rowIndex);\n const rowCtx: DataTableRowContext<T> = {\n row: row.original,\n rowId: resolvedRowId,\n rowIndex,\n selected: row.getIsSelected(),\n };\n const extraRowProps = hasExtensions\n ? extensions.reduce<React.HTMLAttributes<HTMLTableRowElement>>(\n (acc, ext) =>\n Object.assign(acc, ext.rowProps?.(rowCtx, extensionApi!) ?? {}),\n {},\n )\n : {};\n\n const rowElement = (\n <Table.Row\n key={row.id}\n className={rowClassName}\n onClick={onRowClick ? e => onRowClick(row.original, e) : undefined}\n onDoubleClick={onRowDoubleClick ? e => onRowDoubleClick(row.original, e) : undefined}\n onMouseEnter={onRowMouseEnter ? e => onRowMouseEnter(row.original, e) : undefined}\n onMouseLeave={onRowMouseLeave ? e => onRowMouseLeave(row.original, e) : undefined}\n {...(extraRowProps as any)}\n >\n {row.getVisibleCells().map((cell, cellIndex) => {\n // 为第一列添加缩进和展开/折叠控件\n const isFirstColumn = cellIndex === 0;\n\n // 扩展可覆写单元格渲染。\n let cellContent: React.ReactNode | undefined;\n if (hasExtensions) {\n const cellCtx: DataTableCellContext<T> = {\n value: cell.getValue(),\n row: row.original,\n rowId: resolvedRowId,\n rowIndex,\n columnId: cell.column.id,\n };\n for (const ext of extensions) {\n const out = ext.cell?.(cellCtx, extensionApi!);\n if (out !== undefined) {\n cellContent = out;\n break;\n }\n }\n }\n if (cellContent === undefined) {\n cellContent = flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n );\n }\n\n return (\n <Table.Cell\n key={cell.id}\n onClick={onCellClick ? e => {\n e.stopPropagation(); // 防止触发行点击事件\n onCellClick(row.original, cell.column, e);\n } : undefined}\n onDoubleClick={onCellDoubleClick ? e => {\n e.stopPropagation(); // 防止触发行双击事件\n onCellDoubleClick(row.original, cell.column, e);\n } : undefined}\n onMouseEnter={onCellMouseEnter ? e => onCellMouseEnter(row.original, cell.column, e) : undefined}\n onMouseLeave={onCellMouseLeave ? e => onCellMouseLeave(row.original, cell.column, e) : undefined}\n >\n <div\n className=\"flex items-center\"\n onContextMenu={\n onCellContextMenu\n ? e =>\n onCellContextMenu(\n e,\n row.original,\n cell.column,\n rowIndex,\n )\n : undefined\n }\n >\n {isFirstColumn && enableExpanding && (\n <>\n <div style={{ width: `${depth * indentSize}px` }} />\n {hasChildren ? (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRowExpand(rowId, row.original);\n }}\n className=\"mr-2 focus:outline-none\"\n >\n {/* 完全重写箭头图标部分,使用内联样式控制方向 */}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n style={{\n transition: 'transform 0.3s ease',\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)'\n }}\n >\n {/* 使用右箭头,通过旋转变为下箭头 */}\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n ) : (\n <div className=\"w-6\"></div>\n )}\n </>\n )}\n {cellContent}\n </div>\n </Table.Cell>\n );\n })}\n </Table.Row>\n );\n\n // 让扩展包裹整行(如在行下方追加 detail 面板)。\n if (hasExtensions) {\n const wrapped = extensions.reduce<React.ReactNode>(\n (node, ext) => ext.wrapRow?.(node, rowCtx, extensionApi!) ?? node,\n rowElement,\n );\n if (wrapped !== rowElement) {\n return <React.Fragment key={row.id}>{wrapped}</React.Fragment>;\n }\n }\n\n return rowElement;\n })\n )}\n </Table.Body>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TableBody.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TableBody.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable, flexRender } from '../tanstack-table';\nimport Table from '../../../Table';\nimport { RowEventHandler, CellEventHandler } from '../types';\nimport type {\n DataTableApi,\n DataTableCellContext,\n DataTableExtension,\n DataTableRowContext,\n} from '../extension';\n\ninterface TableBodyProps<T extends object> {\n table: TanStackTable<T>;\n expandedRowsState: Record<string, boolean>;\n onRowClick?: RowEventHandler;\n onRowDoubleClick?: RowEventHandler;\n onRowMouseEnter?: RowEventHandler;\n onRowMouseLeave?: RowEventHandler;\n onCellClick?: CellEventHandler;\n onCellDoubleClick?: CellEventHandler;\n onCellMouseEnter?: CellEventHandler;\n onCellMouseLeave?: CellEventHandler;\n enableExpanding: boolean;\n indentSize: number;\n handleRowExpand: (rowId: string, row: T) => void;\n // 扩展系统\n extensions?: DataTableExtension<T>[];\n extensionApi?: DataTableApi<T>;\n getRowId?: (row: T, index: number) => string;\n onCellContextMenu?: (\n e: React.MouseEvent,\n row: T,\n column: any,\n rowIndex: number,\n ) => void;\n}\n\nexport function TableBody<T extends object>({\n table,\n expandedRowsState,\n onRowClick,\n onRowDoubleClick,\n onRowMouseEnter,\n onRowMouseLeave,\n onCellClick,\n onCellDoubleClick,\n onCellMouseEnter,\n onCellMouseLeave,\n enableExpanding,\n indentSize,\n handleRowExpand,\n extensions = [],\n extensionApi,\n getRowId,\n onCellContextMenu,\n}: TableBodyProps<T>) {\n const hasExtensions = extensions.length > 0 && !!extensionApi;\n\n return (\n <Table.Body>\n {table.getRowModel().rows.length === 0 ? (\n <Table.Row>\n <Table.Cell colSpan={table.getAllColumns().length} className=\"text-center py-4\">\n 没有数据\n </Table.Cell>\n </Table.Row>\n ) : (\n table.getRowModel().rows.map((row, rowIndex) => {\n const depth = row.depth;\n const hasChildren = row.subRows.length > 0;\n const rowId = row.id;\n const isExpanded = hasChildren && expandedRowsState[rowId] || false;\n\n // 根据层级和展开状态应用不同的CSS类\n const rowClassName = `\n ${row.getIsSelected() ? 'bg-primary/10' : ''}\n ${hasChildren ? (isExpanded ? 'tree-row-expanded' : '') : ''}\n `;\n\n\n // 扩展的行级上下文与注入属性\n const resolvedRowId = getRowId\n ? getRowId(row.original, rowIndex)\n : row.id;\n const rowCtx: DataTableRowContext<T> = {\n row: row.original,\n rowId: resolvedRowId,\n rowIndex,\n selected: row.getIsSelected(),\n };\n const extraRowProps = hasExtensions\n ? extensions.reduce<React.HTMLAttributes<HTMLTableRowElement>>(\n (acc, ext) =>\n Object.assign(acc, ext.rowProps?.(rowCtx, extensionApi!) ?? {}),\n {},\n )\n : {};\n\n const rowElement = (\n <Table.Row\n key={row.id}\n className={rowClassName}\n onClick={onRowClick ? e => onRowClick(row.original, e) : undefined}\n onDoubleClick={onRowDoubleClick ? e => onRowDoubleClick(row.original, e) : undefined}\n onMouseEnter={onRowMouseEnter ? e => onRowMouseEnter(row.original, e) : undefined}\n onMouseLeave={onRowMouseLeave ? e => onRowMouseLeave(row.original, e) : undefined}\n {...(extraRowProps as any)}\n >\n {row.getVisibleCells().map((cell, cellIndex) => {\n // 为第一列添加缩进和展开/折叠控件\n const isFirstColumn = cellIndex === 0;\n\n // 扩展可覆写单元格渲染。\n let cellContent: React.ReactNode | undefined;\n if (hasExtensions) {\n const cellCtx: DataTableCellContext<T> = {\n value: cell.getValue(),\n row: row.original,\n rowId: resolvedRowId,\n rowIndex,\n columnId: cell.column.id,\n };\n for (const ext of extensions) {\n const out = ext.cell?.(cellCtx, extensionApi!);\n if (out !== undefined) {\n cellContent = out;\n break;\n }\n }\n }\n if (cellContent === undefined) {\n cellContent = flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n );\n }\n\n return (\n <Table.Cell\n key={cell.id}\n onClick={onCellClick ? e => {\n e.stopPropagation(); // 防止触发行点击事件\n onCellClick(row.original, cell.column, e);\n } : undefined}\n onDoubleClick={onCellDoubleClick ? e => {\n e.stopPropagation(); // 防止触发行双击事件\n onCellDoubleClick(row.original, cell.column, e);\n } : undefined}\n onMouseEnter={onCellMouseEnter ? e => onCellMouseEnter(row.original, cell.column, e) : undefined}\n onMouseLeave={onCellMouseLeave ? e => onCellMouseLeave(row.original, cell.column, e) : undefined}\n >\n <div\n className=\"flex items-center\"\n onContextMenu={\n onCellContextMenu\n ? e =>\n onCellContextMenu(\n e,\n row.original,\n cell.column,\n rowIndex,\n )\n : undefined\n }\n >\n {isFirstColumn && enableExpanding && (\n <>\n <div style={{ width: `${depth * indentSize}px` }} />\n {hasChildren ? (\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRowExpand(rowId, row.original);\n }}\n className=\"mr-2 focus:outline-none\"\n >\n {/* 完全重写箭头图标部分,使用内联样式控制方向 */}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n style={{\n transition: 'transform 0.3s ease',\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)'\n }}\n >\n {/* 使用右箭头,通过旋转变为下箭头 */}\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n ) : (\n <div className=\"w-6\"></div>\n )}\n </>\n )}\n {cellContent}\n </div>\n </Table.Cell>\n );\n })}\n </Table.Row>\n );\n\n // 让扩展包裹整行(如在行下方追加 detail 面板)。\n if (hasExtensions) {\n const wrapped = extensions.reduce<React.ReactNode>(\n (node, ext) => ext.wrapRow?.(node, rowCtx, extensionApi!) ?? node,\n rowElement,\n );\n if (wrapped !== rowElement) {\n return <React.Fragment key={row.id}>{wrapped}</React.Fragment>;\n }\n }\n\n return rowElement;\n })\n )}\n </Table.Body>\n );\n}\n"],"mappings":"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"}
@@ -1,15 +1,9 @@
1
1
  import React from 'react';
2
- import { Table as TanStackTable } from '../tanstack-table';
2
+ import { Table as TanStackTable, PaginationState } from '../tanstack-table';
3
3
  interface TablePaginationProps<T extends object> {
4
4
  enablePagination: boolean;
5
5
  table: TanStackTable<T>;
6
- internalPageIndex: number;
7
- internalPageSize: number;
8
- handlePageChange: (newPage: number) => void;
9
- setInternalPageSize: (newSize: number) => void;
10
- setInternalPageIndex: (page: number) => void;
11
- onPageSizeChange?: (pageSize: number) => void;
12
- onPageChange?: (page: number) => void;
6
+ onPaginationChange: (pagination: PaginationState) => void;
13
7
  }
14
- export declare function TablePagination<T extends object>({ enablePagination, table, internalPageIndex, internalPageSize, handlePageChange, setInternalPageSize, setInternalPageIndex, onPageSizeChange, onPageChange, }: TablePaginationProps<T>): React.JSX.Element | null;
8
+ export declare function TablePagination<T extends object>({ enablePagination, table, onPaginationChange, }: TablePaginationProps<T>): React.JSX.Element | null;
15
9
  export {};
@@ -1,9 +1,19 @@
1
1
  import "react";
2
2
  import { jsx as e, jsxs as t } from "react/jsx-runtime";
3
3
  //#region src/components/pro/DataTable/components/TablePagination.tsx
4
- function n({ enablePagination: n, table: r, internalPageIndex: i, internalPageSize: a, handlePageChange: o, setInternalPageSize: s, setInternalPageIndex: c, onPageSizeChange: l, onPageChange: u }) {
4
+ function n({ enablePagination: n, table: r, onPaginationChange: i }) {
5
5
  if (!n) return null;
6
- let { pageIndex: d } = r.state.pagination, f = r.getPageCount();
6
+ let { pageIndex: a, pageSize: o } = r.state.pagination, s = r.getPageCount(), c = (e) => i({
7
+ pageIndex: e,
8
+ pageSize: o
9
+ }), l = [.../* @__PURE__ */ new Set([
10
+ 5,
11
+ 10,
12
+ 15,
13
+ 20,
14
+ 25,
15
+ o
16
+ ])].sort((e, t) => e - t);
7
17
  return /* @__PURE__ */ t("div", {
8
18
  className: "mt-4 flex justify-between items-center",
9
19
  children: [
@@ -11,9 +21,9 @@ function n({ enablePagination: n, table: r, internalPageIndex: i, internalPageSi
11
21
  className: "text-sm",
12
22
  children: [
13
23
  "第 ",
14
- d + 1,
24
+ s === 0 ? 0 : a + 1,
15
25
  " 页,共 ",
16
- f,
26
+ s,
17
27
  " 页"
18
28
  ]
19
29
  }) }),
@@ -22,33 +32,33 @@ function n({ enablePagination: n, table: r, internalPageIndex: i, internalPageSi
22
32
  children: [
23
33
  /* @__PURE__ */ e("button", {
24
34
  className: "join-item btn btn-sm",
25
- onClick: () => o(0),
35
+ onClick: () => c(0),
26
36
  disabled: !r.getCanPreviousPage(),
27
37
  children: "<<"
28
38
  }),
29
39
  /* @__PURE__ */ e("button", {
30
40
  className: "join-item btn btn-sm",
31
- onClick: () => o(d - 1),
41
+ onClick: () => c(a - 1),
32
42
  disabled: !r.getCanPreviousPage(),
33
43
  children: "<"
34
44
  }),
35
- Array.from({ length: Math.min(5, f) }).map((t, n) => {
36
- let r = d - 2 + n;
37
- return r < 0 && (r = n), r >= f && (r = f - 5 + n), f <= 5 && (r = n), r < 0 || r >= f ? null : /* @__PURE__ */ e("button", {
38
- className: `join-item btn btn-sm ${r === d ? "btn-active" : ""}`,
39
- onClick: () => o(r),
45
+ Array.from({ length: Math.min(5, s) }).map((t, n) => {
46
+ let r = a - 2 + n;
47
+ return r < 0 && (r = n), r >= s && (r = s - 5 + n), s <= 5 && (r = n), r < 0 || r >= s ? null : /* @__PURE__ */ e("button", {
48
+ className: `join-item btn btn-sm ${r === a ? "btn-active" : ""}`,
49
+ onClick: () => c(r),
40
50
  children: r + 1
41
51
  }, r);
42
52
  }),
43
53
  /* @__PURE__ */ e("button", {
44
54
  className: "join-item btn btn-sm",
45
- onClick: () => o(d + 1),
55
+ onClick: () => c(a + 1),
46
56
  disabled: !r.getCanNextPage(),
47
57
  children: ">"
48
58
  }),
49
59
  /* @__PURE__ */ e("button", {
50
60
  className: "join-item btn btn-sm",
51
- onClick: () => o(f - 1),
61
+ onClick: () => c(s - 1),
52
62
  disabled: !r.getCanNextPage(),
53
63
  children: ">>"
54
64
  })
@@ -56,18 +66,12 @@ function n({ enablePagination: n, table: r, internalPageIndex: i, internalPageSi
56
66
  }),
57
67
  /* @__PURE__ */ e("div", { children: /* @__PURE__ */ e("select", {
58
68
  className: "select select-sm select-bordered",
59
- value: a,
60
- onChange: (e) => {
61
- let t = Number(e.target.value);
62
- s(t), l && l(t), c(0), u && u(0);
63
- },
64
- children: [
65
- 5,
66
- 10,
67
- 15,
68
- 20,
69
- 25
70
- ].map((e) => /* @__PURE__ */ t("option", {
69
+ value: o,
70
+ onChange: (e) => i({
71
+ pageIndex: 0,
72
+ pageSize: Number(e.target.value)
73
+ }),
74
+ children: l.map((e) => /* @__PURE__ */ t("option", {
71
75
  value: e,
72
76
  children: [e, " 条/页"]
73
77
  }, e))
@@ -1 +1 @@
1
- {"version":3,"file":"TablePagination.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TablePagination.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable } from '../tanstack-table';\n\ninterface TablePaginationProps<T extends object> {\n enablePagination: boolean;\n table: TanStackTable<T>;\n internalPageIndex: number;\n internalPageSize: number;\n handlePageChange: (newPage: number) => void;\n setInternalPageSize: (newSize: number) => void;\n setInternalPageIndex: (page: number) => void;\n onPageSizeChange?: (pageSize: number) => void;\n onPageChange?: (page: number) => void;\n}\n\nexport function TablePagination<T extends object>({\n enablePagination,\n table,\n internalPageIndex,\n internalPageSize,\n handlePageChange,\n setInternalPageSize,\n setInternalPageIndex,\n onPageSizeChange,\n onPageChange,\n}: TablePaginationProps<T>) {\n if (!enablePagination) return null;\n\n const { pageIndex } = table.state.pagination;\n const pageCount = table.getPageCount();\n\n return (\n <div className=\"mt-4 flex justify-between items-center\">\n <div>\n <span className=\"text-sm\">\n 第 {pageIndex + 1} 页,共 {pageCount} 页\n </span>\n </div>\n <div className=\"join\">\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(0)}\n disabled={!table.getCanPreviousPage()}\n >\n {'<<'}\n </button>\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageIndex - 1)}\n disabled={!table.getCanPreviousPage()}\n >\n {'<'}\n </button>\n {Array.from({ length: Math.min(5, pageCount) }).map((_, i) => {\n // 显示当前页前后两页\n let pageNum = pageIndex - 2 + i;\n\n // 确保页码在合法范围内\n if (pageNum < 0) pageNum = i;\n if (pageNum >= pageCount) pageNum = pageCount - 5 + i;\n\n // 如果总页数小于5,直接显示全部页码\n if (pageCount <= 5) {\n pageNum = i;\n }\n\n // 如果页码超出范围,不显示\n if (pageNum < 0 || pageNum >= pageCount) return null;\n\n return (\n <button\n key={pageNum}\n className={`join-item btn btn-sm ${pageNum === pageIndex ? 'btn-active' : ''}`}\n onClick={() => handlePageChange(pageNum)}\n >\n {pageNum + 1}\n </button>\n );\n })}\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageIndex + 1)}\n disabled={!table.getCanNextPage()}\n >\n {'>'}\n </button>\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n >\n {'>>'}\n </button>\n </div>\n <div>\n <select\n className=\"select select-sm select-bordered\"\n value={internalPageSize}\n onChange={(e) => {\n const newSize = Number(e.target.value);\n\n // 更新内部页面大小\n setInternalPageSize(newSize);\n\n // 通知外部页面大小变更\n if (onPageSizeChange) {\n onPageSizeChange(newSize);\n }\n\n // 重置到第一页\n setInternalPageIndex(0);\n\n // 通知外部页码重置为0\n if (onPageChange) {\n onPageChange(0);\n }\n }}\n >\n {[5, 10, 15, 20, 25].map((pageSize) => (\n <option key={pageSize} value={pageSize}>\n {pageSize} 条/页\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n}\n"],"mappings":";;;AAeA,SAAgB,EAAkC,EAC9C,qBACA,UACA,sBACA,qBACA,qBACA,wBACA,yBACA,qBACA,mBACwB;CACxB,IAAI,CAAC,GAAkB,OAAO;CAE9B,IAAM,EAAE,iBAAc,EAAM,MAAM,YAC5B,IAAY,EAAM,aAAa;CAErC,OACI,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACI,kBAAC,OAAD,EAAA,UACI,kBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KAA0B;KACnB,IAAY;KAAE;KAAM;KAAU;IAC/B;GACL,CAAA,EAAA,CAAA;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACI,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,CAAC;MACjC,UAAU,CAAC,EAAM,mBAAmB;MAEnC,UAAA;KACG,CAAA;KACR,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,IAAY,CAAC;MAC7C,UAAU,CAAC,EAAM,mBAAmB;MAEnC,UAAA;KACG,CAAA;KACP,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,CAAS,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM;MAE1D,IAAI,IAAU,IAAY,IAAI;MAc9B,OAXI,IAAU,MAAG,IAAU,IACvB,KAAW,MAAW,IAAU,IAAY,IAAI,IAGhD,KAAa,MACb,IAAU,IAIV,IAAU,KAAK,KAAW,IAAkB,OAG5C,kBAAC,UAAD;OAEI,WAAW,wBAAwB,MAAY,IAAY,eAAe;OAC1E,eAAe,EAAiB,CAAO;OAEtC,UAAA,IAAU;MACP,GALC,CAKD;KAEhB,CAAC;KACD,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,IAAY,CAAC;MAC7C,UAAU,CAAC,EAAM,eAAe;MAE/B,UAAA;KACG,CAAA;KACR,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,IAAY,CAAC;MAC7C,UAAU,CAAC,EAAM,eAAe;MAE/B,UAAA;KACG,CAAA;IACP;;GACL,kBAAC,OAAD,EAAA,UACI,kBAAC,UAAD;IACI,WAAU;IACV,OAAO;IACP,WAAW,MAAM;KACb,IAAM,IAAU,OAAO,EAAE,OAAO,KAAK;KAcrC,AAXA,EAAoB,CAAO,GAGvB,KACA,EAAiB,CAAO,GAI5B,EAAqB,CAAC,GAGlB,KACA,EAAa,CAAC;IAEtB;IAEC,UAAA;KAAC;KAAG;KAAI;KAAI;KAAI;IAAE,CAAC,CAAC,KAAK,MACtB,kBAAC,UAAD;KAAuB,OAAO;KAA9B,UAAA,CACK,GAAS,MACN;IAFK,GAAA,CAEL,CACX;GACG,CAAA,EACP,CAAA;EACJ;;AAEb"}
1
+ {"version":3,"file":"TablePagination.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TablePagination.tsx"],"sourcesContent":["import React from 'react';\nimport { Table as TanStackTable, PaginationState } from '../tanstack-table';\n\ninterface TablePaginationProps<T extends object> {\n enablePagination: boolean;\n table: TanStackTable<T>;\n onPaginationChange: (pagination: PaginationState) => void;\n}\n\nexport function TablePagination<T extends object>({\n enablePagination,\n table,\n onPaginationChange,\n}: TablePaginationProps<T>) {\n if (!enablePagination) return null;\n\n const { pageIndex, pageSize } = table.state.pagination;\n const pageCount = table.getPageCount();\n const handlePageChange = (next: number) => onPaginationChange({ pageIndex: next, pageSize });\n const pageSizes = [...new Set([5, 10, 15, 20, 25, pageSize])].sort((a, b) => a - b);\n\n return (\n <div className=\"mt-4 flex justify-between items-center\">\n <div>\n <span className=\"text-sm\">\n 第 {pageCount === 0 ? 0 : pageIndex + 1} 页,共 {pageCount} 页\n </span>\n </div>\n <div className=\"join\">\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(0)}\n disabled={!table.getCanPreviousPage()}\n >\n {'<<'}\n </button>\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageIndex - 1)}\n disabled={!table.getCanPreviousPage()}\n >\n {'<'}\n </button>\n {Array.from({ length: Math.min(5, pageCount) }).map((_, i) => {\n // 显示当前页前后两页\n let pageNum = pageIndex - 2 + i;\n\n // 确保页码在合法范围内\n if (pageNum < 0) pageNum = i;\n if (pageNum >= pageCount) pageNum = pageCount - 5 + i;\n\n // 如果总页数小于5,直接显示全部页码\n if (pageCount <= 5) {\n pageNum = i;\n }\n\n // 如果页码超出范围,不显示\n if (pageNum < 0 || pageNum >= pageCount) return null;\n\n return (\n <button\n key={pageNum}\n className={`join-item btn btn-sm ${pageNum === pageIndex ? 'btn-active' : ''}`}\n onClick={() => handlePageChange(pageNum)}\n >\n {pageNum + 1}\n </button>\n );\n })}\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageIndex + 1)}\n disabled={!table.getCanNextPage()}\n >\n {'>'}\n </button>\n <button\n className=\"join-item btn btn-sm\"\n onClick={() => handlePageChange(pageCount - 1)}\n disabled={!table.getCanNextPage()}\n >\n {'>>'}\n </button>\n </div>\n <div>\n <select\n className=\"select select-sm select-bordered\"\n value={pageSize}\n onChange={(e) => onPaginationChange({ pageIndex: 0, pageSize: Number(e.target.value) })}\n >\n {pageSizes.map((pageSize) => (\n <option key={pageSize} value={pageSize}>\n {pageSize} 条/页\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n}\n"],"mappings":";;;AASA,SAAgB,EAAkC,EAC9C,qBACA,UACA,yBACwB;CACxB,IAAI,CAAC,GAAkB,OAAO;CAE9B,IAAM,EAAE,cAAW,gBAAa,EAAM,MAAM,YACtC,IAAY,EAAM,aAAa,GAC/B,KAAoB,MAAiB,EAAmB;EAAE,WAAW;EAAM;CAAS,CAAC,GACrF,IAAY,CAAC,mBAAG,IAAI,IAAI;EAAC;EAAG;EAAI;EAAI;EAAI;EAAI;CAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;CAElF,OACI,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACI,kBAAC,OAAD,EAAA,UACI,kBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KAA0B;KACnB,MAAc,IAAI,IAAI,IAAY;KAAE;KAAM;KAAU;IACrD;GACL,CAAA,EAAA,CAAA;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACI,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,CAAC;MACjC,UAAU,CAAC,EAAM,mBAAmB;MAEnC,UAAA;KACG,CAAA;KACR,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,IAAY,CAAC;MAC7C,UAAU,CAAC,EAAM,mBAAmB;MAEnC,UAAA;KACG,CAAA;KACP,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,CAAS,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM;MAE1D,IAAI,IAAU,IAAY,IAAI;MAc9B,OAXI,IAAU,MAAG,IAAU,IACvB,KAAW,MAAW,IAAU,IAAY,IAAI,IAGhD,KAAa,MACb,IAAU,IAIV,IAAU,KAAK,KAAW,IAAkB,OAG5C,kBAAC,UAAD;OAEI,WAAW,wBAAwB,MAAY,IAAY,eAAe;OAC1E,eAAe,EAAiB,CAAO;OAEtC,UAAA,IAAU;MACP,GALC,CAKD;KAEhB,CAAC;KACD,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,IAAY,CAAC;MAC7C,UAAU,CAAC,EAAM,eAAe;MAE/B,UAAA;KACG,CAAA;KACR,kBAAC,UAAD;MACI,WAAU;MACV,eAAe,EAAiB,IAAY,CAAC;MAC7C,UAAU,CAAC,EAAM,eAAe;MAE/B,UAAA;KACG,CAAA;IACP;;GACL,kBAAC,OAAD,EAAA,UACI,kBAAC,UAAD;IACI,WAAU;IACV,OAAO;IACP,WAAW,MAAM,EAAmB;KAAE,WAAW;KAAG,UAAU,OAAO,EAAE,OAAO,KAAK;IAAE,CAAC;IAErF,UAAA,EAAU,KAAK,MACZ,kBAAC,UAAD;KAAuB,OAAO;KAA9B,UAAA,CACK,GAAS,MACN;IAFK,GAAA,CAEL,CACX;GACG,CAAA,EACP,CAAA;EACJ;;AAEb"}
@@ -14,9 +14,9 @@
14
14
  * 组装细节。请始终从本模块导入表格相关类型与工具,而不要直接依赖
15
15
  * `@tanstack/react-table`。
16
16
  */
17
- import { useTable, flexRender, tableFeatures, type ReactTable, coreFeatures, columnFilteringFeature, columnOrderingFeature, columnVisibilityFeature, globalFilteringFeature, rowSortingFeature, rowPaginationFeature, rowSelectionFeature, rowExpandingFeature, createCoreRowModel, createFilteredRowModel, createSortedRowModel, createPaginatedRowModel, createExpandedRowModel } from '@tanstack/react-table';
17
+ import { useTable, flexRender, sortFns as builtInSortFns, tableFeatures, type ReactTable, coreFeatures, columnFilteringFeature, columnOrderingFeature, columnVisibilityFeature, globalFilteringFeature, rowSortingFeature, rowPaginationFeature, rowSelectionFeature, rowExpandingFeature, createCoreRowModel, createFilteredRowModel, createSortedRowModel, createPaginatedRowModel, createExpandedRowModel } from '@tanstack/react-table';
18
18
  import type { RowData, OnChangeFn, Updater, CellContext as CoreCellContext, HeaderContext as CoreHeaderContext, SortingState, ColumnFiltersState, RowSelectionState, PaginationState, ColumnOrderState, ExpandedState, ColumnVisibilityState, StockFeatures, Column as CoreColumn, ColumnDef as CoreColumnDef, Row as CoreRow, Cell as CoreCell, Header as CoreHeader, HeaderGroup as CoreHeaderGroup, SortFnOption, SortFn as CoreSortFn, FilterFn as CoreFilterFn, ColumnMeta as CoreColumnMeta, TableOptions } from '@tanstack/react-table';
19
- export { flexRender, useTable, tableFeatures };
19
+ export { flexRender, useTable, tableFeatures, builtInSortFns };
20
20
  export type DishUITableFeatures = StockFeatures;
21
21
  export { coreFeatures, columnFilteringFeature, columnOrderingFeature, columnVisibilityFeature, globalFilteringFeature, rowSortingFeature, rowPaginationFeature, rowSelectionFeature, rowExpandingFeature, createCoreRowModel, createFilteredRowModel, createSortedRowModel, createPaginatedRowModel, createExpandedRowModel, };
22
22
  export type Table<TData extends RowData> = ReactTable<DishUITableFeatures, TData>;
@@ -1,49 +1,57 @@
1
1
  import { useMemo as e } from "react";
2
- import { columnFilteringFeature as t, columnOrderingFeature as n, columnVisibilityFeature as r, coreFeatures as i, createCoreRowModel as a, createExpandedRowModel as o, createFilteredRowModel as s, createPaginatedRowModel as c, createSortedRowModel as l, flexRender as u, globalFilteringFeature as d, rowExpandingFeature as f, rowPaginationFeature as p, rowSelectionFeature as m, rowSortingFeature as h, tableFeatures as g, useTable as _ } from "@tanstack/react-table";
2
+ import { columnFilteringFeature as t, columnOrderingFeature as n, columnVisibilityFeature as r, coreFeatures as i, createCoreRowModel as a, createExpandedRowModel as o, createFilteredRowModel as s, createPaginatedRowModel as c, createSortedRowModel as l, filterFns as u, flexRender as d, globalFilteringFeature as f, rowExpandingFeature as p, rowPaginationFeature as m, rowSelectionFeature as h, rowSortingFeature as g, sortFns as _, tableFeatures as v, useTable as y } from "@tanstack/react-table";
3
3
  //#region src/components/pro/DataTable/tanstack-table.ts
4
- var v = g({
4
+ var b = v({
5
5
  ...i,
6
6
  columnFilteringFeature: t,
7
7
  columnOrderingFeature: n,
8
8
  columnVisibilityFeature: r,
9
- globalFilteringFeature: d,
10
- rowSortingFeature: h,
11
- rowPaginationFeature: p,
12
- rowSelectionFeature: m,
13
- rowExpandingFeature: f,
9
+ globalFilteringFeature: f,
10
+ rowSortingFeature: g,
11
+ rowPaginationFeature: m,
12
+ rowSelectionFeature: h,
13
+ rowExpandingFeature: p,
14
+ sortFns: _,
15
+ filterFns: u,
14
16
  coreRowModel: a(),
15
17
  filteredRowModel: s(),
16
18
  sortedRowModel: l(),
17
19
  paginatedRowModel: c(),
18
20
  expandedRowModel: o()
19
21
  });
20
- function y(u) {
21
- let { sortFns: y, filterFns: b, ...x } = u, S = e(() => {
22
- if (!y && !b) return v;
22
+ function x(d) {
23
+ let { sortFns: x, filterFns: S, ...C } = d, w = e(() => {
24
+ if (!x && !S) return b;
23
25
  let e = {
24
26
  ...i,
25
27
  columnFilteringFeature: t,
26
28
  columnOrderingFeature: n,
27
29
  columnVisibilityFeature: r,
28
- globalFilteringFeature: d,
29
- rowSortingFeature: h,
30
- rowPaginationFeature: p,
31
- rowSelectionFeature: m,
32
- rowExpandingFeature: f,
30
+ globalFilteringFeature: f,
31
+ rowSortingFeature: g,
32
+ rowPaginationFeature: m,
33
+ rowSelectionFeature: h,
34
+ rowExpandingFeature: p,
33
35
  coreRowModel: a(),
34
36
  filteredRowModel: s(),
35
37
  sortedRowModel: l(),
36
38
  paginatedRowModel: c(),
37
39
  expandedRowModel: o()
38
40
  };
39
- return y && (e.sortFns = y), b && (e.filterFns = b), g(e);
40
- }, [y, b]);
41
- return _({
42
- features: S,
43
- ...x
41
+ return e.sortFns = {
42
+ ..._,
43
+ ...x
44
+ }, e.filterFns = {
45
+ ...u,
46
+ ...S
47
+ }, v(e);
48
+ }, [x, S]);
49
+ return y({
50
+ features: w,
51
+ ...C
44
52
  });
45
53
  }
46
54
  //#endregion
47
- export { t as columnFilteringFeature, n as columnOrderingFeature, r as columnVisibilityFeature, i as coreFeatures, a as createCoreRowModel, o as createExpandedRowModel, s as createFilteredRowModel, c as createPaginatedRowModel, l as createSortedRowModel, u as flexRender, d as globalFilteringFeature, f as rowExpandingFeature, p as rowPaginationFeature, m as rowSelectionFeature, h as rowSortingFeature, g as tableFeatures, y as useReactTable, _ as useTable };
55
+ export { _ as builtInSortFns, t as columnFilteringFeature, n as columnOrderingFeature, r as columnVisibilityFeature, i as coreFeatures, a as createCoreRowModel, o as createExpandedRowModel, s as createFilteredRowModel, c as createPaginatedRowModel, l as createSortedRowModel, d as flexRender, f as globalFilteringFeature, p as rowExpandingFeature, m as rowPaginationFeature, h as rowSelectionFeature, g as rowSortingFeature, v as tableFeatures, x as useReactTable, y as useTable };
48
56
 
49
57
  //# sourceMappingURL=tanstack-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tanstack-table.js","names":[],"sources":["../../../../src/components/pro/DataTable/tanstack-table.ts"],"sourcesContent":["/**\n * TanStack Table v9 适配层(全面使用 v9 原生 API)。\n *\n * DishUI 的 DataTable 现已全面迁移到 TanStack Table v9 的原生 API:\n * - `useTable` + `tableFeatures({...})` 显式注册特性与 row model 工厂;\n * - row model 通过 `createCoreRowModel()` / `createSortedRowModel()` 等工厂注册;\n * - 使用 `table.state`(而非 v8 的 `table.getState()`)读取状态;\n * - 列定义的自定义排序使用 `sortFn`(v8 为 `sortingFn`)。\n *\n * 本模块把 v9 的多泛型类型(`<TFeatures, TData, TValue>`)用 `StockFeatures`\n * 预绑定成单泛型别名(`ColumnDef<T>`、`Row<T>`、`Table<T>` 等),让上层代码\n * 保持简洁;同时保留一个 v8 命名习惯的 `useReactTable` 包装器,内部把\n * 「row model 工厂」组装进 v9 的 `features`,从而对调用方屏蔽 v9 的 `features`\n * 组装细节。请始终从本模块导入表格相关类型与工具,而不要直接依赖\n * `@tanstack/react-table`。\n */\nimport {\n useTable,\n flexRender,\n tableFeatures,\n type ReactTable,\n // 核心特性\n coreFeatures,\n // 各功能特性\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n // row model 工厂\n createCoreRowModel,\n createFilteredRowModel,\n createSortedRowModel,\n createPaginatedRowModel,\n createExpandedRowModel,\n} from '@tanstack/react-table';\nimport type {\n RowData,\n OnChangeFn,\n Updater,\n CellContext as CoreCellContext,\n HeaderContext as CoreHeaderContext,\n // 状态类型\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n PaginationState,\n ColumnOrderState,\n ExpandedState,\n ColumnVisibilityState,\n // 多泛型类型(用 StockFeatures 预绑定为单泛型别名)\n StockFeatures,\n Column as CoreColumn,\n ColumnDef as CoreColumnDef,\n Row as CoreRow,\n Cell as CoreCell,\n Header as CoreHeader,\n HeaderGroup as CoreHeaderGroup,\n SortFnOption,\n SortFn as CoreSortFn,\n FilterFn as CoreFilterFn,\n ColumnMeta as CoreColumnMeta,\n TableOptions,\n} from '@tanstack/react-table';\nimport { useMemo } from 'react';\n\nexport { flexRender, useTable, tableFeatures };\n\n/**\n * 一个包含全部常用特性 + row model 工厂的默认 features 预设。\n * `useReactTable` 会用它作为默认 `features`,因此调用方无需手动组装。\n * (内部常量:其推断类型引用了 table-core 的内部路径,不对外导出以避免\n * 声明文件的可移植性问题;对外通过 `DishUITableFeatures` 类型别名暴露。)\n */\nconst dishuiTableFeatures = tableFeatures({\n ...coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n coreRowModel: createCoreRowModel(),\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n});\n\nexport type DishUITableFeatures = StockFeatures;\n\n// v9 原生 row model 工厂再导出(供需要精细控制 features 的调用方使用)。\nexport {\n coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n createCoreRowModel,\n createFilteredRowModel,\n createSortedRowModel,\n createPaginatedRowModel,\n createExpandedRowModel,\n};\n\n// 单泛型(StockFeatures 预绑定)类型别名,保持上层简洁。\n// `Table` 映射到 `useTable` 返回的 ReactTable(具备 `.state` / `.FlexRender`)。\nexport type Table<TData extends RowData> = ReactTable<DishUITableFeatures, TData>;\nexport type Column<TData extends RowData, TValue = unknown> = CoreColumn<DishUITableFeatures, TData, TValue>;\nexport type ColumnDef<TData extends RowData, TValue = unknown> = CoreColumnDef<DishUITableFeatures, TData, TValue>;\nexport type Row<TData extends RowData> = CoreRow<DishUITableFeatures, TData>;\nexport type Cell<TData extends RowData, TValue = unknown> = CoreCell<DishUITableFeatures, TData, TValue>;\nexport type Header<TData extends RowData, TValue = unknown> = CoreHeader<DishUITableFeatures, TData, TValue>;\nexport type HeaderGroup<TData extends RowData> = CoreHeaderGroup<DishUITableFeatures, TData>;\nexport type CellContext<TData extends RowData, TValue = unknown> = CoreCellContext<DishUITableFeatures, TData, TValue>;\nexport type HeaderContext<TData extends RowData, TValue = unknown> = CoreHeaderContext<DishUITableFeatures, TData, TValue>;\n\n// 状态类型(沿用 v8 惯用命名)。\nexport type {\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n PaginationState,\n ColumnOrderState,\n ExpandedState,\n OnChangeFn,\n Updater,\n RowData,\n};\n\n/** v8 `VisibilityState` -> v9 `ColumnVisibilityState`。 */\nexport type VisibilityState = ColumnVisibilityState;\n\n/** 列的自定义排序函数(v9:`sortFn`)。 */\nexport type SortingFnOption<TData extends RowData> = SortFnOption<DishUITableFeatures, TData>;\nexport type SortingFn<TData extends RowData> = CoreSortFn<DishUITableFeatures, TData>;\nexport type FilterFn<TData extends RowData> = CoreFilterFn<DishUITableFeatures, TData>;\nexport type ColumnMeta<TData extends RowData, TValue = unknown> = CoreColumnMeta<DishUITableFeatures, TData, TValue>;\n\n/**\n * v8 命名习惯的表格 hook 包装器。\n *\n * 接收「已经组装好的」表格选项(不含 `features`),自动注入 DishUI 的默认\n * `features` 预设(含 core + 全部常用特性 + row model 工厂),返回 v9 原生\n * 的 `useTable` 实例。若需自定义排序/筛选函数注册表,可通过 `sortFns` /\n * `filterFns` 传入(会并入 features)。\n */\nexport function useReactTable<TData extends RowData>(\n options: Omit<TableOptions<DishUITableFeatures, TData>, 'features'> & {\n /** 自定义排序函数注册表(v9:合入 features 的 sortFns)。 */\n sortFns?: Record<string, SortingFn<TData>>;\n /** 自定义筛选函数注册表(v9:合入 features 的 filterFns)。 */\n filterFns?: Record<string, FilterFn<TData>>;\n },\n): Table<TData> {\n const { sortFns, filterFns, ...rest } = options;\n\n const features = useMemo(() => {\n if (!sortFns && !filterFns) return dishuiTableFeatures;\n const merged: Record<string, unknown> = {\n ...coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n coreRowModel: createCoreRowModel(),\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n };\n if (sortFns) merged.sortFns = sortFns;\n if (filterFns) merged.filterFns = filterFns;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return tableFeatures(merged as any);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sortFns, filterFns]);\n\n return useTable<DishUITableFeatures, TData>({\n features,\n ...rest,\n } as TableOptions<DishUITableFeatures, TData>) as unknown as Table<TData>;\n}\n"],"mappings":";;;AA6EA,IAAM,IAAsB,EAAc;CACxC,GAAG;CACH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,cAAc,EAAmB;CACjC,kBAAkB,EAAuB;CACzC,gBAAgB,EAAqB;CACrC,mBAAmB,EAAwB;CAC3C,kBAAkB,EAAuB;AAC3C,CAAC;AAgED,SAAgB,EACd,GAMc;CACd,IAAM,EAAE,YAAS,cAAW,GAAG,MAAS,GAElC,IAAW,QAAc;EAC7B,IAAI,CAAC,KAAW,CAAC,GAAW,OAAO;EACnC,IAAM,IAAkC;GACtC,GAAG;GACH;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,cAAc,EAAmB;GACjC,kBAAkB,EAAuB;GACzC,gBAAgB,EAAqB;GACrC,mBAAmB,EAAwB;GAC3C,kBAAkB,EAAuB;EAC3C;EAIA,OAHI,MAAS,EAAO,UAAU,IAC1B,MAAW,EAAO,YAAY,IAE3B,EAAc,CAAa;CAEpC,GAAG,CAAC,GAAS,CAAS,CAAC;CAEvB,OAAO,EAAqC;EAC1C;EACA,GAAG;CACL,CAA6C;AAC/C"}
1
+ {"version":3,"file":"tanstack-table.js","names":[],"sources":["../../../../src/components/pro/DataTable/tanstack-table.ts"],"sourcesContent":["/**\n * TanStack Table v9 适配层(全面使用 v9 原生 API)。\n *\n * DishUI 的 DataTable 现已全面迁移到 TanStack Table v9 的原生 API:\n * - `useTable` + `tableFeatures({...})` 显式注册特性与 row model 工厂;\n * - row model 通过 `createCoreRowModel()` / `createSortedRowModel()` 等工厂注册;\n * - 使用 `table.state`(而非 v8 的 `table.getState()`)读取状态;\n * - 列定义的自定义排序使用 `sortFn`(v8 为 `sortingFn`)。\n *\n * 本模块把 v9 的多泛型类型(`<TFeatures, TData, TValue>`)用 `StockFeatures`\n * 预绑定成单泛型别名(`ColumnDef<T>`、`Row<T>`、`Table<T>` 等),让上层代码\n * 保持简洁;同时保留一个 v8 命名习惯的 `useReactTable` 包装器,内部把\n * 「row model 工厂」组装进 v9 的 `features`,从而对调用方屏蔽 v9 的 `features`\n * 组装细节。请始终从本模块导入表格相关类型与工具,而不要直接依赖\n * `@tanstack/react-table`。\n */\nimport {\n useTable,\n flexRender,\n sortFns as builtInSortFns,\n filterFns as builtInFilterFns,\n tableFeatures,\n type ReactTable,\n // 核心特性\n coreFeatures,\n // 各功能特性\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n // row model 工厂\n createCoreRowModel,\n createFilteredRowModel,\n createSortedRowModel,\n createPaginatedRowModel,\n createExpandedRowModel,\n} from '@tanstack/react-table';\nimport type {\n RowData,\n OnChangeFn,\n Updater,\n CellContext as CoreCellContext,\n HeaderContext as CoreHeaderContext,\n // 状态类型\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n PaginationState,\n ColumnOrderState,\n ExpandedState,\n ColumnVisibilityState,\n // 多泛型类型(用 StockFeatures 预绑定为单泛型别名)\n StockFeatures,\n Column as CoreColumn,\n ColumnDef as CoreColumnDef,\n Row as CoreRow,\n Cell as CoreCell,\n Header as CoreHeader,\n HeaderGroup as CoreHeaderGroup,\n SortFnOption,\n SortFn as CoreSortFn,\n FilterFn as CoreFilterFn,\n ColumnMeta as CoreColumnMeta,\n TableOptions,\n} from '@tanstack/react-table';\nimport { useMemo } from 'react';\n\nexport { flexRender, useTable, tableFeatures, builtInSortFns };\n\n/**\n * 一个包含全部常用特性 + row model 工厂的默认 features 预设。\n * `useReactTable` 会用它作为默认 `features`,因此调用方无需手动组装。\n * (内部常量:其推断类型引用了 table-core 的内部路径,不对外导出以避免\n * 声明文件的可移植性问题;对外通过 `DishUITableFeatures` 类型别名暴露。)\n */\nconst dishuiTableFeatures = tableFeatures({\n ...coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n sortFns: builtInSortFns,\n filterFns: builtInFilterFns,\n coreRowModel: createCoreRowModel(),\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n});\n\nexport type DishUITableFeatures = StockFeatures;\n\n// v9 原生 row model 工厂再导出(供需要精细控制 features 的调用方使用)。\nexport {\n coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n createCoreRowModel,\n createFilteredRowModel,\n createSortedRowModel,\n createPaginatedRowModel,\n createExpandedRowModel,\n};\n\n// 单泛型(StockFeatures 预绑定)类型别名,保持上层简洁。\n// `Table` 映射到 `useTable` 返回的 ReactTable(具备 `.state` / `.FlexRender`)。\nexport type Table<TData extends RowData> = ReactTable<DishUITableFeatures, TData>;\nexport type Column<TData extends RowData, TValue = unknown> = CoreColumn<DishUITableFeatures, TData, TValue>;\nexport type ColumnDef<TData extends RowData, TValue = unknown> = CoreColumnDef<DishUITableFeatures, TData, TValue>;\nexport type Row<TData extends RowData> = CoreRow<DishUITableFeatures, TData>;\nexport type Cell<TData extends RowData, TValue = unknown> = CoreCell<DishUITableFeatures, TData, TValue>;\nexport type Header<TData extends RowData, TValue = unknown> = CoreHeader<DishUITableFeatures, TData, TValue>;\nexport type HeaderGroup<TData extends RowData> = CoreHeaderGroup<DishUITableFeatures, TData>;\nexport type CellContext<TData extends RowData, TValue = unknown> = CoreCellContext<DishUITableFeatures, TData, TValue>;\nexport type HeaderContext<TData extends RowData, TValue = unknown> = CoreHeaderContext<DishUITableFeatures, TData, TValue>;\n\n// 状态类型(沿用 v8 惯用命名)。\nexport type {\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n PaginationState,\n ColumnOrderState,\n ExpandedState,\n OnChangeFn,\n Updater,\n RowData,\n};\n\n/** v8 `VisibilityState` -> v9 `ColumnVisibilityState`。 */\nexport type VisibilityState = ColumnVisibilityState;\n\n/** 列的自定义排序函数(v9:`sortFn`)。 */\nexport type SortingFnOption<TData extends RowData> = SortFnOption<DishUITableFeatures, TData>;\nexport type SortingFn<TData extends RowData> = CoreSortFn<DishUITableFeatures, TData>;\nexport type FilterFn<TData extends RowData> = CoreFilterFn<DishUITableFeatures, TData>;\nexport type ColumnMeta<TData extends RowData, TValue = unknown> = CoreColumnMeta<DishUITableFeatures, TData, TValue>;\n\n/**\n * v8 命名习惯的表格 hook 包装器。\n *\n * 接收「已经组装好的」表格选项(不含 `features`),自动注入 DishUI 的默认\n * `features` 预设(含 core + 全部常用特性 + row model 工厂),返回 v9 原生\n * 的 `useTable` 实例。若需自定义排序/筛选函数注册表,可通过 `sortFns` /\n * `filterFns` 传入(会并入 features)。\n */\nexport function useReactTable<TData extends RowData>(\n options: Omit<TableOptions<DishUITableFeatures, TData>, 'features'> & {\n /** 自定义排序函数注册表(v9:合入 features 的 sortFns)。 */\n sortFns?: Record<string, SortingFn<TData>>;\n /** 自定义筛选函数注册表(v9:合入 features 的 filterFns)。 */\n filterFns?: Record<string, FilterFn<TData>>;\n },\n): Table<TData> {\n const { sortFns, filterFns, ...rest } = options;\n\n const features = useMemo(() => {\n if (!sortFns && !filterFns) return dishuiTableFeatures;\n const merged: Record<string, unknown> = {\n ...coreFeatures,\n columnFilteringFeature,\n columnOrderingFeature,\n columnVisibilityFeature,\n globalFilteringFeature,\n rowSortingFeature,\n rowPaginationFeature,\n rowSelectionFeature,\n rowExpandingFeature,\n coreRowModel: createCoreRowModel(),\n filteredRowModel: createFilteredRowModel(),\n sortedRowModel: createSortedRowModel(),\n paginatedRowModel: createPaginatedRowModel(),\n expandedRowModel: createExpandedRowModel(),\n };\n merged.sortFns = { ...builtInSortFns, ...sortFns };\n merged.filterFns = { ...builtInFilterFns, ...filterFns };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return tableFeatures(merged as any);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sortFns, filterFns]);\n\n return useTable<DishUITableFeatures, TData>({\n features,\n ...rest,\n } as TableOptions<DishUITableFeatures, TData>) as unknown as Table<TData>;\n}\n"],"mappings":";;;AA+EA,IAAM,IAAsB,EAAc;CACxC,GAAG;CACH;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,SAAS;CACE;CACX,cAAc,EAAmB;CACjC,kBAAkB,EAAuB;CACzC,gBAAgB,EAAqB;CACrC,mBAAmB,EAAwB;CAC3C,kBAAkB,EAAuB;AAC3C,CAAC;AAgED,SAAgB,EACd,GAMc;CACd,IAAM,EAAE,YAAS,WAAA,GAAW,GAAG,MAAS,GAElC,IAAW,QAAc;EAC7B,IAAI,CAAC,KAAW,CAAC,GAAW,OAAO;EACnC,IAAM,IAAkC;GACtC,GAAG;GACH;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,cAAc,EAAmB;GACjC,kBAAkB,EAAuB;GACzC,gBAAgB,EAAqB;GACrC,mBAAmB,EAAwB;GAC3C,kBAAkB,EAAuB;EAC3C;EAIA,OAHA,EAAO,UAAU;GAAE,GAAG;GAAgB,GAAG;EAAQ,GACjD,EAAO,YAAY;GAAE,GAAG;GAAkB,GAAG;EAAU,GAEhD,EAAc,CAAa;CAEpC,GAAG,CAAC,GAAS,CAAS,CAAC;CAEvB,OAAO,EAAqC;EAC1C;EACA,GAAG;CACL,CAA6C;AAC/C"}
@@ -2,6 +2,8 @@ import { Row } from './tanstack-table';
2
2
  export declare const treeRowAnimationStyles = "\n.tree-row-icon {\n transition: transform 0.3s ease;\n}\n\n.tree-row-expanded .tree-row-icon {\n transform: rotate(90deg);\n}\n";
3
3
  export declare function findAllChildRowIds<T>(row: any, parentId: string, subDataKey: string, getRowId?: (row: T, index: number) => string, prefix?: string): string[];
4
4
  export declare function flattenTreeData<T extends object>(items: T[], expandedRowsState: Record<string, boolean>, subDataKey: string, getRowId?: (row: T, index: number) => string, depth?: number, parentId?: string, isParentExpanded?: boolean, result?: any[], onlyTopLevel?: boolean): any[];
5
+ /** Keep the hierarchy intact for TanStack's filter → sort → root-page → expand pipeline. */
6
+ export declare function prepareTreeData<T extends object>(items: T[], expanded: Record<string, boolean>, subDataKey: string, getRowId?: (row: T, index: number) => string, depth?: number, parentId?: string): T[];
5
7
  export declare function createTreeSortingFns<T extends object>(): {
6
8
  treeSortAsc: (rowA: Row<T>, rowB: Row<T>, columnId: string) => number;
7
9
  };
@@ -2,32 +2,31 @@
2
2
  var e = "\n.tree-row-icon {\n transition: transform 0.3s ease;\n}\n\n.tree-row-expanded .tree-row-icon {\n transform: rotate(90deg);\n}\n";
3
3
  function t(e, n, r, i, a = "") {
4
4
  let o = [], s = e[r];
5
- return Array.isArray(s) && s.length > 0 && s.forEach((e, s) => {
6
- let c = i ? i(e, s) : `${a}${n}_${s}`;
7
- o.push(c);
8
- let l = t(e, c, r, i, `${a}${n}_${s}_`);
9
- o.push(...l);
5
+ return Array.isArray(s) && s.length > 0 && s.forEach((e, a) => {
6
+ let s = i ? i(e, a) : `${n}_${a}`;
7
+ o.push(s);
8
+ let c = t(e, s, r, i);
9
+ o.push(...c);
10
10
  }), o;
11
11
  }
12
- function n(e, t, r, i, a = 0, o = "", s = !0, c = [], l = !1) {
13
- return e.forEach((e, u) => {
14
- let d = i ? i(e, u) : o ? `${o}_${u}` : `${u}`, f = {
12
+ function n(e, t, r, i, a = 0, o = "") {
13
+ return e.map((e, s) => {
14
+ let c = i ? i(e, s) : a > 0 ? `${o}_${s}` : String(s), l = e[r], u = Array.isArray(l) ? l : [];
15
+ return {
15
16
  ...e,
16
- __depth: a,
17
- __id: d,
17
+ [r]: n(u, t, r, i, a + 1, c),
18
+ __id: c,
18
19
  __parentId: o,
19
- __hasChildren: Array.isArray(e[r]) && e[r].length > 0,
20
- __isExpanded: t[d] || !1,
21
- __childCount: Array.isArray(e[r]) ? e[r].length : 0
20
+ __depth: a,
21
+ __hasChildren: u.length > 0,
22
+ __childCount: u.length,
23
+ __isExpanded: t[c] || !1
22
24
  };
23
- l ? a === 0 && c.push(f) : (a === 0 || s) && c.push(f);
24
- let p = t[d] || !1;
25
- Array.isArray(e[r]) && e[r].length > 0 && p && !l && n(e[r], t, r, i, a + 1, d, s && p, c, l);
26
- }), c;
25
+ });
27
26
  }
28
27
  function r() {
29
28
  return { treeSortAsc: (e, t, n) => {
30
- let r = e.original, i = t.original, a = r.__depth === void 0 ? 0 : r.__depth, o = i.__depth === void 0 ? 0 : i.__depth;
29
+ let r = e.original, i = t.original, a = e.depth ?? r.__depth ?? 0, o = t.depth ?? i.__depth ?? 0;
31
30
  if (a !== o) return 0;
32
31
  if (a === 0 && o === 0) {
33
32
  let r = e.getValue(n), i = t.getValue(n);
@@ -37,6 +36,6 @@ function r() {
37
36
  } };
38
37
  }
39
38
  //#endregion
40
- export { r as createTreeSortingFns, t as findAllChildRowIds, n as flattenTreeData, e as treeRowAnimationStyles };
39
+ export { r as createTreeSortingFns, t as findAllChildRowIds, n as prepareTreeData, e as treeRowAnimationStyles };
41
40
 
42
41
  //# sourceMappingURL=treeDataUtils.js.map