@addev-be/ui 0.1.24 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@addev-be/ui",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "watch": "tsc -b --watch",
@@ -3,6 +3,7 @@
3
3
  import {
4
4
  AdvancedRequestDTO,
5
5
  ConditionDTO,
6
+ FieldDTO,
6
7
  OrderByDTO,
7
8
  } from '../../../../services/advancedRequests';
8
9
  import {
@@ -10,7 +11,6 @@ import {
10
11
  AdvancedRequestDataGridFilters,
11
12
  } from '../types';
12
13
 
13
- import { DataGridColumns } from '../../DataGrid/types';
14
14
  import _ from 'lodash';
15
15
 
16
16
  export const getAdvancedRequestDto = <R>({
@@ -21,21 +21,19 @@ export const getAdvancedRequestDto = <R>({
21
21
  start = 0,
22
22
  length = 100,
23
23
  getTotal = false,
24
- addIdColumn = true,
24
+ idField = { fieldName: 'Id' },
25
25
  }: {
26
26
  type: string;
27
- columns: DataGridColumns<R>;
27
+ columns: AdvancedRequestDataGridColumns<R>;
28
28
  conditions?: ConditionDTO[];
29
29
  orderBy?: OrderByDTO[];
30
30
  start?: number;
31
31
  length?: number;
32
32
  getTotal?: boolean;
33
- addIdColumn?: boolean;
33
+ idField?: FieldDTO | null;
34
34
  }): AdvancedRequestDTO => ({
35
35
  fields: [
36
- ...(Object.keys(columns).includes('Id') || addIdColumn === false
37
- ? []
38
- : [{ fieldName: 'Id' }]),
36
+ ...(idField === null ? [] : [idField]),
39
37
  ...Object.keys(columns).map((key) =>
40
38
  columns[key].field
41
39
  ? {
@@ -67,10 +65,10 @@ export const getAdvancedRequestDto = <R>({
67
65
 
68
66
  export const convertFiltersToConditions = <R>(
69
67
  filters: AdvancedRequestDataGridFilters,
70
- columns: DataGridColumns<R>
68
+ columns: AdvancedRequestDataGridColumns<R>
71
69
  ): Record<string, ConditionDTO> =>
72
70
  _.mapValues(filters, (filter, columnKey) => ({
73
- field: filter.field ??
71
+ field: columns[columnKey].filterField ??
74
72
  columns[columnKey].field ?? {
75
73
  fieldName: columnKey,
76
74
  },
@@ -4,14 +4,15 @@ import {
4
4
  AdvancedRequestDataGridColumn,
5
5
  AdvancedRequestDataGridColumns,
6
6
  } from '../types';
7
- import { advancedNumberFilter, advancedTextFilter } from './filters';
8
7
  import {
9
8
  formatMoney,
10
9
  formatNumber,
11
10
  formatPercentage,
12
11
  } from '../../../../helpers/numbers';
12
+ import { numberFilter, textFilter } from '../../DataGrid/helpers';
13
13
 
14
14
  import { DataGridSettings } from '../../DataGrid/types';
15
+ import { FieldDTO } from '../../../../services/advancedRequests';
15
16
  import _ from 'lodash';
16
17
  import moment from 'moment';
17
18
 
@@ -42,7 +43,7 @@ export const advancedTextColumn = <R extends Record<string, any>>(
42
43
  render: (row) => row[key] ?? '',
43
44
  getter: (row) => row[key] ?? '',
44
45
  sortGetter: (row) => row[key] ?? '',
45
- filter: advancedTextFilter(key),
46
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
46
47
  ...options,
47
48
  },
48
49
  });
@@ -70,7 +71,12 @@ export const advancedComposedColumn = <R extends Record<string, any>>(
70
71
  render: (row) => row[key] ?? '',
71
72
  getter: (row) => row[key] ?? '',
72
73
  sortGetter: (row) => row[key] ?? '',
73
- filter: advancedTextFilter(fields[0]),
74
+ filter: {
75
+ ...textFilter(fields[0]),
76
+ getter: (value) => value[fields[0]] ?? 0,
77
+ },
78
+ filterField: { fieldName: fields[0] },
79
+ sortField: { fieldName: fields[0] },
74
80
  ...options,
75
81
  },
76
82
  });
@@ -85,7 +91,7 @@ export const advancedMailColumn = <R extends Record<string, any>>(
85
91
  render: (row) => <a href={`mailto:${row[key]}`}>{row[key] ?? ''}</a>,
86
92
  getter: (row) => row[key] ?? '',
87
93
  sortGetter: (row) => row[key] ?? '',
88
- filter: advancedTextFilter(key),
94
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
89
95
  ...options,
90
96
  },
91
97
  });
@@ -100,7 +106,7 @@ export const advancedPhoneColumn = <R extends Record<string, any>>(
100
106
  render: (row) => <a href={`tel:${row[key]}`}>{row[key] ?? ''}</a>,
101
107
  getter: (row) => row[key] ?? '',
102
108
  sortGetter: (row) => row[key] ?? '',
103
- filter: advancedTextFilter(key),
109
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
104
110
  ...options,
105
111
  },
106
112
  });
@@ -115,7 +121,7 @@ export const advancedDateColumn = <R extends Record<string, any>>(
115
121
  render: (row) => moment(row[key]).format('DD/MM/YYYY') ?? '',
116
122
  getter: (row) => row[key] ?? '',
117
123
  sortGetter: (row) => row[key] ?? '',
118
- filter: advancedTextFilter(key),
124
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
119
125
  ...options,
120
126
  },
121
127
  });
@@ -130,7 +136,7 @@ export const advancedMonthColumn = <R extends Record<string, any>>(
130
136
  render: (row) => (row[key] ? `${row[key]} mois ` : ''),
131
137
  getter: (row) => row[key] ?? '',
132
138
  sortGetter: (row) => row[key] ?? '',
133
- filter: advancedTextFilter(key),
139
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
134
140
  ...options,
135
141
  },
136
142
  });
@@ -147,7 +153,7 @@ export const advancedNumberColumn = <R extends Record<string, any>>(
147
153
  excelFormatter: () => '#',
148
154
  getter: (row) => row[key] ?? '',
149
155
  sortGetter: (row) => row[key] ?? '',
150
- filter: advancedNumberFilter(key),
156
+ filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
151
157
  ...options,
152
158
  },
153
159
  });
