@addev-be/ui 2.6.0 → 2.7.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.
Files changed (238) hide show
  1. package/assets/icons/arrow-down-1-9.svg +1 -1
  2. package/assets/icons/arrow-down-a-z.svg +1 -1
  3. package/assets/icons/arrow-up-z-a.svg +1 -1
  4. package/assets/icons/check.svg +1 -1
  5. package/assets/icons/circle-check.svg +1 -1
  6. package/assets/icons/down.svg +1 -1
  7. package/assets/icons/filter-full.svg +1 -1
  8. package/assets/icons/filter.svg +1 -1
  9. package/assets/icons/hashtag.svg +1 -1
  10. package/assets/icons/image-slash.svg +1 -1
  11. package/assets/icons/left.svg +1 -1
  12. package/assets/icons/magnifier.svg +1 -1
  13. package/assets/icons/phone.svg +1 -1
  14. package/assets/icons/right.svg +1 -1
  15. package/assets/icons/sort-calendar-ascending.svg +5 -5
  16. package/assets/icons/spinner-third.svg +1 -1
  17. package/assets/icons/table-columns.svg +1 -1
  18. package/assets/icons/table-footer-slash.svg +4 -4
  19. package/assets/icons/table-footer.svg +3 -3
  20. package/assets/icons/up.svg +1 -1
  21. package/assets/icons/user-tie.svg +1 -1
  22. package/assets/icons/x-bar.svg +3 -3
  23. package/dist/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.js +8 -9
  24. package/dist/components/data/AdvancedRequestDataGrid/helpers/columns.js +72 -21
  25. package/dist/components/data/AdvancedRequestDataGrid/index.js +2 -2
  26. package/dist/components/data/AdvancedRequestDataGrid/types.d.ts +1 -1
  27. package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.d.ts +1 -2
  28. package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.js +3 -2
  29. package/dist/services/index.js +7 -17
  30. package/eslint.config.js +3 -3
  31. package/package.json +2 -2
  32. package/src/Icons.tsx +138 -138
  33. package/src/components/auth/LoginForm.tsx +86 -86
  34. package/src/components/auth/LoginPage.tsx +32 -32
  35. package/src/components/auth/PasswordRecoveryForm.tsx +53 -53
  36. package/src/components/auth/PasswordResetForm.tsx +112 -112
  37. package/src/components/auth/styles.ts +14 -14
  38. package/src/components/data/DataGrid/DataGridCell.tsx +81 -81
  39. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +9 -9
  40. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +59 -59
  41. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +182 -182
  42. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +104 -104
  43. package/src/components/data/DataGrid/DataGridEditableCell/CheckboxEditableCell.tsx +37 -37
  44. package/src/components/data/DataGrid/DataGridEditableCell/DateEditableCell.tsx +38 -38
  45. package/src/components/data/DataGrid/DataGridEditableCell/NumberEditableCell.tsx +71 -71
  46. package/src/components/data/DataGrid/DataGridEditableCell/TextEditableCell.tsx +37 -37
  47. package/src/components/data/DataGrid/DataGridEditableCell/index.tsx +106 -106
  48. package/src/components/data/DataGrid/DataGridEditableCell/styles.ts +35 -35
  49. package/src/components/data/DataGrid/DataGridEditableCell/types.ts +18 -18
  50. package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +129 -129
  51. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +81 -81
  52. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +370 -370
  53. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +97 -97
  54. package/src/components/data/DataGrid/DataGridFooter.tsx +47 -47
  55. package/src/components/data/DataGrid/DataGridHeader.tsx +74 -74
  56. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +112 -112
  57. package/src/components/data/DataGrid/DataGridRowTemplate.tsx +83 -83
  58. package/src/components/data/DataGrid/DataGridToolbar.tsx +134 -134
  59. package/src/components/data/DataGrid/FilterModalContent/index.tsx +137 -137
  60. package/src/components/data/DataGrid/FilterModalContent/styles.ts +22 -22
  61. package/src/components/data/DataGrid/constants.ts +6 -6
  62. package/src/components/data/DataGrid/helpers/columns.tsx +449 -449
  63. package/src/components/data/DataGrid/helpers/filters.ts +287 -287
  64. package/src/components/data/DataGrid/helpers/index.ts +2 -2
  65. package/src/components/data/DataGrid/hooks/index.ts +29 -29
  66. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +383 -383
  67. package/src/components/data/DataGrid/hooks/useDataGridChangedRows.ts +97 -97
  68. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +174 -174
  69. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +48 -48
  70. package/src/components/data/DataGrid/hooks/useRefreshModal.tsx +48 -48
  71. package/src/components/data/DataGrid/index.tsx +111 -111
  72. package/src/components/data/DataGrid/styles.ts +434 -434
  73. package/src/components/data/DataGrid/types.ts +380 -380
  74. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +526 -526
  75. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +2 -2
  76. package/src/components/data/SqlRequestDataGrid/helpers/rows.ts +24 -24
  77. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +17 -17
  78. package/src/components/data/SqlRequestDataGrid/index.tsx +417 -417
  79. package/src/components/data/SqlRequestDataGrid/styles.ts +15 -15
  80. package/src/components/data/SqlRequestDataGrid/types.ts +74 -74
  81. package/src/components/data/SqlRequestForeignList/index.tsx +254 -254
  82. package/src/components/data/SqlRequestForeignList/styles.ts +43 -43
  83. package/src/components/data/SqlRequestForeignList/types.ts +32 -32
  84. package/src/components/data/SqlRequestGrid/filters/FiltersSidebar.tsx +108 -108
  85. package/src/components/data/SqlRequestGrid/filters/styles.ts +88 -88
  86. package/src/components/data/SqlRequestGrid/helpers/index.ts +1 -1
  87. package/src/components/data/SqlRequestGrid/helpers/sqlRequests.ts +16 -16
  88. package/src/components/data/SqlRequestGrid/index.tsx +304 -304
  89. package/src/components/data/SqlRequestGrid/styles.ts +20 -20
  90. package/src/components/data/SqlRequestGrid/types.ts +73 -73
  91. package/src/components/data/VirtualScroller/hooks.ts +71 -71
  92. package/src/components/data/VirtualScroller/index.tsx +89 -89
  93. package/src/components/data/VirtualScroller/styles.ts +57 -57
  94. package/src/components/data/VirtualScroller/types.ts +10 -10
  95. package/src/components/forms/AutoTextArea.tsx +48 -48
  96. package/src/components/forms/BillitIdentifier/index.tsx +78 -78
  97. package/src/components/forms/BillitIdentifier/styles.tsx +43 -43
  98. package/src/components/forms/Button.tsx +132 -132
  99. package/src/components/forms/Form/Checkbox.tsx +12 -12
  100. package/src/components/forms/Form/CustomSelect.tsx +86 -86
  101. package/src/components/forms/Form/FormGroup.tsx +33 -33
  102. package/src/components/forms/Form/Input.tsx +16 -16
  103. package/src/components/forms/Form/Row.tsx +28 -28
  104. package/src/components/forms/Form/Select.tsx +99 -99
  105. package/src/components/forms/Form/TextArea.tsx +17 -17
  106. package/src/components/forms/Form/index.tsx +48 -48
  107. package/src/components/forms/Form/styles.ts +148 -148
  108. package/src/components/forms/IconButton.tsx +61 -61
  109. package/src/components/forms/IndeterminateCheckbox.tsx +46 -46
  110. package/src/components/forms/NumberInput.tsx +53 -53
  111. package/src/components/forms/Select.tsx +34 -34
  112. package/src/components/forms/VerticalLabel.tsx +20 -20
  113. package/src/components/forms/styles.ts +42 -42
  114. package/src/components/layout/Columns.ts +28 -28
  115. package/src/components/layout/Dropdown/index.tsx +113 -113
  116. package/src/components/layout/Dropdown/styles.ts +53 -53
  117. package/src/components/layout/Flexbox.ts +21 -21
  118. package/src/components/layout/Grid/index.tsx +8 -8
  119. package/src/components/layout/Grid/styles.ts +34 -34
  120. package/src/components/layout/Loading/index.tsx +29 -29
  121. package/src/components/layout/Loading/styles.ts +29 -29
  122. package/src/components/layout/Masonry/index.tsx +29 -29
  123. package/src/components/layout/Masonry/styles.ts +20 -20
  124. package/src/components/layout/Modal/index.tsx +51 -51
  125. package/src/components/layout/Modal/styles.ts +125 -125
  126. package/src/components/search/HighlightedText.tsx +41 -41
  127. package/src/components/search/QuickSearchBar.tsx +102 -102
  128. package/src/components/search/QuickSearchResults.tsx +86 -86
  129. package/src/components/search/styles.ts +96 -96
  130. package/src/components/search/types.ts +29 -29
  131. package/src/components/ui/Avatar/index.tsx +54 -54
  132. package/src/components/ui/Card/index.tsx +16 -16
  133. package/src/components/ui/Card/styles.ts +41 -41
  134. package/src/components/ui/ContextMenu/index.tsx +79 -79
  135. package/src/components/ui/ContextMenu/styles.ts +119 -119
  136. package/src/components/ui/Ellipsis.tsx +33 -33
  137. package/src/components/ui/Label.tsx +93 -93
  138. package/src/components/ui/Message/index.tsx +57 -57
  139. package/src/components/ui/Message/styles.ts +44 -44
  140. package/src/components/ui/TabsView/TabsList.tsx +49 -49
  141. package/src/components/ui/TabsView/TabsView.tsx +42 -42
  142. package/src/components/ui/TabsView/styles.ts +84 -84
  143. package/src/components/ui/TabsView/types.ts +15 -15
  144. package/src/config/index.ts +10 -10
  145. package/src/helpers/components.ts +9 -9
  146. package/src/helpers/dates.ts +17 -17
  147. package/src/helpers/getScrollbarSize.ts +14 -14
  148. package/src/helpers/numbers.ts +63 -63
  149. package/src/helpers/responsive.ts +83 -83
  150. package/src/helpers/styled/space.ts +114 -114
  151. package/src/helpers/styled/typography.ts +25 -25
  152. package/src/helpers/text.ts +13 -13
  153. package/src/helpers/types.ts +9 -9
  154. package/src/hooks/useContainerMediaQuery.ts +7 -7
  155. package/src/hooks/useElementSize.ts +24 -24
  156. package/src/hooks/useMediaQuery.ts +9 -9
  157. package/src/hooks/useMediaQueryForWidth.ts +35 -35
  158. package/src/hooks/useMutableState.test.ts +410 -410
  159. package/src/hooks/useMutableState.ts +39 -39
  160. package/src/hooks/useShowArchived.ts +28 -28
  161. package/src/hooks/useWindowSize.ts +20 -20
  162. package/src/index.ts +103 -103
  163. package/src/providers/AuthenticationProvider/helpers.ts +3 -3
  164. package/src/providers/AuthenticationProvider/index.tsx +303 -303
  165. package/src/providers/LoadingProvider/index.tsx +47 -47
  166. package/src/providers/PortalsProvider/index.tsx +54 -54
  167. package/src/providers/PortalsProvider/styles.ts +31 -31
  168. package/src/providers/SettingsProvider/index.tsx +70 -70
  169. package/src/providers/ThemeProvider/defaultTheme.ts +471 -471
  170. package/src/providers/ThemeProvider/helpers.ts +84 -84
  171. package/src/providers/ThemeProvider/index.ts +73 -73
  172. package/src/providers/ThemeProvider/types.ts +134 -134
  173. package/src/providers/ToastProvider/index.tsx +93 -93
  174. package/src/providers/TrackingProvider/index.tsx +71 -71
  175. package/src/providers/UiProviders/index.tsx +76 -76
  176. package/src/providers/UiProviders/styles.ts +10 -10
  177. package/src/providers/hooks.ts +14 -14
  178. package/src/services/HttpService.ts +92 -92
  179. package/src/services/WebSocketService.ts +155 -155
  180. package/src/services/advancedRequests.ts +102 -102
  181. package/src/services/base.ts +23 -23
  182. package/src/services/globalSearch.ts +32 -32
  183. package/src/services/hooks.ts +92 -92
  184. package/src/services/requests/auth.ts +44 -44
  185. package/src/services/requests/generic.ts +62 -62
  186. package/src/services/requests/printing.ts +12 -12
  187. package/src/services/requests/tracking.ts +12 -12
  188. package/src/services/requests/userProfiles.ts +35 -35
  189. package/src/services/requests/users.ts +28 -28
  190. package/src/services/smartQueries.ts +122 -122
  191. package/src/services/sqlRequests.ts +119 -119
  192. package/src/services/types/auth.ts +98 -98
  193. package/src/services/types/base.ts +10 -10
  194. package/src/services/types/generic.ts +82 -82
  195. package/src/services/types/printing.ts +10 -10
  196. package/src/services/types/tracking.ts +29 -29
  197. package/src/services/types/userProfiles.ts +79 -79
  198. package/src/services/types/users.ts +74 -74
  199. package/src/services/updateSqlRequests.ts +32 -32
  200. package/src/styles/animations.scss +30 -30
  201. package/src/styles/index.scss +42 -42
  202. package/src/types.ts +8 -8
  203. package/src/typings.d.ts +2 -2
  204. package/tsconfig.json +18 -18
  205. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.d.ts +0 -10
  206. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.js +0 -173
  207. package/dist/components/data/DataGrid/FilterValuesScroller.d.ts +0 -13
  208. package/dist/components/data/DataGrid/FilterValuesScroller.js +0 -73
  209. package/dist/components/data/DataGrid/VirtualScroller.d.ts +0 -11
  210. package/dist/components/data/DataGrid/VirtualScroller.js +0 -41
  211. package/dist/components/data/DataGrid/helpers/advancedRequests.d.ts +0 -12
  212. package/dist/components/data/DataGrid/helpers/advancedRequests.js +0 -53
  213. package/dist/components/data/DataGrid/helpers.d.ts +0 -28
  214. package/dist/components/data/DataGrid/helpers.js +0 -436
  215. package/dist/components/data/SmartQueryDataGrid/helpers/columns.d.ts +0 -20
  216. package/dist/components/data/SmartQueryDataGrid/helpers/columns.js +0 -160
  217. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.d.ts +0 -5
  218. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.js +0 -41
  219. package/dist/components/data/SmartQueryDataGrid/helpers/index.d.ts +0 -2
  220. package/dist/components/data/SmartQueryDataGrid/helpers/index.js +0 -18
  221. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.d.ts +0 -3
  222. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.js +0 -15
  223. package/dist/components/data/SmartQueryDataGrid/hooks.d.ts +0 -9
  224. package/dist/components/data/SmartQueryDataGrid/hooks.js +0 -63
  225. package/dist/components/data/SmartQueryDataGrid/index.d.ts +0 -12
  226. package/dist/components/data/SmartQueryDataGrid/index.js +0 -242
  227. package/dist/components/data/SmartQueryDataGrid/types.d.ts +0 -22
  228. package/dist/components/data/SmartQueryDataGrid/types.js +0 -2
  229. package/dist/components/forms/Form/InputWithLabel.d.ts +0 -2
  230. package/dist/components/forms/Form/InputWithLabel.js +0 -10
  231. package/dist/components/forms/Form/types.d.ts +0 -7
  232. package/dist/components/forms/Form/types.js +0 -2
  233. package/dist/config/types.d.ts +0 -11
  234. package/dist/config/types.js +0 -2
  235. package/dist/helpers/react.d.ts +0 -2
  236. package/dist/helpers/react.js +0 -8
  237. package/dist/services/requests/userPermissions.d.ts +0 -4
  238. package/dist/services/requests/userPermissions.js +0 -20
