@addev-be/ui 2.4.5 → 2.4.7

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