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