@rainbow-oh/yee-c 0.12.2 → 0.13.0

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 (39) hide show
  1. package/dist/cjs/Table/demo/controlled-filter.d.ts +3 -0
  2. package/dist/cjs/Table/demo/controlled-filter.js +105 -0
  3. package/dist/cjs/Table/hooks/useFilter.d.ts +5 -1
  4. package/dist/cjs/Table/hooks/useFilter.js +80 -42
  5. package/dist/cjs/Table/index.d.ts +1 -1
  6. package/dist/cjs/Table/interface.d.ts +14 -4
  7. package/dist/cjs/Table/table.js +22 -25
  8. package/dist/cjs/Table/theader/cell.js +0 -3
  9. package/dist/cjs/Table/theader/filter.js +22 -5
  10. package/dist/cjs/style/themes.css +1 -1
  11. package/dist/cjs/style/variables.css +1 -1
  12. package/dist/cjs/version.d.ts +1 -1
  13. package/dist/cjs/version.js +1 -1
  14. package/dist/esm/Table/demo/controlled-filter.d.ts +3 -0
  15. package/dist/esm/Table/demo/controlled-filter.js +122 -0
  16. package/dist/esm/Table/hooks/useFilter.d.ts +5 -1
  17. package/dist/esm/Table/hooks/useFilter.js +112 -69
  18. package/dist/esm/Table/index.d.ts +1 -1
  19. package/dist/esm/Table/interface.d.ts +14 -4
  20. package/dist/esm/Table/table.js +34 -21
  21. package/dist/esm/Table/theader/cell.js +1 -3
  22. package/dist/esm/Table/theader/filter.js +22 -1
  23. package/dist/esm/style/themes.css +1 -1
  24. package/dist/esm/style/variables.css +1 -1
  25. package/dist/esm/version.d.ts +1 -1
  26. package/dist/esm/version.js +1 -1
  27. package/dist/umd/yee-c.min.js +1 -1
  28. package/package.json +1 -1
  29. package/src/Table/demo/controlled-filter.tsx +107 -0
  30. package/src/Table/hooks/useFilter.ts +107 -49
  31. package/src/Table/index.en-US.md +22 -1
  32. package/src/Table/index.ts +1 -0
  33. package/src/Table/index.zh-CN.md +22 -1
  34. package/src/Table/interface.ts +14 -2
  35. package/src/Table/table-filter.test.tsx +343 -0
  36. package/src/Table/table.tsx +29 -27
  37. package/src/Table/theader/cell.tsx +0 -2
  38. package/src/Table/theader/filter.tsx +26 -1
  39. package/src/version.ts +1 -1
@@ -4,102 +4,145 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
4
4
  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; }
5
5
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
6
  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); }
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+ 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."); }
9
+ 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; } }
10
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
11
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
8
12
  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."); }
13
+ 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); }
9
14
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
10
15
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
11
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
12
- 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."); }
13
- 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); }
14
16
  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
- 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
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
17
- import { useEffect, useMemo, useState } from 'react';
17
+ import { useCallback, useEffect, useMemo, useState } from 'react';
18
18
  var isEmptyFilterValue = function isEmptyFilterValue(value) {
19
19
  return value === '' || Array.isArray(value) && value.length === 0;
20
20
  };
21
+ export var isControlledFilter = function isControlledFilter(column) {
22
+ var _column$filter;
23
+ return (column === null || column === void 0 || (_column$filter = column.filter) === null || _column$filter === void 0 ? void 0 : _column$filter.filteredValue) !== undefined;
24
+ };
21
25
  var normalizeValue = function normalizeValue(value) {
22
26
  return value === null || value === undefined ? '' : String(value).toLowerCase();
23
27
  };
