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.
- package/es/grid-component/type.d.ts +3 -1
- package/es/group-component/TableContainer.js +1 -0
- package/es/group-component/TableContainerEdit.js +1 -0
- package/es/group-component/footer/TableFooter.d.ts +2 -1
- package/es/group-component/footer/TableFooter.js +8 -11
- package/es/group-component/footer/TableFooterCell.d.ts +2 -1
- package/es/group-component/footer/TableFooterCell.js +9 -4
- package/es/group-component/footer/TableFooterRow.d.ts +2 -1
- package/es/group-component/footer/TableFooterRow.js +4 -2
- package/es/group-component/table/TableWrapper.d.ts +1 -0
- package/es/group-component/table/TableWrapper.js +4 -3
- package/es/table-component/TableContainer.js +3 -1
- package/es/table-component/TableContainerEdit.js +3 -1
- package/es/table-component/footer/TableFooter.d.ts +2 -1
- package/es/table-component/footer/TableFooter.js +8 -11
- package/es/table-component/footer/TableFooterCell.d.ts +2 -1
- package/es/table-component/footer/TableFooterCell.js +9 -4
- package/es/table-component/footer/TableFooterRow.d.ts +2 -1
- package/es/table-component/footer/TableFooterRow.js +4 -2
- package/es/table-component/table/TableWrapper.d.ts +1 -0
- package/es/table-component/table/TableWrapper.js +4 -3
- package/es/table-virtuoso/InternalTable.js +54 -11
- package/es/table-virtuoso/footer/TableFooterCell.d.ts +2 -1
- package/es/table-virtuoso/footer/TableFooterCell.js +9 -4
- package/es/table-virtuoso/table/Grid.js +37 -8
- package/es/table-virtuoso/table/TableContainer.js +3 -1
- package/es/table-virtuoso/table/TableWrapper.d.ts +1 -0
- package/es/table-virtuoso/table/TableWrapper.js +7 -7
- package/lib/grid-component/type.d.ts +3 -1
- package/lib/group-component/TableContainer.js +1 -0
- package/lib/group-component/TableContainerEdit.js +1 -0
- package/lib/group-component/footer/TableFooter.d.ts +2 -1
- package/lib/group-component/footer/TableFooter.js +8 -11
- package/lib/group-component/footer/TableFooterCell.d.ts +2 -1
- package/lib/group-component/footer/TableFooterCell.js +9 -4
- package/lib/group-component/footer/TableFooterRow.d.ts +2 -1
- package/lib/group-component/footer/TableFooterRow.js +4 -2
- package/lib/group-component/table/TableWrapper.d.ts +1 -0
- package/lib/group-component/table/TableWrapper.js +4 -3
- package/lib/table-component/TableContainer.js +3 -1
- package/lib/table-component/TableContainerEdit.js +3 -1
- package/lib/table-component/footer/TableFooter.d.ts +2 -1
- package/lib/table-component/footer/TableFooter.js +8 -11
- package/lib/table-component/footer/TableFooterCell.d.ts +2 -1
- package/lib/table-component/footer/TableFooterCell.js +9 -4
- package/lib/table-component/footer/TableFooterRow.d.ts +2 -1
- package/lib/table-component/footer/TableFooterRow.js +4 -2
- package/lib/table-component/table/TableWrapper.d.ts +1 -0
- package/lib/table-component/table/TableWrapper.js +4 -3
- package/lib/table-virtuoso/InternalTable.js +53 -10
- package/lib/table-virtuoso/footer/TableFooterCell.d.ts +2 -1
- package/lib/table-virtuoso/footer/TableFooterCell.js +9 -4
- package/lib/table-virtuoso/table/Grid.js +37 -8
- package/lib/table-virtuoso/table/TableContainer.js +3 -1
- package/lib/table-virtuoso/table/TableWrapper.d.ts +1 -0
- package/lib/table-virtuoso/table/TableWrapper.js +7 -7
- 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
|
|
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
|
-
|
|
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,
|
|
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:
|
|
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:
|
|
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({
|
|
294
|
+
}, /*#__PURE__*/React.createElement(TableWrapper, _extends({
|
|
295
|
+
footerDataSource: props.footerDataSource
|
|
296
|
+
}, rest, {
|
|
295
297
|
tableContainerRef: tableContainerRef,
|
|
296
298
|
prefix: prefix,
|
|
297
299
|
id: id,
|
|
@@ -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(
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
,
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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
|
};
|
|
@@ -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
|
-
|
|
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)({
|
|
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)({
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
,
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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
|
};
|
|
@@ -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
|
-
|
|
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)(
|
|
156
|
-
}, [
|
|
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:
|
|
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 ||
|
|
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)(
|
|
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,
|
|
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:
|
|
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:
|
|
473
|
+
rowSelection: effectiveRowSelection,
|
|
431
474
|
pagination: pagination
|
|
432
475
|
})))));
|
|
433
476
|
};
|