@arim-aisdc/public-components 2.3.86 → 2.3.88

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 (23) hide show
  1. package/dist/components/CacheTabs/index.less +1 -0
  2. package/dist/components/ConfigProvider/context.d.ts +1 -0
  3. package/dist/components/TableMax/TableHeader/Cell.d.ts +2 -1
  4. package/dist/components/TableMax/TableHeader/Cell.js +4 -2
  5. package/dist/components/TableMax/TableHeader/OriginalTableHeader.d.ts +2 -1
  6. package/dist/components/TableMax/TableHeader/OriginalTableHeader.js +4 -2
  7. package/dist/components/TableMax/TableMax.js +28 -3
  8. package/dist/components/TableMax/components/ColumnFilterV2/Filter.d.ts +1 -0
  9. package/dist/components/TableMax/components/ColumnFilterV2/Filter.js +60 -36
  10. package/dist/components/TableMax/components/ColumnFilterV2/TextFilter/index.d.ts +19 -0
  11. package/dist/components/TableMax/components/ColumnFilterV2/TextFilter/index.js +339 -0
  12. package/dist/components/TableMax/components/ColumnFilterV2/TextFilter/index.less +89 -0
  13. package/dist/components/TableMax/components/ColumnFilterV2/customFilterFns.d.ts +1 -0
  14. package/dist/components/TableMax/components/ColumnFilterV2/customFilterFns.js +97 -5
  15. package/dist/components/TableMax/components/ColumnFilterV2/index.d.ts +2 -1
  16. package/dist/components/TableMax/components/ColumnFilterV2/index.js +5 -3
  17. package/dist/components/TableMax/components/ColumnFilterV2/index.less +2 -3
  18. package/dist/components/TableMax/hooks/useColumnWidth.js +2 -3
  19. package/dist/components/TableMax/type.d.ts +2 -0
  20. package/dist/components/TableMax/utils.d.ts +1 -0
  21. package/dist/components/TableMax/utils.js +36 -16
  22. package/dist/locales/zh_CN.js +4 -1
  23. package/package.json +1 -1
@@ -60,6 +60,7 @@
60
60
  white-space: nowrap;
61
61
  overflow: hidden;
62
62
  max-width: 96px;
63
+ font-size: 14px;
63
64
  }
64
65
  &>.ant-tabs-nav .ant-tabs-tab .ant-tabs-tab-remove {
65
66
  padding: 0 !important;
@@ -34,6 +34,7 @@ export interface ConfigConsumerProps {
34
34
  canSelectionUseShift?: boolean;
35
35
  openNullValueFilter?: boolean;
36
36
  openIndexColumn?: boolean;
37
+ useTextFilter?: boolean;
37
38
  };
38
39
  keepAliveActivateKey?: number;
39
40
  keepAliveUnactivateKey?: number;
@@ -16,6 +16,7 @@ type ICellType = {
16
16
  manualFiltering: boolean;
17
17
  getDynamicFilterOptionsFn?: Function;
18
18
  openNullValueFilter?: boolean;
19
+ useTextFilter?: boolean;
19
20
  };
20
- declare const Cell: ({ tableContentRef, header, table, hasGroup, canSorting, getHeaderCellProps, disableColumnDrag, headerRowNum, canFilter, manualFiltering, getDynamicFilterOptionsFn, openNullValueFilter }: ICellType) => import("react/jsx-runtime").JSX.Element;
21
+ declare const Cell: ({ tableContentRef, header, table, hasGroup, canSorting, getHeaderCellProps, disableColumnDrag, headerRowNum, canFilter, manualFiltering, getDynamicFilterOptionsFn, openNullValueFilter, useTextFilter }: ICellType) => import("react/jsx-runtime").JSX.Element;
21
22
  export default Cell;
@@ -43,7 +43,8 @@ var Cell = function Cell(_ref) {
43
43
  canFilter = _ref.canFilter,
44
44
  manualFiltering = _ref.manualFiltering,
45
45
  getDynamicFilterOptionsFn = _ref.getDynamicFilterOptionsFn,
46
- openNullValueFilter = _ref.openNullValueFilter;
46
+ openNullValueFilter = _ref.openNullValueFilter,
47
+ useTextFilter = _ref.useTextFilter;
47
48
  var _useConfig = useConfig(),
48
49
  root = _useConfig.root;
49
50
  var cannotDragColumn = [ColumnType.Darg, ColumnType.Selection, ColumnType.Expander, ColumnType.PlaceHolder];
@@ -135,7 +136,8 @@ var Cell = function Cell(_ref) {
135
136
  column: header.column,
136
137
  manualFiltering: manualFiltering,
137
138
  getDynamicFilterOptionsFn: getDynamicFilterOptionsFn,
138
- openNullValueFilter: openNullValueFilter
139
+ openNullValueFilter: openNullValueFilter,
140
+ useTextFilter: useTextFilter
139
141
  }) : null]
140
142
  }) : null, /*#__PURE__*/_jsx("div", {
141
143
  className: "cell-resize-handler ".concat(header.column.getIsResizing() ? 'column-is-resizing' : ''),
@@ -17,6 +17,7 @@ export type TableHeaderProps = {
17
17
  manualFiltering: boolean;
18
18
  getDynamicFilterOptionsFn?: Function;
19
19
  openNullValueFilter?: boolean;
20
+ useTextFilter?: boolean;
20
21
  };
21
- declare const OriginalTableHeader: ({ tableContentRef, table, canFilter, enableFilters, canSorting, hasGroup, getHeaderCellProps, columnResizeMode, disableColumnDrag, rowHeight, headerRowNum, manualFiltering, getDynamicFilterOptionsFn, openNullValueFilter }: TableHeaderProps) => import("react/jsx-runtime").JSX.Element;
22
+ declare const OriginalTableHeader: ({ tableContentRef, table, canFilter, enableFilters, canSorting, hasGroup, getHeaderCellProps, columnResizeMode, disableColumnDrag, rowHeight, headerRowNum, manualFiltering, getDynamicFilterOptionsFn, openNullValueFilter, useTextFilter }: TableHeaderProps) => import("react/jsx-runtime").JSX.Element;
22
23
  export { OriginalTableHeader };
@@ -23,7 +23,8 @@ var OriginalTableHeader = function OriginalTableHeader(_ref) {
23
23
  headerRowNum = _ref.headerRowNum,
24
24
  manualFiltering = _ref.manualFiltering,
25
25
  getDynamicFilterOptionsFn = _ref.getDynamicFilterOptionsFn,
26
- openNullValueFilter = _ref.openNullValueFilter;
26
+ openNullValueFilter = _ref.openNullValueFilter,
27
+ useTextFilter = _ref.useTextFilter;
27
28
  var headerGroups = table.getHeaderGroups();
28
29
  var headers = (headerGroups === null || headerGroups === void 0 || (_headerGroups = headerGroups[headerGroups.length - 1]) === null || _headerGroups === void 0 ? void 0 : _headerGroups.headers) || [];
29
30
  return (
@@ -60,7 +61,8 @@ var OriginalTableHeader = function OriginalTableHeader(_ref) {
60
61
  canFilter: canFilter,
61
62
  manualFiltering: manualFiltering,
62
63
  getDynamicFilterOptionsFn: getDynamicFilterOptionsFn,
63
- openNullValueFilter: openNullValueFilter
64
+ openNullValueFilter: openNullValueFilter,
65
+ useTextFilter: useTextFilter
64
66
  }, header.id)
65
67
  }, header.id);
66
68
  })
