@rainbow-oh/yee-c 0.8.12 → 0.8.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/cjs/Pagination/style/index.less +4 -0
  2. package/dist/cjs/Spin/demo/types.js +1 -1
  3. package/dist/cjs/Spin/indicator.js +4 -2
  4. package/dist/cjs/Spin/style/index.less +2 -8
  5. package/dist/cjs/Table/col-group.d.ts +2 -2
  6. package/dist/cjs/Table/col-group.js +1 -1
  7. package/dist/cjs/Table/demo/sorter-callback.js +3 -2
  8. package/dist/cjs/Table/demo/sorter.js +3 -2
  9. package/dist/cjs/Table/hooks/useExpand.d.ts +2 -2
  10. package/dist/cjs/Table/hooks/useFilter.d.ts +8 -2
  11. package/dist/cjs/Table/hooks/useFilter.js +36 -22
  12. package/dist/cjs/Table/hooks/usePagination.js +8 -8
  13. package/dist/cjs/Table/hooks/useSelection.d.ts +3 -3
  14. package/dist/cjs/Table/hooks/useSelection.js +8 -9
  15. package/dist/cjs/Table/hooks/useSorter.d.ts +6 -3
  16. package/dist/cjs/Table/hooks/useSorter.js +193 -87
  17. package/dist/cjs/Table/interface.d.ts +10 -7
  18. package/dist/cjs/Table/table.js +51 -45
  19. package/dist/cjs/Table/tbody/index.js +13 -5
  20. package/dist/cjs/Table/tbody/lazy-row.js +6 -3
  21. package/dist/cjs/Table/tbody/row.js +5 -4
  22. package/dist/cjs/Table/theader/cell.js +4 -0
  23. package/dist/cjs/Table/theader/filter.js +52 -20
  24. package/dist/cjs/Table/util/index.js +5 -3
  25. package/dist/cjs/style/themes.css +1 -1
  26. package/dist/cjs/style/variables.css +1 -1
  27. package/dist/cjs/version.d.ts +1 -1
  28. package/dist/cjs/version.js +1 -1
  29. package/dist/esm/Pagination/style/index.less +4 -0
  30. package/dist/esm/Spin/demo/types.js +6 -3
  31. package/dist/esm/Spin/indicator.js +4 -2
  32. package/dist/esm/Spin/style/index.less +2 -8
  33. package/dist/esm/Table/col-group.d.ts +2 -2
  34. package/dist/esm/Table/col-group.js +1 -1
  35. package/dist/esm/Table/demo/sorter-callback.js +3 -2
  36. package/dist/esm/Table/demo/sorter.js +3 -2
  37. package/dist/esm/Table/hooks/useExpand.d.ts +2 -2
  38. package/dist/esm/Table/hooks/useFilter.d.ts +8 -2
  39. package/dist/esm/Table/hooks/useFilter.js +52 -32
  40. package/dist/esm/Table/hooks/usePagination.js +8 -10
  41. package/dist/esm/Table/hooks/useSelection.d.ts +3 -3
  42. package/dist/esm/Table/hooks/useSelection.js +16 -11
  43. package/dist/esm/Table/hooks/useSorter.d.ts +6 -3
  44. package/dist/esm/Table/hooks/useSorter.js +218 -105
  45. package/dist/esm/Table/interface.d.ts +10 -7
  46. package/dist/esm/Table/table.js +42 -47
  47. package/dist/esm/Table/tbody/index.js +8 -5
  48. package/dist/esm/Table/tbody/lazy-row.js +7 -3
  49. package/dist/esm/Table/tbody/row.js +7 -6
  50. package/dist/esm/Table/theader/cell.js +7 -1
  51. package/dist/esm/Table/theader/filter.js +75 -27
  52. package/dist/esm/Table/util/index.js +6 -3
  53. package/dist/esm/style/themes.css +1 -1
  54. package/dist/esm/style/variables.css +1 -1
  55. package/dist/esm/version.d.ts +1 -1
  56. package/dist/esm/version.js +1 -1
  57. package/dist/umd/yee-c.min.css +1 -1
  58. package/dist/umd/yee-c.min.js +1 -1
  59. package/package.json +1 -1
  60. package/src/Pagination/style/index.less +4 -0
  61. package/src/Spin/demo/types.tsx +3 -3
  62. package/src/Spin/index.en-US.md +2 -8
  63. package/src/Spin/index.zh-CN.md +2 -8
  64. package/src/Spin/indicator.tsx +2 -0
  65. package/src/Spin/style/index.less +2 -8
  66. package/src/Table/col-group.tsx +1 -1
  67. package/src/Table/demo/sorter-callback.tsx +3 -2
  68. package/src/Table/demo/sorter.tsx +3 -2
  69. package/src/Table/hooks/useExpand.ts +3 -3
  70. package/src/Table/hooks/useFilter.ts +47 -23
  71. package/src/Table/hooks/usePagination.ts +9 -10
  72. package/src/Table/hooks/useSelection.ts +18 -20
  73. package/src/Table/hooks/useSorter.ts +236 -82
  74. package/src/Table/interface.ts +19 -7
  75. package/src/Table/table.tsx +54 -49
  76. package/src/Table/tbody/index.tsx +14 -5
  77. package/src/Table/tbody/lazy-row.tsx +6 -3
  78. package/src/Table/tbody/row.tsx +5 -4
  79. package/src/Table/theader/cell.tsx +10 -0
  80. package/src/Table/theader/filter.tsx +64 -22
  81. package/src/Table/util/index.ts +3 -1
  82. package/src/version.ts +1 -1
