@addev-be/ui 0.1.20 → 0.1.25
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 +100 -0
- package/src/components/data/AdvancedRequestDataGrid/helpers/columns.tsx +263 -0
- package/src/components/data/AdvancedRequestDataGrid/helpers/index.ts +2 -0
- package/src/components/data/{DataGrid/AdvancedRequestDataGrid.tsx → AdvancedRequestDataGrid/index.tsx} +112 -61
- package/src/components/data/AdvancedRequestDataGrid/types.ts +47 -0
- package/src/components/data/DataGrid/DataGridCell.tsx +3 -6
- package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +1 -1
- 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 +14 -15
- 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/hooks/useDataGridCopy.ts +1 -1
- 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 +69 -68
- 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
package/package.json
CHANGED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
AdvancedRequestDTO,
|
|
5
|
+
ConditionDTO,
|
|
6
|
+
FieldDTO,
|
|
7
|
+
OrderByDTO,
|
|
8
|
+
} from '../../../../services/advancedRequests';
|
|
9
|
+
import {
|
|
10
|
+
AdvancedRequestDataGridColumns,
|
|
11
|
+
AdvancedRequestDataGridFilters,
|
|
12
|
+
} from '../types';
|
|
13
|
+
|
|
14
|
+
import _ from 'lodash';
|
|
15
|
+
|
|
16
|
+
export const getAdvancedRequestDto = <R>({
|
|
17
|
+
type,
|
|
18
|
+
columns,
|
|
19
|
+
conditions = [],
|
|
20
|
+
orderBy = [],
|
|
21
|
+
start = 0,
|
|
22
|
+
length = 100,
|
|
23
|
+
getTotal = false,
|
|
24
|
+
idField = { fieldName: 'Id' },
|
|
25
|
+
}: {
|
|
26
|
+
type: string;
|
|
27
|
+
columns: AdvancedRequestDataGridColumns<R>;
|
|
28
|
+
conditions?: ConditionDTO[];
|
|
29
|
+
orderBy?: OrderByDTO[];
|
|
30
|
+
start?: number;
|
|
31
|
+
length?: number;
|
|
32
|
+
getTotal?: boolean;
|
|
33
|
+
idField?: FieldDTO | null;
|
|
34
|
+
}): AdvancedRequestDTO => ({
|
|
35
|
+
fields: [
|
|
36
|
+
...(idField === null ? [] : [idField]),
|
|
37
|
+
...Object.keys(columns).map((key) =>
|
|
38
|
+
columns[key].field
|
|
39
|
+
? {
|
|
40
|
+
...columns[key].field,
|
|
41
|
+
fieldName: columns[key].field?.fieldName ?? key,
|
|
42
|
+
fieldAlias: key,
|
|
43
|
+
}
|
|
44
|
+
: {
|
|
45
|
+
fieldName: key,
|
|
46
|
+
fieldAlias: key,
|
|
47
|
+
}
|
|
48
|
+
),
|
|
49
|
+
],
|
|
50
|
+
conditions: [
|
|
51
|
+
...conditions,
|
|
52
|
+
{
|
|
53
|
+
field: {
|
|
54
|
+
fieldName: 'DeletedAt',
|
|
55
|
+
},
|
|
56
|
+
operator: 'isNull' as const,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
orderBy,
|
|
60
|
+
type,
|
|
61
|
+
start,
|
|
62
|
+
length,
|
|
63
|
+
getTotal,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export const convertFiltersToConditions = <R>(
|
|
67
|
+
filters: AdvancedRequestDataGridFilters,
|
|
68
|
+
columns: AdvancedRequestDataGridColumns<R>
|
|
69
|
+
): Record<string, ConditionDTO> =>
|
|
70
|
+
_.mapValues(filters, (filter, columnKey) => ({
|
|
71
|
+
field: columns[columnKey].filterField ??
|
|
72
|
+
columns[columnKey].field ?? {
|
|
73
|
+
fieldName: columnKey,
|
|
74
|
+
},
|
|
75
|
+
operator: filter.operator,
|
|
76
|
+
value: ['inArray', 'inRange'].includes(filter.operator)
|
|
77
|
+
? filter.values
|
|
78
|
+
: _.castArray<string | number | null>(filter.values)[0],
|
|
79
|
+
}));
|
|
80
|
+
|
|
81
|
+
export const parseJsonObjectFields = <R>(
|
|
82
|
+
rows: any[],
|
|
83
|
+
columns: AdvancedRequestDataGridColumns<R>,
|
|
84
|
+
parser?: (row: any) => R
|
|
85
|
+
): R[] => {
|
|
86
|
+
const jsonColumns = Object.keys(columns).filter(
|
|
87
|
+
(key) => columns[key].field?.operator === 'jsonObject'
|
|
88
|
+
);
|
|
89
|
+
const parsedRows =
|
|
90
|
+
jsonColumns.length === 0
|
|
91
|
+
? rows
|
|
92
|
+
: rows.map((row) => {
|
|
93
|
+
const parsedRow = { ...row };
|
|
94
|
+
jsonColumns.forEach((key) => {
|
|
95
|
+
parsedRow[key] = JSON.parse(parsedRow[key] ?? '{}');
|
|
96
|
+
});
|
|
97
|
+
return parsedRow;
|
|
98
|
+
});
|
|
99
|
+
return parser ? parsedRows.map(parser) : parsedRows;
|
|
100
|
+
};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
AdvancedRequestDataGridColumn,
|
|
5
|
+
AdvancedRequestDataGridColumns,
|
|
6
|
+
} from '../types';
|
|
7
|
+
import {
|
|
8
|
+
formatMoney,
|
|
9
|
+
formatNumber,
|
|
10
|
+
formatPercentage,
|
|
11
|
+
} from '../../../../helpers/numbers';
|
|
12
|
+
import { numberFilter, textFilter } from '../../DataGrid/helpers';
|
|
13
|
+
|
|
14
|
+
import { DataGridSettings } from '../../DataGrid/types';
|
|
15
|
+
import { FieldDTO } from '../../../../services/advancedRequests';
|
|
16
|
+
import _ from 'lodash';
|
|
17
|
+
import moment from 'moment';
|
|
18
|
+
|
|
19
|
+
export const isColumnVisible = <R,>(
|
|
20
|
+
obj: AdvancedRequestDataGridColumn<R> | DataGridSettings
|
|
21
|
+
): boolean => {
|
|
22
|
+
return obj?.order !== -1;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const withGroupBy = <R extends Record<string, any>>(
|
|
26
|
+
columns: AdvancedRequestDataGridColumns<R>
|
|
27
|
+
): AdvancedRequestDataGridColumns<R> =>
|
|
28
|
+
_.mapValues(columns, (column, key) => ({
|
|
29
|
+
...column,
|
|
30
|
+
field: {
|
|
31
|
+
...(column.field ?? { fieldName: key }),
|
|
32
|
+
groupBy: true,
|
|
33
|
+
},
|
|
34
|
+
}));
|
|
35
|
+
|
|
36
|
+
export const advancedTextColumn = <R extends Record<string, any>>(
|
|
37
|
+
key: string,
|
|
38
|
+
title: string,
|
|
39
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
40
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
41
|
+
[key]: {
|
|
42
|
+
name: title,
|
|
43
|
+
render: (row) => row[key] ?? '',
|
|
44
|
+
getter: (row) => row[key] ?? '',
|
|
45
|
+
sortGetter: (row) => row[key] ?? '',
|
|
46
|
+
filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
|
|
47
|
+
...options,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Creates a column with a composed value from multiple fields,
|
|
53
|
+
* and filtered by a text filter on the first field
|
|
54
|
+
*/
|
|
55
|
+
export const advancedComposedColumn = <R extends Record<string, any>>(
|
|
56
|
+
key: string,
|
|
57
|
+
title: string,
|
|
58
|
+
fields: string[],
|
|
59
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
60
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
61
|
+
[key]: {
|
|
62
|
+
field: {
|
|
63
|
+
fieldAlias: key,
|
|
64
|
+
operator: 'jsonObject',
|
|
65
|
+
operands: fields.flatMap((field) => [
|
|
66
|
+
{ constantValue: field },
|
|
67
|
+
{ fieldName: field },
|
|
68
|
+
]),
|
|
69
|
+
},
|
|
70
|
+
name: title,
|
|
71
|
+
render: (row) => row[key] ?? '',
|
|
72
|
+
getter: (row) => row[key] ?? '',
|
|
73
|
+
sortGetter: (row) => row[key] ?? '',
|
|
74
|
+
filter: {
|
|
75
|
+
...textFilter(fields[0]),
|
|
76
|
+
getter: (value) => value[fields[0]] ?? 0,
|
|
77
|
+
},
|
|
78
|
+
filterField: { fieldName: fields[0] },
|
|
79
|
+
sortField: { fieldName: fields[0] },
|
|
80
|
+
...options,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
export const advancedMailColumn = <R extends Record<string, any>>(
|
|
85
|
+
key: string,
|
|
86
|
+
title: string,
|
|
87
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
88
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
89
|
+
[key]: {
|
|
90
|
+
name: title,
|
|
91
|
+
render: (row) => <a href={`mailto:${row[key]}`}>{row[key] ?? ''}</a>,
|
|
92
|
+
getter: (row) => row[key] ?? '',
|
|
93
|
+
sortGetter: (row) => row[key] ?? '',
|
|
94
|
+
filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
|
|
95
|
+
...options,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
export const advancedPhoneColumn = <R extends Record<string, any>>(
|
|
100
|
+
key: string,
|
|
101
|
+
title: string,
|
|
102
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
103
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
104
|
+
[key]: {
|
|
105
|
+
name: title,
|
|
106
|
+
render: (row) => <a href={`tel:${row[key]}`}>{row[key] ?? ''}</a>,
|
|
107
|
+
getter: (row) => row[key] ?? '',
|
|
108
|
+
sortGetter: (row) => row[key] ?? '',
|
|
109
|
+
filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
|
|
110
|
+
...options,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
export const advancedDateColumn = <R extends Record<string, any>>(
|
|
115
|
+
key: string,
|
|
116
|
+
title: string,
|
|
117
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
118
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
119
|
+
[key]: {
|
|
120
|
+
name: title,
|
|
121
|
+
render: (row) => moment(row[key]).format('DD/MM/YYYY') ?? '',
|
|
122
|
+
getter: (row) => row[key] ?? '',
|
|
123
|
+
sortGetter: (row) => row[key] ?? '',
|
|
124
|
+
filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
|
|
125
|
+
...options,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
export const advancedMonthColumn = <R extends Record<string, any>>(
|
|
130
|
+
key: string,
|
|
131
|
+
title: string,
|
|
132
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
133
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
134
|
+
[key]: {
|
|
135
|
+
name: title,
|
|
136
|
+
render: (row) => (row[key] ? `${row[key]} mois ` : ''),
|
|
137
|
+
getter: (row) => row[key] ?? '',
|
|
138
|
+
sortGetter: (row) => row[key] ?? '',
|
|
139
|
+
filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
|
|
140
|
+
...options,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
export const advancedNumberColumn = <R extends Record<string, any>>(
|
|
145
|
+
key: string,
|
|
146
|
+
title: string,
|
|
147
|
+
decimals = 2,
|
|
148
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
149
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
150
|
+
[key]: {
|
|
151
|
+
name: title,
|
|
152
|
+
render: (row) => formatNumber(row[key], decimals) ?? '',
|
|
153
|
+
excelFormatter: () => '#',
|
|
154
|
+
getter: (row) => row[key] ?? '',
|
|
155
|
+
sortGetter: (row) => row[key] ?? '',
|
|
156
|
+
filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
|
|
157
|
+
...options,
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
export const advancedMoneyColumn = <R extends Record<string, any>>(
|
|
162
|
+
key: string,
|
|
163
|
+
title: string,
|
|
164
|
+
decimals = 2,
|
|
165
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
166
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
167
|
+
[key]: {
|
|
168
|
+
name: title,
|
|
169
|
+
render: (row) => formatMoney(row[key], decimals) ?? '',
|
|
170
|
+
excelFormatter: () => '#0.00',
|
|
171
|
+
getter: (row) => row[key] ?? '',
|
|
172
|
+
sortGetter: (row) => row[key] ?? '',
|
|
173
|
+
filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
|
|
174
|
+
...options,
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
export const advancedPercentageColumn = <R extends Record<string, any>>(
|
|
179
|
+
key: string,
|
|
180
|
+
title: string,
|
|
181
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
182
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
183
|
+
[key]: {
|
|
184
|
+
name: title,
|
|
185
|
+
render: (row) => formatPercentage(row[key]) ?? '',
|
|
186
|
+
excelFormatter: () => '#0.00',
|
|
187
|
+
getter: (row) => row[key] ?? '',
|
|
188
|
+
sortGetter: (row) => row[key] ?? '',
|
|
189
|
+
filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
|
|
190
|
+
...options,
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
export const advancedCheckboxColumn = <R extends Record<string, any>>(
|
|
195
|
+
key: string,
|
|
196
|
+
title: string,
|
|
197
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
198
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
199
|
+
[key]: {
|
|
200
|
+
name: title,
|
|
201
|
+
render: (row) => (
|
|
202
|
+
<>
|
|
203
|
+
<input type="checkbox" checked={row[key]} />
|
|
204
|
+
<span>{row[key] ? ' Oui' : ' Non'}</span>
|
|
205
|
+
</>
|
|
206
|
+
),
|
|
207
|
+
getter: (row) => row[key] ?? '',
|
|
208
|
+
sortGetter: (row) => row[key] ?? '',
|
|
209
|
+
filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
|
|
210
|
+
...options,
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
export const advancedColorColumn = <R extends Record<string, any>>(
|
|
215
|
+
key: string,
|
|
216
|
+
title: string,
|
|
217
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
218
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
219
|
+
[key]: {
|
|
220
|
+
name: title,
|
|
221
|
+
render: (row) => (
|
|
222
|
+
<div style={{ backgroundColor: row[key] }}>{row[key] ?? ''}</div>
|
|
223
|
+
),
|
|
224
|
+
getter: (row) => row[key] ?? '',
|
|
225
|
+
sortGetter: (row) => row[key] ?? '',
|
|
226
|
+
filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
|
|
227
|
+
...options,
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
export const getColumnField = <R,>(
|
|
232
|
+
columns: AdvancedRequestDataGridColumns<R>,
|
|
233
|
+
columnKey: string
|
|
234
|
+
): FieldDTO => {
|
|
235
|
+
return columns[columnKey].field
|
|
236
|
+
? {
|
|
237
|
+
fieldName: columns[columnKey].field?.fieldName ?? columnKey,
|
|
238
|
+
fieldAlias: columnKey,
|
|
239
|
+
}
|
|
240
|
+
: {
|
|
241
|
+
fieldName: columnKey,
|
|
242
|
+
fieldAlias: columnKey,
|
|
243
|
+
};
|
|
244
|
+
};
|
|
245
|
+
export const getColumnSortField = <R,>(
|
|
246
|
+
columns: AdvancedRequestDataGridColumns<R>,
|
|
247
|
+
columnKey: string
|
|
248
|
+
): FieldDTO => {
|
|
249
|
+
return columns[columnKey].sortField
|
|
250
|
+
? {
|
|
251
|
+
fieldName: columns[columnKey].sortField?.fieldName ?? columnKey,
|
|
252
|
+
fieldAlias: columnKey,
|
|
253
|
+
}
|
|
254
|
+
: {
|
|
255
|
+
fieldName: columnKey,
|
|
256
|
+
fieldAlias: columnKey,
|
|
257
|
+
};
|
|
258
|
+
};
|
|
259
|
+
export const getFirstColumnField = <R,>(
|
|
260
|
+
columns: AdvancedRequestDataGridColumns<R>
|
|
261
|
+
): FieldDTO => {
|
|
262
|
+
return getColumnField(columns, Object.keys(columns)[0]);
|
|
263
|
+
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
AdvancedRequestRow,
|
|
3
2
|
ConditionDTO,
|
|
4
3
|
FieldDTO,
|
|
5
4
|
OrderByDTO,
|
|
@@ -8,52 +7,37 @@ import {
|
|
|
8
7
|
import {
|
|
9
8
|
DataGridColumns,
|
|
10
9
|
DataGridFilters,
|
|
11
|
-
DataGridProps,
|
|
12
10
|
DataGridSort,
|
|
13
|
-
} from '
|
|
14
|
-
import {
|
|
11
|
+
} from '../DataGrid/types';
|
|
12
|
+
import _, { debounce } from 'lodash';
|
|
13
|
+
import {
|
|
14
|
+
convertFiltersToConditions,
|
|
15
|
+
getAdvancedRequestDto,
|
|
16
|
+
getColumnSortField,
|
|
17
|
+
getFirstColumnField,
|
|
18
|
+
parseJsonObjectFields,
|
|
19
|
+
} from './helpers';
|
|
15
20
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
16
21
|
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
|
|
20
|
-
export type AdvancedRequestDataGridProps<R> = Omit<DataGridProps<R>, 'rows'> & {
|
|
21
|
-
type: string;
|
|
22
|
-
orderBy?: OrderByDTO[];
|
|
23
|
-
conditions?: ConditionDTO[];
|
|
24
|
-
addIdColumn?: boolean;
|
|
25
|
-
parser?: (row: AdvancedRequestRow<R>) => R;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const getColumnField = <R,>(
|
|
29
|
-
columns: DataGridColumns<R>,
|
|
30
|
-
columnKey: string
|
|
31
|
-
): FieldDTO => {
|
|
32
|
-
return columns[columnKey].field
|
|
33
|
-
? {
|
|
34
|
-
fieldName: columns[columnKey].field?.fieldName ?? columnKey,
|
|
35
|
-
fieldAlias: columnKey,
|
|
36
|
-
}
|
|
37
|
-
: {
|
|
38
|
-
fieldName: columnKey,
|
|
39
|
-
fieldAlias: columnKey,
|
|
40
|
-
};
|
|
41
|
-
};
|
|
42
|
-
const getFirstColumnField = <R,>(columns: DataGridColumns<R>): FieldDTO => {
|
|
43
|
-
return getColumnField(columns, Object.keys(columns)[0]);
|
|
44
|
-
};
|
|
22
|
+
import { AdvancedRequestDataGridProps } from './types';
|
|
23
|
+
import { DataGrid } from '../DataGrid';
|
|
45
24
|
|
|
46
|
-
export const AdvancedRequestDataGrid = <R,>(
|
|
47
|
-
|
|
48
|
-
|
|
25
|
+
export const AdvancedRequestDataGrid = <R,>({
|
|
26
|
+
onSelectionChange: onSelectionChangeFromProps,
|
|
27
|
+
idField,
|
|
28
|
+
...props
|
|
29
|
+
}: AdvancedRequestDataGridProps<R>) => {
|
|
49
30
|
const currentRows = useRef<R[]>([]);
|
|
50
31
|
const [rows, setRows] = useState<R[]>([]);
|
|
51
32
|
const [start, setStart] = useState(0);
|
|
52
33
|
const [length, setLength] = useState(50);
|
|
53
34
|
const [total, setTotal] = useState(-1);
|
|
54
35
|
const advancedRequest = useAdvancedRequestHandler<R>();
|
|
36
|
+
const idAdvancedRequest = useAdvancedRequestHandler<{ Id: string }>();
|
|
55
37
|
|
|
56
|
-
const [conditions, setConditions] = useState<ConditionDTO
|
|
38
|
+
const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
|
|
39
|
+
{}
|
|
40
|
+
);
|
|
57
41
|
const [orderBy, setOrderBy] = useState<OrderByDTO[]>(
|
|
58
42
|
props.orderBy ?? [
|
|
59
43
|
{
|
|
@@ -70,23 +54,23 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
70
54
|
setTotal(-1);
|
|
71
55
|
}, []);
|
|
72
56
|
|
|
73
|
-
const onFiltersChanged = useCallback(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
57
|
+
const onFiltersChanged = useCallback(
|
|
58
|
+
(filters: DataGridFilters) => {
|
|
59
|
+
const newConditions = convertFiltersToConditions(filters, props.columns);
|
|
60
|
+
setTotal(-1);
|
|
61
|
+
setConditions(newConditions);
|
|
62
|
+
},
|
|
63
|
+
[props.columns]
|
|
64
|
+
);
|
|
80
65
|
|
|
81
66
|
const onSortsChanged = useCallback(
|
|
82
67
|
(sorts: Record<string, DataGridSort>) => {
|
|
83
|
-
console.log('sorts changed', sorts);
|
|
84
68
|
refresh();
|
|
85
69
|
setOrderBy(
|
|
86
70
|
Object.entries(sorts).map(
|
|
87
71
|
([columnKey, direction]) =>
|
|
88
72
|
({
|
|
89
|
-
field:
|
|
73
|
+
field: getColumnSortField(props.columns, columnKey),
|
|
90
74
|
direction: direction.toUpperCase(),
|
|
91
75
|
} as OrderByDTO)
|
|
92
76
|
)
|
|
@@ -103,6 +87,7 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
103
87
|
orderBy: OrderByDTO[],
|
|
104
88
|
start: number,
|
|
105
89
|
length: number,
|
|
90
|
+
idField: FieldDTO | null | undefined,
|
|
106
91
|
getTotal = false
|
|
107
92
|
) => {
|
|
108
93
|
advancedRequest(
|
|
@@ -114,14 +99,17 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
114
99
|
start,
|
|
115
100
|
length,
|
|
116
101
|
getTotal,
|
|
102
|
+
idField,
|
|
117
103
|
})
|
|
118
104
|
).then((response) => {
|
|
119
105
|
if (getTotal) {
|
|
120
106
|
currentRows.current = Array(response.total).fill(null);
|
|
121
107
|
if (getTotal) setTotal(response.total ?? 0);
|
|
122
108
|
}
|
|
123
|
-
const parsedRows =
|
|
124
|
-
|
|
109
|
+
const parsedRows = parseJsonObjectFields(
|
|
110
|
+
response.data,
|
|
111
|
+
columns,
|
|
112
|
+
props.parser
|
|
125
113
|
);
|
|
126
114
|
currentRows.current.splice(start, length, ...parsedRows);
|
|
127
115
|
setRows([...currentRows.current]);
|
|
@@ -135,13 +123,16 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
135
123
|
(columnKey: string) => {
|
|
136
124
|
return advancedRequest({
|
|
137
125
|
fields: [
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
126
|
+
props.columns[columnKey].filterField ??
|
|
127
|
+
props.columns[columnKey].field ?? {
|
|
128
|
+
fieldName: columnKey,
|
|
129
|
+
},
|
|
141
130
|
],
|
|
142
131
|
conditions: [
|
|
143
132
|
...(props.conditions ?? []),
|
|
144
|
-
...
|
|
133
|
+
...Object.values(
|
|
134
|
+
_.pickBy(conditions, (condition, key) => key !== columnKey)
|
|
135
|
+
),
|
|
145
136
|
{
|
|
146
137
|
field: {
|
|
147
138
|
fieldName: 'DeletedAt',
|
|
@@ -155,32 +146,46 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
155
146
|
),
|
|
156
147
|
orderBy: [
|
|
157
148
|
{
|
|
158
|
-
field:
|
|
149
|
+
field: props.columns[columnKey].filterField ??
|
|
150
|
+
props.columns[columnKey].field ?? {
|
|
151
|
+
fieldName: columnKey,
|
|
152
|
+
},
|
|
159
153
|
direction: 'ASC',
|
|
160
154
|
},
|
|
161
155
|
],
|
|
162
156
|
type: props.type,
|
|
163
157
|
getTotal: false,
|
|
164
158
|
unique: true,
|
|
165
|
-
}).then((response) =>
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
159
|
+
}).then((response) =>
|
|
160
|
+
response.data.map(
|
|
161
|
+
(row) => props.columns[columnKey].filter?.getter?.(row) ?? null
|
|
162
|
+
)
|
|
163
|
+
);
|
|
169
164
|
},
|
|
170
|
-
[advancedRequest, conditions, props.conditions, props.type]
|
|
165
|
+
[advancedRequest, conditions, props.columns, props.conditions, props.type]
|
|
171
166
|
);
|
|
172
167
|
|
|
173
168
|
useEffect(
|
|
174
169
|
() =>
|
|
175
170
|
loadRows.current(
|
|
176
171
|
props.columns,
|
|
177
|
-
[...(props.conditions ?? []), ...(conditions ?? [])],
|
|
172
|
+
[...(props.conditions ?? []), ...(Object.values(conditions) ?? [])],
|
|
178
173
|
orderBy,
|
|
179
174
|
start,
|
|
180
175
|
length,
|
|
176
|
+
idField,
|
|
181
177
|
total < 0
|
|
182
178
|
),
|
|
183
|
-
[
|
|
179
|
+
[
|
|
180
|
+
props.columns,
|
|
181
|
+
conditions,
|
|
182
|
+
orderBy,
|
|
183
|
+
start,
|
|
184
|
+
length,
|
|
185
|
+
total,
|
|
186
|
+
props.conditions,
|
|
187
|
+
idField,
|
|
188
|
+
]
|
|
184
189
|
);
|
|
185
190
|
|
|
186
191
|
const loadCopyRows = useCallback(
|
|
@@ -189,17 +194,22 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
189
194
|
getAdvancedRequestDto({
|
|
190
195
|
type: props.type,
|
|
191
196
|
columns: props.columns,
|
|
192
|
-
conditions: [
|
|
197
|
+
conditions: [
|
|
198
|
+
...(props.conditions ?? []),
|
|
199
|
+
...(Object.values(conditions) ?? []),
|
|
200
|
+
],
|
|
193
201
|
orderBy,
|
|
194
202
|
start: 0,
|
|
195
203
|
length: total,
|
|
204
|
+
idField,
|
|
196
205
|
})
|
|
197
206
|
).then((response) =>
|
|
198
|
-
response.data.
|
|
207
|
+
parseJsonObjectFields(response.data, props.columns, props.parser)
|
|
199
208
|
),
|
|
200
209
|
[
|
|
201
210
|
advancedRequest,
|
|
202
211
|
conditions,
|
|
212
|
+
idField,
|
|
203
213
|
orderBy,
|
|
204
214
|
props.columns,
|
|
205
215
|
props.conditions,
|
|
@@ -209,6 +219,38 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
209
219
|
]
|
|
210
220
|
);
|
|
211
221
|
|
|
222
|
+
const loadAllIds = useCallback(
|
|
223
|
+
() =>
|
|
224
|
+
idAdvancedRequest(
|
|
225
|
+
getAdvancedRequestDto({
|
|
226
|
+
type: props.type,
|
|
227
|
+
columns: {
|
|
228
|
+
Id: {
|
|
229
|
+
name: 'Id',
|
|
230
|
+
field: idField ?? { fieldName: 'Id' },
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
conditions: [
|
|
234
|
+
...(props.conditions ?? []),
|
|
235
|
+
...(Object.values(conditions) ?? []),
|
|
236
|
+
],
|
|
237
|
+
orderBy,
|
|
238
|
+
start: 0,
|
|
239
|
+
length: total,
|
|
240
|
+
idField: null,
|
|
241
|
+
})
|
|
242
|
+
).then((response) => response.data.map((row) => row['Id'])),
|
|
243
|
+
[
|
|
244
|
+
conditions,
|
|
245
|
+
idAdvancedRequest,
|
|
246
|
+
idField,
|
|
247
|
+
orderBy,
|
|
248
|
+
props.conditions,
|
|
249
|
+
props.type,
|
|
250
|
+
total,
|
|
251
|
+
]
|
|
252
|
+
);
|
|
253
|
+
|
|
212
254
|
const onVisibleRowsChanged = useCallback(
|
|
213
255
|
(newStart: number, newLength: number) => {
|
|
214
256
|
if (newStart !== start || newLength !== length) {
|
|
@@ -219,6 +261,13 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
219
261
|
[length, start]
|
|
220
262
|
);
|
|
221
263
|
|
|
264
|
+
const onSelectionChange = useCallback(
|
|
265
|
+
(selectedKeys: string[]) => {
|
|
266
|
+
onSelectionChangeFromProps?.(selectedKeys);
|
|
267
|
+
},
|
|
268
|
+
[onSelectionChangeFromProps]
|
|
269
|
+
);
|
|
270
|
+
|
|
222
271
|
return (
|
|
223
272
|
<DataGrid
|
|
224
273
|
onVisibleRowsChange={onVisibleRowsChanged}
|
|
@@ -230,6 +279,8 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
230
279
|
rows={rows}
|
|
231
280
|
loadCopyRows={loadCopyRows}
|
|
232
281
|
refresh={refresh}
|
|
282
|
+
onSelectionChange={onSelectionChange}
|
|
283
|
+
getAllIds={loadAllIds}
|
|
233
284
|
{...props}
|
|
234
285
|
/>
|
|
235
286
|
);
|