es-grid-template 1.3.1 → 1.3.2
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/es/grid-component/CheckboxFilter.js +4 -0
- package/es/grid-component/CheckboxFilter2.d.ts +20 -0
- package/es/grid-component/CheckboxFilter2.js +248 -0
- package/es/grid-component/ContextMenu.js +1 -0
- package/es/grid-component/InternalTable.js +37 -3
- package/es/grid-component/TableGrid.d.ts +3 -0
- package/es/grid-component/TableGrid.js +69 -7
- package/es/grid-component/hooks/columns/index.js +14 -45
- package/es/grid-component/hooks/content/HeaderContent.js +54 -58
- package/es/grid-component/hooks/useColumns.js +22 -8
- package/es/grid-component/hooks/utils.d.ts +8 -0
- package/es/grid-component/hooks/utils.js +257 -1
- package/es/grid-component/number-range/index.d.ts +10 -0
- package/es/grid-component/number-range/index.js +59 -0
- package/es/grid-component/table/Grid.d.ts +3 -0
- package/es/grid-component/table/GridEdit.js +281 -62
- package/es/grid-component/table/Group.d.ts +1 -0
- package/es/grid-component/table/Group.js +1 -1
- package/es/grid-component/type.d.ts +2 -1
- package/lib/grid-component/CheckboxFilter.js +4 -0
- package/lib/grid-component/CheckboxFilter2.d.ts +20 -0
- package/lib/grid-component/CheckboxFilter2.js +257 -0
- package/lib/grid-component/ContextMenu.js +1 -0
- package/lib/grid-component/InternalTable.js +31 -2
- package/lib/grid-component/TableGrid.d.ts +3 -0
- package/lib/grid-component/TableGrid.js +67 -7
- package/lib/grid-component/hooks/columns/index.js +14 -45
- package/lib/grid-component/hooks/content/HeaderContent.js +53 -55
- package/lib/grid-component/hooks/useColumns.js +22 -8
- package/lib/grid-component/hooks/utils.d.ts +8 -0
- package/lib/grid-component/hooks/utils.js +270 -3
- package/lib/grid-component/number-range/index.d.ts +10 -0
- package/lib/grid-component/number-range/index.js +67 -0
- package/lib/grid-component/table/Grid.d.ts +3 -0
- package/lib/grid-component/table/GridEdit.js +281 -62
- package/lib/grid-component/table/Group.d.ts +1 -0
- package/lib/grid-component/table/Group.js +1 -1
- package/lib/grid-component/type.d.ts +2 -1
- package/package.json +109 -108
|
@@ -79,6 +79,7 @@ const CheckboxFilter = props => {
|
|
|
79
79
|
|
|
80
80
|
// const [searchValue, setSearchValue] = React.useState('');
|
|
81
81
|
|
|
82
|
+
console.log('options', options);
|
|
82
83
|
const [openKeys, setOpenKeys] = React.useState([]);
|
|
83
84
|
|
|
84
85
|
// clear search value after close filter dropdown
|
|
@@ -171,6 +172,9 @@ const CheckboxFilter = props => {
|
|
|
171
172
|
onSelect?.(keys);
|
|
172
173
|
}
|
|
173
174
|
};
|
|
175
|
+
console.log('getTreeData({ filters: options })', getTreeData({
|
|
176
|
+
filters: options
|
|
177
|
+
}));
|
|
174
178
|
if (filterMode === 'tree') {
|
|
175
179
|
return /*#__PURE__*/React.createElement(React.Fragment, null, showFilter && /*#__PURE__*/React.createElement(FilterSearch, {
|
|
176
180
|
filterSearch: filterSearch,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { TableLocale } from "rc-master-ui/es/table/interface";
|
|
3
|
+
type Props = {
|
|
4
|
+
options: any[];
|
|
5
|
+
filterSearch?: boolean;
|
|
6
|
+
open?: boolean;
|
|
7
|
+
tablePrefixCls?: string;
|
|
8
|
+
prefixCls?: string;
|
|
9
|
+
dropdownPrefixCls?: string;
|
|
10
|
+
filterMultiple: boolean;
|
|
11
|
+
showFilter?: boolean;
|
|
12
|
+
onSelect?: (value: any) => void;
|
|
13
|
+
selectedKeys: string[];
|
|
14
|
+
locale?: TableLocale;
|
|
15
|
+
filterMode?: 'menu' | 'tree';
|
|
16
|
+
searchValue: string;
|
|
17
|
+
setSearchValue: (value: any) => void;
|
|
18
|
+
};
|
|
19
|
+
declare const CheckboxFilter: (props: Props) => React.JSX.Element;
|
|
20
|
+
export default CheckboxFilter;
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import classNames from "classnames";
|
|
3
|
+
import FilterSearch from "./FilterSearch";
|
|
4
|
+
import { Checkbox, Menu, Radio, Empty } from "rc-master-ui";
|
|
5
|
+
import { Tree } from "antd";
|
|
6
|
+
import { flattenKeys } from "rc-master-ui/es/table/hooks/useFilter";
|
|
7
|
+
// import Tree from "rc-master-ui/es/tree";
|
|
8
|
+
|
|
9
|
+
function searchValueMatched(searchValue, text) {
|
|
10
|
+
if (typeof text === 'string' || typeof text === 'number') {
|
|
11
|
+
return text?.toString().toLowerCase().includes(searchValue.trim().toLowerCase());
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
function renderFilterItems({
|
|
16
|
+
filters,
|
|
17
|
+
prefixCls,
|
|
18
|
+
filteredKeys,
|
|
19
|
+
filterMultiple,
|
|
20
|
+
searchValue,
|
|
21
|
+
filterSearch
|
|
22
|
+
}) {
|
|
23
|
+
return filters.map((filter, index) => {
|
|
24
|
+
const key = String(filter.value);
|
|
25
|
+
if (filter.children) {
|
|
26
|
+
return {
|
|
27
|
+
key: key || index,
|
|
28
|
+
label: filter.text,
|
|
29
|
+
popupClassName: `${prefixCls}-dropdown-submenu`,
|
|
30
|
+
children: renderFilterItems({
|
|
31
|
+
filters: filter.children,
|
|
32
|
+
prefixCls,
|
|
33
|
+
filteredKeys,
|
|
34
|
+
filterMultiple,
|
|
35
|
+
searchValue,
|
|
36
|
+
filterSearch
|
|
37
|
+
})
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const Component = filterMultiple ? Checkbox : Radio;
|
|
41
|
+
const item = {
|
|
42
|
+
key: filter.value !== undefined ? key : index,
|
|
43
|
+
label: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Component, {
|
|
44
|
+
checked: filteredKeys.includes(key)
|
|
45
|
+
}), /*#__PURE__*/React.createElement("span", null, filter.text))
|
|
46
|
+
};
|
|
47
|
+
if (searchValue.trim()) {
|
|
48
|
+
if (typeof filterSearch === 'function') {
|
|
49
|
+
return filterSearch(searchValue, filter) ? item : null;
|
|
50
|
+
}
|
|
51
|
+
return searchValueMatched(searchValue, filter.text) ? item : null;
|
|
52
|
+
}
|
|
53
|
+
return item;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function hasSubMenu(filters) {
|
|
57
|
+
return filters.some(({
|
|
58
|
+
children
|
|
59
|
+
}) => children);
|
|
60
|
+
}
|
|
61
|
+
const CheckboxFilter = props => {
|
|
62
|
+
const {
|
|
63
|
+
// column,
|
|
64
|
+
filterSearch = true,
|
|
65
|
+
tablePrefixCls = 'ui-rc-table',
|
|
66
|
+
prefixCls = 'ui-rc-table-filter',
|
|
67
|
+
dropdownPrefixCls = 'ui-rc-dropdown',
|
|
68
|
+
filterMultiple,
|
|
69
|
+
selectedKeys,
|
|
70
|
+
locale,
|
|
71
|
+
options,
|
|
72
|
+
filterMode = 'tree',
|
|
73
|
+
// open,
|
|
74
|
+
searchValue,
|
|
75
|
+
showFilter,
|
|
76
|
+
setSearchValue,
|
|
77
|
+
onSelect
|
|
78
|
+
} = props;
|
|
79
|
+
|
|
80
|
+
// const [searchValue, setSearchValue] = React.useState('');
|
|
81
|
+
|
|
82
|
+
console.log('options', options);
|
|
83
|
+
const [openKeys, setOpenKeys] = React.useState([]);
|
|
84
|
+
|
|
85
|
+
// clear search value after close filter dropdown
|
|
86
|
+
// React.useEffect(() => {
|
|
87
|
+
// // if (visible) {
|
|
88
|
+
// setSearchValue('');
|
|
89
|
+
// // }
|
|
90
|
+
// }, [open]);
|
|
91
|
+
|
|
92
|
+
const onOpenChange = keys => {
|
|
93
|
+
setOpenKeys(keys);
|
|
94
|
+
};
|
|
95
|
+
const items = renderFilterItems({
|
|
96
|
+
// filters: column.filters || [],
|
|
97
|
+
filters: options || [],
|
|
98
|
+
filterSearch,
|
|
99
|
+
prefixCls,
|
|
100
|
+
filteredKeys: selectedKeys ?? [],
|
|
101
|
+
filterMultiple,
|
|
102
|
+
searchValue
|
|
103
|
+
});
|
|
104
|
+
const dropdownMenuClass = classNames({
|
|
105
|
+
// [`${dropdownPrefixCls}-menu-without-submenu`]: !hasSubMenu(column.filters || []),
|
|
106
|
+
[`${dropdownPrefixCls}-menu-without-submenu`]: !hasSubMenu(options || [])
|
|
107
|
+
});
|
|
108
|
+
const empty = /*#__PURE__*/React.createElement(Empty, {
|
|
109
|
+
image: Empty.PRESENTED_IMAGE_SIMPLE,
|
|
110
|
+
description: locale?.filterEmptyText,
|
|
111
|
+
imageStyle: {
|
|
112
|
+
height: 24
|
|
113
|
+
},
|
|
114
|
+
style: {
|
|
115
|
+
margin: 0,
|
|
116
|
+
padding: '16px 0'
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
const isEmpty = items.every(item => item === null);
|
|
120
|
+
const onSearch = e => {
|
|
121
|
+
const {
|
|
122
|
+
value
|
|
123
|
+
} = e.target;
|
|
124
|
+
setSearchValue(value);
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// if ((column.filters || []).length === 0) {
|
|
128
|
+
// return empty;
|
|
129
|
+
// }
|
|
130
|
+
|
|
131
|
+
const getTreeData = ({
|
|
132
|
+
filters
|
|
133
|
+
}) => (filters || []).map((filter, index) => {
|
|
134
|
+
const key = String(filter.value);
|
|
135
|
+
const item = {
|
|
136
|
+
title: filter.text,
|
|
137
|
+
key: filter.value !== undefined ? key : String(index)
|
|
138
|
+
};
|
|
139
|
+
if (filter.children) {
|
|
140
|
+
item.children = getTreeData({
|
|
141
|
+
filters: filter.children
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return item;
|
|
145
|
+
});
|
|
146
|
+
const getFilterData = node => ({
|
|
147
|
+
...node,
|
|
148
|
+
text: node.title,
|
|
149
|
+
value: node.key,
|
|
150
|
+
children: node.children?.map(item => getFilterData(item)) || []
|
|
151
|
+
});
|
|
152
|
+
const onCheckAll = e => {
|
|
153
|
+
if (e.target.checked) {
|
|
154
|
+
const allFilterKeys = flattenKeys(options).map(key => String(key));
|
|
155
|
+
|
|
156
|
+
// setFilteredKeysSync(allFilterKeys);
|
|
157
|
+
onSelect?.(allFilterKeys);
|
|
158
|
+
} else {
|
|
159
|
+
onSelect?.([]);
|
|
160
|
+
// setFilteredKeysSync([]);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
const onCheck = (keys, {
|
|
164
|
+
node,
|
|
165
|
+
checked
|
|
166
|
+
}) => {
|
|
167
|
+
if (!filterMultiple) {
|
|
168
|
+
// onSelectKeys({ selectedKeys: checked && node.key ? [node.key] : [] });
|
|
169
|
+
onSelect?.(checked && node.key ? [node.key] : []);
|
|
170
|
+
} else {
|
|
171
|
+
// onSelectKeys({ selectedKeys: keys });
|
|
172
|
+
onSelect?.(keys);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
console.log('getTreeData({ filters: options })', getTreeData({
|
|
176
|
+
filters: options
|
|
177
|
+
}));
|
|
178
|
+
if (filterMode === 'tree') {
|
|
179
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, showFilter && /*#__PURE__*/React.createElement(FilterSearch, {
|
|
180
|
+
filterSearch: filterSearch,
|
|
181
|
+
value: searchValue,
|
|
182
|
+
onChange: onSearch,
|
|
183
|
+
tablePrefixCls: tablePrefixCls,
|
|
184
|
+
locale: locale
|
|
185
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
186
|
+
className: `${tablePrefixCls}-filter-dropdown-tree`
|
|
187
|
+
}, filterMultiple && options.length > 0 ? /*#__PURE__*/React.createElement(Checkbox
|
|
188
|
+
// checked={selectedKeys.length === flattenKeys(column.filters).length}
|
|
189
|
+
, {
|
|
190
|
+
checked: selectedKeys.length === flattenKeys(options).length
|
|
191
|
+
// indeterminate={
|
|
192
|
+
// selectedKeys.length > 0 &&
|
|
193
|
+
// selectedKeys.length < flattenKeys(column.filters).length
|
|
194
|
+
// }
|
|
195
|
+
,
|
|
196
|
+
|
|
197
|
+
indeterminate: selectedKeys.length > 0 && selectedKeys.length < flattenKeys(options).length,
|
|
198
|
+
className: `${tablePrefixCls}-filter-dropdown-checkall`,
|
|
199
|
+
onChange: onCheckAll
|
|
200
|
+
}, locale?.filterCheckall) : /*#__PURE__*/React.createElement(Empty, null), /*#__PURE__*/React.createElement(Tree, {
|
|
201
|
+
checkable: true,
|
|
202
|
+
selectable: false,
|
|
203
|
+
blockNode: true,
|
|
204
|
+
multiple: filterMultiple,
|
|
205
|
+
checkStrictly: !filterMultiple,
|
|
206
|
+
className: `${dropdownPrefixCls}-menu`,
|
|
207
|
+
onCheck: onCheck,
|
|
208
|
+
checkedKeys: selectedKeys,
|
|
209
|
+
selectedKeys: selectedKeys,
|
|
210
|
+
showIcon: false
|
|
211
|
+
// treeData={getTreeData({ filters: column.filters })}
|
|
212
|
+
,
|
|
213
|
+
treeData: getTreeData({
|
|
214
|
+
filters: options
|
|
215
|
+
}),
|
|
216
|
+
autoExpandParent: true,
|
|
217
|
+
defaultExpandAll: true,
|
|
218
|
+
filterTreeNode: searchValue.trim() ? node => {
|
|
219
|
+
if (typeof filterSearch === 'function') {
|
|
220
|
+
// @ts-ignore
|
|
221
|
+
return filterSearch(searchValue, getFilterData(node));
|
|
222
|
+
}
|
|
223
|
+
return searchValueMatched(searchValue, node.title);
|
|
224
|
+
} : undefined
|
|
225
|
+
})));
|
|
226
|
+
}
|
|
227
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FilterSearch, {
|
|
228
|
+
filterSearch: filterSearch,
|
|
229
|
+
value: searchValue,
|
|
230
|
+
onChange: onSearch,
|
|
231
|
+
tablePrefixCls: tablePrefixCls,
|
|
232
|
+
locale: locale
|
|
233
|
+
}), isEmpty ? empty : /*#__PURE__*/React.createElement(Menu, {
|
|
234
|
+
selectable: true,
|
|
235
|
+
multiple: filterMultiple,
|
|
236
|
+
prefixCls: `${dropdownPrefixCls}-menu`,
|
|
237
|
+
className: dropdownMenuClass,
|
|
238
|
+
onSelect: onSelect,
|
|
239
|
+
onDeselect: onSelect,
|
|
240
|
+
selectedKeys: selectedKeys
|
|
241
|
+
// getPopupContainer={getPopupContainer}
|
|
242
|
+
,
|
|
243
|
+
openKeys: openKeys,
|
|
244
|
+
onOpenChange: onOpenChange,
|
|
245
|
+
items: items
|
|
246
|
+
}));
|
|
247
|
+
};
|
|
248
|
+
export default CheckboxFilter;
|
|
@@ -3,9 +3,14 @@ import React from 'react';
|
|
|
3
3
|
import { Resizable } from "react-resizable";
|
|
4
4
|
import 'react-resizable/css/styles.css';
|
|
5
5
|
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
6
|
-
import { addRowIdArray,
|
|
6
|
+
import { addRowIdArray,
|
|
7
|
+
// filterDataByColumns,
|
|
8
|
+
// filterDataByColumns2,
|
|
9
|
+
// filterDataByColumns3,
|
|
10
|
+
findItemByKey,
|
|
7
11
|
// convertFlatColumn,
|
|
8
12
|
removeColumns,
|
|
13
|
+
// removeFieldRecursive,
|
|
9
14
|
// addRowIdArray,
|
|
10
15
|
updateArrayByKey, updateColumnsByGroup, updateData } from "./hooks";
|
|
11
16
|
import dayjs from "dayjs";
|
|
@@ -65,7 +70,8 @@ const InternalTable = props => {
|
|
|
65
70
|
dataSource,
|
|
66
71
|
allowResizing,
|
|
67
72
|
dataSourceFilter: propDataSourceFilter,
|
|
68
|
-
onFilterClick,
|
|
73
|
+
// onFilterClick,
|
|
74
|
+
// onFilter,
|
|
69
75
|
editAble,
|
|
70
76
|
rowKey: propRowKey,
|
|
71
77
|
format,
|
|
@@ -94,8 +100,15 @@ const InternalTable = props => {
|
|
|
94
100
|
...local.lang
|
|
95
101
|
}
|
|
96
102
|
};
|
|
103
|
+
|
|
104
|
+
// const [filterStates, setFilterState] = React.useState<any>(null)
|
|
105
|
+
// const [isFilter, setIsFilter] = React.useState<boolean>(false);
|
|
106
|
+
|
|
97
107
|
const mergerdData = React.useMemo(() => {
|
|
108
|
+
// return filterDataByColumns2(addRowIdArray(dataSource), filterStates)
|
|
109
|
+
// return filterDataByColumns3(addRowIdArray(dataSource), filterStates)
|
|
98
110
|
return addRowIdArray(dataSource);
|
|
111
|
+
// return dataSource
|
|
99
112
|
}, [dataSource]);
|
|
100
113
|
const [columns, setColumns] = React.useState([]);
|
|
101
114
|
const tableRef = React.useRef(null);
|
|
@@ -140,7 +153,8 @@ const InternalTable = props => {
|
|
|
140
153
|
locale,
|
|
141
154
|
t,
|
|
142
155
|
rowKey,
|
|
143
|
-
dataSource: mergerdData,
|
|
156
|
+
// dataSource: mergerdData,
|
|
157
|
+
dataSource,
|
|
144
158
|
buddhistLocale,
|
|
145
159
|
dataSourceFilter: propDataSourceFilter,
|
|
146
160
|
format,
|
|
@@ -208,7 +222,22 @@ const InternalTable = props => {
|
|
|
208
222
|
// setData(newData)
|
|
209
223
|
// setMergedData(newData)
|
|
210
224
|
onDataChange?.(newData);
|
|
225
|
+
// onDataChange?.(removeFieldRecursive(newData, 'isFilterState'))
|
|
211
226
|
};
|
|
227
|
+
|
|
228
|
+
// const triggerFilter = (queries: any) => {
|
|
229
|
+
// console.log('queries', queries)
|
|
230
|
+
// // console.log('data', dataSource)
|
|
231
|
+
// setFilterState(queries)
|
|
232
|
+
//
|
|
233
|
+
// if (queries && queries.length > 0) {
|
|
234
|
+
// setIsFilter(true)
|
|
235
|
+
// } else {
|
|
236
|
+
// setIsFilter(false)
|
|
237
|
+
// }
|
|
238
|
+
//
|
|
239
|
+
// }
|
|
240
|
+
|
|
212
241
|
const triggerCommandClick = args => {
|
|
213
242
|
const {
|
|
214
243
|
id,
|
|
@@ -367,6 +396,7 @@ const InternalTable = props => {
|
|
|
367
396
|
locale: locale,
|
|
368
397
|
tableRef: tableRef,
|
|
369
398
|
dataSource: mergerdData
|
|
399
|
+
// dataSource={dataSource}
|
|
370
400
|
// components={components}
|
|
371
401
|
,
|
|
372
402
|
components: {
|
|
@@ -392,6 +422,10 @@ const InternalTable = props => {
|
|
|
392
422
|
groupAble: groupAble,
|
|
393
423
|
groupColumns: groupColumns,
|
|
394
424
|
commandClick: triggerCommandClick
|
|
425
|
+
// triggerFilter={triggerFilter}
|
|
426
|
+
// isFilter={isFilter}
|
|
427
|
+
// setIsFilter={setIsFilter}
|
|
428
|
+
// onScroll={onScroll}
|
|
395
429
|
}));
|
|
396
430
|
};
|
|
397
431
|
export default InternalTable;
|
|
@@ -5,12 +5,15 @@ import type { ColumnsTable, GetRowKey, GridTableProps } from "./type";
|
|
|
5
5
|
type GridProps<T> = GridTableProps<T> & {
|
|
6
6
|
triggerChangeColumns?: (columns: ColumnsTable<T>, type: string) => void;
|
|
7
7
|
triggerChangeData?: (newData: T[], type: string) => void;
|
|
8
|
+
triggerFilter?: (queries: any) => void;
|
|
8
9
|
triggerGroupColumns?: (groupedColumns: string[]) => void;
|
|
9
10
|
tableRef: any;
|
|
10
11
|
bottomToolbar?: () => React.ReactElement;
|
|
11
12
|
getRowKey: GetRowKey<T>;
|
|
12
13
|
rowSelection?: any;
|
|
13
14
|
groupToolbar?: () => React.ReactNode;
|
|
15
|
+
isFilter?: boolean;
|
|
16
|
+
setIsFilter?: React.Dispatch<React.SetStateAction<boolean>>;
|
|
14
17
|
};
|
|
15
18
|
declare const TableGrid: <RecordType extends object>(props: GridProps<RecordType>) => React.JSX.Element;
|
|
16
19
|
export default TableGrid;
|
|
@@ -8,6 +8,8 @@ import 'dayjs/locale/vi';
|
|
|
8
8
|
import ContextMenu from "./ContextMenu";
|
|
9
9
|
import classNames from "classnames";
|
|
10
10
|
import { checkDecimalSeparator, checkThousandSeparator,
|
|
11
|
+
// filterDataByColumns2,
|
|
12
|
+
filterDataByColumns3,
|
|
11
13
|
// convertFlatColumn,
|
|
12
14
|
isEmpty,
|
|
13
15
|
// newGuid,
|
|
@@ -22,6 +24,7 @@ import ComponentSpinner from "./LoadingSpinner";
|
|
|
22
24
|
import { ColumnsChoose } from "./ColumnsChoose";
|
|
23
25
|
import useMergedState from "rc-util/es/hooks/useMergedState";
|
|
24
26
|
import AdvanceFilter from "./AdvanceFilter";
|
|
27
|
+
import { Tooltip } from "react-tooltip";
|
|
25
28
|
const convertFilters = filters => {
|
|
26
29
|
const result = [];
|
|
27
30
|
filters.forEach(({
|
|
@@ -45,6 +48,40 @@ const convertFilters = filters => {
|
|
|
45
48
|
predicate: "and",
|
|
46
49
|
operator: "lessthanorequal"
|
|
47
50
|
});
|
|
51
|
+
} else if (column?.typeFilter === "NumberRange") {
|
|
52
|
+
if ((filteredKeys[0] || filteredKeys[0] === 0) && !filteredKeys[1]) {
|
|
53
|
+
result.push({
|
|
54
|
+
key,
|
|
55
|
+
field: column?.dataIndex,
|
|
56
|
+
value: filteredKeys[0],
|
|
57
|
+
predicate: "and",
|
|
58
|
+
operator: "greaterthanorequal"
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if ((filteredKeys[1] || filteredKeys[1] === 0) && !filteredKeys[0]) {
|
|
62
|
+
result.push({
|
|
63
|
+
key,
|
|
64
|
+
field: column?.dataIndex,
|
|
65
|
+
value: filteredKeys[1],
|
|
66
|
+
predicate: "and",
|
|
67
|
+
operator: "lessthanorequal"
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if ((filteredKeys[0] || filteredKeys[0] === 0) && (filteredKeys[1] || filteredKeys[1] === 0)) {
|
|
71
|
+
result.push({
|
|
72
|
+
key,
|
|
73
|
+
field: column?.dataIndex,
|
|
74
|
+
value: filteredKeys[0],
|
|
75
|
+
predicate: "and",
|
|
76
|
+
operator: "greaterthanorequal"
|
|
77
|
+
}, {
|
|
78
|
+
key,
|
|
79
|
+
field: column?.dataIndex,
|
|
80
|
+
value: filteredKeys[1],
|
|
81
|
+
predicate: "and",
|
|
82
|
+
operator: "lessthanorequal"
|
|
83
|
+
});
|
|
84
|
+
}
|
|
48
85
|
} else if (column?.typeFilter === 'Checkbox') {
|
|
49
86
|
filteredKeys.forEach(value => {
|
|
50
87
|
result.push({
|
|
@@ -112,6 +149,7 @@ const TableGrid = props => {
|
|
|
112
149
|
showColumnChoose,
|
|
113
150
|
showAdvanceFilter,
|
|
114
151
|
onFilter,
|
|
152
|
+
triggerFilter,
|
|
115
153
|
selectionSettings,
|
|
116
154
|
rowSelection,
|
|
117
155
|
rowSelected,
|
|
@@ -133,6 +171,7 @@ const TableGrid = props => {
|
|
|
133
171
|
groupColumns,
|
|
134
172
|
groupToolbar,
|
|
135
173
|
showEmptyText,
|
|
174
|
+
setIsFilter,
|
|
136
175
|
...rest
|
|
137
176
|
} = props;
|
|
138
177
|
const {
|
|
@@ -159,6 +198,7 @@ const TableGrid = props => {
|
|
|
159
198
|
viewportWidth,
|
|
160
199
|
viewportHeight
|
|
161
200
|
});
|
|
201
|
+
const [filterStates, setFilterState] = React.useState(null);
|
|
162
202
|
|
|
163
203
|
// const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>(defaultSelected);
|
|
164
204
|
|
|
@@ -295,6 +335,18 @@ const TableGrid = props => {
|
|
|
295
335
|
const handleChange = sorter => {
|
|
296
336
|
onSorter?.(sorter);
|
|
297
337
|
};
|
|
338
|
+
const handleOnFilter = queries => {
|
|
339
|
+
if (onFilter) {
|
|
340
|
+
onFilter?.(convertFilters(queries));
|
|
341
|
+
} else {
|
|
342
|
+
setFilterState(convertFilters(queries));
|
|
343
|
+
if (queries && queries.length > 0) {
|
|
344
|
+
setIsFilter?.(true);
|
|
345
|
+
} else {
|
|
346
|
+
setIsFilter?.(false);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
};
|
|
298
350
|
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(ContextMenu, {
|
|
299
351
|
open: menuVisible,
|
|
300
352
|
pos: position,
|
|
@@ -306,7 +358,9 @@ const TableGrid = props => {
|
|
|
306
358
|
}), /*#__PURE__*/React.createElement(Table, _extends({
|
|
307
359
|
ref: tableRef
|
|
308
360
|
}, rest, {
|
|
361
|
+
tableLayout: 'fixed'
|
|
309
362
|
// id={newGuid()}
|
|
363
|
+
,
|
|
310
364
|
locale: {
|
|
311
365
|
...locale,
|
|
312
366
|
emptyText: showEmptyText !== false ? /*#__PURE__*/React.createElement(Empty, {
|
|
@@ -318,7 +372,8 @@ const TableGrid = props => {
|
|
|
318
372
|
spinning: columns && columns.length === 0 || loading === true,
|
|
319
373
|
indicator: /*#__PURE__*/React.createElement(ComponentSpinner, null)
|
|
320
374
|
},
|
|
321
|
-
dataSource: columns && columns.length > 0 && loading !== true ? dataSource : []
|
|
375
|
+
dataSource: columns && columns.length > 0 && loading !== true ? filterDataByColumns3(dataSource, filterStates) : []
|
|
376
|
+
// dataSource={columns && columns.length > 0 && loading !== true ? dataSource : []}
|
|
322
377
|
// className={styles.customTable}
|
|
323
378
|
,
|
|
324
379
|
className: classNames(className, {
|
|
@@ -353,10 +408,13 @@ const TableGrid = props => {
|
|
|
353
408
|
// checkStrictly: false,
|
|
354
409
|
|
|
355
410
|
hideSelectAll: !type || type === 'single' || selectionSettings?.mode === 'radio' ? true : hideSelectAll ?? type !== 'multiple'
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// onScroll={() => {
|
|
414
|
+
// setMenuVisible(false)
|
|
415
|
+
// }}
|
|
416
|
+
,
|
|
417
|
+
|
|
360
418
|
summary: () => {
|
|
361
419
|
if (typeof summary === 'function') {
|
|
362
420
|
return summary(dataSource);
|
|
@@ -395,7 +453,9 @@ const TableGrid = props => {
|
|
|
395
453
|
...pagination
|
|
396
454
|
},
|
|
397
455
|
onFilter: val => {
|
|
398
|
-
|
|
456
|
+
handleOnFilter(val);
|
|
457
|
+
// triggerFilter?.(convertFilters(val))
|
|
458
|
+
// onFilter?.(convertFilters(val))
|
|
399
459
|
},
|
|
400
460
|
onChange: (paging, filters, sorter) => handleChange(sorter),
|
|
401
461
|
title: showToolbar === false ? undefined : () => {
|
|
@@ -457,6 +517,8 @@ const TableGrid = props => {
|
|
|
457
517
|
// @ts-ignore
|
|
458
518
|
,
|
|
459
519
|
showTotal: (total, range) => `${range[0]}-${range[1]} / ${total} ${t ? t(pagination?.locale?.items ?? 'items') : 'items'}`
|
|
460
|
-
}, pagination)), bottomToolbar?.()
|
|
520
|
+
}, pagination)), bottomToolbar?.(), /*#__PURE__*/React.createElement(Tooltip, {
|
|
521
|
+
id: "tooltip-header"
|
|
522
|
+
}));
|
|
461
523
|
};
|
|
462
524
|
export default TableGrid;
|
|
@@ -6,6 +6,7 @@ import React, { Fragment } from "react";
|
|
|
6
6
|
import { DatePicker, Empty, Input, Select } from "rc-master-ui";
|
|
7
7
|
import CheckboxFilter from "../../CheckboxFilter";
|
|
8
8
|
import { SELECTION_COLUMN } from "rc-master-ui/es/table/hooks/useSelection";
|
|
9
|
+
import NumberRange from "../../number-range";
|
|
9
10
|
const {
|
|
10
11
|
RangePicker
|
|
11
12
|
} = DatePicker;
|
|
@@ -131,11 +132,6 @@ export const renderFilter = (column, selectedKeys, setSelectedKeys, confirm, vis
|
|
|
131
132
|
const dateRangeFormat = getDatepickerFormat(column?.type, column) ?? 'DD/MM/YYYY';
|
|
132
133
|
const find = dataSourceFilter?.find(it => it.key === column?.field);
|
|
133
134
|
const options = find ? find.data : [];
|
|
134
|
-
|
|
135
|
-
// console.log('dataSourceFilter', dataSourceFilter)
|
|
136
|
-
// console.log('options', options)
|
|
137
|
-
// console.log('column', column)
|
|
138
|
-
|
|
139
135
|
switch (type) {
|
|
140
136
|
case 'Number':
|
|
141
137
|
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
@@ -155,39 +151,15 @@ export const renderFilter = (column, selectedKeys, setSelectedKeys, confirm, vis
|
|
|
155
151
|
}
|
|
156
152
|
}))));
|
|
157
153
|
case 'NumberRange':
|
|
158
|
-
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
154
|
+
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(NumberRange, {
|
|
155
|
+
t: t,
|
|
156
|
+
min: selectedKeys[0],
|
|
157
|
+
max: selectedKeys[1],
|
|
158
|
+
onChange: vals => {
|
|
159
|
+
console.log('NumberRange', vals);
|
|
160
|
+
setSelectedKeys(vals);
|
|
163
161
|
}
|
|
164
|
-
}
|
|
165
|
-
value: selectedKeys[0]
|
|
166
|
-
// thousandSeparator={checkThousandSeparator(thousandSeparator, decimalSeparator)}
|
|
167
|
-
// decimalSeparator={checkDecimalSeparator(thousandSeparator, decimalSeparator)}
|
|
168
|
-
,
|
|
169
|
-
allowNegative: true,
|
|
170
|
-
customInput: Input,
|
|
171
|
-
className: ' rounded-0 input-element form-control'
|
|
172
|
-
// onValueChange={(values: any) => {
|
|
173
|
-
// onChangeValueFilter(type, values.floatValue, 'min')
|
|
174
|
-
// }}
|
|
175
|
-
,
|
|
176
|
-
placeholder: t ? t('Min') : 'Min',
|
|
177
|
-
autoFocus: true
|
|
178
|
-
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(NumericFormat, {
|
|
179
|
-
value: selectedKeys[1]
|
|
180
|
-
// thousandSeparator={checkThousandSeparator(thousandSeparator, decimalSeparator)}
|
|
181
|
-
// decimalSeparator={checkDecimalSeparator(thousandSeparator, decimalSeparator)}
|
|
182
|
-
,
|
|
183
|
-
allowNegative: true,
|
|
184
|
-
customInput: Input,
|
|
185
|
-
className: ' rounded-0 input-element form-control',
|
|
186
|
-
onValueChange: () => {
|
|
187
|
-
// onChangeValueFilter(type, values.floatValue, 'max')
|
|
188
|
-
},
|
|
189
|
-
placeholder: t ? t('Max') : 'Max'
|
|
190
|
-
})))));
|
|
162
|
+
})));
|
|
191
163
|
case 'Date':
|
|
192
164
|
const dateValue = selectedKeys[0] ? convertDateToDayjs(new Date(selectedKeys[0]), dateFormat) : null;
|
|
193
165
|
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
@@ -438,16 +410,13 @@ export const renderFilter = (column, selectedKeys, setSelectedKeys, confirm, vis
|
|
|
438
410
|
case 'Checkbox':
|
|
439
411
|
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
440
412
|
className: 'mb-1'
|
|
441
|
-
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(CheckboxFilter
|
|
442
|
-
// locale={{
|
|
443
|
-
// filterTitle: 'Chọn tất cả',
|
|
444
|
-
// filterCheckall: 'Chọn tất cả'
|
|
445
|
-
// }}
|
|
446
|
-
, {
|
|
413
|
+
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(CheckboxFilter, {
|
|
447
414
|
locale: locale,
|
|
448
415
|
selectedKeys: selectedKeys,
|
|
449
|
-
onSelect: setSelectedKeys
|
|
450
|
-
|
|
416
|
+
onSelect: setSelectedKeys
|
|
417
|
+
// options={options}
|
|
418
|
+
,
|
|
419
|
+
options: column.source ? column.source : options ?? [],
|
|
451
420
|
filterMultiple: true,
|
|
452
421
|
open: visible,
|
|
453
422
|
searchValue: searchValue,
|