@vuu-ui/vuu-table 0.0.26
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/LICENSE +201 -0
- package/README.md +0 -0
- package/cjs/Row.css.js +6 -0
- package/cjs/Row.css.js.map +1 -0
- package/cjs/Row.js +130 -0
- package/cjs/Row.js.map +1 -0
- package/cjs/Table.css.js +6 -0
- package/cjs/Table.css.js.map +1 -0
- package/cjs/Table.js +285 -0
- package/cjs/Table.js.map +1 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +42 -0
- package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
- package/cjs/cell-renderers/input-cell/InputCell.css.js +6 -0
- package/cjs/cell-renderers/input-cell/InputCell.css.js.map +1 -0
- package/cjs/cell-renderers/input-cell/InputCell.js +58 -0
- package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -0
- package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js +6 -0
- package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js +68 -0
- package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
- package/cjs/column-header-pill/ColumnHeaderPill.css.js +6 -0
- package/cjs/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
- package/cjs/column-header-pill/ColumnHeaderPill.js +53 -0
- package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -0
- package/cjs/column-header-pill/GroupColumnPill.css.js +6 -0
- package/cjs/column-header-pill/GroupColumnPill.css.js.map +1 -0
- package/cjs/column-header-pill/GroupColumnPill.js +29 -0
- package/cjs/column-header-pill/GroupColumnPill.js.map +1 -0
- package/cjs/column-header-pill/SortIndicator.css.js +6 -0
- package/cjs/column-header-pill/SortIndicator.css.js.map +1 -0
- package/cjs/column-header-pill/SortIndicator.js +27 -0
- package/cjs/column-header-pill/SortIndicator.js.map +1 -0
- package/cjs/column-menu/ColumnMenu.css.js +6 -0
- package/cjs/column-menu/ColumnMenu.css.js.map +1 -0
- package/cjs/column-menu/ColumnMenu.js +30 -0
- package/cjs/column-menu/ColumnMenu.js.map +1 -0
- package/cjs/column-resizing/ColumnResizer.css.js +6 -0
- package/cjs/column-resizing/ColumnResizer.css.js.map +1 -0
- package/cjs/column-resizing/ColumnResizer.js +72 -0
- package/cjs/column-resizing/ColumnResizer.js.map +1 -0
- package/cjs/column-resizing/useTableColumnResize.js +55 -0
- package/cjs/column-resizing/useTableColumnResize.js.map +1 -0
- package/cjs/context-menu/buildContextMenuDescriptors.js +214 -0
- package/cjs/context-menu/buildContextMenuDescriptors.js.map +1 -0
- package/cjs/context-menu/useHandleTableContextMenu.js +81 -0
- package/cjs/context-menu/useHandleTableContextMenu.js.map +1 -0
- package/cjs/header-cell/GroupHeaderCell.css.js +6 -0
- package/cjs/header-cell/GroupHeaderCell.css.js.map +1 -0
- package/cjs/header-cell/GroupHeaderCell.js +117 -0
- package/cjs/header-cell/GroupHeaderCell.js.map +1 -0
- package/cjs/header-cell/HeaderCell.css.js +6 -0
- package/cjs/header-cell/HeaderCell.css.js.map +1 -0
- package/cjs/header-cell/HeaderCell.js +109 -0
- package/cjs/header-cell/HeaderCell.js.map +1 -0
- package/cjs/index.js +36 -0
- package/cjs/index.js.map +1 -0
- package/cjs/moving-window.js +61 -0
- package/cjs/moving-window.js.map +1 -0
- package/cjs/table-cell/TableCell.css.js +6 -0
- package/cjs/table-cell/TableCell.css.js.map +1 -0
- package/cjs/table-cell/TableCell.js +72 -0
- package/cjs/table-cell/TableCell.js.map +1 -0
- package/cjs/table-cell/TableGroupCell.css.js +6 -0
- package/cjs/table-cell/TableGroupCell.css.js.map +1 -0
- package/cjs/table-cell/TableGroupCell.js +54 -0
- package/cjs/table-cell/TableGroupCell.js.map +1 -0
- package/cjs/table-config.js +25 -0
- package/cjs/table-config.js.map +1 -0
- package/cjs/table-dom-utils.js +60 -0
- package/cjs/table-dom-utils.js.map +1 -0
- package/cjs/table-header/TableHeader.js +87 -0
- package/cjs/table-header/TableHeader.js.map +1 -0
- package/cjs/table-header/useTableHeader.js +72 -0
- package/cjs/table-header/useTableHeader.js.map +1 -0
- package/cjs/useCell.js +28 -0
- package/cjs/useCell.js.map +1 -0
- package/cjs/useCellEditing.js +79 -0
- package/cjs/useCellEditing.js.map +1 -0
- package/cjs/useControlledTableNavigation.js +43 -0
- package/cjs/useControlledTableNavigation.js.map +1 -0
- package/cjs/useDataSource.js +104 -0
- package/cjs/useDataSource.js.map +1 -0
- package/cjs/useInitialValue.js +11 -0
- package/cjs/useInitialValue.js.map +1 -0
- package/cjs/useKeyboardNavigation.js +304 -0
- package/cjs/useKeyboardNavigation.js.map +1 -0
- package/cjs/useRowClassNameGenerators.js +34 -0
- package/cjs/useRowClassNameGenerators.js.map +1 -0
- package/cjs/useRowHeight.js +43 -0
- package/cjs/useRowHeight.js.map +1 -0
- package/cjs/useSelection.js +64 -0
- package/cjs/useSelection.js.map +1 -0
- package/cjs/useTable.js +553 -0
- package/cjs/useTable.js.map +1 -0
- package/cjs/useTableAndColumnSettings.js +128 -0
- package/cjs/useTableAndColumnSettings.js.map +1 -0
- package/cjs/useTableContextMenu.js +42 -0
- package/cjs/useTableContextMenu.js.map +1 -0
- package/cjs/useTableModel.js +297 -0
- package/cjs/useTableModel.js.map +1 -0
- package/cjs/useTableScroll.js +396 -0
- package/cjs/useTableScroll.js.map +1 -0
- package/cjs/useTableViewport.js +122 -0
- package/cjs/useTableViewport.js.map +1 -0
- package/esm/Row.css.js +4 -0
- package/esm/Row.css.js.map +1 -0
- package/esm/Row.js +127 -0
- package/esm/Row.js.map +1 -0
- package/esm/Table.css.js +4 -0
- package/esm/Table.css.js.map +1 -0
- package/esm/Table.js +283 -0
- package/esm/Table.js.map +1 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -0
- package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
- package/esm/cell-renderers/input-cell/InputCell.css.js +4 -0
- package/esm/cell-renderers/input-cell/InputCell.css.js.map +1 -0
- package/esm/cell-renderers/input-cell/InputCell.js +56 -0
- package/esm/cell-renderers/input-cell/InputCell.js.map +1 -0
- package/esm/cell-renderers/toggle-cell/ToggleCell.css.js +4 -0
- package/esm/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
- package/esm/cell-renderers/toggle-cell/ToggleCell.js +66 -0
- package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
- package/esm/column-header-pill/ColumnHeaderPill.css.js +4 -0
- package/esm/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
- package/esm/column-header-pill/ColumnHeaderPill.js +51 -0
- package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -0
- package/esm/column-header-pill/GroupColumnPill.css.js +4 -0
- package/esm/column-header-pill/GroupColumnPill.css.js.map +1 -0
- package/esm/column-header-pill/GroupColumnPill.js +27 -0
- package/esm/column-header-pill/GroupColumnPill.js.map +1 -0
- package/esm/column-header-pill/SortIndicator.css.js +4 -0
- package/esm/column-header-pill/SortIndicator.css.js.map +1 -0
- package/esm/column-header-pill/SortIndicator.js +25 -0
- package/esm/column-header-pill/SortIndicator.js.map +1 -0
- package/esm/column-menu/ColumnMenu.css.js +4 -0
- package/esm/column-menu/ColumnMenu.css.js.map +1 -0
- package/esm/column-menu/ColumnMenu.js +28 -0
- package/esm/column-menu/ColumnMenu.js.map +1 -0
- package/esm/column-resizing/ColumnResizer.css.js +4 -0
- package/esm/column-resizing/ColumnResizer.css.js.map +1 -0
- package/esm/column-resizing/ColumnResizer.js +70 -0
- package/esm/column-resizing/ColumnResizer.js.map +1 -0
- package/esm/column-resizing/useTableColumnResize.js +53 -0
- package/esm/column-resizing/useTableColumnResize.js.map +1 -0
- package/esm/context-menu/buildContextMenuDescriptors.js +212 -0
- package/esm/context-menu/buildContextMenuDescriptors.js.map +1 -0
- package/esm/context-menu/useHandleTableContextMenu.js +79 -0
- package/esm/context-menu/useHandleTableContextMenu.js.map +1 -0
- package/esm/header-cell/GroupHeaderCell.css.js +4 -0
- package/esm/header-cell/GroupHeaderCell.css.js.map +1 -0
- package/esm/header-cell/GroupHeaderCell.js +115 -0
- package/esm/header-cell/GroupHeaderCell.js.map +1 -0
- package/esm/header-cell/HeaderCell.css.js +4 -0
- package/esm/header-cell/HeaderCell.css.js.map +1 -0
- package/esm/header-cell/HeaderCell.js +107 -0
- package/esm/header-cell/HeaderCell.js.map +1 -0
- package/esm/index.js +14 -0
- package/esm/index.js.map +1 -0
- package/esm/moving-window.js +59 -0
- package/esm/moving-window.js.map +1 -0
- package/esm/table-cell/TableCell.css.js +4 -0
- package/esm/table-cell/TableCell.css.js.map +1 -0
- package/esm/table-cell/TableCell.js +70 -0
- package/esm/table-cell/TableCell.js.map +1 -0
- package/esm/table-cell/TableGroupCell.css.js +4 -0
- package/esm/table-cell/TableGroupCell.css.js.map +1 -0
- package/esm/table-cell/TableGroupCell.js +52 -0
- package/esm/table-cell/TableGroupCell.js.map +1 -0
- package/esm/table-config.js +23 -0
- package/esm/table-config.js.map +1 -0
- package/esm/table-dom-utils.js +51 -0
- package/esm/table-dom-utils.js.map +1 -0
- package/esm/table-header/TableHeader.js +85 -0
- package/esm/table-header/TableHeader.js.map +1 -0
- package/esm/table-header/useTableHeader.js +70 -0
- package/esm/table-header/useTableHeader.js.map +1 -0
- package/esm/useCell.js +26 -0
- package/esm/useCell.js.map +1 -0
- package/esm/useCellEditing.js +77 -0
- package/esm/useCellEditing.js.map +1 -0
- package/esm/useControlledTableNavigation.js +41 -0
- package/esm/useControlledTableNavigation.js.map +1 -0
- package/esm/useDataSource.js +101 -0
- package/esm/useDataSource.js.map +1 -0
- package/esm/useInitialValue.js +9 -0
- package/esm/useInitialValue.js.map +1 -0
- package/esm/useKeyboardNavigation.js +300 -0
- package/esm/useKeyboardNavigation.js.map +1 -0
- package/esm/useRowClassNameGenerators.js +32 -0
- package/esm/useRowClassNameGenerators.js.map +1 -0
- package/esm/useRowHeight.js +41 -0
- package/esm/useRowHeight.js.map +1 -0
- package/esm/useSelection.js +62 -0
- package/esm/useSelection.js.map +1 -0
- package/esm/useTable.js +551 -0
- package/esm/useTable.js.map +1 -0
- package/esm/useTableAndColumnSettings.js +126 -0
- package/esm/useTableAndColumnSettings.js.map +1 -0
- package/esm/useTableContextMenu.js +40 -0
- package/esm/useTableContextMenu.js.map +1 -0
- package/esm/useTableModel.js +293 -0
- package/esm/useTableModel.js.map +1 -0
- package/esm/useTableScroll.js +393 -0
- package/esm/useTableScroll.js.map +1 -0
- package/esm/useTableViewport.js +120 -0
- package/esm/useTableViewport.js.map +1 -0
- package/package.json +42 -0
- package/types/Row.d.ts +23 -0
- package/types/Table.d.ts +91 -0
- package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +3 -0
- package/types/cell-renderers/checkbox-cell/index.d.ts +1 -0
- package/types/cell-renderers/index.d.ts +3 -0
- package/types/cell-renderers/input-cell/InputCell.d.ts +3 -0
- package/types/cell-renderers/input-cell/index.d.ts +1 -0
- package/types/cell-renderers/toggle-cell/ToggleCell.d.ts +3 -0
- package/types/cell-renderers/toggle-cell/index.d.ts +1 -0
- package/types/column-header-pill/ColumnHeaderPill.d.ts +8 -0
- package/types/column-header-pill/GroupColumnPill.d.ts +7 -0
- package/types/column-header-pill/SortIndicator.d.ts +6 -0
- package/types/column-header-pill/index.d.ts +3 -0
- package/types/column-menu/ColumnMenu.d.ts +6 -0
- package/types/column-menu/index.d.ts +1 -0
- package/types/column-resizing/ColumnResizer.d.ts +7 -0
- package/types/column-resizing/index.d.ts +2 -0
- package/types/column-resizing/useTableColumnResize.d.ts +15 -0
- package/types/context-menu/buildContextMenuDescriptors.d.ts +3 -0
- package/types/context-menu/index.d.ts +2 -0
- package/types/context-menu/useHandleTableContextMenu.d.ts +20 -0
- package/types/header-cell/GroupHeaderCell.d.ts +8 -0
- package/types/header-cell/HeaderCell.d.ts +3 -0
- package/types/header-cell/index.d.ts +2 -0
- package/types/index.d.ts +11 -0
- package/types/moving-window.d.ts +14 -0
- package/types/table-cell/TableCell.d.ts +3 -0
- package/types/table-cell/TableGroupCell.d.ts +3 -0
- package/types/table-cell/index.d.ts +2 -0
- package/types/table-config.d.ts +25 -0
- package/types/table-dom-utils.d.ts +14 -0
- package/types/table-header/TableHeader.d.ts +19 -0
- package/types/table-header/useTableHeader.d.ts +15 -0
- package/types/useCell.d.ts +6 -0
- package/types/useCellEditing.d.ts +10 -0
- package/types/useControlledTableNavigation.d.ts +7 -0
- package/types/useDataSource.d.ts +20 -0
- package/types/useInitialValue.d.ts +1 -0
- package/types/useKeyboardNavigation.d.ts +36 -0
- package/types/useResizeObserver.d.ts +15 -0
- package/types/useRowClassNameGenerators.d.ts +3 -0
- package/types/useRowHeight.d.ts +8 -0
- package/types/useSelection.d.ts +14 -0
- package/types/useTable.d.ts +71 -0
- package/types/useTableAndColumnSettings.d.ts +15 -0
- package/types/useTableContextMenu.d.ts +10 -0
- package/types/useTableModel.d.ts +103 -0
- package/types/useTableScroll.d.ts +57 -0
- package/types/useTableViewport.d.ts +41 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var tableDomUtils = require('./table-dom-utils.js');
|
|
6
|
+
|
|
7
|
+
const SCROLL_MOVE_CHECK_THRESHOLD = 100;
|
|
8
|
+
const HORIZONTAL_SCROLL_BUFFER = 200;
|
|
9
|
+
const getMaxScroll = (container) => {
|
|
10
|
+
const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;
|
|
11
|
+
return [scrollWidth - clientWidth, scrollHeight - clientHeight];
|
|
12
|
+
};
|
|
13
|
+
const getScrollDirection = (prevScrollPositions, scrollPos) => {
|
|
14
|
+
if (prevScrollPositions === void 0) {
|
|
15
|
+
return void 0;
|
|
16
|
+
} else {
|
|
17
|
+
const { scrollTop: prevTop } = prevScrollPositions;
|
|
18
|
+
return scrollPos > prevTop ? "fwd" : "bwd";
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const getPctScroll = (container, currentScrollPos) => {
|
|
22
|
+
const {
|
|
23
|
+
clientHeight,
|
|
24
|
+
clientWidth,
|
|
25
|
+
scrollHeight,
|
|
26
|
+
scrollLeft,
|
|
27
|
+
scrollTop,
|
|
28
|
+
scrollWidth
|
|
29
|
+
} = container;
|
|
30
|
+
const maxScrollLeft = scrollWidth - clientWidth;
|
|
31
|
+
const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);
|
|
32
|
+
const maxScrollTop = scrollHeight - clientHeight;
|
|
33
|
+
let pctScrollTop = scrollTop / (scrollHeight - clientHeight);
|
|
34
|
+
const scrollDirection = getScrollDirection(currentScrollPos, scrollTop);
|
|
35
|
+
if (scrollDirection === "fwd" && pctScrollTop > 0.99) {
|
|
36
|
+
pctScrollTop = 1;
|
|
37
|
+
} else if (scrollDirection === "bwd" && pctScrollTop < 0.02) {
|
|
38
|
+
pctScrollTop = 0;
|
|
39
|
+
}
|
|
40
|
+
return [
|
|
41
|
+
scrollLeft,
|
|
42
|
+
pctScrollLeft,
|
|
43
|
+
maxScrollLeft,
|
|
44
|
+
scrollTop,
|
|
45
|
+
pctScrollTop,
|
|
46
|
+
maxScrollTop
|
|
47
|
+
];
|
|
48
|
+
};
|
|
49
|
+
const noScrolling = {
|
|
50
|
+
scrollToIndex: () => void 0,
|
|
51
|
+
scrollToKey: () => void 0
|
|
52
|
+
};
|
|
53
|
+
const useCallbackRef = ({
|
|
54
|
+
onAttach,
|
|
55
|
+
onDetach
|
|
56
|
+
}) => {
|
|
57
|
+
const ref = react.useRef(null);
|
|
58
|
+
const callbackRef = react.useCallback(
|
|
59
|
+
(el) => {
|
|
60
|
+
if (el) {
|
|
61
|
+
ref.current = el;
|
|
62
|
+
onAttach?.(el);
|
|
63
|
+
} else if (ref.current) {
|
|
64
|
+
const { current: originalRef } = ref;
|
|
65
|
+
ref.current = el;
|
|
66
|
+
onDetach?.(originalRef);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
[onAttach, onDetach]
|
|
70
|
+
);
|
|
71
|
+
return callbackRef;
|
|
72
|
+
};
|
|
73
|
+
const useTableScroll = ({
|
|
74
|
+
columns,
|
|
75
|
+
getRowAtPosition,
|
|
76
|
+
onHorizontalScroll,
|
|
77
|
+
onVerticalScroll,
|
|
78
|
+
onVerticalScrollInSitu,
|
|
79
|
+
rowHeight,
|
|
80
|
+
scrollingApiRef,
|
|
81
|
+
setRange,
|
|
82
|
+
viewportMeasurements
|
|
83
|
+
}) => {
|
|
84
|
+
const firstRowRef = react.useRef(0);
|
|
85
|
+
const rowHeightRef = react.useRef(rowHeight);
|
|
86
|
+
const contentContainerScrolledRef = react.useRef(false);
|
|
87
|
+
const contentContainerPosRef = react.useRef({
|
|
88
|
+
scrollTop: 0,
|
|
89
|
+
scrollLeft: 0
|
|
90
|
+
});
|
|
91
|
+
const scrollbarContainerScrolledRef = react.useRef(false);
|
|
92
|
+
const scrollbarContainerPosRef = react.useRef({
|
|
93
|
+
scrollTop: 0,
|
|
94
|
+
scrollLeft: 0
|
|
95
|
+
});
|
|
96
|
+
const scrollbarContainerRef = react.useRef(null);
|
|
97
|
+
const contentContainerRef = react.useRef(null);
|
|
98
|
+
const lastHorizontalScrollCheckPoint = react.useRef(0);
|
|
99
|
+
const {
|
|
100
|
+
appliedPageSize,
|
|
101
|
+
isVirtualScroll,
|
|
102
|
+
rowCount: viewportRowCount,
|
|
103
|
+
totalHeaderHeight,
|
|
104
|
+
viewportWidth
|
|
105
|
+
} = viewportMeasurements;
|
|
106
|
+
const columnsWithinViewportRef = react.useRef([]);
|
|
107
|
+
const [, forceRefresh] = react.useState({});
|
|
108
|
+
const preSpanRef = react.useRef(0);
|
|
109
|
+
react.useMemo(() => {
|
|
110
|
+
const [visibleColumns, offset] = vuuUtils.getColumnsInViewport(
|
|
111
|
+
columns,
|
|
112
|
+
contentContainerPosRef.current.scrollLeft,
|
|
113
|
+
contentContainerPosRef.current.scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER
|
|
114
|
+
);
|
|
115
|
+
preSpanRef.current = offset;
|
|
116
|
+
columnsWithinViewportRef.current = visibleColumns;
|
|
117
|
+
}, [viewportWidth, columns]);
|
|
118
|
+
const handleHorizontalScroll = react.useCallback(
|
|
119
|
+
(scrollLeft) => {
|
|
120
|
+
contentContainerPosRef.current.scrollLeft = scrollLeft;
|
|
121
|
+
onHorizontalScroll?.(scrollLeft);
|
|
122
|
+
if (Math.abs(scrollLeft - lastHorizontalScrollCheckPoint.current) > SCROLL_MOVE_CHECK_THRESHOLD) {
|
|
123
|
+
lastHorizontalScrollCheckPoint.current = scrollLeft;
|
|
124
|
+
const [visibleColumns, pre] = vuuUtils.getColumnsInViewport(
|
|
125
|
+
columns,
|
|
126
|
+
scrollLeft,
|
|
127
|
+
scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER
|
|
128
|
+
);
|
|
129
|
+
if (vuuUtils.itemsChanged(columnsWithinViewportRef.current, visibleColumns)) {
|
|
130
|
+
preSpanRef.current = pre;
|
|
131
|
+
columnsWithinViewportRef.current = visibleColumns;
|
|
132
|
+
forceRefresh({});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
[columns, onHorizontalScroll, viewportWidth]
|
|
137
|
+
);
|
|
138
|
+
const handleVerticalScroll = react.useCallback(
|
|
139
|
+
(scrollTop, pctScrollTop) => {
|
|
140
|
+
contentContainerPosRef.current.scrollTop = scrollTop;
|
|
141
|
+
onVerticalScroll?.(scrollTop, pctScrollTop);
|
|
142
|
+
const firstRow = getRowAtPosition(scrollTop);
|
|
143
|
+
if (firstRow !== firstRowRef.current) {
|
|
144
|
+
firstRowRef.current = firstRow;
|
|
145
|
+
setRange({ from: firstRow, to: firstRow + viewportRowCount });
|
|
146
|
+
}
|
|
147
|
+
onVerticalScrollInSitu?.(0);
|
|
148
|
+
},
|
|
149
|
+
[
|
|
150
|
+
getRowAtPosition,
|
|
151
|
+
onVerticalScroll,
|
|
152
|
+
onVerticalScrollInSitu,
|
|
153
|
+
setRange,
|
|
154
|
+
viewportRowCount
|
|
155
|
+
]
|
|
156
|
+
);
|
|
157
|
+
const handleScrollbarContainerScroll = react.useCallback(() => {
|
|
158
|
+
const { current: contentContainer } = contentContainerRef;
|
|
159
|
+
const { current: scrollbarContainer } = scrollbarContainerRef;
|
|
160
|
+
const { current: contentContainerScrolled } = contentContainerScrolledRef;
|
|
161
|
+
const { current: scrollPos } = scrollbarContainerPosRef;
|
|
162
|
+
if (contentContainerScrolled) {
|
|
163
|
+
contentContainerScrolledRef.current = false;
|
|
164
|
+
} else if (contentContainer && scrollbarContainer) {
|
|
165
|
+
scrollbarContainerScrolledRef.current = true;
|
|
166
|
+
const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] = getPctScroll(scrollbarContainer, scrollPos);
|
|
167
|
+
scrollPos.scrollLeft = scrollLeft;
|
|
168
|
+
scrollPos.scrollTop = scrollTop;
|
|
169
|
+
const [maxScrollLeft, maxScrollTop] = getMaxScroll(scrollbarContainer);
|
|
170
|
+
const contentScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);
|
|
171
|
+
const contentScrollTop = pctScrollTop * maxScrollTop;
|
|
172
|
+
contentContainer.scrollTo({
|
|
173
|
+
left: contentScrollLeft,
|
|
174
|
+
top: contentScrollTop,
|
|
175
|
+
behavior: "auto"
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
onVerticalScrollInSitu?.(0);
|
|
179
|
+
}, [onVerticalScrollInSitu]);
|
|
180
|
+
const handleContentContainerScroll = react.useCallback(() => {
|
|
181
|
+
const { current: scrollbarContainerScrolled } = scrollbarContainerScrolledRef;
|
|
182
|
+
const { current: contentContainer } = contentContainerRef;
|
|
183
|
+
const { current: scrollbarContainer } = scrollbarContainerRef;
|
|
184
|
+
const { current: scrollPos } = contentContainerPosRef;
|
|
185
|
+
if (contentContainer && scrollbarContainer) {
|
|
186
|
+
const [
|
|
187
|
+
scrollLeft,
|
|
188
|
+
pctScrollLeft,
|
|
189
|
+
maxScrollLeft,
|
|
190
|
+
scrollTop,
|
|
191
|
+
pctScrollTop,
|
|
192
|
+
maxScrollTop
|
|
193
|
+
] = getPctScroll(contentContainer);
|
|
194
|
+
contentContainerScrolledRef.current = true;
|
|
195
|
+
if (scrollbarContainerScrolled) {
|
|
196
|
+
scrollbarContainerScrolledRef.current = false;
|
|
197
|
+
} else {
|
|
198
|
+
scrollbarContainer.scrollLeft = Math.round(
|
|
199
|
+
pctScrollLeft * maxScrollLeft
|
|
200
|
+
);
|
|
201
|
+
scrollbarContainer.scrollTop = pctScrollTop * maxScrollTop;
|
|
202
|
+
}
|
|
203
|
+
if (scrollPos.scrollTop !== scrollTop) {
|
|
204
|
+
handleVerticalScroll(scrollTop, pctScrollTop);
|
|
205
|
+
}
|
|
206
|
+
if (scrollPos.scrollLeft !== scrollLeft) {
|
|
207
|
+
handleHorizontalScroll(scrollLeft);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}, [handleVerticalScroll, handleHorizontalScroll]);
|
|
211
|
+
const handleAttachScrollbarContainer = react.useCallback(
|
|
212
|
+
(el) => {
|
|
213
|
+
scrollbarContainerRef.current = el;
|
|
214
|
+
el.addEventListener("scroll", handleScrollbarContainerScroll, {
|
|
215
|
+
passive: true
|
|
216
|
+
});
|
|
217
|
+
},
|
|
218
|
+
[handleScrollbarContainerScroll]
|
|
219
|
+
);
|
|
220
|
+
const handleDetachScrollbarContainer = react.useCallback(
|
|
221
|
+
(el) => {
|
|
222
|
+
scrollbarContainerRef.current = null;
|
|
223
|
+
el.removeEventListener("scroll", handleScrollbarContainerScroll);
|
|
224
|
+
},
|
|
225
|
+
[handleScrollbarContainerScroll]
|
|
226
|
+
);
|
|
227
|
+
const handleAttachContentContainer = react.useCallback(
|
|
228
|
+
(el) => {
|
|
229
|
+
contentContainerRef.current = el;
|
|
230
|
+
el.addEventListener("scroll", handleContentContainerScroll, {
|
|
231
|
+
passive: true
|
|
232
|
+
});
|
|
233
|
+
},
|
|
234
|
+
[handleContentContainerScroll]
|
|
235
|
+
);
|
|
236
|
+
const handleDetachContentContainer = react.useCallback(
|
|
237
|
+
(el) => {
|
|
238
|
+
contentContainerRef.current = null;
|
|
239
|
+
el.removeEventListener("scroll", handleContentContainerScroll);
|
|
240
|
+
},
|
|
241
|
+
[handleContentContainerScroll]
|
|
242
|
+
);
|
|
243
|
+
const contentContainerCallbackRef = useCallbackRef({
|
|
244
|
+
onAttach: handleAttachContentContainer,
|
|
245
|
+
onDetach: handleDetachContentContainer
|
|
246
|
+
});
|
|
247
|
+
const scrollbarContainerCallbackRef = useCallbackRef({
|
|
248
|
+
onAttach: handleAttachScrollbarContainer,
|
|
249
|
+
onDetach: handleDetachScrollbarContainer
|
|
250
|
+
});
|
|
251
|
+
const requestScroll = react.useCallback(
|
|
252
|
+
(scrollRequest) => {
|
|
253
|
+
const { current: contentContainer } = contentContainerRef;
|
|
254
|
+
if (contentContainer) {
|
|
255
|
+
const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);
|
|
256
|
+
const { scrollLeft, scrollTop } = contentContainer;
|
|
257
|
+
contentContainerScrolledRef.current = false;
|
|
258
|
+
if (scrollRequest.type === "scroll-row") {
|
|
259
|
+
const activeRow = vuuUtils.getRowElementAtIndex(
|
|
260
|
+
contentContainer,
|
|
261
|
+
scrollRequest.rowIndex
|
|
262
|
+
);
|
|
263
|
+
if (activeRow !== null) {
|
|
264
|
+
const [direction, distance] = tableDomUtils.howFarIsRowOutsideViewport(
|
|
265
|
+
activeRow,
|
|
266
|
+
totalHeaderHeight
|
|
267
|
+
);
|
|
268
|
+
console.log(`outside viewport ? ${direction} ${distance}`);
|
|
269
|
+
if (direction && distance) {
|
|
270
|
+
if (isVirtualScroll) {
|
|
271
|
+
const offset = direction === "down" ? 1 : -1;
|
|
272
|
+
onVerticalScrollInSitu?.(offset);
|
|
273
|
+
const firstRow = firstRowRef.current + offset;
|
|
274
|
+
firstRowRef.current = firstRow;
|
|
275
|
+
setRange({
|
|
276
|
+
from: firstRow,
|
|
277
|
+
to: firstRow + viewportRowCount
|
|
278
|
+
});
|
|
279
|
+
} else {
|
|
280
|
+
let newScrollLeft = scrollLeft;
|
|
281
|
+
let newScrollTop = scrollTop;
|
|
282
|
+
if (direction === "up" || direction === "down") {
|
|
283
|
+
newScrollTop = Math.min(
|
|
284
|
+
Math.max(0, scrollTop + distance),
|
|
285
|
+
maxScrollTop
|
|
286
|
+
);
|
|
287
|
+
} else {
|
|
288
|
+
newScrollLeft = Math.min(
|
|
289
|
+
Math.max(0, scrollLeft + distance),
|
|
290
|
+
maxScrollLeft
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
contentContainer.scrollTo({
|
|
294
|
+
top: newScrollTop,
|
|
295
|
+
left: newScrollLeft,
|
|
296
|
+
behavior: "smooth"
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
} else if (scrollRequest.type === "scroll-page") {
|
|
302
|
+
const { direction } = scrollRequest;
|
|
303
|
+
if (isVirtualScroll) {
|
|
304
|
+
const offset = direction === "down" ? viewportRowCount : -viewportRowCount;
|
|
305
|
+
onVerticalScrollInSitu?.(offset);
|
|
306
|
+
const firstRow = firstRowRef.current + offset;
|
|
307
|
+
firstRowRef.current = firstRow;
|
|
308
|
+
setRange({ from: firstRow, to: firstRow + viewportRowCount });
|
|
309
|
+
} else {
|
|
310
|
+
const scrollBy = direction === "down" ? appliedPageSize : -appliedPageSize;
|
|
311
|
+
const newScrollTop = Math.min(
|
|
312
|
+
Math.max(0, scrollTop + scrollBy),
|
|
313
|
+
maxScrollTop
|
|
314
|
+
);
|
|
315
|
+
contentContainer.scrollTo({
|
|
316
|
+
top: newScrollTop,
|
|
317
|
+
left: scrollLeft,
|
|
318
|
+
behavior: "auto"
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
} else if (scrollRequest.type === "scroll-end") {
|
|
322
|
+
const { direction } = scrollRequest;
|
|
323
|
+
const scrollTo = direction === "end" ? maxScrollTop : 0;
|
|
324
|
+
contentContainer.scrollTo({
|
|
325
|
+
top: scrollTo,
|
|
326
|
+
left: contentContainer.scrollLeft,
|
|
327
|
+
behavior: "auto"
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
},
|
|
332
|
+
[
|
|
333
|
+
appliedPageSize,
|
|
334
|
+
isVirtualScroll,
|
|
335
|
+
onVerticalScrollInSitu,
|
|
336
|
+
setRange,
|
|
337
|
+
totalHeaderHeight,
|
|
338
|
+
viewportRowCount
|
|
339
|
+
]
|
|
340
|
+
);
|
|
341
|
+
const scrollHandles = react.useMemo(
|
|
342
|
+
// TODO not complete yet
|
|
343
|
+
() => ({
|
|
344
|
+
scrollToIndex: (rowIndex) => {
|
|
345
|
+
if (scrollbarContainerRef.current) {
|
|
346
|
+
const scrollPos = (rowIndex - 30) * 20;
|
|
347
|
+
scrollbarContainerRef.current.scrollTop = scrollPos;
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
scrollToKey: (rowKey) => {
|
|
351
|
+
console.log(`scrollToKey ${rowKey}`);
|
|
352
|
+
}
|
|
353
|
+
}),
|
|
354
|
+
[]
|
|
355
|
+
);
|
|
356
|
+
react.useImperativeHandle(
|
|
357
|
+
scrollingApiRef,
|
|
358
|
+
() => {
|
|
359
|
+
if (scrollbarContainerRef.current) {
|
|
360
|
+
return scrollHandles;
|
|
361
|
+
} else {
|
|
362
|
+
return noScrolling;
|
|
363
|
+
}
|
|
364
|
+
},
|
|
365
|
+
[scrollHandles]
|
|
366
|
+
);
|
|
367
|
+
react.useEffect(() => {
|
|
368
|
+
if (rowHeight !== rowHeightRef.current) {
|
|
369
|
+
rowHeightRef.current = rowHeight;
|
|
370
|
+
if (contentContainerPosRef.current.scrollTop > 0) {
|
|
371
|
+
if (contentContainerRef.current) {
|
|
372
|
+
contentContainerRef.current.scrollTop = 0;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
} else {
|
|
376
|
+
const { current: from } = firstRowRef;
|
|
377
|
+
const rowRange = { from, to: from + viewportRowCount };
|
|
378
|
+
setRange(rowRange);
|
|
379
|
+
}
|
|
380
|
+
}, [rowHeight, setRange, viewportRowCount]);
|
|
381
|
+
return {
|
|
382
|
+
columnsWithinViewport: columnsWithinViewportRef.current,
|
|
383
|
+
/** Ref to be assigned to ScrollbarContainer */
|
|
384
|
+
scrollbarContainerRef: scrollbarContainerCallbackRef,
|
|
385
|
+
/** Ref to be assigned to ContentContainer */
|
|
386
|
+
contentContainerRef: contentContainerCallbackRef,
|
|
387
|
+
/** Scroll the table */
|
|
388
|
+
requestScroll,
|
|
389
|
+
/** number of leading columns not rendered because of virtualization */
|
|
390
|
+
virtualColSpan: preSpanRef.current
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
exports.noScrolling = noScrolling;
|
|
395
|
+
exports.useTableScroll = useTableScroll;
|
|
396
|
+
//# sourceMappingURL=useTableScroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTableScroll.js","sources":["../src/useTableScroll.ts"],"sourcesContent":["import {\n getColumnsInViewport,\n getRowElementAtIndex,\n itemsChanged,\n RowAtPositionFunc,\n} from \"@vuu-ui/vuu-utils\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ForwardedRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ViewportMeasurements } from \"./useTableViewport\";\nimport { howFarIsRowOutsideViewport } from \"./table-dom-utils\";\nimport type { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type ScrollDirectionVertical = \"up\" | \"down\";\nexport type ScrollDirectionHorizontal = \"left\" | \"right\";\nexport type ScrollDirection =\n | ScrollDirectionVertical\n | ScrollDirectionHorizontal;\n\n/**\n * scroll into view the row at given index posiiton.\n */\nexport interface ScrollRequestRow {\n rowIndex: number;\n type: \"scroll-row\";\n}\nexport interface ScrollRequestEnd {\n type: \"scroll-end\";\n direction: \"home\" | \"end\";\n}\n\nexport interface ScrollRequestPage {\n type: \"scroll-page\";\n direction: ScrollDirectionVertical;\n}\n\nexport type ScrollRequest =\n | ScrollRequestPage\n | ScrollRequestEnd\n | ScrollRequestRow;\n\nexport type ScrollRequestHandler = (request: ScrollRequest) => void;\n\nexport interface ScrollingAPI {\n scrollToIndex: (itemIndex: number) => void;\n scrollToKey: (rowKey: string) => void;\n}\n\n/** How far we allow horizontal scroll movement before we recheck the rendered columns */\nconst SCROLL_MOVE_CHECK_THRESHOLD = 100;\n\n/** The buffer size in pixels that we allow for rendering columns just outside the viewport */\nconst HORIZONTAL_SCROLL_BUFFER = 200;\n\n/**\n * Return the maximum scroll positions for gioven container\n * @param container\n * @returns [maxScrollLeft, maxScrollTop]\n */\nconst getMaxScroll = (container: HTMLElement) => {\n const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;\n return [scrollWidth - clientWidth, scrollHeight - clientHeight];\n};\n\nconst getScrollDirection = (\n prevScrollPositions: ScrollPos | undefined,\n scrollPos: number\n) => {\n if (prevScrollPositions === undefined) {\n return undefined;\n } else {\n const { scrollTop: prevTop } = prevScrollPositions;\n return scrollPos > prevTop ? \"fwd\" : \"bwd\";\n }\n};\n\nconst getPctScroll = (container: HTMLElement, currentScrollPos?: ScrollPos) => {\n const {\n clientHeight,\n clientWidth,\n scrollHeight,\n scrollLeft,\n scrollTop,\n scrollWidth,\n } = container;\n\n const maxScrollLeft = scrollWidth - clientWidth;\n const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);\n const maxScrollTop = scrollHeight - clientHeight;\n let pctScrollTop = scrollTop / (scrollHeight - clientHeight);\n\n const scrollDirection = getScrollDirection(currentScrollPos, scrollTop);\n\n if (scrollDirection === \"fwd\" && pctScrollTop > 0.99) {\n pctScrollTop = 1;\n } else if (scrollDirection === \"bwd\" && pctScrollTop < 0.02) {\n pctScrollTop = 0;\n }\n\n return [\n scrollLeft,\n pctScrollLeft,\n maxScrollLeft,\n scrollTop,\n pctScrollTop,\n maxScrollTop,\n ];\n};\n\nexport const noScrolling: ScrollingAPI = {\n scrollToIndex: () => undefined,\n scrollToKey: () => undefined,\n};\n\ninterface CallbackRefHookProps<T = HTMLElement> {\n onAttach?: (el: T) => void;\n onDetach: (el: T) => void;\n label?: string;\n}\n\nconst useCallbackRef = <T = HTMLElement>({\n onAttach,\n onDetach,\n}: CallbackRefHookProps<T>) => {\n const ref = useRef<T | null>(null);\n const callbackRef = useCallback(\n (el: T | null) => {\n if (el) {\n ref.current = el;\n onAttach?.(el);\n } else if (ref.current) {\n const { current: originalRef } = ref;\n ref.current = el;\n onDetach?.(originalRef);\n }\n },\n [onAttach, onDetach]\n );\n return callbackRef;\n};\n\ntype ScrollPos = {\n scrollLeft: number;\n scrollTop: number;\n};\n\nexport interface TableScrollHookProps {\n columns: RuntimeColumnDescriptor[];\n getRowAtPosition: RowAtPositionFunc;\n onHorizontalScroll?: (scrollLeft: number) => void;\n onVerticalScroll?: (scrollTop: number, pctScrollTop: number) => void;\n /**\n * When we have a virtualized scroll container, keyboard navigation is\n * performed `in situ`. We shift the range of rows rendered within the\n * viewport, whithout actually moving the scroll position\n */\n onVerticalScrollInSitu?: (rowIndexOffsetCount: number) => void;\n rowHeight: number;\n scrollingApiRef?: ForwardedRef<ScrollingAPI>;\n setRange: (range: VuuRange) => void;\n viewportMeasurements: ViewportMeasurements;\n}\n\nexport const useTableScroll = ({\n columns,\n getRowAtPosition,\n onHorizontalScroll,\n onVerticalScroll,\n onVerticalScrollInSitu,\n rowHeight,\n scrollingApiRef,\n setRange,\n viewportMeasurements,\n}: TableScrollHookProps) => {\n const firstRowRef = useRef<number>(0);\n const rowHeightRef = useRef(rowHeight);\n const contentContainerScrolledRef = useRef(false);\n const contentContainerPosRef = useRef<ScrollPos>({\n scrollTop: 0,\n scrollLeft: 0,\n });\n const scrollbarContainerScrolledRef = useRef(false);\n const scrollbarContainerPosRef = useRef<ScrollPos>({\n scrollTop: 0,\n scrollLeft: 0,\n });\n const scrollbarContainerRef = useRef<HTMLDivElement | null>(null);\n const contentContainerRef = useRef<HTMLDivElement | null>(null);\n const lastHorizontalScrollCheckPoint = useRef(0);\n\n const {\n appliedPageSize,\n isVirtualScroll,\n rowCount: viewportRowCount,\n totalHeaderHeight,\n viewportWidth,\n } = viewportMeasurements;\n\n const columnsWithinViewportRef = useRef<RuntimeColumnDescriptor[]>([]);\n const [, forceRefresh] = useState({});\n\n const preSpanRef = useRef(0);\n\n useMemo(() => {\n const [visibleColumns, offset] = getColumnsInViewport(\n columns,\n contentContainerPosRef.current.scrollLeft,\n contentContainerPosRef.current.scrollLeft +\n viewportWidth +\n HORIZONTAL_SCROLL_BUFFER\n );\n preSpanRef.current = offset;\n columnsWithinViewportRef.current = visibleColumns;\n }, [viewportWidth, columns]);\n\n const handleHorizontalScroll = useCallback(\n (scrollLeft: number) => {\n contentContainerPosRef.current.scrollLeft = scrollLeft;\n onHorizontalScroll?.(scrollLeft);\n\n if (\n Math.abs(scrollLeft - lastHorizontalScrollCheckPoint.current) >\n SCROLL_MOVE_CHECK_THRESHOLD\n ) {\n lastHorizontalScrollCheckPoint.current = scrollLeft;\n\n const [visibleColumns, pre] = getColumnsInViewport(\n columns,\n scrollLeft,\n scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER\n );\n\n if (itemsChanged(columnsWithinViewportRef.current, visibleColumns)) {\n preSpanRef.current = pre;\n columnsWithinViewportRef.current = visibleColumns;\n forceRefresh({});\n }\n }\n },\n [columns, onHorizontalScroll, viewportWidth]\n );\n const handleVerticalScroll = useCallback(\n (scrollTop: number, pctScrollTop: number) => {\n contentContainerPosRef.current.scrollTop = scrollTop;\n\n onVerticalScroll?.(scrollTop, pctScrollTop);\n const firstRow = getRowAtPosition(scrollTop);\n if (firstRow !== firstRowRef.current) {\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n }\n onVerticalScrollInSitu?.(0);\n },\n [\n getRowAtPosition,\n onVerticalScroll,\n onVerticalScrollInSitu,\n setRange,\n viewportRowCount,\n ]\n );\n\n const handleScrollbarContainerScroll = useCallback(() => {\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: contentContainerScrolled } = contentContainerScrolledRef;\n const { current: scrollPos } = scrollbarContainerPosRef;\n\n if (contentContainerScrolled) {\n contentContainerScrolledRef.current = false;\n } else if (contentContainer && scrollbarContainer) {\n scrollbarContainerScrolledRef.current = true;\n const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] =\n getPctScroll(scrollbarContainer, scrollPos);\n\n scrollPos.scrollLeft = scrollLeft;\n scrollPos.scrollTop = scrollTop;\n\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(scrollbarContainer);\n const contentScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n const contentScrollTop = pctScrollTop * maxScrollTop;\n\n contentContainer.scrollTo({\n left: contentScrollLeft,\n top: contentScrollTop,\n behavior: \"auto\",\n });\n }\n onVerticalScrollInSitu?.(0);\n }, [onVerticalScrollInSitu]);\n\n const handleContentContainerScroll = useCallback(() => {\n const { current: scrollbarContainerScrolled } =\n scrollbarContainerScrolledRef;\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: scrollPos } = contentContainerPosRef;\n\n if (contentContainer && scrollbarContainer) {\n const [\n scrollLeft,\n pctScrollLeft,\n maxScrollLeft,\n scrollTop,\n pctScrollTop,\n maxScrollTop,\n ] = getPctScroll(contentContainer);\n\n contentContainerScrolledRef.current = true;\n\n if (scrollbarContainerScrolled) {\n scrollbarContainerScrolledRef.current = false;\n } else {\n scrollbarContainer.scrollLeft = Math.round(\n pctScrollLeft * maxScrollLeft\n );\n scrollbarContainer.scrollTop = pctScrollTop * maxScrollTop;\n }\n\n if (scrollPos.scrollTop !== scrollTop) {\n handleVerticalScroll(scrollTop, pctScrollTop);\n }\n if (scrollPos.scrollLeft !== scrollLeft) {\n handleHorizontalScroll(scrollLeft);\n }\n }\n }, [handleVerticalScroll, handleHorizontalScroll]);\n\n const handleAttachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = el;\n el.addEventListener(\"scroll\", handleScrollbarContainerScroll, {\n passive: true,\n });\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleDetachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleScrollbarContainerScroll);\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleAttachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = el;\n el.addEventListener(\"scroll\", handleContentContainerScroll, {\n passive: true,\n });\n },\n [handleContentContainerScroll]\n );\n\n const handleDetachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleContentContainerScroll);\n },\n [handleContentContainerScroll]\n );\n\n const contentContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachContentContainer,\n onDetach: handleDetachContentContainer,\n });\n\n const scrollbarContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachScrollbarContainer,\n onDetach: handleDetachScrollbarContainer,\n });\n\n const requestScroll: ScrollRequestHandler = useCallback(\n (scrollRequest) => {\n const { current: contentContainer } = contentContainerRef;\n if (contentContainer) {\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);\n const { scrollLeft, scrollTop } = contentContainer;\n contentContainerScrolledRef.current = false;\n if (scrollRequest.type === \"scroll-row\") {\n const activeRow = getRowElementAtIndex(\n contentContainer,\n scrollRequest.rowIndex\n );\n\n if (activeRow !== null) {\n const [direction, distance] = howFarIsRowOutsideViewport(\n activeRow,\n totalHeaderHeight\n );\n console.log(`outside viewport ? ${direction} ${distance}`);\n if (direction && distance) {\n if (isVirtualScroll) {\n const offset = direction === \"down\" ? 1 : -1;\n onVerticalScrollInSitu?.(offset);\n const firstRow = firstRowRef.current + offset;\n firstRowRef.current = firstRow;\n setRange({\n from: firstRow,\n to: firstRow + viewportRowCount,\n });\n } else {\n let newScrollLeft = scrollLeft;\n let newScrollTop = scrollTop;\n if (direction === \"up\" || direction === \"down\") {\n newScrollTop = Math.min(\n Math.max(0, scrollTop + distance),\n maxScrollTop\n );\n } else {\n newScrollLeft = Math.min(\n Math.max(0, scrollLeft + distance),\n maxScrollLeft\n );\n }\n contentContainer.scrollTo({\n top: newScrollTop,\n left: newScrollLeft,\n behavior: \"smooth\",\n });\n }\n }\n }\n } else if (scrollRequest.type === \"scroll-page\") {\n const { direction } = scrollRequest;\n if (isVirtualScroll) {\n const offset =\n direction === \"down\" ? viewportRowCount : -viewportRowCount;\n onVerticalScrollInSitu?.(offset);\n const firstRow = firstRowRef.current + offset;\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n } else {\n const scrollBy =\n direction === \"down\" ? appliedPageSize : -appliedPageSize;\n const newScrollTop = Math.min(\n Math.max(0, scrollTop + scrollBy),\n maxScrollTop\n );\n contentContainer.scrollTo({\n top: newScrollTop,\n left: scrollLeft,\n behavior: \"auto\",\n });\n }\n } else if (scrollRequest.type === \"scroll-end\") {\n const { direction } = scrollRequest;\n const scrollTo = direction === \"end\" ? maxScrollTop : 0;\n contentContainer.scrollTo({\n top: scrollTo,\n left: contentContainer.scrollLeft,\n behavior: \"auto\",\n });\n }\n }\n },\n [\n appliedPageSize,\n isVirtualScroll,\n onVerticalScrollInSitu,\n setRange,\n totalHeaderHeight,\n viewportRowCount,\n ]\n );\n\n const scrollHandles: ScrollingAPI = useMemo(\n // TODO not complete yet\n () => ({\n scrollToIndex: (rowIndex: number) => {\n if (scrollbarContainerRef.current) {\n // TODO hardcoded rowHeight\n const scrollPos = (rowIndex - 30) * 20;\n scrollbarContainerRef.current.scrollTop = scrollPos;\n }\n },\n scrollToKey: (rowKey: string) => {\n console.log(`scrollToKey ${rowKey}`);\n },\n }),\n []\n );\n\n useImperativeHandle(\n scrollingApiRef,\n () => {\n if (scrollbarContainerRef.current) {\n return scrollHandles;\n } else {\n return noScrolling;\n }\n },\n [scrollHandles]\n );\n\n useEffect(() => {\n if (rowHeight !== rowHeightRef.current) {\n rowHeightRef.current = rowHeight;\n if (contentContainerPosRef.current.scrollTop > 0) {\n if (contentContainerRef.current) {\n contentContainerRef.current.scrollTop = 0;\n }\n }\n } else {\n const { current: from } = firstRowRef;\n const rowRange = { from, to: from + viewportRowCount };\n setRange(rowRange);\n }\n }, [rowHeight, setRange, viewportRowCount]);\n\n return {\n columnsWithinViewport: columnsWithinViewportRef.current,\n /** Ref to be assigned to ScrollbarContainer */\n scrollbarContainerRef: scrollbarContainerCallbackRef,\n /** Ref to be assigned to ContentContainer */\n contentContainerRef: contentContainerCallbackRef,\n /** Scroll the table */\n requestScroll,\n /** number of leading columns not rendered because of virtualization */\n virtualColSpan: preSpanRef.current,\n };\n};\n"],"names":["useRef","useCallback","useState","useMemo","getColumnsInViewport","itemsChanged","getRowElementAtIndex","howFarIsRowOutsideViewport","useImperativeHandle","useEffect"],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
const MAX_PIXEL_HEIGHT = 1e7;
|
|
7
|
+
const UNMEASURED_VIEWPORT = {
|
|
8
|
+
appliedPageSize: 0,
|
|
9
|
+
contentHeight: 0,
|
|
10
|
+
contentWidth: 0,
|
|
11
|
+
getRowAtPosition: () => -1,
|
|
12
|
+
getRowOffset: () => -1,
|
|
13
|
+
horizontalScrollbarHeight: 0,
|
|
14
|
+
isVirtualScroll: false,
|
|
15
|
+
pinnedWidthLeft: 0,
|
|
16
|
+
pinnedWidthRight: 0,
|
|
17
|
+
rowCount: 0,
|
|
18
|
+
setInSituRowOffset: () => void 0,
|
|
19
|
+
setScrollTop: () => void 0,
|
|
20
|
+
totalHeaderHeight: 0,
|
|
21
|
+
verticalScrollbarWidth: 0,
|
|
22
|
+
viewportBodyHeight: 0,
|
|
23
|
+
viewportWidth: 0
|
|
24
|
+
};
|
|
25
|
+
const useTableViewport = ({
|
|
26
|
+
columns,
|
|
27
|
+
headerHeight,
|
|
28
|
+
headings,
|
|
29
|
+
rowCount,
|
|
30
|
+
rowHeight,
|
|
31
|
+
selectionEndSize = 4,
|
|
32
|
+
size
|
|
33
|
+
}) => {
|
|
34
|
+
const inSituRowOffsetRef = react.useRef(0);
|
|
35
|
+
const pctScrollTopRef = react.useRef(0);
|
|
36
|
+
const pixelContentHeight = Math.min(rowHeight * rowCount, MAX_PIXEL_HEIGHT);
|
|
37
|
+
const virtualContentHeight = rowCount * rowHeight;
|
|
38
|
+
const virtualisedExtent = virtualContentHeight - pixelContentHeight;
|
|
39
|
+
const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = react.useMemo(
|
|
40
|
+
() => vuuUtils.measurePinnedColumns(columns, selectionEndSize),
|
|
41
|
+
[columns, selectionEndSize]
|
|
42
|
+
);
|
|
43
|
+
const totalHeaderHeightRef = react.useRef(headerHeight);
|
|
44
|
+
react.useMemo(() => {
|
|
45
|
+
totalHeaderHeightRef.current = headerHeight * (1 + headings.length);
|
|
46
|
+
}, [headerHeight, headings.length]);
|
|
47
|
+
const [getRowOffset, getRowAtPosition, isVirtualScroll] = react.useMemo(() => {
|
|
48
|
+
if (virtualisedExtent) {
|
|
49
|
+
const [_getRowOffset, getRowAtPosition2, _isVirtual] = vuuUtils.virtualRowPositioning(rowHeight, virtualisedExtent, pctScrollTopRef);
|
|
50
|
+
const getOffset = (row) => {
|
|
51
|
+
return _getRowOffset(row, inSituRowOffsetRef.current);
|
|
52
|
+
};
|
|
53
|
+
return [getOffset, getRowAtPosition2, _isVirtual];
|
|
54
|
+
} else {
|
|
55
|
+
return vuuUtils.actualRowPositioning(rowHeight);
|
|
56
|
+
}
|
|
57
|
+
}, [virtualisedExtent, rowHeight]);
|
|
58
|
+
const setScrollTop = react.useCallback((_, scrollPct) => {
|
|
59
|
+
pctScrollTopRef.current = scrollPct;
|
|
60
|
+
}, []);
|
|
61
|
+
const setInSituRowOffset = react.useCallback((rowIndexOffset) => {
|
|
62
|
+
if (rowIndexOffset === 0) {
|
|
63
|
+
inSituRowOffsetRef.current = 0;
|
|
64
|
+
} else {
|
|
65
|
+
inSituRowOffsetRef.current = Math.max(
|
|
66
|
+
0,
|
|
67
|
+
inSituRowOffsetRef.current + rowIndexOffset
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
}, []);
|
|
71
|
+
return react.useMemo(() => {
|
|
72
|
+
if (size) {
|
|
73
|
+
const { current: totalHeaderHeight } = totalHeaderHeightRef;
|
|
74
|
+
const scrollbarSize = 15;
|
|
75
|
+
const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;
|
|
76
|
+
const horizontalScrollbarHeight = contentWidth > size.width ? scrollbarSize : 0;
|
|
77
|
+
const visibleRows = (size.height - headerHeight) / rowHeight;
|
|
78
|
+
const count = Number.isInteger(visibleRows) ? visibleRows : Math.ceil(visibleRows);
|
|
79
|
+
const viewportBodyHeight = size.height - totalHeaderHeight;
|
|
80
|
+
const verticalScrollbarWidth = pixelContentHeight > viewportBodyHeight ? scrollbarSize : 0;
|
|
81
|
+
const appliedPageSize = count * rowHeight * (pixelContentHeight / virtualContentHeight);
|
|
82
|
+
const viewportWidth = size.width;
|
|
83
|
+
return {
|
|
84
|
+
appliedPageSize,
|
|
85
|
+
contentHeight: pixelContentHeight,
|
|
86
|
+
contentWidth,
|
|
87
|
+
getRowAtPosition,
|
|
88
|
+
getRowOffset,
|
|
89
|
+
isVirtualScroll,
|
|
90
|
+
horizontalScrollbarHeight,
|
|
91
|
+
pinnedWidthLeft,
|
|
92
|
+
pinnedWidthRight,
|
|
93
|
+
rowCount: count,
|
|
94
|
+
setInSituRowOffset,
|
|
95
|
+
setScrollTop,
|
|
96
|
+
totalHeaderHeight,
|
|
97
|
+
verticalScrollbarWidth,
|
|
98
|
+
viewportBodyHeight,
|
|
99
|
+
viewportWidth
|
|
100
|
+
};
|
|
101
|
+
} else {
|
|
102
|
+
return UNMEASURED_VIEWPORT;
|
|
103
|
+
}
|
|
104
|
+
}, [
|
|
105
|
+
getRowAtPosition,
|
|
106
|
+
getRowOffset,
|
|
107
|
+
headerHeight,
|
|
108
|
+
isVirtualScroll,
|
|
109
|
+
pinnedWidthLeft,
|
|
110
|
+
unpinnedWidth,
|
|
111
|
+
pinnedWidthRight,
|
|
112
|
+
pixelContentHeight,
|
|
113
|
+
rowHeight,
|
|
114
|
+
setInSituRowOffset,
|
|
115
|
+
setScrollTop,
|
|
116
|
+
size,
|
|
117
|
+
virtualContentHeight
|
|
118
|
+
]);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
exports.useTableViewport = useTableViewport;
|
|
122
|
+
//# sourceMappingURL=useTableViewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTableViewport.js","sources":["../src/useTableViewport.ts"],"sourcesContent":["/**\n * This hook measures and calculates the values needed to manage layout\n * and virtualisation of the table. This includes measurements required\n * to support pinned columns.\n */\nimport {\n RuntimeColumnDescriptor,\n TableHeadings,\n} from \"@vuu-ui/vuu-table-types\";\nimport { MeasuredSize } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n actualRowPositioning,\n measurePinnedColumns,\n RowAtPositionFunc,\n RowOffsetFunc,\n RowPositioning,\n virtualRowPositioning,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\nexport interface TableViewportHookProps {\n columns: RuntimeColumnDescriptor[];\n headerHeight: number;\n headings: TableHeadings;\n rowCount: number;\n rowHeight: number;\n /**\n * this is the solid left/right `border` rendered on the selection block\n */\n selectionEndSize?: number;\n size: MeasuredSize | undefined;\n}\n\nexport interface ViewportMeasurements {\n appliedPageSize: number;\n contentHeight: number;\n horizontalScrollbarHeight: number;\n isVirtualScroll: boolean;\n pinnedWidthLeft: number;\n pinnedWidthRight: number;\n rowCount: number;\n contentWidth: number;\n totalHeaderHeight: number;\n verticalScrollbarWidth: number;\n viewportBodyHeight: number;\n viewportWidth: number;\n}\n\nexport interface TableViewportHookResult extends ViewportMeasurements {\n getRowAtPosition: RowAtPositionFunc;\n getRowOffset: RowOffsetFunc;\n setInSituRowOffset: (rowIndexOffset: number) => void;\n setScrollTop: (scrollTop: number, scrollPct: number) => void;\n}\n\n// Too simplistic, it depends on rowHeight\nconst MAX_PIXEL_HEIGHT = 10_000_000;\n\nconst UNMEASURED_VIEWPORT: TableViewportHookResult = {\n appliedPageSize: 0,\n contentHeight: 0,\n contentWidth: 0,\n getRowAtPosition: () => -1,\n getRowOffset: () => -1,\n horizontalScrollbarHeight: 0,\n isVirtualScroll: false,\n pinnedWidthLeft: 0,\n pinnedWidthRight: 0,\n rowCount: 0,\n setInSituRowOffset: () => undefined,\n setScrollTop: () => undefined,\n totalHeaderHeight: 0,\n verticalScrollbarWidth: 0,\n viewportBodyHeight: 0,\n viewportWidth: 0,\n};\n\nexport const useTableViewport = ({\n columns,\n headerHeight,\n headings,\n rowCount,\n rowHeight,\n selectionEndSize = 4,\n size,\n}: TableViewportHookProps): TableViewportHookResult => {\n const inSituRowOffsetRef = useRef(0);\n const pctScrollTopRef = useRef(0);\n // TODO we are limited by pixels not an arbitraty number of rows\n const pixelContentHeight = Math.min(rowHeight * rowCount, MAX_PIXEL_HEIGHT);\n const virtualContentHeight = rowCount * rowHeight;\n const virtualisedExtent = virtualContentHeight - pixelContentHeight;\n\n const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = useMemo(\n () => measurePinnedColumns(columns, selectionEndSize),\n [columns, selectionEndSize]\n );\n\n const totalHeaderHeightRef = useRef(headerHeight);\n useMemo(() => {\n totalHeaderHeightRef.current = headerHeight * (1 + headings.length);\n }, [headerHeight, headings.length]);\n\n const [getRowOffset, getRowAtPosition, isVirtualScroll] =\n useMemo<RowPositioning>(() => {\n if (virtualisedExtent) {\n const [_getRowOffset, getRowAtPosition, _isVirtual] =\n virtualRowPositioning(rowHeight, virtualisedExtent, pctScrollTopRef);\n const getOffset: RowOffsetFunc = (row) => {\n return _getRowOffset(row, inSituRowOffsetRef.current);\n };\n return [getOffset, getRowAtPosition, _isVirtual];\n } else {\n return actualRowPositioning(rowHeight);\n }\n }, [virtualisedExtent, rowHeight]);\n\n const setScrollTop = useCallback((_: number, scrollPct: number) => {\n pctScrollTopRef.current = scrollPct;\n }, []);\n\n /**\n * The inSituRowOffset is used to simulate scrolling through a very large dataset\n * without actually moving the scroll position. It is triggered by keyboard\n * navigation. A simulated scroll operation will always be of one or more rows.\n * A value of zero is a request to reset the offset.\n */\n const setInSituRowOffset = useCallback((rowIndexOffset: number) => {\n if (rowIndexOffset === 0) {\n inSituRowOffsetRef.current = 0;\n } else {\n inSituRowOffsetRef.current = Math.max(\n 0,\n inSituRowOffsetRef.current + rowIndexOffset\n );\n }\n }, []);\n\n return useMemo(() => {\n if (size) {\n const { current: totalHeaderHeight } = totalHeaderHeightRef;\n // TODO determine this at runtime\n const scrollbarSize = 15;\n const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;\n const horizontalScrollbarHeight =\n contentWidth > size.width ? scrollbarSize : 0;\n const visibleRows = (size.height - headerHeight) / rowHeight;\n const count = Number.isInteger(visibleRows)\n ? visibleRows\n : Math.ceil(visibleRows);\n const viewportBodyHeight = size.height - totalHeaderHeight;\n const verticalScrollbarWidth =\n pixelContentHeight > viewportBodyHeight ? scrollbarSize : 0;\n\n const appliedPageSize =\n count * rowHeight * (pixelContentHeight / virtualContentHeight);\n\n const viewportWidth = size.width;\n\n return {\n appliedPageSize,\n contentHeight: pixelContentHeight,\n contentWidth,\n getRowAtPosition,\n getRowOffset,\n isVirtualScroll,\n horizontalScrollbarHeight,\n pinnedWidthLeft,\n pinnedWidthRight,\n rowCount: count,\n setInSituRowOffset,\n setScrollTop,\n totalHeaderHeight,\n verticalScrollbarWidth,\n viewportBodyHeight,\n viewportWidth,\n };\n } else {\n return UNMEASURED_VIEWPORT;\n }\n }, [\n getRowAtPosition,\n getRowOffset,\n headerHeight,\n isVirtualScroll,\n pinnedWidthLeft,\n unpinnedWidth,\n pinnedWidthRight,\n pixelContentHeight,\n rowHeight,\n setInSituRowOffset,\n setScrollTop,\n size,\n virtualContentHeight,\n ]);\n};\n"],"names":["useRef","useMemo","measurePinnedColumns","getRowAtPosition","virtualRowPositioning","actualRowPositioning","useCallback"],"mappings":";;;;;AAwDA,MAAM,gBAAmB,GAAA,GAAA,CAAA;AAEzB,MAAM,mBAA+C,GAAA;AAAA,EACnD,eAAiB,EAAA,CAAA;AAAA,EACjB,aAAe,EAAA,CAAA;AAAA,EACf,YAAc,EAAA,CAAA;AAAA,EACd,kBAAkB,MAAM,CAAA,CAAA;AAAA,EACxB,cAAc,MAAM,CAAA,CAAA;AAAA,EACpB,yBAA2B,EAAA,CAAA;AAAA,EAC3B,eAAiB,EAAA,KAAA;AAAA,EACjB,eAAiB,EAAA,CAAA;AAAA,EACjB,gBAAkB,EAAA,CAAA;AAAA,EAClB,QAAU,EAAA,CAAA;AAAA,EACV,oBAAoB,MAAM,KAAA,CAAA;AAAA,EAC1B,cAAc,MAAM,KAAA,CAAA;AAAA,EACpB,iBAAmB,EAAA,CAAA;AAAA,EACnB,sBAAwB,EAAA,CAAA;AAAA,EACxB,kBAAoB,EAAA,CAAA;AAAA,EACpB,aAAe,EAAA,CAAA;AACjB,CAAA,CAAA;AAEO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAmB,GAAA,CAAA;AAAA,EACnB,IAAA;AACF,CAAuD,KAAA;AACrD,EAAM,MAAA,kBAAA,GAAqBA,aAAO,CAAC,CAAA,CAAA;AACnC,EAAM,MAAA,eAAA,GAAkBA,aAAO,CAAC,CAAA,CAAA;AAEhC,EAAA,MAAM,kBAAqB,GAAA,IAAA,CAAK,GAAI,CAAA,SAAA,GAAY,UAAU,gBAAgB,CAAA,CAAA;AAC1E,EAAA,MAAM,uBAAuB,QAAW,GAAA,SAAA,CAAA;AACxC,EAAA,MAAM,oBAAoB,oBAAuB,GAAA,kBAAA,CAAA;AAEjD,EAAA,MAAM,EAAE,eAAA,EAAiB,gBAAkB,EAAA,aAAA,EAAkB,GAAAC,aAAA;AAAA,IAC3D,MAAMC,6BAAqB,CAAA,OAAA,EAAS,gBAAgB,CAAA;AAAA,IACpD,CAAC,SAAS,gBAAgB,CAAA;AAAA,GAC5B,CAAA;AAEA,EAAM,MAAA,oBAAA,GAAuBF,aAAO,YAAY,CAAA,CAAA;AAChD,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAqB,oBAAA,CAAA,OAAA,GAAU,YAAgB,IAAA,CAAA,GAAI,QAAS,CAAA,MAAA,CAAA,CAAA;AAAA,GAC3D,EAAA,CAAC,YAAc,EAAA,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA;AAElC,EAAA,MAAM,CAAC,YAAc,EAAA,gBAAA,EAAkB,eAAe,CAAA,GACpDA,cAAwB,MAAM;AAC5B,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAM,MAAA,CAAC,eAAeE,iBAAkB,EAAA,UAAU,IAChDC,8BAAsB,CAAA,SAAA,EAAW,mBAAmB,eAAe,CAAA,CAAA;AACrE,MAAM,MAAA,SAAA,GAA2B,CAAC,GAAQ,KAAA;AACxC,QAAO,OAAA,aAAA,CAAc,GAAK,EAAA,kBAAA,CAAmB,OAAO,CAAA,CAAA;AAAA,OACtD,CAAA;AACA,MAAO,OAAA,CAAC,SAAWD,EAAAA,iBAAAA,EAAkB,UAAU,CAAA,CAAA;AAAA,KAC1C,MAAA;AACL,MAAA,OAAOE,8BAAqB,SAAS,CAAA,CAAA;AAAA,KACvC;AAAA,GACC,EAAA,CAAC,iBAAmB,EAAA,SAAS,CAAC,CAAA,CAAA;AAEnC,EAAA,MAAM,YAAe,GAAAC,iBAAA,CAAY,CAAC,CAAA,EAAW,SAAsB,KAAA;AACjE,IAAA,eAAA,CAAgB,OAAU,GAAA,SAAA,CAAA;AAAA,GAC5B,EAAG,EAAE,CAAA,CAAA;AAQL,EAAM,MAAA,kBAAA,GAAqBA,iBAAY,CAAA,CAAC,cAA2B,KAAA;AACjE,IAAA,IAAI,mBAAmB,CAAG,EAAA;AACxB,MAAA,kBAAA,CAAmB,OAAU,GAAA,CAAA,CAAA;AAAA,KACxB,MAAA;AACL,MAAA,kBAAA,CAAmB,UAAU,IAAK,CAAA,GAAA;AAAA,QAChC,CAAA;AAAA,QACA,mBAAmB,OAAU,GAAA,cAAA;AAAA,OAC/B,CAAA;AAAA,KACF;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,OAAOL,cAAQ,MAAM;AACnB,IAAA,IAAI,IAAM,EAAA;AACR,MAAM,MAAA,EAAE,OAAS,EAAA,iBAAA,EAAsB,GAAA,oBAAA,CAAA;AAEvC,MAAA,MAAM,aAAgB,GAAA,EAAA,CAAA;AACtB,MAAM,MAAA,YAAA,GAAe,kBAAkB,aAAgB,GAAA,gBAAA,CAAA;AACvD,MAAA,MAAM,yBACJ,GAAA,YAAA,GAAe,IAAK,CAAA,KAAA,GAAQ,aAAgB,GAAA,CAAA,CAAA;AAC9C,MAAM,MAAA,WAAA,GAAA,CAAe,IAAK,CAAA,MAAA,GAAS,YAAgB,IAAA,SAAA,CAAA;AACnD,MAAM,MAAA,KAAA,GAAQ,OAAO,SAAU,CAAA,WAAW,IACtC,WACA,GAAA,IAAA,CAAK,KAAK,WAAW,CAAA,CAAA;AACzB,MAAM,MAAA,kBAAA,GAAqB,KAAK,MAAS,GAAA,iBAAA,CAAA;AACzC,MAAM,MAAA,sBAAA,GACJ,kBAAqB,GAAA,kBAAA,GAAqB,aAAgB,GAAA,CAAA,CAAA;AAE5D,MAAM,MAAA,eAAA,GACJ,KAAQ,GAAA,SAAA,IAAa,kBAAqB,GAAA,oBAAA,CAAA,CAAA;AAE5C,MAAA,MAAM,gBAAgB,IAAK,CAAA,KAAA,CAAA;AAE3B,MAAO,OAAA;AAAA,QACL,eAAA;AAAA,QACA,aAAe,EAAA,kBAAA;AAAA,QACf,YAAA;AAAA,QACA,gBAAA;AAAA,QACA,YAAA;AAAA,QACA,eAAA;AAAA,QACA,yBAAA;AAAA,QACA,eAAA;AAAA,QACA,gBAAA;AAAA,QACA,QAAU,EAAA,KAAA;AAAA,QACV,kBAAA;AAAA,QACA,YAAA;AAAA,QACA,iBAAA;AAAA,QACA,sBAAA;AAAA,QACA,kBAAA;AAAA,QACA,aAAA;AAAA,OACF,CAAA;AAAA,KACK,MAAA;AACL,MAAO,OAAA,mBAAA,CAAA;AAAA,KACT;AAAA,GACC,EAAA;AAAA,IACD,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,oBAAA;AAAA,GACD,CAAA,CAAA;AACH;;;;"}
|
package/esm/Row.css.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var rowCss = ".vuuTableRow {\n background: var(--row-background,var(--table-background));\n color: var(--salt-content-secondary-foreground);\n border-bottom: 1px solid var(--row-borderColor, var(--table-background));\n box-sizing: border-box;\n height: var(--row-height);\n line-height: calc(var(--row-height) - 1px);\n position: absolute;\n top:0;\n white-space: nowrap;\n}\n \n.vuuTableRow-proxy {\n visibility: hidden;\n}\n\n.vuuTableRow-even {\n --row-background: var(--row-background-even);\n}\n\n.vuuTableRow-highlighted {\n background: var(--salt-selectable-background-hover);\n}\n\n\n.vuuTableRow-selected,\n.vuuTableRow-selectedEnd {\n /* --row-borderColor: var(--salt-separable-secondary-borderColor); */\n background-color: var(--salt-selectable-background-selected);\n}\n\n.vuuTableRow-selectedEnd {\n z-index: 1;\n}\n\n.vuuTableRow-selectedStart {\n --vuu-selection-decorator-left-radius: 5px 0 0 0;\n --vuu-selection-decorator-right-radius: 0 5px 0 0;\n\n border-radius: 5px 5px 0 0;\n}\n \n .vuuTableRow-selectedEnd {\n --vuu-selection-decorator-left-radius: 0 0 0 5px;\n --vuu-selection-decorator-right-radius: 0 0 5px 0;\n border-radius: 0 0 5px 5px;\n }\n \n .vuuTableRow-selectedStart.vuuTableRow-selectedEnd {\n --vuu-selection-decorator-left-radius: 5px 0 0 5px;\n --vuu-selection-decorator-right-radius: 0 5px 5px 0;\n border-radius: 5px 5px 5px 5px;\n \n }\n \n .vuuTableRow-selectedStart:after {\n content: '';\n position: absolute;\n top: -1px;\n left: 4px;\n height: 1px;\n background: var(--vuuTableRow-selectionBlock-borderColor);\n width: calc(var(--content-width) - 8px);\n z-index: 1;\n }\n \n .vuuTableRow-selectedEnd {\n border-bottom-color: var(--vuuTableRow-selectionBlock-borderColor, var(--row-borderColor));\n }\n \n .vuuTableRow-selectionDecorator {\n background: var(--table-background);\n display: inline-block;\n position: relative;\n height: var(--row-height);\n width: 4px;\n z-index: 2;\n }\n \n .vuuTableRow-selectionDecorator.vuuStickyLeft {\n left:0;\n position: sticky;\n }\n \n .vuuTableRow-selectionDecorator.vuuStickyRight {\n right:0;\n position: sticky;\n } \n \n .vuuTableRow-selectedStart .vuuTableRow-selectionDecorator:before,\n .vuuTableRow-selectedEnd .vuuTableRow-selectionDecorator:before {\n content: '';\n inset: -1px 0 0 0;\n position: absolute;\n background: var(--table-background);\n }\n \n .vuuTableRow-selectionDecorator.vuuStickyLeft:before {\n border-radius: var(--vuu-selection-decorator-left-radius, 0);\n }\n \n .vuuTableRow-selectionDecorator.vuuStickyRight:before {\n border-radius: var(--vuu-selection-decorator-right-radius, 0);\n }\n\n .vuuTableRow-expanded {\n --toggle-icon-transform: rotate(90deg);\n }\n \n.vuuDraggable .vuuTableRow {\n --cell-borderColor: transparent;\n --vuu-selection-decorator-bg: transparent;\n transform: none!important;\n z-index: 1;\n}";
|
|
2
|
+
|
|
3
|
+
export { rowCss as default };
|
|
4
|
+
//# sourceMappingURL=Row.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Row.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|