@@ -213,6 +213,7 @@ var TableMax = function TableMax(_ref) {
213
213
  _ref$openVirtualRows = _ref.openVirtualRows,
214
214
  openVirtualRows = _ref$openVirtualRows === void 0 ? false : _ref$openVirtualRows,
215
215
  openNullValueFilter = _ref.openNullValueFilter,
216
+ useTextFilter = _ref.useTextFilter,
216
217
  openIndexColumn = _ref.openIndexColumn,
217
218
  version = _ref.version;
218
219
  var tableMaxRef = useRef(null);
@@ -241,6 +242,7 @@ var TableMax = function TableMax(_ref) {
241
242
  globalCanExport = _ref2.canExport,
242
243
  canSelectionUseShift = _ref2.canSelectionUseShift,
243
244
  openNullValueFilter = _ref2.openNullValueFilter,
245
+ useTextFilter = _ref2.useTextFilter,
244
246
  openIndexColumn = _ref2.openIndexColumn;
245
247
  return {
246
248
  globalCanExport: globalCanExport,
@@ -249,6 +251,7 @@ var TableMax = function TableMax(_ref) {
249
251
  cacheMaxAge: cacheMaxAge,
250
252
  openMemo: openMemo,
251
253
  openNullValueFilter: openNullValueFilter,
254
+ useTextFilter: useTextFilter,
252
255
  openIndexColumn: openIndexColumn
253
256
  };
254
257
  }, [JSON.stringify(tableMax)]);
@@ -530,18 +533,22 @@ var TableMax = function TableMax(_ref) {
530
533
  var arr = newColumnOrder;
531
534
  if (!tableId) {
532
535
  setColumnOrder(arr);
536
+ console.log(arr, '表格列顺序1');
533
537
  return;
534
538
  }
535
539
  var cache = JSON.parse((_localStorage$getItem = localStorage.getItem(tableKey)) !== null && _localStorage$getItem !== void 0 ? _localStorage$getItem : '{}');
536
540
  if (version && version !== (cache === null || cache === void 0 ? void 0 : cache.version)) {
537
541
  setColumnOrder(arr);
542
+ console.log(arr, '表格列顺序2');
538
543
  return;
539
544
  }
540
545
  ;
541
- if (cache && cache !== null && cache !== void 0 && cache.editTime && +new Date() - cache.editTime > ((_tableMaxConfig$cache = tableMaxConfig.cacheMaxAge) !== null && _tableMaxConfig$cache !== void 0 ? _tableMaxConfig$cache : CACHE_MAX_AGE)) {
546
+ if (cache && tableMaxConfig.cacheMaxAge && cache !== null && cache !== void 0 && cache.editTime && +new Date() - cache.editTime > ((_tableMaxConfig$cache = tableMaxConfig.cacheMaxAge) !== null && _tableMaxConfig$cache !== void 0 ? _tableMaxConfig$cache : CACHE_MAX_AGE)) {
542
547
  setColumnOrder(arr);
548
+ console.log(arr, '表格列顺序3');
543
549
  return;
544
550
  }
551
+ console.log(tableKey, cache, '表格缓存数据');
545
552
  var columnsIdSet = new Set(tableColumns.map(function (column) {
546
553
  return column.id;
547
554
  }));
@@ -609,7 +616,9 @@ var TableMax = function TableMax(_ref) {
609
616
  return !newColumnOrder.includes(columnId);
610
617
  }).length === 0) {
611
618
  arr = cacheColumnOrder;
619
+ console.log(arr, '表格列顺序4');
612
620
  }
621
+ console.log(arr, cacheColumnOrder, '表格列顺序5');
613
622
  setColumnOrder(arr);
614
623
  };
615
624
  var recentlyCheckedRow = useRef(null);
