@addev-be/ui 2.7.0 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/assets/icons/arrow-down-1-9.svg +1 -1
  2. package/assets/icons/arrow-down-a-z.svg +1 -1
  3. package/assets/icons/arrow-up-z-a.svg +1 -1
  4. package/assets/icons/check.svg +1 -1
  5. package/assets/icons/circle-check.svg +1 -1
  6. package/assets/icons/down.svg +1 -1
  7. package/assets/icons/filter-full.svg +1 -1
  8. package/assets/icons/filter.svg +1 -1
  9. package/assets/icons/hashtag.svg +1 -1
  10. package/assets/icons/image-slash.svg +1 -1
  11. package/assets/icons/left.svg +1 -1
  12. package/assets/icons/magnifier.svg +1 -1
  13. package/assets/icons/phone.svg +1 -1
  14. package/assets/icons/right.svg +1 -1
  15. package/assets/icons/sort-calendar-ascending.svg +5 -5
  16. package/assets/icons/spinner-third.svg +1 -1
  17. package/assets/icons/table-columns.svg +1 -1
  18. package/assets/icons/table-footer-slash.svg +4 -4
  19. package/assets/icons/table-footer.svg +3 -3
  20. package/assets/icons/up.svg +1 -1
  21. package/assets/icons/user-tie.svg +1 -1
  22. package/assets/icons/x-bar.svg +3 -3
  23. package/dist/components/data/AdvancedRequestDataGrid/helpers/advancedRequests.js +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/SmartQueryDataGrid/helpers/columns.d.ts +20 -0
  38. package/dist/components/data/SmartQueryDataGrid/helpers/columns.js +160 -0
  39. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.d.ts +5 -0
  40. package/dist/components/data/SmartQueryDataGrid/helpers/hooks.js +41 -0
  41. package/dist/components/data/SmartQueryDataGrid/helpers/index.d.ts +2 -0
  42. package/dist/components/data/SmartQueryDataGrid/helpers/index.js +18 -0
  43. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.d.ts +3 -0
  44. package/dist/components/data/SmartQueryDataGrid/helpers/smartQueries.js +15 -0
  45. package/dist/components/data/SmartQueryDataGrid/hooks.d.ts +9 -0
  46. package/dist/components/data/SmartQueryDataGrid/hooks.js +63 -0
  47. package/dist/components/data/SmartQueryDataGrid/index.d.ts +12 -0
  48. package/dist/components/data/SmartQueryDataGrid/index.js +242 -0
  49. package/dist/components/data/SmartQueryDataGrid/types.d.ts +22 -0
  50. package/dist/components/data/SmartQueryDataGrid/types.js +2 -0
  51. package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.d.ts +2 -1
  52. package/dist/components/data/SqlRequestDataGrid/SqlRequestForeignListEditableCell.js +2 -3
  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/react.d.ts +2 -0
  60. package/dist/helpers/react.js +8 -0
  61. package/dist/services/index.js +17 -7
  62. package/dist/services/requests/userPermissions.d.ts +4 -0
  63. package/dist/services/requests/userPermissions.js +20 -0
  64. package/eslint.config.js +3 -3
  65. package/package.json +2 -2
  66. package/src/Icons.tsx +138 -138
  67. package/src/components/auth/LoginForm.tsx +86 -86
  68. package/src/components/auth/LoginPage.tsx +32 -32
  69. package/src/components/auth/PasswordRecoveryForm.tsx +53 -53
  70. package/src/components/auth/PasswordResetForm.tsx +112 -112
  71. package/src/components/auth/styles.ts +14 -14
  72. package/src/components/data/DataGrid/DataGridCell.tsx +81 -81
  73. package/src/components/data/DataGrid/DataGridColumnsModal/helpers.ts +9 -9
  74. package/src/components/data/DataGrid/DataGridColumnsModal/hooks.tsx +59 -59
  75. package/src/components/data/DataGrid/DataGridColumnsModal/index.tsx +182 -182
  76. package/src/components/data/DataGrid/DataGridColumnsModal/styles.ts +104 -104
  77. package/src/components/data/DataGrid/DataGridEditableCell/CheckboxEditableCell.tsx +37 -37
  78. package/src/components/data/DataGrid/DataGridEditableCell/DateEditableCell.tsx +38 -38
  79. package/src/components/data/DataGrid/DataGridEditableCell/NumberEditableCell.tsx +71 -71
  80. package/src/components/data/DataGrid/DataGridEditableCell/TextEditableCell.tsx +37 -37
  81. package/src/components/data/DataGrid/DataGridEditableCell/index.tsx +106 -106
  82. package/src/components/data/DataGrid/DataGridEditableCell/styles.ts +35 -35
  83. package/src/components/data/DataGrid/DataGridEditableCell/types.ts +18 -18
  84. package/src/components/data/DataGrid/DataGridFilterMenu/FilterValuesScroller.tsx +129 -129
  85. package/src/components/data/DataGrid/DataGridFilterMenu/hooks.tsx +81 -81
  86. package/src/components/data/DataGrid/DataGridFilterMenu/index.tsx +370 -370
  87. package/src/components/data/DataGrid/DataGridFilterMenu/styles.ts +97 -97
  88. package/src/components/data/DataGrid/DataGridFooter.tsx +47 -47
  89. package/src/components/data/DataGrid/DataGridHeader.tsx +74 -74
  90. package/src/components/data/DataGrid/DataGridHeaderCell.tsx +112 -112
  91. package/src/components/data/DataGrid/DataGridRowTemplate.tsx +83 -83
  92. package/src/components/data/DataGrid/DataGridToolbar.tsx +134 -134
  93. package/src/components/data/DataGrid/FilterModalContent/index.tsx +137 -137
  94. package/src/components/data/DataGrid/FilterModalContent/styles.ts +22 -22
  95. package/src/components/data/DataGrid/constants.ts +6 -6
  96. package/src/components/data/DataGrid/helpers/columns.tsx +449 -449
  97. package/src/components/data/DataGrid/helpers/filters.ts +287 -287
  98. package/src/components/data/DataGrid/helpers/index.ts +2 -2
  99. package/src/components/data/DataGrid/hooks/index.ts +29 -29
  100. package/src/components/data/DataGrid/hooks/useDataGrid.tsx +383 -383
  101. package/src/components/data/DataGrid/hooks/useDataGridChangedRows.ts +97 -97
  102. package/src/components/data/DataGrid/hooks/useDataGridCopy.ts +174 -174
  103. package/src/components/data/DataGrid/hooks/useDataGridSettings.ts +48 -48
  104. package/src/components/data/DataGrid/hooks/useRefreshModal.tsx +48 -48
  105. package/src/components/data/DataGrid/index.tsx +111 -111
  106. package/src/components/data/DataGrid/styles.ts +434 -434
  107. package/src/components/data/DataGrid/types.ts +380 -380
  108. package/src/components/data/SqlRequestDataGrid/helpers/columns.tsx +526 -526
  109. package/src/components/data/SqlRequestDataGrid/helpers/index.ts +2 -2
  110. package/src/components/data/SqlRequestDataGrid/helpers/rows.ts +24 -24
  111. package/src/components/data/SqlRequestDataGrid/helpers/sqlRequests.ts +17 -17
  112. package/src/components/data/SqlRequestDataGrid/index.tsx +417 -417
  113. package/src/components/data/SqlRequestDataGrid/styles.ts +15 -15
  114. package/src/components/data/SqlRequestDataGrid/types.ts +74 -74
  115. package/src/components/data/SqlRequestForeignList/index.tsx +254 -254
  116. package/src/components/data/SqlRequestForeignList/styles.ts +43 -43
  117. package/src/components/data/SqlRequestForeignList/types.ts +32 -32
  118. package/src/components/data/SqlRequestGrid/filters/FiltersSidebar.tsx +108 -108
  119. package/src/components/data/SqlRequestGrid/filters/styles.ts +88 -88
  120. package/src/components/data/SqlRequestGrid/helpers/index.ts +1 -1
  121. package/src/components/data/SqlRequestGrid/helpers/sqlRequests.ts +16 -16
  122. package/src/components/data/SqlRequestGrid/index.tsx +304 -304
  123. package/src/components/data/SqlRequestGrid/styles.ts +20 -20
  124. package/src/components/data/SqlRequestGrid/types.ts +73 -73
  125. package/src/components/data/VirtualScroller/hooks.ts +71 -71
  126. package/src/components/data/VirtualScroller/index.tsx +89 -89
  127. package/src/components/data/VirtualScroller/styles.ts +57 -57
  128. package/src/components/data/VirtualScroller/types.ts +10 -10
  129. package/src/components/forms/AutoTextArea.tsx +48 -48
  130. package/src/components/forms/BillitIdentifier/index.tsx +78 -78
  131. package/src/components/forms/BillitIdentifier/styles.tsx +43 -43
  132. package/src/components/forms/Button.tsx +132 -132
  133. package/src/components/forms/Form/Checkbox.tsx +12 -12
  134. package/src/components/forms/Form/CustomSelect.tsx +86 -86
  135. package/src/components/forms/Form/FormGroup.tsx +33 -33
  136. package/src/components/forms/Form/Input.tsx +16 -16
  137. package/src/components/forms/Form/Row.tsx +28 -28
  138. package/src/components/forms/Form/Select.tsx +99 -99
  139. package/src/components/forms/Form/TextArea.tsx +17 -17
  140. package/src/components/forms/Form/index.tsx +48 -48
  141. package/src/components/forms/Form/styles.ts +148 -148
  142. package/src/components/forms/IconButton.tsx +61 -61
  143. package/src/components/forms/IndeterminateCheckbox.tsx +46 -46
  144. package/src/components/forms/NumberInput.tsx +53 -53
  145. package/src/components/forms/Select.tsx +34 -34
  146. package/src/components/forms/VerticalLabel.tsx +20 -20
  147. package/src/components/forms/styles.ts +42 -42
  148. package/src/components/layout/Columns.ts +28 -28
  149. package/src/components/layout/Dropdown/index.tsx +113 -113
  150. package/src/components/layout/Dropdown/styles.ts +53 -53
  151. package/src/components/layout/Flexbox.ts +21 -21
  152. package/src/components/layout/Grid/index.tsx +8 -8
  153. package/src/components/layout/Grid/styles.ts +34 -34
  154. package/src/components/layout/Loading/index.tsx +29 -29
  155. package/src/components/layout/Loading/styles.ts +29 -29
  156. package/src/components/layout/Masonry/index.tsx +29 -29
  157. package/src/components/layout/Masonry/styles.ts +20 -20
  158. package/src/components/layout/Modal/index.tsx +51 -51
  159. package/src/components/layout/Modal/styles.ts +125 -125
  160. package/src/components/search/HighlightedText.tsx +41 -41
  161. package/src/components/search/QuickSearchBar.tsx +102 -102
  162. package/src/components/search/QuickSearchResults.tsx +86 -86
  163. package/src/components/search/styles.ts +96 -96
  164. package/src/components/search/types.ts +29 -29
  165. package/src/components/ui/Avatar/index.tsx +54 -54
  166. package/src/components/ui/Card/index.tsx +16 -16
  167. package/src/components/ui/Card/styles.ts +41 -41
  168. package/src/components/ui/ContextMenu/index.tsx +79 -79
  169. package/src/components/ui/ContextMenu/styles.ts +119 -119
  170. package/src/components/ui/Ellipsis.tsx +33 -33
  171. package/src/components/ui/Label.tsx +93 -93
  172. package/src/components/ui/Message/index.tsx +57 -57
  173. package/src/components/ui/Message/styles.ts +44 -44
  174. package/src/components/ui/TabsView/TabsList.tsx +49 -49
  175. package/src/components/ui/TabsView/TabsView.tsx +42 -42
  176. package/src/components/ui/TabsView/styles.ts +84 -84
  177. package/src/components/ui/TabsView/types.ts +15 -15
  178. package/src/config/index.ts +10 -10
  179. package/src/helpers/components.ts +9 -9
  180. package/src/helpers/dates.ts +17 -17
  181. package/src/helpers/getScrollbarSize.ts +14 -14
  182. package/src/helpers/numbers.ts +63 -63
  183. package/src/helpers/responsive.ts +83 -83
  184. package/src/helpers/styled/space.ts +114 -114
  185. package/src/helpers/styled/typography.ts +25 -25
  186. package/src/helpers/text.ts +13 -13
  187. package/src/helpers/types.ts +9 -9
  188. package/src/hooks/useContainerMediaQuery.ts +7 -7
  189. package/src/hooks/useElementSize.ts +24 -24
  190. package/src/hooks/useMediaQuery.ts +9 -9
  191. package/src/hooks/useMediaQueryForWidth.ts +35 -35
  192. package/src/hooks/useMutableState.test.ts +410 -410
  193. package/src/hooks/useMutableState.ts +39 -39
  194. package/src/hooks/useShowArchived.ts +28 -28
  195. package/src/hooks/useWindowSize.ts +20 -20
  196. package/src/index.ts +103 -103
  197. package/src/providers/AuthenticationProvider/helpers.ts +3 -3
  198. package/src/providers/AuthenticationProvider/index.tsx +303 -303
  199. package/src/providers/LoadingProvider/index.tsx +47 -47
  200. package/src/providers/PortalsProvider/index.tsx +54 -54
  201. package/src/providers/PortalsProvider/styles.ts +31 -31
  202. package/src/providers/SettingsProvider/index.tsx +70 -70
  203. package/src/providers/ThemeProvider/defaultTheme.ts +471 -471
  204. package/src/providers/ThemeProvider/helpers.ts +84 -84
  205. package/src/providers/ThemeProvider/index.ts +73 -73
  206. package/src/providers/ThemeProvider/types.ts +134 -134
  207. package/src/providers/ToastProvider/index.tsx +93 -93
  208. package/src/providers/TrackingProvider/index.tsx +71 -71
  209. package/src/providers/UiProviders/index.tsx +76 -76
  210. package/src/providers/UiProviders/styles.ts +10 -10
  211. package/src/providers/hooks.ts +14 -14
  212. package/src/services/HttpService.ts +92 -92
  213. package/src/services/WebSocketService.ts +155 -155
  214. package/src/services/advancedRequests.ts +102 -102
  215. package/src/services/base.ts +23 -23
  216. package/src/services/globalSearch.ts +32 -32
  217. package/src/services/hooks.ts +92 -92
  218. package/src/services/requests/auth.ts +44 -44
  219. package/src/services/requests/generic.ts +62 -62
  220. package/src/services/requests/printing.ts +12 -12
  221. package/src/services/requests/tracking.ts +12 -12
  222. package/src/services/requests/userProfiles.ts +35 -35
  223. package/src/services/requests/users.ts +28 -28
  224. package/src/services/smartQueries.ts +122 -122
  225. package/src/services/sqlRequests.ts +119 -119
  226. package/src/services/types/auth.ts +98 -98
  227. package/src/services/types/base.ts +10 -10
  228. package/src/services/types/generic.ts +82 -82
  229. package/src/services/types/printing.ts +10 -10
  230. package/src/services/types/tracking.ts +29 -29
  231. package/src/services/types/userProfiles.ts +79 -79
  232. package/src/services/types/users.ts +74 -74
  233. package/src/services/updateSqlRequests.ts +32 -32
  234. package/src/styles/animations.scss +30 -30
  235. package/src/styles/index.scss +42 -42
  236. package/src/types.ts +8 -8
  237. package/src/typings.d.ts +2 -2
  238. package/tsconfig.json +18 -18
@@ -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
+ >;