UNPKG

@rtdui/datatable

Version:

React DataTable component based on Rtdui components

1 lines 151 kB
{"version":3,"file":"DataTable.cjs","sources":["../../src/DataTable/DataTable.tsx"],"sourcesContent":["import {\n\tforwardRef,\n\tuseState,\n\tuseEffect,\n\tuseRef,\n\tuseCallback,\n\tuseMemo,\n\tuseImperativeHandle,\n\ttype CSSProperties,\n} from \"react\";\nimport type {\n\tAccessorKeyColumnDef,\n\tCellContext,\n\tRow,\n\tTableOptions,\n} from \"@tanstack/react-table\";\nimport {\n\tuseReactTable,\n\tgetCoreRowModel,\n\tgetSortedRowModel,\n\tgetGroupedRowModel,\n\tgetExpandedRowModel,\n\tgetPaginationRowModel,\n\tgetFilteredRowModel,\n\tgetFacetedRowModel,\n\tgetFacetedUniqueValues,\n\tgetFacetedMinMaxValues,\n\tflattenBy,\n} from \"@tanstack/react-table\";\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\nimport { TouchBackend } from \"react-dnd-touch-backend\";\nimport { DndProvider } from \"react-dnd\";\n\nimport {\n\tIconChevronDown,\n\tIconChevronRight,\n\tIconDirection,\n} from \"@tabler/icons-react\";\nimport { klona } from \"klona/full\";\nimport { useScrollTrigger } from \"@rtdui/hooks\";\nimport { Checkbox, isMobile, getType, filterProps } from \"@rtdui/core\";\nimport type { ThemeBaseSize } from \"@rtdui/core\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport clsx from \"clsx\";\nimport { getLeafColumns, getColumnDefId } from \"../utils\";\nimport { getVisibleColumns } from \"./utils\";\nimport { HeaderCell } from \"./HeaderCell\";\nimport { FooterCell } from \"./FooterCell\";\nimport { BodyCell } from \"./BodyCell\";\nimport { TablePagination } from \"./TablePagination\";\nimport { ColumnsVisibility } from \"./ColumnsVisibility\";\nimport { GroupDropArea } from \"./GroupDropArea\";\nimport { ExportTable } from \"./ExportTable\";\nimport { IndeterminateCheckbox } from \"./IndeterminateCheckbox\";\nimport { RowActive } from \"./features/RowActive\";\n\nlet isMobileDevice = false;\nif (typeof document !== \"undefined\") {\n\tisMobileDevice = isMobile();\n}\n\nexport interface Changes {\n\tchanges: {\n\t\tadded: any[];\n\t\tchanged: Record<string, Record<string, any>>;\n\t\tdeleted: any[];\n\t};\n\terrors: Record<string, Record<string, string>>;\n}\n\nexport type Rule = (\n\tvalue: any,\n\trow: Row<any>,\n\tdata: any[],\n) => string | null | undefined;\n\nexport interface DataTableProps\n\textends React.ComponentPropsWithoutRef<\"div\">,\n\t\tOmit<TableOptions<any>, \"_features\" | \"getCoreRowModel\"> {\n\tclassName?: string;\n\t/** 样式槽 */\n\tslots?: {\n\t\tcontainer?: string;\n\t\ttoolbar?: string;\n\t\tgroupDropArea?: string;\n\t\ttable?: string;\n\t};\n\t/** 表行的高度\n\t * @default \"sm\"\n\t */\n\tsize?: ThemeBaseSize;\n\t/**\n\t * 是否显示表头行\n\t * @default true\n\t */\n\tshowHeader?: boolean;\n\t/**\n\t * 是否显示工具栏\n\t * @default true\n\t */\n\tshowToolbar?: boolean;\n\t/**\n\t * 是否显示表格和单元格的边框\n\t * @default true\n\t */\n\tshowBorder?: boolean;\n\t/**\n\t * 是否显示表格和单元格的边框大小\n\t * @default 1\n\t */\n\tborderWidth?: number;\n\t/**\n\t * use CSS table-layout fixed\n\t * @default true\n\t */\n\tfixedLayout?: boolean;\n\t/**\n\t * 表格滚动时列头固定在视图顶部\n\t * @default true\n\t */\n\tenableStickyHeader?: boolean;\n\t/**\n\t * 自动创建行号列, 自动行号在初始化确定, 后续的排序过滤将不受影响.\n\t * @default false\n\t */\n\tenableAutoRowNumber?: boolean;\n\t/**\n\t * 是否启用表格导出\n\t * @default false\n\t */\n\tenableExport?: boolean;\n\t/**\n\t * 过滤编辑器中用户输入生效的延迟毫秒数\n\t * @default 500\n\t */\n\tdebouncedWait?: number;\n\t/**\n\t * 滚动虚拟化器\n\t * @default false\n\t */\n\tenableVirtualized?: boolean;\n\t/**\n\t * 是否允许用户拖放调整列序\n\t * @default true\n\t */\n\tenableColumnReorder?: boolean;\n\t/**\n\t * 启用行选择功能时, 是否启动点击行选择.\n\t * @default true\n\t */\n\tenableClickRowSelection?: boolean;\n\t/**\n\t * 启用多行选择功能时, 全选时的范围是所有行还是当前页内的行.\n\t * @default true\n\t */\n\tselectAllForAllPages?: boolean;\n\t/**\n\t * 是否启用分页\n\t * @default false\n\t */\n\tenablePagination?: boolean;\n\n\t/**\n\t * 行点击事件处理, 只针对数据行触发, 不会对分组行等附加行触发\n\t */\n\tonRowClick?: (\n\t\te: React.MouseEvent<HTMLTableRowElement>,\n\t\trow: Row<any>,\n\t) => void;\n\t/**\n\t * 行双击事件处理,, 只针对数据行触发, 不会对分组行等附加行触发\n\t */\n\tonRowDoubleClick?: (\n\t\te: React.MouseEvent<HTMLTableRowElement>,\n\t\trow: Row<any>,\n\t) => void;\n\n\t/**\n\t * 在编辑模式下, 字段的验证规则\n\t * @param row\n\t * @returns\n\t */\n\tvalidate?: Record<string, Rule>;\n}\n\n/** 属性扩展于TableOptions */\nexport const DataTable = forwardRef<any, DataTableProps>((props, ref) => {\n\tconst {\n\t\tcolumns: columnsProp,\n\t\tdata: dataProp,\n\t\tgetRowId = (row) => row.id as string | number,\n\t\tinitialState,\n\t\tstate,\n\t\tonColumnFiltersChange,\n\t\tonColumnOrderChange,\n\t\tonColumnPinningChange,\n\t\tonColumnSizingChange,\n\t\tonColumnSizingInfoChange,\n\t\tonColumnVisibilityChange,\n\t\tonExpandedChange,\n\t\tonGlobalFilterChange,\n\t\tonGroupingChange,\n\t\tonPaginationChange,\n\t\tonRowPinningChange,\n\t\tonSortingChange,\n\t\tonRowSelectionChange,\n\t\tonStateChange,\n\t\tonRowActiveChange, // 自定义功能\n\t\tenableColumnReorder = true,\n\t\tgroupedColumnMode = \"reorder\",\n\t\tenableColumnResizing = true,\n\t\tcolumnResizeMode = \"onChange\",\n\t\tenableSorting = true,\n\t\tenableMultiSort = true,\n\t\tenableSortingRemoval = true,\n\t\tsortDescFirst = false,\n\t\tgetSubRows,\n\t\tenableGrouping: enableGroupingProp = false,\n\t\tenableFilters = false,\n\t\tfilterFromLeafRows = false,\n\t\tenableHiding = true,\n\t\tenablePagination = false,\n\t\tenableRowSelection = true,\n\t\tenableMultiRowSelection = false,\n\t\tenableSubRowSelection = false,\n\t\tenableClickRowSelection = true,\n\t\tselectAllForAllPages = true,\n\t\tenableStickyHeader = true,\n\t\tenableAutoRowNumber = false,\n\t\tenableExport = false,\n\t\tdebouncedWait = 500,\n\t\tenableVirtualized = false,\n\t\tclassName,\n\t\tslots,\n\t\tsize = \"sm\",\n\t\tshowHeader = true,\n\t\tshowToolbar = true,\n\t\tshowBorder = true,\n\t\tborderWidth: borderWidthProp = 1,\n\t\tfixedLayout = true,\n\t\tonRowClick,\n\t\tonRowDoubleClick,\n\t\tvalidate,\n\t\t...other\n\t} = props;\n\n\tconst borderWidth = showBorder ? borderWidthProp : 0;\n\n\tconst enableTree = !!getSubRows;\n\tconst enableGrouping = enableTree ? false : enableGroupingProp;\n\n\tconst [data, setData] = useState(dataProp);\n\n\tuseEffect(() => {\n\t\tsetData(dataProp);\n\t}, [dataProp]);\n\n\tif (enableGrouping && enableTree) {\n\t\tthrow new Error(\"数据分组和树形表格不能同时启用\");\n\t}\n\n\tif (enableExport && enableVirtualized) {\n\t\tthrow new Error(\"行虚拟化和导出不能同时启用\");\n\t}\n\n\tconst changesRef = useRef<Changes>({\n\t\tchanges: { added: [], changed: {}, deleted: [] },\n\t\terrors: {},\n\t});\n\n\tconst setErrorRow = (params: {\n\t\trowId: string | number;\n\t\tfield: string;\n\t\terrorMsg: string;\n\t}) => {\n\t\tconst { rowId, field, errorMsg } = params;\n\t\tif (!errorMsg) {\n\t\t\tdelete changesRef.current.errors[rowId]?.[field];\n\t\t\tif (Object.keys(changesRef.current.errors[rowId] ?? {}).length === 0) {\n\t\t\t\tdelete changesRef.current.errors[rowId];\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tchangesRef.current.errors[rowId] = {\n\t\t\t...changesRef.current.errors[rowId],\n\t\t\t[field]: errorMsg,\n\t\t};\n\t\t// setData((prev) => [...prev]);\n\t};\n\n\tconst addRow = (newRow: any) => {\n\t\tObject.keys(newRow).forEach((d) => {\n\t\t\tconst validateRule = validate?.[d];\n\t\t\tconst validateError = validateRule?.(newRow[d], newRow, data);\n\t\t\tif (validateError) {\n\t\t\t\tsetErrorRow({\n\t\t\t\t\trowId: getRowId(newRow),\n\t\t\t\t\tfield: d,\n\t\t\t\t\terrorMsg: validateError,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tchangesRef.current.changes.added.push(newRow);\n\t\tsetData((prev) => [...prev, newRow]);\n\t};\n\tconst changeRow = (\n\t\tparams: CellContext<any, any> & {\n\t\t\tvalue: any;\n\t\t},\n\t) => {\n\t\tconst { row, column, value } = params;\n\t\tconst rowId = getRowId(row);\n\t\tconst field = (column.columnDef as AccessorKeyColumnDef<any, any>)\n\t\t\t.accessorKey as string;\n\t\tconst fieldDataType = getType(row.original[field]);\n\t\tif (\n\t\t\trow.original[field] !==\n\t\t\t(fieldDataType === \"Number\" ? Number(value) : value)\n\t\t) {\n\t\t\tconst validateRule = validate?.[field];\n\t\t\tconst validateError = validateRule?.(value, row.original, data);\n\t\t\tif (!validateError) {\n\t\t\t\tsetErrorRow({\n\t\t\t\t\trowId: row.id,\n\t\t\t\t\tfield: field,\n\t\t\t\t\terrorMsg: \"\",\n\t\t\t\t});\n\t\t\t\t// 如果修改的值在新增集中则直接更新新增行的字段值\n\t\t\t\tconst addedRow = changesRef.current.changes.added.find(\n\t\t\t\t\t(d) => getRowId(d) === rowId,\n\t\t\t\t);\n\t\t\t\tif (addedRow) {\n\t\t\t\t\taddedRow[field] = fieldDataType === \"Number\" ? Number(value) : value;\n\t\t\t\t} else {\n\t\t\t\t\t// 如果不在新增集中则加入到修改集对应id键的字段中.\n\t\t\t\t\tchangesRef.current.changes.changed[rowId] = {\n\t\t\t\t\t\t...changesRef.current.changes.changed[rowId],\n\t\t\t\t\t\t[field]: fieldDataType === \"Number\" ? Number(value) : value,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetErrorRow({\n\t\t\t\t\trowId: row.id,\n\t\t\t\t\tfield: field,\n\t\t\t\t\terrorMsg: validateError,\n\t\t\t\t});\n\t\t\t}\n\t\t\tsetData((prev) =>\n\t\t\t\tprev.map((row) => {\n\t\t\t\t\tif (getRowId(row) === rowId) {\n\t\t\t\t\t\t// changesRef.current.changes.changed[rowId] = {\n\t\t\t\t\t\t// ...changesRef.current.changes.changed[rowId],\n\t\t\t\t\t\t// [field]: fieldDataType === \"Number\" ? Number(value) : value,\n\t\t\t\t\t\t// };\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...row,\n\t\t\t\t\t\t\t[field]: fieldDataType === \"Number\" ? Number(value) : value,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn row;\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t};\n\tconst deleteRow = () => {\n\t\tconst { rowSelection } = table.getState();\n\t\tconst selectedRowId = Object.keys(rowSelection).filter(\n\t\t\t(d) => rowSelection[d] === true,\n\t\t);\n\t\tselectedRowId.forEach((d) => {\n\t\t\t// 如果删除的行在新增集中则直接删除新增集中的行\n\t\t\tconst addedRowIndex = changesRef.current.changes.added.findIndex(\n\t\t\t\t(d2) => String(getRowId(d2)) === d,\n\t\t\t);\n\t\t\tif (addedRowIndex >= 0) {\n\t\t\t\tchangesRef.current.changes.added.splice(addedRowIndex, 1);\n\t\t\t} else {\n\t\t\t\t// 如果不在新增集中则加入到删除集.\n\t\t\t\tchangesRef.current.changes.deleted.push(d);\n\t\t\t}\n\t\t});\n\t\ttable.resetRowSelection(true);\n\t\tsetData((prev) =>\n\t\t\tprev.filter((d) => !selectedRowId.includes(String(getRowId(d)))),\n\t\t);\n\t};\n\tconst getChanges = () => {\n\t\tif (Object.keys(changesRef.current.errors).length) {\n\t\t\tthrow new Error(\"数据表格中存在错误无法保存\");\n\t\t}\n\t\treturn changesRef.current.changes;\n\t};\n\n\tconst getSelectedRowIds = (): any[] => {\n\t\tconst { rowSelection } = table.getState();\n\t\treturn Object.keys(rowSelection).filter((d) => rowSelection[d] === true);\n\t};\n\n\tconst getSelectedRows = (): any[] => {\n\t\treturn table.getSelectedRowModel().flatRows.map((d) => d.original);\n\t};\n\n\tconst getState = () => {\n\t\treturn table.getState();\n\t};\n\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\taddRow,\n\t\t\tchangeRow,\n\t\t\tdeleteRow,\n\t\t\tgetChanges,\n\t\t\tgetSelectedRowIds,\n\t\t\tgetSelectedRows,\n\t\t\tgetState,\n\t\t}),\n\t\t[],\n\t);\n\n\t// 微调列定义\n\tconst columns = useMemo(() => {\n\t\tconst cloneColumns = klona(columnsProp);\n\n\t\tif (enableTree) {\n\t\t\t// 用户列中第一个定义了meta.expandable为true的列为tree的可展开列\n\t\t\tconst expandColumnDef = flattenBy(\n\t\t\t\tcloneColumns,\n\t\t\t\t(item: any) => item.columns,\n\t\t\t).find((d) => d.meta?.expandable);\n\n\t\t\tif (!expandColumnDef) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"启用树形表格时必须提供至少一个定义了meta.expandable为true的column\",\n\t\t\t\t);\n\t\t\t}\n\t\t\texpandColumnDef.enableHiding = false;\n\n\t\t\tconst oldHeaderDef = expandColumnDef.header;\n\t\t\texpandColumnDef.size ??= 140;\n\t\t\texpandColumnDef.minSize ??= 140;\n\t\t\texpandColumnDef.header = (cx) => {\n\t\t\t\tconst { column, table } = cx;\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{enableRowSelection && !enableClickRowSelection && (\n\t\t\t\t\t\t\t<IndeterminateCheckbox\n\t\t\t\t\t\t\t\tclassName=\"absolute left-0.5 checkbox-sm\"\n\t\t\t\t\t\t\t\tchecked={\n\t\t\t\t\t\t\t\t\tselectAllForAllPages\n\t\t\t\t\t\t\t\t\t\t? table.getIsAllRowsSelected()\n\t\t\t\t\t\t\t\t\t\t: table.getIsAllPageRowsSelected()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tindeterminate={\n\t\t\t\t\t\t\t\t\tselectAllForAllPages\n\t\t\t\t\t\t\t\t\t\t? table.getIsSomeRowsSelected()\n\t\t\t\t\t\t\t\t\t\t: table.getIsSomePageRowsSelected()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonChange={\n\t\t\t\t\t\t\t\t\tselectAllForAllPages\n\t\t\t\t\t\t\t\t\t\t? table.getToggleAllRowsSelectedHandler()\n\t\t\t\t\t\t\t\t\t\t: table.getToggleAllPageRowsSelectedHandler()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"btn btn-ghost btn-circle btn-xs absolute left-5\"\n\t\t\t\t\t\t\ttitle=\"展开/收缩所有行\"\n\t\t\t\t\t\t\tonClick={(ev: React.MouseEvent) => {\n\t\t\t\t\t\t\t\tev.stopPropagation();\n\t\t\t\t\t\t\t\ttable.toggleAllRowsExpanded();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<IconDirection />\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t{typeof oldHeaderDef === \"function\"\n\t\t\t\t\t\t\t? oldHeaderDef(cx)\n\t\t\t\t\t\t\t: oldHeaderDef}\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t};\n\t\t\tconst oldCellDef = expandColumnDef.cell;\n\t\t\texpandColumnDef.cell = (cx: CellContext<any, any>) => {\n\t\t\t\tconst { row, column, table } = cx;\n\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tpaddingLeft: `${row.depth * 2}em`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"flex items-center gap-1\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{enableRowSelection && !enableClickRowSelection && (\n\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\t\t\t\t\tdisabled={!row.getCanSelect()}\n\t\t\t\t\t\t\t\t// indeterminate={row.getIsSomeSelected()}\n\t\t\t\t\t\t\t\tonChange={row.getToggleSelectedHandler()}\n\t\t\t\t\t\t\t\tonClick={(ev) => ev.stopPropagation()}\n\t\t\t\t\t\t\t\tslots={{\n\t\t\t\t\t\t\t\t\tinput: \"rounded-sm\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{cx.row.getCanExpand() ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\trow.getToggleExpandedHandler()();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"btn btn-ghost btn-circle btn-xs\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{row.getIsExpanded() ? (\n\t\t\t\t\t\t\t\t\t<IconChevronDown size={16} />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<IconChevronRight size={16} />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\"\\u00A0\"\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{typeof oldCellDef === \"function\"\n\t\t\t\t\t\t\t? oldCellDef(cx)\n\t\t\t\t\t\t\t: oldCellDef === undefined\n\t\t\t\t\t\t\t\t? cx.getValue()\n\t\t\t\t\t\t\t\t: oldCellDef}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t};\n\t\t} else if (enableRowSelection && !enableClickRowSelection) {\n\t\t\tcloneColumns.unshift({\n\t\t\t\tid: \"选择\",\n\t\t\t\tsize: 50,\n\t\t\t\tminSize: 50,\n\t\t\t\tenableHiding: false,\n\t\t\t\theader: ({ table }) => (\n\t\t\t\t\t<IndeterminateCheckbox\n\t\t\t\t\t\tclassName=\"checkbox-sm\"\n\t\t\t\t\t\tdisabled={!enableMultiRowSelection}\n\t\t\t\t\t\tchecked={\n\t\t\t\t\t\t\tselectAllForAllPages\n\t\t\t\t\t\t\t\t? table.getIsAllRowsSelected()\n\t\t\t\t\t\t\t\t: table.getIsAllPageRowsSelected()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tindeterminate={\n\t\t\t\t\t\t\tselectAllForAllPages\n\t\t\t\t\t\t\t\t? table.getIsSomeRowsSelected()\n\t\t\t\t\t\t\t\t: table.getIsSomePageRowsSelected()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonChange={\n\t\t\t\t\t\t\tselectAllForAllPages\n\t\t\t\t\t\t\t\t? table.getToggleAllRowsSelectedHandler()\n\t\t\t\t\t\t\t\t: table.getToggleAllPageRowsSelectedHandler()\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t\tcell: ({ row }) => (\n\t\t\t\t\t<div className=\"flex justify-center\">\n\t\t\t\t\t\t<IndeterminateCheckbox\n\t\t\t\t\t\t\tclassName=\"rounded-sm\"\n\t\t\t\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\t\t\t\tdisabled={!row.getCanSelect()}\n\t\t\t\t\t\t\tindeterminate={row.getIsSomeSelected()}\n\t\t\t\t\t\t\tonChange={row.getToggleSelectedHandler()}\n\t\t\t\t\t\t\tonClick={(ev) => ev.stopPropagation()}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t),\n\t\t\t});\n\t\t}\n\n\t\tif (enableAutoRowNumber) {\n\t\t\tcloneColumns.unshift({\n\t\t\t\tid: \"行号\",\n\t\t\t\tsize: 60,\n\t\t\t\tminSize: 60,\n\t\t\t\theader: \"行号\",\n\t\t\t\tcell: (cx) => (\n\t\t\t\t\t<span style={{ paddingLeft: `${cx.row.depth * 1}em` }}>\n\t\t\t\t\t\t{cx.row.index + 1}\n\t\t\t\t\t</span>\n\t\t\t\t),\n\t\t\t});\n\t\t}\n\n\t\treturn cloneColumns;\n\t}, [\n\t\tcolumnsProp,\n\t\tenableTree,\n\t\tenableRowSelection,\n\t\tselectAllForAllPages,\n\t\tenableClickRowSelection,\n\t\tenableAutoRowNumber,\n\t\tenableMultiRowSelection,\n\t]);\n\n\tconst tableOptions: TableOptions<any> = {\n\t\t_features: [RowActive], // 行激活的自定义功能\n\t\tcolumns,\n\t\tdata,\n\t\tgetRowId,\n\t\tinitialState, //初始状态\n\t\tstate, //实时状态\n\t\tonStateChange,\n\t\tautoResetAll: false, // 覆盖所有功能提供`autoReset*`的选项, `autoReset*`表示当表格状态改变时自动重置功能的状态. 如:autoResetExpanded,autoResetPageIndex\n\t\t// 默认列定义, 会和columns中每个列定义进行合并,为列定义提供缺省属性\n\t\tdefaultColumn: {\n\t\t\tsize: 140,\n\t\t\tminSize: 80,\n\t\t\tmaxSize: Number.MAX_SAFE_INTEGER,\n\t\t\tcell: (cx) => {\n\t\t\t\tconst value = cx.getValue() as any;\n\t\t\t\tconst valueType = getType(value);\n\t\t\t\tconst align = cx.column.columnDef.meta?.align;\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={clsx(\"overflow-hidden whitespace-nowrap text-ellipsis\", {\n\t\t\t\t\t\t\t\"text-right\": valueType === \"Number\" || align === \"right\",\n\t\t\t\t\t\t\t\"text-center\": valueType === \"Boolean\" || align === \"center\",\n\t\t\t\t\t\t})}\n\t\t\t\t\t>\n\t\t\t\t\t\t{cx.renderValue<any>()?.toString() ?? \"\"}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t},\n\t\t\taggregatedCell: \"\", // 覆盖默认行为, 使分组行中不显示列的聚合值, 除非手动指定.\n\t\t},\n\t\t// 列隐藏/显示功能\n\t\tenableHiding,\n\t\t// 设置列宽调整选项\n\t\tenableColumnResizing,\n\t\tcolumnResizeMode,\n\t\t// 行选择\n\t\tenableRowSelection,\n\t\tenableMultiRowSelection,\n\t\tenableSubRowSelection,\n\t\t// 核心行模型, 这是必须的\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetSubRows: enableTree ? getSubRows : undefined, // 注意, 启用数据分组时不能设置该属性, 否则会有冲突.\n\t\t// 数据过滤功能\n\t\tenableFilters,\n\t\t// filterFromLeafRows: enableTree || enableGrouping ? true : false,\n\t\tfilterFromLeafRows,\n\t\tgetFilteredRowModel: enableFilters ? getFilteredRowModel() : undefined,\n\t\tgetFacetedRowModel: enableFilters ? getFacetedRowModel() : undefined,\n\t\tgetFacetedUniqueValues: enableFilters\n\t\t\t? getFacetedUniqueValues()\n\t\t\t: undefined,\n\t\tgetFacetedMinMaxValues: enableFilters\n\t\t\t? getFacetedMinMaxValues()\n\t\t\t: undefined,\n\t\t// 数据分组功能\n\t\tenableGrouping,\n\t\tgroupedColumnMode,\n\t\tgetGroupedRowModel: enableGrouping ? getGroupedRowModel() : undefined,\n\t\t// 数据排序功能\n\t\tenableSorting,\n\t\tenableSortingRemoval,\n\t\tenableMultiSort,\n\t\tsortDescFirst,\n\t\tgetSortedRowModel: enableSorting ? getSortedRowModel() : undefined,\n\t\t// 展开功能, 树行表格和数据分组功能依赖该功能.\n\t\tenableExpanding: enableTree || enableGrouping,\n\t\tgetExpandedRowModel:\n\t\t\tenableTree || enableGrouping ? getExpandedRowModel() : undefined,\n\t\t// 数据分页功能\n\t\tgetPaginationRowModel: enablePagination\n\t\t\t? getPaginationRowModel()\n\t\t\t: undefined,\n\t\t// 受控状态处理\n\t\tonColumnFiltersChange,\n\t\tonColumnOrderChange,\n\t\tonColumnPinningChange,\n\t\tonColumnSizingChange,\n\t\tonColumnSizingInfoChange,\n\t\tonColumnVisibilityChange,\n\t\tonExpandedChange,\n\t\tonGlobalFilterChange,\n\t\tonGroupingChange,\n\t\tonPaginationChange,\n\t\tonRowPinningChange,\n\t\tonSortingChange,\n\t\tonRowSelectionChange,\n\t\tonRowActiveChange, // 自定义功能\n\t\t// 用于列定义中访问表的自定义元数据\n\t\tmeta: {\n\t\t\taddRow,\n\t\t\tchangeRow,\n\t\t\tdeleteRow,\n\t\t\tgetChanges,\n\t\t\tgetSelectedRowIds,\n\t\t},\n\t};\n\t// `@tanstack/react-table` 所有功能默认都是启用的, 除非手动禁用\n\t// `@tanstack/react-table` 的rowModel的处理顺序: CoreRowModel=>FilteredRowModel=>GroupedRowModel=>SortedRowModel=>ExpandedRowModel=>PaginationRowModel\n\t// 必须清除tableOptions中的undefined的键, 否则useReactTable会有异常情况发生.\n\tconst table = useReactTable(filterProps(tableOptions));\n\n\tconst getLeftPinning = () => {\n\t\tconst result: string[] = [];\n\t\tresult.push(...table.getState().grouping);\n\t\tif (enableAutoRowNumber) {\n\t\t\tresult.push(\"行号\");\n\t\t}\n\t\tif (enableTree) {\n\t\t\tresult.push(\n\t\t\t\tflattenBy(columnsProp, (item: any) => item.columns).find((d) => d.id)!\n\t\t\t\t\t.id!,\n\t\t\t);\n\t\t} else if (!enableTree && enableRowSelection && !enableClickRowSelection) {\n\t\t\tresult.push(\"选择\");\n\t\t}\n\t\t// 分组列必须在其它固定列之后. 因为在有列头组的情况下数据分组的列头的列头组的getPinnedIndex()为-1, 从而导致getPinnedSize()方法计算时无法得知其位置.\n\t\t// result.push(...table.getState().grouping);\n\t\treturn result;\n\t};\n\n\t// table实例的选项中加入预设\n\ttable.setOptions((prev) => {\n\t\tconst prevState = prev.state;\n\t\tif (!prevState.columnOrder?.length) {\n\t\t\tprevState.columnOrder = getLeafColumns(columnsProp).map(\n\t\t\t\t(d) => getColumnDefId(d) as string,\n\t\t\t);\n\t\t}\n\t\tprevState.columnPinning!.left = getLeftPinning();\n\t\treturn prev;\n\t});\n\n\tconst tableContainerRef = useRef<HTMLDivElement>(null);\n\tconst tableRef = useRef<HTMLTableElement>(null);\n\t//#region 行虚拟化\n\tconst estimateRowHeight = useCallback(\n\t\t() => (size === \"sm\" ? 36 : 56),\n\t\t[size],\n\t);\n\tconst { rows } = table.getRowModel();\n\tconst rowVirtualizer = useVirtualizer({\n\t\tgetScrollElement: () =>\n\t\t\tenableVirtualized ? tableContainerRef.current : null,\n\t\tcount: rows.length,\n\t\testimateSize: estimateRowHeight,\n\t\toverscan: 10,\n\t});\n\tconst { getVirtualItems, getTotalSize } = rowVirtualizer;\n\tconst virtualRows = getVirtualItems();\n\tconst totalSize = getTotalSize();\n\tconst paddingTop = virtualRows.length > 0 ? virtualRows[0].start || 0 : 0; // 为了保持原始滚动条的尺寸\n\tconst paddingBottom =\n\t\tvirtualRows.length > 0\n\t\t\t? totalSize - (virtualRows[virtualRows.length - 1].end || 0)\n\t\t\t: 0; // 为了保持原始滚动条的尺寸\n\t//#endregion 行虚拟化\n\n\t// 是否发生了水平滚动, 固定列时可以运用效果\n\tconst scrollingTrigger = useScrollTrigger({\n\t\ttarget: tableContainerRef.current,\n\t\tdirection: \"horizontal\",\n\t\tdisabled: table.getState().columnPinning.left?.length === 0,\n\t});\n\n\tconst handleRowClick = (\n\t\te: React.MouseEvent<HTMLTableRowElement>,\n\t\trow: Row<any>,\n\t) => {\n\t\tonRowClick?.(e, row);\n\t\tif (\n\t\t\t(enableRowSelection === true ||\n\t\t\t\t(typeof enableRowSelection === \"function\" &&\n\t\t\t\t\tenableRowSelection(row))) &&\n\t\t\tenableClickRowSelection &&\n\t\t\t!row.getIsGrouped()\n\t\t) {\n\t\t\trow.getToggleSelectedHandler()(e);\n\t\t}\n\t\trow.getToggleActivedHandler()(e);\n\t};\n\n\tconst handleRowDoubleClick = (\n\t\te: React.MouseEvent<HTMLTableRowElement>,\n\t\trow: Row<any>,\n\t) => {\n\t\tonRowDoubleClick?.(e, row);\n\t\trow.getToggleActivedHandler()(e);\n\t};\n\n\treturn (\n\t\t<DndProvider\n\t\t\tbackend={isMobileDevice ? TouchBackend : HTML5Backend}\n\t\t\t// 防止同一页面放置多个报错问题\n\t\t\tcontext={typeof document !== \"undefined\" ? window : undefined}\n\t\t\toptions={{\n\t\t\t\tdelayTouchStart: 200,\n\t\t\t\tignoreContextMenu: true,\n\t\t\t}}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={clsx(\"data-table-root h-full flex flex-col\", className)}\n\t\t\t\t{...other}\n\t\t\t>\n\t\t\t\t{showToolbar && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\"data-table-toolbar navbar flex items-center bg-base-300 relative z-10 py-0 min-h-0\",\n\t\t\t\t\t\t\tslots?.toolbar,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t\t<GroupDropArea\n\t\t\t\t\t\t\t\ttable={table}\n\t\t\t\t\t\t\t\tenableGrouping={enableGrouping ?? false}\n\t\t\t\t\t\t\t\tclassName={clsx(slots?.groupDropArea)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{enableExport && <ExportTable table={table} tableRef={tableRef} />}\n\t\t\t\t\t\t{enableHiding && <ColumnsVisibility table={table} />}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<div\n\t\t\t\t\tref={tableContainerRef}\n\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\"data-table-container flex-1 overflow-auto relative z-0\",\n\t\t\t\t\t\tslots?.container,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"--borderWidth\": `${borderWidth}px`,\n\t\t\t\t\t\t} as CSSProperties\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<table\n\t\t\t\t\t\tref={tableRef}\n\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\"data-table table rounded-none\", // 移除daisyUI中table的默认圆角\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"table-fixed\": fixedLayout,\n\t\t\t\t\t\t\t\t\"table-pin-rows\": enableStickyHeader,\n\t\t\t\t\t\t\t\t\"no-border\": !showBorder,\n\t\t\t\t\t\t\t\t\"table-xs\": size === \"xs\",\n\t\t\t\t\t\t\t\t\"table-sm\": size === \"sm\",\n\t\t\t\t\t\t\t\t\"table-md\": size === \"md\",\n\t\t\t\t\t\t\t\t\"table-lg\": size === \"lg\",\n\t\t\t\t\t\t\t\t\"table-xl\": size === \"xl\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tslots?.table,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: fixedLayout ? table.getTotalSize() : undefined,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* 用于table-layout:fixed时,多行列头宽度失效的问题 */}\n\t\t\t\t\t\t<colgroup>\n\t\t\t\t\t\t\t{getVisibleColumns(table).map((column) =>\n\t\t\t\t\t\t\t\tcolumn.getIsVisible() ? (\n\t\t\t\t\t\t\t\t\t<col\n\t\t\t\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\twidth: column.getSize(),\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : null,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</colgroup>\n\t\t\t\t\t\t<thead\n\t\t\t\t\t\t\t// 为了使thead中的固定表头行在滚动时不会被tbody中的行盖住\n\t\t\t\t\t\t\tclassName={enableStickyHeader ? \"relative z-10\" : undefined}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{table.getHeaderGroups().map((headerGroup) => (\n\t\t\t\t\t\t\t\t<tr key={headerGroup.id}>\n\t\t\t\t\t\t\t\t\t{headerGroup.headers.map((header) => (\n\t\t\t\t\t\t\t\t\t\t<HeaderCell\n\t\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\t\theader={header}\n\t\t\t\t\t\t\t\t\t\t\ttable={table}\n\t\t\t\t\t\t\t\t\t\t\tenableColumnReorder={enableColumnReorder}\n\t\t\t\t\t\t\t\t\t\t\tenableColumnResizing={enableColumnResizing}\n\t\t\t\t\t\t\t\t\t\t\tshowHeader={showHeader}\n\t\t\t\t\t\t\t\t\t\t\tdebouncedWait={debouncedWait}\n\t\t\t\t\t\t\t\t\t\t\tscrollingTrigger={scrollingTrigger}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody\n\t\t\t\t\t\t\t// 创建一个新的层叠上下文\n\t\t\t\t\t\t\tclassName=\"relative z-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{table.getRowModel().rows.length === 0 && (\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\tcolSpan={table.getVisibleLeafColumns().length}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-center\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t无数据\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{enableVirtualized ? (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t{paddingTop > 0 && (\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td style={{ height: `${paddingTop}px` }} />\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{virtualRows.map((virtualRow) => {\n\t\t\t\t\t\t\t\t\t\tconst row = table.getRowModel().rows[virtualRow.index];\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => handleRowClick(e, row)}\n\t\t\t\t\t\t\t\t\t\t\t\tonDoubleClick={(e) => handleRowDoubleClick(e, row)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx({\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected: row.getIsSelected(),\n\t\t\t\t\t\t\t\t\t\t\t\t\tactived: row.getIsActived(),\n\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{row.getVisibleCells().map((cell) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<BodyCell\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcell={cell}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableGrouping={enableGrouping}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscrollingTrigger={scrollingTrigger}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchangesRef={changesRef}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t{paddingBottom > 0 && (\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td style={{ height: `${paddingBottom}px` }} />\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\ttable.getRowModel().rows.map((row) => (\n\t\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\t\t\t\t\tonClick={(e) => handleRowClick(e, row)}\n\t\t\t\t\t\t\t\t\t\tonDoubleClick={(e) => handleRowDoubleClick(e, row)}\n\t\t\t\t\t\t\t\t\t\tclassName={clsx({\n\t\t\t\t\t\t\t\t\t\t\tselected: row.getIsSelected(),\n\t\t\t\t\t\t\t\t\t\t\tactived: row.getIsActived(),\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{row.getVisibleCells().map((cell) => (\n\t\t\t\t\t\t\t\t\t\t\t<BodyCell\n\t\t\t\t\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\t\t\t\t\tcell={cell}\n\t\t\t\t\t\t\t\t\t\t\t\tenableGrouping={enableGrouping}\n\t\t\t\t\t\t\t\t\t\t\t\tscrollingTrigger={scrollingTrigger}\n\t\t\t\t\t\t\t\t\t\t\t\tchangesRef={changesRef}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t{table\n\t\t\t\t\t\t\t.getFooterGroups()[0]\n\t\t\t\t\t\t\t.headers.some((d) => d.column.columnDef.footer) && (\n\t\t\t\t\t\t\t<tfoot className=\"relative z-10\">\n\t\t\t\t\t\t\t\t{table\n\t\t\t\t\t\t\t\t\t.getFooterGroups()\n\t\t\t\t\t\t\t\t\t.slice(0, 1)\n\t\t\t\t\t\t\t\t\t.map((footerGroup) => (\n\t\t\t\t\t\t\t\t\t\t<tr key={footerGroup.id}>\n\t\t\t\t\t\t\t\t\t\t\t{footerGroup.headers.map((header) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<FooterCell\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\theader={header}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttable={table}\n\t\t\t\t\t\t\t\t\t\t\t\t\tscrollingTrigger={scrollingTrigger}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tfoot>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t\t{enablePagination && <TablePagination table={table} />}\n\t\t\t</div>\n\t\t</DndProvider>\n\t);\n});\n\n// export default React.memo(DataTable);\n\nDataTable.displayName = \"@rtdui/DataTable\";\n"],"names":["isMobile","forwardRef","useState","useEffect","useRef","getType","useImperativeHandle","useMemo","klona","flattenBy","jsxs","Fragment","jsx","IndeterminateCheckbox","IconDirection","Checkbox","IconChevronDown","IconChevronRight","RowActive","getCoreRowModel","getFilteredRowModel","getFacetedRowModel","getFacetedUniqueValues","getFacetedMinMaxValues","getGroupedRowModel","getSortedRowModel","getExpandedRowModel","getPaginationRowModel","useReactTable","filterProps","getLeafColumns","getColumnDefId","useCallback","useVirtualizer","useScrollTrigger","DndProvider","TouchBackend","HTML5Backend","GroupDropArea","ExportTable","ColumnsVisibility","getVisibleColumns","HeaderCell","BodyCell","FooterCell","TablePagination"],"mappings":"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