@rainbow-oh/yee-c 0.8.12 → 0.8.14

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 (82) hide show
  1. package/dist/cjs/Pagination/style/index.less +4 -0
  2. package/dist/cjs/Spin/demo/types.js +1 -1
  3. package/dist/cjs/Spin/indicator.js +4 -2
  4. package/dist/cjs/Spin/style/index.less +2 -8
  5. package/dist/cjs/Table/col-group.d.ts +2 -2
  6. package/dist/cjs/Table/col-group.js +1 -1
  7. package/dist/cjs/Table/demo/sorter-callback.js +3 -2
  8. package/dist/cjs/Table/demo/sorter.js +3 -2
  9. package/dist/cjs/Table/hooks/useExpand.d.ts +2 -2
  10. package/dist/cjs/Table/hooks/useFilter.d.ts +8 -2
  11. package/dist/cjs/Table/hooks/useFilter.js +36 -22
  12. package/dist/cjs/Table/hooks/usePagination.js +8 -8
  13. package/dist/cjs/Table/hooks/useSelection.d.ts +3 -3
  14. package/dist/cjs/Table/hooks/useSelection.js +8 -9
  15. package/dist/cjs/Table/hooks/useSorter.d.ts +6 -3
  16. package/dist/cjs/Table/hooks/useSorter.js +193 -87
  17. package/dist/cjs/Table/interface.d.ts +10 -7
  18. package/dist/cjs/Table/table.js +51 -45
  19. package/dist/cjs/Table/tbody/index.js +13 -5
  20. package/dist/cjs/Table/tbody/lazy-row.js +6 -3
  21. package/dist/cjs/Table/tbody/row.js +5 -4
  22. package/dist/cjs/Table/theader/cell.js +4 -0
  23. package/dist/cjs/Table/theader/filter.js +52 -20
  24. package/dist/cjs/Table/util/index.js +5 -3
  25. package/dist/cjs/style/themes.css +1 -1
  26. package/dist/cjs/style/variables.css +1 -1
  27. package/dist/cjs/version.d.ts +1 -1
  28. package/dist/cjs/version.js +1 -1
  29. package/dist/esm/Pagination/style/index.less +4 -0
  30. package/dist/esm/Spin/demo/types.js +6 -3
  31. package/dist/esm/Spin/indicator.js +4 -2
  32. package/dist/esm/Spin/style/index.less +2 -8
  33. package/dist/esm/Table/col-group.d.ts +2 -2
  34. package/dist/esm/Table/col-group.js +1 -1
  35. package/dist/esm/Table/demo/sorter-callback.js +3 -2
  36. package/dist/esm/Table/demo/sorter.js +3 -2
  37. package/dist/esm/Table/hooks/useExpand.d.ts +2 -2
  38. package/dist/esm/Table/hooks/useFilter.d.ts +8 -2
  39. package/dist/esm/Table/hooks/useFilter.js +52 -32
  40. package/dist/esm/Table/hooks/usePagination.js +8 -10
  41. package/dist/esm/Table/hooks/useSelection.d.ts +3 -3
  42. package/dist/esm/Table/hooks/useSelection.js +16 -11
  43. package/dist/esm/Table/hooks/useSorter.d.ts +6 -3
  44. package/dist/esm/Table/hooks/useSorter.js +218 -105
  45. package/dist/esm/Table/interface.d.ts +10 -7
  46. package/dist/esm/Table/table.js +42 -47
  47. package/dist/esm/Table/tbody/index.js +8 -5
  48. package/dist/esm/Table/tbody/lazy-row.js +7 -3
  49. package/dist/esm/Table/tbody/row.js +7 -6
  50. package/dist/esm/Table/theader/cell.js +7 -1
  51. package/dist/esm/Table/theader/filter.js +75 -27
  52. package/dist/esm/Table/util/index.js +6 -3
  53. package/dist/esm/style/themes.css +1 -1
  54. package/dist/esm/style/variables.css +1 -1
  55. package/dist/esm/version.d.ts +1 -1
  56. package/dist/esm/version.js +1 -1
  57. package/dist/umd/yee-c.min.css +1 -1
  58. package/dist/umd/yee-c.min.js +1 -1
  59. package/package.json +1 -1
  60. package/src/Pagination/style/index.less +4 -0
  61. package/src/Spin/demo/types.tsx +3 -3
  62. package/src/Spin/index.en-US.md +2 -8
  63. package/src/Spin/index.zh-CN.md +2 -8
  64. package/src/Spin/indicator.tsx +2 -0
  65. package/src/Spin/style/index.less +2 -8
  66. package/src/Table/col-group.tsx +1 -1
  67. package/src/Table/demo/sorter-callback.tsx +3 -2
  68. package/src/Table/demo/sorter.tsx +3 -2
  69. package/src/Table/hooks/useExpand.ts +3 -3
  70. package/src/Table/hooks/useFilter.ts +47 -23
  71. package/src/Table/hooks/usePagination.ts +9 -10
  72. package/src/Table/hooks/useSelection.ts +18 -20
  73. package/src/Table/hooks/useSorter.ts +236 -82
  74. package/src/Table/interface.ts +19 -7
  75. package/src/Table/table.tsx +54 -49
  76. package/src/Table/tbody/index.tsx +14 -5
  77. package/src/Table/tbody/lazy-row.tsx +6 -3
  78. package/src/Table/tbody/row.tsx +5 -4
  79. package/src/Table/theader/cell.tsx +10 -0
  80. package/src/Table/theader/filter.tsx +64 -22
  81. package/src/Table/util/index.ts +3 -1
  82. package/src/version.ts +1 -1
