beautiful-grid 1.0.2 → 1.0.4

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.
@@ -37,15 +37,15 @@ exports.CellSelectionOverlayLayer = CellSelectionOverlayLayer;
37
37
  var React = __importStar(require("react"));
38
38
  var cellSelectionGeometry_1 = require("../../utils/cellSelectionGeometry");
39
39
  function CellSelectionOverlayLayer(_a) {
40
- var quadrant = _a.quadrant, selectionFragments = _a.selectionFragments, activeFragments = _a.activeFragments, activeFill = _a.activeFill, activeRing = _a.activeRing, viewport = _a.viewport;
40
+ var quadrant = _a.quadrant, selectionFragments = _a.selectionFragments, activeFragments = _a.activeFragments, activeFill = _a.activeFill, activeRing = _a.activeRing, viewport = _a.viewport, _b = _a.offsetTop, offsetTop = _b === void 0 ? 0 : _b;
41
41
  var quadrantSelectionFragments = getVisibleFragments(selectionFragments, quadrant, viewport);
42
42
  var quadrantActiveFragments = getVisibleFragments(activeFragments, quadrant, viewport);
43
43
  if (quadrantSelectionFragments.length === 0 && quadrantActiveFragments.length === 0)
44
44
  return null;
45
45
  return (React.createElement("div", { className: 'bgrid-cell-selection-overlay-layer', "data-bgrid-selection-quadrant": quadrant, "aria-hidden": 'true' },
46
- quadrantSelectionFragments.map(function (fragment) { return (React.createElement("div", { key: "selection-".concat(fragment.rangeIndex), className: 'bgrid-cell-selection-fragment', "data-bgrid-selection-fragment": 'true', "data-bgrid-selection-range-index": fragment.rangeIndex, "data-edge-top": fragment.edges.top ? 'true' : undefined, "data-edge-right": fragment.edges.right ? 'true' : undefined, "data-edge-bottom": fragment.edges.bottom ? 'true' : undefined, "data-edge-left": fragment.edges.left ? 'true' : undefined, style: getFragmentStyle(fragment) })); }),
46
+ quadrantSelectionFragments.map(function (fragment) { return (React.createElement("div", { key: "selection-".concat(fragment.rangeIndex), className: 'bgrid-cell-selection-fragment', "data-bgrid-selection-fragment": 'true', "data-bgrid-selection-range-index": fragment.rangeIndex, "data-edge-top": fragment.edges.top ? 'true' : undefined, "data-edge-right": fragment.edges.right ? 'true' : undefined, "data-edge-bottom": fragment.edges.bottom ? 'true' : undefined, "data-edge-left": fragment.edges.left ? 'true' : undefined, style: getFragmentStyle(fragment, offsetTop) })); }),
47
47
  (activeFill || activeRing) &&
48
- quadrantActiveFragments.map(function (fragment) { return (React.createElement("div", { key: "active-".concat(fragment.rangeIndex), className: 'bgrid-cell-active-fragment', "data-bgrid-active-fragment": 'true', "data-active-fill": activeFill ? 'true' : undefined, "data-active-ring": activeRing ? 'true' : undefined, style: getFragmentStyle(fragment) })); })));
48
+ quadrantActiveFragments.map(function (fragment) { return (React.createElement("div", { key: "active-".concat(fragment.rangeIndex), className: 'bgrid-cell-active-fragment', "data-bgrid-active-fragment": 'true', "data-active-fill": activeFill ? 'true' : undefined, "data-active-ring": activeRing ? 'true' : undefined, style: getFragmentStyle(fragment, offsetTop) })); })));
49
49
  }
