@addev-be/ui 2.1.2 → 2.1.3

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 (249) 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/table.svg +1 -1
  21. package/assets/icons/up.svg +1 -1
  22. package/assets/icons/user-tie.svg +1 -1
  23. package/assets/icons/x-bar.svg +3 -3
  24. package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.d.ts +1 -2
  25. package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.js +3 -2
  26. package/dist/components/data/SqlRequestDataGrid/helpers/columns.js +22 -10
  27. package/dist/services/index.js +7 -17
  28. package/eslint.config.js +3 -3
  29. package/package.json +2 -2
  30. package/src/Icons.tsx +138 -138
  31. package/src/components/auth/LoginForm.tsx +86 -86
  32. package/src/components/auth/LoginPage.tsx +32 -32
  33. package/src/components/auth/PasswordRecoveryForm.tsx +53 -53
  34. package/src/components/auth/PasswordResetForm.tsx +112 -112
  35. package/src/components/auth/styles.ts +14 -14
  36. package/src/components/data/DataGrid/DataGridCell.tsx +81 -81
  37. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +9 -9
  38. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +59 -59
  39. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +182 -182
  40. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +104 -104
  41. package/src/components/data/DataGrid/DataGridEditableCell/CheckboxEditableCell.tsx +37 -37
  42. package/src/components/data/DataGrid/DataGridEditableCell/DateEditableCell.tsx +38 -38
  43. package/src/components/data/DataGrid/DataGridEditableCell/NumberEditableCell.tsx +71 -71
  44. package/src/components/data/DataGrid/DataGridEditableCell/TextEditableCell.tsx +37 -37
  45. package/src/components/data/DataGrid/DataGridEditableCell/index.tsx +106 -106
  46. package/src/components/data/DataGrid/DataGridEditableCell/styles.ts +35 -35
  47. package/src/components/data/DataGrid/DataGridEditableCell/types.ts +18 -18
  48. package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +129 -129
  49. package/src/components/data/DataGrid/DataGridFilterMenu/helpers.ts +23 -23
  50. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +81 -81
  51. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +370 -370
  52. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +97 -97
  53. package/src/components/data/DataGrid/DataGridFooter.tsx +45 -45
  54. package/src/components/data/DataGrid/DataGridHeader.tsx +74 -74
  55. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +112 -112
  56. package/src/components/data/DataGrid/DataGridRowTemplate.tsx +83 -83
  57. package/src/components/data/DataGrid/DataGridToolbar.tsx +134 -134
  58. package/src/components/data/DataGrid/FilterModalContent/index.tsx +137 -137
  59. package/src/components/data/DataGrid/FilterModalContent/styles.ts +22 -22
  60. package/src/components/data/DataGrid/constants.ts +6 -6
  61. package/src/components/data/DataGrid/helpers/columns.tsx +452 -452
  62. package/src/components/data/DataGrid/helpers/filters.ts +287 -287
  63. package/src/components/data/DataGrid/helpers/index.ts +2 -2
  64. package/src/components/data/DataGrid/hooks/index.ts +29 -29
  65. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +380 -380
  66. package/src/components/data/DataGrid/hooks/useDataGridChangedRows.ts +97 -97
  67. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +174 -174
  68. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +48 -48
  69. package/src/components/data/DataGrid/hooks/useRefreshModal.tsx +48 -48
  70. package/src/components/data/DataGrid/index.tsx +111 -111
  71. package/src/components/data/DataGrid/styles.ts +430 -430
  72. package/src/components/data/DataGrid/types.ts +380 -380
  73. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +524 -504
  74. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +2 -2
  75. package/src/components/data/SqlRequestDataGrid/helpers/rows.ts +24 -24
  76. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +16 -16
  77. package/src/components/data/SqlRequestDataGrid/index.tsx +417 -417
  78. package/src/components/data/SqlRequestDataGrid/styles.ts +15 -15
  79. package/src/components/data/SqlRequestDataGrid/types.ts +74 -74
  80. package/src/components/data/SqlRequestForeignList/index.tsx +254 -254
  81. package/src/components/data/SqlRequestForeignList/styles.ts +43 -43
  82. package/src/components/data/SqlRequestForeignList/types.ts +32 -32
  83. package/src/components/data/SqlRequestGrid/filters/FiltersSidebar.tsx +108 -108
  84. package/src/components/data/SqlRequestGrid/filters/styles.ts +88 -88
  85. package/src/components/data/SqlRequestGrid/helpers/index.ts +1 -1
  86. package/src/components/data/SqlRequestGrid/helpers/sqlRequests.ts +16 -16
  87. package/src/components/data/SqlRequestGrid/index.tsx +314 -314
  88. package/src/components/data/SqlRequestGrid/styles.ts +20 -20
  89. package/src/components/data/SqlRequestGrid/types.ts +73 -73
  90. package/src/components/data/VirtualScroller/hooks.ts +71 -71
  91. package/src/components/data/VirtualScroller/index.tsx +89 -89
  92. package/src/components/data/VirtualScroller/styles.ts +57 -57
  93. package/src/components/data/VirtualScroller/types.ts +10 -10
  94. package/src/components/forms/AutoTextArea.tsx +48 -48
  95. package/src/components/forms/Button.tsx +132 -132
  96. package/src/components/forms/Form/Checkbox.tsx +12 -12
  97. package/src/components/forms/Form/CustomSelect.tsx +86 -86
  98. package/src/components/forms/Form/FormGroup.tsx +31 -31
  99. package/src/components/forms/Form/Input.tsx +16 -16
  100. package/src/components/forms/Form/Row.tsx +32 -32
  101. package/src/components/forms/Form/Select.tsx +82 -82
  102. package/src/components/forms/Form/TextArea.tsx +17 -17
  103. package/src/components/forms/Form/index.tsx +48 -48
  104. package/src/components/forms/Form/styles.ts +184 -184
  105. package/src/components/forms/IconButton.tsx +61 -61
  106. package/src/components/forms/IndeterminateCheckbox.tsx +46 -46
  107. package/src/components/forms/NumberInput.tsx +53 -53
  108. package/src/components/forms/Select.tsx +34 -34
  109. package/src/components/forms/VerticalLabel.tsx +20 -20
  110. package/src/components/forms/styles.ts +42 -42
  111. package/src/components/layout/Columns.ts +28 -28
  112. package/src/components/layout/Dropdown/index.tsx +113 -113
  113. package/src/components/layout/Dropdown/styles.ts +53 -53
  114. package/src/components/layout/Flexbox.ts +21 -21
  115. package/src/components/layout/Grid/index.tsx +8 -8
  116. package/src/components/layout/Grid/styles.ts +34 -34
  117. package/src/components/layout/Loading/index.tsx +29 -29
  118. package/src/components/layout/Loading/styles.ts +29 -29
  119. package/src/components/layout/Masonry/index.tsx +29 -29
  120. package/src/components/layout/Masonry/styles.ts +20 -20
  121. package/src/components/layout/Modal/index.tsx +51 -51
  122. package/src/components/layout/Modal/styles.ts +125 -125
  123. package/src/components/search/HighlightedText.tsx +41 -41
  124. package/src/components/search/QuickSearchBar.tsx +99 -99
  125. package/src/components/search/QuickSearchResults.tsx +86 -86
  126. package/src/components/search/styles.ts +96 -96
  127. package/src/components/search/types.ts +29 -29
  128. package/src/components/ui/Avatar/index.tsx +54 -54
  129. package/src/components/ui/Avatar/styles.ts +61 -61
  130. package/src/components/ui/Card/index.tsx +14 -14
  131. package/src/components/ui/Card/styles.ts +37 -37
  132. package/src/components/ui/ContextMenu/index.tsx +79 -79
  133. package/src/components/ui/ContextMenu/styles.ts +119 -119
  134. package/src/components/ui/Ellipsis.tsx +33 -33
  135. package/src/components/ui/Label.tsx +93 -93
  136. package/src/components/ui/Message/index.tsx +57 -57
  137. package/src/components/ui/Message/styles.ts +44 -44
  138. package/src/components/ui/TabsView/TabsList.tsx +44 -44
  139. package/src/components/ui/TabsView/TabsView.tsx +38 -38
  140. package/src/components/ui/TabsView/index.ts +3 -3
  141. package/src/components/ui/TabsView/styles.ts +76 -76
  142. package/src/components/ui/TabsView/types.ts +15 -15
  143. package/src/config/index.ts +10 -10
  144. package/src/helpers/components.ts +9 -9
  145. package/src/helpers/dates.ts +17 -17
  146. package/src/helpers/getScrollbarSize.ts +14 -14
  147. package/src/helpers/numbers.ts +63 -63
  148. package/src/helpers/responsive.ts +83 -83
  149. package/src/helpers/styled/space.ts +114 -114
  150. package/src/helpers/styled/typography.ts +25 -25
  151. package/src/helpers/text.ts +13 -13
  152. package/src/helpers/types.ts +9 -9
  153. package/src/hooks/useContainerMediaQuery.ts +7 -7
  154. package/src/hooks/useElementSize.ts +24 -24
  155. package/src/hooks/useMediaQuery.ts +9 -9
  156. package/src/hooks/useMediaQueryForWidth.ts +35 -35
  157. package/src/hooks/useMutableState.ts +25 -25
  158. package/src/hooks/useShowArchived.ts +28 -28
  159. package/src/hooks/useWindowSize.ts +20 -20
  160. package/src/index.ts +102 -102
  161. package/src/providers/AuthenticationProvider/helpers.ts +3 -3
  162. package/src/providers/AuthenticationProvider/index.tsx +303 -303
  163. package/src/providers/LoadingProvider/index.tsx +47 -47
  164. package/src/providers/PortalsProvider/index.tsx +54 -54
  165. package/src/providers/PortalsProvider/styles.ts +31 -31
  166. package/src/providers/SettingsProvider/index.tsx +70 -70
  167. package/src/providers/ThemeProvider/defaultTheme.ts +470 -470
  168. package/src/providers/ThemeProvider/helpers.ts +84 -84
  169. package/src/providers/ThemeProvider/index.ts +66 -66
  170. package/src/providers/ThemeProvider/types.ts +134 -134
  171. package/src/providers/ToastProvider/index.tsx +93 -93
  172. package/src/providers/TrackingProvider/hooks.ts +14 -14
  173. package/src/providers/TrackingProvider/index.tsx +71 -71
  174. package/src/providers/UiProviders/index.tsx +76 -76
  175. package/src/providers/UiProviders/styles.ts +10 -10
  176. package/src/providers/hooks.ts +14 -14
  177. package/src/services/HttpService.ts +92 -92
  178. package/src/services/WebSocketService.ts +155 -155
  179. package/src/services/advancedRequests.ts +102 -102
  180. package/src/services/base.ts +23 -23
  181. package/src/services/globalSearch.ts +32 -32
  182. package/src/services/hooks.ts +92 -92
  183. package/src/services/requests/auth.ts +44 -44
  184. package/src/services/requests/generic.ts +62 -62
  185. package/src/services/requests/tracking.ts +12 -12
  186. package/src/services/requests/userProfiles.ts +35 -35
  187. package/src/services/requests/users.ts +28 -28
  188. package/src/services/smartQueries.ts +122 -122
  189. package/src/services/sqlRequests.ts +111 -111
  190. package/src/services/types/auth.ts +98 -98
  191. package/src/services/types/base.ts +10 -10
  192. package/src/services/types/generic.ts +82 -82
  193. package/src/services/types/tracking.ts +29 -29
  194. package/src/services/types/userProfiles.ts +79 -79
  195. package/src/services/types/users.ts +74 -74
  196. package/src/services/updateSqlRequests.ts +32 -32
  197. package/src/styles/animations.scss +30 -30
  198. package/src/styles/index.scss +42 -42
  199. package/src/types.ts +8 -8
  200. package/src/typings.d.ts +2 -2
  201. package/tsconfig.json +18 -18
  202. package/dist/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.d.ts +0 -14
  203. package/dist/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.js +0 -77
  204. package/dist/components/data/AdvancedRequestDataGrid/helpers/columns.d.ts +0 -22
  205. package/dist/components/data/AdvancedRequestDataGrid/helpers/columns.js +0 -105
  206. package/dist/components/data/AdvancedRequestDataGrid/helpers/index.d.ts +0 -2
  207. package/dist/components/data/AdvancedRequestDataGrid/helpers/index.js +0 -18
  208. package/dist/components/data/AdvancedRequestDataGrid/index.d.ts +0 -2
  209. package/dist/components/data/AdvancedRequestDataGrid/index.js +0 -215
  210. package/dist/components/data/AdvancedRequestDataGrid/types.d.ts +0 -21
  211. package/dist/components/data/AdvancedRequestDataGrid/types.js +0 -2
  212. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.d.ts +0 -10
  213. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.js +0 -173
  214. package/dist/components/data/DataGrid/DataGridEditableCell.d.ts +0 -2
  215. package/dist/components/data/DataGrid/DataGridEditableCell.js +0 -27
  216. package/dist/components/data/DataGrid/FilterValuesScroller.d.ts +0 -13
  217. package/dist/components/data/DataGrid/FilterValuesScroller.js +0 -73
  218. package/dist/components/data/DataGrid/VirtualScroller.d.ts +0 -11
  219. package/dist/components/data/DataGrid/VirtualScroller.js +0 -41
  220. package/dist/components/data/DataGrid/helpers/advancedRequests.d.ts +0 -12
  221. package/dist/components/data/DataGrid/helpers/advancedRequests.js +0 -53
  222. package/dist/components/data/DataGrid/helpers.d.ts +0 -28
  223. package/dist/components/data/DataGrid/helpers.js +0 -436
  224. package/dist/components/data/SmartQueryDataGrid/helpers/columns.d.ts +0 -20
  225. package/dist/components/data/SmartQueryDataGrid/helpers/columns.js +0 -160
  226. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.d.ts +0 -5
  227. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.js +0 -41
  228. package/dist/components/data/SmartQueryDataGrid/helpers/index.d.ts +0 -2
  229. package/dist/components/data/SmartQueryDataGrid/helpers/index.js +0 -18
  230. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.d.ts +0 -3
  231. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.js +0 -15
  232. package/dist/components/data/SmartQueryDataGrid/hooks.d.ts +0 -9
  233. package/dist/components/data/SmartQueryDataGrid/hooks.js +0 -63
  234. package/dist/components/data/SmartQueryDataGrid/index.d.ts +0 -12
  235. package/dist/components/data/SmartQueryDataGrid/index.js +0 -242
  236. package/dist/components/data/SmartQueryDataGrid/types.d.ts +0 -22
  237. package/dist/components/data/SmartQueryDataGrid/types.js +0 -2
  238. package/dist/components/forms/Form/InputWithLabel.d.ts +0 -2
  239. package/dist/components/forms/Form/InputWithLabel.js +0 -10
  240. package/dist/components/forms/Form/types.d.ts +0 -7
  241. package/dist/components/forms/Form/types.js +0 -2
  242. package/dist/config/types.d.ts +0 -11
  243. package/dist/config/types.js +0 -2
  244. package/dist/helpers/react.d.ts +0 -2
  245. package/dist/helpers/react.js +0 -8
  246. package/dist/helpers/styled/index.d.ts +0 -1
  247. package/dist/helpers/styled/index.js +0 -17
  248. package/dist/services/requests/userPermissions.d.ts +0 -4
  249. package/dist/services/requests/userPermissions.js +0 -20
