@synerise/ds-table-new 0.1.0

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 (232) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +153 -0
  4. package/dist/Table.const.d.ts +20 -0
  5. package/dist/Table.const.js +42 -0
  6. package/dist/Table.d.ts +3 -0
  7. package/dist/Table.js +51 -0
  8. package/dist/Table.styles.d.ts +15 -0
  9. package/dist/Table.styles.js +29 -0
  10. package/dist/Table.types.d.ts +359 -0
  11. package/dist/Table.types.js +1 -0
  12. package/dist/VirtualTable.d.ts +3 -0
  13. package/dist/VirtualTable.js +222 -0
  14. package/dist/components/BaseTable/BaseTable.d.ts +3 -0
  15. package/dist/components/BaseTable/BaseTable.js +114 -0
  16. package/dist/components/BaseTable/BaseTable.styles.d.ts +28 -0
  17. package/dist/components/BaseTable/BaseTable.styles.js +41 -0
  18. package/dist/components/Cell/Action/ActionCell.d.ts +3 -0
  19. package/dist/components/Cell/Action/ActionCell.js +16 -0
  20. package/dist/components/Cell/Action/ActionCell.styles.d.ts +5 -0
  21. package/dist/components/Cell/Action/ActionCell.styles.js +13 -0
  22. package/dist/components/Cell/Action/ActionCell.types.d.ts +13 -0
  23. package/dist/components/Cell/Action/ActionCell.types.js +1 -0
  24. package/dist/components/Cell/AvatarLabel/AvatarLabel.d.ts +4 -0
  25. package/dist/components/Cell/AvatarLabel/AvatarLabel.js +42 -0
  26. package/dist/components/Cell/AvatarLabel/AvatarLabel.styles.d.ts +27 -0
  27. package/dist/components/Cell/AvatarLabel/AvatarLabel.styles.js +49 -0
  28. package/dist/components/Cell/AvatarLabel/AvatarLabel.types.d.ts +22 -0
  29. package/dist/components/Cell/AvatarLabel/AvatarLabel.types.js +1 -0
  30. package/dist/components/Cell/Copyable/Copyable.styles.d.ts +2 -0
  31. package/dist/components/Cell/Copyable/Copyable.styles.js +14 -0
  32. package/dist/components/Cell/Copyable/Copyable.types.d.ts +11 -0
  33. package/dist/components/Cell/Copyable/Copyable.types.js +1 -0
  34. package/dist/components/Cell/Copyable/CopyableCell.d.ts +4 -0
  35. package/dist/components/Cell/Copyable/CopyableCell.js +28 -0
  36. package/dist/components/Cell/Editable/EditableCell.d.ts +4 -0
  37. package/dist/components/Cell/Editable/EditableCell.js +30 -0
  38. package/dist/components/Cell/Editable/EditableCell.styles.d.ts +4 -0
  39. package/dist/components/Cell/Editable/EditableCell.styles.js +14 -0
  40. package/dist/components/Cell/Editable/EditableCell.types.d.ts +11 -0
  41. package/dist/components/Cell/Editable/EditableCell.types.js +1 -0
  42. package/dist/components/Cell/FlagLabel/FlagLabelCell.d.ts +4 -0
  43. package/dist/components/Cell/FlagLabel/FlagLabelCell.js +16 -0
  44. package/dist/components/Cell/FlagLabel/FlagLabelCell.styles.d.ts +1 -0
  45. package/dist/components/Cell/FlagLabel/FlagLabelCell.styles.js +8 -0
  46. package/dist/components/Cell/FlagLabel/FlagLabelCell.types.d.ts +11 -0
  47. package/dist/components/Cell/FlagLabel/FlagLabelCell.types.js +1 -0
  48. package/dist/components/Cell/IconLabel/IconLabel.d.ts +4 -0
  49. package/dist/components/Cell/IconLabel/IconLabel.js +15 -0
  50. package/dist/components/Cell/IconLabel/IconLabel.styles.d.ts +3 -0
  51. package/dist/components/Cell/IconLabel/IconLabel.styles.js +9 -0
  52. package/dist/components/Cell/IconLabel/IconLabel.types.d.ts +13 -0
  53. package/dist/components/Cell/IconLabel/IconLabel.types.js +1 -0
  54. package/dist/components/Cell/IconTooltipCell/IconTooltipCell.d.ts +4 -0
  55. package/dist/components/Cell/IconTooltipCell/IconTooltipCell.js +19 -0
  56. package/dist/components/Cell/IconTooltipCell/IconTooltipCell.styles.d.ts +4 -0
  57. package/dist/components/Cell/IconTooltipCell/IconTooltipCell.styles.js +13 -0
  58. package/dist/components/Cell/IconTooltipCell/IconTooltipCell.types.d.ts +16 -0
  59. package/dist/components/Cell/IconTooltipCell/IconTooltipCell.types.js +1 -0
  60. package/dist/components/Cell/InputNumber/InputNumberCell.d.ts +4 -0
  61. package/dist/components/Cell/InputNumber/InputNumberCell.js +11 -0
  62. package/dist/components/Cell/InputNumber/InputNumberCell.styles.d.ts +3 -0
  63. package/dist/components/Cell/InputNumber/InputNumberCell.styles.js +11 -0
  64. package/dist/components/Cell/InputNumber/InputNumberCell.types.d.ts +7 -0
  65. package/dist/components/Cell/InputNumber/InputNumberCell.types.js +1 -0
  66. package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.d.ts +5 -0
  67. package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.js +33 -0
  68. package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.styles.d.ts +3 -0
  69. package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.styles.js +18 -0
  70. package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.types.d.ts +22 -0
  71. package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.types.js +1 -0
  72. package/dist/components/Cell/LabelsWithShowMore/Modal/Modal.d.ts +4 -0
  73. package/dist/components/Cell/LabelsWithShowMore/Modal/Modal.js +37 -0
  74. package/dist/components/Cell/LabelsWithShowMore/Modal/Modal.types.d.ts +15 -0
  75. package/dist/components/Cell/LabelsWithShowMore/Modal/Modal.types.js +1 -0
  76. package/dist/components/Cell/Star/StarCell.d.ts +4 -0
  77. package/dist/components/Cell/Star/StarCell.js +25 -0
  78. package/dist/components/Cell/Star/StarCell.styles.d.ts +5 -0
  79. package/dist/components/Cell/Star/StarCell.styles.js +16 -0
  80. package/dist/components/Cell/Star/StarCell.types.d.ts +17 -0
  81. package/dist/components/Cell/Star/StarCell.types.js +1 -0
  82. package/dist/components/Cell/StatusLabel/StatusLabel.d.ts +4 -0
  83. package/dist/components/Cell/StatusLabel/StatusLabel.js +18 -0
  84. package/dist/components/Cell/StatusLabel/StatusLabel.styles.d.ts +4 -0
  85. package/dist/components/Cell/StatusLabel/StatusLabel.styles.js +13 -0
  86. package/dist/components/Cell/StatusLabel/StatusLabel.types.d.ts +14 -0
  87. package/dist/components/Cell/StatusLabel/StatusLabel.types.js +1 -0
  88. package/dist/components/Cell/TagIcon/TagIcon.d.ts +4 -0
  89. package/dist/components/Cell/TagIcon/TagIcon.js +10 -0
  90. package/dist/components/Cell/TagIcon/TagIcon.styles.d.ts +3 -0
  91. package/dist/components/Cell/TagIcon/TagIcon.styles.js +9 -0
  92. package/dist/components/Cell/TagIcon/TagIcon.types.d.ts +11 -0
  93. package/dist/components/Cell/TagIcon/TagIcon.types.js +1 -0
  94. package/dist/components/Cell/TagsGroup/TagsGroup.d.ts +3 -0
  95. package/dist/components/Cell/TagsGroup/TagsGroup.js +26 -0
  96. package/dist/components/Cell/TagsGroup/TagsGroup.styles.d.ts +5 -0
  97. package/dist/components/Cell/TagsGroup/TagsGroup.styles.js +34 -0
  98. package/dist/components/Cell/TagsGroup/TagsGroup.types.d.ts +9 -0
  99. package/dist/components/Cell/TagsGroup/TagsGroup.types.js +1 -0
  100. package/dist/components/Cell/index.d.ts +26 -0
  101. package/dist/components/Cell/index.js +28 -0
  102. package/dist/components/TableBody/TableBody.d.ts +3 -0
  103. package/dist/components/TableBody/TableBody.js +40 -0
  104. package/dist/components/TableBody/TableBody.styles.d.ts +2 -0
  105. package/dist/components/TableBody/TableBody.styles.js +15 -0
  106. package/dist/components/TableBody/TableBodySkeleton/TableBodySkeleton.d.ts +5 -0
  107. package/dist/components/TableBody/TableBodySkeleton/TableBodySkeleton.js +42 -0
  108. package/dist/components/TableBody/TableBodySkeleton/TableBodySkeleton.styles.d.ts +9 -0
  109. package/dist/components/TableBody/TableBodySkeleton/TableBodySkeleton.styles.js +30 -0
  110. package/dist/components/TableBody/TableCell/TableCell.d.ts +16 -0
  111. package/dist/components/TableBody/TableCell/TableCell.js +19 -0
  112. package/dist/components/TableBody/TableCell/TableCell.styles.d.ts +10 -0
  113. package/dist/components/TableBody/TableCell/TableCell.styles.js +18 -0
  114. package/dist/components/TableBody/TableEmptyBody/TableEmptyBody.d.ts +3 -0
  115. package/dist/components/TableBody/TableEmptyBody/TableEmptyBody.js +18 -0
  116. package/dist/components/TableBody/TableEmptyBody/TableEmptyBody.styles.d.ts +4 -0
  117. package/dist/components/TableBody/TableEmptyBody/TableEmptyBody.styles.js +23 -0
  118. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/ErrorItem.d.ts +8 -0
  119. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/ErrorItem.js +19 -0
  120. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/ErrorItem.styles.d.ts +1 -0
  121. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/ErrorItem.styles.js +8 -0
  122. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/InfiniteLoaderRow.d.ts +14 -0
  123. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/InfiniteLoaderRow.js +50 -0
  124. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/LoadingItem.d.ts +5 -0
  125. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/LoadingItem.js +10 -0
  126. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/LoadingItem.styles.d.ts +1 -0
  127. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/LoadingItem.styles.js +9 -0
  128. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/NoMoreItem.d.ts +5 -0
  129. package/dist/components/TableBody/TableRow/InfiniteLoaderRow/NoMoreItem.js +10 -0
  130. package/dist/components/TableBody/TableRow/TableRow.d.ts +5 -0
  131. package/dist/components/TableBody/TableRow/TableRow.js +29 -0
  132. package/dist/components/TableBody/TableRow/TableRow.styles.d.ts +7 -0
  133. package/dist/components/TableBody/TableRow/TableRow.styles.js +15 -0
  134. package/dist/components/TableBody/TableRow/TableRowVirtual.d.ts +5 -0
  135. package/dist/components/TableBody/TableRow/TableRowVirtual.js +88 -0
  136. package/dist/components/TableBody/TableRowSelection/TableRowSelection.d.ts +3 -0
  137. package/dist/components/TableBody/TableRowSelection/TableRowSelection.js +39 -0
  138. package/dist/components/TableColumns/TableColumnSorter/SortIcons/DefaultSortIcon.d.ts +5 -0
  139. package/dist/components/TableColumns/TableColumnSorter/SortIcons/DefaultSortIcon.js +19 -0
  140. package/dist/components/TableColumns/TableColumnSorter/SortIcons/StringSortIcon.d.ts +5 -0
  141. package/dist/components/TableColumns/TableColumnSorter/SortIcons/StringSortIcon.js +19 -0
  142. package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.const.d.ts +4 -0
  143. package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.const.js +8 -0
  144. package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.d.ts +3 -0
  145. package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.js +75 -0
  146. package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.styles.d.ts +30 -0
  147. package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.styles.js +11 -0
  148. package/dist/components/TableColumns/TableColumns.d.ts +3 -0
  149. package/dist/components/TableColumns/TableColumns.js +28 -0
  150. package/dist/components/TableColumns/TableColumns.styles.d.ts +18 -0
  151. package/dist/components/TableColumns/TableColumns.styles.js +35 -0
  152. package/dist/components/TableHeader/TableCounter/TableCounter.d.ts +3 -0
  153. package/dist/components/TableHeader/TableCounter/TableCounter.js +33 -0
  154. package/dist/components/TableHeader/TableCounter/TableCounter.styles.d.ts +1 -0
  155. package/dist/components/TableHeader/TableCounter/TableCounter.styles.js +8 -0
  156. package/dist/components/TableHeader/TableHeader.d.ts +3 -0
  157. package/dist/components/TableHeader/TableHeader.js +103 -0
  158. package/dist/components/TableHeader/TableHeader.styles.d.ts +18 -0
  159. package/dist/components/TableHeader/TableHeader.styles.js +48 -0
  160. package/dist/components/TableHeader/TableHeaderSelection/TableHeaderSelection.d.ts +3 -0
  161. package/dist/components/TableHeader/TableHeaderSelection/TableHeaderSelection.js +123 -0
  162. package/dist/components/TableHeader/TableHeaderSelection/TableHeaderSelection.styles.d.ts +8 -0
  163. package/dist/components/TableHeader/TableHeaderSelection/TableHeaderSelection.styles.js +21 -0
  164. package/dist/components/TableHeader/TableLimit/TableLimit.d.ts +3 -0
  165. package/dist/components/TableHeader/TableLimit/TableLimit.js +50 -0
  166. package/dist/components/TableHeader/TableLimit/TableLimit.styles.d.ts +4 -0
  167. package/dist/components/TableHeader/TableLimit/TableLimit.styles.js +24 -0
  168. package/dist/components/TableHeader/TableLimit/TableLimit.types.d.ts +10 -0
  169. package/dist/components/TableHeader/TableLimit/TableLimit.types.js +1 -0
  170. package/dist/components/TableHorizontalScroll/TableHorizontalScroll.d.ts +6 -0
  171. package/dist/components/TableHorizontalScroll/TableHorizontalScroll.js +41 -0
  172. package/dist/components/TableHorizontalScroll/TableHorizontalScroll.styles.d.ts +12 -0
  173. package/dist/components/TableHorizontalScroll/TableHorizontalScroll.styles.js +33 -0
  174. package/dist/components/TableHorizontalScrollBar/TableHorizontalScrollBar.d.ts +6 -0
  175. package/dist/components/TableHorizontalScrollBar/TableHorizontalScrollBar.js +11 -0
  176. package/dist/components/TableHorizontalScrollBar/TableHorizontalScrollBar.styles.d.ts +4 -0
  177. package/dist/components/TableHorizontalScrollBar/TableHorizontalScrollBar.styles.js +14 -0
  178. package/dist/components/TablePagination/TablePagination.d.ts +3 -0
  179. package/dist/components/TablePagination/TablePagination.js +19 -0
  180. package/dist/components/TablePagination/TablePagination.styles.d.ts +1 -0
  181. package/dist/components/TablePagination/TablePagination.styles.js +8 -0
  182. package/dist/contexts/SelectionContext.d.ts +4 -0
  183. package/dist/contexts/SelectionContext.js +10 -0
  184. package/dist/contexts/StickyContext.d.ts +8 -0
  185. package/dist/contexts/StickyContext.js +9 -0
  186. package/dist/contexts/TableContext.d.ts +11 -0
  187. package/dist/contexts/TableContext.js +13 -0
  188. package/dist/hooks/useColumnSizing.d.ts +23 -0
  189. package/dist/hooks/useColumnSizing.js +95 -0
  190. package/dist/hooks/useDefaultTexts.d.ts +2 -0
  191. package/dist/hooks/useDefaultTexts.js +95 -0
  192. package/dist/hooks/useInfiniteScroll.d.ts +13 -0
  193. package/dist/hooks/useInfiniteScroll.js +58 -0
  194. package/dist/hooks/useRowKey.d.ts +4 -0
  195. package/dist/hooks/useRowKey.js +27 -0
  196. package/dist/hooks/useScrollSync.d.ts +2 -0
  197. package/dist/hooks/useScrollSync.js +23 -0
  198. package/dist/hooks/useTable.d.ts +14 -0
  199. package/dist/hooks/useTable.js +168 -0
  200. package/dist/index.d.ts +9 -0
  201. package/dist/index.js +50 -0
  202. package/dist/types/table.d.js +1 -0
  203. package/dist/types/table.d.ts +28 -0
  204. package/dist/utils/arrayToTrueMap.d.ts +1 -0
  205. package/dist/utils/arrayToTrueMap.js +7 -0
  206. package/dist/utils/calculatePixels.d.ts +1 -0
  207. package/dist/utils/calculatePixels.js +21 -0
  208. package/dist/utils/compareKeys.d.ts +1 -0
  209. package/dist/utils/compareKeys.js +16 -0
  210. package/dist/utils/getChildrenColumnName.d.ts +1 -0
  211. package/dist/utils/getChildrenColumnName.js +7 -0
  212. package/dist/utils/getDefaultSkeletonColumns.d.ts +2 -0
  213. package/dist/utils/getDefaultSkeletonColumns.js +58 -0
  214. package/dist/utils/getInfiniteScrollPadding.d.ts +2 -0
  215. package/dist/utils/getInfiniteScrollPadding.js +13 -0
  216. package/dist/utils/getIsRevealed.d.ts +5 -0
  217. package/dist/utils/getIsRevealed.js +9 -0
  218. package/dist/utils/getPaginationConfig.d.ts +10 -0
  219. package/dist/utils/getPaginationConfig.js +19 -0
  220. package/dist/utils/getRecordSelectionStatus.d.ts +5 -0
  221. package/dist/utils/getRecordSelectionStatus.js +13 -0
  222. package/dist/utils/index.d.ts +2 -0
  223. package/dist/utils/index.js +6 -0
  224. package/dist/utils/isRecordSelectable.d.ts +2 -0
  225. package/dist/utils/isRecordSelectable.js +14 -0
  226. package/dist/utils/legacyColumnConfigAdapter.d.ts +3 -0
  227. package/dist/utils/legacyColumnConfigAdapter.js +113 -0
  228. package/dist/utils/processColumns.d.ts +3 -0
  229. package/dist/utils/processColumns.js +24 -0
  230. package/dist/utils/sort.d.ts +3 -0
  231. package/dist/utils/sort.js +14 -0
  232. package/package.json +76 -0
