@addev-be/ui 0.1.25 → 0.2.0

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.25",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "watch": "tsc -b --watch",
@@ -47,15 +47,7 @@ export const getAdvancedRequestDto = <R>({
47
47
  }
48
48
  ),
49
49
  ],
50
- conditions: [
51
- ...conditions,
52
- {
53
- field: {
54
- fieldName: 'DeletedAt',
55
- },
56
- operator: 'isNull' as const,
57
- },
58
- ],
50
+ conditions,
59
51
  orderBy,
60
52
  type,
61
53
  start,
@@ -68,10 +60,11 @@ export const convertFiltersToConditions = <R>(
68
60
  columns: AdvancedRequestDataGridColumns<R>
69
61
  ): Record<string, ConditionDTO> =>
70
62
  _.mapValues(filters, (filter, columnKey) => ({
71
- field: columns[columnKey].filterField ??
72
- columns[columnKey].field ?? {
73
- fieldName: columnKey,
74
- },
63
+ field:
64
+ columns[columnKey].filterField ??
65
+ columns[columnKey].field?.fieldAlias ??
66
+ columns[columnKey].field?.fieldName ??
67
+ columnKey,
75
68
  operator: filter.operator,
76
69
  value: ['inArray', 'inRange'].includes(filter.operator)
77
70
  ? filter.values
@@ -11,17 +11,10 @@ import {
11
11
  } from '../../../../helpers/numbers';
12
12
  import { numberFilter, textFilter } from '../../DataGrid/helpers';
13
13
 
14
- import { DataGridSettings } from '../../DataGrid/types';
15
14
  import { FieldDTO } from '../../../../services/advancedRequests';
16
15
  import _ from 'lodash';
17
16
  import moment from 'moment';
18
17
 
19
- export const isColumnVisible = <R,>(
20
- obj: AdvancedRequestDataGridColumn<R> | DataGridSettings
21
- ): boolean => {
22
- return obj?.order !== -1;
23
- };
24
-
25
18
  export const withGroupBy = <R extends Record<string, any>>(
26
19
  columns: AdvancedRequestDataGridColumns<R>
27
20
  ): AdvancedRequestDataGridColumns<R> =>
@@ -75,8 +68,8 @@ export const advancedComposedColumn = <R extends Record<string, any>>(
75
68
  ...textFilter(fields[0]),
76
69
  getter: (value) => value[fields[0]] ?? 0,
77
70
  },
78
- filterField: { fieldName: fields[0] },
79
- sortField: { fieldName: fields[0] },
71
+ filterField: fields[0],
72
+ sortField: fields[0],
80
73
  ...options,
81
74
  },
82
75
  });
