@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.
Files changed (26) hide show
  1. package/package.json +1 -1
  2. package/src/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.ts +100 -0
  3. package/src/components/data/AdvancedRequestDataGrid/helpers/columns.tsx +263 -0
  4. package/src/components/data/AdvancedRequestDataGrid/helpers/index.ts +2 -0
  5. package/src/components/data/{DataGrid/AdvancedRequestDataGrid.tsx → AdvancedRequestDataGrid/index.tsx} +112 -61
  6. package/src/components/data/AdvancedRequestDataGrid/types.ts +47 -0
  7. package/src/components/data/DataGrid/DataGridCell.tsx +3 -6
  8. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +1 -1
  9. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +2 -2
  10. package/src/components/data/DataGrid/DataGridFooter.tsx +4 -4
  11. package/src/components/data/DataGrid/DataGridHeader.tsx +14 -15
  12. package/src/components/data/DataGrid/VirtualScroller.tsx +2 -7
  13. package/src/components/data/DataGrid/helpers/columns.tsx +33 -94
  14. package/src/components/data/DataGrid/helpers/filters.ts +16 -28
  15. package/src/components/data/DataGrid/helpers/index.ts +1 -2
  16. package/src/components/data/DataGrid/hooks/index.ts +1 -1
  17. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +40 -4
  18. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +1 -1
  19. package/src/components/data/DataGrid/index.tsx +15 -27
  20. package/src/components/data/DataGrid/styles.ts +19 -4
  21. package/src/components/data/DataGrid/types.ts +69 -68
  22. package/src/components/data/index.ts +3 -2
  23. package/src/components/forms/IconButton.tsx +0 -1
  24. package/src/components/forms/IndeterminateCheckbox.tsx +1 -1
  25. package/src/services/advancedRequests.ts +1 -0
  26. package/src/components/data/DataGrid/helpers/advancedRequests.tsx +0 -61
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@addev-be/ui",
3
- "version": "0.1.20",
3
+ "version": "0.1.25",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "watch": "tsc -b --watch",
@@ -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
+ };
@@ -0,0 +1,2 @@
1
+ export * from './advancedRequests';
2
+ export * from './columns';
@@ -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 './types';
14
- import { convertFiltersToConditions, getAdvancedRequestDto } from './helpers';
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 { DataGrid } from '.';
18
- import { debounce } from 'lodash';
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
- props: AdvancedRequestDataGridProps<R>
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((filters: DataGridFilters<R>) => {
74
- console.log('filters changed', filters);
75
- const newConditions = convertFiltersToConditions(filters);
76
- console.log('new conditions:', newConditions);
77
- setTotal(-1);
78
- setConditions(newConditions);
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: getColumnField(props.columns, columnKey),
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 = response.data.map(
124
- props.parser ?? ((row) => row as R)
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
- fieldName: columnKey,
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
- ...conditions,
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: { fieldName: columnKey },
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
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
167
- return response.data.map((row: any) => row[columnKey]);
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
- [props.columns, conditions, orderBy, start, length, total, props.conditions]
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: [...(props.conditions ?? []), ...(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.map(props.parser ?? ((row) => row as R))
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
  );