24
- export default function useFilter(_ref) {
25
- var data = _ref.data,
26
- columns = _ref.columns;
28
+
29
+ // Controlled columns (`filteredValue` defined) always take their value from
30
+ // the prop; internal records for them are ignored entirely — a commit on a
31
+ // controlled column must not leak into the merged state while the parent has
32
+ // not (yet) applied the new prop value.
33
+ var mergeRecords = function mergeRecords(internalRecords, columnMap) {
34
+ var controlled = [];
35
+ columnMap.forEach(function (column, dataIndex) {
36
+ var _column$filter2;
37
+ if (!isControlledFilter(column)) return;
38
+ var value = (_column$filter2 = column.filter) === null || _column$filter2 === void 0 ? void 0 : _column$filter2.filteredValue;
39
+ if (!isEmptyFilterValue(value)) {
40
+ controlled.push({
41
+ dataIndex: dataIndex,
42
+ value: value
43
+ });
44
+ }
45
+ });
46
+ var merged = internalRecords.filter(function (record) {
47
+ return !isControlledFilter(columnMap.get(record.dataIndex));
48
+ });
49
+ if (!controlled.length && merged.length === internalRecords.length) {
50
+ return internalRecords;
51
+ }
52
+ return [].concat(_toConsumableArray(merged), controlled);
53
+ };
54
+ var applyFilters = function applyFilters(data, records, columnMap) {
55
+ var handled = records.filter(function (_ref) {
56
+ var dataIndex = _ref.dataIndex,
57
+ value = _ref.value;
58
+ return Boolean(dataIndex) && columnMap.has(dataIndex) && !isEmptyFilterValue(value);
59
+ });
60
+ if (!handled.length) {
61
+ return data;
62
+ }
63
+ return data.filter(function (item) {
64
+ return handled.every(function (_ref2) {
65
+ var _column$filter3, _column$filter4;
66
+ var dataIndex = _ref2.dataIndex,
67
+ value = _ref2.value;
68
+ var column = columnMap.get(dataIndex);
69
+
70
+ // Controlled column without `onFilter` is server-side: the data the
71
+ // consumer renders is already filtered upstream, pass it through.
72
+ if (isControlledFilter(column) && !(column !== null && column !== void 0 && (_column$filter3 = column.filter) !== null && _column$filter3 !== void 0 && _column$filter3.onFilter)) {
73
+ return true;
74
+ }
75
+ var customFilter = column === null || column === void 0 || (_column$filter4 = column.filter) === null || _column$filter4 === void 0 ? void 0 : _column$filter4.onFilter;
76
+ if (customFilter) {
77
+ return Array.isArray(value) ? value.some(function (filterValue) {
78
+ return customFilter(filterValue, item);
79
+ }) : customFilter(value, item);
80
+ }
81
+ var targetValue = normalizeValue(item[dataIndex]);
82
+ if (Array.isArray(value)) {
83
+ return value.some(function (filterValue) {
84
+ return targetValue === normalizeValue(filterValue);
85
+ });
86
+ }
87
+ return targetValue.includes(normalizeValue(value));
88
+ });
89
+ });
90
+ };
91
+ export default function useFilter(_ref3) {
92
+ var data = _ref3.data,
93
+ columns = _ref3.columns;
27
94
  var _useState = useState([]),
28
95
  _useState2 = _slicedToArray(_useState, 2),
29
- filterRecords = _useState2[0],
30
- setFilterRecords = _useState2[1];
96
+ internalRecords = _useState2[0],
97
+ setInternalRecords = _useState2[1];
31
98
  var columnMap = useMemo(function () {
32
99
  return new Map(columns.flatMap(function (column) {
33
100
  return column.dataIndex ? [[column.dataIndex, column]] : [];
34
101
  }));
35
102
  }, [columns]);
36
103
  useEffect(function () {
37
- setFilterRecords(function (current) {
38
- var next = current.filter(function (_ref2) {
39
- var dataIndex = _ref2.dataIndex;
104
+ setInternalRecords(function (current) {
105
+ var next = current.filter(function (_ref4) {
106
+ var dataIndex = _ref4.dataIndex;
40
107
  return columnMap.has(dataIndex);
41
108
  });
42
109
  return next.length === current.length ? current : next;
43
110
  });
44
111
  }, [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;
56
- });
57
- if (index === -1) {
58
- return [].concat(_toConsumableArray(current), [{
59
- dataIndex: dataIndex,
60
- value: value
61
- }]);
62
- }
63
- return current.map(function (item, itemIndex) {
64
- return itemIndex === index ? _objectSpread(_objectSpread({}, item), {}, {
65
- value: value
66
- }) : item;
67
- });
68
- });
69
- };
112
+ var activeRecords = useMemo(function () {
113
+ return mergeRecords(internalRecords, columnMap);
114
+ }, [internalRecords, columnMap]);
70
115
  var filtered = useMemo(function () {
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);
75
- });
76
- if (!handled.length) {
77
- return data;
78
- }
79
- return data.filter(function (item) {
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);
94
- });
95
- }
96
- return targetValue.includes(normalizeValue(value));
97
- });
98
- });
99
- }, [columnMap, data, filterRecords]);
116
+ return applyFilters(data, activeRecords, columnMap);
117
+ }, [columnMap, data, activeRecords]);
118
+
119
+ // Mirrors useSorter.onSort: computes the next state synchronously and
120
+ // returns it, so callers can emit onChange with the result in the same tick.
121
+ var onFilter = useCallback(function (_ref5) {
122
+ var value = _ref5.value,
123
+ dataIndex = _ref5.dataIndex;
124
+ var nextInternal = isEmptyFilterValue(value) ? internalRecords.filter(function (item) {
125
+ return item.dataIndex !== dataIndex;
126
+ }) : internalRecords.some(function (item) {
127
+ return item.dataIndex === dataIndex;
128
+ }) ? internalRecords.map(function (item) {
129
+ return item.dataIndex === dataIndex ? _objectSpread(_objectSpread({}, item), {}, {
130
+ value: value
131
+ }) : item;
132
+ }) : [].concat(_toConsumableArray(internalRecords), [{
133
+ dataIndex: dataIndex,
134
+ value: value
135
+ }]);
136
+ setInternalRecords(nextInternal);
137
+ var nextActive = mergeRecords(nextInternal, columnMap);
138
+ return {
139
+ data: applyFilters(data, nextActive, columnMap),
140
+ filterRecords: nextActive
141
+ };
142
+ }, [internalRecords, columnMap, data]);
100
143
  return {
101
144
  data: filtered,
102
- filterRecords: filterRecords,
145
+ filterRecords: activeRecords,
103
146
  onFilter: onFilter
104
147
  };