@@ -248,7 +241,7 @@ export const getColumnSortField = <R,>(
248
241
  ): FieldDTO => {
249
242
  return columns[columnKey].sortField
250
243
  ? {
251
- fieldName: columns[columnKey].sortField?.fieldName ?? columnKey,
244
+ fieldName: columns[columnKey].sortField ?? columnKey,
252
245
  fieldAlias: columnKey,
253
246
  }
254
247
  : {
@@ -261,3 +254,9 @@ export const getFirstColumnField = <R,>(
261
254
  ): FieldDTO => {
262
255
  return getColumnField(columns, Object.keys(columns)[0]);
263
256
  };
257
+
258
+ export const getFirstColumnSortField = <R,>(
259
+ columns: AdvancedRequestDataGridColumns<R>
260
+ ): FieldDTO => {
261
+ return getColumnSortField(columns, Object.keys(columns)[0]);
262
+ };
@@ -14,7 +14,6 @@ import {
14
14
  convertFiltersToConditions,
15
15
  getAdvancedRequestDto,
16
16
  getColumnSortField,
17
- getFirstColumnField,
18
17
  parseJsonObjectFields,
19
18
  } from './helpers';
20
19
  import { useCallback, useEffect, useRef, useState } from 'react';
@@ -38,14 +37,7 @@ export const AdvancedRequestDataGrid = <R,>({
38
37
  const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
39
38
  {}
40
39
  );
41
- const [orderBy, setOrderBy] = useState<OrderByDTO[]>(
42
- props.orderBy ?? [
43
- {
44
- field: getFirstColumnField(props.columns),
45
- direction: 'ASC',
46
- },
47
- ]
48
- );
40
+ const [orderBy, setOrderBy] = useState<OrderByDTO[]>([]);
49
41
 
50
42
  const refresh = useCallback(() => {
51
43
  setRows([]);
@@ -123,33 +115,23 @@ export const AdvancedRequestDataGrid = <R,>({
123
115
  (columnKey: string) => {
124
116
  return advancedRequest({
125
117
  fields: [
126
- props.columns[columnKey].filterField ??
127
- props.columns[columnKey].field ?? {
128
- fieldName: columnKey,
129
- },
118
+ props.columns[columnKey].field ?? {
119
+ fieldName: columnKey,
120
+ },
130
121
  ],
131
122
  conditions: [
132
123
  ...(props.conditions ?? []),
133
124
  ...Object.values(
134
125
  _.pickBy(conditions, (condition, key) => key !== columnKey)
135
126
  ),
136
- {
137
- field: {
138
- fieldName: 'DeletedAt',
139
- },
140
- operator: 'isNull' as const,
141
- },
142
- ].filter(
143
- (condition) =>
144
- (condition.field.fieldAlias ?? condition.field.fieldName) !==
145
- columnKey
146
- ),
127
+ ].filter((condition) => condition.field !== columnKey),
147
128
  orderBy: [
148
129
  {
149
- field: props.columns[columnKey].filterField ??
150
- props.columns[columnKey].field ?? {
151
- fieldName: columnKey,
152
- },
130
+ field:
131
+ props.columns[columnKey].filterField ??
132
+ props.columns[columnKey].field?.fieldAlias ??
133
+ props.columns[columnKey].field?.fieldName ??
134
+ columnKey,
153
135
  direction: 'ASC',
154
136
  },
155
137
  ],
@@ -25,8 +25,8 @@ export type AdvancedRequestDataGridFilters = Record<
25
25
  export type AdvancedRequestDataGridColumn<R> = DataGridColumn<R> & {
26
26
  filter?: AdvancedRequestDataGridFilter;
27
27
  field?: FieldDTO;
28
- filterField?: FieldDTO;
29
- sortField?: FieldDTO;
28
+ filterField?: string;
29
+ sortField?: string;
30
30
  };
31
31
 
32
32
  export type AdvancedRequestDataGridColumns<R> = Record<
@@ -13,6 +13,7 @@ import moment from 'moment';
13
13
  export const isColumnVisible = <R,>(
14
14
  obj: DataGridColumn<R> | DataGridSettings
15
15
  ): boolean => {
16
+ console.log('isColumnVisible obj=', obj);
16
17
  return obj?.order !== -1;
17
18
  };
18
19
 
@@ -0,0 +1,206 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+
3
+ import { SqlRequestDataGridColumn, SqlRequestDataGridColumns } from '../types';
4
+ import {
5
+ formatMoney,
6
+ formatNumber,
7
+ formatPercentage,
8
+ } from '../../../../helpers/numbers';
9
+ import { numberFilter, textFilter } from '../../DataGrid/helpers';
10
+
11
+ import moment from 'moment';
12
+
13
+ export const sqlTextColumn = <R extends Record<string, any>>(
14
+ key: string,
15
+ title: string,
16
+ options?: Partial<SqlRequestDataGridColumn<R>>
17
+ ): SqlRequestDataGridColumns<R> => ({
18
+ [key]: {
19
+ name: title,
20
+ render: (row) => row[key] ?? '',
21
+ getter: (row) => row[key] ?? '',
22
+ sortGetter: (row) => row[key] ?? '',
23
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
24
+ ...options,
25
+ },
26
+ });
27
+
28
+ /**
29
+ * Creates a column with a composed value from multiple fields,
30
+ * and filtered by a text filter on the first field
31
+ */
32
+ export const sqlComposedColumn = <R extends Record<string, any>>(
33
+ key: string,
34
+ title: string,
35
+ fields: string[],
36
+ options?: Partial<SqlRequestDataGridColumn<R>>
37
+ ): SqlRequestDataGridColumns<R> => ({
38
+ [key]: {
39
+ field: {
40
+ fieldAlias: key,
41
+ operator: 'jsonObject',
42
+ operands: fields.flatMap((field) => [
43
+ { constantValue: field },
44
+ { fieldName: field },
45
+ ]),
46
+ },
47
+ name: title,
48
+ render: (row) => row[key] ?? '',
49
+ getter: (row) => row[key] ?? '',
50
+ sortGetter: (row) => row[key] ?? '',
51
+ filter: {
52
+ ...textFilter(fields[0]),
53
+ getter: (value) => value[fields[0]] ?? 0,
54
+ },
55
+ filterField: fields[0],
56
+ sortField: fields[0],
57
+ ...options,
58
+ },
59
+ });
60
+
61
+ export const sqlMailColumn = <R extends Record<string, any>>(
62
+ key: string,
63
+ title: string,
64
+ options?: Partial<SqlRequestDataGridColumn<R>>
65
+ ): SqlRequestDataGridColumns<R> => ({
66
+ [key]: {
67
+ name: title,
68
+ render: (row) => <a href={`mailto:${row[key]}`}>{row[key] ?? ''}</a>,
69
+ getter: (row) => row[key] ?? '',
70
+ sortGetter: (row) => row[key] ?? '',
71
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
72
+ ...options,
73
+ },
74
+ });
75
+
76
+ export const sqlPhoneColumn = <R extends Record<string, any>>(
77
+ key: string,
78
+ title: string,
79
+ options?: Partial<SqlRequestDataGridColumn<R>>
80
+ ): SqlRequestDataGridColumns<R> => ({
81
+ [key]: {
82
+ name: title,
83
+ render: (row) => <a href={`tel:${row[key]}`}>{row[key] ?? ''}</a>,
84
+ getter: (row) => row[key] ?? '',
85
+ sortGetter: (row) => row[key] ?? '',
86
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
87
+ ...options,
88
+ },
89
+ });
90
+
91
+ export const sqlDateColumn = <R extends Record<string, any>>(
92
+ key: string,
93
+ title: string,
94
+ options?: Partial<SqlRequestDataGridColumn<R>>
95
+ ): SqlRequestDataGridColumns<R> => ({
96
+ [key]: {
97
+ name: title,
98
+ render: (row) => moment(row[key]).format('DD/MM/YYYY') ?? '',
99
+ getter: (row) => row[key] ?? '',
100
+ sortGetter: (row) => row[key] ?? '',
101
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
102
+ ...options,
103
+ },
104
+ });
105
+
106
+ export const sqlMonthColumn = <R extends Record<string, any>>(
107
+ key: string,
108
+ title: string,
109
+ options?: Partial<SqlRequestDataGridColumn<R>>
110
+ ): SqlRequestDataGridColumns<R> => ({
111
+ [key]: {
112
+ name: title,
113
+ render: (row) => (row[key] ? `${row[key]} mois ` : ''),
114
+ getter: (row) => row[key] ?? '',
115
+ sortGetter: (row) => row[key] ?? '',
116
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
117
+ ...options,
118
+ },
119
+ });
120
+
121
+ export const sqlNumberColumn = <R extends Record<string, any>>(
122
+ key: string,
123
+ title: string,
124
+ decimals = 2,
125
+ options?: Partial<SqlRequestDataGridColumn<R>>
126
+ ): SqlRequestDataGridColumns<R> => ({
127
+ [key]: {
128
+ name: title,
129
+ render: (row) => formatNumber(row[key], decimals) ?? '',
130
+ excelFormatter: () => '#',
131
+ getter: (row) => row[key] ?? '',
132
+ sortGetter: (row) => row[key] ?? '',
133
+ filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
134
+ ...options,
135
+ },
136
+ });
137
+
138
+ export const sqlMoneyColumn = <R extends Record<string, any>>(
139
+ key: string,
140
+ title: string,
141
+ decimals = 2,
142
+ options?: Partial<SqlRequestDataGridColumn<R>>
143
+ ): SqlRequestDataGridColumns<R> => ({
144
+ [key]: {
145
+ name: title,
146
+ render: (row) => formatMoney(row[key], decimals) ?? '',
147
+ excelFormatter: () => '#0.00',
148
+ getter: (row) => row[key] ?? '',
149
+ sortGetter: (row) => row[key] ?? '',
150
+ filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
151
+ ...options,
152
+ },
153
+ });
154
+
155
+ export const sqlPercentageColumn = <R extends Record<string, any>>(
156
+ key: string,
157
+ title: string,
158
+ options?: Partial<SqlRequestDataGridColumn<R>>
159
+ ): SqlRequestDataGridColumns<R> => ({
160
+ [key]: {
161
+ name: title,
162
+ render: (row) => formatPercentage(row[key]) ?? '',
163
+ excelFormatter: () => '#0.00',
164
+ getter: (row) => row[key] ?? '',
165
+ sortGetter: (row) => row[key] ?? '',
166
+ filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
167
+ ...options,
168
+ },
169
+ });
170
+
171
+ export const sqlCheckboxColumn = <R extends Record<string, any>>(
172
+ key: string,
173
+ title: string,
174
+ options?: Partial<SqlRequestDataGridColumn<R>>
175
+ ): SqlRequestDataGridColumns<R> => ({
176
+ [key]: {
177
+ name: title,
178
+ render: (row) => (
179
+ <>
180
+ <input type="checkbox" checked={row[key]} />
181
+ <span>{row[key] ? ' Oui' : ' Non'}</span>
182
+ </>
183
+ ),
184
+ getter: (row) => row[key] ?? '',
185
+ sortGetter: (row) => row[key] ?? '',
186
+ filter: { ...numberFilter(key), getter: (value) => value[key] ?? 0 },
187
+ ...options,
188
+ },
189
+ });
190
+
191
+ export const sqlColorColumn = <R extends Record<string, any>>(
192
+ key: string,
193
+ title: string,
194
+ options?: Partial<SqlRequestDataGridColumn<R>>
195
+ ): SqlRequestDataGridColumns<R> => ({
196
+ [key]: {
197
+ name: title,
198
+ render: (row) => (
199
+ <div style={{ backgroundColor: row[key] }}>{row[key] ?? ''}</div>
200
+ ),
201
+ getter: (row) => row[key] ?? '',
202
+ sortGetter: (row) => row[key] ?? '',
203
+ filter: { ...textFilter(key), getter: (value) => value[key] ?? '' },
204
+ ...options,
205
+ },
206
+ });
@@ -0,0 +1,2 @@
1
+ export * from './sqlRequests';
2
+ export * from './columns';
@@ -0,0 +1,16 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+
3
+ import { ConditionDTO } from '../../../../services/sqlRequests';
4
+ import { SqlRequestDataGridFilters } from '../types';
5
+ import _ from 'lodash';
6
+
7
+ export const convertSqlFiltersToConditions = (
8
+ filters: SqlRequestDataGridFilters
9
+ ): Record<string, ConditionDTO> =>
10
+ _.mapValues(filters, (filter, columnKey) => ({
11
+ field: columnKey,
12
+ operator: filter.operator,
13
+ value: ['inArray', 'inRange'].includes(filter.operator)
14
+ ? filter.values
15
+ : _.castArray<string | number | null>(filter.values)[0],
16
+ }));
@@ -0,0 +1,221 @@
1
+ import {
2
+ ConditionDTO,
3
+ OrderByDTO,
4
+ useSqlRequestHandler,
5
+ } from '../../../services/sqlRequests';
6
+ import {
7
+ DataGridColumns,
8
+ DataGridFilters,
9
+ DataGridSort,
10
+ } from '../DataGrid/types';
11
+ import { useCallback, useEffect, useRef, useState } from 'react';
12
+
13
+ import { DataGrid } from '../DataGrid';
14
+ import { SqlRequestDataGridProps } from './types';
15
+ import _ from 'lodash';
16
+ import { convertSqlFiltersToConditions } from './helpers';
17
+ import { debounce } from 'lodash';
18
+ import { isColumnVisible } from '../DataGrid/helpers';
19
+
20
+ export const SqlRequestDataGrid = <R,>({
21
+ onSelectionChange: onSelectionChangeFromProps,
22
+ ...props
23
+ }: SqlRequestDataGridProps<R>) => {
24
+ const currentRows = useRef<R[]>([]);
25
+ const [rows, setRows] = useState<R[]>([]);
26
+ const [start, setStart] = useState(0);
27
+ const [length, setLength] = useState(50);
28
+ const [total, setTotal] = useState(-1);
29
+ const [sqlRequest, sqlIdRequest] = useSqlRequestHandler<R>(props.type);
30
+
31
+ const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
32
+ {}
33
+ );
34
+ const [orderBy, setOrderBy] = useState<OrderByDTO[]>([]);
35
+
36
+ const refresh = useCallback(() => {
37
+ setRows([]);
38
+ setStart(0);
39
+ setLength(50);
40
+ setTotal(-1);
41
+ }, []);
42
+
43
+ const onFiltersChanged = useCallback((filters: DataGridFilters) => {
44
+ const newConditions = convertSqlFiltersToConditions(filters);
45
+ setTotal(-1);
46
+ setConditions(newConditions);
47
+ }, []);
48
+
49
+ const onSortsChanged = useCallback(
50
+ (sorts: Record<string, DataGridSort>) => {
51
+ refresh();
52
+ const newOrderBy = Object.entries(sorts).map(
53
+ ([columnKey, direction]) =>
54
+ ({
55
+ field: columnKey,
56
+ direction: direction.toUpperCase(),
57
+ } as OrderByDTO)
58
+ );
59
+ console.log('newOrderBy=', newOrderBy);
60
+ setOrderBy(newOrderBy);
61
+ },
62
+ [refresh]
63
+ );
64
+
65
+ const loadRows = useRef(
66
+ debounce(
67
+ (
68
+ columns: DataGridColumns<R>,
69
+ conditions: ConditionDTO[] = [],
70
+ orderBy: OrderByDTO[] = [],
71
+ start = 0,
72
+ length = 100,
73
+ getTotal = false
74
+ ) => {
75
+ const columnsKeys = Object.keys(columns).filter((key) =>
76
+ isColumnVisible(columns[key])
77
+ );
78
+ if (!columnsKeys.includes('Id')) columnsKeys.push('Id');
79
+ sqlRequest({
80
+ columns: columnsKeys,
81
+ conditions,
82
+ orderBy,
83
+ start,
84
+ length,
85
+ getTotal,
86
+ }).then((response) => {
87
+ if (getTotal) {
88
+ currentRows.current = Array(response.total).fill(null);
89
+ if (getTotal) setTotal(response.total ?? 0);
90
+ }
91
+ const parsedRows = props.parser
92
+ ? response.data.map(props.parser)
93
+ : (response.data as R[]);
94
+ currentRows.current.splice(start, length, ...parsedRows);
95
+ setRows([...currentRows.current]);
96
+ });
97
+ },
98
+ 100
99
+ )
100
+ );
101
+
102
+ const loadFilterValues = useCallback(
103
+ (columnKey: string) => {
104
+ return sqlRequest({
105
+ columns: [columnKey],
106
+ conditions: [
107
+ ...(props.conditions ?? []),
108
+ ...Object.values(
109
+ _.pickBy(conditions, (condition, key) => key !== columnKey)
110
+ ),
111
+ ].filter((condition) => condition.field !== columnKey),
112
+ orderBy: [
113
+ {
114
+ field:
115
+ props.columns[columnKey].filterField ??
116
+ props.columns[columnKey].field?.fieldAlias ??
117
+ props.columns[columnKey].field?.fieldName ??
118
+ columnKey,
119
+ direction: 'ASC',
120
+ },
121
+ ],
122
+ getTotal: false,
123
+ unique: true,
124
+ }).then((response) =>
125
+ response.data.map(
126
+ (row) => props.columns[columnKey].filter?.getter?.(row) ?? null
127
+ )
128
+ );
129
+ },
130
+ [conditions, props.columns, props.conditions, sqlRequest]
131
+ );
132
+
133
+ useEffect(
134
+ () =>
135
+ loadRows.current(
136
+ props.columns,
137
+ [...(props.conditions ?? []), ...(Object.values(conditions) ?? [])],
138
+ orderBy,
139
+ start,
140
+ length,
141
+ total < 0
142
+ ),
143
+ [props.columns, conditions, orderBy, start, length, total, props.conditions]
144
+ );
145
+
146
+ const loadCopyRows = useCallback(
147
+ () =>
148
+ sqlRequest({
149
+ columns: Object.keys(props.columns).filter((key) =>
150
+ isColumnVisible(props.columns[key])
151
+ ),
152
+ conditions: [
153
+ ...(props.conditions ?? []),
154
+ ...(Object.values(conditions) ?? []),
155
+ ],
156
+ orderBy,
157
+ start: 0,
158
+ length: total,
159
+ }).then((response) =>
160
+ props.parser ? response.data.map(props.parser) : (response.data as R[])
161
+ ),
162
+ [
163
+ sqlRequest,
164
+ props.columns,
165
+ props.conditions,
166
+ props.parser,
167
+ conditions,
168
+ orderBy,
169
+ total,
170
+ ]
171
+ );
172
+
173
+ const loadAllIds = useCallback(
174
+ () =>
175
+ sqlIdRequest({
176
+ columns: ['Id'],
177
+ conditions: [
178
+ ...(props.conditions ?? []),
179
+ ...(Object.values(conditions) ?? []),
180
+ ],
181
+ orderBy,
182
+ start: 0,
183
+ length: total,
184
+ }).then((response) => response.data.map((row) => row['Id'])),
185
+ [conditions, orderBy, props.conditions, sqlIdRequest, total]
186
+ );
187
+
188
+ const onVisibleRowsChanged = useCallback(
189
+ (newStart: number, newLength: number) => {
190
+ if (newStart !== start || newLength !== length) {
191
+ setStart(newStart);
192
+ setLength(newLength);
193
+ }
194
+ },
195
+ [length, start]
196
+ );
197
+
198
+ const onSelectionChange = useCallback(
199
+ (selectedKeys: string[]) => {
200
+ onSelectionChangeFromProps?.(selectedKeys);
201
+ },
202
+ [onSelectionChangeFromProps]
203
+ );
204
+
205
+ return (
206
+ <DataGrid
207
+ onVisibleRowsChange={onVisibleRowsChanged}
208
+ filter={false}
209
+ sort={false}
210
+ onFiltersChanged={onFiltersChanged}
211
+ onSortsChanged={onSortsChanged}
212
+ filterValuesLoader={loadFilterValues}
213
+ rows={rows}
214
+ loadCopyRows={loadCopyRows}
215
+ refresh={refresh}
216
+ onSelectionChange={onSelectionChange}
217
+ getAllIds={loadAllIds}
218
+ {...props}
219
+ />
220
+ );
221
+ };
@@ -0,0 +1,46 @@
1
+ import {
2
+ ConditionDTO,
3
+ FieldDTO,
4
+ OrderByDTO,
5
+ SqlRequestRow,
6
+ } from '../../../services/sqlRequests';
7
+ import {
8
+ DataGridColumn,
9
+ DataGridFilter,
10
+ DataGridFilterType,
11
+ DataGridProps,
12
+ } from '../DataGrid/types';
13
+
14
+ export type SqlRequestDataGridFilter<
15
+ T extends DataGridFilterType = DataGridFilterType
16
+ > = DataGridFilter<T> & {
17
+ field?: FieldDTO;
18
+ };
19
+
20
+ export type SqlRequestDataGridFilters = Record<
21
+ string,
22
+ SqlRequestDataGridFilter
23
+ >;
24
+
25
+ export type SqlRequestDataGridColumn<R> = DataGridColumn<R> & {
26
+ filter?: SqlRequestDataGridFilter;
27
+ field?: FieldDTO;
28
+ filterField?: string;
29
+ sortField?: string;
30
+ };
31
+
32
+ export type SqlRequestDataGridColumns<R> = Record<
33
+ string,
34
+ SqlRequestDataGridColumn<R>
35
+ >;
36
+
37
+ export type SqlRequestDataGridProps<R> = Omit<
38
+ DataGridProps<R>,
39
+ 'rows' | 'columns'
40
+ > & {
41
+ columns: SqlRequestDataGridColumns<R>;
42
+ type: string;
43
+ orderBy?: OrderByDTO[];
44
+ conditions?: ConditionDTO[];
45
+ parser?: (row: SqlRequestRow<R>) => R;
46
+ };
@@ -1,4 +1,6 @@
1
1
  export * from './DataGrid';
2
2
  export * from './DataGrid/helpers';
3
3
  export * from './AdvancedRequestDataGrid';
4
+ export * from './SqlRequestDataGrid';
5
+ export * from './SqlRequestDataGrid/helpers';
4
6
  export * from './AdvancedRequestDataGrid/helpers';
@@ -23,7 +23,7 @@ export type FieldDTO<T extends string = string> = {
23
23
  };
24
24
 
25
25
  export type ConditionDTO = {
26
- field: FieldDTO;
26
+ field: string;
27
27
  operator:
28
28
  | 'lessThan'
29
29
  | 'lessThanOrEqual'
@@ -57,7 +57,7 @@ export type ConditionDTO = {
57
57
  };
58
58
 
59
59
  export type OrderByDTO = {
60
- field: FieldDTO;
60
+ field: string;
61
61
  direction?: 'ASC' | 'DESC';
62
62
  };
63
63
 
@@ -0,0 +1,96 @@
1
+ import { useRequestHandler } from './hooks';
2
+
3
+ export type FieldDTO<T extends string = string> = {
4
+ fieldName?: T;
5
+ fieldAlias?: string;
6
+ operator?:
7
+ | 'add'
8
+ | 'concat'
9
+ | 'divide'
10
+ | 'groupConcat'
11
+ | 'if'
12
+ | 'ifNull'
13
+ | 'jsonObject'
14
+ | 'length'
15
+ | 'modulo'
16
+ | 'multiply'
17
+ | 'subtract'
18
+ | 'sum'
19
+ | 'trim';
20
+ operands?: FieldDTO[];
21
+ constantValue?: string | number | boolean | null;
22
+ groupBy?: boolean;
23
+ };
24
+
25
+ export type ConditionDTO = {
26
+ field: string;
27
+ operator:
28
+ | 'lessThan'
29
+ | 'lessThanOrEqual'
30
+ | 'lessThanOrEquals'
31
+ | 'equals'
32
+ | 'notEquals'
33
+ | 'greaterThanOrEqual'
34
+ | 'greaterThanOrEquals'
35
+ | 'greaterThan'
36
+ | 'like'
37
+ | 'contains'
38
+ | 'notContains'
39
+ | 'startsWith'
40
+ | 'endsWith'
41
+ | 'notLike'
42
+ | 'inRange'
43
+ | 'between'
44
+ | 'isNull'
45
+ | 'inArray'
46
+ | 'in'
47
+ | 'not'
48
+ | 'and'
49
+ | 'or';
50
+ value?:
51
+ | string
52
+ | number
53
+ | boolean
54
+ | null
55
+ | (string | number | boolean | null)[];
56
+ children?: boolean;
57
+ };
58
+
59
+ export type OrderByDTO = {
60
+ field: string;
61
+ direction?: 'ASC' | 'DESC';
62
+ };
63
+
64
+ export type SqlRequestDTO = {
65
+ columns?: string[];
66
+ conditions?: ConditionDTO[];
67
+ orderBy?: OrderByDTO[];
68
+ start?: number;
69
+ length?: number;
70
+ getTotal?: boolean;
71
+ unique?: boolean;
72
+ };
73
+
74
+ export type SqlRequestRow<R> = {
75
+ [K in keyof R]: R[K] extends string | number | null
76
+ ? R[K]
77
+ : string | number | null;
78
+ };
79
+
80
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
+ export type SqlResponseDTO<T = any> = {
82
+ data: SqlRequestRow<T>[];
83
+ total?: number;
84
+ };
85
+
86
+ type SqlRequestHandler<T> = (
87
+ request: SqlRequestDTO
88
+ ) => Promise<SqlResponseDTO<T>>;
89
+
90
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
91
+ export const useSqlRequestHandler = <T = any>(
92
+ name: string
93
+ ): [SqlRequestHandler<T>, SqlRequestHandler<{ Id: string }>] => [
94
+ useRequestHandler<SqlRequestDTO, SqlResponseDTO<T>>(name),
95
+ useRequestHandler<SqlRequestDTO, SqlResponseDTO<{ Id: string }>>(name),
96
+ ];