beautiful-grid 1.0.13 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +121 -6
  2. package/cjs/BGrid.js +388 -44
  3. package/cjs/components/CellNavigationDomSync.js +8 -0
  4. package/cjs/components/CellTextEditorGateway.js +13 -9
  5. package/cjs/components/ColResizer.js +13 -7
  6. package/cjs/components/MasterDetailCell.js +145 -0
  7. package/cjs/components/MasterDetailContext.js +42 -0
  8. package/cjs/components/Table.js +162 -52
  9. package/cjs/components/TableBody.js +7 -3
  10. package/cjs/components/TableBodyCell.js +2 -1
  11. package/cjs/components/TableSummary.js +25 -34
  12. package/cjs/components/TableSummaryFronzen.js +36 -34
  13. package/cjs/store/createAppStore.js +2 -0
  14. package/cjs/utils/cellSelectionGeometry.js +32 -6
  15. package/cjs/utils/columnVisibility.js +17 -14
  16. package/cjs/utils/index.js +1 -0
  17. package/cjs/utils/rowHeightMetrics.js +47 -6
  18. package/cjs/utils/summary.js +55 -0
  19. package/cjs/utils/useRowReorderController.js +5 -1
  20. package/esm/BGrid.js +387 -72
  21. package/esm/components/CellNavigationDomSync.js +8 -0
  22. package/esm/components/CellTextEditorGateway.js +12 -9
  23. package/esm/components/ColResizer.js +8 -2
  24. package/esm/components/MasterDetailCell.js +101 -0
  25. package/esm/components/MasterDetailContext.js +5 -0
  26. package/esm/components/Table.js +151 -42
  27. package/esm/components/TableBody.js +6 -2
  28. package/esm/components/TableBodyCell.js +2 -1
  29. package/esm/components/TableSummary.js +26 -29
  30. package/esm/components/TableSummaryFronzen.js +26 -29
  31. package/esm/store/createAppStore.js +2 -0
  32. package/esm/utils/cellSelectionGeometry.js +31 -5
  33. package/esm/utils/columnVisibility.js +21 -18
  34. package/esm/utils/index.js +1 -0
  35. package/esm/utils/rowHeightMetrics.js +46 -6
  36. package/esm/utils/summary.js +35 -0
  37. package/esm/utils/useRowReorderController.js +5 -1
  38. package/package.json +1 -1
  39. package/style.css +164 -14
  40. package/types/BGrid.d.ts +1 -1
  41. package/types/components/MasterDetailCell.d.ts +21 -0
  42. package/types/components/MasterDetailContext.d.ts +20 -0
  43. package/types/components/Table.d.ts +1 -0
  44. package/types/components/TableBody.d.ts +2 -1
  45. package/types/store/createAppStore.d.ts +1 -1
  46. package/types/types.d.ts +70 -4
  47. package/types/utils/cellSelectionGeometry.d.ts +3 -1
  48. package/types/utils/index.d.ts +1 -0
  49. package/types/utils/rowHeightMetrics.d.ts +15 -1
  50. package/types/utils/summary.d.ts +13 -0
package/cjs/BGrid.js CHANGED
@@ -68,6 +68,17 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
68
68
  }
69
69
  return to.concat(ar || Array.prototype.slice.call(from));
70
70
  };
71
+ var __values = (this && this.__values) || function(o) {
72
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
73
+ if (m) return m.call(o);
74
+ if (o && typeof o.length === "number") return {
75
+ next: function () {
76
+ if (o && i >= o.length) o = void 0;
77
+ return { value: o && o[i++], done: !o };
78
+ }
79
+ };
80
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
81
+ };
71
82
  var __importDefault = (this && this.__importDefault) || function (mod) {
72
83
  return (mod && mod.__esModule) ? mod : { "default": mod };
73
84
  };
@@ -78,6 +89,7 @@ var Table_1 = __importDefault(require("./components/Table"));
78
89
  var utils_1 = require("./utils");
79
90
  var store_1 = require("./store");
80
91
  var TreeContext_1 = require("./components/TreeContext");
92
+ var MasterDetailContext_1 = require("./components/MasterDetailContext");
81
93
  function computeModelColumns(columns, frozenColumnIndex, duplicateToolboxColumnIds) {
82
94
  var left = 0;
83
95
  var previousWidth = 0;
@@ -91,14 +103,22 @@ function computeModelColumns(columns, frozenColumnIndex, duplicateToolboxColumnI
91
103
  return __assign(__assign({}, column), { columnId: columnId, keyToken: (0, utils_1.getColumnKeyToken)(column.key), toolbox: duplicateToolboxColumnIds.has(columnId) ? false : column.toolbox, left: columnIndex < frozenColumnIndex ? -1 : left, width: (_b = column.width) !== null && _b !== void 0 ? _b : 100 });
92
104
  });
93
105
  }