@@ -46,6 +46,8 @@ const HeadCell: React.FC<HeadCellProps> = (props) => {
46
46
  const sortOrder = (dataIndex && sorters?.[dataIndex]) || 0;
47
47
  const displaySortOrder: 0 | 1 | 2 =
48
48
  sortOrder === -1 ? 2 : (sortOrder as 0 | 1);
49
+ const currentSortOrder =
50
+ sortOrder === 1 ? 'ascend' : sortOrder === -1 ? 'descend' : null;
49
51
 
50
52
  const handleSort = () => {
51
53
  if (dataIndex && onSort) {
@@ -54,6 +56,14 @@ const HeadCell: React.FC<HeadCellProps> = (props) => {
54
56
  };
55
57
 
56
58
  const renderSort = () => {
59
+ if (typeof sorter === 'object' && sorter.icon) {
60
+ return (
61
+ <span className={`${prefixCls}-column-sorter`}>
62
+ {sorter.icon(currentSortOrder)}
63
+ </span>
64
+ );
65
+ }
66
+
57
67
  const trigger = (
58
68
  <span className={`${prefixCls}-column-sorter`}>
59
69
  <ArrowIcon
@@ -8,6 +8,7 @@ import Popover from '../../Popover';
8
8
  import Space from '../../Space';
9
9
  import Tree from '../../Tree';
10
10
  import { useLocale } from '../../locale';
11
+ import type { FilterValue } from '../interface';
11
12
  import { TableCtx } from '../table';
12
13
 
13
14
  export interface TableFilterProps {
@@ -23,14 +24,37 @@ const getStrLower = (str: any) => {
23
24
  return str;
24
25
  };
25
26
 
27
+ type FilterInput = FilterValue | FilterValue[];
28
+
29
+ const areFilterValuesEqual = (a: FilterInput, b: FilterInput) => {
30
+ if (!Array.isArray(a) || !Array.isArray(b)) return a === b;
31
+ return a.length === b.length && a.every((value, index) => value === b[index]);
32
+ };
33
+
34
+ const hasFilterValue = (value: FilterInput) =>
35
+ Array.isArray(value) ? value.length > 0 : value !== '';
36
+
26
37
  const HeaderFilter = React.memo((props: any) => {
27
38
  const { filter, column, getPopupContainer, onInternalFilter } = props;
28
39
  const { prefixCls } = useContext(TableCtx);
29
40
  const { locale } = useLocale();
30
41
  const { table: tableLocale } = locale;
31
42
  const { dataIndex } = column;
43
+ const {
44
+ items,
45
+ icon,
46
+ searchable = true,
47
+ filterMode = 'menu',
48
+ filtered,
49
+ filterOnClose = true,
50
+ render,
51
+ } = filter;
32
52
 
33
53
  const inputRef = useRef<HTMLInputElement>(null);
54
+ const initialValue: FilterInput = items ? [] : '';
55
+ const committedValueRef = useRef<FilterInput>(initialValue);
56
+ const [committedValue, setCommittedValue] =
57
+ useState<FilterInput>(initialValue);
34
58
  const [open, setOpen] = useState(false);
35
59
  const [selectNodes, setSelectNodes] = useState<Array<string | number>>([]);
36
60
  const [searchValue, setSearchValue] = useState('');
@@ -53,34 +77,41 @@ const HeaderFilter = React.memo((props: any) => {
53
77
  // setSelectNodes(node);
54
78
  // };
55
79
 
56
- const reset = () => {
57
- setSearchValue('');
58
- setSelectNodes([]);
59
- onInternalFilter({ dataIndex, value: '', column });
80
+ const getCurrentValue = (type: 'filter' | 'search'): FilterInput =>
81
+ type === 'search' ? searchValue : selectNodes;
82
+
83
+ const commitValue = (value: FilterInput) => {
84
+ const committed = Array.isArray(value) ? [...value] : value;
85
+ committedValueRef.current = committed;
86
+ setCommittedValue(committed);
60
87
  };
61
88
 
62
- const ok = (type?: 'filter' | 'search') => {
89
+ const applyFilter = (type: 'filter' | 'search') => {
90
+ const value = getCurrentValue(type);
91
+ commitValue(value);
63
92
  onInternalFilter({
64
93
  dataIndex,
65
- value: type === 'search' ? searchValue : selectNodes,
66
- type: type,
94
+ value,
95
+ type,
67
96
  column,
68
97
  });
98
+ };
99
+
100
+ const reset = () => {
101
+ const value: FilterInput = items ? [] : '';
102
+ setSearchValue('');
103
+ setSelectNodes([]);
104
+ commitValue(value);
105
+ onInternalFilter({ dataIndex, value, column });
106
+ };
107
+
108
+ const ok = (type: 'filter' | 'search') => {
109
+ applyFilter(type);
69
110
  setOpen(false);
70
111
  };
71
112
 
72
113
  let popup: React.ReactNode;
73
114
 
74
- const {
75
- items,
76
- icon,
77
- searchable = true,
78
- filterMode = 'menu',
79
- // filtered,
80
- // filterOnClose,
81
- // onFilter,
82
- } = filter;
83
-
84
115
  const searchInputNode = searchable ? (
85
116
  <Input
86
117
  prefix={<Search size={14} strokeWidth={1.5} />}
@@ -96,7 +127,9 @@ const HeaderFilter = React.memo((props: any) => {
96
127
  />
97
128
  ) : null;
98
129
 
99
- if (items) {
130
+ if (render) {
131
+ popup = render();
132
+ } else if (items) {
100
133
  let dataSource = [];
101
134
  const inputValue = getStrLower(searchValue);
102
135
 
@@ -160,14 +193,23 @@ const HeaderFilter = React.memo((props: any) => {
160
193
  return null;
161
194
  }
162
195
 
163
- const handleOpenChange = (o: boolean) => {
164
- setOpen(o);
196
+ const handleOpenChange = (nextOpen: boolean) => {
197
+ if (!nextOpen && open && filterOnClose && !render) {
198
+ const type = items ? 'filter' : 'search';
199
+ const value = getCurrentValue(type);
200
+ if (!areFilterValuesEqual(value, committedValueRef.current)) {
201
+ applyFilter(type);
202
+ }
203
+ }
204
+ setOpen(nextOpen);
165
205
  };
166
206
 
207
+ const isFiltered = filtered ?? hasFilterValue(committedValue);
208
+
167
209
  const renderTrigger = () => {
168
210
  const trigger =
169
211
  typeof icon === 'function' ? (
170
- icon()
212
+ icon(isFiltered)
171
213
  ) : (
172
214
  <Button
173
215
  icon={
@@ -177,7 +219,7 @@ const HeaderFilter = React.memo((props: any) => {
177
219
  <Search size={14} strokeWidth={1.5} />
178
220
  )
179
221
  }
180
- variant={selectNodes.length || searchValue ? 'filled' : undefined}
222
+ variant={isFiltered ? 'filled' : undefined}
181
223
  type="text"
182
224
  size="small"
183
225
  />
@@ -9,7 +9,9 @@ export function handleColumns(columns: Array<WrapedColumnProps>) {
9
9
  if (col.fixed === true || col.fixed === 'left') {
10
10
  col.fixed = 'left';
11
11
  col.style = { ...col.style, left: leftWidthCount };
12
- if (!columns[i + 1].fixed) {
12
+ const nextFixed = columns[i + 1]?.fixed;
13
+ const nextIsFixedLeft = nextFixed === true || nextFixed === 'left';
14
+ if (!nextIsFixedLeft) {
13
15
  col.isFixedLeftLast = true;
14
16
  }
15
17
  leftWidthCount =
package/src/version.ts CHANGED
@@ -4,7 +4,7 @@ declare global {
4
4
  }
5
5
  }
6
6
 
7
- export const version = "0.8.12";
7
+ export const version = "0.8.14";
8
8
 
9
9
  if (typeof window !== 'undefined') {
10
10
  window.__yee_c_version__ = version;