@@ -756,6 +765,7 @@ var TableMax = function TableMax(_ref) {
756
765
 
757
766
  // 初始化列
758
767
  useEffect(function () {
768
+ console.log("tableId", tableId, !tableMaxRef.current || !tableContentRef.current || !tableId);
759
769
  if (!tableMaxRef.current || !tableContentRef.current || !tableId) return;
760
770
  if (!Array.isArray(columns) || columns.length === 0) return;
761
771
  // 根据props,自动增加勾选列/展开列
@@ -846,6 +856,20 @@ var TableMax = function TableMax(_ref) {
846
856
  if (!tableId) return;
847
857
  cacheTimer.current = setTimeout(function () {
848
858
  var tableState = table.getState();
859
+ console.log('缓存表格状态:', {
860
+ enableFilters: enableFilters,
861
+ headerRowNum: headerRowNum,
862
+ compactMode: compactMode,
863
+ columnVisibility: tableState.columnVisibility,
864
+ columnPinning: tableState.columnPinning,
865
+ columnOrder: tableState.columnOrder,
866
+ columnFilters: tableState.columnFilters,
867
+ columnSorting: tableState.sorting,
868
+ columnSizing: columnSizing,
869
+ editTime: +new Date(),
870
+ editTimeCh: dayjs().format('YYYY-MM-DD HH:mm:ss'),
871
+ version: version
872
+ });
849
873
  localStorage.setItem(tableKey, JSON.stringify({
850
874
  enableFilters: enableFilters,
851
875
  headerRowNum: headerRowNum,
@@ -864,7 +888,7 @@ var TableMax = function TableMax(_ref) {
864
888
  return function () {
865
889
  clearTimeout(cacheTimer.current);
866
890
  };
867
- }, [table.getState().columnVisibility, table.getState().columnPinning, table.getState().columnOrder, table.getState().columnFilters, table.getState().sorting, enableFilters, headerRowNum, compactMode, columnSizing, tableId]);
891
+ }, [JSON.stringify(table.getState().columnVisibility), JSON.stringify(table.getState().columnPinning), JSON.stringify(table.getState().columnOrder), JSON.stringify(table.getState().columnFilters), JSON.stringify(table.getState().sorting), enableFilters, headerRowNum, compactMode, columnSizing, tableId]);
868
892
  var reorderRow = useCallback(function (fromDatas, toDatas) {
869
893
  var draggedRow = fromDatas.draggedRow,
870
894
  isMultipleDrag = fromDatas.isMultipleDrag,
@@ -1105,7 +1129,8 @@ var TableMax = function TableMax(_ref) {
1105
1129
  manualFiltering: manualFiltering,
1106
1130
  getDynamicFilterOptionsFn: getDynamicFilterOptionsFn,
1107
1131
  tableHeaderRef: tableHeaderRef,
1108
- openNullValueFilter: openNullValueFilter !== null && openNullValueFilter !== void 0 ? openNullValueFilter : tableMaxConfig === null || tableMaxConfig === void 0 ? void 0 : tableMaxConfig.openNullValueFilter
1132
+ openNullValueFilter: openNullValueFilter !== null && openNullValueFilter !== void 0 ? openNullValueFilter : tableMaxConfig === null || tableMaxConfig === void 0 ? void 0 : tableMaxConfig.openNullValueFilter,
1133
+ useTextFilter: useTextFilter !== null && useTextFilter !== void 0 ? useTextFilter : tableMaxConfig === null || tableMaxConfig === void 0 ? void 0 : tableMaxConfig.useTextFilter
1109
1134
  };
1110
1135
  var tableBodyProps = {
1111
1136
  tableContentRef: tableContentRef,
@@ -6,6 +6,7 @@ type IProps = {
6
6
  onCloseFilterPanel: () => void;
7
7
  manualFiltering: boolean;
8
8
  openNullValueFilter?: boolean;
9
+ useTextFilter?: boolean;
9
10
  };
10
11
  declare const Filter: React.FC<IProps>;
11
12
  export default Filter;
@@ -19,14 +19,17 @@ import { DateRange } from "./DateRange";
19
19
  import MultipleSelect from "./MultipleSelect";
20
20
  import NumberRange from "./NumberRange";
21
21
  import SingleSelect from "./SingleSelect";
22
+ import TextFilter from "./TextFilter";
22
23
  import { jsx as _jsx } from "react/jsx-runtime";
23
24
  import { jsxs as _jsxs } from "react/jsx-runtime";
25
+ import { Fragment as _Fragment } from "react/jsx-runtime";
24
26
  var Filter = function Filter(_ref) {
25
27
  var getDynamicFilterOptionsFn = _ref.getDynamicFilterOptionsFn,
26
28
  column = _ref.column,
27
29
  onCloseFilterPanel = _ref.onCloseFilterPanel,
28
30
  manualFiltering = _ref.manualFiltering,
29
- openNullValueFilter = _ref.openNullValueFilter;
31
+ openNullValueFilter = _ref.openNullValueFilter,
32
+ useTextFilter = _ref.useTextFilter;
30
33
  var columnDef = column === null || column === void 0 ? void 0 : column.columnDef;
31
34
  // 筛选组件类型
32
35
  var id = columnDef.id,
@@ -72,7 +75,6 @@ var Filter = function Filter(_ref) {
72
75
  // 值为null或空数组时,清除过滤条件。
73
76
  newValue = undefined;
74
77
  }
75
- // console.log('handleChangeFilterValue :>> ', newValue);
76
78
  setColumnFilterValue(newValue);
77
79
  column.setFilterValue(newValue);
78
80
  };
@@ -83,7 +85,6 @@ var Filter = function Filter(_ref) {
83
85
  // 值为null或空数组时,清除过滤条件。
84
86
  newValue = undefined;
85
87
  }
86
- // console.log('handleChangeFilterValue :>> ', newValue);
87
88
  setColumnFilterValue(isEmpty(newValue) ? undefined : {
88
89
  filterValue: newValue,
89
90
  optionsParam: inputSearchValue
@@ -94,6 +95,18 @@ var Filter = function Filter(_ref) {
94
95
  });
95
96
  };
96
97
 
98
+ // 修改表格TextFilter筛选参数
99
+ var changeTextFilterValue = useCallback(function (value) {
100
+ if (value === null) {
101
+ // 值为null或空数组时,清除过滤条件。
102
+ column.setFilterValue(undefined);
103
+ setColumnFilterValue(undefined);
104
+ } else {
105
+ column.setFilterValue(value);
106
+ setColumnFilterValue(value);
107
+ }
108
+ }, [column]);
109
+
97
110
  // 修改表格筛选参数(防抖)
98
111
  var changeFilterValueWithDebounce = useCallback(debounce(function (value) {
99
112
  var newValue = value;
@@ -101,7 +114,6 @@ var Filter = function Filter(_ref) {
101
114
  // 值为null或空数组时,清除过滤条件。
102
115
  newValue = undefined;
103
116
  }
104
- // console.log('handleChangeFilterValue with debounce :>> ', newValue);
105
117
  column.setFilterValue(newValue);
106
118
  }, 500), [column]);
107
119
 
@@ -316,41 +328,53 @@ var Filter = function Filter(_ref) {
316
328
  })
317
329
  });
318
330
  case FilterType.AutoComplete:
319
- return /*#__PURE__*/_jsxs("div", {
320
- className: "single-com-wrapper",
321
- children: [/*#__PURE__*/_jsx(AutoComplete, {
322
- options: options,
323
- placeholder: "",
324
- filterOption: !!getFilterOptionsFn ? false : function (inputValue, option) {
325
- var _option$label, _optionStringValue$to;
326
- var optionStringValue = ((_option$label = option === null || option === void 0 ? void 0 : option.label) !== null && _option$label !== void 0 ? _option$label : '') + '';
327
- var inputStringValue = (inputValue !== null && inputValue !== void 0 ? inputValue : '') + '';
328
- // console.log('object', optionStringValue, inputStringValue);
329
- return ((_optionStringValue$to = optionStringValue.toUpperCase()) === null || _optionStringValue$to === void 0 ? void 0 : _optionStringValue$to.indexOf(inputStringValue.toUpperCase().trim())) !== -1;
330
- },
331
- onSearch: onSearch,
332
- onChange: handleChangeFilterValueWithDebounce,
333
- style: {
334
- width: 188
335
- },
336
- allowClear: true,
337
- value: columnFilterValue
338
- }), quickInput]
331
+ return /*#__PURE__*/_jsx(_Fragment, {
332
+ children: useTextFilter ? /*#__PURE__*/_jsx(TextFilter, {
333
+ value: columnFilterValue,
334
+ onChange: changeTextFilterValue,
335
+ openNullValueFilter: openNullValueFilter
336
+ }) : /*#__PURE__*/_jsxs("div", {
337
+ className: "single-com-wrapper",
338
+ children: [/*#__PURE__*/_jsx(AutoComplete, {
339
+ options: options,
340
+ placeholder: "",
341
+ filterOption: !!getFilterOptionsFn ? false : function (inputValue, option) {
342
+ var _option$label, _optionStringValue$to;
343
+ var optionStringValue = ((_option$label = option === null || option === void 0 ? void 0 : option.label) !== null && _option$label !== void 0 ? _option$label : '') + '';
344
+ var inputStringValue = (inputValue !== null && inputValue !== void 0 ? inputValue : '') + '';
345
+ // console.log('object', optionStringValue, inputStringValue);
346
+ return ((_optionStringValue$to = optionStringValue.toUpperCase()) === null || _optionStringValue$to === void 0 ? void 0 : _optionStringValue$to.indexOf(inputStringValue.toUpperCase().trim())) !== -1;
347
+ },
348
+ onSearch: onSearch,
349
+ onChange: handleChangeFilterValueWithDebounce,
350
+ style: {
351
+ width: 188
352
+ },
353
+ allowClear: true,
354
+ value: columnFilterValue
355
+ }), quickInput]
356
+ })
339
357
  });
340
358
  case FilterType.Input:
341
- return /*#__PURE__*/_jsxs("div", {
342
- className: "single-com-wrapper",
343
- children: [/*#__PURE__*/_jsx(Input, {
344
- onChange: function onChange(e) {
345
- return handleChangeFilterValueWithDebounce(e.target.value);
346
- },
347
- style: {
348
- width: 188
349
- },
350
- allowClear: true,
359
+ return /*#__PURE__*/_jsx(_Fragment, {
360
+ children: useTextFilter ? /*#__PURE__*/_jsx(TextFilter, {
351
361
  value: columnFilterValue,
352
- placeholder: t('global.placeholder.input')
353
- }), quickInput]
362
+ onChange: changeTextFilterValue,
363
+ openNullValueFilter: openNullValueFilter
364
+ }) : /*#__PURE__*/_jsxs("div", {
365
+ className: "single-com-wrapper",
366
+ children: [/*#__PURE__*/_jsx(Input, {
367
+ onChange: function onChange(e) {
368
+ return handleChangeFilterValueWithDebounce(e.target.value);
369
+ },
370
+ style: {
371
+ width: 188
372
+ },
373
+ allowClear: true,
374
+ value: columnFilterValue,
375
+ placeholder: t('global.placeholder.input')
376
+ }), quickInput]
377
+ })
354
378
  });
355
379
  case FilterType.SingleSelect:
356
380
  return /*#__PURE__*/_jsx(SingleSelect, {
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import './index.less';
3
+ import { FilterOperator } from '../../../type';
4
+ /** Text filter operator types */
5
+ export type TextFilterOperator = FilterOperator.Contains | FilterOperator.In | FilterOperator.Between | FilterOperator.IsNull | FilterOperator.IsNotNull;
6
+ /** Text filter value structure - new format */
7
+ export interface TextFilterValue {
8
+ filterValue?: string | string[];
9
+ operator: TextFilterOperator;
10
+ }
11
+ /** Text filter value - old format (backward compatible) */
12
+ export type TextFilterLegacyValue = string;
13
+ interface IProps {
14
+ value: TextFilterValue | TextFilterLegacyValue | undefined;
15
+ onChange: (value: TextFilterValue | TextFilterLegacyValue | undefined) => void;
16
+ openNullValueFilter?: boolean;
17
+ }
18
+ declare const TextFilter: React.FC<IProps>;
19
+ export default TextFilter;
@@ -0,0 +1,339 @@
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); }
2
+ 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; }
3
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
4
+ 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); }
5
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
6
+ 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."); }
7
+ 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); }
8
+ 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; }
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; }
11
+ import { useTranslation } from "../../../../../hooks/useTranslation";
12
+ import { Button, Input, Select } from 'antd';
13
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
14
+ import "./index.less";
15
+ import { FilterOperator } from "../../../type";
16
+
17
+ /** Text filter operator types */
18
+
19
+ /** Text filter value structure - new format */
20
+
21
+ /** Text filter value - old format (backward compatible) */
22
+ import { jsx as _jsx } from "react/jsx-runtime";
23
+ import { jsxs as _jsxs } from "react/jsx-runtime";
24
+ var TextFilter = function TextFilter(_ref) {
25
+ var value = _ref.value,
26
+ onChange = _ref.onChange,
27
+ openNullValueFilter = _ref.openNullValueFilter;
28
+ var _useTranslation = useTranslation(),
29
+ _useTranslation2 = _slicedToArray(_useTranslation, 1),
30
+ t = _useTranslation2[0];
31
+
32
+ // Operator options
33
+ var operatorOptions = useMemo(function () {
34
+ return [{
35
+ label: '包含',
36
+ value: FilterOperator.Contains
37
+ },
38
+ // { label: '属于', value: FilterOperator.In },
39
+ {
40
+ label: '介于',
41
+ value: FilterOperator.Between
42
+ }, {
43
+ label: '空值',
44
+ value: FilterOperator.IsNull
45
+ }, {
46
+ label: '非空值',
47
+ value: FilterOperator.IsNotNull
48
+ }];
49
+ }, [t]);
50
+
51
+ // Parse initial value
52
+ var parseInitialValue = useCallback(function () {
53
+ var _value$filterValue;
54
+ if (value === undefined || value === null || value === '') {
55
+ return {
56
+ operator: FilterOperator.Contains,
57
+ filterValue: ''
58
+ };
59
+ }
60
+
61
+ // Old format: string
62
+ if (typeof value === 'string') {
63
+ return {
64
+ operator: FilterOperator.Contains,
65
+ filterValue: value
66
+ };
67
+ }
68
+
69
+ // New format: { filterValue, operator }
70
+ return {
71
+ operator: value.operator || FilterOperator.Contains,
72
+ filterValue: (_value$filterValue = value.filterValue) !== null && _value$filterValue !== void 0 ? _value$filterValue : ''
73
+ };
74
+ }, [value]);
75
+ var _useState = useState(parseInitialValue().operator),
76
+ _useState2 = _slicedToArray(_useState, 2),
77
+ operator = _useState2[0],
78
+ setOperator = _useState2[1];
79
+ var _useState3 = useState(parseInitialValue().filterValue),
80
+ _useState4 = _slicedToArray(_useState3, 2),
81
+ filterValue = _useState4[0],
82
+ setFilterValue = _useState4[1];
83
+
84
+ // For between operator - two input values
85
+ var _useState5 = useState(''),
86
+ _useState6 = _slicedToArray(_useState5, 2),
87
+ betweenValue1 = _useState6[0],
88
+ setBetweenValue1 = _useState6[1];
89
+ var _useState7 = useState(''),
90
+ _useState8 = _slicedToArray(_useState7, 2),
91
+ betweenValue2 = _useState8[0],
92
+ setBetweenValue2 = _useState8[1];
93
+
94
+ // 记录上一次的 filterValue,用于判断空值切换
95
+ var _useState9 = useState(parseInitialValue().filterValue),
96
+ _useState10 = _slicedToArray(_useState9, 2),
97
+ prevFilterValue = _useState10[0],
98
+ setPrevFilterValue = _useState10[1];
99
+
100
+ // 防抖定时器引用
101
+ var debounceTimerRef = useRef(null);
102
+
103
+ // 工具函数:判断值是否为空
104
+ var isValueEmpty = useCallback(function (val) {
105
+ if (val === undefined || val === null || val === '') return true;
106
+ if (Array.isArray(val)) return val.every(function (v) {
107
+ return !v || v.trim() === '';
108
+ });
109
+ return !val || val.trim() === '';
110
+ }, []);
111
+
112
+ // Sync with external value changes
113
+ useEffect(function () {
114
+ var parsed = parseInitialValue();
115
+ setOperator(parsed.operator);
116
+ setFilterValue(parsed.filterValue);
117
+ setPrevFilterValue(parsed.filterValue);
118
+ if (parsed.operator === FilterOperator.Between && Array.isArray(parsed.filterValue)) {
119
+ setBetweenValue1(parsed.filterValue[0] || '');
120
+ setBetweenValue2(parsed.filterValue[1] || '');
121
+ }
122
+ }, [parseInitialValue]);
123
+
124
+ // 构建最终的 filterValue
125
+ var buildResult = useCallback(function (finalFilterValue, finalOperator) {
126
+ var _map$finalOperator;
127
+ var map = _defineProperty(_defineProperty({}, FilterOperator.IsNotNull, 'NOT NULL'), FilterOperator.IsNull, 'NULL');
128
+ var result = {
129
+ filterValue: (_map$finalOperator = map[finalOperator]) !== null && _map$finalOperator !== void 0 ? _map$finalOperator : finalFilterValue,
130
+ operator: finalOperator
131
+ };
132
+
133
+ // // Backward compatibility: if operator is FilterOperator.Contains and value is simple string, also support old format
134
+ // if (finalOperator === FilterOperator.Contains && typeof finalFilterValue === 'string' && !finalFilterValue.includes(',')) {
135
+ // return finalFilterValue;
136
+ // }
137
+
138
+ return result;
139
+ }, []);
140
+
141
+ // 处理空值切换判断和触发回调
142
+ var handleValueChange = useCallback(function (newFilterValue, newOperator) {
143
+ var isFromBetween = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
144
+ // 判断是否空值切换
145
+ var isOldEmpty = isValueEmpty(prevFilterValue);
146
+ var isNewEmpty = isValueEmpty(newFilterValue);
147
+ var isEmptyToggle = isOldEmpty !== isNewEmpty;
148
+
149
+ // between 模式下一个有值触发
150
+ if (newOperator === FilterOperator.Between) {
151
+ var _arr$, _arr$2;
152
+ var arr = newFilterValue;
153
+ var hasValues = ((_arr$ = arr[0]) === null || _arr$ === void 0 ? void 0 : _arr$.trim()) || ((_arr$2 = arr[1]) === null || _arr$2 === void 0 ? void 0 : _arr$2.trim());
154
+ // if (!hasValues) {
155
+ // setPrevFilterValue(newFilterValue);
156
+ // return;
157
+ // }
158
+ setPrevFilterValue(newFilterValue);
159
+ }
160
+ var result = buildResult(newFilterValue, newOperator);
161
+ if (isEmptyToggle) {
162
+ // 空值切换:立即触发
163
+ onChange(result);
164
+ setPrevFilterValue(newFilterValue);
165
+ } else {
166
+ // 正常输入:延迟 500ms 触发
167
+ if (debounceTimerRef.current) {
168
+ clearTimeout(debounceTimerRef.current);
169
+ }
170
+ debounceTimerRef.current = setTimeout(function () {
171
+ onChange(result);
172
+ setPrevFilterValue(newFilterValue);
173
+ }, 500);
174
+ }
175
+ }, [prevFilterValue, isValueEmpty, buildResult, onChange]);
176
+
177
+ // Handle operator change
178
+ var handleOperatorChange = useCallback(function (newOperator) {
179
+ // 清除之前的定时器
180
+ if (debounceTimerRef.current) {
181
+ clearTimeout(debounceTimerRef.current);
182
+ }
183
+ setOperator(newOperator);
184
+ if (newOperator === FilterOperator.Between) {
185
+ setBetweenValue1('');
186
+ setBetweenValue2('');
187
+ setPrevFilterValue(['', '']);
188
+ } else if (newOperator === FilterOperator.In) {
189
+ setFilterValue('');
190
+ setPrevFilterValue('');
191
+ } else if (newOperator === FilterOperator.IsNull || newOperator === FilterOperator.IsNotNull) {
192
+ setFilterValue('');
193
+ setPrevFilterValue('');
194
+ var result = buildResult(filterValue, newOperator);
195
+ onChange(result);
196
+ } else {
197
+ setFilterValue('');
198
+ setPrevFilterValue('');
199
+ }
200
+ }, []);
201
+
202
+ // Handle filter value change for contain/in
203
+ var handleInputChange = useCallback(function (e) {
204
+ var newValue = e.target.value;
205
+ setFilterValue(newValue);
206
+ handleValueChange(newValue, operator);
207
+ }, [operator, handleValueChange]);
208
+
209
+ // Handle between value changes
210
+ var handleBetweenValue1Change = useCallback(function (e) {
211
+ var newValue1 = e.target.value;
212
+ setBetweenValue1(newValue1);
213
+ handleValueChange([newValue1, betweenValue2], FilterOperator.Between, true);
214
+ }, [betweenValue2, handleValueChange]);
215
+ var handleBetweenValue2Change = useCallback(function (e) {
216
+ var newValue2 = e.target.value;
217
+ setBetweenValue2(newValue2);
218
+ handleValueChange([betweenValue1, newValue2], FilterOperator.Between, true);
219
+ }, [betweenValue1, handleValueChange]);
220
+
221
+ // 组件卸载时清理定时器
222
+ useEffect(function () {
223
+ return function () {
224
+ if (debounceTimerRef.current) {
225
+ clearTimeout(debounceTimerRef.current);
226
+ }
227
+ };
228
+ }, []);
229
+
230
+ // Quick input for NULL/NOT NULL
231
+ var renderQuickInput = useCallback(function () {
232
+ if (!openNullValueFilter) return null;
233
+ var isNullSelected = typeof value === 'string' && value.toUpperCase().trim() === 'NULL';
234
+ var isNotNullSelected = typeof value === 'string' && (value.toUpperCase().trim() === 'NOT NULL' || value.toUpperCase().trim() === 'NOTNULL');
235
+ return /*#__PURE__*/_jsxs("div", {
236
+ className: "quickly-input",
237
+ children: [/*#__PURE__*/_jsx("p", {
238
+ className: "quickly-input-title",
239
+ children: "\u5FEB\u6377\u8F93\u5165"
240
+ }), /*#__PURE__*/_jsx("p", {
241
+ className: "quickly-input-item ".concat(isNullSelected ? 'quickly-input-item-selected' : ''),
242
+ onClick: function onClick() {
243
+ return onChange({
244
+ operator: FilterOperator.IsNull,
245
+ filterValue: 'NULL'
246
+ });
247
+ },
248
+ children: "\u7A7A\u503C(NULL)"
249
+ }), /*#__PURE__*/_jsx("p", {
250
+ className: "quickly-input-item ".concat(isNotNullSelected ? 'quickly-input-item-selected' : ''),
251
+ onClick: function onClick() {
252
+ return onChange({
253
+ operator: FilterOperator.IsNotNull,
254
+ filterValue: 'NOT NULL'
255
+ });
256
+ },
257
+ children: "\u975E\u7A7A\u503C(NOT NULL)"
258
+ })]
259
+ });
260
+ }, [openNullValueFilter, value, onChange]);
261
+
262
+ // Render single input for contain/in operators
263
+ var renderSingleInput = useCallback(function () {
264
+ var inputValue = typeof filterValue === 'string' ? filterValue : '';
265
+ if (operator === FilterOperator.In) {
266
+ return /*#__PURE__*/_jsx(Input, {
267
+ className: "text-filter-input",
268
+ value: inputValue,
269
+ onChange: handleInputChange,
270
+ placeholder: '输入多个值,空格分隔',
271
+ allowClear: true
272
+ });
273
+ }
274
+ return /*#__PURE__*/_jsx(Input, {
275
+ className: "text-filter-input",
276
+ value: inputValue,
277
+ onChange: handleInputChange,
278
+ placeholder: '请输入',
279
+ allowClear: true
280
+ });
281
+ }, [operator, filterValue, handleInputChange, t]);
282
+
283
+ // Render two inputs for between operator
284
+ var renderBetweenInputs = useCallback(function () {
285
+ return /*#__PURE__*/_jsxs("div", {
286
+ className: "text-filter-between-wrapper",
287
+ children: [/*#__PURE__*/_jsx(Input, {
288
+ className: "text-filter-input",
289
+ value: betweenValue1,
290
+ onChange: handleBetweenValue1Change,
291
+ placeholder: '起始值',
292
+ allowClear: true
293
+ }), /*#__PURE__*/_jsx("span", {
294
+ className: "text-filter-between-separator",
295
+ children: "-"
296
+ }), /*#__PURE__*/_jsx(Input, {
297
+ className: "text-filter-input",
298
+ value: betweenValue2,
299
+ onChange: handleBetweenValue2Change,
300
+ placeholder: '结束值',
301
+ allowClear: true
302
+ })]
303
+ });
304
+ }, [betweenValue1, betweenValue2, handleBetweenValue1Change, handleBetweenValue2Change, t]);
305
+ return /*#__PURE__*/_jsxs("div", {
306
+ className: "tableMax-filter-textFilter",
307
+ children: [/*#__PURE__*/_jsx("div", {
308
+ className: "text-filter-operator",
309
+ children: /*#__PURE__*/_jsx(Select, {
310
+ value: operator,
311
+ onChange: handleOperatorChange,
312
+ options: operatorOptions,
313
+ style: {
314
+ width: "100%",
315
+ height: '32px'
316
+ },
317
+ size: "small",
318
+ dropdownMatchSelectWidth: false,
319
+ getPopupContainer: function getPopupContainer(trigger) {
320
+ return trigger.parentElement || document.body;
321
+ }
322
+ })
323
+ }), /*#__PURE__*/_jsx("div", {
324
+ className: "text-filter-input-wrapper",
325
+ children: operator === FilterOperator.Between ? renderBetweenInputs() : renderSingleInput()
326
+ }), renderQuickInput(), /*#__PURE__*/_jsx(Button, {
327
+ color: "default",
328
+ type: "link",
329
+ onClick: function onClick() {
330
+ return onChange(null);
331
+ },
332
+ style: {
333
+ marginLeft: '140px'
334
+ },
335
+ children: "\u91CD\u7F6E"
336
+ })]
337
+ });
338
+ };
339
+ export default TextFilter;
@@ -0,0 +1,89 @@
1
+ .tableMax-filter-textFilter {
2
+ box-sizing: border-box;
3
+ padding: 8px 12px;
4
+ width: 212px;
5
+ position: relative;
6
+ z-index: 1;
7
+
8
+ .text-filter-operator {
9
+ margin-bottom: 8px;
10
+ :global {
11
+ .ant-select {
12
+ width: 100% !important;
13
+ height: 32px !important;
14
+ }
15
+ }
16
+ }
17
+
18
+ .text-filter-input-wrapper {
19
+ .text-filter-input {
20
+ width: 100%;
21
+ height: 32px;
22
+ padding: 4px 11px;
23
+ border: 1px solid #d9d9d9;
24
+ border-radius: 2px;
25
+ font-size: 14px;
26
+ line-height: 1.5715;
27
+ outline: none;
28
+ transition: border-color 0.3s;
29
+
30
+ &:focus {
31
+ border-color: #40a9ff;
32
+ border-right-width: 1px !important;
33
+ box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
34
+ }
35
+
36
+ &:hover {
37
+ border-color: #40a9ff;
38
+ }
39
+ }
40
+
41
+ .text-filter-between-wrapper {
42
+ display: flex;
43
+ flex-direction: column;
44
+ align-items: center;
45
+ justify-content: center;
46
+ // gap: 4px;
47
+
48
+ .text-filter-input {
49
+ width: 100%
50
+ }
51
+
52
+ .text-filter-between-separator {
53
+ color: #666;
54
+ flex-shrink: 0;
55
+ }
56
+ }
57
+ }
58
+
59
+ .quickly-input {
60
+ margin-top: 8px;
61
+ padding-top: 8px;
62
+ border-top: 1px solid #f0f0f0;
63
+
64
+ .quickly-input-title {
65
+ font-size: 12px;
66
+ color: #666;
67
+ margin: 0 0 4px 0;
68
+ }
69
+
70
+ .quickly-input-item {
71
+ font-size: 13px;
72
+ color: #333;
73
+ padding: 4px 8px;
74
+ margin: 2px 0;
75
+ cursor: pointer;
76
+ border-radius: 2px;
77
+ transition: background-color 0.2s;
78
+
79
+ &:hover {
80
+ background-color: #f5f5f5;
81
+ }
82
+
83
+ &.quickly-input-item-selected {
84
+ background-color: #e6f7ff;
85
+ color: #1890ff;
86
+ }
87
+ }
88
+ }
89
+ }
@@ -4,5 +4,6 @@ declare const customFilterFns: {
4
4
  multiSelectFilter: (row: any, columnId: any, filterValue: any) => any;
5
5
  numberRangeFilter: (row: any, columnId: any, filterValue: any) => boolean;
6
6
  singleSelectFilter: (row: any, columnId: any, filterValue: any) => boolean;
7
+ textFilter: (row: any, columnId: any, filterValue: any) => boolean;
7
8
  };
8
9
  export default customFilterFns;
@@ -1,9 +1,11 @@
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
2
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
3
  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
4
  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); }
4
5
  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; }
