@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.
- package/CHANGELOG.md +10 -0
- package/LICENSE.md +21 -0
- package/README.md +153 -0
- package/dist/Table.const.d.ts +20 -0
- package/dist/Table.const.js +42 -0
- package/dist/Table.d.ts +3 -0
- package/dist/Table.js +51 -0
- package/dist/Table.styles.d.ts +15 -0
- package/dist/Table.styles.js +29 -0
- package/dist/Table.types.d.ts +359 -0
- package/dist/Table.types.js +1 -0
- package/dist/VirtualTable.d.ts +3 -0
- package/dist/VirtualTable.js +222 -0
- package/dist/components/BaseTable/BaseTable.d.ts +3 -0
- package/dist/components/BaseTable/BaseTable.js +114 -0
- package/dist/components/BaseTable/BaseTable.styles.d.ts +28 -0
- package/dist/components/BaseTable/BaseTable.styles.js +41 -0
- package/dist/components/Cell/Action/ActionCell.d.ts +3 -0
- package/dist/components/Cell/Action/ActionCell.js +16 -0
- package/dist/components/Cell/Action/ActionCell.styles.d.ts +5 -0
- package/dist/components/Cell/Action/ActionCell.styles.js +13 -0
- package/dist/components/Cell/Action/ActionCell.types.d.ts +13 -0
- package/dist/components/Cell/Action/ActionCell.types.js +1 -0
- package/dist/components/Cell/AvatarLabel/AvatarLabel.d.ts +4 -0
- package/dist/components/Cell/AvatarLabel/AvatarLabel.js +42 -0
- package/dist/components/Cell/AvatarLabel/AvatarLabel.styles.d.ts +27 -0
- package/dist/components/Cell/AvatarLabel/AvatarLabel.styles.js +49 -0
- package/dist/components/Cell/AvatarLabel/AvatarLabel.types.d.ts +22 -0
- package/dist/components/Cell/AvatarLabel/AvatarLabel.types.js +1 -0
- package/dist/components/Cell/Copyable/Copyable.styles.d.ts +2 -0
- package/dist/components/Cell/Copyable/Copyable.styles.js +14 -0
- package/dist/components/Cell/Copyable/Copyable.types.d.ts +11 -0
- package/dist/components/Cell/Copyable/Copyable.types.js +1 -0
- package/dist/components/Cell/Copyable/CopyableCell.d.ts +4 -0
- package/dist/components/Cell/Copyable/CopyableCell.js +28 -0
- package/dist/components/Cell/Editable/EditableCell.d.ts +4 -0
- package/dist/components/Cell/Editable/EditableCell.js +30 -0
- package/dist/components/Cell/Editable/EditableCell.styles.d.ts +4 -0
- package/dist/components/Cell/Editable/EditableCell.styles.js +14 -0
- package/dist/components/Cell/Editable/EditableCell.types.d.ts +11 -0
- package/dist/components/Cell/Editable/EditableCell.types.js +1 -0
- package/dist/components/Cell/FlagLabel/FlagLabelCell.d.ts +4 -0
- package/dist/components/Cell/FlagLabel/FlagLabelCell.js +16 -0
- package/dist/components/Cell/FlagLabel/FlagLabelCell.styles.d.ts +1 -0
- package/dist/components/Cell/FlagLabel/FlagLabelCell.styles.js +8 -0
- package/dist/components/Cell/FlagLabel/FlagLabelCell.types.d.ts +11 -0
- package/dist/components/Cell/FlagLabel/FlagLabelCell.types.js +1 -0
- package/dist/components/Cell/IconLabel/IconLabel.d.ts +4 -0
- package/dist/components/Cell/IconLabel/IconLabel.js +15 -0
- package/dist/components/Cell/IconLabel/IconLabel.styles.d.ts +3 -0
- package/dist/components/Cell/IconLabel/IconLabel.styles.js +9 -0
- package/dist/components/Cell/IconLabel/IconLabel.types.d.ts +13 -0
- package/dist/components/Cell/IconLabel/IconLabel.types.js +1 -0
- package/dist/components/Cell/IconTooltipCell/IconTooltipCell.d.ts +4 -0
- package/dist/components/Cell/IconTooltipCell/IconTooltipCell.js +19 -0
- package/dist/components/Cell/IconTooltipCell/IconTooltipCell.styles.d.ts +4 -0
- package/dist/components/Cell/IconTooltipCell/IconTooltipCell.styles.js +13 -0
- package/dist/components/Cell/IconTooltipCell/IconTooltipCell.types.d.ts +16 -0
- package/dist/components/Cell/IconTooltipCell/IconTooltipCell.types.js +1 -0
- package/dist/components/Cell/InputNumber/InputNumberCell.d.ts +4 -0
- package/dist/components/Cell/InputNumber/InputNumberCell.js +11 -0
- package/dist/components/Cell/InputNumber/InputNumberCell.styles.d.ts +3 -0
- package/dist/components/Cell/InputNumber/InputNumberCell.styles.js +11 -0
- package/dist/components/Cell/InputNumber/InputNumberCell.types.d.ts +7 -0
- package/dist/components/Cell/InputNumber/InputNumberCell.types.js +1 -0
- package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.d.ts +5 -0
- package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.js +33 -0
- package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.styles.d.ts +3 -0
- package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.styles.js +18 -0
- package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.types.d.ts +22 -0
- package/dist/components/Cell/LabelsWithShowMore/LabelsWithShowMore.types.js +1 -0
- package/dist/components/Cell/LabelsWithShowMore/Modal/Modal.d.ts +4 -0
- package/dist/components/Cell/LabelsWithShowMore/Modal/Modal.js +37 -0
- package/dist/components/Cell/LabelsWithShowMore/Modal/Modal.types.d.ts +15 -0
- package/dist/components/Cell/LabelsWithShowMore/Modal/Modal.types.js +1 -0
- package/dist/components/Cell/Star/StarCell.d.ts +4 -0
- package/dist/components/Cell/Star/StarCell.js +25 -0
- package/dist/components/Cell/Star/StarCell.styles.d.ts +5 -0
- package/dist/components/Cell/Star/StarCell.styles.js +16 -0
- package/dist/components/Cell/Star/StarCell.types.d.ts +17 -0
- package/dist/components/Cell/Star/StarCell.types.js +1 -0
- package/dist/components/Cell/StatusLabel/StatusLabel.d.ts +4 -0
- package/dist/components/Cell/StatusLabel/StatusLabel.js +18 -0
- package/dist/components/Cell/StatusLabel/StatusLabel.styles.d.ts +4 -0
- package/dist/components/Cell/StatusLabel/StatusLabel.styles.js +13 -0
- package/dist/components/Cell/StatusLabel/StatusLabel.types.d.ts +14 -0
- package/dist/components/Cell/StatusLabel/StatusLabel.types.js +1 -0
- package/dist/components/Cell/TagIcon/TagIcon.d.ts +4 -0
- package/dist/components/Cell/TagIcon/TagIcon.js +10 -0
- package/dist/components/Cell/TagIcon/TagIcon.styles.d.ts +3 -0
- package/dist/components/Cell/TagIcon/TagIcon.styles.js +9 -0
- package/dist/components/Cell/TagIcon/TagIcon.types.d.ts +11 -0
- package/dist/components/Cell/TagIcon/TagIcon.types.js +1 -0
- package/dist/components/Cell/TagsGroup/TagsGroup.d.ts +3 -0
- package/dist/components/Cell/TagsGroup/TagsGroup.js +26 -0
- package/dist/components/Cell/TagsGroup/TagsGroup.styles.d.ts +5 -0
- package/dist/components/Cell/TagsGroup/TagsGroup.styles.js +34 -0
- package/dist/components/Cell/TagsGroup/TagsGroup.types.d.ts +9 -0
- package/dist/components/Cell/TagsGroup/TagsGroup.types.js +1 -0
- package/dist/components/Cell/index.d.ts +26 -0
- package/dist/components/Cell/index.js +28 -0
- package/dist/components/TableBody/TableBody.d.ts +3 -0
- package/dist/components/TableBody/TableBody.js +40 -0
- package/dist/components/TableBody/TableBody.styles.d.ts +2 -0
- package/dist/components/TableBody/TableBody.styles.js +15 -0
- package/dist/components/TableBody/TableBodySkeleton/TableBodySkeleton.d.ts +5 -0
- package/dist/components/TableBody/TableBodySkeleton/TableBodySkeleton.js +42 -0
- package/dist/components/TableBody/TableBodySkeleton/TableBodySkeleton.styles.d.ts +9 -0
- package/dist/components/TableBody/TableBodySkeleton/TableBodySkeleton.styles.js +30 -0
- package/dist/components/TableBody/TableCell/TableCell.d.ts +16 -0
- package/dist/components/TableBody/TableCell/TableCell.js +19 -0
- package/dist/components/TableBody/TableCell/TableCell.styles.d.ts +10 -0
- package/dist/components/TableBody/TableCell/TableCell.styles.js +18 -0
- package/dist/components/TableBody/TableEmptyBody/TableEmptyBody.d.ts +3 -0
- package/dist/components/TableBody/TableEmptyBody/TableEmptyBody.js +18 -0
- package/dist/components/TableBody/TableEmptyBody/TableEmptyBody.styles.d.ts +4 -0
- package/dist/components/TableBody/TableEmptyBody/TableEmptyBody.styles.js +23 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/ErrorItem.d.ts +8 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/ErrorItem.js +19 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/ErrorItem.styles.d.ts +1 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/ErrorItem.styles.js +8 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/InfiniteLoaderRow.d.ts +14 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/InfiniteLoaderRow.js +50 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/LoadingItem.d.ts +5 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/LoadingItem.js +10 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/LoadingItem.styles.d.ts +1 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/LoadingItem.styles.js +9 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/NoMoreItem.d.ts +5 -0
- package/dist/components/TableBody/TableRow/InfiniteLoaderRow/NoMoreItem.js +10 -0
- package/dist/components/TableBody/TableRow/TableRow.d.ts +5 -0
- package/dist/components/TableBody/TableRow/TableRow.js +29 -0
- package/dist/components/TableBody/TableRow/TableRow.styles.d.ts +7 -0
- package/dist/components/TableBody/TableRow/TableRow.styles.js +15 -0
- package/dist/components/TableBody/TableRow/TableRowVirtual.d.ts +5 -0
- package/dist/components/TableBody/TableRow/TableRowVirtual.js +88 -0
- package/dist/components/TableBody/TableRowSelection/TableRowSelection.d.ts +3 -0
- package/dist/components/TableBody/TableRowSelection/TableRowSelection.js +39 -0
- package/dist/components/TableColumns/TableColumnSorter/SortIcons/DefaultSortIcon.d.ts +5 -0
- package/dist/components/TableColumns/TableColumnSorter/SortIcons/DefaultSortIcon.js +19 -0
- package/dist/components/TableColumns/TableColumnSorter/SortIcons/StringSortIcon.d.ts +5 -0
- package/dist/components/TableColumns/TableColumnSorter/SortIcons/StringSortIcon.js +19 -0
- package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.const.d.ts +4 -0
- package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.const.js +8 -0
- package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.d.ts +3 -0
- package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.js +75 -0
- package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.styles.d.ts +30 -0
- package/dist/components/TableColumns/TableColumnSorter/TableColumnSorter.styles.js +11 -0
- package/dist/components/TableColumns/TableColumns.d.ts +3 -0
- package/dist/components/TableColumns/TableColumns.js +28 -0
- package/dist/components/TableColumns/TableColumns.styles.d.ts +18 -0
- package/dist/components/TableColumns/TableColumns.styles.js +35 -0
- package/dist/components/TableHeader/TableCounter/TableCounter.d.ts +3 -0
- package/dist/components/TableHeader/TableCounter/TableCounter.js +33 -0
- package/dist/components/TableHeader/TableCounter/TableCounter.styles.d.ts +1 -0
- package/dist/components/TableHeader/TableCounter/TableCounter.styles.js +8 -0
- package/dist/components/TableHeader/TableHeader.d.ts +3 -0
- package/dist/components/TableHeader/TableHeader.js +103 -0
- package/dist/components/TableHeader/TableHeader.styles.d.ts +18 -0
- package/dist/components/TableHeader/TableHeader.styles.js +48 -0
- package/dist/components/TableHeader/TableHeaderSelection/TableHeaderSelection.d.ts +3 -0
- package/dist/components/TableHeader/TableHeaderSelection/TableHeaderSelection.js +123 -0
- package/dist/components/TableHeader/TableHeaderSelection/TableHeaderSelection.styles.d.ts +8 -0
- package/dist/components/TableHeader/TableHeaderSelection/TableHeaderSelection.styles.js +21 -0
- package/dist/components/TableHeader/TableLimit/TableLimit.d.ts +3 -0
- package/dist/components/TableHeader/TableLimit/TableLimit.js +50 -0
- package/dist/components/TableHeader/TableLimit/TableLimit.styles.d.ts +4 -0
- package/dist/components/TableHeader/TableLimit/TableLimit.styles.js +24 -0
- package/dist/components/TableHeader/TableLimit/TableLimit.types.d.ts +10 -0
- package/dist/components/TableHeader/TableLimit/TableLimit.types.js +1 -0
- package/dist/components/TableHorizontalScroll/TableHorizontalScroll.d.ts +6 -0
- package/dist/components/TableHorizontalScroll/TableHorizontalScroll.js +41 -0
- package/dist/components/TableHorizontalScroll/TableHorizontalScroll.styles.d.ts +12 -0
- package/dist/components/TableHorizontalScroll/TableHorizontalScroll.styles.js +33 -0
- package/dist/components/TableHorizontalScrollBar/TableHorizontalScrollBar.d.ts +6 -0
- package/dist/components/TableHorizontalScrollBar/TableHorizontalScrollBar.js +11 -0
- package/dist/components/TableHorizontalScrollBar/TableHorizontalScrollBar.styles.d.ts +4 -0
- package/dist/components/TableHorizontalScrollBar/TableHorizontalScrollBar.styles.js +14 -0
- package/dist/components/TablePagination/TablePagination.d.ts +3 -0
- package/dist/components/TablePagination/TablePagination.js +19 -0
- package/dist/components/TablePagination/TablePagination.styles.d.ts +1 -0
- package/dist/components/TablePagination/TablePagination.styles.js +8 -0
- package/dist/contexts/SelectionContext.d.ts +4 -0
- package/dist/contexts/SelectionContext.js +10 -0
- package/dist/contexts/StickyContext.d.ts +8 -0
- package/dist/contexts/StickyContext.js +9 -0
- package/dist/contexts/TableContext.d.ts +11 -0
- package/dist/contexts/TableContext.js +13 -0
- package/dist/hooks/useColumnSizing.d.ts +23 -0
- package/dist/hooks/useColumnSizing.js +95 -0
- package/dist/hooks/useDefaultTexts.d.ts +2 -0
- package/dist/hooks/useDefaultTexts.js +95 -0
- package/dist/hooks/useInfiniteScroll.d.ts +13 -0
- package/dist/hooks/useInfiniteScroll.js +58 -0
- package/dist/hooks/useRowKey.d.ts +4 -0
- package/dist/hooks/useRowKey.js +27 -0
- package/dist/hooks/useScrollSync.d.ts +2 -0
- package/dist/hooks/useScrollSync.js +23 -0
- package/dist/hooks/useTable.d.ts +14 -0
- package/dist/hooks/useTable.js +168 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +50 -0
- package/dist/types/table.d.js +1 -0
- package/dist/types/table.d.ts +28 -0
- package/dist/utils/arrayToTrueMap.d.ts +1 -0
- package/dist/utils/arrayToTrueMap.js +7 -0
- package/dist/utils/calculatePixels.d.ts +1 -0
- package/dist/utils/calculatePixels.js +21 -0
- package/dist/utils/compareKeys.d.ts +1 -0
- package/dist/utils/compareKeys.js +16 -0
- package/dist/utils/getChildrenColumnName.d.ts +1 -0
- package/dist/utils/getChildrenColumnName.js +7 -0
- package/dist/utils/getDefaultSkeletonColumns.d.ts +2 -0
- package/dist/utils/getDefaultSkeletonColumns.js +58 -0
- package/dist/utils/getInfiniteScrollPadding.d.ts +2 -0
- package/dist/utils/getInfiniteScrollPadding.js +13 -0
- package/dist/utils/getIsRevealed.d.ts +5 -0
- package/dist/utils/getIsRevealed.js +9 -0
- package/dist/utils/getPaginationConfig.d.ts +10 -0
- package/dist/utils/getPaginationConfig.js +19 -0
- package/dist/utils/getRecordSelectionStatus.d.ts +5 -0
- package/dist/utils/getRecordSelectionStatus.js +13 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/isRecordSelectable.d.ts +2 -0
- package/dist/utils/isRecordSelectable.js +14 -0
- package/dist/utils/legacyColumnConfigAdapter.d.ts +3 -0
- package/dist/utils/legacyColumnConfigAdapter.js +113 -0
- package/dist/utils/processColumns.d.ts +3 -0
- package/dist/utils/processColumns.js +24 -0
- package/dist/utils/sort.d.ts +3 -0
- package/dist/utils/sort.js +14 -0
- 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;
|