106
+ function encodeMasterDetailRowKey(rowKey) {
107
+ var codePoints = Array.from(String(rowKey), function (character) { return character.codePointAt(0).toString(16); });
108
+ return "".concat(typeof rowKey, "-").concat(codePoints.join('-'));
109
+ }
94
110
  function BGrid(_a) {
95
- var _b, _c, _d, _e;
96
- var ref = _a.ref, width = _a.width, height = _a.height, _f = _a.headerHeight, headerHeight = _f === void 0 ? 30 : _f, footerHeight = _a.footerHeight, _g = _a.summaryHeight, summaryHeight = _g === void 0 ? 30 : _g, _h = _a.itemHeight, itemHeight = _h === void 0 ? 15 : _h, _j = _a.itemPadding, itemPadding = _j === void 0 ? 7 : _j, getRowHeight = _a.getRowHeight, columns = _a.columns, columnsGroup = _a.columnsGroup, columnGroups = _a.columnGroups, onChangeColumns = _a.onChangeColumns, _k = _a.frozenColumnIndex, frozenColumnIndex = _k === void 0 ? 0 : _k, _l = _a.frozenRowCount, frozenRowCount = _l === void 0 ? 0 : _l, _m = _a.data, data = _m === void 0 ? [] : _m, page = _a.page, scrollbar = _a.scrollbar, status = _a.status, pagination = _a.pagination, bottomBarHeight = _a.bottomBarHeight, _o = _a.scrollTop, scrollTop = _o === void 0 ? 0 : _o, _p = _a.scrollLeft, scrollLeft = _p === void 0 ? 0 : _p, className = _a.className, style = _a.style, rowChecked = _a.rowChecked, sort = _a.sort, onClick = _a.onClick, _q = _a.loading, loading = _q === void 0 ? false : _q, spinning = _a.spinning, disabled = _a.disabled, rowKey = _a.rowKey, selectedRowKey = _a.selectedRowKey, editable = _a.editable, onChangeData = _a.onChangeData, showLineNumber = _a.showLineNumber, msg = _a.msg, getRowClassName = _a.getRowClassName, _r = _a.editTrigger, editTrigger = _r === void 0 ? 'dblclick' : _r, cellMergeOptions = _a.cellMergeOptions, cellSelectionOptions = _a.cellSelectionOptions, cellNavigationOptions = _a.cellNavigationOptions, variant = _a.variant, summary = _a.summary, columnSortable = _a.columnSortable, reorder = _a.reorder, pivot = _a.pivot, dataControl = _a.dataControl, icons = _a.icons, columnVisibility = _a.columnVisibility, searchOptions = _a.searchOptions, contextMenuOptions = _a.contextMenuOptions, tree = _a.tree;
97
- var _s = __read(React.useState(function () {
111
+ var _b, _c, _d, _e, _f;
112
+ var ref = _a.ref, width = _a.width, height = _a.height, _g = _a.headerHeight, headerHeight = _g === void 0 ? 30 : _g, footerHeight = _a.footerHeight, explicitSummaryHeight = _a.summaryHeight, _h = _a.summaryRowHeight, summaryRowHeight = _h === void 0 ? utils_1.DEFAULT_SUMMARY_ROW_HEIGHT : _h, _j = _a.itemHeight, itemHeight = _j === void 0 ? 15 : _j, _k = _a.itemPadding, itemPadding = _k === void 0 ? 7 : _k, getRowHeight = _a.getRowHeight, columns = _a.columns, columnsGroup = _a.columnsGroup, columnGroups = _a.columnGroups, onChangeColumns = _a.onChangeColumns, _l = _a.frozenColumnIndex, frozenColumnIndex = _l === void 0 ? 0 : _l, _m = _a.frozenRowCount, frozenRowCount = _m === void 0 ? 0 : _m, _o = _a.data, data = _o === void 0 ? [] : _o, page = _a.page, scrollbar = _a.scrollbar, status = _a.status, pagination = _a.pagination, bottomBarHeight = _a.bottomBarHeight, _p = _a.scrollTop, scrollTop = _p === void 0 ? 0 : _p, _q = _a.scrollLeft, scrollLeft = _q === void 0 ? 0 : _q, className = _a.className, style = _a.style, rowChecked = _a.rowChecked, sort = _a.sort, onClick = _a.onClick, _r = _a.loading, loading = _r === void 0 ? false : _r, spinning = _a.spinning, disabled = _a.disabled, rowKey = _a.rowKey, selectedRowKey = _a.selectedRowKey, editable = _a.editable, onChangeData = _a.onChangeData, showLineNumber = _a.showLineNumber, msg = _a.msg, getRowClassName = _a.getRowClassName, _s = _a.editTrigger, editTrigger = _s === void 0 ? 'dblclick' : _s, cellMergeOptions = _a.cellMergeOptions, cellSelectionOptions = _a.cellSelectionOptions, cellNavigationOptions = _a.cellNavigationOptions, variant = _a.variant, summary = _a.summary, columnSortable = _a.columnSortable, reorder = _a.reorder, pivot = _a.pivot, dataControl = _a.dataControl, icons = _a.icons, columnVisibility = _a.columnVisibility, searchOptions = _a.searchOptions, contextMenuOptions = _a.contextMenuOptions, tree = _a.tree, masterDetail = _a.masterDetail;
113
+ var _t = __read(React.useState(function () {
98
114
  var _a;
99
115
  return __spreadArray([], __read(((_a = tree === null || tree === void 0 ? void 0 : tree.defaultExpandedRowKeys) !== null && _a !== void 0 ? _a : [])), false);
100
- }), 2), uncontrolledExpandedRowKeys = _s[0], setUncontrolledExpandedRowKeys = _s[1];
116
+ }), 2), uncontrolledExpandedRowKeys = _t[0], setUncontrolledExpandedRowKeys = _t[1];
101
117
  var expandedRowKeys = (_b = tree === null || tree === void 0 ? void 0 : tree.expandedRowKeys) !== null && _b !== void 0 ? _b : uncontrolledExpandedRowKeys;
118
+ var _u = __read(React.useState(function () { var _a; return (_a = masterDetail === null || masterDetail === void 0 ? void 0 : masterDetail.defaultExpandedRowKeys) !== null && _a !== void 0 ? _a : []; }), 2), uncontrolledMasterDetailExpandedKeys = _u[0], setUncontrolledMasterDetailExpandedKeys = _u[1];
119
+ var masterDetailExpandedKeys = (masterDetail === null || masterDetail === void 0 ? void 0 : masterDetail.expandedRowKeys) !== undefined
120
+ ? masterDetail.expandedRowKeys
121
+ : uncontrolledMasterDetailExpandedKeys;
102
122
  var warnedSearchControlledRef = React.useRef({
103
123
  open: false,
104
124
  query: false,
@@ -115,7 +135,7 @@ function BGrid(_a) {
115
135
  var resolvedColumns = ((_c = pivotData === null || pivotData === void 0 ? void 0 : pivotData.columns) !== null && _c !== void 0 ? _c : columns);
116
136
  var visibilityOptions = typeof columnVisibility === 'object' ? columnVisibility : undefined;
117
137
  var visibilityEnabled = columnVisibility === true || (visibilityOptions !== undefined && visibilityOptions.enabled !== false);
118
- var _t = __read(React.useState(function () { var _a; return Array.from(new Set((_a = visibilityOptions === null || visibilityOptions === void 0 ? void 0 : visibilityOptions.defaultHiddenColumnIds) !== null && _a !== void 0 ? _a : [])); }), 2), uncontrolledHiddenColumnIds = _t[0], setUncontrolledHiddenColumnIds = _t[1];
138
+ var _v = __read(React.useState(function () { var _a; return Array.from(new Set((_a = visibilityOptions === null || visibilityOptions === void 0 ? void 0 : visibilityOptions.defaultHiddenColumnIds) !== null && _a !== void 0 ? _a : [])); }), 2), uncontrolledHiddenColumnIds = _v[0], setUncontrolledHiddenColumnIds = _v[1];
119
139
  var hiddenColumnIds = React.useMemo(function () {
120
140
  var _a;
121
141
  if (!visibilityEnabled)
@@ -167,7 +187,13 @@ function BGrid(_a) {
167
187
  var resolvedGetRowClassName = pivotEnabled ? undefined : getRowClassName;
168
188
  var requestedTreeEnabled = !!tree && tree.enabled !== false;
169
189
  var treeEnabled = requestedTreeEnabled && !pivotEnabled && resolvedRowKey !== undefined;
170
- var resolvedCellMergeOptions = treeEnabled ? undefined : visibilityProjection.cellMergeOptions;
190
+ var requestedMasterDetailEnabled = !!masterDetail && masterDetail.enabled !== false;
191
+ var masterDetailEnabled = requestedMasterDetailEnabled &&
192
+ !pivotEnabled &&
193
+ !treeEnabled &&
194
+ resolvedRowKey !== undefined &&
195
+ frozenRowCount <= 0;
196
+ var resolvedCellMergeOptions = treeEnabled || masterDetailEnabled ? undefined : visibilityProjection.cellMergeOptions;
171
197
  var resolvedCellSelectionOptions = resolvedDisabled
172
198
  ? __assign(__assign({}, cellSelectionOptions), { enabled: false }) : cellSelectionOptions;
173
199
  var resolvedSummary = visibilityProjection.summary;
@@ -179,11 +205,11 @@ function BGrid(_a) {
179
205
  var hasActiveClientQuery = (resolvedDataControl === null || resolvedDataControl === void 0 ? void 0 : resolvedDataControl.mode) === 'client' &&
180
206
  (resolvedDataControl.query.sortParams.length > 0 || resolvedDataControl.query.filterParams.length > 0);
181
207
  var resolvedReorder = React.useMemo(function () {
182
- return pivotEnabled || resolvedDisabled || treeEnabled
208
+ return pivotEnabled || resolvedDisabled || treeEnabled || masterDetailEnabled
183
209
  ? undefined
184
210
  : (hasActiveClientQuery || frozenRowCount > 0) && reorder
185
211
  ? __assign(__assign({}, reorder), { enabled: false }) : reorder;
186
- }, [frozenRowCount, hasActiveClientQuery, pivotEnabled, reorder, resolvedDisabled, treeEnabled]);
212
+ }, [frozenRowCount, hasActiveClientQuery, masterDetailEnabled, pivotEnabled, reorder, resolvedDisabled, treeEnabled]);
187
213
  // Development warnings
188
214
  React.useEffect(function () {
189
215
  var _a, _b;
@@ -225,6 +251,24 @@ function BGrid(_a) {
225
251
  if (treeEnabled && (reorder === null || reorder === void 0 ? void 0 : reorder.enabled)) {
226
252
  console.warn('[BGrid] Row reordering is disabled while tree mode is active.');
227
253
  }
254
+ if (requestedMasterDetailEnabled && rowKey === undefined) {
255
+ console.warn('[BGrid] masterDetail requires rowKey. Falling back to flat rows.');
256
+ }
257
+ if (pivotEnabled && requestedMasterDetailEnabled) {
258
+ console.warn('[BGrid] masterDetail is disabled while pivot mode is active.');
259
+ }
260
+ if (treeEnabled && requestedMasterDetailEnabled) {
261
+ console.warn('[BGrid] masterDetail is disabled while tree mode is active.');
262
+ }
263
+ if (masterDetailEnabled && cellMergeOptions) {
264
+ console.warn('[BGrid] cellMergeOptions is disabled while masterDetail mode is active.');
265
+ }
266
+ if (masterDetailEnabled && (reorder === null || reorder === void 0 ? void 0 : reorder.enabled)) {
267
+ console.warn('[BGrid] Row reordering is disabled while masterDetail mode is active.');
268
+ }
269
+ if (requestedMasterDetailEnabled && frozenRowCount > 0) {
270
+ console.warn('[BGrid] masterDetail is disabled when frozenRowCount > 0.');
271
+ }
228
272
  if (hasHiddenColumns && columnSortable) {
229
273
  console.warn('[BGrid] Column reordering is disabled while columns are hidden.');
230
274
  }
@@ -262,6 +306,8 @@ function BGrid(_a) {
262
306
  visibilityOptions === null || visibilityOptions === void 0 ? void 0 : visibilityOptions.hiddenColumnIds,
263
307
  visibilityOptions === null || visibilityOptions === void 0 ? void 0 : visibilityOptions.onChange,
264
308
  cellMergeOptions,
309
+ masterDetailEnabled,
310
+ requestedMasterDetailEnabled,
265
311
  requestedTreeEnabled,
266
312
  rowKey,
267
313
  treeEnabled,
@@ -329,12 +375,33 @@ function BGrid(_a) {
329
375
  ? requestedId
330
376
  : (0, utils_1.getColumnId)(visibilityProjection.columns[0]);
331
377
  }, [tree === null || tree === void 0 ? void 0 : tree.treeColumnId, treeEnabled, visibilityProjection.columns]);
378
+ var resolvedExpandColumnId = React.useMemo(function () {
379
+ if (!masterDetailEnabled || visibilityProjection.columns.length === 0)
380
+ return undefined;
381
+ var requestedId = masterDetail === null || masterDetail === void 0 ? void 0 : masterDetail.expandColumnId;
382
+ return requestedId &&
383
+ visibilityProjection.columns.some(function (column) { return (0, utils_1.getColumnId)(column) === requestedId; })
384
+ ? requestedId
385
+ : (0, utils_1.getColumnId)(visibilityProjection.columns[0]);
386
+ }, [masterDetail === null || masterDetail === void 0 ? void 0 : masterDetail.expandColumnId, masterDetailEnabled, visibilityProjection.columns]);
332
387
  var computedColumns = React.useMemo(function () {
333
388
  var columns = computeModelColumns(visibilityProjection.columns, resolvedFrozenColumnIndex, duplicateToolboxColumnIds);
334
- if (!resolvedTreeColumnId)
335
- return columns;
336
- return columns.map(function (column) { return (column.columnId === resolvedTreeColumnId ? __assign(__assign({}, column), { treeCell: true }) : column); });
337
- }, [duplicateToolboxColumnIds, resolvedFrozenColumnIndex, resolvedTreeColumnId, visibilityProjection.columns]);
389
+ if (resolvedTreeColumnId) {
390
+ columns = columns.map(function (column) { return (column.columnId === resolvedTreeColumnId ? __assign(__assign({}, column), { treeCell: true }) : column); });
391
+ }
392
+ if (resolvedExpandColumnId) {
393
+ columns = columns.map(function (column) {
394
+ return column.columnId === resolvedExpandColumnId ? __assign(__assign({}, column), { masterDetailCell: true }) : column;
395
+ });
396
+ }
397
+ return columns;
398
+ }, [
399
+ duplicateToolboxColumnIds,
400
+ resolvedExpandColumnId,
401
+ resolvedFrozenColumnIndex,
402
+ resolvedTreeColumnId,
403
+ visibilityProjection.columns,
404
+ ]);
338
405
  var warnedTreeColumnIdRef = React.useRef(undefined);
339
406
  React.useEffect(function () {
340
407
  if (process.env.NODE_ENV === 'production' ||
@@ -347,6 +414,18 @@ function BGrid(_a) {
347
414
  warnedTreeColumnIdRef.current = tree.treeColumnId;
348
415
  console.warn("[BGrid] tree.treeColumnId \"".concat(tree.treeColumnId, "\" is not visible. Falling back to the first visible column."));
349
416
  }, [resolvedTreeColumnId, tree === null || tree === void 0 ? void 0 : tree.treeColumnId, treeEnabled]);
417
+ var warnedExpandColumnIdRef = React.useRef(undefined);
418
+ React.useEffect(function () {
419
+ if (process.env.NODE_ENV === 'production' ||
420
+ !masterDetailEnabled ||
421
+ !(masterDetail === null || masterDetail === void 0 ? void 0 : masterDetail.expandColumnId) ||
422
+ masterDetail.expandColumnId === resolvedExpandColumnId ||
423
+ warnedExpandColumnIdRef.current === masterDetail.expandColumnId) {
424
+ return;
425
+ }
426
+ warnedExpandColumnIdRef.current = masterDetail.expandColumnId;
427
+ console.warn("[BGrid] masterDetail.expandColumnId \"".concat(masterDetail.expandColumnId, "\" is not visible. Falling back to the first visible column."));
428
+ }, [masterDetail === null || masterDetail === void 0 ? void 0 : masterDetail.expandColumnId, masterDetailEnabled, resolvedExpandColumnId]);
350
429
  var queryColumns = React.useMemo(function () { return computeModelColumns(resolvedColumns, pivotEnabled ? 0 : frozenColumnIndex, duplicateToolboxColumnIds); }, [duplicateToolboxColumnIds, frozenColumnIndex, pivotEnabled, resolvedColumns]);
351
430
  var projectedOnChangeColumns = React.useCallback(function (visibleColumnIndex, info) {
352
431
  var _a;
@@ -546,7 +625,261 @@ function BGrid(_a) {
546
625
  toggle: toggleTreeRow,
547
626
  };
548
627
  }, [resolvedDisabled, resolvedRowKey, resolvedTreeColumnId, resolvedTreeProjection, toggleTreeRow, tree]);
549
- var rowHeightMetrics = React.useMemo(function () { return (0, utils_1.createRowHeightMetrics)(displayData, itemHeight + itemPadding * 2, getRowHeight); }, [displayData, getRowHeight, itemHeight, itemPadding]);
628
+ var rawGridId = React.useId();
629
+ var gridInstanceId = React.useMemo(function () { return rawGridId.replace(/[^a-zA-Z0-9_-]/g, '_'); }, [rawGridId]);
630
+ var masterDetailRowKeysMeta = React.useMemo(function () {
631
+ if (!masterDetailEnabled || resolvedRowKey === undefined)
632
+ return undefined;
633
+ var validKeys = new Set();
634
+ var rowsByKey = new Map();
635
+ var duplicateKeys = new Set();
636
+ var missingKeyIndexes = [];
637
+ for (var i = 0; i < resolvedData.length; i++) {
638
+ var key = (0, utils_1.getCellValueByRowKey)(resolvedRowKey, resolvedData[i].values);
639
+ if (key === undefined || key === null) {
640
+ missingKeyIndexes.push(i);
641
+ }
642
+ else {
643
+ var k = key;
644
+ if (validKeys.has(k)) {
645
+ duplicateKeys.add(k);
646
+ }
647
+ else {
648
+ validKeys.add(k);
649
+ rowsByKey.set(k, { item: resolvedData[i], sourceIndex: i });
650
+ }
651
+ }
652
+ }
653
+ return { validKeys: validKeys, rowsByKey: rowsByKey, duplicateKeys: duplicateKeys, missingKeyIndexes: missingKeyIndexes };
654
+ }, [masterDetailEnabled, resolvedData, resolvedRowKey]);
655
+ React.useEffect(function () {
656
+ if (process.env.NODE_ENV === 'production' || !masterDetailRowKeysMeta)
657
+ return;
658
+ if (masterDetailRowKeysMeta.missingKeyIndexes.length > 0) {
659
+ console.warn("[BGrid] masterDetail found ".concat(masterDetailRowKeysMeta.missingKeyIndexes.length, " rows with missing or null rowKey at indexes: [").concat(masterDetailRowKeysMeta.missingKeyIndexes.slice(0, 5).join(', ')).concat(masterDetailRowKeysMeta.missingKeyIndexes.length > 5 ? ', ...' : '', "]. These rows cannot be expanded."));
660
+ }
661
+ if (masterDetailRowKeysMeta.duplicateKeys.size > 0) {
662
+ console.warn("[BGrid] masterDetail found duplicate rowKey values: [".concat(Array.from(masterDetailRowKeysMeta.duplicateKeys).slice(0, 5).join(', '), "]. These rows cannot be expanded."));
663
+ }
664
+ }, [masterDetailRowKeysMeta]);
665
+ var expandMode = (_e = masterDetail === null || masterDetail === void 0 ? void 0 : masterDetail.expandMode) !== null && _e !== void 0 ? _e : 'multiple';
666
+ var masterDetailHasDetail = masterDetail === null || masterDetail === void 0 ? void 0 : masterDetail.hasDetail;
667
+ var effectiveMasterDetailExpandedKeysSet = React.useMemo(function () {
668
+ var e_1, _a;
669
+ if (!masterDetailEnabled || !masterDetailRowKeysMeta)
670
+ return new Set();
671
+ var set = new Set();
672
+ try {
673
+ for (var masterDetailExpandedKeys_1 = __values(masterDetailExpandedKeys), masterDetailExpandedKeys_1_1 = masterDetailExpandedKeys_1.next(); !masterDetailExpandedKeys_1_1.done; masterDetailExpandedKeys_1_1 = masterDetailExpandedKeys_1.next()) {
674
+ var key = masterDetailExpandedKeys_1_1.value;
675
+ if (masterDetailRowKeysMeta.duplicateKeys.has(key))
676
+ continue;
677
+ var row = masterDetailRowKeysMeta.rowsByKey.get(key);
678
+ if (!row)
679
+ continue;
680
+ if (masterDetailHasDetail) {
681
+ try {
682
+ if (!masterDetailHasDetail(row.item, row.sourceIndex))
683
+ continue;
684
+ }
685
+ catch (_b) {
686
+ continue;
687
+ }
688
+ }
689
+ set.add(key);
690
+ if (expandMode === 'single')
691
+ break;
692
+ }
693
+ }
694
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
695
+ finally {
696
+ try {
697
+ if (masterDetailExpandedKeys_1_1 && !masterDetailExpandedKeys_1_1.done && (_a = masterDetailExpandedKeys_1.return)) _a.call(masterDetailExpandedKeys_1);
698
+ }
699
+ finally { if (e_1) throw e_1.error; }
700
+ }
701
+ return set;
702
+ }, [expandMode, masterDetailHasDetail, masterDetailEnabled, masterDetailExpandedKeys, masterDetailRowKeysMeta]);
703
+ var toggleMasterDetailRow = React.useCallback(function (rowKey, item, sourceIndex) {
704
+ var _a;
705
+ if (resolvedDisabled || !masterDetailEnabled || !masterDetail)
706
+ return;
707
+ var isExpanded = effectiveMasterDetailExpandedKeysSet.has(rowKey);
708
+ var nextKeys;
709
+ if (expandMode === 'single') {
710
+ nextKeys = isExpanded ? [] : [rowKey];
711
+ }
712
+ else {
713
+ if (isExpanded) {
714
+ nextKeys = masterDetailExpandedKeys.filter(function (k) { return !Object.is(k, rowKey); });
715
+ }
716
+ else {
717
+ var exists = masterDetailExpandedKeys.some(function (k) { return Object.is(k, rowKey); });
718
+ nextKeys = exists ? __spreadArray([], __read(masterDetailExpandedKeys), false) : __spreadArray(__spreadArray([], __read(masterDetailExpandedKeys), false), [rowKey], false);
719
+ }
720
+ }
721
+ if (masterDetail.expandedRowKeys === undefined) {
722
+ setUncontrolledMasterDetailExpandedKeys(nextKeys);
723
+ }
724
+ (_a = masterDetail.onExpandedRowKeysChange) === null || _a === void 0 ? void 0 : _a.call(masterDetail, nextKeys, {
725
+ rowKey: rowKey,
726
+ expanded: !isExpanded,
727
+ item: item,
728
+ sourceIndex: sourceIndex,
729
+ });
730
+ }, [
731
+ effectiveMasterDetailExpandedKeysSet,
732
+ expandMode,
733
+ masterDetail,
734
+ masterDetailEnabled,
735
+ masterDetailExpandedKeys,
736
+ resolvedDisabled,
737
+ ]);
738
+ var collapseMasterDetailRow = React.useCallback(function (rowKey) {
739
+ var _a;
740
+ if (resolvedDisabled || !masterDetailEnabled || !masterDetail)
741
+ return;
742
+ if (!effectiveMasterDetailExpandedKeysSet.has(rowKey))
743
+ return;
744
+ var nextKeys;
745
+ if (expandMode === 'single') {
746
+ nextKeys = [];
747
+ }
748
+ else {
749
+ nextKeys = masterDetailExpandedKeys.filter(function (k) { return !Object.is(k, rowKey); });
750
+ }
751
+ if (masterDetail.expandedRowKeys === undefined) {
752
+ setUncontrolledMasterDetailExpandedKeys(nextKeys);
753
+ }
754
+ var sourceIndex = resolvedData.findIndex(function (d) { return Object.is((0, utils_1.getCellValueByRowKey)(resolvedRowKey, d.values), rowKey); });
755
+ var item = resolvedData[sourceIndex];
756
+ if (item) {
757
+ (_a = masterDetail.onExpandedRowKeysChange) === null || _a === void 0 ? void 0 : _a.call(masterDetail, nextKeys, {
758
+ rowKey: rowKey,
759
+ expanded: false,
760
+ item: item,
761
+ sourceIndex: sourceIndex >= 0 ? sourceIndex : 0,
762
+ });
763
+ }
764
+ }, [
765
+ effectiveMasterDetailExpandedKeysSet,
766
+ expandMode,
767
+ masterDetail,
768
+ masterDetailEnabled,
769
+ masterDetailExpandedKeys,
770
+ resolvedData,
771
+ resolvedDisabled,
772
+ resolvedRowKey,
773
+ ]);
774
+ var getToggleElementId = React.useCallback(function (rowKey) { return "".concat(gridInstanceId, "-detail-toggle-").concat(encodeMasterDetailRowKey(rowKey)); }, [gridInstanceId]);
775
+ var getDetailElementId = React.useCallback(function (rowKey) { return "".concat(gridInstanceId, "-detail-region-").concat(encodeMasterDetailRowKey(rowKey)); }, [gridInstanceId]);
776
+ var masterDetailContextValue = React.useMemo(function () {
777
+ var _a, _b;
778
+ if (!masterDetailEnabled || !resolvedExpandColumnId || resolvedRowKey === undefined || !masterDetail) {
779
+ return undefined;
780
+ }
781
+ return {
782
+ gridId: gridInstanceId,
783
+ expandColumnId: resolvedExpandColumnId,
784
+ icons: masterDetail.icons,
785
+ expandAriaLabel: (_a = masterDetail.expandAriaLabel) !== null && _a !== void 0 ? _a : 'Expand row',
786
+ collapseAriaLabel: (_b = masterDetail.collapseAriaLabel) !== null && _b !== void 0 ? _b : 'Collapse row',
787
+ disabled: resolvedDisabled,
788
+ expandedKeysSet: effectiveMasterDetailExpandedKeysSet,
789
+ getRowKey: function (values) {
790
+ var key = (0, utils_1.getCellValueByRowKey)(resolvedRowKey, values);
791
+ return key === undefined || key === null ? undefined : key;
792
+ },
793
+ hasDetail: function (item, sourceIndex) {
794
+ var rowKey = (0, utils_1.getCellValueByRowKey)(resolvedRowKey, item.values);
795
+ if (rowKey === undefined || rowKey === null)
796
+ return false;
797
+ if (masterDetailRowKeysMeta === null || masterDetailRowKeysMeta === void 0 ? void 0 : masterDetailRowKeysMeta.duplicateKeys.has(rowKey))
798
+ return false;
799
+ if (masterDetail.hasDetail) {
800
+ try {
801
+ return masterDetail.hasDetail(item, sourceIndex);
802
+ }
803
+ catch (_a) {
804
+ return false;
805
+ }
806
+ }
807
+ return true;
808
+ },
809
+ detailRender: masterDetail.detailRender,
810
+ toggle: toggleMasterDetailRow,
811
+ collapse: collapseMasterDetailRow,
812
+ getToggleElementId: getToggleElementId,
813
+ getDetailElementId: getDetailElementId,
814
+ };
815
+ }, [
816
+ collapseMasterDetailRow,
817
+ effectiveMasterDetailExpandedKeysSet,
818
+ getDetailElementId,
819
+ getToggleElementId,
820
+ gridInstanceId,
821
+ masterDetail,
822
+ masterDetailEnabled,
823
+ masterDetailRowKeysMeta === null || masterDetailRowKeysMeta === void 0 ? void 0 : masterDetailRowKeysMeta.duplicateKeys,
824
+ resolvedDisabled,
825
+ resolvedExpandColumnId,
826
+ resolvedRowKey,
827
+ toggleMasterDetailRow,
828
+ ]);
829
+ var rowHeightMetrics = React.useMemo(function () {
830
+ var fallbackHeight = itemHeight + itemPadding * 2;
831
+ if (!masterDetailEnabled || !masterDetail) {
832
+ return (0, utils_1.createRowHeightMetrics)(displayData, fallbackHeight, getRowHeight);
833
+ }
834
+ return (0, utils_1.createRowHeightMetrics)(displayData, fallbackHeight, getRowHeight, {
835
+ expandedKeysSet: effectiveMasterDetailExpandedKeysSet,
836
+ getRowKey: function (values) {
837
+ var key = (0, utils_1.getCellValueByRowKey)(resolvedRowKey, values);
838
+ return key === undefined || key === null ? undefined : key;
839
+ },
840
+ getDetailHeight: function (item, sourceIndex) {
841
+ if (typeof masterDetail.detailRowHeight === 'function') {
842
+ try {
843
+ return masterDetail.detailRowHeight(item, sourceIndex);
844
+ }
845
+ catch (_a) {
846
+ return 200;
847
+ }
848
+ }
849
+ return typeof masterDetail.detailRowHeight === 'number' && masterDetail.detailRowHeight > 0
850
+ ? masterDetail.detailRowHeight
851
+ : 200;
852
+ },
853
+ hasDetail: function (item, sourceIndex) {
854
+ var rowKey = (0, utils_1.getCellValueByRowKey)(resolvedRowKey, item.values);
855
+ if (rowKey === undefined || rowKey === null)
856
+ return false;
857
+ if (masterDetailRowKeysMeta === null || masterDetailRowKeysMeta === void 0 ? void 0 : masterDetailRowKeysMeta.duplicateKeys.has(rowKey))
858
+ return false;
859
+ if (masterDetail.hasDetail) {
860
+ try {
861
+ return masterDetail.hasDetail(item, sourceIndex);
862
+ }
863
+ catch (_a) {
864
+ return false;
865
+ }
866
+ }
867
+ return true;
868
+ },
869
+ sourceIndexByVisibleIndex: processedResult.sourceIndexByVisibleIndex,
870
+ });
871
+ }, [
872
+ displayData,
873
+ effectiveMasterDetailExpandedKeysSet,
874
+ getRowHeight,
875
+ itemHeight,
876
+ itemPadding,
877
+ masterDetail,
878
+ masterDetailEnabled,
879
+ masterDetailRowKeysMeta === null || masterDetailRowKeysMeta === void 0 ? void 0 : masterDetailRowKeysMeta.duplicateKeys,
880
+ processedResult.sourceIndexByVisibleIndex,
881
+ resolvedRowKey,
882
+ ]);
550
883
  var resolvedFrozenRowCount = pivotEnabled
551
884
  ? 0
552
885
  : Math.min(Math.max(Math.floor(frozenRowCount), 0), displayData.length);
@@ -594,7 +927,7 @@ function BGrid(_a) {
594
927
  var resolvedStatus = React.useMemo(function () { return (0, utils_1.resolveStatusOptions)(status); }, [status]);
595
928
  var resolvedPagination = React.useMemo(function () { return (0, utils_1.resolvePaginationViewOptions)(pagination); }, [pagination]);
596
929
  var resolvedScrollbar = React.useMemo(function () { return (0, utils_1.resolveScrollbarOptions)(scrollbar); }, [scrollbar]);
597
- var resolvedBottomBarHeight = (_e = bottomBarHeight !== null && bottomBarHeight !== void 0 ? bottomBarHeight : footerHeight) !== null && _e !== void 0 ? _e : 30;
930
+ var resolvedBottomBarHeight = (_f = bottomBarHeight !== null && bottomBarHeight !== void 0 ? bottomBarHeight : footerHeight) !== null && _f !== void 0 ? _f : 30;
598
931
  var initialShowBottomBar = React.useMemo(function () {
599
932
  return (0, utils_1.shouldRenderBottomBar)({
600
933
  hasPage: !!resolvedPage,
@@ -608,6 +941,13 @@ function BGrid(_a) {
608
941
  console.warn('[BGrid] Both bottomBarHeight and footerHeight were provided. bottomBarHeight takes precedence.');
609
942
  }
610
943
  }, [bottomBarHeight, footerHeight]);
944
+ var resolvedSummaryHeight = React.useMemo(function () {
945
+ return (0, utils_1.computeSummaryHeight)({
946
+ summary: resolvedSummary,
947
+ summaryHeight: explicitSummaryHeight,
948
+ summaryRowHeight: summaryRowHeight,
949
+ });
950
+ }, [resolvedSummary, explicitSummaryHeight, summaryRowHeight]);
611
951
  var initialStoreState = React.useMemo(function () {
612
952
  var _a, _b, _c;
613
953
  var initialWidth = width !== undefined ? Math.max(width, 100) : 0;
@@ -617,7 +957,7 @@ function BGrid(_a) {
617
957
  ? Math.max(initialHeight -
618
958
  headerHeight -
619
959
  (initialShowBottomBar ? resolvedBottomBarHeight : 0) -
620
- (resolvedSummary ? summaryHeight : 0) -
960
+ (resolvedSummary ? resolvedSummaryHeight : 0) -
621
961
  containerBorderWidth * 2, 0)
622
962
  : 0;
623
963
  var displayItemCount = contentBodyHeight > 0 ? Math.ceil(contentBodyHeight / (itemHeight + itemPadding * 2)) : 0;
@@ -638,7 +978,8 @@ function BGrid(_a) {
638
978
  scrollbar: resolvedScrollbar,
639
979
  status: resolvedStatus,
640
980
  pagination: resolvedPagination,
641
- summaryHeight: summaryHeight,
981
+ summaryHeight: resolvedSummaryHeight,
982
+ summaryRowHeight: summaryRowHeight,
642
983
  itemHeight: itemHeight,
643
984
  itemPadding: itemPadding,
644
985
  frozenColumnIndex: resolvedFrozenColumnIndex,
@@ -709,7 +1050,8 @@ function BGrid(_a) {
709
1050
  resolvedScrollbar,
710
1051
  resolvedStatus,
711
1052
  resolvedPagination,
712
- summaryHeight,
1053
+ resolvedSummaryHeight,
1054
+ summaryRowHeight,
713
1055
  itemHeight,
714
1056
  itemPadding,
715
1057
  rowHeightMetrics,
@@ -759,31 +1101,33 @@ function BGrid(_a) {
759
1101
  ]);
760
1102
  return (React.createElement(store_1.AppStoreProvider, { initialState: initialStoreState },
761
1103
  React.createElement(TreeContext_1.TreeContext.Provider, { value: treeContextValue },
762
- React.createElement(Table_1.default, { ref: ref, sourceColumns: resolvedColumns,
763
- columns: computedColumns,
764
- columnsGroup: visibilityProjection.columnsGroup,
765
- columnGroups: visibilityProjection.columnGroups,
766
- onChangeColumns: resolvedOnChangeColumns, width: width, height: height, className: className, style: style, loading: loading, disabled: resolvedDisabled, spinning: spinning, scrollLeft: scrollLeft, scrollTop: scrollTop, headerHeight: headerHeight, footerHeight: footerHeight, bottomBarHeight: resolvedBottomBarHeight,
767
- scrollbar: resolvedScrollbar,
768
- status: resolvedStatus,
769
- pagination: resolvedPagination, summaryHeight: summaryHeight, itemHeight: itemHeight, itemPadding: itemPadding, rowHeightMetrics: rowHeightMetrics, frozenColumnIndex: resolvedFrozenColumnIndex,
770
- frozenRowCount: resolvedFrozenRowCount,
771
- rowChecked: resolvedRowChecked, checkedIndexesMap: checkedIndexesMap, sort: resolvedSort, sortParams: sortParams, dataQuery: resolvedDataQuery,
772
- dataControl: resolvedDataControl, icons: icons, columnVisibilityState: columnVisibilityState, searchOptions: resolvedSearchOptions,
773
- contextMenuOptions: resolvedContextMenuOptions,
774
- page: resolvedPage,
775
- data: displayData,
776
- sourceData: resolvedData,
777
- sourceIndexByVisibleIndex: processedResult.sourceIndexByVisibleIndex,
778
- visibleIndexBySourceIndex: processedResult.visibleIndexBySourceIndex,
779
- onClick: resolvedOnClick,
780
- rowKey: resolvedRowKey,
781
- selectedRowKey: resolvedSelectedRowKey,
782
- editable: resolvedEditable, editTrigger: editTrigger, onChangeData: resolvedOnChangeData,
783
- showLineNumber: resolvedShowLineNumber, msg: msg, getRowClassName: resolvedGetRowClassName,
784
- cellMergeOptions: resolvedCellMergeOptions,
785
- cellSelectionOptions: resolvedCellSelectionOptions, cellNavigationOptions: cellNavigationOptions, variant: variant, summary: resolvedSummary,
786
- columnSortable: resolvedColumnSortable,
787
- reorder: resolvedReorder,
788
- treeEnabled: !!treeContextValue }))));
1104
+ React.createElement(MasterDetailContext_1.MasterDetailContext.Provider, { value: masterDetailContextValue },
1105
+ React.createElement(Table_1.default, { ref: ref, sourceColumns: resolvedColumns,
1106
+ columns: computedColumns,
1107
+ columnsGroup: visibilityProjection.columnsGroup,
1108
+ columnGroups: visibilityProjection.columnGroups,
1109
+ onChangeColumns: resolvedOnChangeColumns, width: width, height: height, className: className, style: style, loading: loading, disabled: resolvedDisabled, spinning: spinning, scrollLeft: scrollLeft, scrollTop: scrollTop, headerHeight: headerHeight, footerHeight: footerHeight, bottomBarHeight: resolvedBottomBarHeight,
1110
+ scrollbar: resolvedScrollbar,
1111
+ status: resolvedStatus,
1112
+ pagination: resolvedPagination,
1113
+ summaryHeight: resolvedSummaryHeight, summaryRowHeight: summaryRowHeight, itemHeight: itemHeight, itemPadding: itemPadding, rowHeightMetrics: rowHeightMetrics, frozenColumnIndex: resolvedFrozenColumnIndex,
1114
+ frozenRowCount: resolvedFrozenRowCount,
1115
+ rowChecked: resolvedRowChecked, checkedIndexesMap: checkedIndexesMap, sort: resolvedSort, sortParams: sortParams, dataQuery: resolvedDataQuery,
1116
+ dataControl: resolvedDataControl, icons: icons, columnVisibilityState: columnVisibilityState, searchOptions: resolvedSearchOptions,
1117
+ contextMenuOptions: resolvedContextMenuOptions,
1118
+ page: resolvedPage,
1119
+ data: displayData,
1120
+ sourceData: resolvedData,
1121
+ sourceIndexByVisibleIndex: processedResult.sourceIndexByVisibleIndex,
1122
+ visibleIndexBySourceIndex: processedResult.visibleIndexBySourceIndex,
1123
+ onClick: resolvedOnClick,
1124
+ rowKey: resolvedRowKey,
1125
+ selectedRowKey: resolvedSelectedRowKey,
1126
+ editable: resolvedEditable, editTrigger: editTrigger, onChangeData: resolvedOnChangeData,
1127
+ showLineNumber: resolvedShowLineNumber, msg: msg, getRowClassName: resolvedGetRowClassName,
1128
+ cellMergeOptions: resolvedCellMergeOptions,
1129
+ cellSelectionOptions: resolvedCellSelectionOptions, cellNavigationOptions: cellNavigationOptions, variant: variant, summary: resolvedSummary,
1130
+ columnSortable: resolvedColumnSortable,
1131
+ reorder: resolvedReorder,
1132
+ treeEnabled: !!treeContextValue })))));
789
1133
  }
@@ -49,6 +49,8 @@ function CellNavigationDomSync(_a) {
49
49
  container
50
50
  .querySelectorAll('[data-bgrid-cell-active="true"], [data-bgrid-cell-active-multi-selection="true"]')
51
51
  .forEach(function (cell) {
52
+ if (cell.closest('[role="grid"], [role="treegrid"]') !== container)
53
+ return;
52
54
  cell.classList.remove('bgrid-cell-active', 'bgrid-cell-active-multi-selection');
53
55
  cell.removeAttribute('data-bgrid-cell-active');
54
56
  cell.removeAttribute('data-bgrid-cell-active-multi-selection');
@@ -57,6 +59,8 @@ function CellNavigationDomSync(_a) {
57
59
  container
58
60
  .querySelectorAll("td[data-bgrid-cell=\"true\"][data-bgrid-logical-row-index=\"".concat(activeCell.rowIndex, "\"][data-column-index=\"").concat(activeCell.columnIndex, "\"]"))
59
61
  .forEach(function (cell) {
62
+ if (cell.closest('[role="grid"], [role="treegrid"]') !== container)
63
+ return;
60
64
  cell.classList.add('bgrid-cell-active');
61
65
  cell.setAttribute('data-bgrid-cell-active', 'true');
62
66
  if (hasMultiCellSelection) {
@@ -70,6 +74,8 @@ function CellNavigationDomSync(_a) {
70
74
  var wholeRowSelection = coversEveryColumn && !coversEveryRow;
71
75
  var wholeColumnSelection = coversEveryRow && !coversEveryColumn;
72
76
  container.querySelectorAll('.bgrid-line-number-cell[data-row-index]').forEach(function (cell) {
77
+ if (cell.closest('[role="grid"], [role="treegrid"]') !== container)
78
+ return;
73
79
  var rowIndex = Number(cell.dataset.rowIndex);
74
80
  var active = !wholeColumnSelection &&
75
81
  Number.isFinite(rowIndex) &&
@@ -81,6 +87,8 @@ function CellNavigationDomSync(_a) {
81
87
  cell.removeAttribute('data-bgrid-row-axis-active');
82
88
  });
83
89
  container.querySelectorAll('[data-header-cell-type][data-column-index]').forEach(function (cell) {
90
+ if (cell.closest('[role="grid"], [role="treegrid"]') !== container)
91
+ return;
84
92
  var columnIndex = Number(cell.dataset.columnIndex);
85
93
  var active = cell.dataset.headerCellType === 'column' &&
86
94
  !wholeRowSelection &&