5
6
  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; } }
6
7
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
8
+ import { FilterOperator } from "../../type";
7
9
  import { timeRangeFilter } from "./DateRange/index";
8
10
 
9
11
  // AutoComplete使用的模糊筛选
@@ -11,7 +13,6 @@ var fuzzyFilter = function fuzzyFilter(row, columnId, filterValue) {
11
13
  var _row$getValue;
12
14
  var filterStringValue = (filterValue !== null && filterValue !== void 0 ? filterValue : '') + '';
13
15
  var rowStringValue = ((_row$getValue = row.getValue(columnId)) !== null && _row$getValue !== void 0 ? _row$getValue : '') + '';
14
- // console.log('object :>> ', rowStringValue, filterStringValue);
15
16
  // 处理 null 搜索
16
17
  var filterUpper = filterStringValue.toUpperCase().trim();
17
18
  if (filterUpper === 'NULL') {
@@ -31,15 +32,14 @@ var singleSelectFilter = function singleSelectFilter(row, columnId, filterValue)
31
32
  var value = filterValue.filterValue;
32
33
  var filterStringValue = (value !== null && value !== void 0 ? value : '') + '';
33
34
  var rowStringValue = ((_row$getValue2 = row.getValue(columnId)) !== null && _row$getValue2 !== void 0 ? _row$getValue2 : '') + '';
34
- // console.log('object :>> ', rowStringValue, filterStringValue);
35
35
  var filterUpper = filterStringValue.toUpperCase().trim();
36
36
  if (filterUpper === 'NULL') {
37
- return rowStringValue === ''; // 空值包括 null, undefined, 空字符串等
37
+ return rowStringValue === '';
38
38
  }
39
39
 
40
40
  // 处理 not null 搜索
41
41
  if (filterUpper === 'NOT NULL') {
42
- return rowStringValue !== ''; // 非空值
42
+ return rowStringValue !== '';
43
43
  }
44
44
  return rowStringValue.toUpperCase().indexOf(filterStringValue.toUpperCase().trim()) !== -1;
45
45
  };
@@ -78,12 +78,104 @@ var numberRangeFilter = function numberRangeFilter(row, columnId, filterValue) {
78
78
  }
79
79
  };
