beautiful-grid 1.0.11 → 1.0.13

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/cjs/BGrid.js CHANGED
@@ -77,6 +77,7 @@ var React = __importStar(require("react"));
77
77
  var Table_1 = __importDefault(require("./components/Table"));
78
78
  var utils_1 = require("./utils");
79
79
  var store_1 = require("./store");
80
+ var TreeContext_1 = require("./components/TreeContext");
80
81
  function computeModelColumns(columns, frozenColumnIndex, duplicateToolboxColumnIds) {
81
82
  var left = 0;
82
83
  var previousWidth = 0;
@@ -91,8 +92,13 @@ function computeModelColumns(columns, frozenColumnIndex, duplicateToolboxColumnI
91
92
  });
92
93
  }
93
94
  function BGrid(_a) {
94
- var _b, _c, _d;
95
- var ref = _a.ref, width = _a.width, height = _a.height, _e = _a.headerHeight, headerHeight = _e === void 0 ? 30 : _e, footerHeight = _a.footerHeight, _f = _a.summaryHeight, summaryHeight = _f === void 0 ? 30 : _f, _g = _a.itemHeight, itemHeight = _g === void 0 ? 15 : _g, _h = _a.itemPadding, itemPadding = _h === void 0 ? 7 : _h, getRowHeight = _a.getRowHeight, columns = _a.columns, columnsGroup = _a.columnsGroup, columnGroups = _a.columnGroups, onChangeColumns = _a.onChangeColumns, _j = _a.frozenColumnIndex, frozenColumnIndex = _j === void 0 ? 0 : _j, _k = _a.frozenRowCount, frozenRowCount = _k === void 0 ? 0 : _k, _l = _a.data, data = _l === void 0 ? [] : _l, page = _a.page, scrollbar = _a.scrollbar, status = _a.status, pagination = _a.pagination, bottomBarHeight = _a.bottomBarHeight, _m = _a.scrollTop, scrollTop = _m === void 0 ? 0 : _m, _o = _a.scrollLeft, scrollLeft = _o === void 0 ? 0 : _o, className = _a.className, style = _a.style, rowChecked = _a.rowChecked, sort = _a.sort, onClick = _a.onClick, _p = _a.loading, loading = _p === void 0 ? false : _p, 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, _q = _a.editTrigger, editTrigger = _q === void 0 ? 'dblclick' : _q, 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;
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 () {
98
+ var _a;
99
+ 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];
101
+ var expandedRowKeys = (_b = tree === null || tree === void 0 ? void 0 : tree.expandedRowKeys) !== null && _b !== void 0 ? _b : uncontrolledExpandedRowKeys;
96
102
  var warnedSearchControlledRef = React.useRef({
97
103
  open: false,
98
104
  query: false,
@@ -106,10 +112,10 @@ function BGrid(_a) {
106
112
  });
107
113
  }, [data, pivot]);
108
114
  var pivotEnabled = !!pivotData;
109
- var resolvedColumns = ((_b = pivotData === null || pivotData === void 0 ? void 0 : pivotData.columns) !== null && _b !== void 0 ? _b : columns);
115
+ var resolvedColumns = ((_c = pivotData === null || pivotData === void 0 ? void 0 : pivotData.columns) !== null && _c !== void 0 ? _c : columns);
110
116
  var visibilityOptions = typeof columnVisibility === 'object' ? columnVisibility : undefined;
111
117
  var visibilityEnabled = columnVisibility === true || (visibilityOptions !== undefined && visibilityOptions.enabled !== false);
