@rainbow-oh/yee-c 0.8.11 → 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 +10 -2
  7. package/dist/cjs/Table/hooks/useFilter.js +44 -31
  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 +10 -2
  31. package/dist/esm/Table/hooks/useFilter.js +63 -36
  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 +66 -33
  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
@@ -155,13 +155,24 @@ var Table = import_react.default.forwardRef((baseprops, ref) => {
155
155
  expandable,
156
156
  rowSelection
157
157
  });
158
- const { data: filteredData, onFilter: onFilterInternal } = (0, import_useFilter.default)({
159
- data: dataSource
158
+ const {
159
+ data: filteredData,
160
+ filterRecords,
161
+ onFilter: onFilterInternal
162
+ } = (0, import_useFilter.default)({
163
+ data: dataSource,
164
+ columns: wrapedColumns
160
165
  });
166
+ const filters = (0, import_react.useMemo)(
167
+ () => Object.fromEntries(
168
+ filterRecords.map(({ dataIndex, value }) => [dataIndex, value])
169
+ ),
170
+ [filterRecords]
171
+ );
161
172
  const {
162
173
  data: sortedData,
163
174
  sorters,
164
- onSort
175
+ onSort: onSortInternal
165
176
  } = (0, import_useSorter.default)({ data: filteredData, columns: wrapedColumns });
166
177
  const { pageData, current, pageSize, pagination } = (0, import_usePagination.default)({
167
178
  data: sortedData,
@@ -170,13 +181,25 @@ var Table = import_react.default.forwardRef((baseprops, ref) => {
170
181
  onChange({
171
182
  pagination: info,
172
183
  sorter: sorters,
173
- filters: void 0,
174
- // TODO: Extract filter info from onFilterInternal
184
+ filters,
175
185
  currentDataSource: sortedData,
176
186
  action: "paginate"
177
187
  });
178
188
  } : void 0
179
189
  });
190
+ const handleSort = import_react.default.useCallback(
191
+ (dataIndex) => {
192
+ const next = onSortInternal(dataIndex);
193
+ onChange == null ? void 0 : onChange({
194
+ pagination: pagination === false ? void 0 : { current, pageSize },
195
+ sorter: next.sorters,
196
+ filters,
197
+ currentDataSource: next.data,
198
+ action: "sort"
199
+ });
200
+ },
201
+ [onSortInternal, onChange, pagination, current, pageSize, filters]
202
+ );
180
203
  const { expandedRowKeys, onExpand } = (0, import_useExpand.default)(
181
204
  expandable,
182
205
  allKeys,
@@ -188,7 +211,7 @@ var Table = import_react.default.forwardRef((baseprops, ref) => {
188
211
  onCheckAll,
189
212
  onChange: onSelectionChange
190
213
  } = (0, import_useSelection.default)({ pageData, dataSource, getRowKey, rowSelection, allKeys });
191
- const prevSortersRef = (0, import_react.useRef)({});
214
+ const prevFilterRecordsRef = (0, import_react.useRef)(filterRecords);
192
215
  const contentWrapperRef = (0, import_react.useRef)(null);
193
216
  const contentRef = (0, import_react.useRef)(null);
194
217
  const [horizontalScroll, setHorizontalScroll] = import_react.default.useState({
@@ -211,46 +234,29 @@ var Table = import_react.default.forwardRef((baseprops, ref) => {
211
234
  (current2) => current2.left === next.left && current2.right === next.right ? current2 : next
212
235
  );
213
236
  }, []);
214
- const onFilter = import_react.default.useCallback(
215
- (...args) => {
216
- onFilterInternal(...args);
217
- if (onChange) {
218
- onChange({
219
- pagination: pagination === false ? void 0 : { current, pageSize },
220
- sorter: sorters,
221
- filters: void 0,
222
- // TODO: Extract filter info from args
223
- currentDataSource: filteredData,
224
- action: "filter"
225
- });
226
- }
227
- },
228
- [
229
- onChange,
230
- pagination,
231
- current,
232
- pageSize,
233
- sorters,
234
- filteredData,
235
- onFilterInternal
236
- ]
237
- );
238
237
  (0, import_react.useEffect)(() => {
239
- if (!onChange)
238
+ if (prevFilterRecordsRef.current === filterRecords)
240
239
  return;
241
- const sortersChanged = JSON.stringify(prevSortersRef.current) !== JSON.stringify(sorters);
242
- if (sortersChanged && prevSortersRef.current !== sorters) {
243
- prevSortersRef.current = sorters;
244
- onChange({
245
- pagination: pagination === false ? void 0 : { current, pageSize },
246
- sorter: sorters,
247
- filters: void 0,
248
- currentDataSource: sortedData,
249
- action: "sort"
250
- });
240
+ prevFilterRecordsRef.current = filterRecords;
241
+ if (!onChange)
251
242
  return;
252
- }
253
- }, [sorters, current, pageSize, pageData, sortedData, onChange]);
243
+ onChange({
244
+ pagination: pagination === false ? void 0 : { current, pageSize },
245
+ sorter: sorters,
246
+ filters,
247
+ currentDataSource: sortedData,
248
+ action: "filter"
249
+ });
250
+ }, [
251
+ filterRecords,
252
+ filters,
253
+ sortedData,
254
+ pagination,
255
+ current,
256
+ pageSize,
257
+ sorters,
258
+ onChange
259
+ ]);
254
260
  (0, import_react.useEffect)(() => {
255
261
  updateHorizontalScroll();
256
262
  const wrapper = contentWrapperRef.current;
@@ -290,9 +296,9 @@ var Table = import_react.default.forwardRef((baseprops, ref) => {
290
296
  headerRows,
291
297
  checkedAll,
292
298
  sorters,
293
- onSort,
299
+ onSort: handleSort,
294
300
  onCheckAll,
295
- onInternalFilter: onFilter
301
+ onInternalFilter: onFilterInternal
296
302
  })
297
303
  );
298
304
  };
@@ -81,19 +81,26 @@ var TableBody = (props) => {
81
81
  const resolveRowKey = (record) => typeof rowKey === "function" ? rowKey(record) : record[rowKey];
82
82
  const getRenderRows = () => {
83
83
  if (lazyLoad) {
84
- return /* @__PURE__ */ import_react.default.createElement(import_lazy_row.default, __spreadProps(__spreadValues({}, rest), { pageData, columns }));
84
+ return /* @__PURE__ */ import_react.default.createElement(
85
+ import_lazy_row.default,
86
+ __spreadProps(__spreadValues({}, rest), {
87
+ pageData,
88
+ columns,
89
+ resolveRowKey
90
+ })
91
+ );
85
92
  }
86
93
  return pageData.map((record, index) => {
94
+ const resolvedRowKey = resolveRowKey(record);
87
95
  if (RowRenderer) {
88
- const rk = resolveRowKey(record);
89
96
  return /* @__PURE__ */ import_react.default.createElement(
90
97
  RowRenderer,
91
98
  {
92
- key: rk != null ? rk : index,
99
+ key: resolvedRowKey != null ? resolvedRowKey : index,
93
100
  record,
94
101
  index,
95
102
  columns,
96
- rowKey: rk
103
+ rowKey: resolvedRowKey
97
104
  }
98
105
  );
99
106
  }
@@ -102,8 +109,9 @@ var TableBody = (props) => {
102
109
  __spreadProps(__spreadValues({}, rest), {
103
110
  columns,
104
111
  record,
112
+ rowKeyValue: resolvedRowKey,
105
113
  index,
106
- key: `row-${record.key || index}`
114
+ key: resolvedRowKey != null ? resolvedRowKey : `row-${index}`
107
115
  })
108
116
  );
109
117
  });
@@ -67,21 +67,24 @@ var createBlank = (size, key) => {
67
67
  return size ? [/* @__PURE__ */ React.createElement("tr", { style: { height: `${size * 47}px`, width: "100%" }, key })] : [];
68
68
  };
69
69
  var LazyRow = (props) => {
70
- const _a = props, { range, pageData, columns } = _a, rest = __objRest(_a, ["range", "pageData", "columns"]);
70
+ const _a = props, { range, pageData, columns, resolveRowKey } = _a, rest = __objRest(_a, ["range", "pageData", "columns", "resolveRowKey"]);
71
71
  const { start, end } = range;
72
72
  let result = [];
73
73
  const pl = pageData.length;
74
74
  const startBlank = createBlank(start, "row-start");
75
75
  result = result.concat(startBlank);
76
76
  for (let i = start; i < (end > pl ? pl : end); i++) {
77
+ const record = pageData[i];
78
+ const rowKeyValue = resolveRowKey(record);
77
79
  result.push(
78
80
  /* @__PURE__ */ React.createElement(
79
81
  import_row.default,
80
82
  __spreadProps(__spreadValues({}, rest), {
81
83
  columns,
82
- record: pageData[i],
84
+ record,
85
+ rowKeyValue,
83
86
  index: i,
84
- key: "row-" + i
87
+ key: rowKeyValue != null ? rowKeyValue : `row-${i}`
85
88
  })
86
89
  )
87
90
  );
@@ -74,6 +74,7 @@ var TableRow = (props) => {
74
74
  const _a = props, {
75
75
  index,
76
76
  record,
77
+ rowKeyValue,
77
78
  columns,
78
79
  highlight,
79
80
  stripe,
@@ -90,6 +91,7 @@ var TableRow = (props) => {
90
91
  } = _a, rest = __objRest(_a, [
91
92
  "index",
92
93
  "record",
94
+ "rowKeyValue",
93
95
  "columns",
94
96
  "highlight",
95
97
  "stripe",
@@ -104,9 +106,9 @@ var TableRow = (props) => {
104
106
  "onDoubleClick",
105
107
  "onSelectionChange"
106
108
  ]);
107
- const { prefixCls, rowKey } = (0, import_react.useContext)(import_table.TableCtx);
109
+ const { prefixCls } = (0, import_react.useContext)(import_table.TableCtx);
108
110
  const expanded = expandedRowKeys == null ? void 0 : expandedRowKeys.includes(
109
- expandedKeyType === "index" ? index + 1 : record[rowKey]
111
+ expandedKeyType === "index" ? index + 1 : rowKeyValue
110
112
  );
111
113
  const high = import_react.default.useMemo(() => {
112
114
  if (typeof highlight === "undefined")
@@ -128,14 +130,13 @@ var TableRow = (props) => {
128
130
  };
129
131
  const getSelection = (column) => {
130
132
  const { type, disabled: colDisabled, onCell } = column;
131
- const rowKeyValue = record[rowKey];
132
133
  const props2 = (onCell == null ? void 0 : onCell(record, index)) || {};
133
134
  const checked = selectedRowKeys == null ? void 0 : selectedRowKeys.includes(rowKeyValue);
134
135
  const disabled = typeof colDisabled === "function" ? colDisabled(record, index) : Array.isArray(colDisabled) ? colDisabled[index] : !!colDisabled;
135
136
  const commonProps = __spreadValues({
136
137
  checked,
137
138
  value: rowKeyValue,
138
- onChange: onSelectionChange,
139
+ onChange: (event) => onSelectionChange(event, rowKeyValue),
139
140
  disabled
140
141
  }, props2);
141
142
  if (type === "checkbox") {
@@ -122,12 +122,16 @@ var HeadCell = (props) => {
122
122
  const showFilter = !!filter;
123
123
  const sortOrder = dataIndex && (sorters == null ? void 0 : sorters[dataIndex]) || 0;
124
124
  const displaySortOrder = sortOrder === -1 ? 2 : sortOrder;
125
+ const currentSortOrder = sortOrder === 1 ? "ascend" : sortOrder === -1 ? "descend" : null;
125
126
  const handleSort = () => {
126
127
  if (dataIndex && onSort) {
127
128
  onSort(dataIndex, sorter);
128
129
  }
129
130
  };
130
131
  const renderSort = () => {
132
+ if (typeof sorter === "object" && sorter.icon) {
133
+ return /* @__PURE__ */ import_react.default.createElement("span", { className: `${prefixCls}-column-sorter` }, sorter.icon(currentSortOrder));
134
+ }
131
135
  const trigger = /* @__PURE__ */ import_react.default.createElement("span", { className: `${prefixCls}-column-sorter` }, /* @__PURE__ */ import_react.default.createElement(
132
136
  import_arrow_icon.default,
133
137
  {
@@ -49,13 +49,31 @@ var getStrLower = (str) => {
49
49
  }
50
50
  return str;
51
51
  };
52
+ var areFilterValuesEqual = (a, b) => {
53
+ if (!Array.isArray(a) || !Array.isArray(b))
54
+ return a === b;
55
+ return a.length === b.length && a.every((value, index) => value === b[index]);
56
+ };
57
+ var hasFilterValue = (value) => Array.isArray(value) ? value.length > 0 : value !== "";
52
58
  var HeaderFilter = import_react.default.memo((props) => {
53
59
  const { filter, column, getPopupContainer, onInternalFilter } = props;
54
60
  const { prefixCls } = (0, import_react.useContext)(import_table.TableCtx);
55
61
  const { locale } = (0, import_locale.useLocale)();
56
62
  const { table: tableLocale } = locale;
57
63
  const { dataIndex } = column;
64
+ const {
65
+ items,
66
+ icon,
67
+ searchable = true,
68
+ filterMode = "menu",
69
+ filtered,
70
+ filterOnClose = true,
71
+ render
72
+ } = filter;
58
73
  const inputRef = (0, import_react.useRef)(null);
74
+ const initialValue = items ? [] : "";
75
+ const committedValueRef = (0, import_react.useRef)(initialValue);
76
+ const [committedValue, setCommittedValue] = (0, import_react.useState)(initialValue);
59
77
  const [open, setOpen] = (0, import_react.useState)(false);
60
78
  const [selectNodes, setSelectNodes] = (0, import_react.useState)([]);
61
79
  const [searchValue, setSearchValue] = (0, import_react.useState)("");
@@ -71,30 +89,34 @@ var HeaderFilter = import_react.default.memo((props) => {
71
89
  const inputChange = (value) => {
72
90
  setSearchValue(value);
73
91
  };
74
- const reset = () => {
75
- setSearchValue("");
76
- setSelectNodes([]);
77
- onInternalFilter({ dataIndex, value: "", column });
92
+ const getCurrentValue = (type) => type === "search" ? searchValue : selectNodes;
93
+ const commitValue = (value) => {
94
+ const committed = Array.isArray(value) ? [...value] : value;
95
+ committedValueRef.current = committed;
96
+ setCommittedValue(committed);
78
97
  };
79
- const ok = (type) => {
98
+ const applyFilter = (type) => {
99
+ const value = getCurrentValue(type);
100
+ commitValue(value);
80
101
  onInternalFilter({
81
102
  dataIndex,
82
- value: type === "search" ? searchValue : selectNodes,
103
+ value,
83
104
  type,
84
105
  column
85
106
  });
107
+ };
108
+ const reset = () => {
109
+ const value = items ? [] : "";
110
+ setSearchValue("");
111
+ setSelectNodes([]);
112
+ commitValue(value);
113
+ onInternalFilter({ dataIndex, value, column });
114
+ };
115
+ const ok = (type) => {
116
+ applyFilter(type);
86
117
  setOpen(false);
87
118
  };
88
119
  let popup;
89
- const {
90
- items,
91
- icon,
92
- searchable = true,
93
- filterMode = "menu"
94
- // filtered,
95
- // filterOnClose,
96
- // onFilter,
97
- } = filter;
98
120
  const searchInputNode = searchable ? /* @__PURE__ */ import_react.default.createElement(
99
121
  import_Input.default,
100
122
  {
@@ -110,7 +132,9 @@ var HeaderFilter = import_react.default.memo((props) => {
110
132
  ref: inputRef
111
133
  }
112
134
  ) : null;
113
- if (items) {
135
+ if (render) {
136
+ popup = render();
137
+ } else if (items) {
114
138
  let dataSource = [];
115
139
  const inputValue = getStrLower(searchValue);
116
140
  const filteredItems = inputValue ? items.filter(
@@ -152,15 +176,23 @@ var HeaderFilter = import_react.default.memo((props) => {
152
176
  } else {
153
177
  return null;
154
178
  }
155
- const handleOpenChange = (o) => {
156
- setOpen(o);
179
+ const handleOpenChange = (nextOpen) => {
180
+ if (!nextOpen && open && filterOnClose && !render) {
181
+ const type = items ? "filter" : "search";
182
+ const value = getCurrentValue(type);
183
+ if (!areFilterValuesEqual(value, committedValueRef.current)) {
184
+ applyFilter(type);
185
+ }
186
+ }
187
+ setOpen(nextOpen);
157
188
  };
189
+ const isFiltered = filtered != null ? filtered : hasFilterValue(committedValue);
158
190
  const renderTrigger = () => {
159
- const trigger = typeof icon === "function" ? icon() : /* @__PURE__ */ import_react.default.createElement(
191
+ const trigger = typeof icon === "function" ? icon(isFiltered) : /* @__PURE__ */ import_react.default.createElement(
160
192
  import_Button.default,
161
193
  {
162
194
  icon: items ? /* @__PURE__ */ import_react.default.createElement(import_lucide_react.ListFilter, { size: 14, strokeWidth: 1.5 }) : /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Search, { size: 14, strokeWidth: 1.5 }),
163
- variant: selectNodes.length || searchValue ? "filled" : void 0,
195
+ variant: isFiltered ? "filled" : void 0,
164
196
  type: "text",
165
197
  size: "small"
166
198
  }
@@ -40,7 +40,7 @@ __export(util_exports, {
40
40
  });
41
41
  module.exports = __toCommonJS(util_exports);
42
42
  function handleColumns(columns) {
43
- var _a;
43
+ var _a, _b;
44
44
  let leftWidthCount = 0;
45
45
  let rightWidthCount = 0;
46
46
  for (let i = 0; i < columns.length; i++) {
@@ -48,7 +48,9 @@ function handleColumns(columns) {
48
48
  if (col.fixed === true || col.fixed === "left") {
49
49
  col.fixed = "left";
50
50
  col.style = __spreadProps(__spreadValues({}, col.style), { left: leftWidthCount });
51
- if (!columns[i + 1].fixed) {
51
+ const nextFixed = (_a = columns[i + 1]) == null ? void 0 : _a.fixed;
52
+ const nextIsFixedLeft = nextFixed === true || nextFixed === "left";
53
+ if (!nextIsFixedLeft) {
52
54
  col.isFixedLeftLast = true;
53
55
  }
54
56
  leftWidthCount = leftWidthCount + (col.width ? parseFloat(col.width) : 0);
@@ -58,7 +60,7 @@ function handleColumns(columns) {
58
60
  const col = columns[j] || {};
59
61
  if (col.fixed === "right") {
60
62
  col.style = __spreadProps(__spreadValues({}, col.style), { right: rightWidthCount });
61
- if (((_a = columns[j - 1]) == null ? void 0 : _a.fixed) !== "right") {
63
+ if (((_b = columns[j - 1]) == null ? void 0 : _b.fixed) !== "right") {
62
64
  col.isFixedRightFirst = true;
63
65
  }
64
66
  rightWidthCount = rightWidthCount + (col.width ? parseFloat(col.width) : 0);
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * @rainbow-oh/yee-c CSS Variables
3
3
  * Auto-generated, do not edit manually
4
- * Generated on 2026-07-29T03:43:59.991Z
4
+ * Generated on 2026-07-30T06:25:23.552Z
5
5
  */
6
6
 
7
7
  /* ========== color.blue.css ========== */
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * @rainbow-oh/yee-c CSS Variables
3
3
  * Auto-generated, do not edit manually
4
- * Generated on 2026-07-29T03:43:59.991Z
4
+ * Generated on 2026-07-30T06:25:23.552Z
5
5
  */
6
6
 
7
7
  /* ========== color.css ========== */
@@ -3,4 +3,4 @@ declare global {
3
3
  __yee_c_version__: string;
4
4
  }
5
5
  }
6
- export declare const version = "0.8.11";
6
+ export declare const version = "0.8.13";
@@ -22,7 +22,7 @@ __export(version_exports, {
22
22
  version: () => version
23
23
  });
24
24
  module.exports = __toCommonJS(version_exports);
25
- var version = "0.8.11";
25
+ var version = "0.8.13";
26
26
  if (typeof window !== "undefined") {
27
27
  window.__yee_c_version__ = version;
28
28
  }
@@ -3,5 +3,5 @@ import { ColumnProps } from './interface';
3
3
  interface TableColGroupProps {
4
4
  columns: Array<ColumnProps>;
5
5
  }
6
- declare const _default: React.MemoExoticComponent<React.MemoExoticComponent<({ columns }: TableColGroupProps) => React.JSX.Element>>;
7
- export default _default;
6
+ declare const ColGroup: React.MemoExoticComponent<({ columns }: TableColGroupProps) => React.JSX.Element>;
7
+ export default ColGroup;
@@ -33,4 +33,4 @@ var ColGroup = /*#__PURE__*/React.memo(function (_ref) {
33
33
  }, areEqual); // Optimization: use custom comparison function
34
34
 
35
35
  ColGroup.displayName = 'ColGroup';
36
- export default /*#__PURE__*/React.memo(ColGroup);
36
+ export default ColGroup;
@@ -21,8 +21,9 @@ export default (function () {
21
21
  title: 'Score',
22
22
  dataIndex: 'score',
23
23
  key: 'score',
24
- sorter: true,
25
- defaultSortOrder: 'descend'
24
+ sorter: {
25
+ defaultSortOrder: 'descend'
26
+ }
26
27
  }, {
27
28
  title: 'Address',
28
29
  dataIndex: 'address',
@@ -10,8 +10,9 @@ export default (function () {
10
10
  title: 'Age',
11
11
  dataIndex: 'age',
12
12
  key: 'age',
13
- sorter: true,
14
- defaultSortOrder: 'descend'
13
+ sorter: {
14
+ defaultSortOrder: 'descend'
15
+ }
15
16
  }, {
16
17
  title: 'Address',
17
18
  dataIndex: 'address',
@@ -1,5 +1,5 @@
1
- import { ExpandableType } from '../interface';
2
- export default function useExpand(expandable: ExpandableType | undefined, allKeys: string[], getRowKey: (record: Record<string, any>) => string): {
1
+ import { ExpandableType, SelectionKeyType } from '../interface';
2
+ export default function useExpand(expandable: ExpandableType | undefined, allKeys: SelectionKeyType[], getRowKey: (record: Record<string, any>) => SelectionKeyType): {
3
3
  expandedRowKeys: (string | number)[];
4
4
  onExpand: ({ expanded, record, }: {
5
5
  expanded: boolean;
@@ -1,11 +1,19 @@
1
+ import type { ColumnProps, FilterValue } from '../interface';
2
+ type FilterInput = FilterValue | FilterValue[];
1
3
  type FilterOptions = {
2
4
  dataIndex: string;
3
- value: string;
5
+ value: FilterInput;
4
6
  };
5
- export default function useFilter({ data, }: {
7
+ type FilterRecord = {
8
+ value: FilterInput;
9
+ dataIndex: string;
10
+ };
11
+ export default function useFilter({ data, columns, }: {
6
12
  data: Array<Record<string, unknown>>;
13
+ columns: ColumnProps[];
7
14
  }): {
8
15
  data: Record<string, unknown>[];
16
+ filterRecords: FilterRecord[];
9
17
  onFilter: ({ value, dataIndex }: FilterOptions) => void;
10
18
  };
11
19
  export {};
@@ -14,65 +14,92 @@ 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
+ var isEmptyFilterValue = function isEmptyFilterValue(value) {
19
+ return value === '' || Array.isArray(value) && value.length === 0;
20
+ };
21
+ var normalizeValue = function normalizeValue(value) {
22
+ return value === null || value === undefined ? '' : String(value).toLowerCase();
23
+ };
18
24
  export default function useFilter(_ref) {
19
- var data = _ref.data;
25
+ var data = _ref.data,
26
+ columns = _ref.columns;
20
27
  var _useState = useState([]),
21
28
  _useState2 = _slicedToArray(_useState, 2),
22
29
  filterRecords = _useState2[0],
23
30
  setFilterRecords = _useState2[1];
24
- var onFilter = function onFilter(_ref2) {
25
- var value = _ref2.value,
26
- dataIndex = _ref2.dataIndex;
27
- var newFilterMap = _toConsumableArray(filterRecords);
28
- if (!value || Array.isArray(value) && !value.length) {
29
- newFilterMap = newFilterMap.filter(function (item) {
30
- 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);
31
41
  });
32
- } else {
33
- var exited = false;
34
- newFilterMap = newFilterMap.map(function (item) {
35
- if (item.dataIndex === dataIndex) {
36
- exited = true;
37
- return _objectSpread(_objectSpread({}, item), {}, {
38
- value: value
39
- });
40
- }
41
- 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;
42
56
  });
43
- if (!exited) {
44
- newFilterMap.push({
57
+ if (index === -1) {
58
+ return [].concat(_toConsumableArray(current), [{
45
59
  dataIndex: dataIndex,
46
60
  value: value
47
- });
61
+ }]);
48
62
  }
49
- }
50
- setFilterRecords(newFilterMap);
63
+ return current.map(function (item, itemIndex) {
64
+ return itemIndex === index ? _objectSpread(_objectSpread({}, item), {}, {
65
+ value: value
66
+ }) : item;
67
+ });
68
+ });
51
69
  };
52
70
  var filtered = useMemo(function () {
53
- var handled = filterRecords.filter(function (item) {
54
- return item.dataIndex && item.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);
55
75
  });
56
76
  if (!handled.length) {
57
77
  return data;
58
78
  }
59
79
  return data.filter(function (item) {
60
- return handled.find(function (o) {
61
- if (Array.isArray(o.value)) {
62
- return o.value.some(function (v) {
63
- var t = item[o.dataIndex] || '';
64
- return t.toLowerCase() === v.toLowerCase();
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
+ }
90
+ var targetValue = normalizeValue(item[dataIndex]);
91
+ if (Array.isArray(value)) {
92
+ return value.some(function (filterValue) {
93
+ return targetValue === normalizeValue(filterValue);
65
94
  });
66
- } else {
67
- var v = o.value.toLowerCase();
68
- var t = item[o.dataIndex] || '';
69
- return t.toLowerCase().includes(v);
70
95
  }
96
+ return targetValue.includes(normalizeValue(value));
71
97
  });
72
98
  });
73
- }, [data, filterRecords]);
99
+ }, [columnMap, data, filterRecords]);
74
100
  return {
75
101
  data: filtered,
102
+ filterRecords: filterRecords,
76
103
  onFilter: onFilter
77
104
  };
78
105
  }