80
80
 
81
+ // TextFilter 使用的筛选函数,支持 contain、in、between 操作符
82
+ var textFilter = function textFilter(row, columnId, filterValue) {
83
+ var _row$getValue4;
84
+ var rowStringValue = ((_row$getValue4 = row.getValue(columnId)) !== null && _row$getValue4 !== void 0 ? _row$getValue4 : '') + '';
85
+ var rowUpper = rowStringValue.toUpperCase().trim();
86
+
87
+ // 处理 null 搜索
88
+ if (filterValue === 'NULL') {
89
+ return rowStringValue === '';
90
+ }
91
+
92
+ // 处理 not null 搜索
93
+ if (filterValue === 'NOT NULL' || filterValue === 'NOTNULL') {
94
+ return rowStringValue !== '';
95
+ }
96
+
97
+ // 新格式: { filterValue: string | string[], operator: FilterOperator.Contains | FilterOperator.In | FilterOperator.Between }
98
+ if (filterValue && _typeof(filterValue) === 'object' && 'operator' in filterValue) {
99
+ var value = filterValue.filterValue,
100
+ operator = filterValue.operator;
101
+
102
+ // 处理 NULL/NOT NULL
103
+ if (value === 'NULL') {
104
+ return rowStringValue === '';
105
+ }
106
+ if (value === 'NOT NULL' || value === 'NOTNULL') {
107
+ return rowStringValue !== '';
108
+ }
109
+ switch (operator) {
110
+ case FilterOperator.IsNotNull:
111
+ return rowStringValue !== '';
112
+ case FilterOperator.IsNull:
113
+ return rowStringValue === '';
114
+ case FilterOperator.Contains:
115
+ {
116
+ // 包含筛选
117
+ var filterString = (value !== null && value !== void 0 ? value : '') + '';
118
+ return rowUpper.indexOf(filterString.toUpperCase().trim()) !== -1;
119
+ }
120
+ case FilterOperator.Contains:
121
+ {
122
+ // 包含筛选
123
+ var _filterString = (value !== null && value !== void 0 ? value : '') + '';
124
+ return rowUpper.indexOf(_filterString.toUpperCase().trim()) !== -1;
125
+ }
126
+ case FilterOperator.In:
127
+ {
128
+ // 属于筛选 - 检查值是否在列表中
129
+ if (Array.isArray(value)) {
130
+ return value.some(function (v) {
131
+ var vStr = (v !== null && v !== void 0 ? v : '') + '';
132
+ return vStr.toUpperCase().trim() === rowUpper;
133
+ });
134
+ }
135
+ // 如果是字符串,尝试按逗号分隔
136
+ var values = ((value !== null && value !== void 0 ? value : '') + '').split(',').map(function (v) {
137
+ return v.trim().toUpperCase();
138
+ });
139
+ return values.includes(rowUpper);
140
+ }
141
+ case FilterOperator.Between:
142
+ {
143
+ // 介于筛选 - 对字符串进行范围比较
144
+ if (Array.isArray(value) && value.length === 2) {
145
+ var _value = _slicedToArray(value, 2),
146
+ min = _value[0],
147
+ max = _value[1];
148
+ var minUpper = (min !== null && min !== void 0 ? min : '').toUpperCase().trim();
149
+ var maxUpper = (max !== null && max !== void 0 ? max : '').toUpperCase().trim();
150
+
151
+ // 如果两者都为空,返回 true(不筛选)
152
+ if (!minUpper && !maxUpper) return true;
153
+ // 只有最小值
154
+ if (minUpper && !maxUpper) return rowUpper >= minUpper;
155
+ // 只有最大值
156
+ if (!minUpper && maxUpper) return rowUpper <= maxUpper;
157
+ // 两者都有
158
+ return rowUpper >= minUpper && rowUpper <= maxUpper;
159
+ }
160
+ return true;
161
+ }
162
+ default:
163
+ return true;
164
+ }
165
+ }
166
+
167
+ // 旧格式兼容: 直接字符串
168
+ var filterStringValue = (filterValue !== null && filterValue !== void 0 ? filterValue : '') + '';
169
+ return rowUpper.indexOf(filterStringValue.toUpperCase().trim()) !== -1;
170
+ };
171
+
81
172
  // 自定义的筛选函数,后续都加在这里
