@rainbow-oh/yee-c 0.8.12 → 0.8.13

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 (67) hide show
  1. package/dist/cjs/Table/col-group.d.ts +2 -2
  2. package/dist/cjs/Table/col-group.js +1 -1
  3. package/dist/cjs/Table/demo/sorter-callback.js +3 -2
  4. package/dist/cjs/Table/demo/sorter.js +3 -2
  5. package/dist/cjs/Table/hooks/useExpand.d.ts +2 -2
  6. package/dist/cjs/Table/hooks/useFilter.d.ts +8 -2
  7. package/dist/cjs/Table/hooks/useFilter.js +36 -22
  8. package/dist/cjs/Table/hooks/usePagination.js +8 -8
  9. package/dist/cjs/Table/hooks/useSelection.d.ts +3 -3
  10. package/dist/cjs/Table/hooks/useSelection.js +8 -9
  11. package/dist/cjs/Table/hooks/useSorter.d.ts +6 -3
  12. package/dist/cjs/Table/hooks/useSorter.js +193 -87
  13. package/dist/cjs/Table/interface.d.ts +10 -7
  14. package/dist/cjs/Table/table.js +51 -45
  15. package/dist/cjs/Table/tbody/index.js +13 -5
  16. package/dist/cjs/Table/tbody/lazy-row.js +6 -3
  17. package/dist/cjs/Table/tbody/row.js +5 -4
  18. package/dist/cjs/Table/theader/cell.js +4 -0
  19. package/dist/cjs/Table/theader/filter.js +52 -20
  20. package/dist/cjs/Table/util/index.js +5 -3
  21. package/dist/cjs/style/themes.css +1 -1
  22. package/dist/cjs/style/variables.css +1 -1
  23. package/dist/cjs/version.d.ts +1 -1
  24. package/dist/cjs/version.js +1 -1
  25. package/dist/esm/Table/col-group.d.ts +2 -2
  26. package/dist/esm/Table/col-group.js +1 -1
  27. package/dist/esm/Table/demo/sorter-callback.js +3 -2
  28. package/dist/esm/Table/demo/sorter.js +3 -2
  29. package/dist/esm/Table/hooks/useExpand.d.ts +2 -2
  30. package/dist/esm/Table/hooks/useFilter.d.ts +8 -2
  31. package/dist/esm/Table/hooks/useFilter.js +52 -32
  32. package/dist/esm/Table/hooks/usePagination.js +8 -10
  33. package/dist/esm/Table/hooks/useSelection.d.ts +3 -3
  34. package/dist/esm/Table/hooks/useSelection.js +16 -11
  35. package/dist/esm/Table/hooks/useSorter.d.ts +6 -3
  36. package/dist/esm/Table/hooks/useSorter.js +218 -105
  37. package/dist/esm/Table/interface.d.ts +10 -7
  38. package/dist/esm/Table/table.js +42 -47
  39. package/dist/esm/Table/tbody/index.js +8 -5
  40. package/dist/esm/Table/tbody/lazy-row.js +7 -3
  41. package/dist/esm/Table/tbody/row.js +7 -6
  42. package/dist/esm/Table/theader/cell.js +7 -1
  43. package/dist/esm/Table/theader/filter.js +75 -27
  44. package/dist/esm/Table/util/index.js +6 -3
  45. package/dist/esm/style/themes.css +1 -1
  46. package/dist/esm/style/variables.css +1 -1
  47. package/dist/esm/version.d.ts +1 -1
  48. package/dist/esm/version.js +1 -1
  49. package/dist/umd/yee-c.min.js +1 -1
  50. package/package.json +1 -1
  51. package/src/Table/col-group.tsx +1 -1
  52. package/src/Table/demo/sorter-callback.tsx +3 -2
  53. package/src/Table/demo/sorter.tsx +3 -2
  54. package/src/Table/hooks/useExpand.ts +3 -3
  55. package/src/Table/hooks/useFilter.ts +47 -23
  56. package/src/Table/hooks/usePagination.ts +9 -10
  57. package/src/Table/hooks/useSelection.ts +18 -20
  58. package/src/Table/hooks/useSorter.ts +236 -82
  59. package/src/Table/interface.ts +19 -7
  60. package/src/Table/table.tsx +54 -49
  61. package/src/Table/tbody/index.tsx +14 -5
  62. package/src/Table/tbody/lazy-row.tsx +6 -3
  63. package/src/Table/tbody/row.tsx +5 -4
  64. package/src/Table/theader/cell.tsx +10 -0
  65. package/src/Table/theader/filter.tsx +64 -22
  66. package/src/Table/util/index.ts +3 -1
  67. package/src/version.ts +1 -1