@@ -1,13 +1,19 @@
1
- type FilterValue = string | number;
1
+ import type { ColumnProps, FilterValue } from '../interface';
2
2
  type FilterInput = FilterValue | FilterValue[];
3
3
  type FilterOptions = {
4
4
  dataIndex: string;
5
5
  value: FilterInput;
6
6
  };
7
- export default function useFilter({ data, }: {
7
+ type FilterRecord = {
8
+ value: FilterInput;
9
+ dataIndex: string;
10
+ };
11
+ export default function useFilter({ data, columns, }: {
8
12
  data: Array<Record<string, unknown>>;
13
+ columns: ColumnProps[];
9
14
  }): {
10
15
  data: Record<string, unknown>[];
16
+ filterRecords: FilterRecord[];
11
17
  onFilter: ({ value, dataIndex }: FilterOptions) => void;
12
18
  };
13
19
  export {};
@@ -14,7 +14,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
14
14
  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; }
15
15
  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; } }
16
16
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
17
- import { useMemo, useState } from 'react';
17
+ import { useEffect, useMemo, useState } from 'react';
18
18
  var isEmptyFilterValue = function isEmptyFilterValue(value) {
19
19
  return value === '' || Array.isArray(value) && value.length === 0;
20
20
  };
@@ -22,52 +22,71 @@ var normalizeValue = function normalizeValue(value) {
22
22
  return value === null || value === undefined ? '' : String(value).toLowerCase();
23
23
  };
