@rainbow-oh/yee-c 0.8.11 → 0.8.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Table/col-group.d.ts +2 -2
- package/dist/cjs/Table/col-group.js +1 -1
- package/dist/cjs/Table/demo/sorter-callback.js +3 -2
- package/dist/cjs/Table/demo/sorter.js +3 -2
- package/dist/cjs/Table/hooks/useExpand.d.ts +2 -2
- package/dist/cjs/Table/hooks/useFilter.d.ts +10 -2
- package/dist/cjs/Table/hooks/useFilter.js +44 -31
- package/dist/cjs/Table/hooks/usePagination.js +8 -8
- package/dist/cjs/Table/hooks/useSelection.d.ts +3 -3
- package/dist/cjs/Table/hooks/useSelection.js +8 -9
- package/dist/cjs/Table/hooks/useSorter.d.ts +6 -3
- package/dist/cjs/Table/hooks/useSorter.js +193 -87
- package/dist/cjs/Table/interface.d.ts +10 -7
- package/dist/cjs/Table/table.js +51 -45
- package/dist/cjs/Table/tbody/index.js +13 -5
- package/dist/cjs/Table/tbody/lazy-row.js +6 -3
- package/dist/cjs/Table/tbody/row.js +5 -4
- package/dist/cjs/Table/theader/cell.js +4 -0
- package/dist/cjs/Table/theader/filter.js +52 -20
- package/dist/cjs/Table/util/index.js +5 -3
- package/dist/cjs/style/themes.css +1 -1
- package/dist/cjs/style/variables.css +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/Table/col-group.d.ts +2 -2
- package/dist/esm/Table/col-group.js +1 -1
- package/dist/esm/Table/demo/sorter-callback.js +3 -2
- package/dist/esm/Table/demo/sorter.js +3 -2
- package/dist/esm/Table/hooks/useExpand.d.ts +2 -2
- package/dist/esm/Table/hooks/useFilter.d.ts +10 -2
- package/dist/esm/Table/hooks/useFilter.js +63 -36
- package/dist/esm/Table/hooks/usePagination.js +8 -10
- package/dist/esm/Table/hooks/useSelection.d.ts +3 -3
- package/dist/esm/Table/hooks/useSelection.js +16 -11
- package/dist/esm/Table/hooks/useSorter.d.ts +6 -3
- package/dist/esm/Table/hooks/useSorter.js +218 -105
- package/dist/esm/Table/interface.d.ts +10 -7
- package/dist/esm/Table/table.js +42 -47
- package/dist/esm/Table/tbody/index.js +8 -5
- package/dist/esm/Table/tbody/lazy-row.js +7 -3
- package/dist/esm/Table/tbody/row.js +7 -6
- package/dist/esm/Table/theader/cell.js +7 -1
- package/dist/esm/Table/theader/filter.js +75 -27
- package/dist/esm/Table/util/index.js +6 -3
- package/dist/esm/style/themes.css +1 -1
- package/dist/esm/style/variables.css +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/umd/yee-c.min.js +1 -1
- package/package.json +1 -1
- package/src/Table/col-group.tsx +1 -1
- package/src/Table/demo/sorter-callback.tsx +3 -2
- package/src/Table/demo/sorter.tsx +3 -2
- package/src/Table/hooks/useExpand.ts +3 -3
- package/src/Table/hooks/useFilter.ts +66 -33
- package/src/Table/hooks/usePagination.ts +9 -10
- package/src/Table/hooks/useSelection.ts +18 -20
- package/src/Table/hooks/useSorter.ts +236 -82
- package/src/Table/interface.ts +19 -7
- package/src/Table/table.tsx +54 -49
- package/src/Table/tbody/index.tsx +14 -5
- package/src/Table/tbody/lazy-row.tsx +6 -3
- package/src/Table/tbody/row.tsx +5 -4
- package/src/Table/theader/cell.tsx +10 -0
- package/src/Table/theader/filter.tsx +64 -22
- package/src/Table/util/index.ts +3 -1
- package/src/version.ts +1 -1
package/src/Table/interface.ts
CHANGED
|
@@ -24,7 +24,7 @@ export interface ExpandableType {
|
|
|
24
24
|
/**
|
|
25
25
|
* Default expanded rows
|
|
26
26
|
*/
|
|
27
|
-
defaultExpandedRowKeys?:
|
|
27
|
+
defaultExpandedRowKeys?: SelectionKeyType[]; // Default expanded rows
|
|
28
28
|
/**
|
|
29
29
|
* Expanded rows
|
|
30
30
|
*/
|
|
@@ -57,6 +57,7 @@ export interface ExpandableType {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
export type SelectionKeyType = string | number;
|
|
60
|
+
export type FilterValue = string | number;
|
|
60
61
|
|
|
61
62
|
export type ColumnSemanticType = 'inner' | 'action';
|
|
62
63
|
|
|
@@ -210,7 +211,7 @@ export interface ColumnProps {
|
|
|
210
211
|
/**
|
|
211
212
|
* Filter callback function
|
|
212
213
|
*/
|
|
213
|
-
onFilter?: (value:
|
|
214
|
+
onFilter?: (value: FilterValue, record: Record<string, any>) => boolean;
|
|
214
215
|
};
|
|
215
216
|
/**
|
|
216
217
|
* Sorter config
|
|
@@ -221,9 +222,13 @@ export interface ColumnProps {
|
|
|
221
222
|
/**
|
|
222
223
|
* Sort function
|
|
223
224
|
*/
|
|
224
|
-
sort?: (
|
|
225
|
+
sort?: (
|
|
226
|
+
a: Record<string, unknown>,
|
|
227
|
+
b: Record<string, unknown>,
|
|
228
|
+
) => number;
|
|
225
229
|
/**
|
|
226
|
-
*
|
|
230
|
+
* Enable multi-column sorting. A positive number limits the active
|
|
231
|
+
* sorters; when exceeded, the earliest activated sorter is removed.
|
|
227
232
|
*/
|
|
228
233
|
multiple?: boolean | number;
|
|
229
234
|
/**
|
|
@@ -405,6 +410,7 @@ export interface TableRowProps {
|
|
|
405
410
|
pageSize: number;
|
|
406
411
|
index: number;
|
|
407
412
|
record: Record<string, any>;
|
|
413
|
+
rowKeyValue: SelectionKeyType;
|
|
408
414
|
columns: ColumnProps[];
|
|
409
415
|
expandable?: ExpandableType;
|
|
410
416
|
expandedRowKeys?: Array<string | number>;
|
|
@@ -436,7 +442,10 @@ export interface TableRowProps {
|
|
|
436
442
|
index: number;
|
|
437
443
|
}) => void;
|
|
438
444
|
// Checkbox or Radio onChange event
|
|
439
|
-
onSelectionChange: (
|
|
445
|
+
onSelectionChange: (
|
|
446
|
+
event: ChangeEvent<HTMLInputElement>,
|
|
447
|
+
key: SelectionKeyType,
|
|
448
|
+
) => void;
|
|
440
449
|
}
|
|
441
450
|
|
|
442
451
|
type LazyLoadType = {
|
|
@@ -452,7 +461,10 @@ export interface LazyRowProps extends TableRowProps {
|
|
|
452
461
|
lazyLoad?: boolean | LazyLoadType;
|
|
453
462
|
}
|
|
454
463
|
|
|
455
|
-
export interface TableBodyProps extends Omit<
|
|
464
|
+
export interface TableBodyProps extends Omit<
|
|
465
|
+
LazyRowProps,
|
|
466
|
+
'index' | 'record' | 'rowKeyValue'
|
|
467
|
+
> {
|
|
456
468
|
pageData: Array<Record<string, any>>;
|
|
457
469
|
noData?: React.ReactNode;
|
|
458
470
|
}
|
|
@@ -619,7 +631,7 @@ export interface TableProps
|
|
|
619
631
|
* Set the unique key for rows
|
|
620
632
|
* @default id
|
|
621
633
|
*/
|
|
622
|
-
rowKey?: string | ((record: Record<string, any>) =>
|
|
634
|
+
rowKey?: string | ((record: Record<string, any>) => SelectionKeyType);
|
|
623
635
|
/**
|
|
624
636
|
* Summary bar
|
|
625
637
|
*/
|
package/src/Table/table.tsx
CHANGED
|
@@ -83,15 +83,28 @@ const Table = React.forwardRef<HTMLDivElement, TableProps>((baseprops, ref) => {
|
|
|
83
83
|
});
|
|
84
84
|
|
|
85
85
|
// Filter
|
|
86
|
-
const {
|
|
86
|
+
const {
|
|
87
|
+
data: filteredData,
|
|
88
|
+
filterRecords,
|
|
89
|
+
onFilter: onFilterInternal,
|
|
90
|
+
} = useFilter({
|
|
87
91
|
data: dataSource,
|
|
92
|
+
columns: wrapedColumns,
|
|
88
93
|
});
|
|
89
94
|
|
|
95
|
+
const filters = useMemo(
|
|
96
|
+
() =>
|
|
97
|
+
Object.fromEntries(
|
|
98
|
+
filterRecords.map(({ dataIndex, value }) => [dataIndex, value]),
|
|
99
|
+
),
|
|
100
|
+
[filterRecords],
|
|
101
|
+
);
|
|
102
|
+
|
|
90
103
|
// Sort
|
|
91
104
|
const {
|
|
92
105
|
data: sortedData,
|
|
93
106
|
sorters,
|
|
94
|
-
onSort,
|
|
107
|
+
onSort: onSortInternal,
|
|
95
108
|
} = useSorter({ data: filteredData, columns: wrapedColumns });
|
|
96
109
|
// Pagination
|
|
97
110
|
const { pageData, current, pageSize, pagination } = usePagination({
|
|
@@ -102,7 +115,7 @@ const Table = React.forwardRef<HTMLDivElement, TableProps>((baseprops, ref) => {
|
|
|
102
115
|
onChange({
|
|
103
116
|
pagination: info,
|
|
104
117
|
sorter: sorters,
|
|
105
|
-
filters
|
|
118
|
+
filters,
|
|
106
119
|
currentDataSource: sortedData,
|
|
107
120
|
action: 'paginate',
|
|
108
121
|
});
|
|
@@ -110,6 +123,20 @@ const Table = React.forwardRef<HTMLDivElement, TableProps>((baseprops, ref) => {
|
|
|
110
123
|
: undefined,
|
|
111
124
|
});
|
|
112
125
|
|
|
126
|
+
const handleSort = React.useCallback(
|
|
127
|
+
(dataIndex: string) => {
|
|
128
|
+
const next = onSortInternal(dataIndex);
|
|
129
|
+
onChange?.({
|
|
130
|
+
pagination: pagination === false ? undefined : { current, pageSize },
|
|
131
|
+
sorter: next.sorters,
|
|
132
|
+
filters,
|
|
133
|
+
currentDataSource: next.data,
|
|
134
|
+
action: 'sort',
|
|
135
|
+
});
|
|
136
|
+
},
|
|
137
|
+
[onSortInternal, onChange, pagination, current, pageSize, filters],
|
|
138
|
+
);
|
|
139
|
+
|
|
113
140
|
// Expanded row data
|
|
114
141
|
const { expandedRowKeys, onExpand } = useExpand(
|
|
115
142
|
expandable,
|
|
@@ -124,8 +151,8 @@ const Table = React.forwardRef<HTMLDivElement, TableProps>((baseprops, ref) => {
|
|
|
124
151
|
onChange: onSelectionChange,
|
|
125
152
|
} = useSelection({ pageData, dataSource, getRowKey, rowSelection, allKeys });
|
|
126
153
|
|
|
127
|
-
// Track
|
|
128
|
-
const
|
|
154
|
+
// Track filter changes to emit onChange after filtered data is recalculated
|
|
155
|
+
const prevFilterRecordsRef = useRef(filterRecords);
|
|
129
156
|
const contentWrapperRef = useRef<HTMLDivElement>(null);
|
|
130
157
|
const contentRef = useRef<HTMLDivElement>(null);
|
|
131
158
|
const [horizontalScroll, setHorizontalScroll] = React.useState({
|
|
@@ -156,51 +183,29 @@ const Table = React.forwardRef<HTMLDivElement, TableProps>((baseprops, ref) => {
|
|
|
156
183
|
);
|
|
157
184
|
}, []);
|
|
158
185
|
|
|
159
|
-
// Wrap onFilter to trigger onChange
|
|
160
|
-
const onFilter = React.useCallback(
|
|
161
|
-
(...args: Parameters<typeof onFilterInternal>) => {
|
|
162
|
-
onFilterInternal(...args);
|
|
163
|
-
// Trigger onChange for filter action
|
|
164
|
-
if (onChange) {
|
|
165
|
-
onChange({
|
|
166
|
-
pagination: pagination === false ? undefined : { current, pageSize },
|
|
167
|
-
sorter: sorters,
|
|
168
|
-
filters: undefined, // TODO: Extract filter info from args
|
|
169
|
-
currentDataSource: filteredData,
|
|
170
|
-
action: 'filter',
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
},
|
|
174
|
-
[
|
|
175
|
-
onChange,
|
|
176
|
-
pagination,
|
|
177
|
-
current,
|
|
178
|
-
pageSize,
|
|
179
|
-
sorters,
|
|
180
|
-
filteredData,
|
|
181
|
-
onFilterInternal,
|
|
182
|
-
],
|
|
183
|
-
);
|
|
184
|
-
|
|
185
|
-
// Trigger onChange when sorter, pagination, or filter changes
|
|
186
186
|
useEffect(() => {
|
|
187
|
+
if (prevFilterRecordsRef.current === filterRecords) return;
|
|
188
|
+
|
|
189
|
+
prevFilterRecordsRef.current = filterRecords;
|
|
187
190
|
if (!onChange) return;
|
|
188
191
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
192
|
+
onChange({
|
|
193
|
+
pagination: pagination === false ? undefined : { current, pageSize },
|
|
194
|
+
sorter: sorters,
|
|
195
|
+
filters,
|
|
196
|
+
currentDataSource: sortedData,
|
|
197
|
+
action: 'filter',
|
|
198
|
+
});
|
|
199
|
+
}, [
|
|
200
|
+
filterRecords,
|
|
201
|
+
filters,
|
|
202
|
+
sortedData,
|
|
203
|
+
pagination,
|
|
204
|
+
current,
|
|
205
|
+
pageSize,
|
|
206
|
+
sorters,
|
|
207
|
+
onChange,
|
|
208
|
+
]);
|
|
204
209
|
|
|
205
210
|
useEffect(() => {
|
|
206
211
|
updateHorizontalScroll();
|
|
@@ -245,9 +250,9 @@ const Table = React.forwardRef<HTMLDivElement, TableProps>((baseprops, ref) => {
|
|
|
245
250
|
headerRows={headerRows}
|
|
246
251
|
checkedAll={checkedAll}
|
|
247
252
|
sorters={sorters}
|
|
248
|
-
onSort={
|
|
253
|
+
onSort={handleSort}
|
|
249
254
|
onCheckAll={onCheckAll}
|
|
250
|
-
onInternalFilter={
|
|
255
|
+
onInternalFilter={onFilterInternal}
|
|
251
256
|
/>
|
|
252
257
|
);
|
|
253
258
|
};
|
|
@@ -31,19 +31,27 @@ const TableBody: React.FC<TableBodyProps> = (props) => {
|
|
|
31
31
|
|
|
32
32
|
const getRenderRows = () => {
|
|
33
33
|
if (lazyLoad) {
|
|
34
|
-
return
|
|
34
|
+
return (
|
|
35
|
+
<LazyRow
|
|
36
|
+
{...rest}
|
|
37
|
+
pageData={pageData}
|
|
38
|
+
columns={columns}
|
|
39
|
+
resolveRowKey={resolveRowKey}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
35
42
|
}
|
|
36
43
|
return pageData.map((record: Record<string, any>, index: number) => {
|
|
44
|
+
const resolvedRowKey = resolveRowKey(record);
|
|
45
|
+
|
|
37
46
|
// 整行接管:由外部组件渲染 <tr> + 单元格(可放拖拽手柄等)
|
|
38
47
|
if (RowRenderer) {
|
|
39
|
-
const rk = resolveRowKey(record);
|
|
40
48
|
return (
|
|
41
49
|
<RowRenderer
|
|
42
|
-
key={
|
|
50
|
+
key={resolvedRowKey ?? index}
|
|
43
51
|
record={record}
|
|
44
52
|
index={index}
|
|
45
53
|
columns={columns}
|
|
46
|
-
rowKey={
|
|
54
|
+
rowKey={resolvedRowKey}
|
|
47
55
|
/>
|
|
48
56
|
);
|
|
49
57
|
}
|
|
@@ -52,8 +60,9 @@ const TableBody: React.FC<TableBodyProps> = (props) => {
|
|
|
52
60
|
{...rest}
|
|
53
61
|
columns={columns}
|
|
54
62
|
record={record}
|
|
63
|
+
rowKeyValue={resolvedRowKey}
|
|
55
64
|
index={index}
|
|
56
|
-
key={`row-${
|
|
65
|
+
key={resolvedRowKey ?? `row-${index}`}
|
|
57
66
|
/>
|
|
58
67
|
);
|
|
59
68
|
});
|
|
@@ -6,7 +6,7 @@ const createBlank = (size: number, key: string) => {
|
|
|
6
6
|
: [];
|
|
7
7
|
};
|
|
8
8
|
const LazyRow = (props: any) => {
|
|
9
|
-
const { range, pageData, columns, ...rest } = props;
|
|
9
|
+
const { range, pageData, columns, resolveRowKey, ...rest } = props;
|
|
10
10
|
const { start, end } = range;
|
|
11
11
|
let result: any = [];
|
|
12
12
|
const pl = pageData.length;
|
|
@@ -14,13 +14,16 @@ const LazyRow = (props: any) => {
|
|
|
14
14
|
result = result.concat(startBlank);
|
|
15
15
|
|
|
16
16
|
for (let i = start; i < (end > pl ? pl : end); i++) {
|
|
17
|
+
const record = pageData[i];
|
|
18
|
+
const rowKeyValue = resolveRowKey(record);
|
|
17
19
|
result.push(
|
|
18
20
|
<TableRow
|
|
19
21
|
{...rest}
|
|
20
22
|
columns={columns}
|
|
21
|
-
record={
|
|
23
|
+
record={record}
|
|
24
|
+
rowKeyValue={rowKeyValue}
|
|
22
25
|
index={i}
|
|
23
|
-
key={
|
|
26
|
+
key={rowKeyValue ?? `row-${i}`}
|
|
24
27
|
/>,
|
|
25
28
|
);
|
|
26
29
|
}
|
package/src/Table/tbody/row.tsx
CHANGED
|
@@ -14,6 +14,7 @@ const TableRow: React.FC<TableRowProps> = (props) => {
|
|
|
14
14
|
const {
|
|
15
15
|
index,
|
|
16
16
|
record,
|
|
17
|
+
rowKeyValue,
|
|
17
18
|
columns,
|
|
18
19
|
highlight,
|
|
19
20
|
stripe,
|
|
@@ -30,10 +31,10 @@ const TableRow: React.FC<TableRowProps> = (props) => {
|
|
|
30
31
|
...rest
|
|
31
32
|
} = props;
|
|
32
33
|
|
|
33
|
-
const { prefixCls
|
|
34
|
+
const { prefixCls } = useContext(TableCtx);
|
|
34
35
|
|
|
35
36
|
const expanded = expandedRowKeys?.includes(
|
|
36
|
-
expandedKeyType === 'index' ? index + 1 :
|
|
37
|
+
expandedKeyType === 'index' ? index + 1 : rowKeyValue,
|
|
37
38
|
);
|
|
38
39
|
|
|
39
40
|
const high = React.useMemo(() => {
|
|
@@ -57,7 +58,6 @@ const TableRow: React.FC<TableRowProps> = (props) => {
|
|
|
57
58
|
|
|
58
59
|
const getSelection = (column: WrapedColumnProps) => {
|
|
59
60
|
const { type, disabled: colDisabled, onCell } = column;
|
|
60
|
-
const rowKeyValue = record[rowKey];
|
|
61
61
|
const props = (onCell?.(record, index) || {}) as Record<string, unknown>;
|
|
62
62
|
const checked = selectedRowKeys?.includes(rowKeyValue);
|
|
63
63
|
|
|
@@ -75,7 +75,8 @@ const TableRow: React.FC<TableRowProps> = (props) => {
|
|
|
75
75
|
const commonProps = {
|
|
76
76
|
checked,
|
|
77
77
|
value: rowKeyValue,
|
|
78
|
-
onChange:
|
|
78
|
+
onChange: (event: React.ChangeEvent<HTMLInputElement>) =>
|
|
79
|
+
onSelectionChange(event, rowKeyValue),
|
|
79
80
|
disabled,
|
|
80
81
|
...props,
|
|
81
82
|
};
|
|
@@ -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
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
89
|
+
const applyFilter = (type: 'filter' | 'search') => {
|
|
90
|
+
const value = getCurrentValue(type);
|
|
91
|
+
commitValue(value);
|
|
63
92
|
onInternalFilter({
|
|
64
93
|
dataIndex,
|
|
65
|
-
value
|
|
66
|
-
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 (
|
|
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 = (
|
|
164
|
-
|
|
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={
|
|
222
|
+
variant={isFiltered ? 'filled' : undefined}
|
|
181
223
|
type="text"
|
|
182
224
|
size="small"
|
|
183
225
|
/>
|
package/src/Table/util/index.ts
CHANGED
|
@@ -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
|
-
|
|
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 =
|