es-grid-template 1.9.94 → 1.9.96

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/es/grid-component/type.d.ts +3 -1
  2. package/es/group-component/TableContainer.js +1 -0
  3. package/es/group-component/TableContainerEdit.js +1 -0
  4. package/es/group-component/footer/TableFooter.d.ts +2 -1
  5. package/es/group-component/footer/TableFooter.js +8 -11
  6. package/es/group-component/footer/TableFooterCell.d.ts +2 -1
  7. package/es/group-component/footer/TableFooterCell.js +9 -4
  8. package/es/group-component/footer/TableFooterRow.d.ts +2 -1
  9. package/es/group-component/footer/TableFooterRow.js +4 -2
  10. package/es/group-component/table/TableWrapper.d.ts +1 -0
  11. package/es/group-component/table/TableWrapper.js +4 -3
  12. package/es/table-component/TableContainer.js +3 -1
  13. package/es/table-component/TableContainerEdit.js +3 -1
  14. package/es/table-component/footer/TableFooter.d.ts +2 -1
  15. package/es/table-component/footer/TableFooter.js +8 -11
  16. package/es/table-component/footer/TableFooterCell.d.ts +2 -1
  17. package/es/table-component/footer/TableFooterCell.js +9 -4
  18. package/es/table-component/footer/TableFooterRow.d.ts +2 -1
  19. package/es/table-component/footer/TableFooterRow.js +4 -2
  20. package/es/table-component/table/TableWrapper.d.ts +1 -0
  21. package/es/table-component/table/TableWrapper.js +4 -3
  22. package/es/table-virtuoso/InternalTable.js +54 -11
  23. package/es/table-virtuoso/footer/TableFooterCell.d.ts +2 -1
  24. package/es/table-virtuoso/footer/TableFooterCell.js +9 -4
  25. package/es/table-virtuoso/table/Grid.js +37 -8
  26. package/es/table-virtuoso/table/TableContainer.js +3 -1
  27. package/es/table-virtuoso/table/TableWrapper.d.ts +1 -0
  28. package/es/table-virtuoso/table/TableWrapper.js +7 -7
  29. package/lib/grid-component/type.d.ts +3 -1
  30. package/lib/group-component/TableContainer.js +1 -0
  31. package/lib/group-component/TableContainerEdit.js +1 -0
  32. package/lib/group-component/footer/TableFooter.d.ts +2 -1
  33. package/lib/group-component/footer/TableFooter.js +8 -11
  34. package/lib/group-component/footer/TableFooterCell.d.ts +2 -1
  35. package/lib/group-component/footer/TableFooterCell.js +9 -4
  36. package/lib/group-component/footer/TableFooterRow.d.ts +2 -1
  37. package/lib/group-component/footer/TableFooterRow.js +4 -2
  38. package/lib/group-component/table/TableWrapper.d.ts +1 -0
  39. package/lib/group-component/table/TableWrapper.js +4 -3
  40. package/lib/table-component/TableContainer.js +3 -1
  41. package/lib/table-component/TableContainerEdit.js +3 -1
  42. package/lib/table-component/footer/TableFooter.d.ts +2 -1
  43. package/lib/table-component/footer/TableFooter.js +8 -11
  44. package/lib/table-component/footer/TableFooterCell.d.ts +2 -1
  45. package/lib/table-component/footer/TableFooterCell.js +9 -4
  46. package/lib/table-component/footer/TableFooterRow.d.ts +2 -1
  47. package/lib/table-component/footer/TableFooterRow.js +4 -2
  48. package/lib/table-component/table/TableWrapper.d.ts +1 -0
  49. package/lib/table-component/table/TableWrapper.js +4 -3
  50. package/lib/table-virtuoso/InternalTable.js +53 -10
  51. package/lib/table-virtuoso/footer/TableFooterCell.d.ts +2 -1
  52. package/lib/table-virtuoso/footer/TableFooterCell.js +9 -4
  53. package/lib/table-virtuoso/table/Grid.js +37 -8
  54. package/lib/table-virtuoso/table/TableContainer.js +3 -1
  55. package/lib/table-virtuoso/table/TableWrapper.d.ts +1 -0
  56. package/lib/table-virtuoso/table/TableWrapper.js +7 -7
  57. package/package.json +2 -2
@@ -51,16 +51,46 @@ const Grid = props => {
51
51
  setColumnSizing,
52
52
  columnFilters,
53
53
  setColumnOrder,
54
- rowSelection,
55
54
  className: tableClassNames,
56
55
  ...rest
57
56
  } = props;
57
+ const selectedRowState = table.getState().rowSelection;
58
58
  const [isSelectionChange, setIsSelectionChange] = React.useState({
59
59
  isChange: false,
60
60
  type: '',
61
61
  rowData: {},
62
62
  rowsData: []
63
63
  });
