dishui 0.0.89 → 0.0.91

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.
@@ -1 +1 @@
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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"}
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, DataTableViewMode } 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 viewMode: controlledViewMode,\n defaultViewMode = 'table',\n onViewModeChange,\n enableViewSwitcher = false,\n viewSwitcherLabels,\n cardOptions,\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 const [internalViewMode, setInternalViewMode] = useState<DataTableViewMode>(defaultViewMode);\n const viewMode = controlledViewMode ?? internalViewMode;\n const changeViewMode = (next: DataTableViewMode) => {\n if (next === viewMode) return;\n if (controlledViewMode === undefined) setInternalViewMode(next);\n onViewModeChange?.(next);\n };\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 viewSwitcher={enableViewSwitcher && overrideContent === undefined ? (\n <div role=\"group\" aria-label={viewSwitcherLabels?.label ?? '显示方式'} className=\"flex items-center gap-1\">\n {(['table', 'card'] as const).map(mode => (\n <button\n key={mode}\n type=\"button\"\n className={`btn btn-sm ${viewMode === mode ? 'btn-neutral' : 'btn-ghost'}`}\n aria-pressed={viewMode === mode}\n disabled={controlledViewMode !== undefined && !onViewModeChange}\n onClick={() => changeViewMode(mode)}\n >\n {viewSwitcherLabels?.[mode] ?? (mode === 'table' ? '表格' : '卡片')}\n </button>\n ))}\n </div>\n ) : undefined}\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\" card={viewMode === 'card'} cardOptions={cardOptions}>\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 card={viewMode === 'card'}\n fieldLabels={cardOptions?.fieldLabels}\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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"}
@@ -4,6 +4,8 @@ import { RowEventHandler, CellEventHandler } from '../types';
4
4
  import type { DataTableApi, DataTableExtension } from '../extension';
5
5
  interface TableBodyProps<T extends object> {
6
6
  table: TanStackTable<T>;
7
+ card?: boolean;
8
+ fieldLabels?: Record<string, React.ReactNode>;
7
9
  expandedRowsState: Record<string, boolean>;
8
10
  onRowClick?: RowEventHandler;
9
11
  onRowDoubleClick?: RowEventHandler;
@@ -21,5 +23,5 @@ interface TableBodyProps<T extends object> {
21
23
  getRowId?: (row: T, index: number) => string;
22
24
  onCellContextMenu?: (e: React.MouseEvent, row: T, column: any, rowIndex: number) => void;
23
25
  }
24
- export declare function TableBody<T extends object>({ table, expandedRowsState, onRowClick, onRowDoubleClick, onRowMouseEnter, onRowMouseLeave, onCellClick, onCellDoubleClick, onCellMouseEnter, onCellMouseLeave, enableExpanding, indentSize, handleRowExpand, extensions, extensionApi, getRowId, onCellContextMenu, }: TableBodyProps<T>): React.JSX.Element;
26
+ export declare function TableBody<T extends object>({ table, card, fieldLabels, expandedRowsState, onRowClick, onRowDoubleClick, onRowMouseEnter, onRowMouseLeave, onCellClick, onCellDoubleClick, onCellMouseEnter, onCellMouseLeave, enableExpanding, indentSize, handleRowExpand, extensions, extensionApi, getRowId, onCellContextMenu, }: TableBodyProps<T>): React.JSX.Element;
25
27
  export {};
@@ -3,61 +3,63 @@ import { flexRender as t } from "../tanstack-table.js";
3
3
  import n from "react";
4
4
  import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
5
5
  //#region src/components/pro/DataTable/components/TableBody.tsx
6
- function o({ table: o, expandedRowsState: s, onRowClick: c, onRowDoubleClick: l, onRowMouseEnter: u, onRowMouseLeave: d, onCellClick: f, onCellDoubleClick: p, onCellMouseEnter: m, onCellMouseLeave: h, enableExpanding: g, indentSize: _, handleRowExpand: v, extensions: y = [], extensionApi: b, getRowId: x, onCellContextMenu: S }) {
7
- let C = y.length > 0 && !!b;
6
+ function o({ table: o, card: s = !1, fieldLabels: c, expandedRowsState: l, onRowClick: u, onRowDoubleClick: d, onRowMouseEnter: f, onRowMouseLeave: p, onCellClick: m, onCellDoubleClick: h, onCellMouseEnter: g, onCellMouseLeave: _, enableExpanding: v, indentSize: y, handleRowExpand: b, extensions: x = [], extensionApi: S, getRowId: C, onCellContextMenu: w }) {
7
+ let T = x.length > 0 && !!S;
8
8
  return /* @__PURE__ */ i(e.Body, { children: o.getRowModel().rows.length === 0 ? /* @__PURE__ */ i(e.Row, { children: /* @__PURE__ */ i(e.Cell, {
9
9
  colSpan: o.getAllColumns().length,
10
10
  className: "text-center py-4",
11
11
  children: "没有数据"
12
- }) }) : o.getRowModel().rows.map((o, w) => {
13
- let T = o.depth, E = o.subRows.length > 0, D = o.id, O = E && s[D] || !1, k = `
12
+ }) }) : o.getRowModel().rows.map((o, E) => {
13
+ let D = o.depth, O = o.subRows.length > 0, k = o.id, A = O && l[k] || !1, j = `
14
14
  ${o.getIsSelected() ? "bg-primary/10" : ""}
15
- ${E && O ? "tree-row-expanded" : ""}
16
- `, A = x ? x(o.original, w) : o.id, j = {
15
+ ${O && A ? "tree-row-expanded" : ""}
16
+ `, M = C ? C(o.original, E) : o.id, N = {
17
17
  row: o.original,
18
- rowId: A,
19
- rowIndex: w,
18
+ rowId: M,
19
+ rowIndex: E,
20
20
  selected: o.getIsSelected()
21
- }, M = C ? y.reduce((e, t) => Object.assign(e, t.rowProps?.(j, b) ?? {}), {}) : {}, N = /* @__PURE__ */ i(e.Row, {
22
- className: k,
23
- onClick: c ? (e) => c(o.original, e) : void 0,
24
- onDoubleClick: l ? (e) => l(o.original, e) : void 0,
25
- onMouseEnter: u ? (e) => u(o.original, e) : void 0,
26
- onMouseLeave: d ? (e) => d(o.original, e) : void 0,
27
- ...M,
28
- children: o.getVisibleCells().map((n, s) => {
29
- let c = s === 0, l;
30
- if (C) {
21
+ }, P = T ? x.reduce((e, t) => Object.assign(e, t.rowProps?.(N, S) ?? {}), {}) : {}, F = /* @__PURE__ */ i(e.Row, {
22
+ selected: o.getIsSelected(),
23
+ className: j,
24
+ onClick: u ? (e) => u(o.original, e) : void 0,
25
+ onDoubleClick: d ? (e) => d(o.original, e) : void 0,
26
+ onMouseEnter: f ? (e) => f(o.original, e) : void 0,
27
+ onMouseLeave: p ? (e) => p(o.original, e) : void 0,
28
+ ...P,
29
+ children: o.getVisibleCells().map((n, l) => {
30
+ let u = l === 0, d;
31
+ if (T) {
31
32
  let e = {
32
33
  value: n.getValue(),
33
34
  row: o.original,
34
- rowId: A,
35
- rowIndex: w,
35
+ rowId: M,
36
+ rowIndex: E,
36
37
  columnId: n.column.id
37
38
  };
38
- for (let t of y) {
39
- let n = t.cell?.(e, b);
39
+ for (let t of x) {
40
+ let n = t.cell?.(e, S);
40
41
  if (n !== void 0) {
41
- l = n;
42
+ d = n;
42
43
  break;
43
44
  }
44
45
  }
45
46
  }
46
- return l === void 0 && (l = t(n.column.columnDef.cell, n.getContext())), /* @__PURE__ */ i(e.Cell, {
47
- onClick: f ? (e) => {
48
- e.stopPropagation(), f(o.original, n.column, e);
47
+ return d === void 0 && (d = t(n.column.columnDef.cell, n.getContext())), /* @__PURE__ */ i(e.Cell, {
48
+ label: s ? c && Object.prototype.hasOwnProperty.call(c, n.column.id) ? c[n.column.id] : typeof n.column.columnDef.header == "string" ? n.column.columnDef.header : n.column.id : void 0,
49
+ onClick: m ? (e) => {
50
+ e.stopPropagation(), m(o.original, n.column, e);
49
51
  } : void 0,
50
- onDoubleClick: p ? (e) => {
51
- e.stopPropagation(), p(o.original, n.column, e);
52
+ onDoubleClick: h ? (e) => {
53
+ e.stopPropagation(), h(o.original, n.column, e);
52
54
  } : void 0,
53
- onMouseEnter: m ? (e) => m(o.original, n.column, e) : void 0,
54
- onMouseLeave: h ? (e) => h(o.original, n.column, e) : void 0,
55
+ onMouseEnter: g ? (e) => g(o.original, n.column, e) : void 0,
56
+ onMouseLeave: _ ? (e) => _(o.original, n.column, e) : void 0,
55
57
  children: /* @__PURE__ */ a("div", {
56
58
  className: "flex items-center",
57
- onContextMenu: S ? (e) => S(e, o.original, n.column, w) : void 0,
58
- children: [c && g && /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i("div", { style: { width: `${T * _}px` } }), E ? /* @__PURE__ */ i("button", {
59
+ onContextMenu: w ? (e) => w(e, o.original, n.column, E) : void 0,
60
+ children: [u && v && /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i("div", { style: { width: `${D * y}px` } }), O ? /* @__PURE__ */ i("button", {
59
61
  onClick: (e) => {
60
- e.stopPropagation(), v(D, o.original);
62
+ e.stopPropagation(), b(k, o.original);
61
63
  },
62
64
  className: "mr-2 focus:outline-none",
63
65
  children: /* @__PURE__ */ i("svg", {
@@ -68,7 +70,7 @@ function o({ table: o, expandedRowsState: s, onRowClick: c, onRowDoubleClick: l,
68
70
  stroke: "currentColor",
69
71
  style: {
70
72
  transition: "transform 0.3s ease",
71
- transform: O ? "rotate(90deg)" : "rotate(0deg)"
73
+ transform: A ? "rotate(90deg)" : "rotate(0deg)"
72
74
  },
73
75
  children: /* @__PURE__ */ i("path", {
74
76
  strokeLinecap: "round",
@@ -77,16 +79,16 @@ function o({ table: o, expandedRowsState: s, onRowClick: c, onRowDoubleClick: l,
77
79
  d: "M9 5l7 7-7 7"
78
80
  })
79
81
  })
80
- }) : /* @__PURE__ */ i("div", { className: "w-6" })] }), l]
82
+ }) : /* @__PURE__ */ i("div", { className: "w-6" })] }), d]
81
83
  })
82
84
  }, n.id);
83
85
  })
84
86
  }, o.id);
85
- if (C) {
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);
87
+ if (T) {
88
+ let e = x.reduce((e, t) => t.wrapRow?.(e, N, S) ?? e, F);
89
+ if (e !== F) return /* @__PURE__ */ i(n.Fragment, { children: e }, o.id);
88
90
  }
89
- return N;
91
+ return F;
90
92
  }) });
91
93
  }
92
94
  //#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 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":";;;;;AAqCA,SAAgB,EAA4B,EACxC,UACA,sBACA,eACA,qBACA,oBACA,oBACA,gBACA,sBACA,qBACA,qBACA,oBACA,eACA,oBACA,gBAAa,CAAC,GACd,iBACA,aACA,wBACkB;CAClB,IAAM,IAAgB,EAAW,SAAS,KAAK,CAAC,CAAC;CAEjD,OACI,kBAAC,EAAM,MAAP,EAAA,UACK,EAAM,YAAY,CAAC,CAAC,KAAK,WAAW,IACjC,kBAAC,EAAM,KAAP,EAAA,UACI,kBAAC,EAAM,MAAP;EAAY,SAAS,EAAM,cAAc,CAAC,CAAC;EAAQ,WAAU;EAAmB,UAAA;CAEpE,CAAA,EACL,CAAA,IAEX,EAAM,YAAY,CAAC,CAAC,KAAK,KAAK,GAAK,MAAa;EAC5C,IAAM,IAAQ,EAAI,OACZ,IAAc,EAAI,QAAQ,SAAS,GACnC,IAAQ,EAAI,IACZ,IAAa,KAAe,EAAkB,MAAU,IAGxD,IAAe;cAC3B,EAAI,cAAc,IAAI,kBAAkB,GAAG;cAC3C,KAAe,IAAa,sBAAsB,GAAS;aAK/C,IAAgB,IAChB,EAAS,EAAI,UAAU,CAAQ,IAC/B,EAAI,IACJ,IAAiC;GACnC,KAAK,EAAI;GACT,OAAO;GACP;GACA,UAAU,EAAI,cAAc;EAChC,GACM,IAAgB,IAChB,EAAW,QACN,GAAK,MACF,OAAO,OAAO,GAAK,EAAI,WAAW,GAAQ,CAAa,KAAK,CAAC,CAAC,GAClE,CAAC,CACL,IACA,CAAC,GAED,IACF,kBAAC,EAAM,KAAP;GAEI,WAAW;GACX,SAAS,KAAa,MAAK,EAAW,EAAI,UAAU,CAAC,IAAI,KAAA;GACzD,eAAe,KAAmB,MAAK,EAAiB,EAAI,UAAU,CAAC,IAAI,KAAA;GAC3E,cAAc,KAAkB,MAAK,EAAgB,EAAI,UAAU,CAAC,IAAI,KAAA;GACxE,cAAc,KAAkB,MAAK,EAAgB,EAAI,UAAU,CAAC,IAAI,KAAA;GACxE,GAAK;GAEJ,UAAA,EAAI,gBAAgB,CAAC,CAAC,KAAK,GAAM,MAAc;IAE5C,IAAM,IAAgB,MAAc,GAGhC;IACJ,IAAI,GAAe;KACf,IAAM,IAAmC;MACrC,OAAO,EAAK,SAAS;MACrB,KAAK,EAAI;MACT,OAAO;MACP;MACA,UAAU,EAAK,OAAO;KAC1B;KACA,KAAK,IAAM,KAAO,GAAY;MAC1B,IAAM,IAAM,EAAI,OAAO,GAAS,CAAa;MAC7C,IAAI,MAAQ,KAAA,GAAW;OACnB,IAAc;OACd;MACJ;KACJ;IACJ;IAQA,OAPI,MAAgB,KAAA,MAChB,IAAc,EACV,EAAK,OAAO,UAAU,MACtB,EAAK,WAAW,CACpB,IAIA,kBAAC,EAAM,MAAP;KAEI,SAAS,KAAc,MAAK;MAExB,AADA,EAAE,gBAAgB,GAClB,EAAY,EAAI,UAAU,EAAK,QAAQ,CAAC;KAC5C,IAAI,KAAA;KACJ,eAAe,KAAoB,MAAK;MAEpC,AADA,EAAE,gBAAgB,GAClB,EAAkB,EAAI,UAAU,EAAK,QAAQ,CAAC;KAClD,IAAI,KAAA;KACJ,cAAc,KAAmB,MAAK,EAAiB,EAAI,UAAU,EAAK,QAAQ,CAAC,IAAI,KAAA;KACvF,cAAc,KAAmB,MAAK,EAAiB,EAAI,UAAU,EAAK,QAAQ,CAAC,IAAI,KAAA;KAEvF,UAAA,kBAAC,OAAD;MACI,WAAU;MACV,eACI,KACM,MACI,EACI,GACA,EAAI,UACJ,EAAK,QACL,CACJ,IACJ,KAAA;MAXd,UAAA,CAcK,KAAiB,KACd,kBAAA,GAAA,EAAA,UAAA,CACI,kBAAC,OAAD,EAAK,OAAO,EAAE,OAAO,GAAG,IAAQ,EAAW,IAAI,EAAI,CAAA,GAClD,IACG,kBAAC,UAAD;OACI,UAAU,MAAM;QAEZ,AADA,EAAE,gBAAgB,GAClB,EAAgB,GAAO,EAAI,QAAQ;OACvC;OACA,WAAU;OAGV,UAAA,kBAAC,OAAD;QACI,OAAM;QACN,WAAU;QACV,MAAK;QACL,SAAQ;QACR,QAAO;QACP,OAAO;SACH,YAAY;SACZ,WAAW,IAAa,kBAAkB;QAC9C;QAGA,UAAA,kBAAC,QAAD;SACI,eAAc;SACd,gBAAe;SACf,aAAY;SACZ,GAAE;QACL,CAAA;OACA,CAAA;MACD,CAAA,IAER,kBAAC,OAAD,EAAK,WAAU,MAAW,CAAA,CAEhC,EAAA,CAAA,GAEL,CACA;;IACG,GAjEH,EAAK,EAiEF;GAEpB,CAAC;EACM,GA3GF,EAAI,EA2GF;EAIf,IAAI,GAAe;GACf,IAAM,IAAU,EAAW,QACtB,GAAM,MAAQ,EAAI,UAAU,GAAM,GAAQ,CAAa,KAAK,GAC7D,CACJ;GACA,IAAI,MAAY,GACZ,OAAO,kBAAC,EAAM,UAAP,EAAA,UAA8B,EAAwB,GAAjC,EAAI,EAA6B;EAErE;EAEA,OAAO;CACX,CAAC,EAEG,CAAA;AAEpB"}
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 card?: boolean;\n fieldLabels?: Record<string, React.ReactNode>;\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 card = false,\n fieldLabels,\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 selected={row.getIsSelected()}\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 label={card ? (\n fieldLabels && Object.prototype.hasOwnProperty.call(fieldLabels, cell.column.id)\n ? fieldLabels[cell.column.id]\n : typeof cell.column.columnDef.header === 'string'\n ? cell.column.columnDef.header\n : cell.column.id\n ) : undefined}\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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"}
@@ -3,6 +3,7 @@ import { Table, VisibilityState, RowSelectionState } from '../tanstack-table';
3
3
  import { ToolbarOptions, CustomFilterPanelProps, DataTableProps } from '../types';
4
4
  interface TableToolbarProps<T extends object> {
5
5
  toolbar: ToolbarOptions;
6
+ viewSwitcher?: React.ReactNode;
6
7
  table: Table<T>;
7
8
  columns: DataTableProps<T>['columns'];
8
9
  columnOrderState: string[];
@@ -18,5 +19,5 @@ interface TableToolbarProps<T extends object> {
18
19
  enableColumnReordering: boolean;
19
20
  handleDrop: (e: React.DragEvent, targetColumnId: string) => void;
20
21
  }
21
- export declare function TableToolbar<T extends object>({ toolbar, table, columns, columnOrderState, visibilityState, activeFilter, setActiveFilter, customFilterPanel, draggedColumnId, handleDragStart, toggleColumnVisibility, rowSelection, data, enableColumnReordering, handleDrop, }: TableToolbarProps<T>): React.JSX.Element | null;
22
+ export declare function TableToolbar<T extends object>({ toolbar, viewSwitcher, table, columns, columnOrderState, visibilityState, activeFilter, setActiveFilter, customFilterPanel, draggedColumnId, handleDragStart, toggleColumnVisibility, rowSelection, data, enableColumnReordering, handleDrop, }: TableToolbarProps<T>): React.JSX.Element | null;
22
23
  export {};
@@ -4,38 +4,44 @@ import { BulkActions as n } from "./BulkActions.js";
4
4
  import "react";
5
5
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
6
6
  //#region src/components/pro/DataTable/components/TableToolbar.tsx
7
- function a({ toolbar: a, table: o, columns: s, columnOrderState: c, visibilityState: l, activeFilter: u, setActiveFilter: d, customFilterPanel: f, draggedColumnId: p, handleDragStart: m, toggleColumnVisibility: h, rowSelection: g, data: _, enableColumnReordering: v, handleDrop: y }) {
7
+ function a({ toolbar: a, viewSwitcher: o, table: s, columns: c, columnOrderState: l, visibilityState: u, activeFilter: d, setActiveFilter: f, customFilterPanel: p, draggedColumnId: m, handleDragStart: h, toggleColumnVisibility: g, rowSelection: _, data: v, enableColumnReordering: y, handleDrop: b }) {
8
8
  return a.enabled ? /* @__PURE__ */ i("div", {
9
9
  className: "flex flex-wrap justify-between gap-4 mb-4",
10
10
  children: [/* @__PURE__ */ i("div", {
11
11
  className: "flex flex-wrap gap-2 items-center",
12
12
  children: [
13
13
  a.enableColumnSelector && /* @__PURE__ */ r(e, {
14
- table: o,
15
- columns: s,
16
- columnOrderState: c,
17
- visibilityState: l,
18
- toggleColumnVisibility: h,
19
- enableColumnReordering: v,
20
- handleDragStart: m,
21
- handleDrop: y,
22
- draggedColumnId: p
14
+ table: s,
15
+ columns: c,
16
+ columnOrderState: l,
17
+ visibilityState: u,
18
+ toggleColumnVisibility: g,
19
+ enableColumnReordering: y,
20
+ handleDragStart: h,
21
+ handleDrop: b,
22
+ draggedColumnId: m
23
23
  }),
24
24
  a.enableFiltering && /* @__PURE__ */ r(t, {
25
- table: o,
26
- columns: s,
27
- activeFilter: u,
28
- setActiveFilter: d,
29
- customFilterPanel: f,
25
+ table: s,
26
+ columns: c,
27
+ activeFilter: d,
28
+ setActiveFilter: f,
29
+ customFilterPanel: p,
30
30
  filterConfig: a.filterConfig
31
31
  }),
32
32
  a.customComponents
33
33
  ]
34
- }), a.enableBulkActions && a.bulkActions && /* @__PURE__ */ r(n, {
35
- bulkActions: a.bulkActions,
36
- rowSelection: g,
37
- data: _
34
+ }), /* @__PURE__ */ i("div", {
35
+ className: "flex flex-wrap items-center gap-2",
36
+ children: [o, a.enableBulkActions && a.bulkActions && /* @__PURE__ */ r(n, {
37
+ bulkActions: a.bulkActions,
38
+ rowSelection: _,
39
+ data: v
40
+ })]
38
41
  })]
42
+ }) : o ? /* @__PURE__ */ r("div", {
43
+ className: "flex justify-end mb-4",
44
+ children: o
39
45
  }) : null;
40
46
  }
41
47
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"TableToolbar.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TableToolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { Table, VisibilityState, RowSelectionState } from '../tanstack-table';\nimport { ToolbarOptions, CustomFilterPanelProps, DataTableProps } from '../types';\nimport { ColumnSelector } from './ColumnSelector';\nimport { FilterBar } from './FilterBar';\nimport { BulkActions } from './BulkActions';\n\ninterface TableToolbarProps<T extends object> {\n toolbar: ToolbarOptions;\n table: Table<T>;\n columns: DataTableProps<T>['columns'];\n columnOrderState: string[];\n visibilityState: VisibilityState;\n activeFilter: string | null;\n setActiveFilter: (filter: string | null) => void;\n customFilterPanel?: React.ComponentType<CustomFilterPanelProps>;\n draggedColumnId: string | null;\n handleDragStart: (e: React.DragEvent, columnId: string) => void;\n toggleColumnVisibility: (columnId: string) => void;\n rowSelection: RowSelectionState;\n data: T[];\n enableColumnReordering: boolean;\n handleDrop: (e: React.DragEvent, targetColumnId: string) => void;\n}\n\nexport function TableToolbar<T extends object>({\n toolbar,\n table,\n columns,\n columnOrderState,\n visibilityState,\n activeFilter,\n setActiveFilter,\n customFilterPanel,\n draggedColumnId,\n handleDragStart,\n toggleColumnVisibility,\n rowSelection,\n data,\n enableColumnReordering,\n handleDrop,\n}: TableToolbarProps<T>) {\n if (!toolbar.enabled) return null;\n\n return (\n <div className=\"flex flex-wrap justify-between gap-4 mb-4\">\n <div className=\"flex flex-wrap gap-2 items-center\">\n {toolbar.enableColumnSelector && (\n <ColumnSelector\n table={table}\n columns={columns}\n columnOrderState={columnOrderState}\n visibilityState={visibilityState}\n toggleColumnVisibility={toggleColumnVisibility}\n enableColumnReordering={enableColumnReordering}\n handleDragStart={handleDragStart}\n handleDrop={handleDrop}\n draggedColumnId={draggedColumnId}\n />\n )}\n\n {toolbar.enableFiltering && (\n <FilterBar\n table={table}\n columns={columns}\n activeFilter={activeFilter}\n setActiveFilter={setActiveFilter}\n customFilterPanel={customFilterPanel}\n filterConfig={toolbar.filterConfig}\n />\n )}\n\n {toolbar.customComponents}\n </div>\n\n {toolbar.enableBulkActions && toolbar.bulkActions && (\n <BulkActions\n bulkActions={toolbar.bulkActions}\n rowSelection={rowSelection}\n data={data}\n />\n )}\n </div>\n );\n}\n\n"],"mappings":";;;;;;AAyBA,SAAgB,EAA+B,EAC3C,YACA,UACA,YACA,qBACA,oBACA,iBACA,oBACA,sBACA,oBACA,oBACA,2BACA,iBACA,SACA,2BACA,iBACqB;CAGrB,OAFK,EAAQ,UAGT,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACK,EAAQ,wBACL,kBAAC,GAAD;KACW;KACE;KACS;KACD;KACO;KACA;KACP;KACL;KACK;IACpB,CAAA;IAGJ,EAAQ,mBACL,kBAAC,GAAD;KACW;KACE;KACK;KACG;KACE;KACnB,cAAc,EAAQ;IACzB,CAAA;IAGJ,EAAQ;GACR;EAEJ,CAAA,GAAA,EAAQ,qBAAqB,EAAQ,eAClC,kBAAC,GAAD;GACI,aAAa,EAAQ;GACP;GACR;EACT,CAAA,CAEJ;MAxCoB;AA0CjC"}
1
+ {"version":3,"file":"TableToolbar.js","names":[],"sources":["../../../../../src/components/pro/DataTable/components/TableToolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { Table, VisibilityState, RowSelectionState } from '../tanstack-table';\nimport { ToolbarOptions, CustomFilterPanelProps, DataTableProps } from '../types';\nimport { ColumnSelector } from './ColumnSelector';\nimport { FilterBar } from './FilterBar';\nimport { BulkActions } from './BulkActions';\n\ninterface TableToolbarProps<T extends object> {\n toolbar: ToolbarOptions;\n viewSwitcher?: React.ReactNode;\n table: Table<T>;\n columns: DataTableProps<T>['columns'];\n columnOrderState: string[];\n visibilityState: VisibilityState;\n activeFilter: string | null;\n setActiveFilter: (filter: string | null) => void;\n customFilterPanel?: React.ComponentType<CustomFilterPanelProps>;\n draggedColumnId: string | null;\n handleDragStart: (e: React.DragEvent, columnId: string) => void;\n toggleColumnVisibility: (columnId: string) => void;\n rowSelection: RowSelectionState;\n data: T[];\n enableColumnReordering: boolean;\n handleDrop: (e: React.DragEvent, targetColumnId: string) => void;\n}\n\nexport function TableToolbar<T extends object>({\n toolbar,\n viewSwitcher,\n table,\n columns,\n columnOrderState,\n visibilityState,\n activeFilter,\n setActiveFilter,\n customFilterPanel,\n draggedColumnId,\n handleDragStart,\n toggleColumnVisibility,\n rowSelection,\n data,\n enableColumnReordering,\n handleDrop,\n}: TableToolbarProps<T>) {\n if (!toolbar.enabled) {\n return viewSwitcher ? <div className=\"flex justify-end mb-4\">{viewSwitcher}</div> : null;\n }\n\n return (\n <div className=\"flex flex-wrap justify-between gap-4 mb-4\">\n <div className=\"flex flex-wrap gap-2 items-center\">\n {toolbar.enableColumnSelector && (\n <ColumnSelector\n table={table}\n columns={columns}\n columnOrderState={columnOrderState}\n visibilityState={visibilityState}\n toggleColumnVisibility={toggleColumnVisibility}\n enableColumnReordering={enableColumnReordering}\n handleDragStart={handleDragStart}\n handleDrop={handleDrop}\n draggedColumnId={draggedColumnId}\n />\n )}\n\n {toolbar.enableFiltering && (\n <FilterBar\n table={table}\n columns={columns}\n activeFilter={activeFilter}\n setActiveFilter={setActiveFilter}\n customFilterPanel={customFilterPanel}\n filterConfig={toolbar.filterConfig}\n />\n )}\n\n {toolbar.customComponents}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {viewSwitcher}\n {toolbar.enableBulkActions && toolbar.bulkActions && (\n <BulkActions\n bulkActions={toolbar.bulkActions}\n rowSelection={rowSelection}\n data={data}\n />\n )}\n </div>\n </div>\n );\n}\n\n"],"mappings":";;;;;;AA0BA,SAAgB,EAA+B,EAC3C,YACA,iBACA,UACA,YACA,qBACA,oBACA,iBACA,oBACA,sBACA,oBACA,oBACA,2BACA,iBACA,SACA,2BACA,iBACqB;CAKrB,OAJK,EAAQ,UAKT,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACK,EAAQ,wBACL,kBAAC,GAAD;KACW;KACE;KACS;KACD;KACO;KACA;KACP;KACL;KACK;IACpB,CAAA;IAGJ,EAAQ,mBACL,kBAAC,GAAD;KACW;KACE;KACK;KACG;KACE;KACnB,cAAc,EAAQ;IACzB,CAAA;IAGJ,EAAQ;GACR;EAEL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACK,GACA,EAAQ,qBAAqB,EAAQ,eAClC,kBAAC,GAAD;IACI,aAAa,EAAQ;IACP;IACR;GACT,CAAA,CAEJ;EACJ,CAAA,CAAA;MA5CE,IAAe,kBAAC,OAAD;EAAK,WAAU;EAAyB,UAAA;CAAkB,CAAA,IAAI;AA8C5F"}
@@ -25,7 +25,7 @@ export { PivotPanel } from './PivotPanel';
25
25
  export type { PivotPanelProps } from './PivotPanel';
26
26
  export { computePivot } from './pivotEngine';
27
27
  export type { PivotAggFn, PivotConfig, PivotResult, PivotRowNode, } from './pivotEngine';
28
- export type { DataTableProps, CellEventHandler, RowEventHandler, ColumnEventHandler, TableEventHandler } from './DataTable';
28
+ export type { DataTableProps, DataTableViewMode, DataTableCardOptions, CellEventHandler, RowEventHandler, ColumnEventHandler, TableEventHandler } from './DataTable';
29
29
  export type { FilterPanelProps, TextFilterProps, NumberFilterProps, SelectFilterProps, BooleanFilterProps, DateRangeFilterProps } from './Filters';
30
30
  export type { TreeDataRow } from './utils';
31
31
  export type { ColumnDef, ColumnFiltersState, SortingState, VisibilityState, RowSelectionState, PaginationState } from './tanstack-table';
@@ -6,7 +6,7 @@ function a({ render: a }) {
6
6
  return e(() => ({
7
7
  name: "row-detail",
8
8
  wrapRow: (e, t) => o[t.rowId] ? /* @__PURE__ */ i(n, { children: [e, /* @__PURE__ */ r("tr", {
9
- className: "table-row",
9
+ className: "table-row blade-table-card__detail",
10
10
  children: /* @__PURE__ */ r("td", {
11
11
  className: "table-cell p-0",
12
12
  colSpan: 9999,
@@ -1 +1 @@
1
- {"version":3,"file":"rowDetailExtension.js","names":[],"sources":["../../../../src/components/pro/DataTable/rowDetailExtension.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport type { DataTableExtension, DataTableRowContext } from './extension';\n\nexport interface RowDetailOptions<T extends object> {\n /** 渲染展开后的行详情面板。 */\n render: (ctx: DataTableRowContext<T>) => React.ReactNode;\n}\n\n/**\n * 行详情(master/detail)扩展。\n *\n * 由于扩展是普通对象无法持有 React 状态,这里以 hook 工厂的形式返回一个绑定了\n * 展开状态的扩展。为每一行的第一列注入一个展开按钮(通过 `cell` 覆写),点击后\n * 在该行下方渲染一个详情面板(通过 `wrapRow`)。\n *\n * 使用方式:\n * ```tsx\n * const detail = useRowDetailExtension<Row>({\n * render: ({ row }) => <pre>{JSON.stringify(row, null, 2)}</pre>,\n * });\n * <DataTable data={data} columns={columns} extensions={[detail]} />\n * ```\n */\nexport function useRowDetailExtension<T extends object>({\n render,\n}: RowDetailOptions<T>): DataTableExtension<T> {\n const [open, setOpen] = useState<Record<string, boolean>>({});\n\n return useMemo<DataTableExtension<T>>(\n () => ({\n name: 'row-detail',\n wrapRow: (children, ctx) => {\n if (!open[ctx.rowId]) return children;\n return (\n <>\n {children}\n <tr className=\"table-row\">\n <td className=\"table-cell p-0\" colSpan={9999}>\n <div className=\"bg-base-200/60 p-4 border-l-4 border-primary\">\n {render(ctx)}\n </div>\n </td>\n </tr>\n </>\n );\n },\n rowProps: (ctx) =>\n ({\n 'data-detail-open': open[ctx.rowId] ? 'true' : undefined,\n }) as React.HTMLAttributes<HTMLTableRowElement>,\n // 通过右键菜单切换详情面板,避免占用列布局。\n contextMenu: (ctx) => [\n {\n key: 'toggle-detail',\n label: open[ctx.rowId] ? '收起详情' : '展开详情',\n onSelect: () =>\n setOpen((s) => ({ ...s, [ctx.rowId]: !s[ctx.rowId] })),\n },\n ],\n }),\n [open, render],\n );\n}\n"],"mappings":";;;AAuBA,SAAgB,EAAwC,EACpD,aAC2C;CAC3C,IAAM,CAAC,GAAM,KAAW,EAAkC,CAAC,CAAC;CAE5D,OAAO,SACI;EACH,MAAM;EACN,UAAU,GAAU,MACX,EAAK,EAAI,SAEV,kBAAA,GAAA,EAAA,UAAA,CACK,GACD,kBAAC,MAAD;GAAI,WAAU;GACV,UAAA,kBAAC,MAAD;IAAI,WAAU;IAAiB,SAAS;IACpC,UAAA,kBAAC,OAAD;KAAK,WAAU;KACV,UAAA,EAAO,CAAG;IACV,CAAA;GACL,CAAA;EACJ,CAAA,CACN,EAAA,CAAA,IAXuB;EAcjC,WAAW,OACN,EACG,oBAAoB,EAAK,EAAI,SAAS,SAAS,KAAA,EACnD;EAEJ,cAAc,MAAQ,CAClB;GACI,KAAK;GACL,OAAO,EAAK,EAAI,SAAS,SAAS;GAClC,gBACI,GAAS,OAAO;IAAE,GAAG;KAAI,EAAI,QAAQ,CAAC,EAAE,EAAI;GAAO,EAAE;EAC7D,CACJ;CACJ,IACA,CAAC,GAAM,CAAM,CACjB;AACJ"}
1
+ {"version":3,"file":"rowDetailExtension.js","names":[],"sources":["../../../../src/components/pro/DataTable/rowDetailExtension.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport type { DataTableExtension, DataTableRowContext } from './extension';\n\nexport interface RowDetailOptions<T extends object> {\n /** 渲染展开后的行详情面板。 */\n render: (ctx: DataTableRowContext<T>) => React.ReactNode;\n}\n\n/**\n * 行详情(master/detail)扩展。\n *\n * 由于扩展是普通对象无法持有 React 状态,这里以 hook 工厂的形式返回一个绑定了\n * 展开状态的扩展。为每一行的第一列注入一个展开按钮(通过 `cell` 覆写),点击后\n * 在该行下方渲染一个详情面板(通过 `wrapRow`)。\n *\n * 使用方式:\n * ```tsx\n * const detail = useRowDetailExtension<Row>({\n * render: ({ row }) => <pre>{JSON.stringify(row, null, 2)}</pre>,\n * });\n * <DataTable data={data} columns={columns} extensions={[detail]} />\n * ```\n */\nexport function useRowDetailExtension<T extends object>({\n render,\n}: RowDetailOptions<T>): DataTableExtension<T> {\n const [open, setOpen] = useState<Record<string, boolean>>({});\n\n return useMemo<DataTableExtension<T>>(\n () => ({\n name: 'row-detail',\n wrapRow: (children, ctx) => {\n if (!open[ctx.rowId]) return children;\n return (\n <>\n {children}\n <tr className=\"table-row blade-table-card__detail\">\n <td className=\"table-cell p-0\" colSpan={9999}>\n <div className=\"bg-base-200/60 p-4 border-l-4 border-primary\">\n {render(ctx)}\n </div>\n </td>\n </tr>\n </>\n );\n },\n rowProps: (ctx) =>\n ({\n 'data-detail-open': open[ctx.rowId] ? 'true' : undefined,\n }) as React.HTMLAttributes<HTMLTableRowElement>,\n // 通过右键菜单切换详情面板,避免占用列布局。\n contextMenu: (ctx) => [\n {\n key: 'toggle-detail',\n label: open[ctx.rowId] ? '收起详情' : '展开详情',\n onSelect: () =>\n setOpen((s) => ({ ...s, [ctx.rowId]: !s[ctx.rowId] })),\n },\n ],\n }),\n [open, render],\n );\n}\n"],"mappings":";;;AAuBA,SAAgB,EAAwC,EACpD,aAC2C;CAC3C,IAAM,CAAC,GAAM,KAAW,EAAkC,CAAC,CAAC;CAE5D,OAAO,SACI;EACH,MAAM;EACN,UAAU,GAAU,MACX,EAAK,EAAI,SAEV,kBAAA,GAAA,EAAA,UAAA,CACK,GACD,kBAAC,MAAD;GAAI,WAAU;GACV,UAAA,kBAAC,MAAD;IAAI,WAAU;IAAiB,SAAS;IACpC,UAAA,kBAAC,OAAD;KAAK,WAAU;KACV,UAAA,EAAO,CAAG;IACV,CAAA;GACL,CAAA;EACJ,CAAA,CACN,EAAA,CAAA,IAXuB;EAcjC,WAAW,OACN,EACG,oBAAoB,EAAK,EAAI,SAAS,SAAS,KAAA,EACnD;EAEJ,cAAc,MAAQ,CAClB;GACI,KAAK;GACL,OAAO,EAAK,EAAI,SAAS,SAAS;GAClC,gBACI,GAAS,OAAO;IAAE,GAAG;KAAI,EAAI,QAAQ,CAAC,EAAE,EAAI;GAAO,EAAE;EAC7D,CACJ;CACJ,IACA,CAAC,GAAM,CAAM,CACjB;AACJ"}
@@ -1,6 +1,12 @@
1
1
  import React from 'react';
2
2
  import { ColumnDef, ColumnFiltersState, SortingState, VisibilityState, RowSelectionState, Column } from './tanstack-table';
3
3
  import type { DataTableExtension } from './extension';
4
+ import type { TableCardOptions } from '../../Table';
5
+ export type DataTableViewMode = 'table' | 'card';
6
+ export interface DataTableCardOptions extends TableCardOptions {
7
+ /** 覆盖卡片字段标签;默认使用字符串列标题,否则使用列 ID。null 隐藏标签。 */
8
+ fieldLabels?: Record<string, React.ReactNode>;
9
+ }
4
10
  export type CellEventHandler = (row: any, column: any, event: React.MouseEvent) => void;
5
11
  export type RowEventHandler = (row: any, event: React.MouseEvent) => void;
6
12
  export type ColumnEventHandler = (column: any, event: React.MouseEvent) => void;
@@ -40,6 +46,19 @@ export interface DataTableProps<T extends object> {
40
46
  data: T[];
41
47
  columns: ColumnDef<T, any>[];
42
48
  className?: string;
49
+ /** 传入即受控;未提供 onViewModeChange 时只读。 */
50
+ viewMode?: DataTableViewMode;
51
+ /** 默认 table,仅用于初始化非受控视图。 */
52
+ defaultViewMode?: DataTableViewMode;
53
+ onViewModeChange?: (viewMode: DataTableViewMode) => void;
54
+ /** 默认 false;独立于 toolbar.enabled,扩展接管主体时不显示。 */
55
+ enableViewSwitcher?: boolean;
56
+ viewSwitcherLabels?: {
57
+ label?: string;
58
+ table?: string;
59
+ card?: string;
60
+ };
61
+ cardOptions?: DataTableCardOptions;
43
62
  enableSorting?: boolean;
44
63
  enableFiltering?: boolean;
45
64
  enablePagination?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","names":[],"sources":["../src/components/pro/DataTable/index.ts"],"sourcesContent":["import DataTableComponent from './DataTable';\nimport * as Filters from './Filters';\nimport * as Utils from './utils';\n\n// 导出 Hook\nexport { useTableColumns } from '../../../hooks/useTableColumns';\nexport type { ColumnConfig, ColumnFilterConfig } from '../../../hooks/useTableColumns';\nexport { useTableData } from '../../../hooks/useTableData';\nexport type { UseTableDataOptions, UseTableDataReturn } from '../../../hooks/useTableData';\n\n// 导出所有过滤器组件\nexport const {\n TextFilter,\n NumberRangeFilter,\n SelectFilter,\n BooleanFilter,\n DateRangeFilter,\n MultiSelectFilter,\n FilterPanel\n} = Filters;\n\n// 导出所有辅助函数\nexport const {\n createColumn,\n createComputedColumn,\n createActionColumn,\n createSelectionColumn,\n numericSort,\n dateSort,\n stringSort,\n treeSort,\n createSelectOptions,\n extractUniqueOptions,\n defaultFilterFunctions\n} = Utils;\n\n// 导出扩展系统(Core + Extension 架构)\nexport { defineExtension } from './extension';\nexport type {\n DataTableApi,\n DataTableExtension,\n DataTableRowContext,\n DataTableCellContext,\n DataTableMenuItem,\n} from './extension';\n\n// 导出内置扩展\nexport { usePivotExtension } from './pivotExtension';\nexport type {\n PivotExtensionOptions,\n PivotField,\n PivotPanelPlacement,\n} from './pivotExtension';\nexport { useRowDetailExtension } from './rowDetailExtension';\nexport type { RowDetailOptions } from './rowDetailExtension';\n\n// 导出透视(Pivot)相关\nexport { PivotView } from './PivotView';\nexport type { PivotViewProps, PivotValue, PivotFieldLabels } from './PivotView';\nexport { PivotPanel } from './PivotPanel';\nexport type { PivotPanelProps } from './PivotPanel';\nexport { computePivot } from './pivotEngine';\nexport type {\n PivotAggFn,\n PivotConfig,\n PivotResult,\n PivotRowNode,\n} from './pivotEngine';\n\n// 导出类型\nexport type {\n DataTableProps,\n CellEventHandler,\n RowEventHandler,\n ColumnEventHandler,\n TableEventHandler\n} from './DataTable';\n\n// 导出过滤器相关类型\nexport type {\n FilterPanelProps,\n TextFilterProps,\n NumberFilterProps,\n SelectFilterProps,\n BooleanFilterProps,\n DateRangeFilterProps\n} from './Filters';\n\n// 导出TreeDataRow类型\nexport type { TreeDataRow } from './utils';\n\n// 从 TanStack Table 兼容层导出常用类型(v8 命名,底层已适配 v9)\nexport type {\n ColumnDef,\n ColumnFiltersState,\n SortingState,\n VisibilityState,\n RowSelectionState,\n PaginationState\n} from './tanstack-table';\n\nexport default DataTableComponent; "],"mappings":";;;;;;;;;;;;AAWA,IAAa,EACX,eACA,sBACA,iBACA,kBACA,oBACA,sBACA,mBACE,GAGS,EACX,iBACA,yBACA,uBACA,0BACA,gBACA,aACA,eACA,aACA,wBACA,yBACA,8BACE,GAmEJ,IAAe"}
1
+ {"version":3,"file":"data-table.js","names":[],"sources":["../src/components/pro/DataTable/index.ts"],"sourcesContent":["import DataTableComponent from './DataTable';\nimport * as Filters from './Filters';\nimport * as Utils from './utils';\n\n// 导出 Hook\nexport { useTableColumns } from '../../../hooks/useTableColumns';\nexport type { ColumnConfig, ColumnFilterConfig } from '../../../hooks/useTableColumns';\nexport { useTableData } from '../../../hooks/useTableData';\nexport type { UseTableDataOptions, UseTableDataReturn } from '../../../hooks/useTableData';\n\n// 导出所有过滤器组件\nexport const {\n TextFilter,\n NumberRangeFilter,\n SelectFilter,\n BooleanFilter,\n DateRangeFilter,\n MultiSelectFilter,\n FilterPanel\n} = Filters;\n\n// 导出所有辅助函数\nexport const {\n createColumn,\n createComputedColumn,\n createActionColumn,\n createSelectionColumn,\n numericSort,\n dateSort,\n stringSort,\n treeSort,\n createSelectOptions,\n extractUniqueOptions,\n defaultFilterFunctions\n} = Utils;\n\n// 导出扩展系统(Core + Extension 架构)\nexport { defineExtension } from './extension';\nexport type {\n DataTableApi,\n DataTableExtension,\n DataTableRowContext,\n DataTableCellContext,\n DataTableMenuItem,\n} from './extension';\n\n// 导出内置扩展\nexport { usePivotExtension } from './pivotExtension';\nexport type {\n PivotExtensionOptions,\n PivotField,\n PivotPanelPlacement,\n} from './pivotExtension';\nexport { useRowDetailExtension } from './rowDetailExtension';\nexport type { RowDetailOptions } from './rowDetailExtension';\n\n// 导出透视(Pivot)相关\nexport { PivotView } from './PivotView';\nexport type { PivotViewProps, PivotValue, PivotFieldLabels } from './PivotView';\nexport { PivotPanel } from './PivotPanel';\nexport type { PivotPanelProps } from './PivotPanel';\nexport { computePivot } from './pivotEngine';\nexport type {\n PivotAggFn,\n PivotConfig,\n PivotResult,\n PivotRowNode,\n} from './pivotEngine';\n\n// 导出类型\nexport type {\n DataTableProps,\n DataTableViewMode,\n DataTableCardOptions,\n CellEventHandler,\n RowEventHandler,\n ColumnEventHandler,\n TableEventHandler\n} from './DataTable';\n\n// 导出过滤器相关类型\nexport type {\n FilterPanelProps,\n TextFilterProps,\n NumberFilterProps,\n SelectFilterProps,\n BooleanFilterProps,\n DateRangeFilterProps\n} from './Filters';\n\n// 导出TreeDataRow类型\nexport type { TreeDataRow } from './utils';\n\n// 从 TanStack Table 兼容层导出常用类型(v8 命名,底层已适配 v9)\nexport type {\n ColumnDef,\n ColumnFiltersState,\n SortingState,\n VisibilityState,\n RowSelectionState,\n PaginationState\n} from './tanstack-table';\n\nexport default DataTableComponent; "],"mappings":";;;;;;;;;;;;AAWA,IAAa,EACX,eACA,sBACA,iBACA,kBACA,oBACA,sBACA,mBACE,GAGS,EACX,iBACA,yBACA,uBACA,0BACA,gBACA,aACA,eACA,aACA,wBACA,yBACA,8BACE,GAqEJ,IAAe"}