50
50
  function getVisibleFragments(fragments, quadrant, viewport) {
51
51
  return fragments.flatMap(function (fragment) {
@@ -55,10 +55,10 @@ function getVisibleFragments(fragments, quadrant, viewport) {
55
55
  return visibleFragment ? [visibleFragment] : [];
56
56
  });
57
57
  }
58
- function getFragmentStyle(fragment) {
58
+ function getFragmentStyle(fragment, offsetTop) {
59
59
  return {
60
60
  left: fragment.left,
61
- top: fragment.top,
61
+ top: fragment.top - offsetTop,
62
62
  width: fragment.width,
63
63
  height: fragment.height,
64
64
  };
@@ -53,10 +53,10 @@ function getRowBottom(rowIndex, rowHeight) {
53
53
  return (rowIndex + 1) * rowHeight;
54
54
  }
55
55
  function ensureCellVisible(_a) {
56
- var _b, _c, _d, _e, _f, _g;
57
- var cell = _a.cell, scrollContainer = _a.scrollContainer, _h = _a.frozenColumnCount, frozenColumnCount = _h === void 0 ? 0 : _h, _j = _a.frozenRowCount, frozenRowCount = _j === void 0 ? 0 : _j, columns = _a.columns, rowHeight = _a.rowHeight, viewportInsets = _a.viewportInsets;
58
- var currentScrollTop = (_b = scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.scrollTop) !== null && _b !== void 0 ? _b : 0;
59
- var currentScrollLeft = (_c = scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.scrollLeft) !== null && _c !== void 0 ? _c : 0;
56
+ var _b, _c, _d, _e, _f, _g, _h, _j;
57
+ var cell = _a.cell, scrollContainer = _a.scrollContainer, _k = _a.frozenColumnCount, frozenColumnCount = _k === void 0 ? 0 : _k, _l = _a.frozenRowCount, frozenRowCount = _l === void 0 ? 0 : _l, columns = _a.columns, rowHeight = _a.rowHeight, verticalScrollState = _a.verticalScrollState, viewportInsets = _a.viewportInsets;
58
+ var currentScrollTop = (_c = (_b = verticalScrollState === null || verticalScrollState === void 0 ? void 0 : verticalScrollState.scrollTop) !== null && _b !== void 0 ? _b : scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.scrollTop) !== null && _c !== void 0 ? _c : 0;
59
+ var currentScrollLeft = (_d = scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.scrollLeft) !== null && _d !== void 0 ? _d : 0;
60
60
  var nextScrollTop = currentScrollTop;
61
61
  var nextScrollLeft = currentScrollLeft;
62
62
  // Vertical scroll calculation
@@ -65,11 +65,11 @@ function ensureCellVisible(_a) {
65
65
  var rowTop = getRowTop(targetRowIndex, rowHeight);
66
66
  var rowBottom = getRowBottom(targetRowIndex, rowHeight);
67
67
  var clientHeight = scrollContainer.clientHeight;
68
- var scrollHeight = scrollContainer.scrollHeight;
68
+ var scrollHeight = (_e = verticalScrollState === null || verticalScrollState === void 0 ? void 0 : verticalScrollState.scrollHeight) !== null && _e !== void 0 ? _e : scrollContainer.scrollHeight;
69
69
  var maxScrollTop = Math.max(0, scrollHeight - clientHeight);
70
70
  if (clientHeight > 0) {
71
- var topInset = clamp((_d = viewportInsets === null || viewportInsets === void 0 ? void 0 : viewportInsets.top) !== null && _d !== void 0 ? _d : 0, 0, clientHeight);
72
- var bottomInset = clamp((_e = viewportInsets === null || viewportInsets === void 0 ? void 0 : viewportInsets.bottom) !== null && _e !== void 0 ? _e : 0, 0, Math.max(clientHeight - topInset, 0));
71
+ var topInset = clamp((_f = viewportInsets === null || viewportInsets === void 0 ? void 0 : viewportInsets.top) !== null && _f !== void 0 ? _f : 0, 0, clientHeight);
72
+ var bottomInset = clamp((_g = viewportInsets === null || viewportInsets === void 0 ? void 0 : viewportInsets.bottom) !== null && _g !== void 0 ? _g : 0, 0, Math.max(clientHeight - topInset, 0));
73
73
  var viewportTop = currentScrollTop + topInset;
74
74
  var viewportBottom = currentScrollTop + clientHeight - bottomInset;
75
75
  if (rowTop < viewportTop) {
@@ -90,8 +90,8 @@ function ensureCellVisible(_a) {
90
90
  var scrollWidth = scrollContainer.scrollWidth;
91
91
  var maxScrollLeft = Math.max(0, scrollWidth - clientWidth);
92
92
  if (clientWidth > 0) {
93
- var leftInset = clamp((_f = viewportInsets === null || viewportInsets === void 0 ? void 0 : viewportInsets.left) !== null && _f !== void 0 ? _f : 0, 0, clientWidth);
94
- var rightInset = clamp((_g = viewportInsets === null || viewportInsets === void 0 ? void 0 : viewportInsets.right) !== null && _g !== void 0 ? _g : 0, 0, Math.max(clientWidth - leftInset, 0));
93
+ var leftInset = clamp((_h = viewportInsets === null || viewportInsets === void 0 ? void 0 : viewportInsets.left) !== null && _h !== void 0 ? _h : 0, 0, clientWidth);
94
+ var rightInset = clamp((_j = viewportInsets === null || viewportInsets === void 0 ? void 0 : viewportInsets.right) !== null && _j !== void 0 ? _j : 0, 0, Math.max(clientWidth - leftInset, 0));
95
95
  var viewportLeft = currentScrollLeft + leftInset;
96
96
  var viewportRight = currentScrollLeft + clientWidth - rightInset;
97
97
  var visibleWidth = Math.max(clientWidth - leftInset - rightInset, 0);
@@ -108,7 +108,7 @@ function ensureCellVisible(_a) {
108
108
  var didScrollLeft = nextScrollLeft !== currentScrollLeft;
109
109
  var didScroll = didScrollTop || didScrollLeft;
110
110
  if (scrollContainer) {
111
- if (didScrollTop) {
111
+ if (didScrollTop && !verticalScrollState) {
112
112
  scrollContainer.scrollTop = nextScrollTop;
113
113
  }
114
114
  if (didScrollLeft) {
@@ -31,6 +31,7 @@ __exportStar(require("./scrollbar"), exports);
31
31
  __exportStar(require("./number"), exports);
32
32
  __exportStar(require("./buildHeaderMatrix"), exports);
33
33
  __exportStar(require("./getVisibleScrollableRowRange"), exports);
34
+ __exportStar(require("./virtualScrollWindow"), exports);
34
35
  __exportStar(require("./cellEditState"), exports);
35
36
  __exportStar(require("./getCellSelectionAxisState"), exports);
36
37
  __exportStar(require("./mergedCells"), exports);
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BGRID_MAX_PHYSICAL_SCROLL_HEIGHT = void 0;
4
+ exports.getVirtualScrollWindowMetrics = getVirtualScrollWindowMetrics;
5
+ exports.getLogicalScrollTop = getLogicalScrollTop;
6
+ exports.getVirtualScrollWindowPosition = getVirtualScrollWindowPosition;
7
+ exports.rebaseVirtualScrollWindow = rebaseVirtualScrollWindow;
8
+ exports.BGRID_MAX_PHYSICAL_SCROLL_HEIGHT = 1000000;
9
+ function getVirtualScrollWindowMetrics(_a) {
10
+ var logicalContentHeight = _a.logicalContentHeight, viewportHeight = _a.viewportHeight, enabled = _a.enabled, _b = _a.maxPhysicalHeight, maxPhysicalHeight = _b === void 0 ? exports.BGRID_MAX_PHYSICAL_SCROLL_HEIGHT : _b;
11
+ var safeViewportHeight = Math.max(viewportHeight, 0);
12
+ var safeLogicalContentHeight = Math.max(logicalContentHeight, safeViewportHeight);
13
+ var safeMaxPhysicalHeight = Math.max(maxPhysicalHeight, safeViewportHeight);
14
+ var windowingEnabled = enabled && safeLogicalContentHeight > safeMaxPhysicalHeight;
15
+ var physicalContentHeight = windowingEnabled ? safeMaxPhysicalHeight : safeLogicalContentHeight;
16
+ return {
17
+ enabled: windowingEnabled,
18
+ logicalContentHeight: safeLogicalContentHeight,
19
+ physicalContentHeight: physicalContentHeight,
20
+ logicalMaxScroll: Math.max(safeLogicalContentHeight - safeViewportHeight, 0),
21
+ physicalMaxScroll: Math.max(physicalContentHeight - safeViewportHeight, 0),
22
+ };
23
+ }
24
+ function getLogicalScrollTop(base, physicalScrollTop, metrics) {
25
+ return clamp(base + physicalScrollTop, 0, metrics.logicalMaxScroll);
26
+ }
27
+ function getVirtualScrollWindowPosition(logicalScrollTop, metrics) {
28
+ var logicalTop = clamp(logicalScrollTop, 0, metrics.logicalMaxScroll);
29
+ if (!metrics.enabled) {
30
+ return {
31
+ base: 0,
32
+ physicalScrollTop: logicalTop,
33
+ logicalScrollTop: logicalTop,
34
+ };
35
+ }
36
+ var preferredPhysicalTop = metrics.physicalMaxScroll / 2;
37
+ var maxBase = Math.max(metrics.logicalMaxScroll - metrics.physicalMaxScroll, 0);
38
+ var base = clamp(logicalTop - preferredPhysicalTop, 0, maxBase);
39
+ return {
40
+ base: base,
41
+ physicalScrollTop: logicalTop - base,
42
+ logicalScrollTop: logicalTop,
43
+ };
44
+ }
45
+ function rebaseVirtualScrollWindow(base, physicalScrollTop, metrics) {
46
+ var logicalScrollTop = getLogicalScrollTop(base, physicalScrollTop, metrics);
47
+ if (!metrics.enabled || metrics.physicalMaxScroll <= 0) {
48
+ return getVirtualScrollWindowPosition(logicalScrollTop, metrics);
49
+ }
50
+ var lowerGuard = metrics.physicalMaxScroll * 0.25;
51
+ var upperGuard = metrics.physicalMaxScroll * 0.75;
52
+ var maxBase = Math.max(metrics.logicalMaxScroll - metrics.physicalMaxScroll, 0);
53
+ var canMoveBackward = base > 0;
54
+ var canMoveForward = base < maxBase;
55
+ if ((physicalScrollTop < lowerGuard && canMoveBackward) ||
56
+ (physicalScrollTop > upperGuard && canMoveForward)) {
57
+ return getVirtualScrollWindowPosition(logicalScrollTop, metrics);
58
+ }
59
+ return {
60
+ base: base,
61
+ physicalScrollTop: clamp(physicalScrollTop, 0, metrics.physicalMaxScroll),
62
+ logicalScrollTop: logicalScrollTop,
63
+ };
64
+ }
65
+ function clamp(value, min, max) {
66
+ return Math.min(Math.max(value, min), max);
67
+ }
package/esm/BGrid.js CHANGED
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import Table from './components/Table';
3
3
  import { createPivotData, buildHeaderMatrix, findDuplicateColumnIds, getCellValueByRowKey, getColumnId, getColumnKeyToken, getFrozenColumnsWidth, processDataQuery, resolveStatusOptions, resolvePaginationViewOptions, resolveScrollbarOptions, shouldRenderBottomBar, } from './utils';
4
4
  import { AppStoreProvider } from './store';
5
- export function BGrid({ width, height, headerHeight = 30, footerHeight, summaryHeight = 30, itemHeight = 15, itemPadding = 7, columns, columnsGroup, columnGroups, onChangeColumns, frozenColumnIndex = 0, frozenRowCount = 0, data = [], page, scrollbar, status, pagination, bottomBarHeight, scrollTop = 0, scrollLeft = 0, className, style, rowChecked, sort, onClick, loading = false, spinning, rowKey, selectedRowKey, editable, onChangeData, showLineNumber, msg, getRowClassName, editTrigger = 'dblclick', cellMergeOptions, cellSelectionOptions, cellNavigationOptions, variant, summary, columnSortable, reorder, pivot, dataControl, icons, searchOptions, contextMenuOptions, }) {
5
+ export function BGrid({ ref, width, height, headerHeight = 30, footerHeight, summaryHeight = 30, itemHeight = 15, itemPadding = 7, columns, columnsGroup, columnGroups, onChangeColumns, frozenColumnIndex = 0, frozenRowCount = 0, data = [], page, scrollbar, status, pagination, bottomBarHeight, scrollTop = 0, scrollLeft = 0, className, style, rowChecked, sort, onClick, loading = false, spinning, rowKey, selectedRowKey, editable, onChangeData, showLineNumber, msg, getRowClassName, editTrigger = 'dblclick', cellMergeOptions, cellSelectionOptions, cellNavigationOptions, variant, summary, columnSortable, reorder, pivot, dataControl, icons, searchOptions, contextMenuOptions, }) {
6
6
  const warnedSearchControlledRef = React.useRef({ open: false, query: false, pivotContextMenu: false });
7
7
  const pivotData = React.useMemo(() => {
8
8
  return createPivotData({
@@ -410,7 +410,7 @@ export function BGrid({ width, height, headerHeight = 30, footerHeight, summaryH
410
410
  initialShowBottomBar,
411
411
  ]);
412
412
  return (React.createElement(AppStoreProvider, { initialState: initialStoreState },
413
- React.createElement(Table, { columns: computedColumns,
413
+ React.createElement(Table, { ref: ref, columns: computedColumns,
414
414
  columnsGroup: resolvedColumnsGroup,
415
415
  columnGroups: resolvedColumnGroups,
416
416
  onChangeColumns: resolvedOnChangeColumns,