24
24
  export default function useFilter(_ref) {
25
- var data = _ref.data;
25
+ var data = _ref.data,
26
+ columns = _ref.columns;
26
27
  var _useState = useState([]),
27
28
  _useState2 = _slicedToArray(_useState, 2),
28
29
  filterRecords = _useState2[0],
29
30
  setFilterRecords = _useState2[1];
30
- var onFilter = function onFilter(_ref2) {
31
- var value = _ref2.value,
32
- dataIndex = _ref2.dataIndex;
33
- var newFilterMap = _toConsumableArray(filterRecords);
34
- if (isEmptyFilterValue(value)) {
35
- newFilterMap = newFilterMap.filter(function (item) {
36
- return item.dataIndex !== dataIndex;
31
+ var columnMap = useMemo(function () {
32
+ return new Map(columns.flatMap(function (column) {
33
+ return column.dataIndex ? [[column.dataIndex, column]] : [];
34
+ }));
35
+ }, [columns]);
36
+ useEffect(function () {
37
+ setFilterRecords(function (current) {
38
+ var next = current.filter(function (_ref2) {
39
+ var dataIndex = _ref2.dataIndex;
40
+ return columnMap.has(dataIndex);
37
41
  });
38
- } else {
39
- var exited = false;
40
- newFilterMap = newFilterMap.map(function (item) {
41
- if (item.dataIndex === dataIndex) {
42
- exited = true;
43
- return _objectSpread(_objectSpread({}, item), {}, {
44
- value: value
45
- });
46
- }
47
- return item;
42
+ return next.length === current.length ? current : next;
43
+ });
44
+ }, [columnMap]);
45
+ var onFilter = function onFilter(_ref3) {
46
+ var value = _ref3.value,
47
+ dataIndex = _ref3.dataIndex;
48
+ setFilterRecords(function (current) {
49
+ if (isEmptyFilterValue(value)) {
50
+ return current.filter(function (item) {
51
+ return item.dataIndex !== dataIndex;
52
+ });
53
+ }
54
+ var index = current.findIndex(function (item) {
55
+ return item.dataIndex === dataIndex;
48
56
  });
49
- if (!exited) {
50
- newFilterMap.push({
57
+ if (index === -1) {
58
+ return [].concat(_toConsumableArray(current), [{
51
59
  dataIndex: dataIndex,
52
60
  value: value
53
- });
61
+ }]);
54
62
  }
55
- }
56
- setFilterRecords(newFilterMap);
63
+ return current.map(function (item, itemIndex) {
64
+ return itemIndex === index ? _objectSpread(_objectSpread({}, item), {}, {
65
+ value: value
66
+ }) : item;
67
+ });
68
+ });
57
69
  };
58
70
  var filtered = useMemo(function () {
59
- var handled = filterRecords.filter(function (_ref3) {
60
- var dataIndex = _ref3.dataIndex,
61
- value = _ref3.value;
62
- return Boolean(dataIndex) && !isEmptyFilterValue(value);
71
+ var handled = filterRecords.filter(function (_ref4) {
72
+ var dataIndex = _ref4.dataIndex,
73
+ value = _ref4.value;
74
+ return Boolean(dataIndex) && columnMap.has(dataIndex) && !isEmptyFilterValue(value);
63
75
  });
64
76
  if (!handled.length) {
65
77
  return data;
66
78
  }
67
79
  return data.filter(function (item) {
68
- return handled.some(function (_ref4) {
69
- var dataIndex = _ref4.dataIndex,
70
- value = _ref4.value;
80
+ return handled.every(function (_ref5) {
81
+ var _columnMap$get;
82
+ var dataIndex = _ref5.dataIndex,
83
+ value = _ref5.value;
84
+ var customFilter = (_columnMap$get = columnMap.get(dataIndex)) === null || _columnMap$get === void 0 || (_columnMap$get = _columnMap$get.filter) === null || _columnMap$get === void 0 ? void 0 : _columnMap$get.onFilter;
85
+ if (customFilter) {
86
+ return Array.isArray(value) ? value.some(function (filterValue) {
87
+ return customFilter(filterValue, item);
88
+ }) : customFilter(value, item);
89
+ }
71
90
  var targetValue = normalizeValue(item[dataIndex]);
72
91
  if (Array.isArray(value)) {
73
92
  return value.some(function (filterValue) {
@@ -77,9 +96,10 @@ export default function useFilter(_ref) {
77
96
  return targetValue.includes(normalizeValue(value));
78
97
  });
79
98
  });
80
- }, [data, filterRecords]);
99
+ }, [columnMap, data, filterRecords]);
81
100
  return {
82
101
  data: filtered,
102
+ filterRecords: filterRecords,
83
103
  onFilter: onFilter
84
104
  };
85
105
  }
@@ -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,