@@ -0,0 +1,359 @@
1
+ import { PaginationProps } from 'antd/lib/pagination';
2
+ import { MouseEvent, MutableRefObject, ReactElement, ReactNode, RefObject } from 'react';
3
+ import { TooltipProps } from '@synerise/ds-tooltip';
4
+ import { Column, ColumnDef, ColumnMeta, Row, RowData } from '@tanstack/react-table';
5
+ import { VirtualItem, Virtualizer } from '@tanstack/react-virtual';
6
+ /**
7
+ * Standard paginated table component props
8
+ */
9
+ export type TableProps<TData, TValue> = SharedTableProps<TData, TValue> & PaginatedProps & {
10
+ texts?: Partial<TableTexts>;
11
+ };
12
+ /**
13
+ * Virtual non-paginated table component props
14
+ */
15
+ export type VirtualTableProps<TData, TValue> = SharedTableProps<TData, TValue> & VirtualProps & {};
16
+ export type DSColumnMeta<TData extends RowData, TValue> = ColumnMeta<TData, TValue>;
17
+ export type Expandable<TData> = {
18
+ childrenColumnName?: keyof TData;
19
+ expandedRowKeys?: string[];
20
+ };
21
+ /**
22
+ * Table props shared virtual & non-virtual
23
+ */
24
+ export type SharedTableProps<TData, TValue> = {
25
+ data: TData[];
26
+ columns: ColumnDef<TData, TValue>[];
27
+ dataSourceTotalCount?: number;
28
+ expandable?: Expandable<TData>;
29
+ onRowClick?: (row: TData, event: MouseEvent<HTMLTableRowElement>) => void;
30
+ /**
31
+ * Returns tooltip props for a given row, or false to disable tooltip.
32
+ * When provided, the entire row is wrapped in a Tooltip component.
33
+ */
34
+ getRowTooltipProps?: (row: TData) => TooltipProps | false;
35
+ texts?: Partial<TableTexts>;
36
+ /** estimated row height (px) used by virtualizer */
37
+ cellHeight?: number;
38
+ /** optional className for styled-components composition */
39
+ className?: string;
40
+ /**
41
+ * renders in table header next to title and counter when there's any selected rows
42
+ * useful for rendering batch action items
43
+ */
44
+ itemsMenu?: ReactNode;
45
+ /**
46
+ * table title - renders in table header
47
+ */
48
+ title?: ReactNode;
49
+ /**
50
+ * display a skeleton loader in place of the table total count
51
+ * useful in a table with infinite loader - when total items count is a separate async reques
52
+ */
53
+ isCounterLoading?: boolean;
54
+ /**
55
+ * set to true to apply white-space: nowrap to column header cells
56
+ */
57
+ disableColumnNamesLineBreak?: boolean;
58
+ /**
59
+ * renders on the right side of table header
60
+ * can be used for filtering data based on query
61
+ * data filtering is to be set up in the implementation / server-side
62
+ */
63
+ searchComponent?: ReactNode;
64
+ /**
65
+ * renders on the right side of table header
66
+ * can be used for rendering custom filter buttons
67
+ * data filtering is to be set up in the implementation / server-side
68
+ */
69
+ filterComponent?: ReactNode;
70
+ rowKey?: RowKey<TData>;
71
+ /**
72
+ * render table top border
73
+ */
74
+ headerWithBorderTop?: boolean;
75
+ /**
76
+ * render table with rounded corners and shadow
77
+ */
78
+ cardStyles?: boolean;
79
+ /**
80
+ * set to true to prevent rendering column header row with column names
81
+ */
82
+ hideColumnNames?: boolean;
83
+ headerButton?: ReactNode;
84
+ /**
85
+ * selection configuration - see SelectionConfig type
86
+ */
87
+ selectionConfig?: SelectionConfig<TData>;
88
+ selectedRowKeys?: string[];
89
+ renderSelectionTitle?: (selection?: SelectionConfig<TData>) => ReactNode;
90
+ /**
91
+ * set to true to render only the table title, without the counter
92
+ */
93
+ hideTitlePart?: boolean;
94
+ renderCustomCounter?: CustomCounterFn;
95
+ onSort?: OnSortFn;
96
+ isLoading?: boolean;
97
+ /**
98
+ * do not render title bar with search & filter component
99
+ */
100
+ hideTitleBar?: boolean;
101
+ /**
102
+ * custom "Empty data" component
103
+ */
104
+ emptyDataComponent?: ReactNode;
105
+ };
106
+ export type GlobalSelectionProps = {
107
+ /**
108
+ * @callback globalSelectionOnChange - fired when user selects "global all"
109
+ * leave undefined if you do not want global selection option enabled
110
+ * global selection means "across all pages", including items that haven't been loaded yet"
111
+ */
112
+ globalSelectionOnChange?: (selected: boolean) => void;
113
+ /**
114
+ * @prop - current global selection state
115
+ * global selection means "across all pages", including items that haven't been loaded yet
116
+ */
117
+ globalSelected?: boolean;
118
+ };
119
+ /**
120
+ * Internal BaseTable props
121
+ */
122
+ export type BaseTableProps<TData, TValue> = Omit<SharedTableProps<TData, TValue>, 'data' | 'columns' | 'texts' | 'selectionConfig'> & {
123
+ texts: TableTexts;
124
+ columnSizing: Record<string, number>;
125
+ isColumnSizingReady: boolean;
126
+ } & VirtualProps & PaginatedProps;
127
+ export type ScrollDirection = 'forward' | 'backward' | null;
128
+ export type TableInternalProps = {
129
+ paginationProps?: TablePaginationProps;
130
+ hasPagination?: boolean;
131
+ withScroll?: boolean;
132
+ withBodyScroll?: boolean;
133
+ maxHeight?: number;
134
+ tableOuterRef?: MutableRefObject<HTMLDivElement | null>;
135
+ tableBodyScrollRef?: MutableRefObject<HTMLDivElement | null>;
136
+ };
137
+ export type TableDimensions = {
138
+ titleHeight: number;
139
+ headerHeight: number;
140
+ parentTopOffset: number;
141
+ };
142
+ export type VirtualTableRef = {
143
+ getDimensions: () => TableDimensions;
144
+ scrollToTop: () => void;
145
+ scrollTo: (top: number) => void;
146
+ scrollToIndex: (index: number, options?: Parameters<Virtualizer<HTMLDivElement, Element>['scrollToIndex']>[1]) => void;
147
+ };
148
+ type VirtualProps = {
149
+ /** max-height (px) for the built-in scroll container. Ignored when scrollElementRef is provided. Defaults to 800. */
150
+ maxHeight?: number;
151
+ tableRef?: RefObject<VirtualTableRef>;
152
+ /**
153
+ * uses body virtualisation
154
+ * disables sorting - relies on data being provided pre-sorted
155
+ */
156
+ infiniteScroll?: InfiniteScrollProps;
157
+ stickyHeader?: boolean;
158
+ onItemsRendered?: (props: OnItemsRenderedProps) => void;
159
+ scrollElementRef?: MutableRefObject<HTMLDivElement | null>;
160
+ onScrollToRecordIndex?: (recordIndex: number, callback?: () => void) => void;
161
+ };
162
+ export type OnItemsRenderedProps = {
163
+ visibleStartIndex: number;
164
+ };
165
+ type PaginatedProps = {
166
+ /**
167
+ * for tables with infiniteScroll pagination is false
168
+ * for static default pageSize is 10 and can be overwritten with this config
169
+ */
170
+ pagination?: boolean | TablePaginationConfig;
171
+ };
172
+ export type TablePaginationProps = Omit<TablePaginationConfig, 'pageSize'>;
173
+ export type TablePaginationConfig = PaginationProps & {
174
+ pageSize: number;
175
+ };
176
+ export type LoaderItemPosition = 'TOP' | 'BOTTOM';
177
+ export type InfiniteScrollState = {
178
+ hasError: boolean;
179
+ hasMore: boolean;
180
+ isLoading: boolean;
181
+ };
182
+ export type InfiniteScrollProps = InfiniteScrollState & {
183
+ maxScroll?: number;
184
+ showBackToTopButton?: boolean;
185
+ nextPage?: InfiniteScrollState;
186
+ prevPage?: InfiniteScrollState;
187
+ render?: (state: InfiniteScrollState) => ReactElement;
188
+ onRetryButtonClick?: (position: LoaderItemPosition | undefined) => void;
189
+ onScrollEndReach?: () => void;
190
+ onScrollTopReach?: () => void;
191
+ onBackToTop?: () => void;
192
+ };
193
+ export type LoaderItemProps = {
194
+ infiniteScroll: InfiniteScrollProps & InfiniteScrollState;
195
+ position?: LoaderItemPosition;
196
+ };
197
+ export type Selection = {
198
+ key: string;
199
+ label: string;
200
+ onClick: () => void;
201
+ };
202
+ export type ColumnSortOrder = 'descend' | 'ascend' | null;
203
+ export type SingleColumnSort = {
204
+ columnKey: string;
205
+ order: ColumnSortOrder;
206
+ };
207
+ export type OnSortFn = (singleColumnSort: SingleColumnSort, sortState: ColumnsSortState) => void;
208
+ export type ColumnsSortState = {
209
+ [key: string]: {
210
+ sortOrder: ColumnSortOrder;
211
+ multiple: number | false;
212
+ };
213
+ };
214
+ export type SortStateAPI = {
215
+ columnsSortState: ColumnsSortState;
216
+ getColumnSortOrder: (key: string) => ColumnSortOrder;
217
+ setColumnSortOrder: (key: string, sort: ColumnSortOrder) => void;
218
+ updateColumnsData: (columns: ColumnsSortState) => void;
219
+ };
220
+ export type SelectionAll = 'SELECTION_ALL';
221
+ export type SelectionInvert = 'SELECTION_INVERT';
222
+ export type SelectionItem = SelectionAll | SelectionInvert | Selection | null | undefined;
223
+ export type SelectionConfig<TData> = {
224
+ onChange: (selectedRowKeys: string[], selectedRows: TData[]) => void;
225
+ limit?: number;
226
+ independentSelectionExpandedRows?: boolean;
227
+ checkRowSelectionStatus?: (record: TData) => {
228
+ disabled?: boolean;
229
+ unavailable?: boolean;
230
+ };
231
+ /**
232
+ * Returns tooltip props for a given row's selection checkbox, or false to use the default tooltip.
233
+ * When provided, the returned props are merged with the default selectRowTooltip.
234
+ */
235
+ getSelectionTooltipProps?: (record: TData) => TooltipProps | false;
236
+ hideSelectAll?: boolean;
237
+ fixed?: boolean;
238
+ selections?: SelectionItem[];
239
+ } & GlobalSelectionProps;
240
+ export type RowSelection = {
241
+ selectedRowKeys: string[];
242
+ };
243
+ export type RowKey<TData> = ((row: TData) => string) | keyof TData;
244
+ export type TableTexts = TableHeaderTexts & TableBodyTexts & TableColumnSorterTexts & TableRowSelectionTexts & {};
245
+ export type TableColumnSorterTexts = {
246
+ columnSortAscend: ReactNode;
247
+ columnSortDescend: ReactNode;
248
+ columnSortZa: ReactNode;
249
+ columnSortAz: ReactNode;
250
+ columnSortClear: ReactNode;
251
+ };
252
+ export type TableHeaderTexts = TableSelectionTexts & TableLimitTexts & {};
253
+ export type TableLimitTexts = {
254
+ totalItems: ReactNode;
255
+ selected: ReactNode;
256
+ selectionLimitWarning: ReactNode;
257
+ };
258
+ export type TableBodyTexts = TableEmptyBodyTexts & InfiniteLoaderRowTexts & {};
259
+ export type TableEmptyBodyTexts = {
260
+ emptyText: ReactNode;
261
+ };
262
+ export type InfiniteLoaderRowTexts = {
263
+ infiniteScrollLoading: ReactNode;
264
+ infiniteScrollError: ReactNode;
265
+ infiniteScrollRetry: ReactNode;
266
+ infiniteScrollNoMoreData: ReactNode;
267
+ };
268
+ export type TableRowSelectionTexts = {
269
+ selectRowTooltip: ReactNode;
270
+ };
271
+ export type TableSelectionTexts = {
272
+ unselectGlobalAll: ReactNode;
273
+ selectGlobalAll: ReactNode;
274
+ selectAll: ReactNode;
275
+ selectAllTooltip: ReactNode;
276
+ unselectAll: ReactNode;
277
+ selectInvert: ReactNode;
278
+ selectionOptionsTooltip: ReactNode;
279
+ };
280
+ export type CustomCounterArgs = {
281
+ count: number;
282
+ content: ReactNode;
283
+ };
284
+ export type CustomCounterFn = (props: CustomCounterArgs) => ReactNode;
285
+ export type TableBodyProps<TData, TValue> = Pick<BaseTableProps<TData, TValue>, 'infiniteScroll' | 'cellHeight' | 'emptyDataComponent' | 'onRowClick' | 'getRowTooltipProps'> & {
286
+ texts: TableBodyTexts;
287
+ };
288
+ export type TableEmptyBodyProps<TData, TValue> = Pick<TableBodyProps<TData, TValue>, 'emptyDataComponent'> & {
289
+ texts: TableEmptyBodyTexts;
290
+ };
291
+ export type TableCounterProps<TData, TValue> = Pick<BaseTableProps<TData, TValue>, 'renderCustomCounter' | 'isCounterLoading'> & {
292
+ texts: TableHeaderTexts;
293
+ selectedItemsCount?: number;
294
+ tableTotal: number;
295
+ };
296
+ export type TableHeaderProps<TData, TValue> = Pick<BaseTableProps<TData, TValue>, 'itemsMenu' | 'title' | 'isCounterLoading' | 'searchComponent' | 'filterComponent' | 'rowKey' | 'headerButton' | 'renderCustomCounter' | 'renderSelectionTitle' | 'dataSourceTotalCount' | 'hideTitlePart' | 'isLoading'> & {
297
+ selectedRows?: number;
298
+ selectionConfig?: SelectionConfig<TData>;
299
+ texts: TableHeaderTexts;
300
+ } & Partial<Pick<Expandable<TData>, 'childrenColumnName'>>;
301
+ export type Filter = {
302
+ tooltips: {
303
+ default: string;
304
+ clear: string;
305
+ define: string;
306
+ list: string;
307
+ };
308
+ openedLabel: string;
309
+ key: string;
310
+ icon: ReactNode;
311
+ showList: () => void;
312
+ show: () => void;
313
+ handleClear: () => void;
314
+ selected?: {
315
+ name: string;
316
+ };
317
+ disabled?: boolean;
318
+ };
319
+ export type TableSelectionProps<TData, TValue> = Pick<BaseTableProps<TData, TValue>, 'rowKey'> & {
320
+ texts: TableSelectionTexts;
321
+ hasSelectionLimit?: boolean;
322
+ } & Partial<Pick<Expandable<TData>, 'childrenColumnName'>>;
323
+ export type TableColumnsProps = {
324
+ texts: TableColumnSorterTexts;
325
+ disableColumnNamesLineBreak?: boolean;
326
+ };
327
+ export type TableColumnSorterProps<TData, TValue> = {
328
+ column: Column<TData, TValue>;
329
+ texts: TableColumnSorterTexts;
330
+ };
331
+ export type StickyData = {
332
+ containerPaddingTop: number;
333
+ titleBarHeight: number;
334
+ columnHeadersHeight: number;
335
+ isRevealed: boolean;
336
+ };
337
+ export type TableHeaderSelectionProps = {
338
+ texts: TableHeaderTexts;
339
+ rowCount?: number;
340
+ };
341
+ export type TableRowSelectionProps<TData> = {
342
+ row: Row<TData>;
343
+ texts: TableRowSelectionTexts;
344
+ };
345
+ export type TableRowProps<TData> = {
346
+ row: Row<TData>;
347
+ isSelected?: boolean;
348
+ isExpanded?: boolean;
349
+ isParentExpanded?: boolean;
350
+ } & Pick<SharedTableProps<TData, unknown>, 'onRowClick' | 'getRowTooltipProps'>;
351
+ export type TableRowVirtualProps<TData> = TableRowProps<TData> & {
352
+ cellHeight: number;
353
+ virtual: VirtualItem;
354
+ isLast?: boolean;
355
+ rowIndex: number;
356
+ texts: InfiniteLoaderRowTexts;
357
+ infiniteScroll?: InfiniteScrollProps;
358
+ };
359
+ export {};
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ import { VirtualTableProps } from './Table.types';
3
+ export declare const VirtualTable: <TData extends object, TValue>({ data, infiniteScroll, scrollElementRef, columns, tableRef, selectionConfig, selectedRowKeys, rowKey, onSort, stickyHeader, texts: defaultTexts, cellHeight, expandable, onItemsRendered, isLoading, onScrollToRecordIndex, maxHeight, ...props }: VirtualTableProps<TData, TValue>) => React.JSX.Element;
@@ -0,0 +1,222 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useState, useRef, useMemo, useCallback, useEffect, useImperativeHandle } from "react";
3
+ import { useVirtualizer } from "@tanstack/react-virtual";
4
+ import { DEFAULT_STICKY_VALUE, DEFAULT_CELL_HEIGHT, INFINITE_LOADER_ITEM_HEIGHT, INFINITE_SCROLL_PADDING_START } from "./Table.const.js";
5
+ import { BaseTable } from "./components/BaseTable/BaseTable.js";
6
+ import { SelectionContext } from "./contexts/SelectionContext.js";
7
+ import { StickyContext } from "./contexts/StickyContext.js";
8
+ import { TableContext } from "./contexts/TableContext.js";
9
+ import { useDefaultTexts } from "./hooks/useDefaultTexts.js";
10
+ import { useInfiniteScroll } from "./hooks/useInfiniteScroll.js";
11
+ import { useTable } from "./hooks/useTable.js";
12
+ import { getDefaultSkeletonColumns } from "./utils/getDefaultSkeletonColumns.js";
13
+ import { getInfiniteScrollPadding } from "./utils/getInfiniteScrollPadding.js";
14
+ import { getIsRevealed } from "./utils/getIsRevealed.js";
15
+ import { processColumns } from "./utils/processColumns.js";
16
+ const VirtualTable = ({
17
+ data,
18
+ infiniteScroll,
19
+ scrollElementRef,
20
+ columns,
21
+ tableRef,
22
+ selectionConfig,
23
+ selectedRowKeys,
24
+ rowKey,
25
+ onSort,
26
+ stickyHeader,
27
+ texts: defaultTexts,
28
+ cellHeight = DEFAULT_CELL_HEIGHT,
29
+ expandable,
30
+ onItemsRendered,
31
+ isLoading,
32
+ onScrollToRecordIndex,
33
+ maxHeight,
34
+ ...props
35
+ }) => {
36
+ const [stickyData, setStickyData] = useState(DEFAULT_STICKY_VALUE);
37
+ const texts = useDefaultTexts(defaultTexts);
38
+ const tableOuterRef = useRef(null);
39
+ const tableBodyScrollRef = useRef(null);
40
+ const hasExternalScroll = !!scrollElementRef;
41
+ const withContainerScroll = !hasExternalScroll && !!stickyHeader;
42
+ const withBodyScroll = !hasExternalScroll && !stickyHeader;
43
+ const scrollableContainerRef = scrollElementRef || (stickyHeader ? tableOuterRef : tableBodyScrollRef);
44
+ const hasSelection = !!selectionConfig;
45
+ const processedColumns = useMemo(() => {
46
+ return columns.length ? processColumns(columns, hasSelection, texts) : columns;
47
+ }, [columns, hasSelection, texts]);
48
+ const skeletonColumns = useMemo(() => getDefaultSkeletonColumns(), []);
49
+ const finalColumns = !processedColumns.length && isLoading ? skeletonColumns : processedColumns;
50
+ const {
51
+ table,
52
+ columnSizing,
53
+ isColumnSizingReady
54
+ } = useTable({
55
+ data,
56
+ expandable,
57
+ columns: finalColumns,
58
+ infiniteScroll,
59
+ wrapperRef: scrollableContainerRef,
60
+ rowKey,
61
+ selectionConfig,
62
+ selectedRowKeys,
63
+ onSort,
64
+ pagination: false
65
+ });
66
+ const tableIsEmpty = table.getRowModel().rows.length === 0;
67
+ const handleItemsRendered = useCallback(({
68
+ visibleStartIndex
69
+ }) => {
70
+ if (!onItemsRendered) {
71
+ return;
72
+ }
73
+ const {
74
+ flatRows,
75
+ rows: topLevelRows
76
+ } = table.getRowModel();
77
+ const row = flatRows[visibleStartIndex];
78
+ if (!row) {
79
+ return;
80
+ }
81
+ let rootRow = row;
82
+ let parent = row.getParentRow();
83
+ while (parent) {
84
+ rootRow = parent;
85
+ parent = parent.getParentRow();
86
+ }
87
+ const rootIndex = topLevelRows.findIndex((r) => r.id === rootRow.id);
88
+ onItemsRendered({
89
+ visibleStartIndex: rootIndex >= 0 ? rootIndex : visibleStartIndex
90
+ });
91
+ }, [onItemsRendered, table]);
92
+ const {
93
+ scrollDirection,
94
+ handleScrollDirection
95
+ } = useInfiniteScroll({
96
+ infiniteScroll,
97
+ onItemsRendered: handleItemsRendered,
98
+ setStickyData
99
+ });
100
+ const getDimensions = useCallback(() => {
101
+ return {
102
+ titleHeight: stickyData.titleBarHeight,
103
+ parentTopOffset: stickyData.containerPaddingTop,
104
+ headerHeight: stickyData.columnHeadersHeight
105
+ };
106
+ }, [stickyData.columnHeadersHeight, stickyData.containerPaddingTop, stickyData.titleBarHeight]);
107
+ const rowVirtualizer = useVirtualizer({
108
+ count: table.getRowModel().flatRows.length,
109
+ getScrollElement: () => scrollableContainerRef.current,
110
+ estimateSize: () => cellHeight + 1,
111
+ onChange: handleScrollDirection,
112
+ overscan: 15,
113
+ paddingEnd: getInfiniteScrollPadding(infiniteScroll)
114
+ });
115
+ const [firstItem, setFirstItem] = useState();
116
+ const updateFirstItem = useCallback((findFirstItem) => {
117
+ const prevFirstItemIndex = data.findIndex(findFirstItem);
118
+ if (prevFirstItemIndex >= 0) {
119
+ rowVirtualizer.scrollToIndex(prevFirstItemIndex, {
120
+ align: "start",
121
+ behavior: "auto"
122
+ });
123
+ }
124
+ setFirstItem(data[0]);
125
+ }, [data, rowVirtualizer]);
126
+ useEffect(() => {
127
+ try {
128
+ if (!infiniteScroll?.prevPage || data.length === 0) {
129
+ return;
130
+ }
131
+ if (!firstItem) {
132
+ setFirstItem(data[0]);
133
+ return;
134
+ }
135
+ if (rowKey === void 0) {
136
+ const firstItemStringified = JSON.stringify(firstItem);
137
+ if (JSON.stringify(data[0]) !== firstItemStringified) {
138
+ updateFirstItem((item) => JSON.stringify(item) === firstItemStringified);
139
+ }
140
+ return;
141
+ }
142
+ if (typeof rowKey === "string") {
143
+ if (data[0][rowKey] !== firstItem[rowKey]) {
144
+ updateFirstItem((item) => item[rowKey] === firstItem[rowKey]);
145
+ }
146
+ return;
147
+ }
148
+ if (typeof rowKey === "function") {
149
+ if (rowKey(data[0]) !== rowKey(firstItem)) {
150
+ updateFirstItem((item) => rowKey(item) === rowKey(firstItem));
151
+ }
152
+ }
153
+ } catch (_error) {
154
+ console.warn("Cannot find first item");
155
+ }
156
+ }, [data, firstItem, infiniteScroll?.prevPage, rowKey, updateFirstItem]);
157
+ useEffect(() => {
158
+ if (rowVirtualizer && infiniteScroll?.prevPage?.hasMore) {
159
+ rowVirtualizer.scrollToOffset(INFINITE_LOADER_ITEM_HEIGHT);
160
+ }
161
+ }, [rowVirtualizer, infiniteScroll?.prevPage?.hasMore]);
162
+ useImperativeHandle(tableRef, () => ({
163
+ getDimensions,
164
+ scrollTo: rowVirtualizer.scrollToOffset,
165
+ scrollToIndex: (topLevelIndex, options) => {
166
+ const {
167
+ rows: topLevelRows,
168
+ flatRows
169
+ } = table.getRowModel();
170
+ const targetRow = topLevelRows[topLevelIndex];
171
+ if (!targetRow) {
172
+ return;
173
+ }
174
+ const flatIndex = flatRows.findIndex((r) => r.id === targetRow.id);
175
+ if (flatIndex >= 0) {
176
+ const offsetData = rowVirtualizer.getOffsetForIndex(flatIndex, "start");
177
+ if (offsetData !== void 0) {
178
+ rowVirtualizer.scrollToOffset(offsetData[0] + INFINITE_SCROLL_PADDING_START, options);
179
+ }
180
+ }
181
+ },
182
+ scrollToTop: () => rowVirtualizer.scrollToOffset(0)
183
+ }));
184
+ const stickyValue = useMemo(() => stickyHeader ? {
185
+ stickyData,
186
+ setStickyData
187
+ } : null, [stickyData, stickyHeader]);
188
+ useEffect(() => {
189
+ if (stickyHeader && scrollableContainerRef.current) {
190
+ const {
191
+ paddingTop
192
+ } = getComputedStyle(scrollableContainerRef.current);
193
+ setStickyData((prevValue) => ({
194
+ ...prevValue,
195
+ containerPaddingTop: parseFloat(paddingTop)
196
+ }));
197
+ }
198
+ }, [scrollableContainerRef, stickyHeader]);
199
+ useEffect(() => {
200
+ if (stickyHeader) {
201
+ setStickyData((prevValue) => ({
202
+ ...prevValue,
203
+ isRevealed: getIsRevealed({
204
+ scrollDirection,
205
+ hasData: !tableIsEmpty
206
+ })
207
+ }));
208
+ }
209
+ }, [stickyHeader, scrollDirection, tableIsEmpty]);
210
+ const getScrollContainer = useCallback(() => {
211
+ return scrollableContainerRef.current;
212
+ }, [scrollableContainerRef]);
213
+ const tableContextValue = useMemo(() => ({
214
+ table,
215
+ rowVirtualizer,
216
+ getScrollContainer
217
+ }), [table, rowVirtualizer, getScrollContainer]);
218
+ return /* @__PURE__ */ jsx(TableContext.Provider, { value: tableContextValue, children: /* @__PURE__ */ jsx(StickyContext.Provider, { value: stickyValue, children: /* @__PURE__ */ jsx(SelectionContext.Provider, { value: selectionConfig, children: /* @__PURE__ */ jsx(BaseTable, { columnSizing, isColumnSizingReady, texts, tableOuterRef, tableBodyScrollRef, withScroll: withContainerScroll, withBodyScroll, maxHeight, hasPagination: false, infiniteScroll, isLoading, ...props }) }) }) });
219
+ };
220
+ export {
221
+ VirtualTable
222
+ };
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ import { BaseTableProps, TableInternalProps } from '../../Table.types';
3
+ export declare const BaseTable: <TData extends object, TValue>({ infiniteScroll, cellHeight, className, itemsMenu, texts, isCounterLoading, isLoading, rowKey, title, hideTitleBar, hideTitlePart, renderCustomCounter, renderSelectionTitle, searchComponent, filterComponent, headerWithBorderTop, emptyDataComponent, headerButton, hideColumnNames, expandable, columnSizing, isColumnSizingReady, paginationProps, hasPagination, disableColumnNamesLineBreak, dataSourceTotalCount, cardStyles, tableOuterRef, withScroll, withBodyScroll, maxHeight, tableBodyScrollRef, onRowClick, getRowTooltipProps, }: BaseTableProps<TData, TValue> & TableInternalProps) => React.JSX.Element;