105
148
  }
@@ -2,7 +2,7 @@ import Column from './column';
2
2
  import Summary from './summary';
3
3
  import InternalTable from './table';
4
4
  import Head from './theader';
5
- export type { ColumnProps, HeaderCell, PaginationType, RowSelectionType, TableBodyComponents, TableComponents, TableProps, TableRowRendererProps, onChangeParams, } from './interface';
5
+ export type { ColumnProps, FilterValue, HeaderCell, PaginationType, RowSelectionType, TableBodyComponents, TableComponents, TableProps, TableRowRendererProps, onChangeParams, } from './interface';
6
6
  type TableType = typeof InternalTable & {
7
7
  Column: typeof Column;
8
8
  Summary: typeof Summary;
@@ -62,11 +62,13 @@ export interface HeadCellProps extends Omit<WrapedColumnProps, 'title'> {
62
62
  [prop: string]: number;
63
63
  };
64
64
  showSorterTooltip?: boolean;
65
- internalFilters?: {
66
- [dataIndex: string]: boolean;
67
- };
68
65
  onSort?: (dataIndex: string, sorter: any) => void;
69
- onInternalFilter?: (dataIndex: string, value: string) => void;
66
+ onInternalFilter?: (options: {
67
+ dataIndex: string;
68
+ value: FilterValue | FilterValue[];
69
+ type?: 'filter' | 'search';
70
+ column: WrapedColumnProps;
71
+ }) => void;
70
72
  /**
71
73
  * `resizeKey` of the column currently being dragged, if any
72
74
  */
@@ -188,6 +190,14 @@ export interface ColumnProps {
188
190
  * Whether searchable, when items is undefined, it acts as a search component
189
191
  */
190
192
  searchable?: boolean;
193
+ /**
194
+ * Controlled filter state. When defined, this column's filter state is
195
+ * controlled: the dropdown echo, icon highlight and the `filters` in
196
+ * onChange all derive from it. With no `onFilter`, local matching is
197
+ * skipped entirely (server mode — filter in your onChange handler).
198
+ * Reset with `[]` / `''`.
199
+ */
200
+ filteredValue?: FilterValue | FilterValue[];
191
201
  /**
192
202
  * Filter icon
193
203
  */
@@ -218,6 +218,37 @@ var Table = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
218
218
  action: 'sort'
219
219
  });
220
220
  }, [onSortInternal, onChange, pagination, current, pageSize, filters]);
221
+ var handleFilter = React.useCallback(function (options) {
222
+ var next = onFilterInternal(options);
223
+ // Remove-then-re-add: the committing column's entry must be reported
224
+ // even when the merged records hold no record for it (a controlled
225
+ // column whose prop value is still empty), so parents can mirror state
226
+ // from this payload alone. On clear the key is kept with its empty
227
+ // value, matching antd.
228
+ var emitted = next.filterRecords.filter(function (record) {
229
+ return record.dataIndex !== options.dataIndex;
230
+ });
231
+ emitted.push({
232
+ dataIndex: options.dataIndex,
233
+ value: options.value
234
+ });
235
+ onChange === null || onChange === void 0 || onChange({
236
+ pagination: pagination === false ? undefined : {
237
+ current: current,
238
+ pageSize: pageSize
239
+ },
240
+ sorter: sorters,
241
+ filters: Object.fromEntries(emitted.map(function (_ref2) {
242
+ var dataIndex = _ref2.dataIndex,
243
+ value = _ref2.value;
244
+ return [dataIndex, value];
245
+ })),
246
+ // Filtered but not yet re-sorted; symmetric with handleSort, whose
247
+ // payload is sorted but not re-paginated.
248
+ currentDataSource: next.data,
249
+ action: 'filter'
250
+ });
251
+ }, [onFilterInternal, onChange, pagination, current, pageSize, sorters]);
221
252
 