82
173
  var customFilterFns = {
83
174
  timeRangeFilter: timeRangeFilter,
84
175
  fuzzyFilter: fuzzyFilter,
85
176
  multiSelectFilter: multiSelectFilter,
86
177
  numberRangeFilter: numberRangeFilter,
87
- singleSelectFilter: singleSelectFilter
178
+ singleSelectFilter: singleSelectFilter,
179
+ textFilter: textFilter
88
180
  };
89
181
  export default customFilterFns;
@@ -30,11 +30,12 @@ export type IFilterFnEnum = {
30
30
  [key in FilterType]: FilterFnType;
31
31
  };
32
32
  export declare function setDefaultFilterFn(columns: TableMaxColumnType[]): TableMaxColumnType[];
33
- export declare function ColumnFilter({ column, manualFiltering, getDynamicFilterOptionsFn, openNullValueFilter }: {
33
+ export declare function ColumnFilter({ column, manualFiltering, getDynamicFilterOptionsFn, openNullValueFilter, useTextFilter }: {
34
34
  column: Column<any, unknown>;
35
35
  manualFiltering: boolean;
36
36
  getDynamicFilterOptionsFn: Function;
37
37
  openNullValueFilter?: boolean;
38
+ useTextFilter?: boolean;
38
39
  }): import("react/jsx-runtime").JSX.Element;
39
40
  export declare function isEmpty(value: any): boolean;
40
41
  export declare function uniqueByField(arr: any, field: any): any;
@@ -36,7 +36,7 @@ export var FilterType = /*#__PURE__*/function (FilterType) {
36
36
  return FilterType;
37
37
  }({}); // 输入框
38
38
  // 不同筛选类型需要特定的过滤函数
39
- var FILTER_FN_ENUM = (_FILTER_FN_ENUM = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_FILTER_FN_ENUM, FilterType.Date, 'timeRangeFilter'), FilterType.DateRange, 'timeRangeFilter'), FilterType.SingleDate, 'fuzzyFilter'), FilterType.MultiSelect, 'multiSelectFilter'), FilterType.Integer, 'numberRangeFilter'), FilterType.NumberRange, 'numberRangeFilter'), FilterType.SingleInteger, 'fuzzyFilter'), FilterType.SingleNumber, 'fuzzyFilter'), FilterType.SingleSelect, 'singleSelectFilter'), FilterType.AutoComplete, 'fuzzyFilter'), _defineProperty(_FILTER_FN_ENUM, FilterType.Input, 'fuzzyFilter'));
39
+ var FILTER_FN_ENUM = (_FILTER_FN_ENUM = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_FILTER_FN_ENUM, FilterType.Date, 'timeRangeFilter'), FilterType.DateRange, 'timeRangeFilter'), FilterType.SingleDate, 'fuzzyFilter'), FilterType.MultiSelect, 'multiSelectFilter'), FilterType.Integer, 'numberRangeFilter'), FilterType.NumberRange, 'numberRangeFilter'), FilterType.SingleInteger, 'fuzzyFilter'), FilterType.SingleNumber, 'fuzzyFilter'), FilterType.SingleSelect, 'singleSelectFilter'), FilterType.AutoComplete, 'textFilter'), _defineProperty(_FILTER_FN_ENUM, FilterType.Input, 'textFilter'));
40
40
 