@@ -164,7 +170,7 @@ export const advancedMoneyColumn = <R extends Record<string, any>>(
164
170
  excelFormatter: () => '#0.00',
165
171
  getter: (row) => row[key] ?? '',
166
172
  sortGetter: (row) => row[key] ?? '',
167
- filter: advancedNumberFilter(key),
173
+ filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
168
174
  ...options,
169
175
  },
170
176
  });
@@ -180,7 +186,7 @@ export const advancedPercentageColumn = <R extends Record<string, any>>(
180
186
  excelFormatter: () => '#0.00',
181
187
  getter: (row) => row[key] ?? '',
182
188
  sortGetter: (row) => row[key] ?? '',
183
- filter: advancedNumberFilter(key),
189
+ filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
184
190
  ...options,
185
191
  },
186
192
  });
@@ -200,7 +206,7 @@ export const advancedCheckboxColumn = <R extends Record<string, any>>(
200
206
  ),
201
207
  getter: (row) => row[key] ?? '',
202
208
  sortGetter: (row) => row[key] ?? '',
203
- filter: advancedNumberFilter(key),
209
+ filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
204
210
  ...options,
205
211
  },
206
212
  });
@@ -217,7 +223,41 @@ export const advancedColorColumn = <R extends Record<string, any>>(
217
223
  ),
