@addev-be/ui 1.0.0 → 1.0.2

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