@@ -1,314 +1,314 @@
1
- import * as styles from './styles';
2
-
3
- import {
4
- ConditionDTO,
5
- OrderByDTO,
6
- useSqlRequestHandler,
7
- } from '../../../services/sqlRequests';
8
- import {
9
- Ref,
10
- useCallback,
11
- useEffect,
12
- useImperativeHandle,
13
- useMemo,
14
- useRef,
15
- useState,
16
- } from 'react';
17
- import {
18
- SqlRequestGridFilters,
19
- SqlRequestGridProps,
20
- SqlRequestGridRefProps,
21
- } from './types';
22
- import { debounce, pickBy } from 'lodash';
23
-
24
- import { DataGridSort } from '../DataGrid/types';
25
- import { FilterFullIcon } from '../../../Icons';
26
- import { FiltersSidebar } from './filters/FiltersSidebar';
27
- import { IconButton } from '../../forms/IconButton';
28
- import { VirtualScroller } from '../VirtualScroller';
29
- import { convertSqlFiltersToConditions } from './helpers';
30
- import { isColumnVisible } from '../DataGrid/helpers';
31
- import { useDataGrid } from '../DataGrid/hooks';
32
-
33
- export const SqlRequestGrid = <R, P extends object = {}>({
34
- ref,
35
- ...allProps
36
- }: SqlRequestGridProps<R, P> & {
37
- ref: Ref<SqlRequestGridRefProps>;
38
- }) => {
39
- const {
40
- rowHeight = styles.DEFAULT_ROW_HEIGHT,
41
- itemsPerRow,
42
- itemTemplate,
43
- itemProps,
44
- gap,
45
- ...props
46
- } = allProps;
47
- const currentRows = useRef<R[]>([]);
48
- const [rows, setRows] = useState<R[]>([]);
49
- const [start, setStart] = useState(0);
50
- const [length, setLength] = useState(-1);
51
- const [count, setCount] = useState(-1);
52
- const [sqlRequest] = useSqlRequestHandler<R>(props.type);
53
- const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
54
- {}
55
- );
56
- const [orderBy, setOrderBy] = useState<OrderByDTO[]>(
57
- Object.entries(props.initialSorts ?? {}).map(
58
- ([columnKey, direction]): OrderByDTO => {
59
- const field = props.fields.find((field) => field.key === columnKey);
60
- return {
61
- field: field?.field?.fieldAlias ?? columnKey,
62
- type: field?.type ?? 'text',
63
- direction: direction.toUpperCase() as 'ASC' | 'DESC',
64
- };
65
- }
66
- )
67
- );
68
-
69
- const [columnsKeys, visibleColumnsKeys] = useMemo(
70
- () => [
71
- [
72
- ...props.fields
73
- .filter((field) => !field.ignore)
74
- .map((field) => field.key),
75
- ...(props.additionalFields ?? []),
76
- ],
77
- [
78
- ...props.fields
79
- .filter((field) => !field.ignore)
80
- .filter(isColumnVisible)
81
- .map((field) => field.key),
82
- ...(props.additionalFields ?? []),
83
- ],
84
- ],
85
- [props.fields, props.additionalFields]
86
- );
87
- const columnTypes = useMemo(
88
- () =>
89
- visibleColumnsKeys.map((key) =>
90
- String(props.fields.find((field) => field.key === key)?.type ?? 'text')
91
- ),
92
- [visibleColumnsKeys, props.fields]
93
- );
94
-
95
- const loadRows = useRef(
96
- debounce(
97
- (
98
- columns: string[],
99
- returnColumns: string[],
100
- conditions: ConditionDTO[] = [],
101
- orderBy: OrderByDTO[] = [],
102
- start = 0,
103
- length = 100,
104
- getCount = false
105
- ) => {
106
- if (length > 0) {
107
- sqlRequest({
108
- columns: columns.includes('Id') ? columns : [...columns, 'Id'],
109
- returnColumns: returnColumns.includes('Id')
110
- ? returnColumns
111
- : [...returnColumns, 'Id'],
112
- columnTypes: columnTypes.includes('Id')
113
- ? columnTypes
114
- : [...columnTypes, 'Id'],
115
- conditions,
116
- orderBy,
117
- start,
118
- length,
119
- getCount,
120
- }).then((response) => {
121
- if (getCount) {
122
- currentRows.current = Array(response.count).fill(null);
123
- if (getCount) setCount(response.count ?? 0);
124
- }
125
- const data = response.data ?? [];
126
- const parsedRows = props.parser
127
- ? data.map(props.parser)
128
- : (data as R[]);
129
- currentRows.current.splice(start, length, ...parsedRows);
130
- setRows([...currentRows.current]);
131
- });
132
- }
133
- },
134
- 100,
135
- {
136
- leading: true,
137
- trailing: true,
138
- }
139
- )
140
- );
141
-
142
- const refresh = useCallback(() => {
143
- setRows([]);
144
- setStart(0);
145
- setCount(-1);
146
- }, []);
147
-
148
- const onFiltersChanged = useCallback(
149
- (filters: SqlRequestGridFilters) => {
150
- const newConditions = convertSqlFiltersToConditions(filters);
151
- setConditions(newConditions);
152
- refresh();
153
- },
154
- [refresh]
155
- );
156
-
157
- const onSortsChanged = useCallback(
158
- (sorts: Record<string, DataGridSort>) => {
159
- refresh();
160
- const newOrderBy = Object.entries(sorts).map(
161
- ([columnKey, direction]) =>
162
- ({
163
- field: columnKey,
164
- direction: direction.toUpperCase(),
165
- } as OrderByDTO)
166
- );
167
- setOrderBy(newOrderBy);
168
- },
169
- [refresh]
170
- );
171
-
172
- const loadFilterValues = useCallback(
173
- (columnKey: string) => {
174
- const field = props.fields.find((field) => field.key === columnKey);
175
- if (!field) return Promise.resolve([]);
176
- return sqlRequest({
177
- columns: columnsKeys,
178
- returnColumns: [columnKey],
179
- // columnTypes: [field.type ?? 'text'],
180
- conditions: [
181
- ...(props.conditions ?? []),
182
- ...Object.values(pickBy(conditions, (_, key) => key !== columnKey)),
183
- ].filter((condition) => condition.field !== columnKey),
184
- orderBy: [
185
- {
186
- field:
187
- field.filterField ??
188
- field.field?.fieldAlias ??
189
- field.field?.fieldName ??
190
- columnKey,
191
- type: field.type ?? 'text',
192
- direction: 'ASC',
193
- },
194
- ],
195
- getCount: false,
196
- unique: true,
197
- }).then((response) =>
198
- response.data.map((row) => field.filter?.getter?.(row) ?? null)
199
- );
200
- },
201
- [columnsKeys, conditions, props.fields, props.conditions, sqlRequest]
202
- );
203
-
204
- useEffect(() => {
205
- if (
206
- (!rows.length && count < 0) ||
207
- rows.slice(start, start + length).some((row) => row === null)
208
- ) {
209
- loadRows.current(
210
- columnsKeys,
211
- visibleColumnsKeys,
212
- [...(props.conditions ?? []), ...Object.values(conditions)],
213
- orderBy,
214
- start,
215
- length,
216
- count < 0
217
- );
218
- }
219
- }, [
220
- props.fields,
221
- start,
222
- length,
223
- count,
224
- conditions,
225
- columnsKeys,
226
- visibleColumnsKeys,
227
- rows,
228
- orderBy,
229
- props.conditions,
230
- ]);
231
-
232
- const onVisibleRowsChanged = useCallback(
233
- (newStart: number, newLength: number) => {
234
- if (newStart !== start || newLength !== length) {
235
- setStart(newStart);
236
- setLength(newLength);
237
- }
238
- },
239
- [length, start]
240
- );
241
-
242
- useImperativeHandle(
243
- ref,
244
- () => ({
245
- refresh,
246
- }),
247
- [refresh]
248
- );
249
-
250
- const [contextProps, DataGridContext] = useDataGrid({
251
- columns: props.fields,
252
- rows,
253
- onFiltersChanged,
254
- filterValuesLoader: loadFilterValues,
255
- onSortsChanged,
256
- onSelectionChange: () => {},
257
- onSelectedRowsChanged: () => {},
258
- selectable: false,
259
- rowKey: '',
260
- filter: false,
261
- sort: false,
262
- });
263
-
264
- const [sidebarVisible, setSidebarVisible] = useState(false);
265
- const onSidebarClose = useCallback(() => {
266
- setSidebarVisible(false);
267
- }, []);
268
- const onClearFilters = useCallback(() => {
269
- onFiltersChanged({});
270
- setSidebarVisible(false);
271
- }, [onFiltersChanged]);
272
-
273
- return (
274
- <DataGridContext.Provider value={contextProps}>
275
- <styles.SqlRequestGridContainer>
276
- {sidebarVisible ? (
277
- <>
278
- <FiltersSidebar
279
- props={allProps}
280
- context={DataGridContext}
281
- onClose={onSidebarClose}
282
- onClearFilters={onClearFilters}
283
- />
284
- </>
285
- ) : (
286
- <IconButton
287
- size="large"
288
- onClick={() => setSidebarVisible(true)}
289
- icon={FilterFullIcon}
290
- color="primary"
291
- rounded
292
- style={{
293
- position: 'absolute',
294
- bottom: 'var(--space-2)',
295
- right: 'var(--space-2)',
296
- zIndex: 1,
297
- }}
298
- />
299
- )}
300
-
301
- <VirtualScroller
302
- gridTemplateColumns={`repeat(${itemsPerRow}, 1fr)`}
303
- items={rows}
304
- itemTemplate={itemTemplate}
305
- itemsPerRow={itemsPerRow}
306
- itemProps={itemProps}
307
- rowHeightInPx={rowHeight}
308
- onRangeChanged={onVisibleRowsChanged}
309
- gap={gap}
310
- />
311
- </styles.SqlRequestGridContainer>
312
- </DataGridContext.Provider>
313
- );
314
- };
1
+ import * as styles from './styles';
2
+
3
+ import {
4
+ ConditionDTO,
5
+ OrderByDTO,
6
+ useSqlRequestHandler,
7
+ } from '../../../services/sqlRequests';
8
+ import {
9
+ Ref,
10
+ useCallback,
11
+ useEffect,
12
+ useImperativeHandle,
13
+ useMemo,
14
+ useRef,
15
+ useState,
16
+ } from 'react';
17
+ import {
18
+ SqlRequestGridFilters,
19
+ SqlRequestGridProps,
20
+ SqlRequestGridRefProps,
21
+ } from './types';
22
+ import { debounce, pickBy } from 'lodash';
23
+
24
+ import { DataGridSort } from '../DataGrid/types';
25
+ import { FilterFullIcon } from '../../../Icons';
26
+ import { FiltersSidebar } from './filters/FiltersSidebar';
27
+ import { IconButton } from '../../forms/IconButton';
28
+ import { VirtualScroller } from '../VirtualScroller';
29
+ import { convertSqlFiltersToConditions } from './helpers';
30
+ import { isColumnVisible } from '../DataGrid/helpers';
31
+ import { useDataGrid } from '../DataGrid/hooks';
32
+
33
+ export const SqlRequestGrid = <R, P extends object = {}>({
34
+ ref,
35
+ ...allProps
36
+ }: SqlRequestGridProps<R, P> & {
37
+ ref: Ref<SqlRequestGridRefProps>;
38
+ }) => {
39
+ const {
40
+ rowHeight = styles.DEFAULT_ROW_HEIGHT,
41
+ itemsPerRow,
42
+ itemTemplate,
43
+ itemProps,
44
+ gap,
45
+ ...props
46
+ } = allProps;
47
+ const currentRows = useRef<R[]>([]);
48
+ const [rows, setRows] = useState<R[]>([]);
49
+ const [start, setStart] = useState(0);
50
+ const [length, setLength] = useState(-1);
51
+ const [count, setCount] = useState(-1);
52
+ const [sqlRequest] = useSqlRequestHandler<R>(props.type);
53
+ const [conditions, setConditions] = useState<Record<string, ConditionDTO>>(
54
+ {}
55
+ );
56
+ const [orderBy, setOrderBy] = useState<OrderByDTO[]>(
57
+ Object.entries(props.initialSorts ?? {}).map(
58
+ ([columnKey, direction]): OrderByDTO => {
59
+ const field = props.fields.find((field) => field.key === columnKey);
60
+ return {
61
+ field: field?.field?.fieldAlias ?? columnKey,
62
+ type: field?.type ?? 'text',
63
+ direction: direction.toUpperCase() as 'ASC' | 'DESC',
64
+ };
65
+ }
66
+ )
67
+ );
68
+
69
+ const [columnsKeys, visibleColumnsKeys] = useMemo(
70
+ () => [
71
+ [
72
+ ...props.fields
73
+ .filter((field) => !field.ignore)
74
+ .map((field) => field.key),
75
+ ...(props.additionalFields ?? []),
76
+ ],
77
+ [
78
+ ...props.fields
79
+ .filter((field) => !field.ignore)
80
+ .filter(isColumnVisible)
81
+ .map((field) => field.key),
82
+ ...(props.additionalFields ?? []),
83
+ ],
84
+ ],
85
+ [props.fields, props.additionalFields]
86
+ );
87
+ const columnTypes = useMemo(
88
+ () =>
89
+ visibleColumnsKeys.map((key) =>
90
+ String(props.fields.find((field) => field.key === key)?.type ?? 'text')
91
+ ),
92
+ [visibleColumnsKeys, props.fields]
93
+ );
94
+
95
+ const loadRows = useRef(
96
+ debounce(
97
+ (
98
+ columns: string[],
99
+ returnColumns: string[],
100
+ conditions: ConditionDTO[] = [],
101
+ orderBy: OrderByDTO[] = [],
102
+ start = 0,
103
+ length = 100,
104
+ getCount = false
105
+ ) => {
106
+ if (length > 0) {
107
+ sqlRequest({
108
+ columns: columns.includes('Id') ? columns : [...columns, 'Id'],
109
+ returnColumns: returnColumns.includes('Id')
110
+ ? returnColumns
111
+ : [...returnColumns, 'Id'],
112
+ columnTypes: columnTypes.includes('Id')
113
+ ? columnTypes
114
+ : [...columnTypes, 'Id'],
115
+ conditions,
116
+ orderBy,
117
+ start,
118
+ length,
119
+ getCount,
120
+ }).then((response) => {
121
+ if (getCount) {
122
+ currentRows.current = Array(response.count).fill(null);
123
+ if (getCount) setCount(response.count ?? 0);
124
+ }
125
+ const data = response.data ?? [];
126
+ const parsedRows = props.parser
127
+ ? data.map(props.parser)
128
+ : (data as R[]);
129
+ currentRows.current.splice(start, length, ...parsedRows);
130
+ setRows([...currentRows.current]);
131
+ });
132
+ }
133
+ },
134
+ 100,
135
+ {
136
+ leading: true,
137
+ trailing: true,
138
+ }
139
+ )
140
+ );
141
+
142
+ const refresh = useCallback(() => {
143
+ setRows([]);
144
+ setStart(0);
145
+ setCount(-1);
146
+ }, []);
147
+
148
+ const onFiltersChanged = useCallback(
149
+ (filters: SqlRequestGridFilters) => {
150
+ const newConditions = convertSqlFiltersToConditions(filters);
151
+ setConditions(newConditions);
152
+ refresh();
153
+ },
154
+ [refresh]
155
+ );
156
+
157
+ const onSortsChanged = useCallback(
158
+ (sorts: Record<string, DataGridSort>) => {
159
+ refresh();
160
+ const newOrderBy = Object.entries(sorts).map(
161
+ ([columnKey, direction]) =>
162
+ ({
163
+ field: columnKey,
164
+ direction: direction.toUpperCase(),
165
+ } as OrderByDTO)
166
+ );
167
+ setOrderBy(newOrderBy);
168
+ },
169
+ [refresh]
170
+ );
171
+
172
+ const loadFilterValues = useCallback(
173
+ (columnKey: string) => {
174
+ const field = props.fields.find((field) => field.key === columnKey);
175
+ if (!field) return Promise.resolve([]);
176
+ return sqlRequest({
177
+ columns: columnsKeys,
178
+ returnColumns: [columnKey],
179
+ // columnTypes: [field.type ?? 'text'],
180
+ conditions: [
181
+ ...(props.conditions ?? []),
182
+ ...Object.values(pickBy(conditions, (_, key) => key !== columnKey)),
183
+ ].filter((condition) => condition.field !== columnKey),
184
+ orderBy: [
185
+ {
186
+ field:
187
+ field.filterField ??
188
+ field.field?.fieldAlias ??
189
+ field.field?.fieldName ??
190
+ columnKey,
191
+ type: field.type ?? 'text',
192
+ direction: 'ASC',
193
+ },
194
+ ],
195
+ getCount: false,
196
+ unique: true,
197
+ }).then((response) =>
198
+ response.data.map((row) => field.filter?.getter?.(row) ?? null)
199
+ );
200
+ },
201
+ [columnsKeys, conditions, props.fields, props.conditions, sqlRequest]
202
+ );
203
+
204
+ useEffect(() => {
205
+ if (
206
+ (!rows.length && count < 0) ||
207
+ rows.slice(start, start + length).some((row) => row === null)
208
+ ) {
209
+ loadRows.current(
210
+ columnsKeys,
211
+ visibleColumnsKeys,
212
+ [...(props.conditions ?? []), ...Object.values(conditions)],
213
+ orderBy,
214
+ start,
215
+ length,
216
+ count < 0
217
+ );
218
+ }
219
+ }, [
220
+ props.fields,
221
+ start,
222
+ length,
223
+ count,
224
+ conditions,
225
+ columnsKeys,
226
+ visibleColumnsKeys,
227
+ rows,
228
+ orderBy,
229
+ props.conditions,
230
+ ]);
231
+
232
+ const onVisibleRowsChanged = useCallback(
233
+ (newStart: number, newLength: number) => {
234
+ if (newStart !== start || newLength !== length) {
235
+ setStart(newStart);
236
+ setLength(newLength);
237
+ }
238
+ },
239
+ [length, start]
240
+ );
241
+
242
+ useImperativeHandle(
243
+ ref,
244
+ () => ({
245
+ refresh,
246
+ }),
247
+ [refresh]
248
+ );
249
+
250
+ const [contextProps, DataGridContext] = useDataGrid({
251
+ columns: props.fields,
252
+ rows,
253
+ onFiltersChanged,
254
+ filterValuesLoader: loadFilterValues,
255
+ onSortsChanged,
256
+ onSelectionChange: () => {},
257
+ onSelectedRowsChanged: () => {},
258
+ selectable: false,
259
+ rowKey: '',
260
+ filter: false,
261
+ sort: false,
262
+ });
263
+
264
+ const [sidebarVisible, setSidebarVisible] = useState(false);
265
+ const onSidebarClose = useCallback(() => {
266
+ setSidebarVisible(false);
267
+ }, []);
268
+ const onClearFilters = useCallback(() => {
269
+ onFiltersChanged({});
270
+ setSidebarVisible(false);
271
+ }, [onFiltersChanged]);
272
+
273
+ return (
274
+ <DataGridContext.Provider value={contextProps}>
275
+ <styles.SqlRequestGridContainer>
276
+ {sidebarVisible ? (
277
+ <>
278
+ <FiltersSidebar
279
+ props={allProps}
280
+ context={DataGridContext}
281
+ onClose={onSidebarClose}
282
+ onClearFilters={onClearFilters}
283
+ />
284
+ </>
285
+ ) : (
286
+ <IconButton
287
+ size="large"
288
+ onClick={() => setSidebarVisible(true)}
289
+ icon={FilterFullIcon}
290
+ color="primary"
291
+ rounded
292
+ style={{
293
+ position: 'absolute',
294
+ bottom: 'var(--space-2)',
295
+ right: 'var(--space-2)',
296
+ zIndex: 1,
297
+ }}
298
+ />
299
+ )}
300
+
301
+ <VirtualScroller
302
+ gridTemplateColumns={`repeat(${itemsPerRow}, 1fr)`}
303
+ items={rows}
304
+ itemTemplate={itemTemplate}
305
+ itemsPerRow={itemsPerRow}
306
+ itemProps={itemProps}
307
+ rowHeightInPx={rowHeight}
308
+ onRangeChanged={onVisibleRowsChanged}
309
+ gap={gap}
310
+ />
311
+ </styles.SqlRequestGridContainer>
312
+ </DataGridContext.Provider>
313
+ );
314
+ };
@@ -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
+ `;