218
224
  getter: (row) => row[key] ?? '',
219
225
  sortGetter: (row) => row[key] ?? '',
220
- filter: advancedTextFilter(key),
226
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
221
227
  ...options,
222
228
  },
223
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,3 +1,2 @@
1
1
  export * from './advancedRequests';
2
2
  export * from './columns';
3
- export * from './filters';
@@ -13,6 +13,8 @@ import _, { debounce } from 'lodash';
13
13
  import {
14
14
  convertFiltersToConditions,
15
15
  getAdvancedRequestDto,
16
+ getColumnSortField,
17
+ getFirstColumnField,
16
18
  parseJsonObjectFields,
17
19
  } from './helpers';
18
20
  import { useCallback, useEffect, useRef, useState } from 'react';
@@ -20,33 +22,18 @@ import { useCallback, useEffect, useRef, useState } from 'react';
20
22
  import { AdvancedRequestDataGridProps } from './types';
21
23
  import { DataGrid } from '../DataGrid';
22
24
 
23
- const getColumnField = <R,>(
24
- columns: DataGridColumns<R>,
25
- columnKey: string
26
- ): FieldDTO => {
27
- return columns[columnKey].field
28
- ? {
29
- fieldName: columns[columnKey].field?.fieldName ?? columnKey,
30
- fieldAlias: columnKey,
31
- }
32
- : {
33
- fieldName: columnKey,
34
- fieldAlias: columnKey,
35
- };
36
- };
37
- const getFirstColumnField = <R,>(columns: DataGridColumns<R>): FieldDTO => {
38
- return getColumnField(columns, Object.keys(columns)[0]);
39
- };
40
-
41
- export const AdvancedRequestDataGrid = <R,>(
42
- props: AdvancedRequestDataGridProps<R>
43
- ) => {
25
+ export const AdvancedRequestDataGrid = <R,>({
26
+ onSelectionChange: onSelectionChangeFromProps,
27
+ idField,
28
+ ...props
29
+ }: AdvancedRequestDataGridProps<R>) => {
44
30
  const currentRows = useRef<R[]>([]);
45
31
  const [rows, setRows] = useState<R[]>([]);
46
32
  const [start, setStart] = useState(0);
47
33
  const [length, setLength] = useState(50);
48
34
  const [total, setTotal] = useState(-1);
49
35
  const advancedRequest = useAdvancedRequestHandler<R>();
36
+ const idAdvancedRequest = useAdvancedRequestHandler<{ Id: string }>();
50
37
 
51
38
  const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
52
39
  {}
@@ -83,7 +70,7 @@ export const AdvancedRequestDataGrid = <R,>(
83
70
  Object.entries(sorts).map(
84
71
  ([columnKey, direction]) =>
85
72
  ({
86
- field: getColumnField(props.columns, columnKey),
73
+ field: getColumnSortField(props.columns, columnKey),
87
74
  direction: direction.toUpperCase(),
88
75
  } as OrderByDTO)
89
76
  )
@@ -100,6 +87,7 @@ export const AdvancedRequestDataGrid = <R,>(
100
87
  orderBy: OrderByDTO[],
101
88
  start: number,
102
89
  length: number,
90
+ idField: FieldDTO | null | undefined,
103
91
  getTotal = false
104
92
  ) => {
105
93
  advancedRequest(
@@ -111,6 +99,7 @@ export const AdvancedRequestDataGrid = <R,>(
111
99
  start,
112
100
  length,
113
101
  getTotal,
102
+ idField,
114
103
  })
115
104
  ).then((response) => {
116
105
  if (getTotal) {
@@ -134,7 +123,7 @@ export const AdvancedRequestDataGrid = <R,>(
134
123
  (columnKey: string) => {
135
124
  return advancedRequest({
136
125
  fields: [
137
- props.columns[columnKey].filter?.field ??
126
+ props.columns[columnKey].filterField ??
138
127
  props.columns[columnKey].field ?? {
139
128
  fieldName: columnKey,
140
129
  },
@@ -157,7 +146,7 @@ export const AdvancedRequestDataGrid = <R,>(
157
146
  ),
158
147
  orderBy: [
159
148
  {
160
- field: props.columns[columnKey].filter?.field ??
149
+ field: props.columns[columnKey].filterField ??
161
150
  props.columns[columnKey].field ?? {
162
151
  fieldName: columnKey,
163
152
  },
@@ -184,9 +173,19 @@ export const AdvancedRequestDataGrid = <R,>(
184
173
  orderBy,
185
174
  start,
186
175
  length,
176
+ idField,
187
177
  total < 0
188
178
  ),
189
- [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
+ ]
190
189
  );
191
190
 
192
191
  const loadCopyRows = useCallback(
@@ -202,6 +201,7 @@ export const AdvancedRequestDataGrid = <R,>(
202
201
  orderBy,
203
202
  start: 0,
204
203
  length: total,
204
+ idField,
205
205
  })
206
206
  ).then((response) =>
207
207
  parseJsonObjectFields(response.data, props.columns, props.parser)
@@ -209,6 +209,7 @@ export const AdvancedRequestDataGrid = <R,>(
209
209
  [
210
210
  advancedRequest,
211
211
  conditions,
212
+ idField,
212
213
  orderBy,
213
214
  props.columns,
214
215
  props.conditions,
@@ -218,6 +219,38 @@ export const AdvancedRequestDataGrid = <R,>(
218
219
  ]
219
220
  );
220
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
+
221
254
  const onVisibleRowsChanged = useCallback(
222
255
  (newStart: number, newLength: number) => {
223
256
  if (newStart !== start || newLength !== length) {
@@ -228,6 +261,13 @@ export const AdvancedRequestDataGrid = <R,>(
228
261
  [length, start]
229
262
  );
230
263
 
264
+ const onSelectionChange = useCallback(
265
+ (selectedKeys: string[]) => {
266
+ onSelectionChangeFromProps?.(selectedKeys);
267
+ },
268
+ [onSelectionChangeFromProps]
269
+ );
270
+
231
271
  return (
232
272
  <DataGrid
233
273
  onVisibleRowsChange={onVisibleRowsChanged}
@@ -239,6 +279,8 @@ export const AdvancedRequestDataGrid = <R,>(
239
279
  rows={rows}
240
280
  loadCopyRows={loadCopyRows}
241
281
  refresh={refresh}
282
+ onSelectionChange={onSelectionChange}
283
+ getAllIds={loadAllIds}
242
284
  {...props}
243
285
  />
244
286
  );
@@ -24,6 +24,9 @@ export type AdvancedRequestDataGridFilters = Record<
24
24
 
25
25
  export type AdvancedRequestDataGridColumn<R> = DataGridColumn<R> & {
26
26
  filter?: AdvancedRequestDataGridFilter;
27
+ field?: FieldDTO;
28
+ filterField?: FieldDTO;
29
+ sortField?: FieldDTO;
27
30
  };
28
31
 
29
32
  export type AdvancedRequestDataGridColumns<R> = Record<
@@ -39,6 +42,6 @@ export type AdvancedRequestDataGridProps<R> = Omit<
39
42
  type: string;
40
43
  orderBy?: OrderByDTO[];
41
44
  conditions?: ConditionDTO[];
42
- addIdColumn?: boolean;
45
+ idField?: FieldDTO | null;
43
46
  parser?: (row: AdvancedRequestRow<R>) => R;
44
47
  };
@@ -17,7 +17,7 @@ export const useFilterModal = <R,>({
17
17
  const [isVisible, setIsVisible] = useState(false);
18
18
  const { filters = {}, columns, setFilters } = useDataGridContext<R>(context);
19
19
  const column = columns[columnKey];
20
- const [currentFilter, setCurrentFilter] = useState<DataGridFilter<R>>(
20
+ const [currentFilter, setCurrentFilter] = useState<DataGridFilter>(
21
21
  filters[columnKey] ?? column?.filter
22
22
  );
23
23
 
@@ -37,6 +37,7 @@ export const DataGridHeader = <R,>({
37
37
  headerColor,
38
38
  rowKeyGetter,
39
39
  gridTemplateColumns,
40
+ getAllIds,
40
41
  } = useDataGridContext(context);
41
42
  const [visibleFilter, setVisibleFilter] = useState<string | undefined>();
42
43
 
@@ -49,10 +50,11 @@ export const DataGridHeader = <R,>({
49
50
  ? true
50
51
  : undefined;
51
52
  const toggleAll = useCallback(
52
- (newStatus: boolean) => {
53
- setSelectedKeys(newStatus ? rows.map(rowKeyGetter) : []);
53
+ async (newStatus: boolean) => {
54
+ const allIds = getAllIds ? await getAllIds() : rows.map(rowKeyGetter);
55
+ setSelectedKeys(newStatus ? allIds : []);
54
56
  },
55
- [rowKeyGetter, rows, setSelectedKeys]
57
+ [getAllIds, rowKeyGetter, rows, setSelectedKeys]
56
58
  );
57
59
 
58
60
  const onFilterButtonClicked = useCallback((columnKey: string) => {
@@ -86,8 +86,8 @@ export const useDataGrid = <R,>(
86
86
  );
87
87
 
88
88
  useEffect(() => {
89
- onSelectionChange?.(selectedRows);
90
- }, [onSelectionChange, selectedRows]);
89
+ onSelectionChange?.(selectedKeys);
90
+ }, [onSelectionChange, selectedKeys]);
91
91
 
92
92
  /** ROWS FILTERING **/
93
93
 
@@ -54,7 +54,7 @@ export const useDataGridCopy = <R>(
54
54
  }, []);
55
55
 
56
56
  const generateCellHtml = useCallback(
57
- (col: DataGridColumn<R, any>, value: any) => `<td style="
57
+ (col: DataGridColumn<R>, value: any) => `<td style="
58
58
  ${
59
59
  col.excelFormatter
60
60
  ? "mso-number-format: '" + col.excelFormatter(col) + "';"
@@ -11,7 +11,6 @@ import {
11
11
  SetStateAction,
12
12
  } from 'react';
13
13
 
14
- import { FieldDTO } from '../../../services/advancedRequests';
15
14
  import { SettingsContextProps } from '../../../providers/SettingsProvider';
16
15
  import { ThemeColor } from '../../../providers/ThemeProvider/types';
17
16
 
@@ -23,8 +22,6 @@ export type DataGridColumn<R> = {
23
22
  editable?: boolean;
24
23
  excelFormatter?: (value: any) => string;
25
24
  excelValue?: (value: any) => string;
26
- field?: FieldDTO;
27
- filterField?: FieldDTO;
28
25
  filter?: DataGridFilter;
29
26
  footer?: (allRows: R[], filteredRows: R[], selectedRows: R[]) => ReactNode;
30
27
  footerClassName?: string;
@@ -57,7 +54,8 @@ export type DataGridProps<R> = {
57
54
  selectable?: boolean;
58
55
  editable?: boolean;
59
56
  onRowDoubleClick?: (row: R, e: MouseEvent) => void;
60
- onSelectionChange?: (selectedRows: R[]) => void;
57
+ onSelectionChange?: (keys: string[]) => void;
58
+ getAllIds?: () => Promise<string[]>;
61
59
  onFiltersChanged?: (filters: DataGridFilters) => void;
62
60
  onSortsChanged?: (sorts: Record<string, DataGridSort>) => void;
63
61
  onVisibleRowsChange?: (startIndex: number, length: number) => void;
@@ -1,19 +0,0 @@
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
- });