@addev-be/ui 0.1.20 → 0.1.24
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/package.json +1 -1
- package/src/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.ts +102 -0
- package/src/components/data/AdvancedRequestDataGrid/helpers/columns.tsx +223 -0
- package/src/components/data/AdvancedRequestDataGrid/helpers/filters.ts +19 -0
- package/src/components/data/AdvancedRequestDataGrid/helpers/index.ts +3 -0
- package/src/components/data/{DataGrid/AdvancedRequestDataGrid.tsx → AdvancedRequestDataGrid/index.tsx} +47 -38
- package/src/components/data/AdvancedRequestDataGrid/types.ts +44 -0
- package/src/components/data/DataGrid/DataGridCell.tsx +3 -6
- package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +2 -2
- package/src/components/data/DataGrid/DataGridFooter.tsx +4 -4
- package/src/components/data/DataGrid/DataGridHeader.tsx +11 -14
- package/src/components/data/DataGrid/VirtualScroller.tsx +2 -7
- package/src/components/data/DataGrid/helpers/columns.tsx +33 -94
- package/src/components/data/DataGrid/helpers/filters.ts +16 -28
- package/src/components/data/DataGrid/helpers/index.ts +1 -2
- package/src/components/data/DataGrid/hooks/index.ts +1 -1
- package/src/components/data/DataGrid/hooks/useDataGrid.tsx +40 -4
- package/src/components/data/DataGrid/index.tsx +15 -27
- package/src/components/data/DataGrid/styles.ts +19 -4
- package/src/components/data/DataGrid/types.ts +68 -65
- package/src/components/data/index.ts +3 -2
- package/src/components/forms/IconButton.tsx +0 -1
- package/src/components/forms/IndeterminateCheckbox.tsx +1 -1
- package/src/services/advancedRequests.ts +1 -0
- package/src/components/data/DataGrid/helpers/advancedRequests.tsx +0 -61
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
FilterSlashIcon,
|
|
10
10
|
TableColumnsIcon,
|
|
11
11
|
} from '../../../Icons';
|
|
12
|
-
import { useCallback,
|
|
12
|
+
import { useCallback, useState } from 'react';
|
|
13
13
|
|
|
14
14
|
import { Button } from '../../forms';
|
|
15
15
|
import { DataGridContext } from './types';
|
|
@@ -29,39 +29,36 @@ export const DataGridHeader = <R,>({
|
|
|
29
29
|
visibleColumns,
|
|
30
30
|
selectable,
|
|
31
31
|
rows,
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
selectedKeys,
|
|
33
|
+
setSelectedKeys,
|
|
34
34
|
copyTable,
|
|
35
35
|
setFilters,
|
|
36
36
|
refresh,
|
|
37
37
|
headerColor,
|
|
38
|
+
rowKeyGetter,
|
|
39
|
+
gridTemplateColumns,
|
|
38
40
|
} = useDataGridContext(context);
|
|
39
41
|
const [visibleFilter, setVisibleFilter] = useState<string | undefined>();
|
|
40
42
|
|
|
41
43
|
const { openModal, modal } = useDataGridColumnsModal<R>(context);
|
|
42
44
|
|
|
43
45
|
const checkboxStatus =
|
|
44
|
-
|
|
46
|
+
selectedKeys.length === 0
|
|
45
47
|
? false
|
|
46
|
-
:
|
|
48
|
+
: selectedKeys.length === rows.length
|
|
47
49
|
? true
|
|
48
50
|
: undefined;
|
|
49
51
|
const toggleAll = useCallback(
|
|
50
52
|
(newStatus: boolean) => {
|
|
51
|
-
|
|
53
|
+
setSelectedKeys(newStatus ? rows.map(rowKeyGetter) : []);
|
|
52
54
|
},
|
|
53
|
-
[rows,
|
|
55
|
+
[rowKeyGetter, rows, setSelectedKeys]
|
|
54
56
|
);
|
|
55
57
|
|
|
56
58
|
const onFilterButtonClicked = useCallback((columnKey: string) => {
|
|
57
59
|
setVisibleFilter((prev) => (prev === columnKey ? undefined : columnKey));
|
|
58
60
|
}, []);
|
|
59
61
|
|
|
60
|
-
const gridTemplateColumns = useMemo(
|
|
61
|
-
() => visibleColumns.map(([, col]) => `${col.width ?? 150}px`).join(' '),
|
|
62
|
-
[visibleColumns]
|
|
63
|
-
);
|
|
64
|
-
|
|
65
62
|
const [isLoadingVisible, setIsLoadingVisible] = useState(false);
|
|
66
63
|
const runCopyTable = useCallback(() => {
|
|
67
64
|
setIsLoadingVisible(true);
|
|
@@ -103,14 +100,14 @@ export const DataGridHeader = <R,>({
|
|
|
103
100
|
$headerColor={headerColor}
|
|
104
101
|
>
|
|
105
102
|
{!!selectable && (
|
|
106
|
-
<
|
|
103
|
+
<styles.SelectionCell
|
|
107
104
|
// className="inline-flex items-center justify-center w-12 select-none"
|
|
108
105
|
>
|
|
109
106
|
<IndeterminateCheckbox
|
|
110
107
|
checked={checkboxStatus}
|
|
111
108
|
onChange={() => toggleAll(!checkboxStatus)}
|
|
112
109
|
/>
|
|
113
|
-
</
|
|
110
|
+
</styles.SelectionCell>
|
|
114
111
|
)}
|
|
115
112
|
{visibleColumns.map(([key, col], index) => (
|
|
116
113
|
<DataGridHeaderCell
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as styles from './styles';
|
|
2
2
|
|
|
3
|
-
import { ReactNode, useContext
|
|
3
|
+
import { ReactNode, useContext } from 'react';
|
|
4
4
|
|
|
5
5
|
import { DataGridContext } from './types';
|
|
6
6
|
|
|
@@ -17,9 +17,9 @@ export const VirtualScroller = <R,>(props: VirtualScrollerProps<R>) => {
|
|
|
17
17
|
rowHeight = styles.DEFAULT_ROW_HEIGHT,
|
|
18
18
|
// headerRowHeight = styles.DEFAULT_HEADER_ROW_HEIGHT,
|
|
19
19
|
sortedRows,
|
|
20
|
-
visibleColumns,
|
|
21
20
|
index,
|
|
22
21
|
visibleRows,
|
|
22
|
+
gridTemplateColumns,
|
|
23
23
|
} = useContext(props.context);
|
|
24
24
|
const {
|
|
25
25
|
rowTemplate,
|
|
@@ -32,11 +32,6 @@ export const VirtualScroller = <R,>(props: VirtualScrollerProps<R>) => {
|
|
|
32
32
|
// const headerAndFooterHeight =
|
|
33
33
|
// 2 * headerRowHeight + (hasFooter ? rowHeight : 0) + 2;
|
|
34
34
|
|
|
35
|
-
const gridTemplateColumns = useMemo(
|
|
36
|
-
() => visibleColumns.map(([, col]) => `${col.width ?? 150}px`).join(' '),
|
|
37
|
-
[visibleColumns]
|
|
38
|
-
);
|
|
39
|
-
|
|
40
35
|
return (
|
|
41
36
|
<styles.VirtualScrollerContainer $height={totalHeight}>
|
|
42
37
|
<styles.VirtualScrollerRowsContainer
|
|
@@ -1,22 +1,17 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
DataGridColumn,
|
|
5
|
-
DataGridColumns,
|
|
6
|
-
DataGridFilterType,
|
|
7
|
-
DataGridSettings,
|
|
8
|
-
} from '../types';
|
|
3
|
+
import { DataGridColumn, DataGridColumns, DataGridSettings } from '../types';
|
|
9
4
|
import {
|
|
10
5
|
formatMoney,
|
|
11
6
|
formatNumber,
|
|
12
7
|
formatPercentage,
|
|
13
8
|
} from '../../../../helpers/numbers';
|
|
9
|
+
import { numberFilter, textFilter } from './filters';
|
|
14
10
|
|
|
15
|
-
import _ from 'lodash';
|
|
16
11
|
import moment from 'moment';
|
|
17
12
|
|
|
18
13
|
export const isColumnVisible = <R,>(
|
|
19
|
-
obj: DataGridColumn<R
|
|
14
|
+
obj: DataGridColumn<R> | DataGridSettings
|
|
20
15
|
): boolean => {
|
|
21
16
|
return obj?.order !== -1;
|
|
22
17
|
};
|
|
@@ -24,19 +19,14 @@ export const isColumnVisible = <R,>(
|
|
|
24
19
|
export const textColumn = <R extends Record<string, any>>(
|
|
25
20
|
key: string,
|
|
26
21
|
title: string,
|
|
27
|
-
options?: Partial<DataGridColumn<R
|
|
22
|
+
options?: Partial<DataGridColumn<R>>
|
|
28
23
|
): DataGridColumns<R> => ({
|
|
29
24
|
[key]: {
|
|
30
25
|
name: title,
|
|
31
|
-
render: (
|
|
26
|
+
render: (row) => row[key] ?? '',
|
|
32
27
|
getter: (row) => row[key] ?? '',
|
|
33
28
|
sortGetter: (row) => row[key] ?? '',
|
|
34
|
-
filter:
|
|
35
|
-
type: 'text',
|
|
36
|
-
operator: 'contains',
|
|
37
|
-
values: [''],
|
|
38
|
-
getter: (row) => row[key] ?? '',
|
|
39
|
-
},
|
|
29
|
+
filter: textFilter(key),
|
|
40
30
|
...options,
|
|
41
31
|
},
|
|
42
32
|
});
|
|
@@ -44,11 +34,11 @@ export const textColumn = <R extends Record<string, any>>(
|
|
|
44
34
|
export const mailColumn = <R extends Record<string, any>>(
|
|
45
35
|
key: string,
|
|
46
36
|
title: string,
|
|
47
|
-
options?: Partial<DataGridColumn<R
|
|
37
|
+
options?: Partial<DataGridColumn<R>>
|
|
48
38
|
): DataGridColumns<R> => ({
|
|
49
39
|
[key]: {
|
|
50
40
|
name: title,
|
|
51
|
-
render: (
|
|
41
|
+
render: (row) => (
|
|
52
42
|
<a
|
|
53
43
|
// className="text-blue-500 hover:text-blue-700"
|
|
54
44
|
href={`mailto:${row[key]}`}
|
|
@@ -58,12 +48,7 @@ export const mailColumn = <R extends Record<string, any>>(
|
|
|
58
48
|
),
|
|
59
49
|
getter: (row) => row[key] ?? '',
|
|
60
50
|
sortGetter: (row) => row[key] ?? '',
|
|
61
|
-
filter:
|
|
62
|
-
type: 'text',
|
|
63
|
-
operator: 'contains',
|
|
64
|
-
values: [''],
|
|
65
|
-
getter: (row) => row[key] ?? '',
|
|
66
|
-
},
|
|
51
|
+
filter: textFilter(key),
|
|
67
52
|
...options,
|
|
68
53
|
},
|
|
69
54
|
});
|
|
@@ -71,11 +56,11 @@ export const mailColumn = <R extends Record<string, any>>(
|
|
|
71
56
|
export const phoneColumn = <R extends Record<string, any>>(
|
|
72
57
|
key: string,
|
|
73
58
|
title: string,
|
|
74
|
-
options?: Partial<DataGridColumn<R
|
|
59
|
+
options?: Partial<DataGridColumn<R>>
|
|
75
60
|
): DataGridColumns<R> => ({
|
|
76
61
|
[key]: {
|
|
77
62
|
name: title,
|
|
78
|
-
render: (
|
|
63
|
+
render: (row) => (
|
|
79
64
|
<a
|
|
80
65
|
// className="text-blue-500 hover:text-blue-700"
|
|
81
66
|
href={`tel:${row[key]}`}
|
|
@@ -85,12 +70,7 @@ export const phoneColumn = <R extends Record<string, any>>(
|
|
|
85
70
|
),
|
|
86
71
|
getter: (row) => row[key] ?? '',
|
|
87
72
|
sortGetter: (row) => row[key] ?? '',
|
|
88
|
-
filter:
|
|
89
|
-
type: 'text',
|
|
90
|
-
operator: 'contains',
|
|
91
|
-
values: [''],
|
|
92
|
-
getter: (row) => row[key] ?? '',
|
|
93
|
-
},
|
|
73
|
+
filter: textFilter(key),
|
|
94
74
|
...options,
|
|
95
75
|
},
|
|
96
76
|
});
|
|
@@ -98,19 +78,14 @@ export const phoneColumn = <R extends Record<string, any>>(
|
|
|
98
78
|
export const dateColumn = <R extends Record<string, any>>(
|
|
99
79
|
key: string,
|
|
100
80
|
title: string,
|
|
101
|
-
options?: Partial<DataGridColumn<R
|
|
81
|
+
options?: Partial<DataGridColumn<R>>
|
|
102
82
|
): DataGridColumns<R> => ({
|
|
103
83
|
[key]: {
|
|
104
84
|
name: title,
|
|
105
|
-
render: (
|
|
85
|
+
render: (row) => moment(row[key]).format('DD/MM/YYYY') ?? '',
|
|
106
86
|
getter: (row) => row[key] ?? '',
|
|
107
87
|
sortGetter: (row) => row[key] ?? '',
|
|
108
|
-
filter:
|
|
109
|
-
type: 'text',
|
|
110
|
-
operator: 'contains',
|
|
111
|
-
values: [''],
|
|
112
|
-
getter: (row) => row[key] ?? '',
|
|
113
|
-
},
|
|
88
|
+
filter: textFilter(key),
|
|
114
89
|
...options,
|
|
115
90
|
},
|
|
116
91
|
});
|
|
@@ -118,19 +93,14 @@ export const dateColumn = <R extends Record<string, any>>(
|
|
|
118
93
|
export const monthColumn = <R extends Record<string, any>>(
|
|
119
94
|
key: string,
|
|
120
95
|
title: string,
|
|
121
|
-
options?: Partial<DataGridColumn<R
|
|
96
|
+
options?: Partial<DataGridColumn<R>>
|
|
122
97
|
): DataGridColumns<R> => ({
|
|
123
98
|
[key]: {
|
|
124
99
|
name: title,
|
|
125
|
-
render: (
|
|
100
|
+
render: (row) => (row[key] ? `${row[key]} mois ` : ''),
|
|
126
101
|
getter: (row) => row[key] ?? '',
|
|
127
102
|
sortGetter: (row) => row[key] ?? '',
|
|
128
|
-
filter:
|
|
129
|
-
type: 'text',
|
|
130
|
-
operator: 'contains',
|
|
131
|
-
values: [''],
|
|
132
|
-
getter: (row) => row[key] ?? '',
|
|
133
|
-
},
|
|
103
|
+
filter: textFilter(key),
|
|
134
104
|
...options,
|
|
135
105
|
},
|
|
136
106
|
});
|
|
@@ -139,11 +109,11 @@ export const numberColumn = <R extends Record<string, any>>(
|
|
|
139
109
|
key: string,
|
|
140
110
|
title: string,
|
|
141
111
|
decimals = 2,
|
|
142
|
-
options?: Partial<DataGridColumn<R
|
|
112
|
+
options?: Partial<DataGridColumn<R>>
|
|
143
113
|
): DataGridColumns<R> => ({
|
|
144
114
|
[key]: {
|
|
145
115
|
name: title,
|
|
146
|
-
render: (
|
|
116
|
+
render: (row) => formatNumber(row[key], decimals) ?? '',
|
|
147
117
|
excelFormatter: () => '#',
|
|
148
118
|
getter: (row) => row[key] ?? '',
|
|
149
119
|
sortGetter: (row) => row[key] ?? '',
|
|
@@ -151,7 +121,7 @@ export const numberColumn = <R extends Record<string, any>>(
|
|
|
151
121
|
type: 'number',
|
|
152
122
|
operator: 'equals',
|
|
153
123
|
values: [0],
|
|
154
|
-
getter: (
|
|
124
|
+
getter: (value) => value ?? 0,
|
|
155
125
|
},
|
|
156
126
|
...options,
|
|
157
127
|
},
|
|
@@ -161,20 +131,15 @@ export const moneyColumn = <R extends Record<string, any>>(
|
|
|
161
131
|
key: string,
|
|
162
132
|
title: string,
|
|
163
133
|
decimals = 2,
|
|
164
|
-
options?: Partial<DataGridColumn<R
|
|
134
|
+
options?: Partial<DataGridColumn<R>>
|
|
165
135
|
): DataGridColumns<R> => ({
|
|
166
136
|
[key]: {
|
|
167
137
|
name: title,
|
|
168
|
-
render: (
|
|
138
|
+
render: (row) => formatMoney(row[key], decimals) ?? '',
|
|
169
139
|
excelFormatter: () => '#0.00',
|
|
170
140
|
getter: (row) => row[key] ?? '',
|
|
171
141
|
sortGetter: (row) => row[key] ?? '',
|
|
172
|
-
filter:
|
|
173
|
-
type: 'number',
|
|
174
|
-
operator: 'equals',
|
|
175
|
-
values: [0],
|
|
176
|
-
getter: (row) => row[key] ?? 0,
|
|
177
|
-
},
|
|
142
|
+
filter: numberFilter(key),
|
|
178
143
|
...options,
|
|
179
144
|
},
|
|
180
145
|
});
|
|
@@ -182,20 +147,15 @@ export const moneyColumn = <R extends Record<string, any>>(
|
|
|
182
147
|
export const percentageColumn = <R extends Record<string, any>>(
|
|
183
148
|
key: string,
|
|
184
149
|
title: string,
|
|
185
|
-
options?: Partial<DataGridColumn<R
|
|
150
|
+
options?: Partial<DataGridColumn<R>>
|
|
186
151
|
): DataGridColumns<R> => ({
|
|
187
152
|
[key]: {
|
|
188
153
|
name: title,
|
|
189
|
-
render: (
|
|
154
|
+
render: (row) => formatPercentage(row[key]) ?? '',
|
|
190
155
|
excelFormatter: () => '#0.00',
|
|
191
156
|
getter: (row) => row[key] ?? '',
|
|
192
157
|
sortGetter: (row) => row[key] ?? '',
|
|
193
|
-
filter:
|
|
194
|
-
type: 'number',
|
|
195
|
-
operator: 'equals',
|
|
196
|
-
values: [0],
|
|
197
|
-
getter: (row) => row[key] ?? 0,
|
|
198
|
-
},
|
|
158
|
+
filter: numberFilter(key),
|
|
199
159
|
...options,
|
|
200
160
|
},
|
|
201
161
|
});
|
|
@@ -203,11 +163,11 @@ export const percentageColumn = <R extends Record<string, any>>(
|
|
|
203
163
|
export const checkboxColumn = <R extends Record<string, any>>(
|
|
204
164
|
key: string,
|
|
205
165
|
title: string,
|
|
206
|
-
options?: Partial<DataGridColumn<R
|
|
166
|
+
options?: Partial<DataGridColumn<R>>
|
|
207
167
|
): DataGridColumns<R> => ({
|
|
208
168
|
[key]: {
|
|
209
169
|
name: title,
|
|
210
|
-
render: (
|
|
170
|
+
render: (row) => (
|
|
211
171
|
<>
|
|
212
172
|
<input type="checkbox" checked={row[key]} />
|
|
213
173
|
<span>{row[key] ? ' Oui' : ' Non'}</span>
|
|
@@ -215,12 +175,7 @@ export const checkboxColumn = <R extends Record<string, any>>(
|
|
|
215
175
|
),
|
|
216
176
|
getter: (row) => row[key] ?? '',
|
|
217
177
|
sortGetter: (row) => row[key] ?? '',
|
|
218
|
-
filter:
|
|
219
|
-
type: 'number',
|
|
220
|
-
operator: 'equals',
|
|
221
|
-
values: [0],
|
|
222
|
-
getter: (row) => row[key] ?? 0,
|
|
223
|
-
},
|
|
178
|
+
filter: numberFilter(key),
|
|
224
179
|
...options,
|
|
225
180
|
},
|
|
226
181
|
});
|
|
@@ -228,32 +183,16 @@ export const checkboxColumn = <R extends Record<string, any>>(
|
|
|
228
183
|
export const colorColumn = <R extends Record<string, any>>(
|
|
229
184
|
key: string,
|
|
230
185
|
title: string,
|
|
231
|
-
options?: Partial<DataGridColumn<R
|
|
186
|
+
options?: Partial<DataGridColumn<R>>
|
|
232
187
|
): DataGridColumns<R> => ({
|
|
233
188
|
[key]: {
|
|
234
189
|
name: title,
|
|
235
|
-
render: (
|
|
190
|
+
render: (row) => (
|
|
236
191
|
<div style={{ backgroundColor: row[key] }}>{row[key] ?? ''}</div>
|
|
237
192
|
),
|
|
238
193
|
getter: (row) => row[key] ?? '',
|
|
239
194
|
sortGetter: (row) => row[key] ?? '',
|
|
240
|
-
filter:
|
|
241
|
-
type: 'text',
|
|
242
|
-
operator: 'contains',
|
|
243
|
-
values: [''],
|
|
244
|
-
getter: (row) => row[key] ?? '',
|
|
245
|
-
},
|
|
195
|
+
filter: textFilter(key),
|
|
246
196
|
...options,
|
|
247
197
|
},
|
|
248
198
|
});
|
|
249
|
-
|
|
250
|
-
export const withGroupBy = <R extends Record<string, any>>(
|
|
251
|
-
columns: DataGridColumns<R>
|
|
252
|
-
): DataGridColumns<R> =>
|
|
253
|
-
_.mapValues(columns, (column, key) => ({
|
|
254
|
-
...column,
|
|
255
|
-
field: {
|
|
256
|
-
...(column.field ?? { fieldName: key }),
|
|
257
|
-
groupBy: true,
|
|
258
|
-
},
|
|
259
|
-
}));
|
|
@@ -9,11 +9,8 @@ import {
|
|
|
9
9
|
DataGridFilterPredicateBuilder,
|
|
10
10
|
DataGridFilterPredicates,
|
|
11
11
|
DataGridFilterType,
|
|
12
|
-
DataGridFilters,
|
|
13
12
|
} from '../types';
|
|
14
13
|
|
|
15
|
-
import { ConditionDTO } from '../../../../services/advancedRequests';
|
|
16
|
-
import _ from 'lodash';
|
|
17
14
|
import moment from 'moment';
|
|
18
15
|
|
|
19
16
|
const escapeRegExp = (s: string) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
@@ -118,20 +115,14 @@ export const filtersPredicates: DataGridFilterPredicates = {
|
|
|
118
115
|
},
|
|
119
116
|
};
|
|
120
117
|
|
|
121
|
-
export const applyFilters = <R>(
|
|
122
|
-
rows: R[],
|
|
123
|
-
filters: DataGridFilter<R, DataGridFilterType>[]
|
|
124
|
-
): R[] => {
|
|
118
|
+
export const applyFilters = <R>(rows: R[], filters: DataGridFilter[]): R[] => {
|
|
125
119
|
return filters.reduce(
|
|
126
120
|
(tempRows, filter) => applyFilter(tempRows, filter),
|
|
127
121
|
rows
|
|
128
122
|
);
|
|
129
123
|
};
|
|
130
124
|
|
|
131
|
-
export const applyFilter = <R,
|
|
132
|
-
rows: R[],
|
|
133
|
-
filter: DataGridFilter<R, T>
|
|
134
|
-
): R[] => {
|
|
125
|
+
export const applyFilter = <R>(rows: R[], filter: DataGridFilter): R[] => {
|
|
135
126
|
const predicateBuilder = filtersPredicates[filter.type][filter.operator];
|
|
136
127
|
if (typeof predicateBuilder !== 'function') return rows;
|
|
137
128
|
const predicate = predicateBuilder(...filter.values);
|
|
@@ -183,23 +174,6 @@ export const getDateGroups = <R extends string | number | null>(
|
|
|
183
174
|
}));
|
|
184
175
|
};
|
|
185
176
|
|
|
186
|
-
export const convertFiltersToConditions = <R>(
|
|
187
|
-
filters: DataGridFilters<R>
|
|
188
|
-
): ConditionDTO[] => {
|
|
189
|
-
return Object.entries(filters).map(([columnKey, filter]) => {
|
|
190
|
-
const condition: ConditionDTO = {
|
|
191
|
-
field: {
|
|
192
|
-
fieldName: columnKey,
|
|
193
|
-
},
|
|
194
|
-
operator: filter.operator,
|
|
195
|
-
value: ['inArray', 'inRange'].includes(filter.operator)
|
|
196
|
-
? filter.values
|
|
197
|
-
: _.castArray(filter.values)[0],
|
|
198
|
-
};
|
|
199
|
-
return condition;
|
|
200
|
-
});
|
|
201
|
-
};
|
|
202
|
-
|
|
203
177
|
export const getCheckboxes = <R extends string | number | null>(
|
|
204
178
|
values: R[],
|
|
205
179
|
formatter: DataGridFilterFormatter,
|
|
@@ -217,3 +191,17 @@ export const getCheckboxes = <R extends string | number | null>(
|
|
|
217
191
|
level,
|
|
218
192
|
})),
|
|
219
193
|
];
|
|
194
|
+
|
|
195
|
+
export const textFilter = (key: string): DataGridFilter<'text'> => ({
|
|
196
|
+
type: 'text',
|
|
197
|
+
operator: 'contains',
|
|
198
|
+
values: [''],
|
|
199
|
+
getter: (row) => row[key] ?? '',
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
export const numberFilter = (key: string): DataGridFilter<'number'> => ({
|
|
203
|
+
type: 'number',
|
|
204
|
+
operator: 'equals',
|
|
205
|
+
values: [0],
|
|
206
|
+
getter: (row) => row[key] ?? '',
|
|
207
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DataGridColumns, DataGridContext } from '../types';
|
|
2
2
|
import { useContext, useMemo } from 'react';
|
|
3
3
|
|
|
4
|
-
import { isColumnVisible } from '../helpers';
|
|
4
|
+
import { isColumnVisible } from '../helpers/columns';
|
|
5
5
|
import { pickBy } from 'lodash';
|
|
6
6
|
|
|
7
7
|
export { useDataGridCopy } from './useDataGridCopy';
|
|
@@ -35,6 +35,8 @@ export const useDataGrid = <R,>(
|
|
|
35
35
|
loadCopyRows,
|
|
36
36
|
rowHeight = DEFAULT_ROW_HEIGHT,
|
|
37
37
|
onVisibleRowsChange,
|
|
38
|
+
onSelectionChange,
|
|
39
|
+
selectable,
|
|
38
40
|
} = props;
|
|
39
41
|
const [columns, setColumns] = useState<DataGridColumns<R>>(props.columns);
|
|
40
42
|
|
|
@@ -53,6 +55,15 @@ export const useDataGrid = <R,>(
|
|
|
53
55
|
[setSettings]
|
|
54
56
|
);
|
|
55
57
|
|
|
58
|
+
const gridTemplateColumns = useMemo(
|
|
59
|
+
() =>
|
|
60
|
+
[
|
|
61
|
+
...(selectable ? ['var(--space-8)'] : []),
|
|
62
|
+
...visibleColumns.map(([, col]) => `${col.width ?? 150}px`),
|
|
63
|
+
].join(' '),
|
|
64
|
+
[selectable, visibleColumns]
|
|
65
|
+
);
|
|
66
|
+
|
|
56
67
|
// Update columns when settings change
|
|
57
68
|
useEffect(() => {
|
|
58
69
|
setColumns((prev) => merge({}, prev, settings));
|
|
@@ -60,11 +71,27 @@ export const useDataGrid = <R,>(
|
|
|
60
71
|
|
|
61
72
|
/** ROWS SELECTION **/
|
|
62
73
|
|
|
63
|
-
const
|
|
74
|
+
const rowKeyGetter = useMemo(
|
|
75
|
+
() =>
|
|
76
|
+
typeof props.rowKey === 'function'
|
|
77
|
+
? props.rowKey
|
|
78
|
+
: (row: R) => String(row?.[props.rowKey as keyof R]),
|
|
79
|
+
[props.rowKey]
|
|
80
|
+
);
|
|
81
|
+
const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
|
|
82
|
+
|
|
83
|
+
const selectedRows = useMemo(
|
|
84
|
+
() => props.rows.filter((row) => selectedKeys.includes(rowKeyGetter(row))),
|
|
85
|
+
[props.rows, rowKeyGetter, selectedKeys]
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
onSelectionChange?.(selectedRows);
|
|
90
|
+
}, [onSelectionChange, selectedRows]);
|
|
64
91
|
|
|
65
92
|
/** ROWS FILTERING **/
|
|
66
93
|
|
|
67
|
-
const [filters, setFilters] = useState<DataGridFilters
|
|
94
|
+
const [filters, setFilters] = useState<DataGridFilters>({});
|
|
68
95
|
const [filteredRows, setFilteredRows] = useState<R[]>(rows ?? []);
|
|
69
96
|
|
|
70
97
|
useEffect(() => {
|
|
@@ -154,7 +181,8 @@ export const useDataGrid = <R,>(
|
|
|
154
181
|
visibleColumns,
|
|
155
182
|
sortedRows,
|
|
156
183
|
selectedRows,
|
|
157
|
-
|
|
184
|
+
selectedKeys,
|
|
185
|
+
setSelectedKeys,
|
|
158
186
|
sorts,
|
|
159
187
|
setSorts,
|
|
160
188
|
filters,
|
|
@@ -171,6 +199,8 @@ export const useDataGrid = <R,>(
|
|
|
171
199
|
onScroll,
|
|
172
200
|
index,
|
|
173
201
|
length,
|
|
202
|
+
rowKeyGetter,
|
|
203
|
+
gridTemplateColumns,
|
|
174
204
|
}),
|
|
175
205
|
[
|
|
176
206
|
columns,
|
|
@@ -181,7 +211,9 @@ export const useDataGrid = <R,>(
|
|
|
181
211
|
length,
|
|
182
212
|
onScroll,
|
|
183
213
|
props,
|
|
214
|
+
rowKeyGetter,
|
|
184
215
|
saveSettings,
|
|
216
|
+
selectedKeys,
|
|
185
217
|
selectedRows,
|
|
186
218
|
setColumnWidth,
|
|
187
219
|
setSettings,
|
|
@@ -190,6 +222,7 @@ export const useDataGrid = <R,>(
|
|
|
190
222
|
sorts,
|
|
191
223
|
visibleColumns,
|
|
192
224
|
visibleRows,
|
|
225
|
+
gridTemplateColumns,
|
|
193
226
|
]
|
|
194
227
|
);
|
|
195
228
|
|
|
@@ -200,9 +233,11 @@ export const useDataGrid = <R,>(
|
|
|
200
233
|
columns: {},
|
|
201
234
|
visibleColumns: [],
|
|
202
235
|
rowKey: '' as keyof R,
|
|
236
|
+
rowKeyGetter: () => '',
|
|
203
237
|
sortedRows: [],
|
|
204
238
|
selectedRows: [],
|
|
205
|
-
|
|
239
|
+
selectedKeys: [],
|
|
240
|
+
setSelectedKeys: () => {},
|
|
206
241
|
setSorts: () => {},
|
|
207
242
|
setFilters: () => {},
|
|
208
243
|
editingCell: [-1, -1],
|
|
@@ -217,6 +252,7 @@ export const useDataGrid = <R,>(
|
|
|
217
252
|
onScroll: () => {},
|
|
218
253
|
index: 0,
|
|
219
254
|
length: 0,
|
|
255
|
+
gridTemplateColumns: '',
|
|
220
256
|
}),
|
|
221
257
|
[]
|
|
222
258
|
);
|