@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
package/package.json
CHANGED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
AdvancedRequestDTO,
|
|
5
|
+
ConditionDTO,
|
|
6
|
+
OrderByDTO,
|
|
7
|
+
} from '../../../../services/advancedRequests';
|
|
8
|
+
import {
|
|
9
|
+
AdvancedRequestDataGridColumns,
|
|
10
|
+
AdvancedRequestDataGridFilters,
|
|
11
|
+
} from '../types';
|
|
12
|
+
|
|
13
|
+
import { DataGridColumns } from '../../DataGrid/types';
|
|
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
|
+
addIdColumn = true,
|
|
25
|
+
}: {
|
|
26
|
+
type: string;
|
|
27
|
+
columns: DataGridColumns<R>;
|
|
28
|
+
conditions?: ConditionDTO[];
|
|
29
|
+
orderBy?: OrderByDTO[];
|
|
30
|
+
start?: number;
|
|
31
|
+
length?: number;
|
|
32
|
+
getTotal?: boolean;
|
|
33
|
+
addIdColumn?: boolean;
|
|
34
|
+
}): AdvancedRequestDTO => ({
|
|
35
|
+
fields: [
|
|
36
|
+
...(Object.keys(columns).includes('Id') || addIdColumn === false
|
|
37
|
+
? []
|
|
38
|
+
: [{ fieldName: 'Id' }]),
|
|
39
|
+
...Object.keys(columns).map((key) =>
|
|
40
|
+
columns[key].field
|
|
41
|
+
? {
|
|
42
|
+
...columns[key].field,
|
|
43
|
+
fieldName: columns[key].field?.fieldName ?? key,
|
|
44
|
+
fieldAlias: key,
|
|
45
|
+
}
|
|
46
|
+
: {
|
|
47
|
+
fieldName: key,
|
|
48
|
+
fieldAlias: key,
|
|
49
|
+
}
|
|
50
|
+
),
|
|
51
|
+
],
|
|
52
|
+
conditions: [
|
|
53
|
+
...conditions,
|
|
54
|
+
{
|
|
55
|
+
field: {
|
|
56
|
+
fieldName: 'DeletedAt',
|
|
57
|
+
},
|
|
58
|
+
operator: 'isNull' as const,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
orderBy,
|
|
62
|
+
type,
|
|
63
|
+
start,
|
|
64
|
+
length,
|
|
65
|
+
getTotal,
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
export const convertFiltersToConditions = <R>(
|
|
69
|
+
filters: AdvancedRequestDataGridFilters,
|
|
70
|
+
columns: DataGridColumns<R>
|
|
71
|
+
): Record<string, ConditionDTO> =>
|
|
72
|
+
_.mapValues(filters, (filter, columnKey) => ({
|
|
73
|
+
field: filter.field ??
|
|
74
|
+
columns[columnKey].field ?? {
|
|
75
|
+
fieldName: columnKey,
|
|
76
|
+
},
|
|
77
|
+
operator: filter.operator,
|
|
78
|
+
value: ['inArray', 'inRange'].includes(filter.operator)
|
|
79
|
+
? filter.values
|
|
80
|
+
: _.castArray<string | number | null>(filter.values)[0],
|
|
81
|
+
}));
|
|
82
|
+
|
|
83
|
+
export const parseJsonObjectFields = <R>(
|
|
84
|
+
rows: any[],
|
|
85
|
+
columns: AdvancedRequestDataGridColumns<R>,
|
|
86
|
+
parser?: (row: any) => R
|
|
87
|
+
): R[] => {
|
|
88
|
+
const jsonColumns = Object.keys(columns).filter(
|
|
89
|
+
(key) => columns[key].field?.operator === 'jsonObject'
|
|
90
|
+
);
|
|
91
|
+
const parsedRows =
|
|
92
|
+
jsonColumns.length === 0
|
|
93
|
+
? rows
|
|
94
|
+
: rows.map((row) => {
|
|
95
|
+
const parsedRow = { ...row };
|
|
96
|
+
jsonColumns.forEach((key) => {
|
|
97
|
+
parsedRow[key] = JSON.parse(parsedRow[key] ?? '{}');
|
|
98
|
+
});
|
|
99
|
+
return parsedRow;
|
|
100
|
+
});
|
|
101
|
+
return parser ? parsedRows.map(parser) : parsedRows;
|
|
102
|
+
};
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
AdvancedRequestDataGridColumn,
|
|
5
|
+
AdvancedRequestDataGridColumns,
|
|
6
|
+
} from '../types';
|
|
7
|
+
import { advancedNumberFilter, advancedTextFilter } from './filters';
|
|
8
|
+
import {
|
|
9
|
+
formatMoney,
|
|
10
|
+
formatNumber,
|
|
11
|
+
formatPercentage,
|
|
12
|
+
} from '../../../../helpers/numbers';
|
|
13
|
+
|
|
14
|
+
import { DataGridSettings } from '../../DataGrid/types';
|
|
15
|
+
import _ from 'lodash';
|
|
16
|
+
import moment from 'moment';
|
|
17
|
+
|
|
18
|
+
export const isColumnVisible = <R,>(
|
|
19
|
+
obj: AdvancedRequestDataGridColumn<R> | DataGridSettings
|
|
20
|
+
): boolean => {
|
|
21
|
+
return obj?.order !== -1;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const withGroupBy = <R extends Record<string, any>>(
|
|
25
|
+
columns: AdvancedRequestDataGridColumns<R>
|
|
26
|
+
): AdvancedRequestDataGridColumns<R> =>
|
|
27
|
+
_.mapValues(columns, (column, key) => ({
|
|
28
|
+
...column,
|
|
29
|
+
field: {
|
|
30
|
+
...(column.field ?? { fieldName: key }),
|
|
31
|
+
groupBy: true,
|
|
32
|
+
},
|
|
33
|
+
}));
|
|
34
|
+
|
|
35
|
+
export const advancedTextColumn = <R extends Record<string, any>>(
|
|
36
|
+
key: string,
|
|
37
|
+
title: string,
|
|
38
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
39
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
40
|
+
[key]: {
|
|
41
|
+
name: title,
|
|
42
|
+
render: (row) => row[key] ?? '',
|
|
43
|
+
getter: (row) => row[key] ?? '',
|
|
44
|
+
sortGetter: (row) => row[key] ?? '',
|
|
45
|
+
filter: advancedTextFilter(key),
|
|
46
|
+
...options,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Creates a column with a composed value from multiple fields,
|
|
52
|
+
* and filtered by a text filter on the first field
|
|
53
|
+
*/
|
|
54
|
+
export const advancedComposedColumn = <R extends Record<string, any>>(
|
|
55
|
+
key: string,
|
|
56
|
+
title: string,
|
|
57
|
+
fields: string[],
|
|
58
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
59
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
60
|
+
[key]: {
|
|
61
|
+
field: {
|
|
62
|
+
fieldAlias: key,
|
|
63
|
+
operator: 'jsonObject',
|
|
64
|
+
operands: fields.flatMap((field) => [
|
|
65
|
+
{ constantValue: field },
|
|
66
|
+
{ fieldName: field },
|
|
67
|
+
]),
|
|
68
|
+
},
|
|
69
|
+
name: title,
|
|
70
|
+
render: (row) => row[key] ?? '',
|
|
71
|
+
getter: (row) => row[key] ?? '',
|
|
72
|
+
sortGetter: (row) => row[key] ?? '',
|
|
73
|
+
filter: advancedTextFilter(fields[0]),
|
|
74
|
+
...options,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
export const advancedMailColumn = <R extends Record<string, any>>(
|
|
79
|
+
key: string,
|
|
80
|
+
title: string,
|
|
81
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
82
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
83
|
+
[key]: {
|
|
84
|
+
name: title,
|
|
85
|
+
render: (row) => <a href={`mailto:${row[key]}`}>{row[key] ?? ''}</a>,
|
|
86
|
+
getter: (row) => row[key] ?? '',
|
|
87
|
+
sortGetter: (row) => row[key] ?? '',
|
|
88
|
+
filter: advancedTextFilter(key),
|
|
89
|
+
...options,
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
export const advancedPhoneColumn = <R extends Record<string, any>>(
|
|
94
|
+
key: string,
|
|
95
|
+
title: string,
|
|
96
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
97
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
98
|
+
[key]: {
|
|
99
|
+
name: title,
|
|
100
|
+
render: (row) => <a href={`tel:${row[key]}`}>{row[key] ?? ''}</a>,
|
|
101
|
+
getter: (row) => row[key] ?? '',
|
|
102
|
+
sortGetter: (row) => row[key] ?? '',
|
|
103
|
+
filter: advancedTextFilter(key),
|
|
104
|
+
...options,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
export const advancedDateColumn = <R extends Record<string, any>>(
|
|
109
|
+
key: string,
|
|
110
|
+
title: string,
|
|
111
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
112
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
113
|
+
[key]: {
|
|
114
|
+
name: title,
|
|
115
|
+
render: (row) => moment(row[key]).format('DD/MM/YYYY') ?? '',
|
|
116
|
+
getter: (row) => row[key] ?? '',
|
|
117
|
+
sortGetter: (row) => row[key] ?? '',
|
|
118
|
+
filter: advancedTextFilter(key),
|
|
119
|
+
...options,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
export const advancedMonthColumn = <R extends Record<string, any>>(
|
|
124
|
+
key: string,
|
|
125
|
+
title: string,
|
|
126
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
127
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
128
|
+
[key]: {
|
|
129
|
+
name: title,
|
|
130
|
+
render: (row) => (row[key] ? `${row[key]} mois ` : ''),
|
|
131
|
+
getter: (row) => row[key] ?? '',
|
|
132
|
+
sortGetter: (row) => row[key] ?? '',
|
|
133
|
+
filter: advancedTextFilter(key),
|
|
134
|
+
...options,
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
export const advancedNumberColumn = <R extends Record<string, any>>(
|
|
139
|
+
key: string,
|
|
140
|
+
title: string,
|
|
141
|
+
decimals = 2,
|
|
142
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
143
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
144
|
+
[key]: {
|
|
145
|
+
name: title,
|
|
146
|
+
render: (row) => formatNumber(row[key], decimals) ?? '',
|
|
147
|
+
excelFormatter: () => '#',
|
|
148
|
+
getter: (row) => row[key] ?? '',
|
|
149
|
+
sortGetter: (row) => row[key] ?? '',
|
|
150
|
+
filter: advancedNumberFilter(key),
|
|
151
|
+
...options,
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
export const advancedMoneyColumn = <R extends Record<string, any>>(
|
|
156
|
+
key: string,
|
|
157
|
+
title: string,
|
|
158
|
+
decimals = 2,
|
|
159
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
160
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
161
|
+
[key]: {
|
|
162
|
+
name: title,
|
|
163
|
+
render: (row) => formatMoney(row[key], decimals) ?? '',
|
|
164
|
+
excelFormatter: () => '#0.00',
|
|
165
|
+
getter: (row) => row[key] ?? '',
|
|
166
|
+
sortGetter: (row) => row[key] ?? '',
|
|
167
|
+
filter: advancedNumberFilter(key),
|
|
168
|
+
...options,
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
export const advancedPercentageColumn = <R extends Record<string, any>>(
|
|
173
|
+
key: string,
|
|
174
|
+
title: string,
|
|
175
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
176
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
177
|
+
[key]: {
|
|
178
|
+
name: title,
|
|
179
|
+
render: (row) => formatPercentage(row[key]) ?? '',
|
|
180
|
+
excelFormatter: () => '#0.00',
|
|
181
|
+
getter: (row) => row[key] ?? '',
|
|
182
|
+
sortGetter: (row) => row[key] ?? '',
|
|
183
|
+
filter: advancedNumberFilter(key),
|
|
184
|
+
...options,
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
export const advancedCheckboxColumn = <R extends Record<string, any>>(
|
|
189
|
+
key: string,
|
|
190
|
+
title: string,
|
|
191
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
192
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
193
|
+
[key]: {
|
|
194
|
+
name: title,
|
|
195
|
+
render: (row) => (
|
|
196
|
+
<>
|
|
197
|
+
<input type="checkbox" checked={row[key]} />
|
|
198
|
+
<span>{row[key] ? ' Oui' : ' Non'}</span>
|
|
199
|
+
</>
|
|
200
|
+
),
|
|
201
|
+
getter: (row) => row[key] ?? '',
|
|
202
|
+
sortGetter: (row) => row[key] ?? '',
|
|
203
|
+
filter: advancedNumberFilter(key),
|
|
204
|
+
...options,
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
export const advancedColorColumn = <R extends Record<string, any>>(
|
|
209
|
+
key: string,
|
|
210
|
+
title: string,
|
|
211
|
+
options?: Partial<AdvancedRequestDataGridColumn<R>>
|
|
212
|
+
): AdvancedRequestDataGridColumns<R> => ({
|
|
213
|
+
[key]: {
|
|
214
|
+
name: title,
|
|
215
|
+
render: (row) => (
|
|
216
|
+
<div style={{ backgroundColor: row[key] }}>{row[key] ?? ''}</div>
|
|
217
|
+
),
|
|
218
|
+
getter: (row) => row[key] ?? '',
|
|
219
|
+
sortGetter: (row) => row[key] ?? '',
|
|
220
|
+
filter: advancedTextFilter(key),
|
|
221
|
+
...options,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { numberFilter, textFilter } from '../../DataGrid/helpers';
|
|
2
|
+
|
|
3
|
+
import { AdvancedRequestDataGridFilter } from '../types';
|
|
4
|
+
|
|
5
|
+
export const advancedTextFilter = (
|
|
6
|
+
key: string
|
|
7
|
+
): AdvancedRequestDataGridFilter<'text'> => ({
|
|
8
|
+
...textFilter(key),
|
|
9
|
+
field: { fieldName: key },
|
|
10
|
+
getter: (value) => value[key] ?? '',
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export const advancedNumberFilter = (
|
|
14
|
+
key: string
|
|
15
|
+
): AdvancedRequestDataGridFilter<'number'> => ({
|
|
16
|
+
...numberFilter(key),
|
|
17
|
+
field: { fieldName: key },
|
|
18
|
+
getter: (value) => value[key] ?? 0,
|
|
19
|
+
});
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
AdvancedRequestRow,
|
|
3
2
|
ConditionDTO,
|
|
4
3
|
FieldDTO,
|
|
5
4
|
OrderByDTO,
|
|
@@ -8,22 +7,18 @@ 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
|
+
parseJsonObjectFields,
|
|
17
|
+
} from './helpers';
|
|
15
18
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
16
19
|
|
|
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
|
-
};
|
|
20
|
+
import { AdvancedRequestDataGridProps } from './types';
|
|
21
|
+
import { DataGrid } from '../DataGrid';
|
|
27
22
|
|
|
28
23
|
const getColumnField = <R,>(
|
|
29
24
|
columns: DataGridColumns<R>,
|
|
@@ -53,7 +48,9 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
53
48
|
const [total, setTotal] = useState(-1);
|
|
54
49
|
const advancedRequest = useAdvancedRequestHandler<R>();
|
|
55
50
|
|
|
56
|
-
const [conditions, setConditions] = useState<ConditionDTO
|
|
51
|
+
const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
|
|
52
|
+
{}
|
|
53
|
+
);
|
|
57
54
|
const [orderBy, setOrderBy] = useState<OrderByDTO[]>(
|
|
58
55
|
props.orderBy ?? [
|
|
59
56
|
{
|
|
@@ -70,17 +67,17 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
70
67
|
setTotal(-1);
|
|
71
68
|
}, []);
|
|
72
69
|
|
|
73
|
-
const onFiltersChanged = useCallback(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
70
|
+
const onFiltersChanged = useCallback(
|
|
71
|
+
(filters: DataGridFilters) => {
|
|
72
|
+
const newConditions = convertFiltersToConditions(filters, props.columns);
|
|
73
|
+
setTotal(-1);
|
|
74
|
+
setConditions(newConditions);
|
|
75
|
+
},
|
|
76
|
+
[props.columns]
|
|
77
|
+
);
|
|
80
78
|
|
|
81
79
|
const onSortsChanged = useCallback(
|
|
82
80
|
(sorts: Record<string, DataGridSort>) => {
|
|
83
|
-
console.log('sorts changed', sorts);
|
|
84
81
|
refresh();
|
|
85
82
|
setOrderBy(
|
|
86
83
|
Object.entries(sorts).map(
|
|
@@ -120,8 +117,10 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
120
117
|
currentRows.current = Array(response.total).fill(null);
|
|
121
118
|
if (getTotal) setTotal(response.total ?? 0);
|
|
122
119
|
}
|
|
123
|
-
const parsedRows =
|
|
124
|
-
|
|
120
|
+
const parsedRows = parseJsonObjectFields(
|
|
121
|
+
response.data,
|
|
122
|
+
columns,
|
|
123
|
+
props.parser
|
|
125
124
|
);
|
|
126
125
|
currentRows.current.splice(start, length, ...parsedRows);
|
|
127
126
|
setRows([...currentRows.current]);
|
|
@@ -135,13 +134,16 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
135
134
|
(columnKey: string) => {
|
|
136
135
|
return advancedRequest({
|
|
137
136
|
fields: [
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
137
|
+
props.columns[columnKey].filter?.field ??
|
|
138
|
+
props.columns[columnKey].field ?? {
|
|
139
|
+
fieldName: columnKey,
|
|
140
|
+
},
|
|
141
141
|
],
|
|
142
142
|
conditions: [
|
|
143
143
|
...(props.conditions ?? []),
|
|
144
|
-
...
|
|
144
|
+
...Object.values(
|
|
145
|
+
_.pickBy(conditions, (condition, key) => key !== columnKey)
|
|
146
|
+
),
|
|
145
147
|
{
|
|
146
148
|
field: {
|
|
147
149
|
fieldName: 'DeletedAt',
|
|
@@ -155,26 +157,30 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
155
157
|
),
|
|
156
158
|
orderBy: [
|
|
157
159
|
{
|
|
158
|
-
field:
|
|
160
|
+
field: props.columns[columnKey].filter?.field ??
|
|
161
|
+
props.columns[columnKey].field ?? {
|
|
162
|
+
fieldName: columnKey,
|
|
163
|
+
},
|
|
159
164
|
direction: 'ASC',
|
|
160
165
|
},
|
|
161
166
|
],
|
|
162
167
|
type: props.type,
|
|
163
168
|
getTotal: false,
|
|
164
169
|
unique: true,
|
|
165
|
-
}).then((response) =>
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
170
|
+
}).then((response) =>
|
|
171
|
+
response.data.map(
|
|
172
|
+
(row) => props.columns[columnKey].filter?.getter?.(row) ?? null
|
|
173
|
+
)
|
|
174
|
+
);
|
|
169
175
|
},
|
|
170
|
-
[advancedRequest, conditions, props.conditions, props.type]
|
|
176
|
+
[advancedRequest, conditions, props.columns, props.conditions, props.type]
|
|
171
177
|
);
|
|
172
178
|
|
|
173
179
|
useEffect(
|
|
174
180
|
() =>
|
|
175
181
|
loadRows.current(
|
|
176
182
|
props.columns,
|
|
177
|
-
[...(props.conditions ?? []), ...(conditions ?? [])],
|
|
183
|
+
[...(props.conditions ?? []), ...(Object.values(conditions) ?? [])],
|
|
178
184
|
orderBy,
|
|
179
185
|
start,
|
|
180
186
|
length,
|
|
@@ -189,13 +195,16 @@ export const AdvancedRequestDataGrid = <R,>(
|
|
|
189
195
|
getAdvancedRequestDto({
|
|
190
196
|
type: props.type,
|
|
191
197
|
columns: props.columns,
|
|
192
|
-
conditions: [
|
|
198
|
+
conditions: [
|
|
199
|
+
...(props.conditions ?? []),
|
|
200
|
+
...(Object.values(conditions) ?? []),
|
|
201
|
+
],
|
|
193
202
|
orderBy,
|
|
194
203
|
start: 0,
|
|
195
204
|
length: total,
|
|
196
205
|
})
|
|
197
206
|
).then((response) =>
|
|
198
|
-
response.data.
|
|
207
|
+
parseJsonObjectFields(response.data, props.columns, props.parser)
|
|
199
208
|
),
|
|
200
209
|
[
|
|
201
210
|
advancedRequest,
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AdvancedRequestRow,
|
|
3
|
+
ConditionDTO,
|
|
4
|
+
FieldDTO,
|
|
5
|
+
OrderByDTO,
|
|
6
|
+
} from '../../../services/advancedRequests';
|
|
7
|
+
import {
|
|
8
|
+
DataGridColumn,
|
|
9
|
+
DataGridFilter,
|
|
10
|
+
DataGridFilterType,
|
|
11
|
+
DataGridProps,
|
|
12
|
+
} from '../DataGrid/types';
|
|
13
|
+
|
|
14
|
+
export type AdvancedRequestDataGridFilter<
|
|
15
|
+
T extends DataGridFilterType = DataGridFilterType
|
|
16
|
+
> = DataGridFilter<T> & {
|
|
17
|
+
field?: FieldDTO;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type AdvancedRequestDataGridFilters = Record<
|
|
21
|
+
string,
|
|
22
|
+
AdvancedRequestDataGridFilter
|
|
23
|
+
>;
|
|
24
|
+
|
|
25
|
+
export type AdvancedRequestDataGridColumn<R> = DataGridColumn<R> & {
|
|
26
|
+
filter?: AdvancedRequestDataGridFilter;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type AdvancedRequestDataGridColumns<R> = Record<
|
|
30
|
+
string,
|
|
31
|
+
AdvancedRequestDataGridColumn<R>
|
|
32
|
+
>;
|
|
33
|
+
|
|
34
|
+
export type AdvancedRequestDataGridProps<R> = Omit<
|
|
35
|
+
DataGridProps<R>,
|
|
36
|
+
'rows' | 'columns'
|
|
37
|
+
> & {
|
|
38
|
+
columns: AdvancedRequestDataGridColumns<R>;
|
|
39
|
+
type: string;
|
|
40
|
+
orderBy?: OrderByDTO[];
|
|
41
|
+
conditions?: ConditionDTO[];
|
|
42
|
+
addIdColumn?: boolean;
|
|
43
|
+
parser?: (row: AdvancedRequestRow<R>) => R;
|
|
44
|
+
};
|
|
@@ -3,17 +3,14 @@
|
|
|
3
3
|
|
|
4
4
|
import * as styles from './styles';
|
|
5
5
|
|
|
6
|
-
import { DataGridCellProps, DataGridColumn
|
|
6
|
+
import { DataGridCellProps, DataGridColumn } from './types';
|
|
7
7
|
import { MouseEvent, useCallback } from 'react';
|
|
8
8
|
|
|
9
9
|
import { DataGridEditableCell } from './DataGridEditableCell';
|
|
10
10
|
import { join } from 'lodash';
|
|
11
11
|
import { useDataGridContext } from './hooks';
|
|
12
12
|
|
|
13
|
-
const defaultRender = <R,>(
|
|
14
|
-
col: DataGridColumn<R, DataGridFilterType | undefined>,
|
|
15
|
-
row: R
|
|
16
|
-
) => {
|
|
13
|
+
const defaultRender = <R,>(row: R, col: DataGridColumn<R>) => {
|
|
17
14
|
const value = col.propertyName ? row[col.propertyName] : '';
|
|
18
15
|
return !value ? '' : String(value);
|
|
19
16
|
};
|
|
@@ -72,7 +69,7 @@ export const DataGridCell = <R,>({
|
|
|
72
69
|
onDoubleClick={onDoubleClick}
|
|
73
70
|
style={style}
|
|
74
71
|
>
|
|
75
|
-
{(column.render ?? defaultRender)(
|
|
72
|
+
{(column.render ?? defaultRender)(row, column)}
|
|
76
73
|
</styles.DataGridCell>
|
|
77
74
|
);
|
|
78
75
|
};
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import * as styles from './styles';
|
|
5
5
|
|
|
6
|
+
import { DataGridContext, MysqlJsonObject } from '../types';
|
|
6
7
|
import { FilterIcon, FilterSlashIcon, MagnifierIcon } from '../../../../Icons';
|
|
7
8
|
import { applyFilters, getDateGroups } from '../helpers';
|
|
8
9
|
import { intersection, uniq, without } from 'lodash';
|
|
@@ -15,7 +16,6 @@ import {
|
|
|
15
16
|
useState,
|
|
16
17
|
} from 'react';
|
|
17
18
|
|
|
18
|
-
import { DataGridContext } from '../types';
|
|
19
19
|
import { FilterValuesScroller } from '../FilterValuesScroller';
|
|
20
20
|
import { Input } from '../../../forms';
|
|
21
21
|
import { useFilterModal } from './hooks';
|
|
@@ -45,7 +45,7 @@ export const DataGridFilterMenu = <R,>({
|
|
|
45
45
|
const [textFilter, setTextFilter] = useState('');
|
|
46
46
|
|
|
47
47
|
const [availableValues, setAvailableValues] = useState<
|
|
48
|
-
(string | number | null)[]
|
|
48
|
+
(string | number | null | MysqlJsonObject)[]
|
|
49
49
|
>([]);
|
|
50
50
|
|
|
51
51
|
useEffect(() => {
|
|
@@ -36,13 +36,13 @@ export const DataGridFooter = <R,>({
|
|
|
36
36
|
}}
|
|
37
37
|
>
|
|
38
38
|
{!!selectable && (
|
|
39
|
-
<
|
|
39
|
+
<div
|
|
40
40
|
// className="inline-block w-12 select-none"
|
|
41
41
|
key="__select_checkbox__"
|
|
42
|
-
></
|
|
42
|
+
></div>
|
|
43
43
|
)}
|
|
44
44
|
{visibleColumns.map(([key, col]) => (
|
|
45
|
-
<
|
|
45
|
+
<div
|
|
46
46
|
key={key}
|
|
47
47
|
className={join(
|
|
48
48
|
[
|
|
@@ -56,7 +56,7 @@ export const DataGridFooter = <R,>({
|
|
|
56
56
|
style={{ width: (col.width ?? 150) + 'px' }}
|
|
57
57
|
>
|
|
58
58
|
{col.footer?.(rows, sortedRows, selectedRows)}
|
|
59
|
-
</
|
|
59
|
+
</div>
|
|
60
60
|
))}
|
|
61
61
|
</tr>
|
|
62
62
|
</tfoot>
|