112
- var _r = __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 = _r[0], setUncontrolledHiddenColumnIds = _r[1];
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];
113
119
  var hiddenColumnIds = React.useMemo(function () {
114
120
  var _a;
115
121
  if (!visibilityEnabled)
@@ -145,7 +151,7 @@ function BGrid(_a) {
145
151
  resolvedColumnsGroup,
146
152
  summary,
147
153
  ]);
148
- var resolvedData = (_c = pivotData === null || pivotData === void 0 ? void 0 : pivotData.data) !== null && _c !== void 0 ? _c : data;
154
+ var resolvedData = (_d = pivotData === null || pivotData === void 0 ? void 0 : pivotData.data) !== null && _d !== void 0 ? _d : data;
149
155
  var resolvedPage = pivotEnabled ? undefined : page;
150
156
  var resolvedFrozenColumnIndex = visibilityProjection.frozenColumnIndex;
151
157
  var resolvedRowChecked = pivotEnabled ? undefined : rowChecked;
@@ -153,13 +159,15 @@ function BGrid(_a) {
153
159
  var resolvedDisabled = !!disabled;
154
160
  var resolvedOnClick = pivotEnabled || resolvedDisabled ? undefined : onClick;
155
161
  var baseOnChangeColumns = pivotEnabled ? undefined : onChangeColumns;
156
- var resolvedOnChangeData = pivotEnabled ? undefined : onChangeData;
162
+ var baseOnChangeData = pivotEnabled ? undefined : onChangeData;
157
163
  var resolvedRowKey = pivotEnabled ? undefined : rowKey;
158
164
  var resolvedSelectedRowKey = pivotEnabled ? undefined : selectedRowKey;
159
165
  var resolvedEditable = pivotEnabled || resolvedDisabled ? false : editable;
160
166
  var resolvedShowLineNumber = pivotEnabled ? false : showLineNumber;
161
167
  var resolvedGetRowClassName = pivotEnabled ? undefined : getRowClassName;
162
- var resolvedCellMergeOptions = visibilityProjection.cellMergeOptions;
168
+ var requestedTreeEnabled = !!tree && tree.enabled !== false;
169
+ var treeEnabled = requestedTreeEnabled && !pivotEnabled && resolvedRowKey !== undefined;
170
+ var resolvedCellMergeOptions = treeEnabled ? undefined : visibilityProjection.cellMergeOptions;
163
171
  var resolvedCellSelectionOptions = resolvedDisabled
164
172
  ? __assign(__assign({}, cellSelectionOptions), { enabled: false }) : cellSelectionOptions;
165
173
  var resolvedSummary = visibilityProjection.summary;
@@ -171,11 +179,11 @@ function BGrid(_a) {
171
179
  var hasActiveClientQuery = (resolvedDataControl === null || resolvedDataControl === void 0 ? void 0 : resolvedDataControl.mode) === 'client' &&
172
180
  (resolvedDataControl.query.sortParams.length > 0 || resolvedDataControl.query.filterParams.length > 0);
173
181
  var resolvedReorder = React.useMemo(function () {
174
- return pivotEnabled || resolvedDisabled
182
+ return pivotEnabled || resolvedDisabled || treeEnabled
175
183
  ? undefined
176
184
  : (hasActiveClientQuery || frozenRowCount > 0) && reorder
177
185
  ? __assign(__assign({}, reorder), { enabled: false }) : reorder;
178
- }, [frozenRowCount, hasActiveClientQuery, pivotEnabled, reorder, resolvedDisabled]);
186
+ }, [frozenRowCount, hasActiveClientQuery, pivotEnabled, reorder, resolvedDisabled, treeEnabled]);
179
187
  // Development warnings
180
188
  React.useEffect(function () {
181
189
  var _a, _b;
@@ -205,6 +213,18 @@ function BGrid(_a) {
205
213
  warnedSearchControlledRef.current.pivotContextMenu = true;
206
214
  console.warn('[BGrid] contextMenuOptions is disabled while pivot mode is active.');
207
215
  }
216
+ if (requestedTreeEnabled && rowKey === undefined) {
217
+ console.warn('[BGrid] tree requires rowKey. Falling back to flat rows.');
218
+ }
219
+ if (pivotEnabled && requestedTreeEnabled) {
220
+ console.warn('[BGrid] tree is disabled while pivot mode is active.');
221
+ }
222
+ if (treeEnabled && cellMergeOptions) {
223
+ console.warn('[BGrid] cellMergeOptions is disabled while tree mode is active.');
224
+ }
225
+ if (treeEnabled && (reorder === null || reorder === void 0 ? void 0 : reorder.enabled)) {
226
+ console.warn('[BGrid] Row reordering is disabled while tree mode is active.');
227
+ }
208
228
  if (hasHiddenColumns && columnSortable) {
209
229
  console.warn('[BGrid] Column reordering is disabled while columns are hidden.');
210
230
  }
@@ -241,6 +261,10 @@ function BGrid(_a) {
241
261
  hasHiddenColumns,
242
262
  visibilityOptions === null || visibilityOptions === void 0 ? void 0 : visibilityOptions.hiddenColumnIds,
243
263
  visibilityOptions === null || visibilityOptions === void 0 ? void 0 : visibilityOptions.onChange,
264
+ cellMergeOptions,
265
+ requestedTreeEnabled,
266
+ rowKey,
267
+ treeEnabled,
244
268
  ]);
245
269
  var duplicateToolboxColumnIds = React.useMemo(function () {
246
270
  var duplicates = (0, utils_1.findDuplicateColumnIds)(resolvedColumns, true);
@@ -296,9 +320,33 @@ function BGrid(_a) {
296
320
  resolvedColumns,
297
321
  visibilityEnabled,
298
322
  ]);
323
+ var resolvedTreeColumnId = React.useMemo(function () {
324
+ if (!treeEnabled || visibilityProjection.columns.length === 0)
325
+ return undefined;
326
+ var requestedId = tree === null || tree === void 0 ? void 0 : tree.treeColumnId;
327
+ return requestedId &&
328
+ visibilityProjection.columns.some(function (column) { return (0, utils_1.getColumnId)(column) === requestedId; })
329
+ ? requestedId
330
+ : (0, utils_1.getColumnId)(visibilityProjection.columns[0]);
331
+ }, [tree === null || tree === void 0 ? void 0 : tree.treeColumnId, treeEnabled, visibilityProjection.columns]);
299
332
  var computedColumns = React.useMemo(function () {
300
- return computeModelColumns(visibilityProjection.columns, resolvedFrozenColumnIndex, duplicateToolboxColumnIds);
301
- }, [duplicateToolboxColumnIds, resolvedFrozenColumnIndex, visibilityProjection.columns]);
333
+ 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]);
338
+ var warnedTreeColumnIdRef = React.useRef(undefined);
339
+ React.useEffect(function () {
340
+ if (process.env.NODE_ENV === 'production' ||
341
+ !treeEnabled ||
342
+ !(tree === null || tree === void 0 ? void 0 : tree.treeColumnId) ||
343
+ tree.treeColumnId === resolvedTreeColumnId ||
344
+ warnedTreeColumnIdRef.current === tree.treeColumnId) {
345
+ return;
346
+ }
347
+ warnedTreeColumnIdRef.current = tree.treeColumnId;
348
+ console.warn("[BGrid] tree.treeColumnId \"".concat(tree.treeColumnId, "\" is not visible. Falling back to the first visible column."));
349
+ }, [resolvedTreeColumnId, tree === null || tree === void 0 ? void 0 : tree.treeColumnId, treeEnabled]);
302
350
  var queryColumns = React.useMemo(function () { return computeModelColumns(resolvedColumns, pivotEnabled ? 0 : frozenColumnIndex, duplicateToolboxColumnIds); }, [duplicateToolboxColumnIds, frozenColumnIndex, pivotEnabled, resolvedColumns]);
303
351
  var projectedOnChangeColumns = React.useCallback(function (visibleColumnIndex, info) {
304
352
  var _a;
@@ -376,8 +424,9 @@ function BGrid(_a) {
376
424
  filterParams: [],
377
425
  };
378
426
  }, [resolvedDataControl, resolvedSort]);
379
- // Process data in client mode
380
- var processedResult = React.useMemo(function () {
427
+ // Apply the existing client query first. Tree mode uses its result as sibling order
428
+ // and as the direct-match set, then restores the hierarchy during projection.
429
+ var queryProcessedResult = React.useMemo(function () {
381
430
  if ((resolvedDataControl === null || resolvedDataControl === void 0 ? void 0 : resolvedDataControl.mode) === 'client') {
382
431
  return (0, utils_1.processDataQuery)({
383
432
  data: resolvedData,
@@ -394,7 +443,109 @@ function BGrid(_a) {
394
443
  visibleIndexBySourceIndex: undefined,
395
444
  };
396
445
  }, [queryColumns, resolvedData, resolvedDataControl === null || resolvedDataControl === void 0 ? void 0 : resolvedDataControl.mode, resolvedDataQuery, resolvedRowKey]);
446
+ var treeProjection = React.useMemo(function () {
447
+ if (!treeEnabled || !tree || resolvedRowKey === undefined)
448
+ return undefined;
449
+ var clientQuery = (resolvedDataControl === null || resolvedDataControl === void 0 ? void 0 : resolvedDataControl.mode) === 'client';
450
+ return (0, utils_1.projectTreeData)({
451
+ data: resolvedData,
452
+ rowKey: resolvedRowKey,
453
+ parentRowKey: tree.parentRowKey,
454
+ expandedRowKeys: expandedRowKeys,
455
+ includedSourceIndexes: clientQuery && resolvedDataQuery.filterParams.length > 0
456
+ ? queryProcessedResult.sourceIndexByVisibleIndex
457
+ : undefined,
458
+ orderedSourceIndexes: clientQuery && resolvedDataQuery.sortParams.length > 0
459
+ ? queryProcessedResult.sourceIndexByVisibleIndex
460
+ : undefined,
461
+ });
462
+ }, [
463
+ expandedRowKeys,
464
+ queryProcessedResult.sourceIndexByVisibleIndex,
465
+ resolvedData,
466
+ resolvedDataControl === null || resolvedDataControl === void 0 ? void 0 : resolvedDataControl.mode,
467
+ resolvedDataQuery.filterParams.length,
468
+ resolvedDataQuery.sortParams.length,
469
+ resolvedRowKey,
470
+ tree,
471
+ treeEnabled,
472
+ ]);
473
+ React.useEffect(function () {
474
+ if (process.env.NODE_ENV === 'production' || !treeProjection || treeProjection.valid)
475
+ return;
476
+ console.warn("[BGrid] Invalid tree data (".concat(treeProjection.diagnostics.join(', '), "). Falling back to flat rows."));
477
+ }, [treeProjection]);
478
+ var resolvedTreeProjection = (treeProjection === null || treeProjection === void 0 ? void 0 : treeProjection.valid) ? treeProjection : undefined;
479
+ var processedResult = resolvedTreeProjection
480
+ ? {
481
+ rows: [],
482
+ data: resolvedTreeProjection.data,
483
+ sourceIndexByVisibleIndex: resolvedTreeProjection.sourceIndexByVisibleIndex,
484
+ visibleIndexBySourceIndex: resolvedTreeProjection.visibleIndexBySourceIndex,
485
+ }
486
+ : queryProcessedResult;
397
487
  var displayData = processedResult.data;
488
+ var resolvedOnChangeData = React.useMemo(function () {
489
+ if (!baseOnChangeData)
490
+ return undefined;
491
+ if (!resolvedTreeProjection)
492
+ return baseOnChangeData;
493
+ return function (index, columnIndex, item, column, meta) {
494
+ var treeMeta = resolvedTreeProjection.metaBySourceIndex.get(index);
495
+ if (!meta || !treeMeta) {
496
+ baseOnChangeData(index, columnIndex, item, column, meta);
497
+ return;
498
+ }
499
+ baseOnChangeData(index, columnIndex, item, column, __assign(__assign({}, meta), { tree: {
500
+ rowKey: treeMeta.rowKey,
501
+ parentRowKey: treeMeta.parentRowKey,
502
+ sourceIndex: treeMeta.sourceIndex,
503
+ depth: treeMeta.depth,
504
+ path: (0, utils_1.getTreeRowPath)(resolvedTreeProjection.metaBySourceIndex, index),
505
+ } }));
506
+ };
507
+ }, [baseOnChangeData, resolvedTreeProjection]);
508
+ var toggleTreeRow = React.useCallback(function (meta) {
509
+ var _a;
510
+ if (resolvedDisabled || !tree || !meta.hasChildren)
511
+ return;
512
+ var nextExpanded = meta.expanded
513
+ ? expandedRowKeys.filter(function (key) { return !Object.is(key, meta.rowKey); })
514
+ : expandedRowKeys.some(function (key) { return Object.is(key, meta.rowKey); })
515
+ ? __spreadArray([], __read(expandedRowKeys), false) : __spreadArray(__spreadArray([], __read(expandedRowKeys), false), [meta.rowKey], false);
516
+ if (tree.expandedRowKeys === undefined)
517
+ setUncontrolledExpandedRowKeys(nextExpanded);
518
+ var item = resolvedData[meta.sourceIndex];
519
+ if (item) {
520
+ (_a = tree.onExpandedRowKeysChange) === null || _a === void 0 ? void 0 : _a.call(tree, nextExpanded, {
521
+ rowKey: meta.rowKey,
522
+ expanded: !meta.expanded,
523
+ item: item,
524
+ sourceIndex: meta.sourceIndex,
525
+ });
526
+ }
527
+ }, [expandedRowKeys, resolvedData, resolvedDisabled, tree]);
528
+ var treeContextValue = React.useMemo(function () {
529
+ var _a, _b, _c;
530
+ if (!resolvedTreeProjection || !resolvedTreeColumnId || resolvedRowKey === undefined || !tree)
531
+ return undefined;
532
+ var indentSize = Number.isFinite(tree.indentSize) && ((_a = tree.indentSize) !== null && _a !== void 0 ? _a : -1) >= 0 ? tree.indentSize : 16;
533
+ return {
534
+ treeColumnId: resolvedTreeColumnId,
535
+ indentSize: indentSize,
536
+ icons: tree.icons,
537
+ expandAriaLabel: (_b = tree.expandAriaLabel) !== null && _b !== void 0 ? _b : 'Expand row',
538
+ collapseAriaLabel: (_c = tree.collapseAriaLabel) !== null && _c !== void 0 ? _c : 'Collapse row',
539
+ disabled: resolvedDisabled,
540
+ metaByRowKey: resolvedTreeProjection.metaByRowKey,
541
+ metaBySourceIndex: resolvedTreeProjection.metaBySourceIndex,
542
+ getRowKey: function (values) {
543
+ var key = (0, utils_1.getCellValueByRowKey)(resolvedRowKey, values);
544
+ return key === undefined || key === null ? undefined : key;
545
+ },
546
+ toggle: toggleTreeRow,
547
+ };
548
+ }, [resolvedDisabled, resolvedRowKey, resolvedTreeColumnId, resolvedTreeProjection, toggleTreeRow, tree]);
398
549
  var rowHeightMetrics = React.useMemo(function () { return (0, utils_1.createRowHeightMetrics)(displayData, itemHeight + itemPadding * 2, getRowHeight); }, [displayData, getRowHeight, itemHeight, itemPadding]);
399
550
  var resolvedFrozenRowCount = pivotEnabled
400
551
  ? 0
@@ -443,7 +594,7 @@ function BGrid(_a) {
443
594
  var resolvedStatus = React.useMemo(function () { return (0, utils_1.resolveStatusOptions)(status); }, [status]);
444
595
  var resolvedPagination = React.useMemo(function () { return (0, utils_1.resolvePaginationViewOptions)(pagination); }, [pagination]);
445
596
  var resolvedScrollbar = React.useMemo(function () { return (0, utils_1.resolveScrollbarOptions)(scrollbar); }, [scrollbar]);
446
- var resolvedBottomBarHeight = (_d = bottomBarHeight !== null && bottomBarHeight !== void 0 ? bottomBarHeight : footerHeight) !== null && _d !== void 0 ? _d : 30;
597
+ var resolvedBottomBarHeight = (_e = bottomBarHeight !== null && bottomBarHeight !== void 0 ? bottomBarHeight : footerHeight) !== null && _e !== void 0 ? _e : 30;
447
598
  var initialShowBottomBar = React.useMemo(function () {
448
599
  return (0, utils_1.shouldRenderBottomBar)({
449
600
  hasPage: !!resolvedPage,
@@ -607,29 +758,32 @@ function BGrid(_a) {
607
758
  initialShowBottomBar,
608
759
  ]);
609
760
  return (React.createElement(store_1.AppStoreProvider, { initialState: initialStoreState },
610
- React.createElement(Table_1.default, { ref: ref, columns: computedColumns,
611
- columnsGroup: visibilityProjection.columnsGroup,
612
- columnGroups: visibilityProjection.columnGroups,
613
- 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,
614
- scrollbar: resolvedScrollbar,
615
- status: resolvedStatus,
616
- pagination: resolvedPagination, summaryHeight: summaryHeight, itemHeight: itemHeight, itemPadding: itemPadding, rowHeightMetrics: rowHeightMetrics, frozenColumnIndex: resolvedFrozenColumnIndex,
617
- frozenRowCount: resolvedFrozenRowCount,
618
- rowChecked: resolvedRowChecked, checkedIndexesMap: checkedIndexesMap, sort: resolvedSort, sortParams: sortParams, dataQuery: resolvedDataQuery,
619
- dataControl: resolvedDataControl, icons: icons, columnVisibilityState: columnVisibilityState, searchOptions: resolvedSearchOptions,
620
- contextMenuOptions: resolvedContextMenuOptions,
621
- page: resolvedPage,
622
- data: displayData,
623
- sourceData: resolvedData,
624
- sourceIndexByVisibleIndex: processedResult.sourceIndexByVisibleIndex,
625
- visibleIndexBySourceIndex: processedResult.visibleIndexBySourceIndex,
626
- onClick: resolvedOnClick,
627
- rowKey: resolvedRowKey,
628
- selectedRowKey: resolvedSelectedRowKey,
629
- editable: resolvedEditable, editTrigger: editTrigger, onChangeData: resolvedOnChangeData,
630
- showLineNumber: resolvedShowLineNumber, msg: msg, getRowClassName: resolvedGetRowClassName,
631
- cellMergeOptions: resolvedCellMergeOptions,
632
- cellSelectionOptions: resolvedCellSelectionOptions, cellNavigationOptions: cellNavigationOptions, variant: variant, summary: resolvedSummary,
633
- columnSortable: resolvedColumnSortable,
634
- reorder: resolvedReorder })));
761
+ 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 }))));
635
789
  }
@@ -166,6 +166,7 @@ function Table(props) {
166
166
  var _a;
167
167
  var _this = this;
168
168
  var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8;
169
+ var store = (0, store_1.useAppStoreApi)();
169
170
  var cellSelectionOptions = props.cellSelectionOptions, onChangeData = props.onChangeData, sourceIndexByVisibleIndex = props.sourceIndexByVisibleIndex;
170
171
  var cellSelectionEnabled = (_b = cellSelectionOptions === null || cellSelectionOptions === void 0 ? void 0 : cellSelectionOptions.enabled) !== null && _b !== void 0 ? _b : true;
171
172
  var rowKeyRegistryState = (0, react_1.useRef)({
@@ -657,12 +658,46 @@ function Table(props) {
657
658
  var scrollPropsRef = (0, react_1.useRef)({ top: props.scrollTop, left: props.scrollLeft });
658
659
  var syncedDataPropRef = (0, react_1.useRef)(props.data);
659
660
  var _23 = __read(React.useState(null), 2), rowScrollRequest = _23[0], setRowScrollRequest = _23[1];
661
+ var sourceColumnsRef = (0, react_1.useRef)(props.sourceColumns);
662
+ sourceColumnsRef.current = props.sourceColumns;
663
+ var getCurrentExportData = (0, react_1.useCallback)(function (options) {
664
+ var state = store.getState();
665
+ return (0, utils_1.createGridExportData)({
666
+ options: options,
667
+ columns: state.columns,
668
+ sourceColumns: sourceColumnsRef.current,
669
+ data: state.data,
670
+ sourceData: state.sourceData,
671
+ sourceIndexByVisibleIndex: state.sourceIndexByVisibleIndex,
672
+ visibleIndexBySourceIndex: state.visibleIndexBySourceIndex,
673
+ checkedIndexesMap: state.checkedIndexesMap,
674
+ rowKey: state.rowKey,
675
+ });
676
+ }, [store]);
660
677
  React.useImperativeHandle(props.ref, function () { return ({
661
678
  scrollToRow: function (rowIndex, options) {
662
679
  var _a;
663
680
  setRowScrollRequest({ rowIndex: rowIndex, align: (_a = options === null || options === void 0 ? void 0 : options.align) !== null && _a !== void 0 ? _a : 'nearest' });
664
681
  },
665
- }); }, []);
682
+ getExportData: function (options) {
683
+ return getCurrentExportData(options);
684
+ },
685
+ exportCsv: function (options) {
686
+ var _a;
687
+ var exportData = getCurrentExportData(options);
688
+ var csv = (0, utils_1.serializeGridExportDataToCsv)(exportData, options);
689
+ (0, utils_1.downloadCsv)(csv, (_a = options === null || options === void 0 ? void 0 : options.fileName) !== null && _a !== void 0 ? _a : 'export.csv');
690
+ },
691
+ exportExcel: function (options) {
692
+ var exportData = getCurrentExportData(options);
693
+ void Promise.resolve().then(function () { return __importStar(require('../utils/exportExcel')); }).then(function (_a) {
694
+ var _b;
695
+ var serializeGridExportDataToExcel = _a.serializeGridExportDataToExcel, downloadExcel = _a.downloadExcel;
696
+ var excelBytes = serializeGridExportDataToExcel(exportData, options);
697
+ downloadExcel(excelBytes, (_b = options === null || options === void 0 ? void 0 : options.fileName) !== null && _b !== void 0 ? _b : 'export.xlsx');
698
+ });
699
+ },
700
+ }); }, [getCurrentExportData]);
666
701
  var scrollRafRef = (0, react_1.useRef)(null);
667
702
  var scrollIdleTimerRef = (0, react_1.useRef)(null);
668
703
  var selectionAutoScrollRafRef = (0, react_1.useRef)(null);
@@ -2353,7 +2388,7 @@ function Table(props) {
2353
2388
  };
2354
2389
  }, []);
2355
2390
  return (React.createElement(EditorPortalRoot_1.EditorPortalContext.Provider, { value: editorPortalContext },
2356
- React.createElement(Container, { ref: containerRef, role: 'grid', style: __assign(__assign({}, style), (_a = { width: width, height: height, borderWidth: "".concat(containerBorderWidth, "px") }, _a['--bgrid-virtual-row-height'] = "".concat(trHeight, "px"), _a)), className: className, tabIndex: 0, "aria-disabled": disabled ? 'true' : undefined, onFocus: function (event) {
2391
+ React.createElement(Container, { ref: containerRef, role: props.treeEnabled ? 'treegrid' : 'grid', style: __assign(__assign({}, style), (_a = { width: width, height: height, borderWidth: "".concat(containerBorderWidth, "px") }, _a['--bgrid-virtual-row-height'] = "".concat(trHeight, "px"), _a)), className: className, tabIndex: 0, "aria-disabled": disabled ? 'true' : undefined, onFocus: function (event) {
2357
2392
  if (event.target !== event.currentTarget)
2358
2393
  return;
2359
2394
  var gateway = event.currentTarget.querySelector('[data-bgrid-text-editor-gateway="true"]');
@@ -38,6 +38,7 @@ var React = __importStar(require("react"));
38
38
  var PluginCellEditor_1 = require("./PluginCellEditor");
39
39
  var CellEditorIcon_1 = require("./CellEditorIcon");
40
40
  var CheckboxCellEditor_1 = require("./CheckboxCellEditor");
41
+ var TreeCell_1 = require("./TreeCell");
41
42
  function Cell(_a) {
42
43
  var _b, _c, _d;
43
44
  var index = _a.index, _e = _a.hostIndex, hostIndex = _e === void 0 ? index : _e, columnIndex = _a.columnIndex, column = _a.column, item = _a.item, valueByRowKey = _a.valueByRowKey, handleSave = _a.handleSave, handleCancel = _a.handleCancel, handleMove = _a.handleMove, editable = _a.editable, cellEditable = _a.cellEditable, _f = _a.interactionEditing, interactionEditing = _f === void 0 ? false : _f, editSession = _a.editSession;
@@ -74,7 +75,7 @@ function Cell(_a) {
74
75
  content = renderSafeCellValue(valueByRowKey);
75
76
  }
76
77
  return (React.createElement("div", { className: isPluginEditorActive ? 'bgrid-cell-content bgrid-cell-content-plugin-editor' : 'bgrid-cell-content' },
77
- React.createElement("div", { className: 'bgrid-cell-value' }, content),
78
+ React.createElement("div", { className: 'bgrid-cell-value' }, column.treeCell ? (React.createElement(TreeCell_1.TreeCell, { column: column, item: item }, content)) : (content)),
78
79
  column.editorIcon && ((_d = column.editor) === null || _d === void 0 ? void 0 : _d.type) !== 'checkbox' && cellEditable && (React.createElement(CellEditorIcon_1.CellEditorIcon, { hostCell: { rowIndex: hostIndex, columnIndex: columnIndex }, index: index, columnIndex: columnIndex, column: column, item: item, value: valueByRowKey, editing: interactionEditing }))));
79
80
  }
80
81
  function renderSafeCellValue(value, preserveRenderableArrays) {
@@ -90,6 +90,7 @@ var utils_1 = require("../utils");
90
90
  var TableBodyCell_1 = require("./TableBodyCell");
91
91
  var RowSelector_1 = __importDefault(require("./RowSelector"));
92
92
  var GripVertical_1 = require("./GripVertical");
93
+ var TreeContext_1 = require("./TreeContext");
93
94
  function TableBodyCellItemInner(_a) {
94
95
  var _this = this;
95
96
  var _b, _c, _d, _e;
@@ -167,9 +168,12 @@ function TableBodyRowInner(_a) {
167
168
  var _this = this;
168
169
  var _d;
169
170
  var item = _a.item, data = _a.data, ri = _a.ri, sourceIndex = _a.sourceIndex, columns = _a.columns, startCIdx = _a.startCIdx, endCIdx = _a.endCIdx, frozenColumnIndex = _a.frozenColumnIndex, isLeftRegion = _a.isLeftRegion, showLineNumber = _a.showLineNumber, hasRowChecked = _a.hasRowChecked, isRadio = _a.isRadio, checked = _a.checked, rowCheckedDisabled = _a.rowCheckedDisabled, rowStatus = _a.rowStatus, active = _a.active, className = _a.className, resolvedRowHeight = _a.resolvedRowHeight, itemHeight = _a.itemHeight, itemPadding = _a.itemPadding, editable = _a.editable, disabled = _a.disabled, editTrigger = _a.editTrigger, hasOnClick = _a.hasOnClick, cellMergeOptions = _a.cellMergeOptions, mergeColumns = _a.mergeColumns, odd = _a.odd, variant = _a.variant, rowReorderEnabled = _a.rowReorderEnabled, rowReorderRole = _a.rowReorderRole, rowReorderPhase = _a.rowReorderPhase, rowReorderDirection = _a.rowReorderDirection, rowReorderOffset = _a.rowReorderOffset, reorder = _a.reorder, reorderingInfo = _a.reorderingInfo, searchMatchTokens = _a.searchMatchTokens, currentSearchToken = _a.currentSearchToken, isRowEditing = _a.isRowEditing, cellInteractionSession = _a.cellInteractionSession, handleClick = _a.handleClick, setEditItem = _a.setEditItem, setItemValue = _a.setItemValue, handleMoveEditFocus = _a.handleMoveEditFocus, handleChangeChecked = _a.handleChangeChecked, handleChangeCheckedRadio = _a.handleChangeCheckedRadio, getRowSpan = _a.getRowSpan, onRowReorderPointerDown = _a.onRowReorderPointerDown, onRowReorderKeyDown = _a.onRowReorderKeyDown;
171
+ var tree = (0, TreeContext_1.useTreeContext)();
172
+ var treeRowKey = tree === null || tree === void 0 ? void 0 : tree.getRowKey(item.values);
173
+ var treeMeta = treeRowKey === undefined ? undefined : tree === null || tree === void 0 ? void 0 : tree.metaByRowKey.get(treeRowKey);
170
174
  var clickable = !editable && hasOnClick;
171
175
  var rowClassName = ['bgrid-body-row', active ? 'bgrid-row-active' : '', className].filter(Boolean).join(' ');
172
- return (React.createElement("tr", { className: rowClassName, "data-ri": ri, "data-odd": !mergeColumns && odd ? 'true' : undefined, "data-clickable": clickable ? 'true' : undefined, "data-bgrid-row-reorder-role": rowReorderRole, "data-bgrid-row-reorder-phase": rowReorderRole ? rowReorderPhase : undefined, "data-bgrid-row-reorder-direction": rowReorderRole ? rowReorderDirection : undefined, style: __assign((_b = {}, _b['--bgrid-item-line-height'] = "".concat(itemHeight, "px"), _b['--bgrid-item-cell-height'] = "".concat(resolvedRowHeight, "px"), _b), (rowReorderRole && rowReorderRole !== 'source'
176
+ return (React.createElement("tr", { className: rowClassName, "data-ri": ri, "data-bgrid-tree-row": treeMeta ? 'true' : undefined, "aria-level": treeMeta ? treeMeta.depth + 1 : undefined, "aria-posinset": treeMeta ? treeMeta.siblingIndex + 1 : undefined, "aria-setsize": treeMeta === null || treeMeta === void 0 ? void 0 : treeMeta.siblingCount, "aria-expanded": (treeMeta === null || treeMeta === void 0 ? void 0 : treeMeta.hasChildren) ? treeMeta.expanded : undefined, "data-odd": !mergeColumns && odd ? 'true' : undefined, "data-clickable": clickable ? 'true' : undefined, "data-bgrid-row-reorder-role": rowReorderRole, "data-bgrid-row-reorder-phase": rowReorderRole ? rowReorderPhase : undefined, "data-bgrid-row-reorder-direction": rowReorderRole ? rowReorderDirection : undefined, style: __assign((_b = {}, _b['--bgrid-item-line-height'] = "".concat(itemHeight, "px"), _b['--bgrid-item-cell-height'] = "".concat(resolvedRowHeight, "px"), _b), (rowReorderRole && rowReorderRole !== 'source'
173
177
  ? (_c = {}, _c['--bgrid-row-reorder-offset-y'] = "".concat(rowReorderOffset !== null && rowReorderOffset !== void 0 ? rowReorderOffset : 0, "px"), _c)
174
178
  : undefined)) },
175
179
  isLeftRegion &&
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TreeCell = TreeCell;
37
+ var React = __importStar(require("react"));
38
+ var store_1 = require("../store");
39
+ var utils_1 = require("../utils");
40
+ var TreeContext_1 = require("./TreeContext");
41
+ function TreeCell(_a) {
42
+ var _b, _c, _d, _e, _f;
43
+ var column = _a.column, item = _a.item, children = _a.children;
44
+ var tree = (0, TreeContext_1.useTreeContext)();
45
+ var store = (0, store_1.useAppStoreApi)();
46
+ if (!tree || (0, utils_1.getColumnId)(column) !== tree.treeColumnId)
47
+ return React.createElement(React.Fragment, null, children);
48
+ var key = tree.getRowKey(item.values);
49
+ var meta = key === undefined ? undefined : tree.metaByRowKey.get(key);
50
+ if (!meta)
51
+ return React.createElement(React.Fragment, null, children);
52
+ return (React.createElement("span", { className: 'bgrid-tree-cell', style: {
53
+ '--bgrid-tree-depth': meta.depth,
54
+ '--bgrid-tree-indent-size': "".concat(tree.indentSize, "px"),
55
+ } },
56
+ meta.hasChildren ? (React.createElement("button", { type: 'button', className: 'bgrid-tree-toggle', "aria-expanded": meta.expanded, "aria-label": meta.expanded ? tree.collapseAriaLabel : tree.expandAriaLabel, disabled: tree.disabled, onClick: function (event) {
57
+ var _a, _b, _c, _d;
58
+ event.stopPropagation();
59
+ if (meta.expanded) {
60
+ var state = store.getState();
61
+ var activeCell = state.activeCell;
62
+ var activeSourceIndex = activeCell === undefined
63
+ ? undefined
64
+ : (_b = (_a = state.sourceIndexByVisibleIndex) === null || _a === void 0 ? void 0 : _a[activeCell.rowIndex]) !== null && _b !== void 0 ? _b : activeCell.rowIndex;
65
+ var activeMeta = activeSourceIndex === undefined ? undefined : tree.metaBySourceIndex.get(activeSourceIndex);
66
+ var activeIsDescendant = false;
67
+ while ((activeMeta === null || activeMeta === void 0 ? void 0 : activeMeta.parentSourceIndex) !== undefined) {
68
+ if (activeMeta.parentSourceIndex === meta.sourceIndex) {
69
+ activeIsDescendant = true;
70
+ break;
71
+ }
72
+ activeMeta = tree.metaBySourceIndex.get(activeMeta.parentSourceIndex);
73
+ }
74
+ state.clearCellSelection();
75
+ if (activeCell && activeIsDescendant) {
76
+ state.endCellEdit();
77
+ state.setActiveCell({
78
+ rowIndex: (_d = (_c = state.visibleIndexBySourceIndex) === null || _c === void 0 ? void 0 : _c.get(meta.sourceIndex)) !== null && _d !== void 0 ? _d : 0,
79
+ columnIndex: activeCell.columnIndex,
80
+ });
81
+ }
82
+ }
83
+ tree.toggle(meta);
84
+ } },
85
+ React.createElement("span", { className: 'bgrid-tree-icon', "aria-hidden": 'true' }, meta.expanded ? (_c = (_b = tree.icons) === null || _b === void 0 ? void 0 : _b.expanded) !== null && _c !== void 0 ? _c : '⌄' : (_e = (_d = tree.icons) === null || _d === void 0 ? void 0 : _d.collapsed) !== null && _e !== void 0 ? _e : '›'))) : (React.createElement("span", { className: 'bgrid-tree-toggle-spacer', "aria-hidden": 'true' },
86
+ React.createElement("span", { className: 'bgrid-tree-icon' }, (_f = tree.icons) === null || _f === void 0 ? void 0 : _f.leaf))),
87
+ React.createElement("span", { className: 'bgrid-tree-cell-content' }, children)));
88
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TreeContext = void 0;
37
+ exports.useTreeContext = useTreeContext;
38
+ var React = __importStar(require("react"));
39
+ exports.TreeContext = React.createContext(undefined);
40
+ function useTreeContext() {
41
+ return React.useContext(exports.TreeContext);
42
+ }