222
253
  // Expanded row data
223
254
  var _useExpand = useExpand(expandable, allKeys, getRowKey),
@@ -234,9 +265,6 @@ var Table = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
234
265
  checkedAll = _useSelection.checkedAll,
235
266
  onCheckAll = _useSelection.onCheckAll,
236
267
  onSelectionChange = _useSelection.onChange;
237
-
238
- // Track filter changes to emit onChange after filtered data is recalculated
239
- var prevFilterRecordsRef = useRef(filterRecords);
240
268
  var _React$useState3 = React.useState({
241
269
  left: false,
242
270
  right: false
@@ -262,8 +290,8 @@ var Table = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
262
290
  // measured layout, used as an effect dependency instead of the array itself.
263
291
  var columnLayoutKey = useMemo(function () {
264
292
  return wrapedColumns.map(function (column, index) {
265
- var _ref2, _column$key, _column$fixed, _column$width;
266
- return "".concat((_ref2 = (_column$key = column.key) !== null && _column$key !== void 0 ? _column$key : column.dataIndex) !== null && _ref2 !== void 0 ? _ref2 : index, ":").concat((_column$fixed = column.fixed) !== null && _column$fixed !== void 0 ? _column$fixed : '', ":").concat((_column$width = column.width) !== null && _column$width !== void 0 ? _column$width : '');
293
+ var _ref3, _column$key, _column$fixed, _column$width;
294
+ return "".concat((_ref3 = (_column$key = column.key) !== null && _column$key !== void 0 ? _column$key : column.dataIndex) !== null && _ref3 !== void 0 ? _ref3 : index, ":").concat((_column$fixed = column.fixed) !== null && _column$fixed !== void 0 ? _column$fixed : '', ":").concat((_column$width = column.width) !== null && _column$width !== void 0 ? _column$width : '');
267
295
  }).join('|');
268
296
  }, [wrapedColumns]);
269
297
 
@@ -298,21 +326,6 @@ var Table = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
298
326
  return unchanged ? current : nextWidths;
299
327
  });
300
328
  }, [wrapedColumnsRef]);
301
- useEffect(function () {
302
- if (prevFilterRecordsRef.current === filterRecords) return;
303
- prevFilterRecordsRef.current = filterRecords;
304
- if (!onChange) return;
305
- onChange({
306
- pagination: pagination === false ? undefined : {
307
- current: current,
308
- pageSize: pageSize
309
- },
310
- sorter: sorters,
311
- filters: filters,
312
- currentDataSource: sortedData,
313
- action: 'filter'
314
- });
315
- }, [filterRecords, filters, sortedData, pagination, current, pageSize, sorters, onChange]);
316
329
 
317
330
  // Observers are attached once: both callbacks are referentially stable.