41
41
  // 给columns配置填充默认的过滤函数
42
42
  export function setDefaultFilterFn(columns) {
@@ -66,7 +66,8 @@ export function ColumnFilter(_ref) {
66
66
  var column = _ref.column,
67
67
  manualFiltering = _ref.manualFiltering,
68
68
  getDynamicFilterOptionsFn = _ref.getDynamicFilterOptionsFn,
69
- openNullValueFilter = _ref.openNullValueFilter;
69
+ openNullValueFilter = _ref.openNullValueFilter,
70
+ useTextFilter = _ref.useTextFilter;
70
71
  var _useConfig = useConfig(),
71
72
  root = _useConfig.root;
72
73
  var _useState = useState(false),
@@ -158,7 +159,8 @@ export function ColumnFilter(_ref) {
158
159
  column: column,
159
160
  onCloseFilterPanel: handleClosePanel,
160
161
  manualFiltering: manualFiltering,
161
- openNullValueFilter: openNullValueFilter
162
+ openNullValueFilter: openNullValueFilter,
163
+ useTextFilter: useTextFilter
162
164
  })
163
165
  }), root ? document.querySelector(root) : document.body) : null]
164
166
  });
@@ -16,14 +16,13 @@
16
16
  height: fit-content;
17
17
  box-shadow: 0px 5px 12px 4px rgba(3, 6, 33, 0.15);
18
18
  background: @tableSettingModalBgc;
19
- // border: 1px solid #d9d9d9;
20
19
  transform: translateX(-100%);
21
20
  }
22
21
 
23
22
  :global {
24
23
  .ant-select-dropdown {
25
- position: relative;
26
- z-index: 9999;
24
+ position: fixed;
25
+ z-index: 3000;
27
26
  }
28
27
  }
29
28
 