64
+ const rowSelectedRef = React.useRef(rowSelected);
65
+ React.useEffect(() => {
66
+ rowSelectedRef.current = rowSelected;
67
+ }, [rowSelected]);
68
+ const pruneSelection = selectionSettings?.pruneSelection === true;
69
+ const selectedViewRows = React.useMemo(() => {
70
+ if (!pruneSelection || props.loading) {
71
+ return [];
72
+ }
73
+ return table.getCoreRowModel().flatRows.filter(row => !row.original.isGroupRow && selectedRowState[row.id]).map(row => row.original);
74
+ }, [pruneSelection, props.loading, table, dataSource, selectedRowState]);
75
+ const selectedViewIds = JSON.stringify(selectedViewRows.map(row => String(row.rowId)).sort());
76
+ const lastNotifiedSelection = React.useRef(null);
77
+
78
+ // Keep event handlers in sync with the view without another state/effect.
79
+ const selectionChange = pruneSelection && !props.loading ? {
80
+ ...isSelectionChange,
81
+ rowsData: selectedViewRows
82
+ } : isSelectionChange;
83
+ React.useEffect(() => {
84
+ if (!pruneSelection || props.loading || lastNotifiedSelection.current === selectedViewIds) {
85
+ return;
86
+ }
87
+ lastNotifiedSelection.current = selectedViewIds;
88
+ rowSelected?.({
89
+ type: isSelectionChange.isChange ? isSelectionChange.type : 'selectionPruned',
90
+ rowData: isSelectionChange.rowData,
91
+ selected: selectedViewRows
92
+ });
93
+ }, [pruneSelection, props.loading, selectedViewIds, selectedViewRows, rowSelected, isSelectionChange.isChange, isSelectionChange.type, isSelectionChange.rowData]);
64
94
  const [sorterChange, setSorterChange] = React.useState(false);
65
95
  const [filterChange, setFilterChange] = React.useState(false);
66
96
  const [isFullScreen, setIsFullScreen] = React.useState(false);