318
331
  useEffect(function () {
@@ -365,7 +378,7 @@ var Table = /*#__PURE__*/React.forwardRef(function (baseprops, ref) {
365
378
  sorters: sorters,
366
379
  onSort: handleSort,
367
380
  onCheckAll: onCheckAll,
368
- onInternalFilter: onFilterInternal,
381
+ onInternalFilter: handleFilter,
369
382
  resizingKey: resizingKey,
370
383
  onResizeStart: onResizeStart,
371
384
  onResizeStep: onResizeStep
@@ -1,4 +1,4 @@
1
- var _excluded = ["fixed", "isFixedLeftLast", "isFixedRightFirst", "align", "title", "dataIndex", "sorter", "filter", "sorters", "className", "styles", "classNames", "showSorterTooltip", "tableActionBarShowOnHover", "internalFilters", "style", "width", "colSpan", "rowSpan", "resizable", "resizeKey", "resizingKey", "onHeaderCell", "onSort", "onInternalFilter", "onResizeStart", "onResizeStep"];
1
+ var _excluded = ["fixed", "isFixedLeftLast", "isFixedRightFirst", "align", "title", "dataIndex", "sorter", "filter", "sorters", "className", "styles", "classNames", "showSorterTooltip", "tableActionBarShowOnHover", "style", "width", "colSpan", "rowSpan", "resizable", "resizeKey", "resizingKey", "onHeaderCell", "onSort", "onInternalFilter", "onResizeStart", "onResizeStep"];
2
2
  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; }
3
3
  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; }
4
4
  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; }
@@ -32,7 +32,6 @@ var HeadCell = function HeadCell(props) {
32
32
  _props$showSorterTool = props.showSorterTooltip,
33
33
  showSorterTooltip = _props$showSorterTool === void 0 ? true : _props$showSorterTool,
34
34
  tableActionBarShowOnHover = props.tableActionBarShowOnHover,
35
- internalFilters = props.internalFilters,
36
35
  style = props.style,
37
36
  width = props.width,
38
37
  colSpan = props.colSpan,
@@ -116,7 +115,6 @@ var HeadCell = function HeadCell(props) {
116
115
  }, /*#__PURE__*/React.createElement(Filter, _extends({}, rest, {
117
116
  filter: filter,
118
117
  column: props,
119
- internalFilters: internalFilters,
120
118
  onInternalFilter: onInternalFilter,
121
119
  dataIndex: dataIndex
122
120
  })));
@@ -35,6 +35,7 @@ var hasFilterValue = function hasFilterValue(value) {
35
35
  return Array.isArray(value) ? value.length > 0 : value !== '';
36
36
  };
37
37
  var HeaderFilter = /*#__PURE__*/React.memo(function (props) {
38
+ var _filter$filteredValue;
38
39
  var filter = props.filter,
39
40
  column = props.column,
40
41
  getPopupContainer = props.getPopupContainer,
@@ -74,6 +75,26 @@ var HeaderFilter = /*#__PURE__*/React.memo(function (props) {
74
75
  _useState8 = _slicedToArray(_useState7, 2),
75
76
  searchValue = _useState8[0],
76
77
  setSearchValue = _useState8[1];
78
+
79
+ // Controlled columns echo `filteredValue` into the local display state.
80
+ // Only sync while the dropdown is closed so in-progress edits are kept; on
81
+ // close the committed ref is synced too, so `filterOnClose`'s value diff
82
+ // doesn't re-commit the echoed value as if the user had changed it.
83
+ var controlled = filter.filteredValue !== undefined;
84
+ useEffect(function () {
85
+ if (!controlled || open) return;
86
+ var value = filter.filteredValue;
87
+ if (Array.isArray(value)) {
88
+ setSelectNodes(_toConsumableArray(value));
89
+ setSearchValue('');
90
+ } else {
91
+ setSearchValue(String(value));
92
+ setSelectNodes([]);
93
+ }
94
+ var committed = Array.isArray(value) ? _toConsumableArray(value) : value;
95
+ committedValueRef.current = committed;
96
+ setCommittedValue(committed);
97
+ }, [controlled, filter.filteredValue, open]);
77
98
  useEffect(function () {
78
99
  if (!open) return;
79
100
  var raf = requestAnimationFrame(function () {
@@ -226,7 +247,7 @@ var HeaderFilter = /*#__PURE__*/React.memo(function (props) {
226
247
  }
227
248
  setOpen(nextOpen);
228
249
  };
229
- var isFiltered = filtered !== null && filtered !== void 0 ? filtered : hasFilterValue(committedValue);
250
+ var isFiltered = filtered !== null && filtered !== void 0 ? filtered : controlled ? hasFilterValue((_filter$filteredValue = filter.filteredValue) !== null && _filter$filteredValue !== void 0 ? _filter$filteredValue : '') : hasFilterValue(committedValue);
230
251
  var renderTrigger = function renderTrigger() {
231
252
  var trigger = typeof icon === 'function' ? icon(isFiltered) : /*#__PURE__*/React.createElement(Button, {
232
253
  icon: items ? /*#__PURE__*/React.createElement(ListFilter, {
@@ -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-09-14T02:29:50.905Z
4
+ * Generated on 2026-09-14T07:04:58.616Z
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-09-14T02:29:50.905Z
4
+ * Generated on 2026-09-14T07:04:58.616Z
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.12.2";
6
+ export declare const version = "0.13.0";
@@ -1,4 +1,4 @@
1
- export var version = "0.12.2";
1
+ export var version = "0.13.0";
2
2
  if (typeof window !== 'undefined') {
3
3
  window.__yee_c_version__ = version;
4
4
  }