@rainbow-oh/yee-c 0.12.2 → 0.14.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 (56) hide show
  1. package/dist/cjs/Field/demo/standalone.d.ts +3 -0
  2. package/dist/cjs/Field/demo/standalone.js +56 -0
  3. package/dist/cjs/Field/field.js +20 -11
  4. package/dist/cjs/Field/interface.d.ts +7 -4
  5. package/dist/cjs/Field/style/index.less +1 -0
  6. package/dist/cjs/Table/demo/controlled-filter.d.ts +3 -0
  7. package/dist/cjs/Table/demo/controlled-filter.js +105 -0
  8. package/dist/cjs/Table/hooks/useFilter.d.ts +5 -1
  9. package/dist/cjs/Table/hooks/useFilter.js +80 -42
  10. package/dist/cjs/Table/index.d.ts +1 -1
  11. package/dist/cjs/Table/interface.d.ts +14 -4
  12. package/dist/cjs/Table/table.js +22 -25
  13. package/dist/cjs/Table/theader/cell.js +0 -3
  14. package/dist/cjs/Table/theader/filter.js +22 -5
  15. package/dist/cjs/style/themes.css +1 -1
  16. package/dist/cjs/style/variables.css +1 -1
  17. package/dist/cjs/version.d.ts +1 -1
  18. package/dist/cjs/version.js +1 -1
  19. package/dist/esm/Field/demo/standalone.d.ts +3 -0
  20. package/dist/esm/Field/demo/standalone.js +43 -0
  21. package/dist/esm/Field/field.js +24 -11
  22. package/dist/esm/Field/interface.d.ts +7 -4
  23. package/dist/esm/Field/style/index.less +1 -0
  24. package/dist/esm/Table/demo/controlled-filter.d.ts +3 -0
  25. package/dist/esm/Table/demo/controlled-filter.js +122 -0
  26. package/dist/esm/Table/hooks/useFilter.d.ts +5 -1
  27. package/dist/esm/Table/hooks/useFilter.js +112 -69
  28. package/dist/esm/Table/index.d.ts +1 -1
  29. package/dist/esm/Table/interface.d.ts +14 -4
  30. package/dist/esm/Table/table.js +34 -21
  31. package/dist/esm/Table/theader/cell.js +1 -3
  32. package/dist/esm/Table/theader/filter.js +22 -1
  33. package/dist/esm/style/themes.css +1 -1
  34. package/dist/esm/style/variables.css +1 -1
  35. package/dist/esm/version.d.ts +1 -1
  36. package/dist/esm/version.js +1 -1
  37. package/dist/umd/yee-c.min.css +1 -1
  38. package/dist/umd/yee-c.min.js +1 -1
  39. package/package.json +1 -1
  40. package/src/Field/demo/standalone.tsx +30 -0
  41. package/src/Field/field.tsx +38 -22
  42. package/src/Field/index.en-US.md +8 -4
  43. package/src/Field/index.zh-CN.md +8 -4
  44. package/src/Field/interface.ts +7 -4
  45. package/src/Field/style/index.less +1 -0
  46. package/src/Table/demo/controlled-filter.tsx +107 -0
  47. package/src/Table/hooks/useFilter.ts +107 -49
  48. package/src/Table/index.en-US.md +22 -1
  49. package/src/Table/index.ts +1 -0
  50. package/src/Table/index.zh-CN.md +22 -1
  51. package/src/Table/interface.ts +14 -2
  52. package/src/Table/table-filter.test.tsx +343 -0
  53. package/src/Table/table.tsx +29 -27
  54. package/src/Table/theader/cell.tsx +0 -2
  55. package/src/Table/theader/filter.tsx +26 -1
  56. package/src/version.ts +1 -1
@@ -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-17T09:06:26.119Z
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-17T09:06:26.119Z
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.14.0";
@@ -1,4 +1,4 @@
1
- export var version = "0.12.2";
1
+ export var version = "0.14.0";
2
2
  if (typeof window !== 'undefined') {
3
3
  window.__yee_c_version__ = version;
4
4
  }