@@ -77,16 +77,6 @@ export default function usePagination(_ref) {
77
77
  pageSize: pageSize
78
78
  });
79
79
  };
80
- if (pagination === false) {
81
- return {
82
- pageData: data,
83
- current: 1,
84
- pageSize: data.length,
85
- pagination: false
86
- };
87
- }
88
-
89
- // eslint-disable-next-line react-hooks/rules-of-hooks
90
80
  var pageData = useMemo(function () {
91
81
  var total = data.length;
92
82
  if (total <= mergedPageSize) return data;
@@ -98,6 +88,14 @@ export default function usePagination(_ref) {
98
88
  var start = (current - 1) * mergedPageSize;
99
89
  return data.slice(start, start + mergedPageSize);
100
90
  }, [data, meregdCurrent, mergedPageSize]);
91
+ if (pagination === false) {
92
+ return {
93
+ pageData: data,
94
+ current: 1,
95
+ pageSize: data.length,
96
+ pagination: false
97
+ };
98
+ }
101
99
  return {
102
100
  pageData: pageData,
103
101
  current: meregdCurrent,
@@ -3,15 +3,15 @@ import type { RowSelectionType, SelectionKeyType } from '../interface';
3
3
  export default function useSelection({ pageData, dataSource: data, getRowKey, rowSelection, allKeys, }: {
4
4
  pageData: Array<Record<string, unknown>>;
5
5
  dataSource: Array<Record<string, unknown>>;
6
- getRowKey: (record: Record<string, unknown>) => string;
6
+ getRowKey: (record: Record<string, unknown>) => SelectionKeyType;
7
7
  allKeys: Array<SelectionKeyType>;
8
8
  rowSelection?: RowSelectionType;
9
9
  }): {
10
10
  selectedRowKeys: (string | number)[];
11
11
  checkedAll: boolean;
12
- pageDataRowKeys: string[];
12
+ pageDataRowKeys: SelectionKeyType[];
13
13
  onCheck: (checked: boolean, key: number | string) => void;
14
14
  onCheckAll: (event: ChangeEvent<HTMLInputElement>) => void;
15
15
  onRadioCheck: (checked: boolean, key: number | string) => void;
16
- onChange: (event: ChangeEvent<HTMLInputElement>) => void;
16
+ onChange: (event: ChangeEvent<HTMLInputElement>, key: SelectionKeyType) => void;
17
17
  };
@@ -40,11 +40,20 @@ export default function useSelection(_ref) {
40
40
  onChange === null || onChange === void 0 || onChange(rowKeys, rowRecords);
41
41
  };
42
42
  var getDisabledKeys = function getDisabledKeys() {
43
+ if (disabled === true) {
44
+ return pageData.map(function (record) {
45
+ return getRowKey(record);
46
+ });
47
+ }
43
48
  if (Array.isArray(disabled)) {
44
- return disabled;
49
+ return pageData.filter(function (_, index) {
50
+ return disabled[index];
51
+ }).map(function (record) {
52
+ return getRowKey(record);
53
+ });
45
54
  }
46
55
  if (typeof disabled === 'function') {
47
- return Array.isArray(pageData) && pageData.filter(function (record, index) {
56
+ return pageData.filter(function (record, index) {
48
57
  return disabled(record, index);
49
58
  }).map(function (record) {
50
59
  return getRowKey(record);
@@ -52,13 +61,10 @@ export default function useSelection(_ref) {
52
61
  }
53
62
  return [];
54
63
  };
55
- var getPageDataRowKeys = function getPageDataRowKeys() {
56
- return Array.isArray(pageData) && pageData.map(function (record) {
57
- return getRowKey(record);
58
- });
59
- };
60
64
  var disabledKeys = getDisabledKeys();
61
- var pageDataRowKeys = getPageDataRowKeys();
65
+ var pageDataRowKeys = pageData.map(function (record) {
66
+ return getRowKey(record);
67
+ });
62
68
  var isCheckedAll = function isCheckedAll() {
63
69
  var filtered = pageDataRowKeys.filter(function (key) {
64
70
  return !disabledKeys.includes(key);
@@ -93,7 +99,7 @@ export default function useSelection(_ref) {
93
99
  });
94
100
  setMergedSelectedRowKeys(rowKeys);
95
101
  onChange === null || onChange === void 0 || onChange(rowKeys, rowRecords);
96
- onSelectAll === null || onSelectAll === void 0 || onSelectAll(rowKeys, rowRecords, checked);
102
+ onSelectAll === null || onSelectAll === void 0 || onSelectAll(checked, rowKeys, rowRecords);
97
103
  };
98
104
  var onRadioCheck = function onRadioCheck(checked, key) {
99
105
  var record = pageData.find(function (item) {
@@ -102,8 +108,7 @@ export default function useSelection(_ref) {
102
108
  setMergedSelectedRowKeys([key]);
103
109
  onChange === null || onChange === void 0 || onChange([key], record);
104
110
  };
105
- var handleChange = function handleChange(event) {
106
- var key = event.target.value;
111
+ var handleChange = function handleChange(event, key) {
107
112
  var checked = event.target.checked;
108
113
  if (type === 'checkbox') {
109
114
  onCheck(checked, key);
@@ -1,6 +1,9 @@
1
1
  import { ColumnProps } from '../interface';
2
- type SortState = {
3
- [dataIndex: string]: 0 | 1 | -1;
2
+ type SortOrder = 1 | -1;
3
+ type SortState = Record<string, SortOrder>;
4
+ type SortChangeResult = {
5
+ data: Array<Record<string, unknown>>;
6
+ sorters: SortState;
4
7
  };
5
8
  export default function useSorter({ data, columns, }: {
6
9
  data: Array<Record<string, unknown>>;
@@ -8,6 +11,6 @@ export default function useSorter({ data, columns, }: {
8
11
  }): {
9
12
  data: Record<string, unknown>[];
10
13
  sorters: SortState;
11
- onSort: (dataIndex: string) => void;
14
+ onSort: (dataIndex: string) => SortChangeResult;
12
15
  };
13
16
  export {};
@@ -1,122 +1,235 @@
1
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
4
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
2
5
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
3
6
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
4
7
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
8
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
5
9
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
6
10
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
7
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
8
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
10
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
11
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
12
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
13
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
14
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
11
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
16
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
17
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
18
13
  import { useCallback, useEffect, useMemo, useState } from 'react';
19
- export default function useSorter(_ref) {
20
- var data = _ref.data,
21
- columns = _ref.columns;
22
- var getDefaultSorters = useCallback(function () {
23
- var sorters = {};
24
- columns.forEach(function (column) {
25
- var dataIndex = column.dataIndex,
26
- sorter = column.sorter;
27
- if (!sorter) return;
28
- var _ref2 = typeof sorter === 'boolean' ? {} : sorter,
29
- defaultSortOrder = _ref2.defaultSortOrder;
30
- if (dataIndex && sorter) {
31
- if (defaultSortOrder === 'ascend') {
32
- sorters[dataIndex] = 1;
33
- } else if (defaultSortOrder === 'descend') {
34
- sorters[dataIndex] = -1;
35
- } else {
36
- sorters[dataIndex] = 0;
37
- }
38
- }
39
- });
40
- return sorters;
41
- }, [columns]);
42
- var _useState = useState(getDefaultSorters()),
43
- _useState2 = _slicedToArray(_useState, 2),
44
- sorters = _useState2[0],
45
- setSorters = _useState2[1];
46
-
47
- // when columns changed, reset sorters
48
- useEffect(function () {
49
- setSorters(getDefaultSorters());
50
- }, [getDefaultSorters]);
51
-
52
- // handle sort on column title click
53
- var onSort = function onSort(dataIndex) {
54
- setSorters(function (prev) {
55
- var _newSorters$dataIndex;
56
- var newSorters = _objectSpread({}, prev);
57
- var currentOrder = (_newSorters$dataIndex = newSorters[dataIndex]) !== null && _newSorters$dataIndex !== void 0 ? _newSorters$dataIndex : 0;
58
- if (currentOrder === 0) {
59
- newSorters[dataIndex] = 1;
60
- } else if (currentOrder === 1) {
61
- newSorters[dataIndex] = -1;
62
- } else {
63
- newSorters[dataIndex] = 0;
64
- }
65
-
66
- // is multiple sort
67
- var isMultipleSort = undefined;
68
- if (isMultipleSort) {} else {
69
- Object.keys(newSorters).forEach(function (key) {
70
- if (key !== dataIndex) {
71
- delete newSorters[key];
72
- }
73
- });
74
- }
75
- return newSorters;
14
+ var getSorterConfig = function getSorterConfig(column) {
15
+ return column && _typeof(column.sorter) === 'object' ? column.sorter : undefined;
16
+ };
17
+ var toSortOrder = function toSortOrder(order) {
18
+ if (order === 'ascend') return 1;
19
+ if (order === 'descend') return -1;
20
+ return 0;
21
+ };
22
+ var getNextSortOrder = function getNextSortOrder(order) {
23
+ if (order === 0) return 1;
24
+ if (order === 1) return -1;
25
+ return 0;
26
+ };
27
+ var isMultipleSorter = function isMultipleSorter(column) {
28
+ var _getSorterConfig;
29
+ return Boolean((_getSorterConfig = getSorterConfig(column)) === null || _getSorterConfig === void 0 ? void 0 : _getSorterConfig.multiple);
30
+ };
31
+ var applySortChange = function applySortChange(queue, column, order, columnMap) {
32
+ var _getSorterConfig2;
33
+ var dataIndex = column.dataIndex;
34
+ if (!dataIndex) return queue;
35
+ if (order === 0) {
36
+ return queue.filter(function (item) {
37
+ return item.dataIndex !== dataIndex;
76
38
  });
39
+ }
40
+ var multiple = (_getSorterConfig2 = getSorterConfig(column)) === null || _getSorterConfig2 === void 0 ? void 0 : _getSorterConfig2.multiple;
41
+ var nextItem = {
42
+ dataIndex: dataIndex,
43
+ order: order
77
44
  };
78
- var sorted = useMemo(function () {
79
- var activeSorters = Object.entries(sorters).filter(function (_ref3) {
80
- var _ref4 = _slicedToArray(_ref3, 2),
81
- order = _ref4[1];
82
- return order !== 0;
83
- });
84
- if (activeSorters.length === 0) {
85
- return data;
45
+ if (!multiple) {
46
+ return [nextItem];
47
+ }
48
+ var next = queue.filter(function (item) {
49
+ return item.dataIndex === dataIndex || isMultipleSorter(columnMap.get(item.dataIndex));
50
+ });
51
+ var currentIndex = next.findIndex(function (item) {
52
+ return item.dataIndex === dataIndex;
53
+ });
54
+ if (currentIndex === -1) {
55
+ next.push(nextItem);
56
+ } else {
57
+ next[currentIndex] = nextItem;
58
+ }
59
+ if (typeof multiple === 'number') {
60
+ var limit = Math.max(1, Math.floor(multiple));
61
+ while (next.length > limit) {
62
+ var removeIndex = next.findIndex(function (item) {
63
+ return item.dataIndex !== dataIndex;
64
+ });
65
+ if (removeIndex === -1) break;
66
+ next.splice(removeIndex, 1);
86
67
  }
87
- var sortedData = _toConsumableArray(data).sort(function (a, b) {
88
- var _iterator = _createForOfIteratorHelper(activeSorters),
89
- _step;
90
- try {
91
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
92
- var _step$value = _slicedToArray(_step.value, 2),
93
- _dataIndex = _step$value[0],
94
- order = _step$value[1];
95
- var aValue = a[_dataIndex];
96
- var bValue = b[_dataIndex];
97
-
98
- // Handle undefined/null values
99
- if (aValue === null && bValue === null) continue;
100
- if (aValue === null || aValue === undefined) return 1;
101
- if (bValue === null || bValue === undefined) return -1;
102
-
103
- // Compare values
104
- if (aValue < bValue) {
105
- return order === -1 ? 1 : -1;
106
- }
107
- if (aValue > bValue) {
108
- return order === -1 ? -1 : 1;
68
+ }
69
+ return next;
70
+ };
71
+ var normalizeQueue = function normalizeQueue(queue, columnMap) {
72
+ return queue.reduce(function (next, item) {
73
+ var column = columnMap.get(item.dataIndex);
74
+ return column ? applySortChange(next, column, item.order, columnMap) : next;
75
+ }, []);
76
+ };
77
+ var areQueuesEqual = function areQueuesEqual(a, b) {
78
+ return a.length === b.length && a.every(function (item, index) {
79
+ var _b$index, _b$index2;
80
+ return item.dataIndex === ((_b$index = b[index]) === null || _b$index === void 0 ? void 0 : _b$index.dataIndex) && item.order === ((_b$index2 = b[index]) === null || _b$index2 === void 0 ? void 0 : _b$index2.order);
81
+ });
82
+ };
83
+ var createColumnMap = function createColumnMap(columns) {
84
+ return new Map(columns.filter(function (column) {
85
+ return Boolean(column.dataIndex && column.sorter);
86
+ }).map(function (column) {
87
+ return [column.dataIndex, column];
88
+ }));
89
+ };
90
+ var createInitialQueue = function createInitialQueue(columns, columnMap) {
91
+ return columns.reduce(function (queue, column) {
92
+ var config = getSorterConfig(column);
93
+ var order = toSortOrder((config === null || config === void 0 ? void 0 : config.sortOrder) !== undefined ? config.sortOrder : config === null || config === void 0 ? void 0 : config.defaultSortOrder);
94
+ return order ? applySortChange(queue, column, order, columnMap) : queue;
95
+ }, []);
96
+ };
97
+ var mergeControlledSorters = function mergeControlledSorters(queue, columns, columnMap) {
98
+ var controlledOrders = new Map();
99
+ columns.forEach(function (column) {
100
+ var config = getSorterConfig(column);
101
+ if (column.dataIndex && (config === null || config === void 0 ? void 0 : config.sortOrder) !== undefined) {
102
+ controlledOrders.set(column.dataIndex, toSortOrder(config.sortOrder));
103
+ }
104
+ });
105
+ var uncontrolledQueue = queue.filter(function (item) {
106
+ return !controlledOrders.has(item.dataIndex);
107
+ });
108
+ var controlledQueue = [];
109
+ queue.forEach(function (item) {
110
+ var controlledOrder = controlledOrders.get(item.dataIndex);
111
+ if (controlledOrder === undefined) return;
112
+ controlledOrders.delete(item.dataIndex);
113
+ if (controlledOrder) {
114
+ controlledQueue.push({
115
+ dataIndex: item.dataIndex,
116
+ order: controlledOrder
117
+ });
118
+ }
119
+ });
120
+ columns.forEach(function (column) {
121
+ var dataIndex = column.dataIndex;
122
+ if (!dataIndex) return;
123
+ var controlledOrder = controlledOrders.get(dataIndex);
124
+ if (controlledOrder) {
125
+ controlledQueue.push({
126
+ dataIndex: dataIndex,
127
+ order: controlledOrder
128
+ });
129
+ }
130
+ });
131
+ return normalizeQueue([].concat(_toConsumableArray(uncontrolledQueue), controlledQueue), columnMap);
132
+ };
133
+ var queueToSortState = function queueToSortState(queue) {
134
+ return Object.fromEntries(queue.map(function (_ref) {
135
+ var dataIndex = _ref.dataIndex,
136
+ order = _ref.order;
137
+ return [dataIndex, order];
138
+ }));
139
+ };
140
+ var compareValues = function compareValues(a, b) {
141
+ if (Object.is(a, b)) return 0;
142
+ if (typeof a === 'number' && typeof b === 'number') return a - b;
143
+ if (typeof a === 'bigint' && typeof b === 'bigint') return a < b ? -1 : 1;
144
+ if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();
145
+ if (typeof a === 'boolean' && typeof b === 'boolean') {
146
+ return Number(a) - Number(b);
147
+ }
148
+ return String(a).localeCompare(String(b));
149
+ };
150
+ var sortData = function sortData(data, queue, columnMap) {
151
+ if (!queue.length) return data;
152
+ return _toConsumableArray(data).sort(function (a, b) {
153
+ var _iterator = _createForOfIteratorHelper(queue),
154
+ _step;
155
+ try {
156
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
157
+ var _getSorterConfig3;
158
+ var _step$value = _step.value,
159
+ dataIndex = _step$value.dataIndex,
160
+ order = _step$value.order;
161
+ var aValue = a[dataIndex];
162
+ var bValue = b[dataIndex];
163
+ var compare = (_getSorterConfig3 = getSorterConfig(columnMap.get(dataIndex))) === null || _getSorterConfig3 === void 0 ? void 0 : _getSorterConfig3.sort;
164
+ if (compare) {
165
+ var _result = compare(a, b);
166
+ if (_result !== 0) {
167
+ return order === -1 ? -_result : _result;
109
168
  }
169
+ continue;
170
+ }
171
+ if (aValue === null && bValue === null) continue;
172
+ if (aValue === null || aValue === undefined) return 1;
173
+ if (bValue === null || bValue === undefined) return -1;
174
+ var result = compareValues(aValue, bValue);
175
+ if (result !== 0) {
176
+ return order === -1 ? -result : result;
110
177
  }
111
- } catch (err) {
112
- _iterator.e(err);
113
- } finally {
114
- _iterator.f();
115
178
  }
116
- return 0;
179
+ } catch (err) {
180
+ _iterator.e(err);
181
+ } finally {
182
+ _iterator.f();
183
+ }
184
+ return 0;
185
+ });
186
+ };
187
+ export default function useSorter(_ref2) {
188
+ var data = _ref2.data,
189
+ columns = _ref2.columns;
190
+ var columnMap = useMemo(function () {
191
+ return createColumnMap(columns);
192
+ }, [columns]);
193
+ var _useState = useState(function () {
194
+ return createInitialQueue(columns, columnMap);
195
+ }),
196
+ _useState2 = _slicedToArray(_useState, 2),
197
+ internalQueue = _useState2[0],
198
+ setInternalQueue = _useState2[1];
199
+ useEffect(function () {
200
+ setInternalQueue(function (current) {
201
+ var next = normalizeQueue(current, columnMap);
202
+ return areQueuesEqual(current, next) ? current : next;
117
203
  });
118
- return sortedData;
119
- }, [data, sorters]);
204
+ }, [columnMap]);
205
+ var activeQueue = useMemo(function () {
206
+ return mergeControlledSorters(internalQueue, columns, columnMap);
207
+ }, [internalQueue, columns, columnMap]);
208
+ var sorters = useMemo(function () {
209
+ return queueToSortState(activeQueue);
210
+ }, [activeQueue]);
211
+ var sorted = useMemo(function () {
212
+ return sortData(data, activeQueue, columnMap);
213
+ }, [data, activeQueue, columnMap]);
214
+ var onSort = useCallback(function (dataIndex) {
215
+ var _activeQueue$find$ord, _activeQueue$find;
216
+ var column = columnMap.get(dataIndex);
217
+ if (!column) return {
218
+ data: sorted,
219
+ sorters: sorters
220
+ };
221
+ var currentOrder = (_activeQueue$find$ord = (_activeQueue$find = activeQueue.find(function (item) {
222
+ return item.dataIndex === dataIndex;
223
+ })) === null || _activeQueue$find === void 0 ? void 0 : _activeQueue$find.order) !== null && _activeQueue$find$ord !== void 0 ? _activeQueue$find$ord : 0;
224
+ var nextQueue = applySortChange(activeQueue, column, getNextSortOrder(currentOrder), columnMap);
225
+ var nextSorters = queueToSortState(nextQueue);
226
+ var nextData = sortData(data, nextQueue, columnMap);
227
+ setInternalQueue(nextQueue);
228
+ return {
229
+ data: nextData,
230
+ sorters: nextSorters
231
+ };
232
+ }, [activeQueue, columnMap, data, sorted, sorters]);
120
233
  return {
121
234
  data: sorted,
122
235
  sorters: sorters,
@@ -23,7 +23,7 @@ export interface ExpandableType {
23
23
  /**
24
24
  * Default expanded rows
25
25
  */
26
- defaultExpandedRowKeys?: string[];
26
+ defaultExpandedRowKeys?: SelectionKeyType[];
27
27
  /**
28
28
  * Expanded rows
29
29
  */
@@ -51,6 +51,7 @@ export interface ExpandableType {
51
51
  expandedRowRender?: (record: object, index: number, page: Record<string, any>) => React.ReactNode;
52
52
  }
53
53
  export type SelectionKeyType = string | number;
54
+ export type FilterValue = string | number;
54
55
  export type ColumnSemanticType = 'inner' | 'action';
55
56
  export interface HeadCellProps extends Omit<WrapedColumnProps, 'title'> {
56
57
  prefixCls?: string;
@@ -186,7 +187,7 @@ export interface ColumnProps {
186
187
  /**
187
188
  * Filter callback function
188
189
  */
189
- onFilter?: (value: string, record: Record<string, any>) => boolean;
190
+ onFilter?: (value: FilterValue, record: Record<string, any>) => boolean;
190
191
  };
191
192
  /**
192
193
  * Sorter config
@@ -195,9 +196,10 @@ export interface ColumnProps {
195
196
  /**
196
197
  * Sort function
197
198
  */
198
- sort?: () => number | boolean;
199
+ sort?: (a: Record<string, unknown>, b: Record<string, unknown>) => number;
199
200
  /**
200
- * Whether to support multi-column sort, if set to a number, it indicates the number of sortable columns
201
+ * Enable multi-column sorting. A positive number limits the active
202
+ * sorters; when exceeded, the earliest activated sorter is removed.
201
203
  */
202
204
  multiple?: boolean | number;
203
205
  /**
@@ -359,6 +361,7 @@ export interface TableRowProps {
359
361
  pageSize: number;
360
362
  index: number;
361
363
  record: Record<string, any>;
364
+ rowKeyValue: SelectionKeyType;
362
365
  columns: ColumnProps[];
363
366
  expandable?: ExpandableType;
364
367
  expandedRowKeys?: Array<string | number>;
@@ -375,7 +378,7 @@ export interface TableRowProps {
375
378
  record: Record<string, any>;
376
379
  index: number;
377
380
  }) => void;
378
- onSelectionChange: (event: ChangeEvent<HTMLInputElement>) => void;
381
+ onSelectionChange: (event: ChangeEvent<HTMLInputElement>, key: SelectionKeyType) => void;
379
382
  }
380
383
  type LazyLoadType = {
381
384
  lazyLoadRows?: number;
@@ -389,7 +392,7 @@ export interface LazyRowProps extends TableRowProps {
389
392
  };
390
393
  lazyLoad?: boolean | LazyLoadType;
391
394
  }
392
- export interface TableBodyProps extends Omit<LazyRowProps, 'index' | 'record'> {
395
+ export interface TableBodyProps extends Omit<LazyRowProps, 'index' | 'record' | 'rowKeyValue'> {
393
396
  pageData: Array<Record<string, any>>;
394
397
  noData?: React.ReactNode;
395
398
  }
@@ -542,7 +545,7 @@ export interface TableProps extends FooterProps, Omit<HeaderProps, 'pageData'>,
542
545
  * Set the unique key for rows
543
546
  * @default id
544
547
  */
545
- rowKey?: string | ((record: Record<string, any>) => string);
548
+ rowKey?: string | ((record: Record<string, any>) => SelectionKeyType);
546
549
  /**
547
550
  * Summary bar
548
551
  */