@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,315 +1,315 @@
1
- import * as styles from './styles';
2
-
3
- import {
4
- ConditionDTO,
5
- OrderByDTO,
6
- useSqlRequestHandler,
7
- } from '../../../services/sqlRequests';
8
- import {
9
- ForwardedRef,
10
- forwardRef,
11
- useCallback,
12
- useEffect,
13
- useImperativeHandle,
14
- useMemo,
15
- useRef,
16
- useState,
17
- } from 'react';
18
- import {
19
- SqlRequestGridFilters,
20
- SqlRequestGridProps,
21
- SqlRequestGridRefProps,
22
- } from './types';
23
- import { debounce, pickBy } from 'lodash';
24
-
25
- import { DataGridSort } from '../DataGrid/types';
26
- import { FilterFullIcon } from '../../../Icons';
27
- import { FiltersSidebar } from './filters/FiltersSidebar';
28
- import { IconButton } from '../../forms';
29
- import { VirtualScroller } from '../VirtualScroller';
30
- import { convertSqlFiltersToConditions } from './helpers';
31
- import { isColumnVisible } from '../DataGrid/helpers';
32
- import { useDataGrid } from '../DataGrid/hooks';
33
-
34
- export const SqlRequestGridInner = <R, P extends object = {}>(
35
- allProps: SqlRequestGridProps<R, P>,
36
- ref: ForwardedRef<SqlRequestGridRefProps>
37
- ) => {
38
- const {
39
- rowHeight = styles.DEFAULT_ROW_HEIGHT,
40
- itemsPerRow,
41
- itemTemplate,
42
- itemProps,
43
- gap,
44
- ...props
45
- } = allProps;
46
- const currentRows = useRef<R[]>([]);
47
- const [rows, setRows] = useState<R[]>([]);
48
- const [start, setStart] = useState(0);
49
- const [length, setLength] = useState(-1);
50
- const [count, setCount] = useState(-1);
51
- const [sqlRequest] = useSqlRequestHandler<R>(props.type);
52
- const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
53
- {}
54
- );
55
- const [orderBy, setOrderBy] = useState<OrderByDTO[]>(
56
- Object.entries(props.initialSorts ?? {}).map(
57
- ([columnKey, direction]): OrderByDTO => {
58
- const field = props.fields.find((field) => field.key === columnKey);
59
- return {
60
- field: field?.field?.fieldAlias ?? columnKey,
61
- type: field?.type ?? 'text',
62
- direction: direction.toUpperCase() as 'ASC' | 'DESC',
63
- };
64
- }
65
- )
66
- );
67
-
68
- const [columnsKeys, visibleColumnsKeys] = useMemo(
69
- () => [
70
- [
71
- ...props.fields
72
- .filter((field) => !field.ignore)
73
- .map((field) => field.key),
74
- ...(props.additionalFields ?? []),
75
- ],
76
- [
77
- ...props.fields
78
- .filter((field) => !field.ignore)
79
- .filter(isColumnVisible)
80
- .map((field) => field.key),
81
- ...(props.additionalFields ?? []),
82
- ],
83
- ],
84
- [props.fields, props.additionalFields]
85
- );
86
- const columnTypes = useMemo(
87
- () =>
88
- visibleColumnsKeys.map((key) =>
89
- String(props.fields.find((field) => field.key === key)?.type ?? 'text')
90
- ),
91
- [visibleColumnsKeys, props.fields]
92
- );
93
-
94
- const loadRows = useRef(
95
- debounce(
96
- (
97
- columns: string[],
98
- returnColumns: string[],
99
- conditions: ConditionDTO[] = [],
100
- orderBy: OrderByDTO[] = [],
101
- start = 0,
102
- length = 100,
103
- getCount = false
104
- ) => {
105
- if (length > 0) {
106
- sqlRequest({
107
- columns: columns.includes('Id') ? columns : [...columns, 'Id'],
108
- returnColumns: returnColumns.includes('Id')
109
- ? returnColumns
110
- : [...returnColumns, 'Id'],
111
- columnTypes: columnTypes.includes('Id')
112
- ? columnTypes
113
- : [...columnTypes, 'Id'],
114
- conditions,
115
- orderBy,
116
- start,
117
- length,
118
- getCount,
119
- }).then((response) => {
120
- if (getCount) {
121
- currentRows.current = Array(response.count).fill(null);
122
- if (getCount) setCount(response.count ?? 0);
123
- }
124
- const data = response.data ?? [];
125
- const parsedRows = props.parser
126
- ? data.map(props.parser)
127
- : (data as R[]);
128
- currentRows.current.splice(start, length, ...parsedRows);
129
- setRows([...currentRows.current]);
130
- });
131
- }
132
- },
133
- 100,
134
- {
135
- leading: true,
136
- trailing: true,
137
- }
138
- )
139
- );
140
-
141
- const refresh = useCallback(() => {
142
- setRows([]);
143
- setStart(0);
144
- setCount(-1);
145
- }, []);
146
-
147
- const onFiltersChanged = useCallback(
148
- (filters: SqlRequestGridFilters) => {
149
- const newConditions = convertSqlFiltersToConditions(filters);
150
- setConditions(newConditions);
151
- refresh();
152
- },
153
- [refresh]
154
- );
155
-
156
- const onSortsChanged = useCallback(
157
- (sorts: Record<string, DataGridSort>) => {
158
- refresh();
159
- const newOrderBy = Object.entries(sorts).map(
160
- ([columnKey, direction]) =>
161
- ({
162
- field: columnKey,
163
- direction: direction.toUpperCase(),
164
- } as OrderByDTO)
165
- );
166
- setOrderBy(newOrderBy);
167
- },
168
- [refresh]
169
- );
170
-
171
- const loadFilterValues = useCallback(
172
- (columnKey: string) => {
173
- const field = props.fields.find((field) => field.key === columnKey);
174
- if (!field) return Promise.resolve([]);
175
- return sqlRequest({
176
- columns: columnsKeys,
177
- returnColumns: [columnKey],
178
- // columnTypes: [field.type ?? 'text'],
179
- conditions: [
180
- ...(props.conditions ?? []),
181
- ...Object.values(pickBy(conditions, (_, key) => key !== columnKey)),
182
- ].filter((condition) => condition.field !== columnKey),
183
- orderBy: [
184
- {
185
- field:
186
- field.filterField ??
187
- field.field?.fieldAlias ??
188
- field.field?.fieldName ??
189
- columnKey,
190
- type: field.type ?? 'text',
191
- direction: 'ASC',
192
- },
193
- ],
194
- getCount: false,
195
- unique: true,
196
- }).then((response) =>
197
- response.data.map((row) => field.filter?.getter?.(row) ?? null)
198
- );
199
- },
200
- [columnsKeys, conditions, props.fields, props.conditions, sqlRequest]
201
- );
202
-
203
- useEffect(() => {
204
- if (
205
- (!rows.length && count < 0) ||
206
- rows.slice(start, start + length).some((row) => row === null)
207
- ) {
208
- loadRows.current(
209
- columnsKeys,
210
- visibleColumnsKeys,
211
- [...(props.conditions ?? []), ...Object.values(conditions)],
212
- orderBy,
213
- start,
214
- length,
215
- count < 0
216
- );
217
- }
218
- }, [
219
- props.fields,
220
- start,
221
- length,
222
- count,
223
- conditions,
224
- columnsKeys,
225
- visibleColumnsKeys,
226
- rows,
227
- orderBy,
228
- props.conditions,
229
- ]);
230
-
231
- const onVisibleRowsChanged = useCallback(
232
- (newStart: number, newLength: number) => {
233
- if (newStart !== start || newLength !== length) {
234
- setStart(newStart);
235
- setLength(newLength);
236
- }
237
- },
238
- [length, start]
239
- );
240
-
241
- useImperativeHandle(
242
- ref,
243
- () => ({
244
- refresh,
245
- }),
246
- [refresh]
247
- );
248
-
249
- const [contextProps, DataGridContext] = useDataGrid({
250
- columns: props.fields,
251
- rows,
252
- onFiltersChanged,
253
- filterValuesLoader: loadFilterValues,
254
- onSortsChanged,
255
- onSelectionChange: () => {},
256
- onSelectedRowsChanged: () => {},
257
- selectable: false,
258
- rowKey: '',
259
- filter: false,
260
- sort: false,
261
- });
262
-
263
- const [sidebarVisible, setSidebarVisible] = useState(false);
264
- const onSidebarClose = useCallback(() => {
265
- setSidebarVisible(false);
266
- }, []);
267
- const onClearFilters = useCallback(() => {
268
- onFiltersChanged({});
269
- setSidebarVisible(false);
270
- }, [onFiltersChanged]);
271
-
272
- return (
273
- <DataGridContext.Provider value={contextProps}>
274
- <styles.SqlRequestGridContainer>
275
- {sidebarVisible ? (
276
- <>
277
- <FiltersSidebar
278
- props={allProps}
279
- context={DataGridContext}
280
- onClose={onSidebarClose}
281
- onClearFilters={onClearFilters}
282
- />
283
- </>
284
- ) : (
285
- <IconButton
286
- size="large"
287
- onClick={() => setSidebarVisible(true)}
288
- icon={FilterFullIcon}
289
- color="primary"
290
- rounded
291
- style={{
292
- position: 'absolute',
293
- bottom: 'var(--space-2)',
294
- right: 'var(--space-2)',
295
- zIndex: 1,
296
- }}
297
- />
298
- )}
299
-
300
- <VirtualScroller
301
- gridTemplateColumns={`repeat(${itemsPerRow}, 1fr)`}
302
- items={rows}
303
- itemTemplate={itemTemplate}
304
- itemsPerRow={itemsPerRow}
305
- itemProps={itemProps}
306
- rowHeightInPx={rowHeight}
307
- onRangeChanged={onVisibleRowsChanged}
308
- gap={gap}
309
- />
310
- </styles.SqlRequestGridContainer>
311
- </DataGridContext.Provider>
312
- );
313
- };
314
-
315
- export const SqlRequestGrid = forwardRef(SqlRequestGridInner);
1
+ import * as styles from './styles';
2
+
3
+ import {
4
+ ConditionDTO,
5
+ OrderByDTO,
6
+ useSqlRequestHandler,
7
+ } from '../../../services/sqlRequests';
8
+ import {
9
+ ForwardedRef,
10
+ forwardRef,
11
+ useCallback,
12
+ useEffect,
13
+ useImperativeHandle,
14
+ useMemo,
15
+ useRef,
16
+ useState,
17
+ } from 'react';
18
+ import {
19
+ SqlRequestGridFilters,
20
+ SqlRequestGridProps,
21
+ SqlRequestGridRefProps,
22
+ } from './types';
23
+ import { debounce, pickBy } from 'lodash';
24
+
25
+ import { DataGridSort } from '../DataGrid/types';
26
+ import { FilterFullIcon } from '../../../Icons';
27
+ import { FiltersSidebar } from './filters/FiltersSidebar';
28
+ import { IconButton } from '../../forms';
29
+ import { VirtualScroller } from '../VirtualScroller';
30
+ import { convertSqlFiltersToConditions } from './helpers';
31
+ import { isColumnVisible } from '../DataGrid/helpers';
32
+ import { useDataGrid } from '../DataGrid/hooks';
33
+
34
+ export const SqlRequestGridInner = <R, P extends object = {}>(
35
+ allProps: SqlRequestGridProps<R, P>,
36
+ ref: ForwardedRef<SqlRequestGridRefProps>
37
+ ) => {
38
+ const {
39
+ rowHeight = styles.DEFAULT_ROW_HEIGHT,
40
+ itemsPerRow,
41
+ itemTemplate,
42
+ itemProps,
43
+ gap,
44
+ ...props
45
+ } = allProps;
46
+ const currentRows = useRef<R[]>([]);
47
+ const [rows, setRows] = useState<R[]>([]);
48
+ const [start, setStart] = useState(0);
49
+ const [length, setLength] = useState(-1);
50
+ const [count, setCount] = useState(-1);
51
+ const [sqlRequest] = useSqlRequestHandler<R>(props.type);
52
+ const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
53
+ {}
54
+ );
55
+ const [orderBy, setOrderBy] = useState<OrderByDTO[]>(
56
+ Object.entries(props.initialSorts ?? {}).map(
57
+ ([columnKey, direction]): OrderByDTO => {
58
+ const field = props.fields.find((field) => field.key === columnKey);
59
+ return {
60
+ field: field?.field?.fieldAlias ?? columnKey,
61
+ type: field?.type ?? 'text',
62
+ direction: direction.toUpperCase() as 'ASC' | 'DESC',
63
+ };
64
+ }
65
+ )
66
+ );
67
+
68
+ const [columnsKeys, visibleColumnsKeys] = useMemo(
69
+ () => [
70
+ [
71
+ ...props.fields
72
+ .filter((field) => !field.ignore)
73
+ .map((field) => field.key),
74
+ ...(props.additionalFields ?? []),
75
+ ],
76
+ [
77
+ ...props.fields
78
+ .filter((field) => !field.ignore)
79
+ .filter(isColumnVisible)
80
+ .map((field) => field.key),
81
+ ...(props.additionalFields ?? []),
82
+ ],
83
+ ],
84
+ [props.fields, props.additionalFields]
85
+ );
86
+ const columnTypes = useMemo(
87
+ () =>
88
+ visibleColumnsKeys.map((key) =>
89
+ String(props.fields.find((field) => field.key === key)?.type ?? 'text')
90
+ ),
91
+ [visibleColumnsKeys, props.fields]
92
+ );
93
+
94
+ const loadRows = useRef(
95
+ debounce(
96
+ (
97
+ columns: string[],
98
+ returnColumns: string[],
99
+ conditions: ConditionDTO[] = [],
100
+ orderBy: OrderByDTO[] = [],
101
+ start = 0,
102
+ length = 100,
103
+ getCount = false
104
+ ) => {
105
+ if (length > 0) {
106
+ sqlRequest({
107
+ columns: columns.includes('Id') ? columns : [...columns, 'Id'],
108
+ returnColumns: returnColumns.includes('Id')
109
+ ? returnColumns
110
+ : [...returnColumns, 'Id'],
111
+ columnTypes: columnTypes.includes('Id')
112
+ ? columnTypes
113
+ : [...columnTypes, 'Id'],
114
+ conditions,
115
+ orderBy,
116
+ start,
117
+ length,
118
+ getCount,
119
+ }).then((response) => {
120
+ if (getCount) {
121
+ currentRows.current = Array(response.count).fill(null);
122
+ if (getCount) setCount(response.count ?? 0);
123
+ }
124
+ const data = response.data ?? [];
125
+ const parsedRows = props.parser
126
+ ? data.map(props.parser)
127
+ : (data as R[]);
128
+ currentRows.current.splice(start, length, ...parsedRows);
129
+ setRows([...currentRows.current]);
130
+ });
131
+ }
132
+ },
133
+ 100,
134
+ {
135
+ leading: true,
136
+ trailing: true,
137
+ }
138
+ )
139
+ );
140
+
141
+ const refresh = useCallback(() => {
142
+ setRows([]);
143
+ setStart(0);
144
+ setCount(-1);
145
+ }, []);
146
+
147
+ const onFiltersChanged = useCallback(
148
+ (filters: SqlRequestGridFilters) => {
149
+ const newConditions = convertSqlFiltersToConditions(filters);
150
+ setConditions(newConditions);
151
+ refresh();
152
+ },
153
+ [refresh]
154
+ );
155
+
156
+ const onSortsChanged = useCallback(
157
+ (sorts: Record<string, DataGridSort>) => {
158
+ refresh();
159
+ const newOrderBy = Object.entries(sorts).map(
160
+ ([columnKey, direction]) =>
161
+ ({
162
+ field: columnKey,
163
+ direction: direction.toUpperCase(),
164
+ } as OrderByDTO)
165
+ );
166
+ setOrderBy(newOrderBy);
167
+ },
168
+ [refresh]
169
+ );
170
+
171
+ const loadFilterValues = useCallback(
172
+ (columnKey: string) => {
173
+ const field = props.fields.find((field) => field.key === columnKey);
174
+ if (!field) return Promise.resolve([]);
175
+ return sqlRequest({
176
+ columns: columnsKeys,
177
+ returnColumns: [columnKey],
178
+ // columnTypes: [field.type ?? 'text'],
179
+ conditions: [
180
+ ...(props.conditions ?? []),
181
+ ...Object.values(pickBy(conditions, (_, key) => key !== columnKey)),
182
+ ].filter((condition) => condition.field !== columnKey),
183
+ orderBy: [
184
+ {
185
+ field:
186
+ field.filterField ??
187
+ field.field?.fieldAlias ??
188
+ field.field?.fieldName ??
189
+ columnKey,
190
+ type: field.type ?? 'text',
191
+ direction: 'ASC',
192
+ },
193
+ ],
194
+ getCount: false,
195
+ unique: true,
196
+ }).then((response) =>
197
+ response.data.map((row) => field.filter?.getter?.(row) ?? null)
198
+ );
199
+ },
200
+ [columnsKeys, conditions, props.fields, props.conditions, sqlRequest]
201
+ );
202
+
203
+ useEffect(() => {
204
+ if (
205
+ (!rows.length && count < 0) ||
206
+ rows.slice(start, start + length).some((row) => row === null)
207
+ ) {
208
+ loadRows.current(
209
+ columnsKeys,
210
+ visibleColumnsKeys,
211
+ [...(props.conditions ?? []), ...Object.values(conditions)],
212
+ orderBy,
213
+ start,
214
+ length,
215
+ count < 0
216
+ );
217
+ }
218
+ }, [
219
+ props.fields,
220
+ start,
221
+ length,
222
+ count,
223
+ conditions,
224
+ columnsKeys,
225
+ visibleColumnsKeys,
226
+ rows,
227
+ orderBy,
228
+ props.conditions,
229
+ ]);
230
+
231
+ const onVisibleRowsChanged = useCallback(
232
+ (newStart: number, newLength: number) => {
233
+ if (newStart !== start || newLength !== length) {
234
+ setStart(newStart);
235
+ setLength(newLength);
236
+ }
237
+ },
238
+ [length, start]
239
+ );
240
+
241
+ useImperativeHandle(
242
+ ref,
243
+ () => ({
244
+ refresh,
245
+ }),
246
+ [refresh]
247
+ );
248
+
249
+ const [contextProps, DataGridContext] = useDataGrid({
250
+ columns: props.fields,
251
+ rows,
252
+ onFiltersChanged,
253
+ filterValuesLoader: loadFilterValues,
254
+ onSortsChanged,
255
+ onSelectionChange: () => {},
256
+ onSelectedRowsChanged: () => {},
257
+ selectable: false,
258
+ rowKey: '',
259
+ filter: false,
260
+ sort: false,
261
+ });
262
+
263
+ const [sidebarVisible, setSidebarVisible] = useState(false);
264
+ const onSidebarClose = useCallback(() => {
265
+ setSidebarVisible(false);
266
+ }, []);
267
+ const onClearFilters = useCallback(() => {
268
+ onFiltersChanged({});
269
+ setSidebarVisible(false);
270
+ }, [onFiltersChanged]);
271
+
272
+ return (
273
+ <DataGridContext.Provider value={contextProps}>
274
+ <styles.SqlRequestGridContainer>
275
+ {sidebarVisible ? (
276
+ <>
277
+ <FiltersSidebar
278
+ props={allProps}
279
+ context={DataGridContext}
280
+ onClose={onSidebarClose}
281
+ onClearFilters={onClearFilters}
282
+ />
283
+ </>
284
+ ) : (
285
+ <IconButton
286
+ size="large"
287
+ onClick={() => setSidebarVisible(true)}
288
+ icon={FilterFullIcon}
289
+ color="primary"
290
+ rounded
291
+ style={{
292
+ position: 'absolute',
293
+ bottom: 'var(--space-2)',
294
+ right: 'var(--space-2)',
295
+ zIndex: 1,
296
+ }}
297
+ />
298
+ )}
299
+
300
+ <VirtualScroller
301
+ gridTemplateColumns={`repeat(${itemsPerRow}, 1fr)`}
302
+ items={rows}
303
+ itemTemplate={itemTemplate}
304
+ itemsPerRow={itemsPerRow}
305
+ itemProps={itemProps}
306
+ rowHeightInPx={rowHeight}
307
+ onRangeChanged={onVisibleRowsChanged}
308
+ gap={gap}
309
+ />
310
+ </styles.SqlRequestGridContainer>
311
+ </DataGridContext.Provider>
312
+ );
313
+ };
314
+
315
+ export const SqlRequestGrid = forwardRef(SqlRequestGridInner);
@@ -1,20 +1,20 @@
1
- import { VirtualScrollerContainer } from '../VirtualScroller/styles';
2
- import styled from 'styled-components';
3
-
4
- export const DEFAULT_ROW_HEIGHT = 200;
5
-
6
- export const SqlRequestGridContainer = styled.div.attrs({
7
- className: 'SqlRequestGridContainer',
8
- })`
9
- height: 100%;
10
- width: 100%;
11
- overflow: auto;
12
- position: relative;
13
-
14
- ${VirtualScrollerContainer} {
15
- position: absolute;
16
- top: 0;
17
- left: 0;
18
- right: 0;
19
- }
20
- `;
1
+ import { VirtualScrollerContainer } from '../VirtualScroller/styles';
2
+ import styled from 'styled-components';
3
+
4
+ export const DEFAULT_ROW_HEIGHT = 200;
5
+
6
+ export const SqlRequestGridContainer = styled.div.attrs({
7
+ className: 'SqlRequestGridContainer',
8
+ })`
9
+ height: 100%;
10
+ width: 100%;
11
+ overflow: auto;
12
+ position: relative;
13
+
14
+ ${VirtualScrollerContainer} {
15
+ position: absolute;
16
+ top: 0;
17
+ left: 0;
18
+ right: 0;
19
+ }
20
+ `;