@addev-be/ui 2.4.0 → 2.4.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 (250) 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/DataGrid/hooks/useDataGrid.js +3 -0
  25. package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.d.ts +1 -2
  26. package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.js +3 -2
  27. package/dist/components/data/SqlRequestDataGrid/helpers/columns.js +3 -1
  28. package/dist/services/index.js +7 -17
  29. package/eslint.config.js +3 -3
  30. package/package.json +2 -2
  31. package/src/Icons.tsx +138 -138
  32. package/src/components/auth/LoginForm.tsx +86 -86
  33. package/src/components/auth/LoginPage.tsx +32 -32
  34. package/src/components/auth/PasswordRecoveryForm.tsx +53 -53
  35. package/src/components/auth/PasswordResetForm.tsx +112 -112
  36. package/src/components/auth/styles.ts +14 -14
  37. package/src/components/data/DataGrid/DataGridCell.tsx +81 -81
  38. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +9 -9
  39. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +59 -59
  40. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +182 -182
  41. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +104 -104
  42. package/src/components/data/DataGrid/DataGridEditableCell/CheckboxEditableCell.tsx +37 -37
  43. package/src/components/data/DataGrid/DataGridEditableCell/DateEditableCell.tsx +38 -38
  44. package/src/components/data/DataGrid/DataGridEditableCell/NumberEditableCell.tsx +71 -71
  45. package/src/components/data/DataGrid/DataGridEditableCell/TextEditableCell.tsx +37 -37
  46. package/src/components/data/DataGrid/DataGridEditableCell/index.tsx +106 -106
  47. package/src/components/data/DataGrid/DataGridEditableCell/styles.ts +35 -35
  48. package/src/components/data/DataGrid/DataGridEditableCell/types.ts +18 -18
  49. package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +129 -129
  50. package/src/components/data/DataGrid/DataGridFilterMenu/helpers.ts +23 -23
  51. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +81 -81
  52. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +370 -370
  53. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +97 -97
  54. package/src/components/data/DataGrid/DataGridFooter.tsx +45 -45
  55. package/src/components/data/DataGrid/DataGridHeader.tsx +74 -74
  56. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +112 -112
  57. package/src/components/data/DataGrid/DataGridRowTemplate.tsx +83 -83
  58. package/src/components/data/DataGrid/DataGridToolbar.tsx +134 -134
  59. package/src/components/data/DataGrid/FilterModalContent/index.tsx +137 -137
  60. package/src/components/data/DataGrid/FilterModalContent/styles.ts +22 -22
  61. package/src/components/data/DataGrid/constants.ts +6 -6
  62. package/src/components/data/DataGrid/helpers/columns.tsx +452 -452
  63. package/src/components/data/DataGrid/helpers/filters.ts +287 -287
  64. package/src/components/data/DataGrid/helpers/index.ts +2 -2
  65. package/src/components/data/DataGrid/hooks/index.ts +29 -29
  66. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +383 -380
  67. package/src/components/data/DataGrid/hooks/useDataGridChangedRows.ts +97 -97
  68. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +174 -174
  69. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +48 -48
  70. package/src/components/data/DataGrid/hooks/useRefreshModal.tsx +48 -48
  71. package/src/components/data/DataGrid/index.tsx +111 -111
  72. package/src/components/data/DataGrid/styles.ts +430 -430
  73. package/src/components/data/DataGrid/types.ts +380 -380
  74. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +526 -524
  75. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +2 -2
  76. package/src/components/data/SqlRequestDataGrid/helpers/rows.ts +24 -24
  77. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +16 -16
  78. package/src/components/data/SqlRequestDataGrid/index.tsx +417 -417
  79. package/src/components/data/SqlRequestDataGrid/styles.ts +15 -15
  80. package/src/components/data/SqlRequestDataGrid/types.ts +74 -74
  81. package/src/components/data/SqlRequestForeignList/index.tsx +254 -254
  82. package/src/components/data/SqlRequestForeignList/styles.ts +43 -43
  83. package/src/components/data/SqlRequestForeignList/types.ts +32 -32
  84. package/src/components/data/SqlRequestGrid/filters/FiltersSidebar.tsx +108 -108
  85. package/src/components/data/SqlRequestGrid/filters/styles.ts +88 -88
  86. package/src/components/data/SqlRequestGrid/helpers/index.ts +1 -1
  87. package/src/components/data/SqlRequestGrid/helpers/sqlRequests.ts +16 -16
  88. package/src/components/data/SqlRequestGrid/index.tsx +304 -304
  89. package/src/components/data/SqlRequestGrid/styles.ts +20 -20
  90. package/src/components/data/SqlRequestGrid/types.ts +73 -73
  91. package/src/components/data/VirtualScroller/hooks.ts +71 -71
  92. package/src/components/data/VirtualScroller/index.tsx +89 -89
  93. package/src/components/data/VirtualScroller/styles.ts +57 -57
  94. package/src/components/data/VirtualScroller/types.ts +10 -10
  95. package/src/components/forms/AutoTextArea.tsx +48 -48
  96. package/src/components/forms/Button.tsx +132 -132
  97. package/src/components/forms/Form/Checkbox.tsx +12 -12
  98. package/src/components/forms/Form/CustomSelect.tsx +86 -86
  99. package/src/components/forms/Form/FormGroup.tsx +31 -31
  100. package/src/components/forms/Form/Input.tsx +16 -16
  101. package/src/components/forms/Form/Row.tsx +32 -32
  102. package/src/components/forms/Form/Select.tsx +82 -82
  103. package/src/components/forms/Form/TextArea.tsx +17 -17
  104. package/src/components/forms/Form/index.tsx +48 -48
  105. package/src/components/forms/Form/styles.ts +184 -184
  106. package/src/components/forms/IconButton.tsx +61 -61
  107. package/src/components/forms/IndeterminateCheckbox.tsx +46 -46
  108. package/src/components/forms/NumberInput.tsx +53 -53
  109. package/src/components/forms/Select.tsx +34 -34
  110. package/src/components/forms/VerticalLabel.tsx +20 -20
  111. package/src/components/forms/styles.ts +42 -42
  112. package/src/components/layout/Columns.ts +28 -28
  113. package/src/components/layout/Dropdown/index.tsx +113 -113
  114. package/src/components/layout/Dropdown/styles.ts +53 -53
  115. package/src/components/layout/Flexbox.ts +21 -21
  116. package/src/components/layout/Grid/index.tsx +8 -8
  117. package/src/components/layout/Grid/styles.ts +34 -34
  118. package/src/components/layout/Loading/index.tsx +29 -29
  119. package/src/components/layout/Loading/styles.ts +29 -29
  120. package/src/components/layout/Masonry/index.tsx +29 -29
  121. package/src/components/layout/Masonry/styles.ts +20 -20
  122. package/src/components/layout/Modal/index.tsx +51 -51
  123. package/src/components/layout/Modal/styles.ts +125 -125
  124. package/src/components/search/HighlightedText.tsx +41 -41
  125. package/src/components/search/QuickSearchBar.tsx +99 -99
  126. package/src/components/search/QuickSearchResults.tsx +86 -86
  127. package/src/components/search/styles.ts +96 -96
  128. package/src/components/search/types.ts +29 -29
  129. package/src/components/ui/Avatar/index.tsx +54 -54
  130. package/src/components/ui/Avatar/styles.ts +61 -61
  131. package/src/components/ui/Card/index.tsx +14 -14
  132. package/src/components/ui/Card/styles.ts +37 -37
  133. package/src/components/ui/ContextMenu/index.tsx +79 -79
  134. package/src/components/ui/ContextMenu/styles.ts +119 -119
  135. package/src/components/ui/Ellipsis.tsx +33 -33
  136. package/src/components/ui/Label.tsx +93 -93
  137. package/src/components/ui/Message/index.tsx +57 -57
  138. package/src/components/ui/Message/styles.ts +44 -44
  139. package/src/components/ui/TabsView/TabsList.tsx +44 -44
  140. package/src/components/ui/TabsView/TabsView.tsx +38 -38
  141. package/src/components/ui/TabsView/index.ts +3 -3
  142. package/src/components/ui/TabsView/styles.ts +76 -76
  143. package/src/components/ui/TabsView/types.ts +15 -15
  144. package/src/config/index.ts +10 -10
  145. package/src/helpers/components.ts +9 -9
  146. package/src/helpers/dates.ts +17 -17
  147. package/src/helpers/getScrollbarSize.ts +14 -14
  148. package/src/helpers/numbers.ts +63 -63
  149. package/src/helpers/responsive.ts +83 -83
  150. package/src/helpers/styled/space.ts +114 -114
  151. package/src/helpers/styled/typography.ts +25 -25
  152. package/src/helpers/text.ts +13 -13
  153. package/src/helpers/types.ts +9 -9
  154. package/src/hooks/useContainerMediaQuery.ts +7 -7
  155. package/src/hooks/useElementSize.ts +24 -24
  156. package/src/hooks/useMediaQuery.ts +9 -9
  157. package/src/hooks/useMediaQueryForWidth.ts +35 -35
  158. package/src/hooks/useMutableState.ts +25 -25
  159. package/src/hooks/useShowArchived.ts +28 -28
  160. package/src/hooks/useWindowSize.ts +20 -20
  161. package/src/index.ts +102 -102
  162. package/src/providers/AuthenticationProvider/helpers.ts +3 -3
  163. package/src/providers/AuthenticationProvider/index.tsx +303 -303
  164. package/src/providers/LoadingProvider/index.tsx +47 -47
  165. package/src/providers/PortalsProvider/index.tsx +54 -54
  166. package/src/providers/PortalsProvider/styles.ts +31 -31
  167. package/src/providers/SettingsProvider/index.tsx +70 -70
  168. package/src/providers/ThemeProvider/defaultTheme.ts +470 -470
  169. package/src/providers/ThemeProvider/helpers.ts +84 -84
  170. package/src/providers/ThemeProvider/index.ts +66 -66
  171. package/src/providers/ThemeProvider/types.ts +134 -134
  172. package/src/providers/ToastProvider/index.tsx +93 -93
  173. package/src/providers/TrackingProvider/hooks.ts +14 -14
  174. package/src/providers/TrackingProvider/index.tsx +71 -71
  175. package/src/providers/UiProviders/index.tsx +76 -76
  176. package/src/providers/UiProviders/styles.ts +10 -10
  177. package/src/providers/hooks.ts +14 -14
  178. package/src/services/HttpService.ts +92 -92
  179. package/src/services/WebSocketService.ts +155 -155
  180. package/src/services/advancedRequests.ts +102 -102
  181. package/src/services/base.ts +23 -23
  182. package/src/services/globalSearch.ts +32 -32
  183. package/src/services/hooks.ts +92 -92
  184. package/src/services/requests/auth.ts +44 -44
  185. package/src/services/requests/generic.ts +62 -62
  186. package/src/services/requests/tracking.ts +12 -12
  187. package/src/services/requests/userProfiles.ts +35 -35
  188. package/src/services/requests/users.ts +28 -28
  189. package/src/services/smartQueries.ts +122 -122
  190. package/src/services/sqlRequests.ts +111 -111
  191. package/src/services/types/auth.ts +98 -98
  192. package/src/services/types/base.ts +10 -10
  193. package/src/services/types/generic.ts +82 -82
  194. package/src/services/types/tracking.ts +29 -29
  195. package/src/services/types/userProfiles.ts +79 -79
  196. package/src/services/types/users.ts +74 -74
  197. package/src/services/updateSqlRequests.ts +32 -32
  198. package/src/styles/animations.scss +30 -30
  199. package/src/styles/index.scss +42 -42
  200. package/src/types.ts +8 -8
  201. package/src/typings.d.ts +2 -2
  202. package/tsconfig.json +18 -18
  203. package/dist/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.d.ts +0 -14
  204. package/dist/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.js +0 -77
  205. package/dist/components/data/AdvancedRequestDataGrid/helpers/columns.d.ts +0 -22
  206. package/dist/components/data/AdvancedRequestDataGrid/helpers/columns.js +0 -105
  207. package/dist/components/data/AdvancedRequestDataGrid/helpers/index.d.ts +0 -2
  208. package/dist/components/data/AdvancedRequestDataGrid/helpers/index.js +0 -18
  209. package/dist/components/data/AdvancedRequestDataGrid/index.d.ts +0 -2
  210. package/dist/components/data/AdvancedRequestDataGrid/index.js +0 -215
  211. package/dist/components/data/AdvancedRequestDataGrid/types.d.ts +0 -21
  212. package/dist/components/data/AdvancedRequestDataGrid/types.js +0 -2
  213. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.d.ts +0 -10
  214. package/dist/components/data/DataGrid/AdvancedRequestDataGrid.js +0 -173
  215. package/dist/components/data/DataGrid/DataGridEditableCell.d.ts +0 -2
  216. package/dist/components/data/DataGrid/DataGridEditableCell.js +0 -27
  217. package/dist/components/data/DataGrid/FilterValuesScroller.d.ts +0 -13
  218. package/dist/components/data/DataGrid/FilterValuesScroller.js +0 -73
  219. package/dist/components/data/DataGrid/VirtualScroller.d.ts +0 -11
  220. package/dist/components/data/DataGrid/VirtualScroller.js +0 -41
  221. package/dist/components/data/DataGrid/helpers/advancedRequests.d.ts +0 -12
  222. package/dist/components/data/DataGrid/helpers/advancedRequests.js +0 -53
  223. package/dist/components/data/DataGrid/helpers.d.ts +0 -28
  224. package/dist/components/data/DataGrid/helpers.js +0 -436
  225. package/dist/components/data/SmartQueryDataGrid/helpers/columns.d.ts +0 -20
  226. package/dist/components/data/SmartQueryDataGrid/helpers/columns.js +0 -160
  227. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.d.ts +0 -5
  228. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.js +0 -41
  229. package/dist/components/data/SmartQueryDataGrid/helpers/index.d.ts +0 -2
  230. package/dist/components/data/SmartQueryDataGrid/helpers/index.js +0 -18
  231. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.d.ts +0 -3
  232. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.js +0 -15
  233. package/dist/components/data/SmartQueryDataGrid/hooks.d.ts +0 -9
  234. package/dist/components/data/SmartQueryDataGrid/hooks.js +0 -63
  235. package/dist/components/data/SmartQueryDataGrid/index.d.ts +0 -12
  236. package/dist/components/data/SmartQueryDataGrid/index.js +0 -242
  237. package/dist/components/data/SmartQueryDataGrid/types.d.ts +0 -22
  238. package/dist/components/data/SmartQueryDataGrid/types.js +0 -2
  239. package/dist/components/forms/Form/InputWithLabel.d.ts +0 -2
  240. package/dist/components/forms/Form/InputWithLabel.js +0 -10
  241. package/dist/components/forms/Form/types.d.ts +0 -7
  242. package/dist/components/forms/Form/types.js +0 -2
  243. package/dist/config/types.d.ts +0 -11
  244. package/dist/config/types.js +0 -2
  245. package/dist/helpers/react.d.ts +0 -2
  246. package/dist/helpers/react.js +0 -8
  247. package/dist/helpers/styled/index.d.ts +0 -1
  248. package/dist/helpers/styled/index.js +0 -17
  249. package/dist/services/requests/userPermissions.d.ts +0 -4
  250. package/dist/services/requests/userPermissions.js +0 -20