@@ -77,18 +107,17 @@ const Grid = props => {
77
107
  // }, [mergedSelectedKeys])
78
108
 
79
109
  React.useEffect(() => {
80
- if (isSelectionChange.isChange) {
81
- const aa = table.getState().rowSelection;
82
- const ids = Object.keys(aa);
110
+ if (!pruneSelection && isSelectionChange.isChange) {
111
+ const ids = Object.keys(selectedRowState);
83
112
  const ssss = filterByIds(ids, isSelectionChange.rowsData ?? []); // lấy rowsData của trang hiện tại
84
113
 
85
- rowSelected?.({
114
+ rowSelectedRef.current?.({
86
115
  type: isSelectionChange.type,
87
116
  rowData: isSelectionChange.rowData,
88
117
  selected: ssss.filter(x => !x.isGroupRow)
89
118
  });
90
119
  }
91
- }, [isSelectionChange, rowSelection, table.getState().rowSelection]);
120
+ }, [isSelectionChange, selectedRowState, pruneSelection]);
92
121
  React.useEffect(() => {
93
122
  if (sorterChange) {
94
123
  const aa = table.getState().sorting;
@@ -179,7 +208,7 @@ const Grid = props => {
179
208
  originData: originData,
180
209
  prefix: prefix,
181
210
  selectionSettings: selectionSettings,
182
- isSelectionChange: isSelectionChange,
211
+ isSelectionChange: selectionChange,
183
212
  setIsSelectionChange: setIsSelectionChange,
184
213
  setSorterChange: setSorterChange,
185
214
  setFilterChange: setFilterChange,
@@ -249,7 +278,7 @@ const Grid = props => {
249
278
  originData: originData,
250
279
  prefix: prefix,
251
280
  selectionSettings: selectionSettings,
252
- isSelectionChange: isSelectionChange,
281
+ isSelectionChange: selectionChange,
253
282
  setIsSelectionChange: setIsSelectionChange,
254
283
  setSorterChange: setSorterChange,
255
284
  setFilterChange: setFilterChange,
@@ -291,7 +291,9 @@ const TableContainer = props => {
291
291
  pagination,
292
292
  groupSetting
293
293
  }
294
- }, /*#__PURE__*/React.createElement(TableWrapper, _extends({}, rest, {
294
+ }, /*#__PURE__*/React.createElement(TableWrapper, _extends({
295
+ footerDataSource: props.footerDataSource
296
+ }, rest, {
295
297
  tableContainerRef: tableContainerRef,
296
298
  prefix: prefix,
297
299
  id: id,
@@ -10,6 +10,7 @@ type Props<T> = {
10
10
  height: number;
11
11
  minHeight?: number;
12
12
  dataSource: T[];
13
+ footerDataSource?: any[];
13
14
  summary?: boolean;
14
15
  loading?: boolean;
15
16
  commandClick?: (args: Omit<CommandClick<T>, 'rows'>) => void;
@@ -247,14 +247,14 @@ const TableWrapper = props => {
247
247
  },
248
248
  fixedFooterContent: summary ? () => {
249
249
  const visibleColumns = table.getVisibleLeafColumns();
250
- return /*#__PURE__*/React.createElement("tr", {
250
+ return /*#__PURE__*/React.createElement(React.Fragment, null, (props.footerDataSource ?? [undefined]).map((footerRow, index) => /*#__PURE__*/React.createElement("tr", {
251
+ key: index,
251
252
  className: "ui-rc-grid-footer-row"
252
- }, visibleColumns.map(header => {
253
- return /*#__PURE__*/React.createElement(TableFooterCell, {
254
- key: header.id,
255
- column: header
256
- });
257
- }));
253
+ }, visibleColumns.map(column => /*#__PURE__*/React.createElement(TableFooterCell, {
254
+ key: column.id,
255
+ column: column,
256
+ footerRow: footerRow
257
+ })))));
258
258
  } : undefined
259
259
  }))), /*#__PURE__*/React.createElement(Tooltip, {
260
260
  id: `${id}-tooltip-content`,
@@ -494,7 +494,7 @@ export type TableProps<RecordType = AnyObject> = {
494
494
  allowResizing?: boolean;
495
495
  /** Hiển thị dòng tổng hợp */
496
496
  summary?: boolean;
497
- /** Dữ liệu footer */
497
+ /** Dữ liệu footer theo field của cột, dùng khi summary=true. Không truyền thì tự tính tổng; [] ẩn các dòng footer. */
498
498
  footerDataSource?: any[];
499
499
  /** Hiển thị text khi không có dữ liệu */
500
500
  showEmptyText?: boolean;
@@ -800,6 +800,8 @@ export type SelectionSettings<T = AnyObject> = {
800
800
  checkedStrategy?: 'all' | 'parent' | 'child';
801
801
  columnWidth?: number;
802
802
  hideSelectAll?: boolean;
803
+ /** When true, keep selection only for records in the current filtered data view. Default: false. */
804
+ pruneSelection?: boolean;
803
805
  selectedRowKeys?: Key[];
804
806
  defaultSelectedRowKeys?: Key[];
805
807
  getCheckboxProps?: (record: T) => Partial<Omit<CheckboxProps, 'checked' | 'defaultChecked'>>;
@@ -347,6 +347,7 @@ const TableContainer = props => {
347
347
  groupColumns
348
348
  }
349
349
  }, /*#__PURE__*/_react.default.createElement(_TableWrapper.default, {
350
+ footerDataSource: props.footerDataSource,
350
351
  contextMenuItems: contextMenuItems,
351
352
  height: tableHeight,
352
353
  minHeight: minHeight,
@@ -2267,6 +2267,7 @@ const TableContainerEdit = props => {
2267
2267
  groupColumns
2268
2268
  }
2269
2269
  }, /*#__PURE__*/_react.default.createElement(_TableWrapper.default, {
2270
+ footerDataSource: props.footerDataSource,
2270
2271
  contextMenuItems: contextMenuItems,
2271
2272
  height: tableHeight,
2272
2273
  minHeight: minHeight,
@@ -2,6 +2,7 @@
2
2
  import type { Table } from "@tanstack/react-table";
3
3
  interface TableFooterProps<T> {
4
4
  table: Table<T>;
5
+ footerDataSource?: any[];
5
6
  }
6
- declare const TableFooter: <RecordType extends object>({ table, }: TableFooterProps<RecordType>) => JSX.Element;
7
+ declare const TableFooter: <RecordType extends object>({ table, footerDataSource, }: TableFooterProps<RecordType>) => JSX.Element;
7
8
  export default TableFooter;
@@ -14,7 +14,8 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
14
14
 
15
15
  const TableFooter = ({
16
16
  // columnVirtualizer,
17
- table
17
+ table,
18
+ footerDataSource
18
19
  // virtualPaddingLeft,
19
20
  // virtualPaddingRight,
20
21
  // ...rest
@@ -30,15 +31,11 @@ const TableFooter = ({
30
31
  bottom: 0,
31
32
  zIndex: 1
32
33
  }
33
- }, /*#__PURE__*/_react.default.createElement(_TableFooterRow.default, {
34
- table: table
35
- // columnVirtualizer={columnVirtualizer}
36
- ,
37
- headerGroup: table.getHeaderGroups()[table.getHeaderGroups().length - 1]
38
- // key={headerGroup.id}
39
- // virtualPaddingLeft={virtualPaddingLeft}
40
- // virtualPaddingRight={virtualPaddingRight}
41
- // {...rest}
42
- }));
34
+ }, (footerDataSource ?? [undefined]).map((footerRow, index) => /*#__PURE__*/_react.default.createElement(_TableFooterRow.default, {
35
+ key: index,
36
+ table: table,
37
+ headerGroup: table.getHeaderGroups()[table.getHeaderGroups().length - 1],
38
+ footerRow: footerRow
39
+ })));
43
40
  };
44
41
  var _default = exports.default = TableFooter;
@@ -2,6 +2,7 @@
2
2
  import type { Column } from "@tanstack/react-table";
3
3
  interface TableFooterCellProps<T> {
4
4
  column: Column<T, any>;
5
+ footerRow?: Record<string, any>;
5
6
  }
6
- declare const TableFooterCell: <RecordType extends object>({ column }: TableFooterCellProps<RecordType>) => JSX.Element;
7
+ declare const TableFooterCell: <RecordType extends object>({ column, footerRow }: TableFooterCellProps<RecordType>) => JSX.Element;
7
8
  export default TableFooterCell;
@@ -14,7 +14,8 @@ var _reactNumericComponent = require("react-numeric-component");
14
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
15
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
16
  const TableFooterCell = ({
17
- column
17
+ column,
18
+ footerRow
18
19
  }) => {
19
20
  const isPinned = column.getIsPinned();
20
21
  const isLastLeftPinnedColumn = isPinned === 'left' && column.getIsLastColumn('left');
@@ -25,7 +26,10 @@ const TableFooterCell = ({
25
26
  dataSource
26
27
  } = (0, _react.useContext)(_useContext.TableContext);
27
28
  const col = column.columnDef.meta ?? {};
28
- const colFormat = typeof col.format === 'function' ? col.format({}) : col.format;
29
+ const isCustomFooter = footerRow !== undefined;
30
+ const field = col.field;
31
+ const hasFooterValue = isCustomFooter && Object.prototype.hasOwnProperty.call(footerRow, field) && footerRow[field] != null;
32
+ const colFormat = typeof col.format === 'function' ? col.format(footerRow ?? {}) : col.format;
29
33
  const cellFormat = (0, _utils.getFormat)(colFormat, format);
30
34
  const thousandSeparator = cellFormat?.thousandSeparator;
31
35
  const decimalSeparator = cellFormat?.decimalSeparator;
@@ -34,7 +38,7 @@ const TableFooterCell = ({
34
38
  const dec = cellFormat?.decimalScale;
35
39
 
36
40
  // const sumValue = col.type === 'number' ? sumDataByField(filterDataByColumns4(dataSource, filterStates) as any[], col?.key as string) : 0
37
- const sumValue = col.type === 'number' ? (0, _hooks.sumByField)(dataSource, col?.field) : 0;
41
+ const sumValue = col.type === 'number' ? isCustomFooter ? hasFooterValue ? Number(footerRow[field]) : 0 : (0, _hooks.sumByField)(dataSource, field) : 0;
38
42
  const value = !(0, _utils.isEmpty)(sumValue) ? dec || dec === 0 ? parseFloat(Number(sumValue).toFixed(dec)).toString() : sumValue.toString() : '0';
39
43
  const cellValue = col.type === 'number' && col.isSummary !== false ? value : '';
40
44
  const numberValue = Number(value);
@@ -47,6 +51,7 @@ const TableFooterCell = ({
47
51
  decimalScale: dec,
48
52
  fixedDecimalScale: cellFormat?.fixedDecimalScale ?? false
49
53
  };
54
+ const content = isCustomFooter && (!hasFooterValue || col.isSummary === false) ? '' : col.summaryTemplate ? col.summaryTemplate(numberValue, field) : isCustomFooter && col.type !== 'number' ? footerRow[field] : (0, _reactNumericComponent.numericFormatter)(cellValue, numericFormatProps);
50
55
  return /*#__PURE__*/_react.default.createElement("div", {
51
56
  // ref={el => {
52
57
  // if (el) columnVirtualizer.measureElement(el)
@@ -70,6 +75,6 @@ const TableFooterCell = ({
70
75
  minWidth: column?.getSize()
71
76
  // backgroundColor: "#fafafa",
72
77
  }
73
- }, column.id !== "id" && column.id !== "selection_column" ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, col.summaryTemplate ? col.summaryTemplate(numberValue, col.field) : (0, _reactNumericComponent.numericFormatter)(cellValue, numericFormatProps)) : '');
78
+ }, column.id !== "id" && column.id !== "selection_column" ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, content) : '');
74
79
  };
75
80
  var _default = exports.default = TableFooterCell;
@@ -2,7 +2,8 @@
2
2
  import type { HeaderGroup, Table } from "@tanstack/react-table";
3
3
  interface TableFooterRowProps<T> {
4
4
  table: Table<T>;
5
+ footerRow?: Record<string, any>;
5
6
  headerGroup: HeaderGroup<T>;
6
7
  }
7
- declare const TableFooterRow: <RecordType extends object>({ table, headerGroup, }: TableFooterRowProps<RecordType>) => JSX.Element;
8
+ declare const TableFooterRow: <RecordType extends object>({ table, headerGroup, footerRow, }: TableFooterRowProps<RecordType>) => JSX.Element;
8
9
  export default TableFooterRow;
@@ -10,7 +10,8 @@ var _react = _interopRequireDefault(require("react"));
10
10
  var _useContext = require("../useContext");
11
11
  const TableFooterRow = ({
12
12
  table,
13
- headerGroup
13
+ headerGroup,
14
+ footerRow
14
15
  }) => {
15
16
  const visibleColumns = table.getVisibleLeafColumns();
16
17
  const {
@@ -30,7 +31,8 @@ const TableFooterRow = ({
30
31
  }, visibleColumns.map(header => {
31
32
  return /*#__PURE__*/_react.default.createElement(_TableFooterCell.default, {
32
33
  key: header.id,
33
- column: header
34
+ column: header,
35
+ footerRow: footerRow
34
36
  });
35
37
  }));
36
38
  };
@@ -11,6 +11,7 @@ type Props<T> = {
11
11
  height: number;
12
12
  minHeight?: number;
13
13
  table: Table<T>;
14
+ footerDataSource?: any[];
14
15
  summary?: boolean;
15
16
  loading?: boolean;
16
17
  commandClick?: (args: Omit<CommandClick<T>, 'rows'>) => void;
@@ -241,9 +241,10 @@ const TableWrapper = props => {
241
241
  virtualPaddingRight: virtualPaddingRight,
242
242
  fixedLeftColumns: fixedLeftColumns,
243
243
  fixedRightColumns: fixedRightColumns
244
- }), summary && /*#__PURE__*/_react.default.createElement(_TableFooter.default
245
- // columnVirtualizer={columnVirtualizer}
246
- , {
244
+ }), summary && /*#__PURE__*/_react.default.createElement(_TableFooter.default, {
245
+ footerDataSource: props.footerDataSource
246
+ // columnVirtualizer={columnVirtualizer}
247
+ ,
247
248
  table: table
248
249
  // virtualPaddingLeft={virtualPaddingLeft}
249
250
  // virtualPaddingRight={virtualPaddingRight}
@@ -357,7 +357,9 @@ const TableContainer = props => {
357
357
  setIsExpandClick,
358
358
  maxDepth
359
359
  }
360
- }, /*#__PURE__*/_react.default.createElement(_TableWrapper.default, (0, _extends2.default)({}, rest, {
360
+ }, /*#__PURE__*/_react.default.createElement(_TableWrapper.default, (0, _extends2.default)({
361
+ footerDataSource: props.footerDataSource
362
+ }, rest, {
361
363
  contextMenuItems: contextMenuItems,
362
364
  height: tableHeight,
363
365
  minHeight: minHeight,
@@ -2276,7 +2276,9 @@ const TableContainerEdit = props => {
2276
2276
  setIsExpandClick,
2277
2277
  isAddAble
2278
2278
  }
2279
- }, /*#__PURE__*/_react.default.createElement(_TableWrapper.default, (0, _extends2.default)({}, rest, {
2279
+ }, /*#__PURE__*/_react.default.createElement(_TableWrapper.default, (0, _extends2.default)({
2280
+ footerDataSource: props.footerDataSource
2281
+ }, rest, {
2280
2282
  contextMenuItems: contextMenuItems,
2281
2283
  height: tableHeight,
2282
2284
  minHeight: minHeight,
@@ -2,6 +2,7 @@
2
2
  import type { Table } from "@tanstack/react-table";
3
3
  interface TableFooterProps<T> {
4
4
  table: Table<T>;
5
+ footerDataSource?: any[];
5
6
  }
6
- declare const TableFooter: <RecordType extends object>({ table, }: TableFooterProps<RecordType>) => JSX.Element;
7
+ declare const TableFooter: <RecordType extends object>({ table, footerDataSource, }: TableFooterProps<RecordType>) => JSX.Element;
7
8
  export default TableFooter;
@@ -14,7 +14,8 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
14
14
 
15
15
  const TableFooter = ({
16
16
  // columnVirtualizer,
17
- table
17
+ table,
18
+ footerDataSource
18
19
  // virtualPaddingLeft,
19
20
  // virtualPaddingRight,
20
21
  // ...rest
@@ -30,15 +31,11 @@ const TableFooter = ({
30
31
  bottom: 0,
31
32
  zIndex: 1
32
33
  }
33
- }, /*#__PURE__*/_react.default.createElement(_TableFooterRow.default, {
34
- table: table
35
- // columnVirtualizer={columnVirtualizer}
36
- ,
37
- headerGroup: table.getHeaderGroups()[table.getHeaderGroups().length - 1]
38
- // key={headerGroup.id}
39
- // virtualPaddingLeft={virtualPaddingLeft}
40
- // virtualPaddingRight={virtualPaddingRight}
41
- // {...rest}
42
- }));
34
+ }, (footerDataSource ?? [undefined]).map((footerRow, index) => /*#__PURE__*/_react.default.createElement(_TableFooterRow.default, {
35
+ key: index,
36
+ table: table,
37
+ headerGroup: table.getHeaderGroups()[table.getHeaderGroups().length - 1],
38
+ footerRow: footerRow
39
+ })));
43
40
  };
44
41
  var _default = exports.default = TableFooter;
@@ -2,6 +2,7 @@
2
2
  import type { Column } from "@tanstack/react-table";
3
3
  interface TableFooterCellProps<T> {
4
4
  column: Column<T, any>;
5
+ footerRow?: Record<string, any>;
5
6
  }
6
- declare const TableFooterCell: <RecordType extends object>({ column }: TableFooterCellProps<RecordType>) => JSX.Element;
7
+ declare const TableFooterCell: <RecordType extends object>({ column, footerRow }: TableFooterCellProps<RecordType>) => JSX.Element;
7
8
  export default TableFooterCell;
@@ -14,7 +14,8 @@ var _reactNumericComponent = require("react-numeric-component");
14
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
15
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
16
  const TableFooterCell = ({
17
- column
17
+ column,
18
+ footerRow
18
19
  }) => {
19
20
  const isPinned = column.getIsPinned();
20
21
  const isLastLeftPinnedColumn = isPinned === 'left' && column.getIsLastColumn('left');
@@ -25,7 +26,10 @@ const TableFooterCell = ({
25
26
  dataSource
26
27
  } = (0, _react.useContext)(_useContext.TableContext);
27
28
  const col = column.columnDef.meta ?? {};
28
- const colFormat = typeof col.format === 'function' ? col.format({}) : col.format;
29
+ const isCustomFooter = footerRow !== undefined;
30
+ const field = col.field;
31
+ const hasFooterValue = isCustomFooter && Object.prototype.hasOwnProperty.call(footerRow, field) && footerRow[field] != null;
32
+ const colFormat = typeof col.format === 'function' ? col.format(footerRow ?? {}) : col.format;
29
33
  const cellFormat = (0, _utils.getFormat)(colFormat, format);
30
34
  const thousandSeparator = cellFormat?.thousandSeparator;
31
35
  const decimalSeparator = cellFormat?.decimalSeparator;
@@ -34,7 +38,7 @@ const TableFooterCell = ({
34
38
  const dec = cellFormat?.decimalScale;
35
39
 
36
40
  // const sumValue = col.type === 'number' ? sumDataByField(filterDataByColumns4(dataSource, filterStates) as any[], col?.key as string) : 0
37
- const sumValue = col.type === 'number' ? (0, _hooks.sumByField)(dataSource, col?.field) : 0;
41
+ const sumValue = col.type === 'number' ? isCustomFooter ? hasFooterValue ? Number(footerRow[field]) : 0 : (0, _hooks.sumByField)(dataSource, field) : 0;
38
42
  const value = !(0, _utils.isEmpty)(sumValue) ? dec || dec === 0 ? parseFloat(Number(sumValue).toFixed(dec)).toString() : sumValue.toString() : '0';
39
43
  const cellValue = col.type === 'number' && col.isSummary !== false ? value : '';
40
44
  const numberValue = Number(value);
@@ -47,6 +51,7 @@ const TableFooterCell = ({
47
51
  decimalScale: dec,
48
52
  fixedDecimalScale: cellFormat?.fixedDecimalScale ?? false
49
53
  };
54
+ const content = isCustomFooter && (!hasFooterValue || col.isSummary === false) ? '' : col.summaryTemplate ? col.summaryTemplate(numberValue, field) : isCustomFooter && col.type !== 'number' ? footerRow[field] : (0, _reactNumericComponent.numericFormatter)(cellValue, numericFormatProps);
50
55
  return /*#__PURE__*/_react.default.createElement("div", {
51
56
  // ref={el => {
52
57
  // if (el) columnVirtualizer.measureElement(el)
@@ -70,6 +75,6 @@ const TableFooterCell = ({
70
75
  minWidth: column?.getSize()
71
76
  // backgroundColor: "#fafafa",
72
77
  }
73
- }, column.id !== "id" && column.id !== "selection_column" ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, col.summaryTemplate ? col.summaryTemplate(numberValue, col.field) : (0, _reactNumericComponent.numericFormatter)(cellValue, numericFormatProps)) : '');
78
+ }, column.id !== "id" && column.id !== "selection_column" ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, content) : '');
74
79
  };
75
80
  var _default = exports.default = TableFooterCell;
@@ -2,7 +2,8 @@
2
2
  import type { HeaderGroup, Table } from "@tanstack/react-table";
3
3
  interface TableFooterRowProps<T> {
4
4
  table: Table<T>;
5
+ footerRow?: Record<string, any>;
5
6
  headerGroup: HeaderGroup<T>;
6
7
  }
7
- declare const TableFooterRow: <RecordType extends object>({ table, headerGroup, }: TableFooterRowProps<RecordType>) => JSX.Element;
8
+ declare const TableFooterRow: <RecordType extends object>({ table, headerGroup, footerRow, }: TableFooterRowProps<RecordType>) => JSX.Element;
8
9
  export default TableFooterRow;
@@ -10,7 +10,8 @@ var _react = _interopRequireDefault(require("react"));
10
10
  var _useContext = require("../useContext");
11
11
  const TableFooterRow = ({
12
12
  table,
13
- headerGroup
13
+ headerGroup,
14
+ footerRow
14
15
  }) => {
15
16
  const visibleColumns = table.getVisibleLeafColumns();
16
17
  const {
@@ -30,7 +31,8 @@ const TableFooterRow = ({
30
31
  }, visibleColumns.map(header => {
31
32
  return /*#__PURE__*/_react.default.createElement(_TableFooterCell.default, {
32
33
  key: header.id,
33
- column: header
34
+ column: header,
35
+ footerRow: footerRow
34
36
  });
35
37
  }));
36
38
  };
@@ -11,6 +11,7 @@ type Props<T> = {
11
11
  minHeight?: number;
12
12
  table: Table<T>;
13
13
  showHeader?: boolean;
14
+ footerDataSource?: any[];
14
15
  summary?: boolean;
15
16
  loading?: boolean;
16
17
  commandClick?: (args: Omit<CommandClick<T>, 'rows'>) => void;
@@ -294,9 +294,10 @@ const TableWrapper = props => {
294
294
  virtualPaddingRight: virtualPaddingRight,
295
295
  fixedLeftColumns: fixedLeftColumns,
296
296
  fixedRightColumns: fixedRightColumns
297
- }), summary && /*#__PURE__*/_react.default.createElement(_TableFooter.default
298
- // columnVirtualizer={columnVirtualizer}
299
- , {
297
+ }), summary && /*#__PURE__*/_react.default.createElement(_TableFooter.default, {
298
+ footerDataSource: props.footerDataSource
299
+ // columnVirtualizer={columnVirtualizer}
300
+ ,
300
301
  table: table
301
302
  // virtualPaddingLeft={virtualPaddingLeft}
302
303
  // virtualPaddingRight={virtualPaddingRight}
@@ -92,6 +92,7 @@ const InternalTable = props => {
92
92
  const [columnResizeMode] = _react.default.useState('onChange');
93
93
  const [columnResizeDirection] = _react.default.useState('ltr');
94
94
  const [rowSelection, setRowSelection] = _react.default.useState({});
95
+ const pruneSelection = selectionSettings?.pruneSelection === true;
95
96
 
96
97
  // const [grouping, setGrouping] = React.useState<GroupingState>([])
97
98
 
@@ -128,6 +129,9 @@ const InternalTable = props => {
128
129
  return (0, _utils.isTreeArray)(originData);
129
130
  }, [originData]);
130
131
  _react.default.useEffect(() => {
132
+ if (pruneSelection) {
133
+ return;
134
+ }
131
135
  if (groupColumns && groupColumns.length > 0 && groupSetting?.client !== false && isDataOriginTree === false) {
132
136
  const abc = (0, _utils.groupArrayByColumns)(originData, groupColumns);
133
137
  const rs = (0, _utils.filterDataByColumns)(abc, filterStates, sorterStates, []);
@@ -136,9 +140,48 @@ const InternalTable = props => {
136
140
  const rs = (0, _utils.filterDataByColumns)(originData, filterStates, sorterStates, []);
137
141
  setTableData(rs);
138
142
  }
139
- }, [groupColumns, originData, filterStates, sorterStates, groupSetting?.client, isDataOriginTree]);
143
+ }, [groupColumns, originData, filterStates, sorterStates, groupSetting?.client, isDataOriginTree, pruneSelection]);
140
144
  // }, [groupColumns, originData, filterStates, sorterStates, groupSetting?.client])
141
145
 
146
+ // Resolve the opt-in view before paint, including inline grouping arrays.
147
+ const groupColumnsKey = JSON.stringify(groupColumns ?? []);
148
+ const viewData = _react.default.useMemo(() => {
149
+ if (!pruneSelection) {
150
+ return tableData;
151
+ }
152
+ const groups = JSON.parse(groupColumnsKey);
153
+ const grouped = groups.length && groupSetting?.client !== false && !isDataOriginTree ? (0, _utils.groupArrayByColumns)(originData, groups) : originData;
154
+ return (0, _utils.filterDataByColumns)(grouped, filterStates, sorterStates, []);
155
+ }, [pruneSelection, tableData, groupColumnsKey, originData, groupSetting?.client, isDataOriginTree, filterStates, sorterStates]);
156
+ const effectiveRowSelection = _react.default.useMemo(() => {
157
+ if (!pruneSelection || props.loading) {
158
+ return rowSelection;
159
+ }
160
+ const ids = new Set((0, _utils.flattenArray)(viewData).map(row => String(row.rowId)));
161
+ const next = Object.fromEntries(Object.entries(rowSelection).filter(([selectedId, checked]) => checked && ids.has(selectedId)));
162
+
163
+ // A group can stay checked only if its remaining real children are checked.
164
+ const checkGroups = rows => {
165
+ rows.forEach(row => {
166
+ if (row.isGroupRow && next[String(row.rowId)]) {
167
+ const children = (0, _utils.flattenData)('children', row.children ?? []).filter(child => !child.isGroupRow && !selectionSettings?.getCheckboxProps?.(child)?.disabled);
168
+ if (!children.length || children.some(child => !next[String(child.rowId)])) {
169
+ delete next[String(row.rowId)];
170
+ }
171
+ }
172
+ if (Array.isArray(row.children)) {
173
+ checkGroups(row.children);
174
+ }
175
+ });
176
+ };
177
+ checkGroups(viewData);
178
+ return Object.keys(next).length === Object.keys(rowSelection).length ? rowSelection : next;
179
+ }, [pruneSelection, props.loading, rowSelection, viewData, selectionSettings?.getCheckboxProps]);
180
+ _react.default.useEffect(() => {
181
+ if (effectiveRowSelection !== rowSelection) {
182
+ setRowSelection(prev => prev === rowSelection ? effectiveRowSelection : prev);
183
+ }
184
+ }, [effectiveRowSelection, rowSelection]);
142
185
  _react.default.useEffect(() => {
143
186
  // setColumns(updateWidthsByOther(propsColumns, columns))
144
187
  setColumns(propsColumns);
@@ -152,8 +195,8 @@ const InternalTable = props => {
152
195
  });
153
196
  }, [t, columns, format, editAble]);
154
197
  const isDataTree = _react.default.useMemo(() => {
155
- return (0, _utils.isTreeArray)(tableData);
156
- }, [tableData]);
198
+ return (0, _utils.isTreeArray)(viewData);
199
+ }, [viewData]);
157
200
  const columnPinning = _react.default.useMemo(() => {
158
201
  return {
159
202
  left: (0, _utils.getFixedFields)(columns, 'left'),
@@ -213,11 +256,11 @@ const InternalTable = props => {
213
256
  };
214
257
  const table = (0, _reactTable.useReactTable)({
215
258
  _features: [_operator.OperatorFeature],
216
- data: tableData,
259
+ data: viewData,
217
260
  // data: mergedData,
218
261
  columns: mergedColumns,
219
262
  state: {
220
- rowSelection,
263
+ rowSelection: effectiveRowSelection,
221
264
  expanded,
222
265
  columnPinning,
223
266
  columnVisibility: columnsHiddenKeys ? (0, _utils.convertToObj)(columnsHiddenKeys) : columnVisibility,
@@ -292,20 +335,20 @@ const InternalTable = props => {
292
335
  _react.default.useEffect(() => {
293
336
  if (expandable?.preserveExpandedOnDataChange) {
294
337
  // Chờ cây có dữ liệu mới khởi tạo; những lần thay đổi tableData sau đó không reset expanded.
295
- if (initializedExpansionRef.current || tableData.length === 0) {
338
+ if (initializedExpansionRef.current || viewData.length === 0) {
296
339
  return;
297
340
  }
298
341
  initializedExpansionRef.current = true;
299
342
  }
300
343
  if (defaultExpandAllRows) {
301
- const allKeys = (0, _utils.findAllChildrenKeys2)(tableData, rowKey, 'children');
344
+ const allKeys = (0, _utils.findAllChildrenKeys2)(viewData, rowKey, 'children');
302
345
  setExpanded((0, _utils.convertToObjTrue)(allKeys));
303
346
  } else {
304
347
  if (defaultExpandedRowKeys) {
305
348
  setExpanded((0, _utils.convertToObjTrue)(defaultExpandedRowKeys ?? []));
306
349
  }
307
350
  }
308
- }, [defaultExpandAllRows, defaultExpandedRowKeys, tableData, expandable?.preserveExpandedOnDataChange]);
351
+ }, [defaultExpandAllRows, defaultExpandedRowKeys, viewData, expandable?.preserveExpandedOnDataChange]);
309
352
  const triggerGroupColumns = groupedColumns => {
310
353
  // const abc = updateColumnsByGroup(columns, groupedColumns)
311
354
 
@@ -392,7 +435,7 @@ const InternalTable = props => {
392
435
  originData: originData
393
436
  // dataSource={mergedData}
394
437
  ,
395
- dataSource: tableData,
438
+ dataSource: viewData,
396
439
  locale: locale,
397
440
  format: format
398
441
  // columns={convertColumns(mergedColumns)}
@@ -427,7 +470,7 @@ const InternalTable = props => {
427
470
  columnSizing: columnSizing,
428
471
  columnSizingInfo: columnSizingInfo,
429
472
  setColumnSizing: setColumnSizing,
430
- rowSelection: rowSelection,
473
+ rowSelection: effectiveRowSelection,
431
474
  pagination: pagination
432
475
  })))));
433
476
  };