@@ -1,417 +1,417 @@
1
- import {
2
- ConditionDTO,
3
- OrderByDTO,
4
- SqlRequestFooterFunction,
5
- SqlRequestRow,
6
- useSqlRequestHandler,
7
- } from '../../../services/sqlRequests';
8
- import {
9
- DataGridContextProps,
10
- DataGridFilters,
11
- DataGridFooterFunction,
12
- DataGridRefProps,
13
- DataGridSort,
14
- } from '../DataGrid/types';
15
- import {
16
- Dispatch,
17
- ReactNode,
18
- Ref,
19
- SetStateAction,
20
- useCallback,
21
- useEffect,
22
- useImperativeHandle,
23
- useMemo,
24
- useRef,
25
- useState,
26
- } from 'react';
27
- import _, { debounce, map } from 'lodash';
28
-
29
- import { DataGrid } from '../DataGrid';
30
- import { SqlRequestDataGridProps } from './types';
31
- import { convertSqlFiltersToConditions } from './helpers';
32
- import { isColumnVisible } from '../DataGrid/helpers';
33
-
34
- export const SqlRequestDataGrid = <R,>({
35
- onSelectionChange: onSelectionChangeFromProps,
36
- rowKey,
37
- ref,
38
- ...props
39
- }: SqlRequestDataGridProps<R> & {
40
- ref?: Ref<DataGridRefProps<R>>;
41
- }) => {
42
- const currentRows = useRef<R[]>([]);
43
- const [rows, setRows] = useState<R[]>([]);
44
- const setRowsRef = useCallback<Dispatch<SetStateAction<R[]>>>((value) => {
45
- const newRows =
46
- typeof value === 'function' ? value(currentRows.current) : value;
47
- currentRows.current = newRows;
48
- setRows(newRows);
49
- }, []);
50
-
51
- const [start, setStart] = useState(0);
52
- const [length, setLength] = useState(-1);
53
- const [count, setCount] = useState(-1);
54
- const [sqlRequest, sqlIdRequest, sqlPartialRequest] = useSqlRequestHandler<R>(
55
- props.type
56
- );
57
- const gridRef = useRef<DataGridRefProps<R>>(null);
58
-
59
- const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
60
- {}
61
- );
62
- const [orderBy, setOrderBy] = useState<OrderByDTO[]>(
63
- Object.entries(props.initialSorts ?? {}).map(
64
- ([columnKey, direction]): OrderByDTO => {
65
- const column = props.columns.find((col) => col.key === columnKey);
66
- return {
67
- field: column?.field?.fieldAlias ?? columnKey,
68
- type: column?.type ?? 'text',
69
- direction: direction.toUpperCase() as 'ASC' | 'DESC',
70
- };
71
- }
72
- )
73
- );
74
-
75
- const [columns, visibleColumnsKeys] = useMemo(
76
- () => [
77
- [
78
- ...props.columns.filter((col) => !col.ignore).map((col) => col.key),
79
- ...(props.hiddenColumns ?? []),
80
- ],
81
- [
82
- ...props.columns
83
- .filter((col) => !col.ignore)
84
- .filter(isColumnVisible)
85
- .map((col) => col.key),
86
- ...(props.hiddenColumns ?? []),
87
- ],
88
- ],
89
- [props.columns, props.hiddenColumns]
90
- );
91
- const columnTypes = useMemo(
92
- () =>
93
- visibleColumnsKeys.map((key) =>
94
- String(props.columns.find((col) => col.key === key)?.type ?? 'text')
95
- ),
96
- [visibleColumnsKeys, props.columns]
97
- );
98
-
99
- const refresh = useCallback(() => {
100
- setRowsRef([]);
101
- setStart(0);
102
- setCount(-1);
103
- }, [setRowsRef]);
104
-
105
- const onFiltersChanged = useCallback(
106
- (filters: DataGridFilters) => {
107
- const newConditions = convertSqlFiltersToConditions(filters);
108
- setConditions(newConditions);
109
- refresh();
110
- },
111
- [refresh]
112
- );
113
-
114
- const onSortsChanged = useCallback(
115
- (sorts: Record<string, DataGridSort>) => {
116
- refresh();
117
- const newOrderBy = Object.entries(sorts).map(
118
- ([columnKey, direction]) =>
119
- ({
120
- field: columnKey,
121
- direction: direction.toUpperCase(),
122
- } as OrderByDTO)
123
- );
124
- setOrderBy(newOrderBy);
125
- },
126
- [refresh]
127
- );
128
-
129
- const loadRows = useRef(
130
- debounce(
131
- (
132
- columns: string[],
133
- returnColumns: string[],
134
- conditions: ConditionDTO[] = [],
135
- orderBy: OrderByDTO[] = [],
136
- start = 0,
137
- length = 0,
138
- getCount = false
139
- ) => {
140
- if (length > 0) {
141
- sqlRequest({
142
- columns: columns.includes(rowKey) ? columns : [...columns, rowKey],
143
- returnColumns: returnColumns.includes(rowKey)
144
- ? returnColumns
145
- : [...returnColumns, rowKey],
146
- columnTypes: columnTypes.includes(rowKey)
147
- ? columnTypes
148
- : [...columnTypes, rowKey],
149
- conditions,
150
- orderBy,
151
- start,
152
- length,
153
- getCount,
154
- }).then((response) => {
155
- if (getCount) {
156
- currentRows.current = Array(response.count).fill(null);
157
- if (getCount) setCount(response.count ?? 0);
158
- }
159
- const data = response.data ?? [];
160
- const rowsFromData = props.parser
161
- ? data.map(props.parser)
162
- : (data as R[]);
163
- const rowsToReplace = currentRows.current
164
- .slice(start, start + length)
165
- .map((row, i) => (!row ? rowsFromData[i] : row));
166
- currentRows.current.splice(start, length, ...rowsToReplace);
167
- setRowsRef([...currentRows.current]);
168
- });
169
- }
170
- },
171
- 100,
172
- {
173
- leading: true,
174
- trailing: true,
175
- }
176
- )
177
- );
178
-
179
- const loadFilterValues = useCallback(
180
- (columnKey: string) => {
181
- const column = props.columns.find((col) => col.key === columnKey);
182
- if (!column) {
183
- return Promise.resolve([]);
184
- }
185
- return sqlRequest({
186
- columns: columns,
187
- returnColumns: [columnKey],
188
- columnTypes: [column.type ?? 'text'],
189
- conditions: [
190
- ...(props.conditions ?? []),
191
- ...Object.values(_.pickBy(conditions, (_, key) => key !== columnKey)),
192
- ].filter((condition) => condition.field !== columnKey),
193
- orderBy: [
194
- {
195
- field:
196
- column.filterField ??
197
- column.field?.fieldAlias ??
198
- column.field?.fieldName ??
199
- columnKey,
200
- type: column.type ?? 'text',
201
- direction: 'ASC',
202
- },
203
- ],
204
- getCount: false,
205
- unique: true,
206
- }).then((response) =>
207
- response.data.map((row) => column.filter?.getter?.(row) ?? null)
208
- );
209
- },
210
- [columns, conditions, props.columns, props.conditions, sqlRequest]
211
- );
212
-
213
- useEffect(() => {
214
- if (
215
- (!rows.length && count < 0) ||
216
- rows.slice(start, start + length).some((row) => row === null)
217
- ) {
218
- loadRows.current(
219
- columns,
220
- visibleColumnsKeys,
221
- [...(props.conditions ?? []), ...(Object.values(conditions) ?? [])],
222
- orderBy,
223
- start,
224
- length,
225
- count < 0
226
- );
227
- }
228
- }, [
229
- props.columns,
230
- conditions,
231
- orderBy,
232
- start,
233
- length,
234
- count,
235
- props.conditions,
236
- columns,
237
- visibleColumnsKeys,
238
- rows,
239
- ]);
240
-
241
- const loadCopyRows = useCallback(
242
- () =>
243
- sqlRequest({
244
- columns: columns,
245
- returnColumns: visibleColumnsKeys,
246
- columnTypes,
247
- conditions: [
248
- ...(props.conditions ?? []),
249
- ...(Object.values(conditions) ?? []),
250
- ],
251
- orderBy,
252
- start: 0,
253
- length: count,
254
- }).then((response) =>
255
- props.parser ? response.data.map(props.parser) : (response.data as R[])
256
- ),
257
- [
258
- sqlRequest,
259
- columns,
260
- visibleColumnsKeys,
261
- columnTypes,
262
- props.conditions,
263
- props.parser,
264
- conditions,
265
- orderBy,
266
- count,
267
- ]
268
- );
269
-
270
- const loadAllIds = useCallback(
271
- () =>
272
- sqlIdRequest({
273
- columns: columns.includes(rowKey) ? columns : [...columns, rowKey],
274
- returnColumns: [rowKey],
275
- columnTypes: ['text'],
276
- conditions: [
277
- ...(props.conditions ?? []),
278
- ...(Object.values(conditions) ?? []),
279
- ],
280
- orderBy,
281
- start: 0,
282
- length: count,
283
- }).then((response) => map(response.data, rowKey)),
284
- [
285
- columns,
286
- conditions,
287
- count,
288
- orderBy,
289
- props.conditions,
290
- rowKey,
291
- sqlIdRequest,
292
- ]
293
- );
294
-
295
- const onVisibleRowsChanged = useCallback(
296
- (newStart: number, newLength: number) => {
297
- if (newStart !== start || newLength !== length) {
298
- setStart(newStart);
299
- setLength(newLength);
300
- }
301
- },
302
- [length, start]
303
- );
304
-
305
- const onSelectionChange = useCallback(
306
- (selectedKeys: string[]) => {
307
- onSelectionChangeFromProps?.(selectedKeys);
308
- },
309
- [onSelectionChangeFromProps]
310
- );
311
-
312
- /** FOOTERS */
313
- const [footers, setFooters] = useState<Record<string, string>>(
314
- props.initialFooters ?? {}
315
- );
316
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
317
- const [footerData, setFooterData] = useState<SqlRequestRow<any>>({});
318
-
319
- const loadFooters = useCallback(() => {
320
- if (Object.keys(footers).length === 0) {
321
- setFooterData({});
322
- } else {
323
- sqlPartialRequest({
324
- columns: columns.includes(rowKey) ? columns : [...columns, rowKey],
325
- returnColumns: [],
326
- columnTypes: [],
327
- totalColumns: footers as Record<string, SqlRequestFooterFunction>,
328
- conditions: [
329
- ...(props.conditions ?? []),
330
- ...(Object.values(conditions) ?? []),
331
- ],
332
- orderBy,
333
- }).then((response) => setFooterData(response.totals ?? {}));
334
- }
335
- }, [
336
- columns,
337
- conditions,
338
- footers,
339
- orderBy,
340
- props.conditions,
341
- rowKey,
342
- sqlPartialRequest,
343
- ]);
344
-
345
- useEffect(() => {
346
- loadFooters();
347
- }, [loadFooters]);
348
-
349
- const footerFunctions = useMemo(
350
- () =>
351
- !footerData
352
- ? {}
353
- : Object.entries(footers).reduce((acc, [columnKey, footerKey]) => {
354
- const column = props.columns.find((col) => col.key === columnKey);
355
- if (!column) {
356
- return acc;
357
- }
358
-
359
- const footerFunc =
360
- typeof column?.footer === 'function'
361
- ? column.footer
362
- : column?.footer?.[footerKey];
363
-
364
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
365
- const render: (value: any, row: any, column: any) => ReactNode =
366
- footerFunc
367
- ? // eslint-disable-next-line @typescript-eslint/no-explicit-any
368
- (value: any, data: any) => footerFunc([data], [], [])
369
- : column.render ?? ((value, row) => row);
370
-
371
- acc[columnKey] = () => render(null, footerData, column);
372
- return acc;
373
- }, {} as Record<string, DataGridFooterFunction<R>>),
374
- [footerData, footers, props.columns]
375
- );
376
-
377
- const contextOverride = useMemo<Partial<DataGridContextProps<R>>>(
378
- () => ({
379
- footers,
380
- setFooters,
381
- footerFunctions,
382
- rows,
383
- setRows: setRowsRef,
384
- }),
385
- [footerFunctions, footers, rows, setRowsRef]
386
- );
387
-
388
- useImperativeHandle(
389
- ref,
390
- () => ({
391
- refresh,
392
- setSelectedKeys: gridRef.current?.setSelectedKeys ?? (() => {}),
393
- addRows: gridRef.current?.addRows ?? (() => {}),
394
- }),
395
- [refresh]
396
- );
397
-
398
- return (
399
- <DataGrid
400
- ref={gridRef}
401
- onVisibleRowsChange={onVisibleRowsChanged}
402
- filter={false}
403
- sort={false}
404
- onFiltersChanged={onFiltersChanged}
405
- onSortsChanged={onSortsChanged}
406
- filterValuesLoader={loadFilterValues}
407
- rows={rows}
408
- loadCopyRows={loadCopyRows}
409
- refresh={refresh}
410
- onSelectionChange={onSelectionChange}
411
- getAllIds={loadAllIds}
412
- contextOverride={contextOverride}
413
- rowKey={rowKey}
414
- {...props}
415
- />
416
- );
417
- };
1
+ import {
2
+ ConditionDTO,
3
+ OrderByDTO,
4
+ SqlRequestFooterFunction,
5
+ SqlRequestRow,
6
+ useSqlRequestHandler,
7
+ } from '../../../services/sqlRequests';
8
+ import {
9
+ DataGridContextProps,
10
+ DataGridFilters,
11
+ DataGridFooterFunction,
12
+ DataGridRefProps,
13
+ DataGridSort,
14
+ } from '../DataGrid/types';
15
+ import {
16
+ Dispatch,
17
+ ReactNode,
18
+ Ref,
19
+ SetStateAction,
20
+ useCallback,
21
+ useEffect,
22
+ useImperativeHandle,
23
+ useMemo,
24
+ useRef,
25
+ useState,
26
+ } from 'react';
27
+ import _, { debounce, map } from 'lodash';
28
+
29
+ import { DataGrid } from '../DataGrid';
30
+ import { SqlRequestDataGridProps } from './types';
31
+ import { convertSqlFiltersToConditions } from './helpers';
32
+ import { isColumnVisible } from '../DataGrid/helpers';
33
+
34
+ export const SqlRequestDataGrid = <R,>({
35
+ onSelectionChange: onSelectionChangeFromProps,
36
+ rowKey,
37
+ ref,
38
+ ...props
39
+ }: SqlRequestDataGridProps<R> & {
40
+ ref?: Ref<DataGridRefProps<R>>;
41
+ }) => {
42
+ const currentRows = useRef<R[]>([]);
43
+ const [rows, setRows] = useState<R[]>([]);
44
+ const setRowsRef = useCallback<Dispatch<SetStateAction<R[]>>>((value) => {
45
+ const newRows =
46
+ typeof value === 'function' ? value(currentRows.current) : value;
47
+ currentRows.current = newRows;
48
+ setRows(newRows);
49
+ }, []);
50
+
51
+ const [start, setStart] = useState(0);
52
+ const [length, setLength] = useState(-1);
53
+ const [count, setCount] = useState(-1);
54
+ const [sqlRequest, sqlIdRequest, sqlPartialRequest] = useSqlRequestHandler<R>(
55
+ props.type
56
+ );
57
+ const gridRef = useRef<DataGridRefProps<R>>(null);
58
+
59
+ const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
60
+ {}
61
+ );
62
+ const [orderBy, setOrderBy] = useState<OrderByDTO[]>(
63
+ Object.entries(props.initialSorts ?? {}).map(
64
+ ([columnKey, direction]): OrderByDTO => {
65
+ const column = props.columns.find((col) => col.key === columnKey);
66
+ return {
67
+ field: column?.field?.fieldAlias ?? columnKey,
68
+ type: column?.type ?? 'text',
69
+ direction: direction.toUpperCase() as 'ASC' | 'DESC',
70
+ };
71
+ }
72
+ )
73
+ );
74
+
75
+ const [columns, visibleColumnsKeys] = useMemo(
76
+ () => [
77
+ [
78
+ ...props.columns.filter((col) => !col.ignore).map((col) => col.key),
79
+ ...(props.hiddenColumns ?? []),
80
+ ],
81
+ [
82
+ ...props.columns
83
+ .filter((col) => !col.ignore)
84
+ .filter(isColumnVisible)
85
+ .map((col) => col.key),
86
+ ...(props.hiddenColumns ?? []),
87
+ ],
88
+ ],
89
+ [props.columns, props.hiddenColumns]
90
+ );
91
+ const columnTypes = useMemo(
92
+ () =>
93
+ visibleColumnsKeys.map((key) =>
94
+ String(props.columns.find((col) => col.key === key)?.type ?? 'text')
95
+ ),
96
+ [visibleColumnsKeys, props.columns]
97
+ );
98
+
99
+ const refresh = useCallback(() => {
100
+ setRowsRef([]);
101
+ setStart(0);
102
+ setCount(-1);
103
+ }, [setRowsRef]);
104
+
105
+ const onFiltersChanged = useCallback(
106
+ (filters: DataGridFilters) => {
107
+ const newConditions = convertSqlFiltersToConditions(filters);
108
+ setConditions(newConditions);
109
+ refresh();
110
+ },
111
+ [refresh]
112
+ );
113
+
114
+ const onSortsChanged = useCallback(
115
+ (sorts: Record<string, DataGridSort>) => {
116
+ refresh();
117
+ const newOrderBy = Object.entries(sorts).map(
118
+ ([columnKey, direction]) =>
119
+ ({
120
+ field: columnKey,
121
+ direction: direction.toUpperCase(),
122
+ } as OrderByDTO)
123
+ );
124
+ setOrderBy(newOrderBy);
125
+ },
126
+ [refresh]
127
+ );
128
+
129
+ const loadRows = useRef(
130
+ debounce(
131
+ (
132
+ columns: string[],
133
+ returnColumns: string[],
134
+ conditions: ConditionDTO[] = [],
135
+ orderBy: OrderByDTO[] = [],
136
+ start = 0,
137
+ length = 0,
138
+ getCount = false
139
+ ) => {
140
+ if (length > 0) {
141
+ sqlRequest({
142
+ columns: columns.includes(rowKey) ? columns : [...columns, rowKey],
143
+ returnColumns: returnColumns.includes(rowKey)
144
+ ? returnColumns
145
+ : [...returnColumns, rowKey],
146
+ columnTypes: columnTypes.includes(rowKey)
147
+ ? columnTypes
148
+ : [...columnTypes, rowKey],
149
+ conditions,
150
+ orderBy,
151
+ start,
152
+ length,
153
+ getCount,
154
+ }).then((response) => {
155
+ if (getCount) {
156
+ currentRows.current = Array(response.count).fill(null);
157
+ if (getCount) setCount(response.count ?? 0);
158
+ }
159
+ const data = response.data ?? [];
160
+ const rowsFromData = props.parser
161
+ ? data.map(props.parser)
162
+ : (data as R[]);
163
+ const rowsToReplace = currentRows.current
164
+ .slice(start, start + length)
165
+ .map((row, i) => (!row ? rowsFromData[i] : row));
166
+ currentRows.current.splice(start, length, ...rowsToReplace);
167
+ setRowsRef([...currentRows.current]);
168
+ });
169
+ }
170
+ },
171
+ 100,
172
+ {
173
+ leading: true,
174
+ trailing: true,
175
+ }
176
+ )
177
+ );
178
+
179
+ const loadFilterValues = useCallback(
180
+ (columnKey: string) => {
181
+ const column = props.columns.find((col) => col.key === columnKey);
182
+ if (!column) {
183
+ return Promise.resolve([]);
184
+ }
185
+ return sqlRequest({
186
+ columns: columns,
187
+ returnColumns: [columnKey],
188
+ columnTypes: [column.type ?? 'text'],
189
+ conditions: [
190
+ ...(props.conditions ?? []),
191
+ ...Object.values(_.pickBy(conditions, (_, key) => key !== columnKey)),
192
+ ].filter((condition) => condition.field !== columnKey),
193
+ orderBy: [
194
+ {
195
+ field:
196
+ column.filterField ??
197
+ column.field?.fieldAlias ??
198
+ column.field?.fieldName ??
199
+ columnKey,
200
+ type: column.type ?? 'text',
201
+ direction: 'ASC',
202
+ },
203
+ ],
204
+ getCount: false,
205
+ unique: true,
206
+ }).then((response) =>
207
+ response.data.map((row) => column.filter?.getter?.(row) ?? null)
208
+ );
209
+ },
210
+ [columns, conditions, props.columns, props.conditions, sqlRequest]
211
+ );
212
+
213
+ useEffect(() => {
214
+ if (
215
+ (!rows.length && count < 0) ||
216
+ rows.slice(start, start + length).some((row) => row === null)
217
+ ) {
218
+ loadRows.current(
219
+ columns,
220
+ visibleColumnsKeys,
221
+ [...(props.conditions ?? []), ...(Object.values(conditions) ?? [])],
222
+ orderBy,
223
+ start,
224
+ length,
225
+ count < 0
226
+ );
227
+ }
228
+ }, [
229
+ props.columns,
230
+ conditions,
231
+ orderBy,
232
+ start,
233
+ length,
234
+ count,
235
+ props.conditions,
236
+ columns,
237
+ visibleColumnsKeys,
238
+ rows,
239
+ ]);
240
+
241
+ const loadCopyRows = useCallback(
242
+ () =>
243
+ sqlRequest({
244
+ columns: columns,
245
+ returnColumns: visibleColumnsKeys,
246
+ columnTypes,
247
+ conditions: [
248
+ ...(props.conditions ?? []),
249
+ ...(Object.values(conditions) ?? []),
250
+ ],
251
+ orderBy,
252
+ start: 0,
253
+ length: count,
254
+ }).then((response) =>
255
+ props.parser ? response.data.map(props.parser) : (response.data as R[])
256
+ ),
257
+ [
258
+ sqlRequest,
259
+ columns,
260
+ visibleColumnsKeys,
261
+ columnTypes,
262
+ props.conditions,
263
+ props.parser,
264
+ conditions,
265
+ orderBy,
266
+ count,
267
+ ]
268
+ );
269
+
270
+ const loadAllIds = useCallback(
271
+ () =>
272
+ sqlIdRequest({
273
+ columns: columns.includes(rowKey) ? columns : [...columns, rowKey],
274
+ returnColumns: [rowKey],
275
+ columnTypes: ['text'],
276
+ conditions: [
277
+ ...(props.conditions ?? []),
278
+ ...(Object.values(conditions) ?? []),
279
+ ],
280
+ orderBy,
281
+ start: 0,
282
+ length: count,
283
+ }).then((response) => map(response.data, rowKey)),
284
+ [
285
+ columns,
286
+ conditions,
287
+ count,
288
+ orderBy,
289
+ props.conditions,
290
+ rowKey,
291
+ sqlIdRequest,
292
+ ]
293
+ );
294
+
295
+ const onVisibleRowsChanged = useCallback(
296
+ (newStart: number, newLength: number) => {
297
+ if (newStart !== start || newLength !== length) {
298
+ setStart(newStart);
299
+ setLength(newLength);
300
+ }
301
+ },
302
+ [length, start]
303
+ );
304
+
305
+ const onSelectionChange = useCallback(
306
+ (selectedKeys: string[]) => {
307
+ onSelectionChangeFromProps?.(selectedKeys);
308
+ },
309
+ [onSelectionChangeFromProps]
310
+ );
311
+
312
+ /** FOOTERS */
313
+ const [footers, setFooters] = useState<Record<string, string>>(
314
+ props.initialFooters ?? {}
315
+ );
316
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
317
+ const [footerData, setFooterData] = useState<SqlRequestRow<any>>({});
318
+
319
+ const loadFooters = useCallback(() => {
320
+ if (Object.keys(footers).length === 0) {
321
+ setFooterData({});
322
+ } else {
323
+ sqlPartialRequest({
324
+ columns: columns.includes(rowKey) ? columns : [...columns, rowKey],
325
+ returnColumns: [],
326
+ columnTypes: [],
327
+ totalColumns: footers as Record<string, SqlRequestFooterFunction>,
328
+ conditions: [
329
+ ...(props.conditions ?? []),
330
+ ...(Object.values(conditions) ?? []),
331
+ ],
332
+ orderBy,
333
+ }).then((response) => setFooterData(response.totals ?? {}));
334
+ }
335
+ }, [
336
+ columns,
337
+ conditions,
338
+ footers,
339
+ orderBy,
340
+ props.conditions,
341
+ rowKey,
342
+ sqlPartialRequest,
343
+ ]);
344
+
345
+ useEffect(() => {
346
+ loadFooters();
347
+ }, [loadFooters]);
348
+
349
+ const footerFunctions = useMemo(
350
+ () =>
351
+ !footerData
352
+ ? {}
353
+ : Object.entries(footers).reduce((acc, [columnKey, footerKey]) => {
354
+ const column = props.columns.find((col) => col.key === columnKey);
355
+ if (!column) {
356
+ return acc;
357
+ }
358
+
359
+ const footerFunc =
360
+ typeof column?.footer === 'function'
361
+ ? column.footer
362
+ : column?.footer?.[footerKey];
363
+
364
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
365
+ const render: (value: any, row: any, column: any) => ReactNode =
366
+ footerFunc
367
+ ? // eslint-disable-next-line @typescript-eslint/no-explicit-any
368
+ (value: any, data: any) => footerFunc([data], [], [])
369
+ : column.render ?? ((value, row) => row);
370
+
371
+ acc[columnKey] = () => render(null, footerData, column);
372
+ return acc;
373
+ }, {} as Record<string, DataGridFooterFunction<R>>),
374
+ [footerData, footers, props.columns]
375
+ );
376
+
377
+ const contextOverride = useMemo<Partial<DataGridContextProps<R>>>(
378
+ () => ({
379
+ footers,
380
+ setFooters,
381
+ footerFunctions,
382
+ rows,
383
+ setRows: setRowsRef,
384
+ }),
385
+ [footerFunctions, footers, rows, setRowsRef]
386
+ );
387
+
388
+ useImperativeHandle(
389
+ ref,
390
+ () => ({
391
+ refresh,
392
+ setSelectedKeys: gridRef.current?.setSelectedKeys ?? (() => {}),
393
+ addRows: gridRef.current?.addRows ?? (() => {}),
394
+ }),
395
+ [refresh]
396
+ );
397
+
398
+ return (
399
+ <DataGrid
400
+ ref={gridRef}
401
+ onVisibleRowsChange={onVisibleRowsChanged}
402
+ filter={false}
403
+ sort={false}
404
+ onFiltersChanged={onFiltersChanged}
405
+ onSortsChanged={onSortsChanged}
406
+ filterValuesLoader={loadFilterValues}
407
+ rows={rows}
408
+ loadCopyRows={loadCopyRows}
409
+ refresh={refresh}
410
+ onSelectionChange={onSelectionChange}
411
+ getAllIds={loadAllIds}
412
+ contextOverride={contextOverride}
413
+ rowKey={rowKey}
414
+ {...props}
415
+ />
416
+ );
417
+ };