@@ -1,73 +1,73 @@
1
- import {
2
- ConditionDTO,
3
- FieldDTO,
4
- OrderByDTO,
5
- SqlRequestRow,
6
- } from '../../../services/sqlRequests';
7
- import {
8
- DataGridCheckboxColumn,
9
- DataGridDateColumn,
10
- DataGridFilter,
11
- DataGridFilterType,
12
- DataGridNumberColumn,
13
- DataGridSort,
14
- DataGridTextColumn,
15
- } from '../DataGrid/types';
16
-
17
- import { VirtualScrollerTemplateFC } from '../VirtualScroller/types';
18
-
19
- export type SqlRequestGridFilter<
20
- T extends DataGridFilterType = DataGridFilterType
21
- > = DataGridFilter<T> & {
22
- field?: FieldDTO;
23
- };
24
-
25
- export type SqlRequestGridFilters = Record<string, SqlRequestGridFilter>;
26
-
27
- export type SqlRequestGridCommonProps = {
28
- filter?: SqlRequestGridFilter;
29
- field?: FieldDTO;
30
- filterField?: string;
31
- sortField?: string;
32
- ignore?: boolean;
33
- };
34
-
35
- export type SqlRequestGridTextColumn<R> = DataGridTextColumn<R> &
36
- SqlRequestGridCommonProps;
37
- export type SqlRequestGridNumberColumn<R> = DataGridNumberColumn<R> &
38
- SqlRequestGridCommonProps;
39
- export type SqlRequestGridCheckboxColumn<R> = DataGridCheckboxColumn<R> &
40
- SqlRequestGridCommonProps;
41
- export type SqlRequestGridDateColumn<R> = DataGridDateColumn<R> &
42
- SqlRequestGridCommonProps;
43
-
44
- export type SqlRequestGridColumn<R> =
45
- | SqlRequestGridTextColumn<R>
46
- | SqlRequestGridNumberColumn<R>
47
- | SqlRequestGridCheckboxColumn<R>
48
- | SqlRequestGridDateColumn<R>;
49
-
50
- export type SqlRequestGridColumnWithFilter<R> = SqlRequestGridColumn<R> & {
51
- filter: SqlRequestGridFilter;
52
- };
53
-
54
- export type SqlRequestGridColumns<R> = SqlRequestGridColumn<R>[];
55
-
56
- export type SqlRequestGridProps<R, P extends object = {}> = {
57
- itemTemplate: VirtualScrollerTemplateFC<R, P>;
58
- itemsPerRow?: number;
59
- rowHeight?: number;
60
- gap?: string;
61
- fields: SqlRequestGridColumns<R>;
62
- additionalFields?: string[];
63
- type: string;
64
- orderBy?: OrderByDTO[];
65
- conditions?: ConditionDTO[];
66
- parser?: (row: SqlRequestRow<R>) => R;
67
- itemProps: P | ((item: R) => P);
68
- initialSorts?: Record<string, DataGridSort>;
69
- };
70
-
71
- export type SqlRequestGridRefProps = {
72
- refresh: () => void;
73
- };
1
+ import {
2
+ ConditionDTO,
3
+ FieldDTO,
4
+ OrderByDTO,
5
+ SqlRequestRow,
6
+ } from '../../../services/sqlRequests';
7
+ import {
8
+ DataGridCheckboxColumn,
9
+ DataGridDateColumn,
10
+ DataGridFilter,
11
+ DataGridFilterType,
12
+ DataGridNumberColumn,
13
+ DataGridSort,
14
+ DataGridTextColumn,
15
+ } from '../DataGrid/types';
16
+
17
+ import { VirtualScrollerTemplateFC } from '../VirtualScroller/types';
18
+
19
+ export type SqlRequestGridFilter<
20
+ T extends DataGridFilterType = DataGridFilterType
21
+ > = DataGridFilter<T> & {
22
+ field?: FieldDTO;
23
+ };
24
+
25
+ export type SqlRequestGridFilters = Record<string, SqlRequestGridFilter>;
26
+
27
+ export type SqlRequestGridCommonProps = {
28
+ filter?: SqlRequestGridFilter;
29
+ field?: FieldDTO;
30
+ filterField?: string;
31
+ sortField?: string;
32
+ ignore?: boolean;
33
+ };
34
+
35
+ export type SqlRequestGridTextColumn<R> = DataGridTextColumn<R> &
36
+ SqlRequestGridCommonProps;
37
+ export type SqlRequestGridNumberColumn<R> = DataGridNumberColumn<R> &
38
+ SqlRequestGridCommonProps;
39
+ export type SqlRequestGridCheckboxColumn<R> = DataGridCheckboxColumn<R> &
40
+ SqlRequestGridCommonProps;
41
+ export type SqlRequestGridDateColumn<R> = DataGridDateColumn<R> &
42
+ SqlRequestGridCommonProps;
43
+
44
+ export type SqlRequestGridColumn<R> =
45
+ | SqlRequestGridTextColumn<R>
46
+ | SqlRequestGridNumberColumn<R>
47
+ | SqlRequestGridCheckboxColumn<R>
48
+ | SqlRequestGridDateColumn<R>;
49
+
50
+ export type SqlRequestGridColumnWithFilter<R> = SqlRequestGridColumn<R> & {
51
+ filter: SqlRequestGridFilter;
52
+ };
53
+
54
+ export type SqlRequestGridColumns<R> = SqlRequestGridColumn<R>[];
55
+
56
+ export type SqlRequestGridProps<R, P extends object = {}> = {
57
+ itemTemplate: VirtualScrollerTemplateFC<R, P>;
58
+ itemsPerRow?: number;
59
+ rowHeight?: number;
60
+ gap?: string;
61
+ fields: SqlRequestGridColumns<R>;
62
+ additionalFields?: string[];
63
+ type: string;
64
+ orderBy?: OrderByDTO[];
65
+ conditions?: ConditionDTO[];
66
+ parser?: (row: SqlRequestRow<R>) => R;
67
+ itemProps: P | ((item: R) => P);
68
+ initialSorts?: Record<string, DataGridSort>;
69
+ };
70
+
71
+ export type SqlRequestGridRefProps = {
72
+ refresh: () => void;
73
+ };
@@ -1,71 +1,71 @@
1
- import { useCallback, useEffect, useState } from 'react';
2
-
3
- import { useElementSize } from '../../../hooks/useElementSize';
4
-
5
- export const VIRTUAL_SCROLL_TOLERANCE = 20;
6
-
7
- type VirtualScrollingProps<R> = {
8
- scrollableElement: HTMLElement | null;
9
- rowHeightInPx: number;
10
- items: R[];
11
- itemsPerRow?: number;
12
- tolerance?: number;
13
- };
14
-
15
- export const useVirtualScrolling = <R>({
16
- scrollableElement,
17
- rowHeightInPx,
18
- items,
19
- itemsPerRow = 1,
20
- tolerance = VIRTUAL_SCROLL_TOLERANCE,
21
- }: VirtualScrollingProps<R>) => {
22
- const { height } = useElementSize(scrollableElement);
23
-
24
- const [scrollTop, setScrollTop] = useState(0);
25
- const [rowIndex, rowLength] = [
26
- Math.floor(scrollTop / rowHeightInPx),
27
- Math.ceil(height / rowHeightInPx),
28
- ];
29
- const [index, length] = [rowIndex * itemsPerRow, rowLength * itemsPerRow];
30
- const rowTolerance = Math.ceil(tolerance / itemsPerRow);
31
-
32
- const totalRows = Math.ceil((items?.length ?? 0) / itemsPerRow);
33
- const totalHeight = totalRows * rowHeightInPx;
34
- const topPadding = Math.max(0, rowIndex - rowTolerance) * rowHeightInPx;
35
-
36
- const onScroll = useCallback(() => {
37
- if (scrollableElement) {
38
- setScrollTop(scrollableElement.scrollTop);
39
- }
40
- }, [scrollableElement]);
41
-
42
- useEffect(() => {
43
- const scrollable = scrollableElement;
44
- if (scrollable) {
45
- scrollable.addEventListener('scroll', onScroll);
46
- return () => {
47
- scrollable.removeEventListener('scroll', onScroll);
48
- };
49
- }
50
- }, [onScroll, scrollableElement]);
51
-
52
- const rowIndexWithTolerance = Math.max(0, rowIndex - rowTolerance);
53
- const rowLengthWithTolerance = rowLength + 2 * rowTolerance;
54
- const indexWithTolerance = rowIndexWithTolerance * itemsPerRow;
55
- const lengthWithTolerance = rowLengthWithTolerance * itemsPerRow;
56
-
57
- const visibleItems = items.slice(
58
- indexWithTolerance,
59
- indexWithTolerance + lengthWithTolerance
60
- );
61
-
62
- return {
63
- index,
64
- length,
65
- indexWithTolerance,
66
- lengthWithTolerance,
67
- visibleItems,
68
- totalHeight,
69
- topPadding,
70
- };
71
- };
1
+ import { useCallback, useEffect, useState } from 'react';
2
+
3
+ import { useElementSize } from '../../../hooks/useElementSize';
4
+
5
+ export const VIRTUAL_SCROLL_TOLERANCE = 20;
6
+
7
+ type VirtualScrollingProps<R> = {
8
+ scrollableElement: HTMLElement | null;
9
+ rowHeightInPx: number;
10
+ items: R[];
11
+ itemsPerRow?: number;
12
+ tolerance?: number;
13
+ };
14
+
15
+ export const useVirtualScrolling = <R>({
16
+ scrollableElement,
17
+ rowHeightInPx,
18
+ items,
19
+ itemsPerRow = 1,
20
+ tolerance = VIRTUAL_SCROLL_TOLERANCE,
21
+ }: VirtualScrollingProps<R>) => {
22
+ const { height } = useElementSize(scrollableElement);
23
+
24
+ const [scrollTop, setScrollTop] = useState(0);
25
+ const [rowIndex, rowLength] = [
26
+ Math.floor(scrollTop / rowHeightInPx),
27
+ Math.ceil(height / rowHeightInPx),
28
+ ];
29
+ const [index, length] = [rowIndex * itemsPerRow, rowLength * itemsPerRow];
30
+ const rowTolerance = Math.ceil(tolerance / itemsPerRow);
31
+
32
+ const totalRows = Math.ceil((items?.length ?? 0) / itemsPerRow);
33
+ const totalHeight = totalRows * rowHeightInPx;
34
+ const topPadding = Math.max(0, rowIndex - rowTolerance) * rowHeightInPx;
35
+
36
+ const onScroll = useCallback(() => {
37
+ if (scrollableElement) {
38
+ setScrollTop(scrollableElement.scrollTop);
39
+ }
40
+ }, [scrollableElement]);
41
+
42
+ useEffect(() => {
43
+ const scrollable = scrollableElement;
44
+ if (scrollable) {
45
+ scrollable.addEventListener('scroll', onScroll);
46
+ return () => {
47
+ scrollable.removeEventListener('scroll', onScroll);
48
+ };
49
+ }
50
+ }, [onScroll, scrollableElement]);
51
+
52
+ const rowIndexWithTolerance = Math.max(0, rowIndex - rowTolerance);
53
+ const rowLengthWithTolerance = rowLength + 2 * rowTolerance;
54
+ const indexWithTolerance = rowIndexWithTolerance * itemsPerRow;
55
+ const lengthWithTolerance = rowLengthWithTolerance * itemsPerRow;
56
+
57
+ const visibleItems = items.slice(
58
+ indexWithTolerance,
59
+ indexWithTolerance + lengthWithTolerance
60
+ );
61
+
62
+ return {
63
+ index,
64
+ length,
65
+ indexWithTolerance,
66
+ lengthWithTolerance,
67
+ visibleItems,
68
+ totalHeight,
69
+ topPadding,
70
+ };
71
+ };
@@ -1,89 +1,89 @@
1
- import * as styles from './styles';
2
-
3
- import { useEffect, useState } from 'react';
4
-
5
- import { VirtualScrollerTemplateFC } from './types';
6
- import { useVirtualScrolling } from './hooks';
7
-
8
- type VirtualScrollerProps<R, P extends object> = {
9
- gridTemplateColumns: string;
10
- items: R[];
11
- itemTemplate: VirtualScrollerTemplateFC<R, P>;
12
- rowHeightInPx: number;
13
- gap?: string;
14
- itemsPerRow?: number;
15
- tolerance?: number;
16
- itemProps: P | ((item: R, index: number) => P);
17
- onRangeChanged?: (index: number, length: number) => void;
18
- integrated?: boolean;
19
- };
20
-
21
- export const VirtualScroller = <R, P extends object>({
22
- gridTemplateColumns,
23
- items,
24
- rowHeightInPx,
25
- itemTemplate: ItemTemplate,
26
- itemProps,
27
- onRangeChanged,
28
- gap,
29
- itemsPerRow,
30
- tolerance,
31
- integrated,
32
- }: VirtualScrollerProps<R, P>) => {
33
- const [scrollableElement, setScrollableElement] =
34
- useState<HTMLElement | null>(null);
35
- const {
36
- indexWithTolerance,
37
- lengthWithTolerance,
38
- visibleItems,
39
- topPadding,
40
- totalHeight,
41
- } = useVirtualScrolling<R>({
42
- scrollableElement,
43
- rowHeightInPx,
44
- items,
45
- itemsPerRow,
46
- tolerance,
47
- });
48
-
49
- useEffect(() => {
50
- onRangeChanged?.(indexWithTolerance, lengthWithTolerance);
51
- }, [indexWithTolerance, lengthWithTolerance, onRangeChanged]);
52
-
53
- return (
54
- <styles.VirtualScrollerContainer $integrated={integrated}>
55
- <styles.VirtualScrollerFiller
56
- $height={totalHeight}
57
- ref={(element) =>
58
- setScrollableElement(
59
- (integrated
60
- ? element?.parentElement?.parentElement
61
- : element?.parentElement) ?? null
62
- )
63
- }
64
- >
65
- <styles.VirtualScrollerItemsContainer
66
- $gridTemplateColumns={gridTemplateColumns}
67
- $topPadding={topPadding}
68
- $itemHeight={rowHeightInPx}
69
- $gap={gap}
70
- >
71
- {visibleItems.map((item, currentIndex) => {
72
- const currentItemProps =
73
- typeof itemProps === 'function'
74
- ? itemProps(item, indexWithTolerance + currentIndex)
75
- : itemProps;
76
- return (
77
- <ItemTemplate
78
- key={indexWithTolerance + currentIndex}
79
- item={item}
80
- index={currentIndex}
81
- {...currentItemProps}
82
- />
83
- );
84
- })}
85
- </styles.VirtualScrollerItemsContainer>
86
- </styles.VirtualScrollerFiller>
87
- </styles.VirtualScrollerContainer>
88
- );
89
- };
1
+ import * as styles from './styles';
2
+
3
+ import { useEffect, useState } from 'react';
4
+
5
+ import { VirtualScrollerTemplateFC } from './types';
6
+ import { useVirtualScrolling } from './hooks';
7
+
8
+ type VirtualScrollerProps<R, P extends object> = {
9
+ gridTemplateColumns: string;
10
+ items: R[];
11
+ itemTemplate: VirtualScrollerTemplateFC<R, P>;
12
+ rowHeightInPx: number;
13
+ gap?: string;
14
+ itemsPerRow?: number;
15
+ tolerance?: number;
16
+ itemProps: P | ((item: R, index: number) => P);
17
+ onRangeChanged?: (index: number, length: number) => void;
18
+ integrated?: boolean;
19
+ };
20
+
21
+ export const VirtualScroller = <R, P extends object>({
22
+ gridTemplateColumns,
23
+ items,
24
+ rowHeightInPx,
25
+ itemTemplate: ItemTemplate,
26
+ itemProps,
27
+ onRangeChanged,
28
+ gap,
29
+ itemsPerRow,
30
+ tolerance,
31
+ integrated,
32
+ }: VirtualScrollerProps<R, P>) => {
33
+ const [scrollableElement, setScrollableElement] =
34
+ useState<HTMLElement | null>(null);
35
+ const {
36
+ indexWithTolerance,
37
+ lengthWithTolerance,
38
+ visibleItems,
39
+ topPadding,
40
+ totalHeight,
41
+ } = useVirtualScrolling<R>({
42
+ scrollableElement,
43
+ rowHeightInPx,
44
+ items,
45
+ itemsPerRow,
46
+ tolerance,
47
+ });
48
+
49
+ useEffect(() => {
50
+ onRangeChanged?.(indexWithTolerance, lengthWithTolerance);
51
+ }, [indexWithTolerance, lengthWithTolerance, onRangeChanged]);
52
+
53
+ return (
54
+ <styles.VirtualScrollerContainer $integrated={integrated}>
55
+ <styles.VirtualScrollerFiller
56
+ $height={totalHeight}
57
+ ref={(element) =>
58
+ setScrollableElement(
59
+ (integrated
60
+ ? element?.parentElement?.parentElement
61
+ : element?.parentElement) ?? null
62
+ )
63
+ }
64
+ >
65
+ <styles.VirtualScrollerItemsContainer
66
+ $gridTemplateColumns={gridTemplateColumns}
67
+ $topPadding={topPadding}
68
+ $itemHeight={rowHeightInPx}
69
+ $gap={gap}
70
+ >
71
+ {visibleItems.map((item, currentIndex) => {
72
+ const currentItemProps =
73
+ typeof itemProps === 'function'
74
+ ? itemProps(item, indexWithTolerance + currentIndex)
75
+ : itemProps;
76
+ return (
77
+ <ItemTemplate
78
+ key={indexWithTolerance + currentIndex}
79
+ item={item}
80
+ index={currentIndex}
81
+ {...currentItemProps}
82
+ />
83
+ );
84
+ })}
85
+ </styles.VirtualScrollerItemsContainer>
86
+ </styles.VirtualScrollerFiller>
87
+ </styles.VirtualScrollerContainer>
88
+ );
89
+ };
@@ -1,57 +1,57 @@
1
- import styled from 'styled-components';
2
-
3
- export const TopPaddingItem = styled.div``;
4
- export const BottomPaddingItem = styled.div``;
5
-
6
- export const VirtualScrollerContainer = styled.div<{
7
- $integrated?: boolean;
8
- }>`
9
- position: relative;
10
- overflow: auto;
11
- height: 100%;
12
- display: ${({ $integrated }) => ($integrated ? 'contents' : 'block')};
13
- `;
14
-
15
- export const VirtualScrollerFiller = styled.div.attrs<{
16
- $height: number;
17
- }>(({ $height }) => ({
18
- style: {
19
- height: `${$height}px`,
20
- },
21
- }))`
22
- position: relative;
23
- overflow: visible;
24
- `;
25
-
26
- export const VirtualScrollerItemsContainer = styled.div.attrs<{
27
- $gridTemplateColumns: string;
28
- $gap?: string;
29
- $topPadding: number;
30
- $itemHeight: number;
31
- }>(({ $gridTemplateColumns, $topPadding, $itemHeight }) => {
32
- const itemHeightValue = `${$itemHeight}px`;
33
- return {
34
- className: 'VirtualScrollerItemsContainer',
35
- style: {
36
- top: `${$topPadding}px`,
37
- gridTemplateColumns: $gridTemplateColumns,
38
- gridAutoItems: itemHeightValue,
39
- },
40
- };
41
- })`
42
- display: grid;
43
- position: absolute;
44
- min-width: 100%;
45
- grid-gap: ${({ $gap }) => $gap};
46
-
47
- ${TopPaddingItem} {
48
- grid-column-start: 1;
49
- grid-column-end: -1;
50
- grid-row: 1;
51
- }
52
- ${BottomPaddingItem} {
53
- grid-column-start: 1;
54
- grid-column-end: -1;
55
- grid-row: -1;
56
- }
57
- `;
1
+ import styled from 'styled-components';
2
+
3
+ export const TopPaddingItem = styled.div``;
4
+ export const BottomPaddingItem = styled.div``;
5
+
6
+ export const VirtualScrollerContainer = styled.div<{
7
+ $integrated?: boolean;
8
+ }>`
9
+ position: relative;
10
+ overflow: auto;
11
+ height: 100%;
12
+ display: ${({ $integrated }) => ($integrated ? 'contents' : 'block')};
13
+ `;
14
+
15
+ export const VirtualScrollerFiller = styled.div.attrs<{
16
+ $height: number;
17
+ }>(({ $height }) => ({
18
+ style: {
19
+ height: `${$height}px`,
20
+ },
21
+ }))`
22
+ position: relative;
23
+ overflow: visible;
24
+ `;
25
+
26
+ export const VirtualScrollerItemsContainer = styled.div.attrs<{
27
+ $gridTemplateColumns: string;
28
+ $gap?: string;
29
+ $topPadding: number;
30
+ $itemHeight: number;
31
+ }>(({ $gridTemplateColumns, $topPadding, $itemHeight }) => {
32
+ const itemHeightValue = `${$itemHeight}px`;
33
+ return {
34
+ className: 'VirtualScrollerItemsContainer',
35
+ style: {
36
+ top: `${$topPadding}px`,
37
+ gridTemplateColumns: $gridTemplateColumns,
38
+ gridAutoItems: itemHeightValue,
39
+ },
40
+ };
41
+ })`
42
+ display: grid;
43
+ position: absolute;
44
+ min-width: 100%;
45
+ grid-gap: ${({ $gap }) => $gap};
46
+
47
+ ${TopPaddingItem} {
48
+ grid-column-start: 1;
49
+ grid-column-end: -1;
50
+ grid-row: 1;
51
+ }
52
+ ${BottomPaddingItem} {
53
+ grid-column-start: 1;
54
+ grid-column-end: -1;
55
+ grid-row: -1;
56
+ }
57
+ `;
@@ -1,10 +1,10 @@
1
- import { FC } from 'react';
2
-
3
- export type VirtualScrollerTemplateProps<R, P extends object = {}> = P & {
4
- item: R | null;
5
- index: number;
6
- };
7
-
8
- export type VirtualScrollerTemplateFC<R, P extends object = {}> = FC<
9
- VirtualScrollerTemplateProps<R, P>
10
- >;
1
+ import { FC } from 'react';
2
+
3
+ export type VirtualScrollerTemplateProps<R, P extends object = {}> = P & {
4
+ item: R | null;
5
+ index: number;
6
+ };
7
+
8
+ export type VirtualScrollerTemplateFC<R, P extends object = {}> = FC<
9
+ VirtualScrollerTemplateProps<R, P>
10
+ >;