@@ -45,8 +45,7 @@ export var useColumnWidth = function useColumnWidth(_ref) {
45
45
  _ref$columnVisibleCon = _ref.columnVisibleConfig,
46
46
  columnVisibleConfig = _ref$columnVisibleCon === void 0 ? {} : _ref$columnVisibleCon,
47
47
  tableKey = _ref.tableKey,
48
- _ref$cacheMaxAge = _ref.cacheMaxAge,
49
- cacheMaxAge = _ref$cacheMaxAge === void 0 ? 1 * 60 * 60 * 1000 : _ref$cacheMaxAge,
48
+ cacheMaxAge = _ref.cacheMaxAge,
50
49
  version = _ref.version;
51
50
  var _useState = useState({
52
51
  columnSizing: {},
@@ -248,7 +247,7 @@ export var useColumnWidth = function useColumnWidth(_ref) {
248
247
  var visibleColumnsSizeMap = {};
249
248
 
250
249
  // 处理缓存过期或无效的情况
251
- if (version && version !== (cache === null || cache === void 0 ? void 0 : cache.version) || !(cache !== null && cache !== void 0 && cache.editTime) || now - cache.editTime > cacheMaxAge) {
250
+ if (version && version !== (cache === null || cache === void 0 ? void 0 : cache.version) || !(cache !== null && cache !== void 0 && cache.editTime) || cacheMaxAge && now - cache.editTime > cacheMaxAge) {
252
251
  Object.keys(initColumnsSizeMap).forEach(function (key) {
253
252
  if (columnVisibleConfig[key] !== false) {
254
253
  visibleColumnsSizeMap[key] = initColumnsSizeMap[key];
@@ -337,6 +337,8 @@ export type TableMaxProps = {
337
337
  openVirtualRows?: boolean;
338
338
  /**开启空值过滤 */
339
339
  openNullValueFilter?: boolean;
340
+ /**使用文本过滤器 */
341
+ useTextFilter?: boolean;
340
342
  openIndexColumn?: boolean;
341
343
  };
342
344
  export interface TableMaxColumnType {
@@ -45,3 +45,4 @@ export declare const downloadExcel: ({ url, data, title, setDownLoading, method,
45
45
  }) => void;
46
46
  export declare const filterOptions: (inputValue: any, option: any) => boolean;
47
47
  export declare const supportsPassive: boolean;
48
+ export declare function splitString(str: any): string | string[];
@@ -200,17 +200,37 @@ export var getFormatFiltersV2 = function getFormatFiltersV2(columns, originFilte
200
200
  res.value = value.filterValue;
201
201
  res.operator = JSON.stringify(res.value) === '["NULL"]' ? FilterOperator.IsNull : FilterOperator.In;
202
202
  } else if (filterType === FilterType.Input || filterType === FilterType.AutoComplete) {
203
- var _value$toUpperCase;
204
203
  // Input组件
205
- var upperValue = value === null || value === void 0 || (_value$toUpperCase = value.toUpperCase()) === null || _value$toUpperCase === void 0 ? void 0 : _value$toUpperCase.trim();
206
- res.value = splitString(value + '');
207
- res.operator = upperValue === 'NULL' ? FilterOperator.IsNull : upperValue === 'NOT NULL' || upperValue === 'NOTNULL' ? FilterOperator.IsNotNull : typeof res.value === 'string' ? FilterOperator.Contains : FilterOperator.In;
204
+ if (res.value === 'string') {
205
+ var _value$toUpperCase;
206
+ var upperValue = value === null || value === void 0 || (_value$toUpperCase = value.toUpperCase()) === null || _value$toUpperCase === void 0 ? void 0 : _value$toUpperCase.trim();
207
+ res.value = splitString(value + '');
208
+ res.operator = upperValue === 'NULL' ? FilterOperator.IsNull : upperValue === 'NOT NULL' || upperValue === 'NOTNULL' ? FilterOperator.IsNotNull : typeof res.value === 'string' ? FilterOperator.Contains : FilterOperator.In;
209
+ } else {
210
+ var _operatorMap$_upperVa;
211
+ // 1. 简化变量处理:合并空值判断 + 类型转换
212
+ var _upperValue = (value === null || value === void 0 ? void 0 : value.toString().toUpperCase().trim()) || '';
213
+ var _ref7 = value || {},
214
+ filterValue = _ref7.filterValue,
215
+ operator = _ref7.operator;
216
+
217
+ // 2. 拆分 operator 逻辑:用对象映射替代多层三元,更易维护
218
+ var operatorMap = {
219
+ NULL: FilterOperator.IsNull,
220
+ 'NOT NULL': FilterOperator.IsNotNull,
221
+ NOTNULL: FilterOperator.IsNotNull
222
+ };
223
+
224
+ // 3. 核心逻辑简化:先匹配特殊值 → 再处理默认逻辑
225
+ res.value = typeof filterValue === 'string' ? splitString((filterValue !== null && filterValue !== void 0 ? filterValue : '') + '') : filterValue; // 空值合并替代 +'' 更严谨
226
+ res.operator = (_operatorMap$_upperVa = operatorMap[_upperValue]) !== null && _operatorMap$_upperVa !== void 0 ? _operatorMap$_upperVa : operator === FilterOperator.Contains ? typeof res.value === 'string' ? FilterOperator.Contains : FilterOperator.In : operator;
227
+ }
208
228
  } else if (filterType === FilterType.SingleSelect) {
209
229
  var _res$value;
210
230
  // 单选组件
211
231
  res.value = value.filterValue;
212
- var _upperValue = typeof res.value === 'string' ? (_res$value = res.value) === null || _res$value === void 0 ? void 0 : _res$value.toUpperCase() : res.value;
213
- res.operator = _upperValue === 'NULL' ? FilterOperator.IsNull : _upperValue === 'NOT NULL' ? FilterOperator.IsNotNull : FilterOperator.Eq;
232
+ var _upperValue2 = typeof res.value === 'string' ? (_res$value = res.value) === null || _res$value === void 0 ? void 0 : _res$value.toUpperCase() : res.value;
233
+ res.operator = _upperValue2 === 'NULL' ? FilterOperator.IsNull : _upperValue2 === 'NOT NULL' ? FilterOperator.IsNotNull : FilterOperator.Eq;
214
234
  } else {
215
235
  // 其他组件: SingleDate/SingleNumber
216
236
  res.operator = FilterOperator.Eq;
@@ -225,8 +245,8 @@ export var getFormatSorting = function getFormatSorting(columns, originSorting)
225
245
  var curColumn = columns.find(function (item) {
226
246
  return item.id === sort.id;
227
247
  });
228
- var _ref7 = curColumn || {},
229
- sortingKey = _ref7.sortingKey;
248
+ var _ref8 = curColumn || {},
249
+ sortingKey = _ref8.sortingKey;
230
250
  // 优先取formattedFilterKey作为key
231
251
  var formatKey = sortingKey || sort.id;
232
252
  return _objectSpread(_objectSpread({}, sort), {}, {
@@ -251,13 +271,13 @@ export var operationColumnNoTooltips = function operationColumnNoTooltips(column
251
271
  };
252
272
 
253
273
  //下载
254
- export var downloadExcel = function downloadExcel(_ref8) {
255
- var url = _ref8.url,
256
- data = _ref8.data,
257
- title = _ref8.title,
258
- setDownLoading = _ref8.setDownLoading,
259
- method = _ref8.method,
260
- request = _ref8.request;
274
+ export var downloadExcel = function downloadExcel(_ref9) {
275
+ var url = _ref9.url,
276
+ data = _ref9.data,
277
+ title = _ref9.title,
278
+ setDownLoading = _ref9.setDownLoading,
279
+ method = _ref9.method,
280
+ request = _ref9.request;
261
281
  setDownLoading(true);
262
282
  request(url, {
263
283
  method: method || 'post',
@@ -295,7 +315,7 @@ export var supportsPassive = function () {
295
315
  } catch (e) {}
296
316
  return supports;
297
317
  }();
298
- function splitString(str) {
318
+ export function splitString(str) {
299
319
  var text = String(str || '').trim();
300
320
  if (text === '') return '';
301
321
  return /\s+/.test(text) ? text.split(/\s+/) : text;
@@ -17,7 +17,10 @@ var localeValues = {
17
17
  placeholder: {
18
18
  startTime: '开始时间',
19
19
  endTime: '结束时间',
20
- input: '请输入'
20
+ input: '请输入',
21
+ inputMultiple: '输入多个值,空格分隔',
22
+ begain: '起始值',
23
+ end: '结束值'
21
24
  },
22
25
  button: {
23
26
  reset: '重置',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arim-aisdc/public-components",
3
- "version": "2.3.86",
3
+ "version": "2.3.88",
4
4
  "description": "前端组件库",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",