@trops/dash-core 0.1.21 → 0.1.23

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/dist/index.js CHANGED
@@ -10592,6 +10592,18 @@ var LayoutBuilder = function LayoutBuilder(_ref) {
10592
10592
  } catch (e) {
10593
10593
  }
10594
10594
  }
10595
+ function handleChangeRowMode(gridContainerId, rowNumber, mode) {
10596
+ try {
10597
+ var dashboard = new DashboardModel(currentWorkspace);
10598
+ var result = dashboard.changeRowMode(gridContainerId, rowNumber, mode);
10599
+ if (result) {
10600
+ var newWorkspace = dashboard.workspace();
10601
+ setCurrentWorkspace(newWorkspace);
10602
+ } else {
10603
+ }
10604
+ } catch (e) {
10605
+ }
10606
+ }
10595
10607
 
10596
10608
  /**
10597
10609
  * handle the click of a cell in a grid that does not contain a widget yet
@@ -10677,6 +10689,7 @@ var LayoutBuilder = function LayoutBuilder(_ref) {
10677
10689
  onAddGridColumn: handleAddGridColumn,
10678
10690
  onDeleteGridColumn: handleDeleteGridColumn,
10679
10691
  onChangeRowHeight: handleChangeRowHeight,
10692
+ onChangeRowMode: handleChangeRowMode,
10680
10693
  onMoveWidgetToCell: handleMoveWidgetToCell
10681
10694
  }, "layout-drag-".concat(dashboardId)), preview === false && editMode === "all" && /*#__PURE__*/jsxRuntime.jsx(LayoutDragBuilderEdit, {
10682
10695
  dashboardId: dashboardId,
@@ -10721,6 +10734,7 @@ var LayoutBuilder = function LayoutBuilder(_ref) {
10721
10734
  onAddGridColumn: handleAddGridColumn,
10722
10735
  onDeleteGridColumn: handleDeleteGridColumn,
10723
10736
  onChangeRowHeight: handleChangeRowHeight,
10737
+ onChangeRowMode: handleChangeRowMode,
10724
10738
  onMoveWidgetToCell: handleMoveWidgetToCell,
10725
10739
  onDropWidgetFromSidebar: handleDropWidgetFromSidebar
10726
10740
  }, "layout-drag-edit-".concat(dashboardId))]
@@ -10810,7 +10824,9 @@ var LayoutDragBuilder = function LayoutDragBuilder(_ref) {
10810
10824
  _ref$onDeleteGridColu = _ref.onDeleteGridColumn,
10811
10825
  onDeleteGridColumn = _ref$onDeleteGridColu === void 0 ? null : _ref$onDeleteGridColu,
10812
10826
  _ref$onChangeRowHeigh = _ref.onChangeRowHeight,
10813
- onChangeRowHeight = _ref$onChangeRowHeigh === void 0 ? null : _ref$onChangeRowHeigh;
10827
+ onChangeRowHeight = _ref$onChangeRowHeigh === void 0 ? null : _ref$onChangeRowHeigh,
10828
+ _ref$onChangeRowMode = _ref.onChangeRowMode,
10829
+ onChangeRowMode = _ref$onChangeRowMode === void 0 ? null : _ref$onChangeRowMode;
10814
10830
  return isDraggable === true ? /*#__PURE__*/jsxRuntime.jsx(reactDnd.DndProvider, {
10815
10831
  backend: reactDndHtml5Backend.HTML5Backend,
10816
10832
  children: _renderLayout({
@@ -10840,7 +10856,8 @@ var LayoutDragBuilder = function LayoutDragBuilder(_ref) {
10840
10856
  onDeleteGridRow: onDeleteGridRow,
10841
10857
  onAddGridColumn: onAddGridColumn,
10842
10858
  onDeleteGridColumn: onDeleteGridColumn,
10843
- onChangeRowHeight: onChangeRowHeight
10859
+ onChangeRowHeight: onChangeRowHeight,
10860
+ onChangeRowMode: onChangeRowMode
10844
10861
  })
10845
10862
  }, "dnd-provider") : _renderLayout({
10846
10863
  dashboardId: dashboardId,
@@ -10869,7 +10886,8 @@ var LayoutDragBuilder = function LayoutDragBuilder(_ref) {
10869
10886
  onDeleteGridRow: onDeleteGridRow,
10870
10887
  onAddGridColumn: onAddGridColumn,
10871
10888
  onDeleteGridColumn: onDeleteGridColumn,
10872
- onChangeRowHeight: onChangeRowHeight
10889
+ onChangeRowHeight: onChangeRowHeight,
10890
+ onChangeRowMode: onChangeRowMode
10873
10891
  });
10874
10892
  };
10875
10893
 
@@ -10917,6 +10935,8 @@ var LayoutDragBuilderEdit = function LayoutDragBuilderEdit(_ref) {
10917
10935
  onDeleteGridColumn = _ref$onDeleteGridColu === void 0 ? null : _ref$onDeleteGridColu,
10918
10936
  _ref$onChangeRowHeigh = _ref.onChangeRowHeight,
10919
10937
  onChangeRowHeight = _ref$onChangeRowHeigh === void 0 ? null : _ref$onChangeRowHeigh,
10938
+ _ref$onChangeRowMode = _ref.onChangeRowMode,
10939
+ onChangeRowMode = _ref$onChangeRowMode === void 0 ? null : _ref$onChangeRowMode,
10920
10940
  _ref$onMoveWidgetToCe = _ref.onMoveWidgetToCell,
10921
10941
  onMoveWidgetToCell = _ref$onMoveWidgetToCe === void 0 ? null : _ref$onMoveWidgetToCe,
10922
10942
  _ref$onDropWidgetFrom = _ref.onDropWidgetFromSidebar,
@@ -10955,6 +10975,7 @@ var LayoutDragBuilderEdit = function LayoutDragBuilderEdit(_ref) {
10955
10975
  onAddGridColumn: onAddGridColumn,
10956
10976
  onDeleteGridColumn: onDeleteGridColumn,
10957
10977
  onChangeRowHeight: onChangeRowHeight,
10978
+ onChangeRowMode: onChangeRowMode,
10958
10979
  onMoveWidgetToCell: onMoveWidgetToCell,
10959
10980
  onDropWidgetFromSidebar: onDropWidgetFromSidebar
10960
10981
  });
@@ -13185,6 +13206,8 @@ var LayoutGridContainer = /*#__PURE__*/React.memo(function (_ref3) {
13185
13206
  onDeleteGridColumn = _ref3$onDeleteGridCol === void 0 ? null : _ref3$onDeleteGridCol,
13186
13207
  _ref3$onChangeRowHeig = _ref3.onChangeRowHeight,
13187
13208
  onChangeRowHeight = _ref3$onChangeRowHeig === void 0 ? null : _ref3$onChangeRowHeig,
13209
+ _ref3$onChangeRowMode = _ref3.onChangeRowMode,
13210
+ onChangeRowMode = _ref3$onChangeRowMode === void 0 ? null : _ref3$onChangeRowMode,
13188
13211
  _ref3$onMoveWidgetToC = _ref3.onMoveWidgetToCell,
13189
13212
  onMoveWidgetToCell = _ref3$onMoveWidgetToC === void 0 ? null : _ref3$onMoveWidgetToC,
13190
13213
  _ref3$onDropWidgetFro = _ref3.onDropWidgetFromSidebar,
@@ -13215,18 +13238,39 @@ var LayoutGridContainer = /*#__PURE__*/React.memo(function (_ref3) {
13215
13238
  var GRID_PAD = 16; // px — matches p-4 (1rem)
13216
13239
  var GRID_GAP = 20; // px — matches gap-5 (1.25rem)
13217
13240
 
13218
- // Compute fixed row heights for scrollable mode
13241
+ // Compute row template tracks respecting rowModes and rowHeights
13219
13242
  function getRowTemplate(grid) {
13220
13243
  var unit = grid.rowUnit || 300;
13221
13244
  var heights = grid.rowHeights || {};
13245
+ var modes = grid.rowModes || {};
13222
13246
  var tracks = [];
13223
13247
  for (var r = 1; r <= grid.rows; r++) {
13224
- var mult = heights[String(r)] || 1;
13225
- tracks.push("".concat(unit * mult, "px"));
13248
+ var mode = modes[String(r)] || "fixed";
13249
+ switch (mode) {
13250
+ case "shrink":
13251
+ tracks.push("auto");
13252
+ break;
13253
+ case "grow":
13254
+ tracks.push("minmax(0, 1fr)");
13255
+ break;
13256
+ default:
13257
+ {
13258
+ var mult = heights[String(r)] || 1;
13259
+ tracks.push("".concat(unit * mult, "px"));
13260
+ break;
13261
+ }
13262
+ }
13226
13263
  }
13227
13264
  return tracks.join(" ");
13228
13265
  }
13229
13266
 
13267
+ // Check if any row has an explicit mode set
13268
+ function hasExplicitRowModes() {
13269
+ if (!hasGrid) return false;
13270
+ var modes = item.grid.rowModes;
13271
+ return modes && Object.keys(modes).length > 0;
13272
+ }
13273
+
13230
13274
  // Get the current multiplier for a row
13231
13275
  function getRowMultiplier(row) {
13232
13276
  var _item$grid$rowHeights;
@@ -13234,15 +13278,54 @@ var LayoutGridContainer = /*#__PURE__*/React.memo(function (_ref3) {
13234
13278
  return ((_item$grid$rowHeights = item.grid.rowHeights) === null || _item$grid$rowHeights === void 0 ? void 0 : _item$grid$rowHeights[String(row)]) || 1;
13235
13279
  }
13236
13280
 
13237
- // Cycle multiplier: 1 2 3 → 1
13238
- function handleCycleRowHeight(row) {
13239
- var current = getRowMultiplier(row);
13240
- var next = current >= 3 ? 1 : current + 1;
13241
- if (onChangeRowHeight) {
13242
- onChangeRowHeight(id, row, next);
13281
+ // Get the current mode for a row
13282
+ function getRowMode(row) {
13283
+ var _item$grid$rowModes;
13284
+ if (!hasGrid) return "fixed";
13285
+ return ((_item$grid$rowModes = item.grid.rowModes) === null || _item$grid$rowModes === void 0 ? void 0 : _item$grid$rowModes[String(row)]) || "fixed";
13286
+ }
13287
+
13288
+ // Unified cycle: shrink → grow → fixed 1x → fixed 2x → fixed 3x → shrink
13289
+ function handleCycleRowSizing(row) {
13290
+ var mode = getRowMode(row);
13291
+ var mult = getRowMultiplier(row);
13292
+ if (mode === "shrink") {
13293
+ // shrink → grow
13294
+ if (onChangeRowMode) onChangeRowMode(id, row, "grow");
13295
+ } else if (mode === "grow") {
13296
+ // grow → fixed 1x
13297
+ if (onChangeRowMode) onChangeRowMode(id, row, "fixed");
13298
+ } else {
13299
+ // fixed: cycle 1x → 2x → 3x → shrink
13300
+ if (mult >= 3) {
13301
+ if (onChangeRowMode) onChangeRowMode(id, row, "shrink");
13302
+ } else {
13303
+ if (onChangeRowHeight) onChangeRowHeight(id, row, mult + 1);
13304
+ }
13243
13305
  }
13244
13306
  }
13245
13307
 
13308
+ // Get display label and color for current row sizing
13309
+ function getRowSizingDisplay(row) {
13310
+ var mode = getRowMode(row);
13311
+ if (mode === "shrink") return {
13312
+ label: "S",
13313
+ color: "text-amber-400",
13314
+ hoverBg: "hover:bg-amber-400/10"
13315
+ };
13316
+ if (mode === "grow") return {
13317
+ label: "G",
13318
+ color: "text-green-400",
13319
+ hoverBg: "hover:bg-green-400/10"
13320
+ };
13321
+ var mult = getRowMultiplier(row);
13322
+ return {
13323
+ label: "".concat(mult, "x"),
13324
+ color: mult > 1 ? "text-blue-400" : "text-gray-500",
13325
+ hoverBg: mult > 1 ? "hover:bg-blue-400/10" : "hover:bg-gray-400/10"
13326
+ };
13327
+ }
13328
+
13246
13329
  // Modal state for grid operations
13247
13330
  var _useState = React.useState(false),
13248
13331
  _useState2 = _slicedToArray(_useState, 2),
@@ -13543,14 +13626,23 @@ var LayoutGridContainer = /*#__PURE__*/React.memo(function (_ref3) {
13543
13626
  }), /*#__PURE__*/jsxRuntime.jsxs("span", {
13544
13627
  className: "text-[11px] text-gray-400 group-hover:text-gray-200 select-none font-mono font-medium",
13545
13628
  children: ["R", row]
13546
- }), scrollable && /*#__PURE__*/jsxRuntime.jsxs("button", {
13547
- className: "w-5 h-5 flex items-center justify-center rounded text-[10px] text-gray-500 opacity-40 hover:opacity-100 hover:text-blue-400 hover:bg-blue-400/10 transition-all font-mono font-bold select-none",
13548
- onClick: function onClick() {
13549
- return handleCycleRowHeight(row);
13550
- },
13551
- title: "Row height: ".concat(getRowMultiplier(row), "x (click to cycle)"),
13552
- children: [getRowMultiplier(row), "x"]
13553
- }), /*#__PURE__*/jsxRuntime.jsx("button", {
13629
+ }), function () {
13630
+ var _getRowSizingDisplay = getRowSizingDisplay(row),
13631
+ label = _getRowSizingDisplay.label,
13632
+ color = _getRowSizingDisplay.color,
13633
+ hoverBg = _getRowSizingDisplay.hoverBg;
13634
+ var mode = getRowMode(row);
13635
+ var mult = getRowMultiplier(row);
13636
+ var titleParts = mode === "shrink" ? "Shrink (auto)" : mode === "grow" ? "Grow (1fr)" : "Fixed ".concat(mult, "x");
13637
+ return /*#__PURE__*/jsxRuntime.jsx("button", {
13638
+ className: "w-5 h-5 flex items-center justify-center rounded text-[10px] ".concat(color, " opacity-40 hover:opacity-100 ").concat(hoverBg, " transition-all font-mono font-bold select-none"),
13639
+ onClick: function onClick() {
13640
+ return handleCycleRowSizing(row);
13641
+ },
13642
+ title: "Row sizing: ".concat(titleParts, " (click to cycle)"),
13643
+ children: label
13644
+ });
13645
+ }(), /*#__PURE__*/jsxRuntime.jsx("button", {
13554
13646
  className: "w-5 h-5 flex items-center justify-center rounded text-[10px] text-gray-600 opacity-40 hover:opacity-100 hover:text-green-400 hover:bg-green-400/10 transition-all",
13555
13647
  onClick: function onClick() {
13556
13648
  return handleAddRow(row);
@@ -13587,7 +13679,7 @@ var LayoutGridContainer = /*#__PURE__*/React.memo(function (_ref3) {
13587
13679
  }), /*#__PURE__*/jsxRuntime.jsx("div", {
13588
13680
  className: "grid ".concat(scrollable ? "" : "flex-1"),
13589
13681
  style: {
13590
- gridTemplateRows: scrollable ? getRowTemplate(item.grid) : "repeat(".concat(rows, ", minmax(0, 1fr))"),
13682
+ gridTemplateRows: scrollable ? getRowTemplate(item.grid) : hasExplicitRowModes() ? getRowTemplate(item.grid) : "repeat(".concat(rows, ", minmax(0, 1fr))"),
13591
13683
  gap: GRID_GAP
13592
13684
  },
13593
13685
  children: rowItems
@@ -13721,8 +13813,11 @@ var LayoutGridContainer = /*#__PURE__*/React.memo(function (_ref3) {
13721
13813
  }
13722
13814
  }
13723
13815
  var isCellSelected = selectedCellsForMerge.includes(cellNumber);
13816
+ var rowModes = item.grid.rowModes || {};
13817
+ var rowMode = rowModes[String(row)] || "fixed";
13818
+ var heightClass = rowMode === "shrink" ? "" : "h-full";
13724
13819
  cells.push(/*#__PURE__*/jsxRuntime.jsx("div", {
13725
- className: "flex w-full h-full min-h-0 min-w-0 overflow-hidden relative ".concat(isCellSelected ? "ring-2 ring-blue-500 ring-inset rounded" : ""),
13820
+ className: "flex w-full ".concat(heightClass, " min-h-0 min-w-0 overflow-hidden relative ").concat(isCellSelected ? "ring-2 ring-blue-500 ring-inset rounded" : ""),
13726
13821
  "data-cell": cellNumber,
13727
13822
  style: spanStyle,
13728
13823
  children: preview ? cellDef.component ? renderCellComponent(cellDef.component) : renderPreviewEmptyCell(cellNumber) : renderEditCell(cellNumber, cellDef, selectableSet)
@@ -13982,7 +14077,7 @@ var LayoutGridContainer = /*#__PURE__*/React.memo(function (_ref3) {
13982
14077
  id: "grid-container-".concat(id),
13983
14078
  className: "grid flex-1 p-4 gap-5",
13984
14079
  style: {
13985
- gridTemplateRows: "repeat(".concat(item.grid.rows, ", minmax(0, 1fr))"),
14080
+ gridTemplateRows: hasExplicitRowModes() ? getRowTemplate(item.grid) : "repeat(".concat(item.grid.rows, ", minmax(0, 1fr))"),
13986
14081
  gridTemplateColumns: "repeat(".concat(item.grid.cols, ", 1fr)"),
13987
14082
  overflow: "hidden"
13988
14083
  },
@@ -14093,7 +14188,7 @@ var LayoutGridContainer = /*#__PURE__*/React.memo(function (_ref3) {
14093
14188
  id: "grid-container-".concat(id),
14094
14189
  className: "absolute inset-0 grid p-3 ".concat(item.grid.gap || "gap-2"),
14095
14190
  style: {
14096
- gridTemplateRows: "repeat(".concat(item.grid.rows, ", minmax(0, 1fr))"),
14191
+ gridTemplateRows: hasExplicitRowModes() ? getRowTemplate(item.grid) : "repeat(".concat(item.grid.rows, ", minmax(0, 1fr))"),
14097
14192
  gridTemplateColumns: "repeat(".concat(item.grid.cols, ", 1fr)"),
14098
14193
  overflow: "hidden"
14099
14194
  },
@@ -14186,6 +14281,8 @@ var _renderLayout = function renderLayout(_ref) {
14186
14281
  onDeleteGridColumn = _ref$onDeleteGridColu === void 0 ? null : _ref$onDeleteGridColu,
14187
14282
  _ref$onChangeRowHeigh = _ref.onChangeRowHeight,
14188
14283
  onChangeRowHeight = _ref$onChangeRowHeigh === void 0 ? null : _ref$onChangeRowHeigh,
14284
+ _ref$onChangeRowMode = _ref.onChangeRowMode,
14285
+ onChangeRowMode = _ref$onChangeRowMode === void 0 ? null : _ref$onChangeRowMode,
14189
14286
  _ref$onMoveWidgetToCe = _ref.onMoveWidgetToCell,
14190
14287
  onMoveWidgetToCell = _ref$onMoveWidgetToCe === void 0 ? null : _ref$onMoveWidgetToCe,
14191
14288
  _ref$onDropWidgetFrom = _ref.onDropWidgetFromSidebar,
@@ -14253,6 +14350,7 @@ var _renderLayout = function renderLayout(_ref) {
14253
14350
  onAddGridColumn: onAddGridColumn,
14254
14351
  onDeleteGridColumn: onDeleteGridColumn,
14255
14352
  onChangeRowHeight: onChangeRowHeight,
14353
+ onChangeRowMode: onChangeRowMode,
14256
14354
  onMoveWidgetToCell: onMoveWidgetToCell,
14257
14355
  onDropWidgetFromSidebar: onDropWidgetFromSidebar,
14258
14356
  children: id > 0 && _renderLayout({
@@ -14289,6 +14387,7 @@ var _renderLayout = function renderLayout(_ref) {
14289
14387
  onAddGridColumn: onAddGridColumn,
14290
14388
  onDeleteGridColumn: onDeleteGridColumn,
14291
14389
  onChangeRowHeight: onChangeRowHeight,
14390
+ onChangeRowMode: onChangeRowMode,
14292
14391
  onMoveWidgetToCell: onMoveWidgetToCell,
14293
14392
  onDropWidgetFromSidebar: onDropWidgetFromSidebar
14294
14393
  })
@@ -17068,6 +17167,20 @@ var DashboardModel = /*#__PURE__*/function () {
17068
17167
  delete grid["".concat(grid.rows, ".").concat(_c7)];
17069
17168
  }
17070
17169
  grid.rows--;
17170
+
17171
+ // Shift rowModes keys up and remove the compacted row's entry
17172
+ if (grid.rowModes) {
17173
+ var shifted = {};
17174
+ for (var _i2 = 0, _Object$entries = Object.entries(grid.rowModes); _i2 < _Object$entries.length; _i2++) {
17175
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),
17176
+ _key2 = _Object$entries$_i[0],
17177
+ mode = _Object$entries$_i[1];
17178
+ var rowNum = Number(_key2);
17179
+ if (rowNum === _r6) continue;
17180
+ shifted[String(rowNum > _r6 ? rowNum - 1 : rowNum)] = mode;
17181
+ }
17182
+ grid.rowModes = Object.keys(shifted).length > 0 ? shifted : undefined;
17183
+ }
17071
17184
  }
17072
17185
 
17073
17186
  // --- Phase 3: Full normalization (steps 1-5) on the compacted grid ---
@@ -17101,14 +17214,14 @@ var DashboardModel = /*#__PURE__*/function () {
17101
17214
 
17102
17215
  // 2. Remove out-of-bounds cell keys
17103
17216
  var cellKeyPattern = /^(\d+)\.(\d+)$/;
17104
- for (var _i2 = 0, _Object$keys2 = Object.keys(grid); _i2 < _Object$keys2.length; _i2++) {
17105
- var _key2 = _Object$keys2[_i2];
17106
- var match = _key2.match(cellKeyPattern);
17217
+ for (var _i3 = 0, _Object$keys2 = Object.keys(grid); _i3 < _Object$keys2.length; _i3++) {
17218
+ var _key3 = _Object$keys2[_i3];
17219
+ var match = _key3.match(cellKeyPattern);
17107
17220
  if (match) {
17108
17221
  var _r7 = Number(match[1]);
17109
17222
  var _c8 = Number(match[2]);
17110
17223
  if (_r7 < 1 || _r7 > rows || _c8 < 1 || _c8 > cols) {
17111
- delete grid[_key2];
17224
+ delete grid[_key3];
17112
17225
  }
17113
17226
  }
17114
17227
  }
@@ -17139,13 +17252,13 @@ var DashboardModel = /*#__PURE__*/function () {
17139
17252
  var covered = new Set();
17140
17253
  for (var _r0 = 1; _r0 <= rows; _r0++) {
17141
17254
  for (var _c1 = 1; _c1 <= cols; _c1++) {
17142
- var _key3 = "".concat(_r0, ".").concat(_c1);
17143
- var _cell5 = grid[_key3];
17255
+ var _key4 = "".concat(_r0, ".").concat(_c1);
17256
+ var _cell5 = grid[_key4];
17144
17257
  if (!_cell5.span) continue;
17145
17258
 
17146
17259
  // If this cell is already covered by an earlier span,
17147
17260
  // remove its span to resolve the conflict
17148
- if (covered.has(_key3)) {
17261
+ if (covered.has(_key4)) {
17149
17262
  delete _cell5.span;
17150
17263
  continue;
17151
17264
  }
@@ -17165,7 +17278,7 @@ var DashboardModel = /*#__PURE__*/function () {
17165
17278
  covered.add(coveredKey);
17166
17279
  }
17167
17280
  }
17168
- covered.add(_key3);
17281
+ covered.add(_key4);
17169
17282
  }
17170
17283
  }
17171
17284
  }
@@ -17251,8 +17364,8 @@ var DashboardModel = /*#__PURE__*/function () {
17251
17364
  var visibleCells = [];
17252
17365
  for (var r = 1; r <= grid.rows; r++) {
17253
17366
  for (var c = 1; c <= oldCols; c++) {
17254
- var _key4 = "".concat(r, ".").concat(c);
17255
- var cell = grid[_key4];
17367
+ var _key5 = "".concat(r, ".").concat(c);
17368
+ var cell = grid[_key5];
17256
17369
  if (cell && !cell.hide) {
17257
17370
  var _cell$span, _cell$span2;
17258
17371
  visibleCells.push({
@@ -17267,20 +17380,20 @@ var DashboardModel = /*#__PURE__*/function () {
17267
17380
  }
17268
17381
 
17269
17382
  // 2. Clear all cell keys
17270
- for (var _i3 = 0, _Object$keys3 = Object.keys(grid); _i3 < _Object$keys3.length; _i3++) {
17271
- var _key5 = _Object$keys3[_i3];
17272
- if (/^\d+\.\d+$/.test(_key5)) delete grid[_key5];
17383
+ for (var _i4 = 0, _Object$keys3 = Object.keys(grid); _i4 < _Object$keys3.length; _i4++) {
17384
+ var _key6 = _Object$keys3[_i4];
17385
+ if (/^\d+\.\d+$/.test(_key6)) delete grid[_key6];
17273
17386
  }
17274
17387
 
17275
17388
  // 3. Update grid dimensions
17276
17389
  grid.cols = oldCols * count;
17277
17390
 
17278
17391
  // 4. Reposition all cells with scaled positions and spans
17279
- for (var _i4 = 0, _visibleCells = visibleCells; _i4 < _visibleCells.length; _i4++) {
17280
- var vc = _visibleCells[_i4];
17392
+ for (var _i5 = 0, _visibleCells = visibleCells; _i5 < _visibleCells.length; _i5++) {
17393
+ var vc = _visibleCells[_i5];
17281
17394
  var newCol = (vc.col - 1) * count + 1;
17282
- var _key6 = "".concat(vc.row, ".").concat(newCol);
17283
- grid[_key6] = _objectSpread$f(_objectSpread$f({}, vc.data), {}, {
17395
+ var _key7 = "".concat(vc.row, ".").concat(newCol);
17396
+ grid[_key7] = _objectSpread$f(_objectSpread$f({}, vc.data), {}, {
17284
17397
  hide: false,
17285
17398
  span: {
17286
17399
  row: vc.spanRow,
@@ -17295,16 +17408,16 @@ var DashboardModel = /*#__PURE__*/function () {
17295
17408
  var _subSpan = newTargetSpan / count;
17296
17409
  var _component = targetCell === null || targetCell === void 0 ? void 0 : targetCell.component;
17297
17410
  var rowSpan = (targetCell === null || targetCell === void 0 || (_targetCell$span4 = targetCell.span) === null || _targetCell$span4 === void 0 ? void 0 : _targetCell$span4.row) || 1;
17298
- for (var _i5 = 0; _i5 < count; _i5++) {
17299
- var _key7 = "".concat(row, ".").concat(newTargetCol + _i5 * _subSpan);
17300
- grid[_key7] = {
17301
- component: _i5 === 0 ? _component : null,
17411
+ for (var _i6 = 0; _i6 < count; _i6++) {
17412
+ var _key8 = "".concat(row, ".").concat(newTargetCol + _i6 * _subSpan);
17413
+ grid[_key8] = {
17414
+ component: _i6 === 0 ? _component : null,
17302
17415
  hide: false
17303
17416
  };
17304
17417
  if (_subSpan > 1 || rowSpan > 1) {
17305
- grid[_key7].span = {};
17306
- if (_subSpan > 1) grid[_key7].span.col = _subSpan;
17307
- if (rowSpan > 1) grid[_key7].span.row = rowSpan;
17418
+ grid[_key8].span = {};
17419
+ if (_subSpan > 1) grid[_key8].span.col = _subSpan;
17420
+ if (rowSpan > 1) grid[_key8].span.row = rowSpan;
17308
17421
  }
17309
17422
  }
17310
17423
  }
@@ -17327,16 +17440,16 @@ var DashboardModel = /*#__PURE__*/function () {
17327
17440
  delete targetCell.span;
17328
17441
 
17329
17442
  // Create subdivided cells
17330
- for (var _i6 = 0; _i6 < count; _i6++) {
17331
- var _key8 = "".concat(row + _i6 * _subSpan2, ".").concat(col);
17332
- grid[_key8] = {
17333
- component: _i6 === 0 ? _component2 : null,
17443
+ for (var _i7 = 0; _i7 < count; _i7++) {
17444
+ var _key9 = "".concat(row + _i7 * _subSpan2, ".").concat(col);
17445
+ grid[_key9] = {
17446
+ component: _i7 === 0 ? _component2 : null,
17334
17447
  hide: false
17335
17448
  };
17336
17449
  if (_subSpan2 > 1 || _targetSpanCol > 1) {
17337
- grid[_key8].span = {};
17338
- if (_subSpan2 > 1) grid[_key8].span.row = _subSpan2;
17339
- if (_targetSpanCol > 1) grid[_key8].span.col = _targetSpanCol;
17450
+ grid[_key9].span = {};
17451
+ if (_subSpan2 > 1) grid[_key9].span.row = _subSpan2;
17452
+ if (_targetSpanCol > 1) grid[_key9].span.col = _targetSpanCol;
17340
17453
  }
17341
17454
  }
17342
17455
  } else {
@@ -17348,8 +17461,8 @@ var DashboardModel = /*#__PURE__*/function () {
17348
17461
  var _visibleCells2 = [];
17349
17462
  for (var _r1 = 1; _r1 <= oldRows; _r1++) {
17350
17463
  for (var _c10 = 1; _c10 <= grid.cols; _c10++) {
17351
- var _key9 = "".concat(_r1, ".").concat(_c10);
17352
- var _cell6 = grid[_key9];
17464
+ var _key0 = "".concat(_r1, ".").concat(_c10);
17465
+ var _cell6 = grid[_key0];
17353
17466
  if (_cell6 && !_cell6.hide) {
17354
17467
  var _cell6$span, _cell6$span2;
17355
17468
  _visibleCells2.push({
@@ -17364,20 +17477,20 @@ var DashboardModel = /*#__PURE__*/function () {
17364
17477
  }
17365
17478
 
17366
17479
  // 2. Clear all cell keys
17367
- for (var _i7 = 0, _Object$keys4 = Object.keys(grid); _i7 < _Object$keys4.length; _i7++) {
17368
- var _key0 = _Object$keys4[_i7];
17369
- if (/^\d+\.\d+$/.test(_key0)) delete grid[_key0];
17480
+ for (var _i8 = 0, _Object$keys4 = Object.keys(grid); _i8 < _Object$keys4.length; _i8++) {
17481
+ var _key1 = _Object$keys4[_i8];
17482
+ if (/^\d+\.\d+$/.test(_key1)) delete grid[_key1];
17370
17483
  }
17371
17484
 
17372
17485
  // 3. Update grid dimensions
17373
17486
  grid.rows = oldRows * count;
17374
17487
 
17375
17488
  // 4. Reposition all cells with scaled positions and spans
17376
- for (var _i8 = 0, _visibleCells3 = _visibleCells2; _i8 < _visibleCells3.length; _i8++) {
17377
- var _vc = _visibleCells3[_i8];
17489
+ for (var _i9 = 0, _visibleCells3 = _visibleCells2; _i9 < _visibleCells3.length; _i9++) {
17490
+ var _vc = _visibleCells3[_i9];
17378
17491
  var newRow = (_vc.row - 1) * count + 1;
17379
- var _key1 = "".concat(newRow, ".").concat(_vc.col);
17380
- grid[_key1] = _objectSpread$f(_objectSpread$f({}, _vc.data), {}, {
17492
+ var _key10 = "".concat(newRow, ".").concat(_vc.col);
17493
+ grid[_key10] = _objectSpread$f(_objectSpread$f({}, _vc.data), {}, {
17381
17494
  hide: false,
17382
17495
  span: {
17383
17496
  row: _vc.spanRow * count,
@@ -17392,16 +17505,16 @@ var DashboardModel = /*#__PURE__*/function () {
17392
17505
  var _subSpan3 = _newTargetSpan / count;
17393
17506
  var _component3 = targetCell === null || targetCell === void 0 ? void 0 : targetCell.component;
17394
17507
  var colSpan = (targetCell === null || targetCell === void 0 || (_targetCell$span8 = targetCell.span) === null || _targetCell$span8 === void 0 ? void 0 : _targetCell$span8.col) || 1;
17395
- for (var _i9 = 0; _i9 < count; _i9++) {
17396
- var _key10 = "".concat(newTargetRow + _i9 * _subSpan3, ".").concat(col);
17397
- grid[_key10] = {
17398
- component: _i9 === 0 ? _component3 : null,
17508
+ for (var _i0 = 0; _i0 < count; _i0++) {
17509
+ var _key11 = "".concat(newTargetRow + _i0 * _subSpan3, ".").concat(col);
17510
+ grid[_key11] = {
17511
+ component: _i0 === 0 ? _component3 : null,
17399
17512
  hide: false
17400
17513
  };
17401
17514
  if (_subSpan3 > 1 || colSpan > 1) {
17402
- grid[_key10].span = {};
17403
- if (_subSpan3 > 1) grid[_key10].span.row = _subSpan3;
17404
- if (colSpan > 1) grid[_key10].span.col = colSpan;
17515
+ grid[_key11].span = {};
17516
+ if (_subSpan3 > 1) grid[_key11].span.row = _subSpan3;
17517
+ if (colSpan > 1) grid[_key11].span.col = colSpan;
17405
17518
  }
17406
17519
  }
17407
17520
  }
@@ -17553,6 +17666,50 @@ var DashboardModel = /*#__PURE__*/function () {
17553
17666
  }
17554
17667
  }
17555
17668
 
17669
+ /**
17670
+ * Change the sizing mode for a grid row
17671
+ * @param {Number} itemId The id of the grid container
17672
+ * @param {Number} rowNumber The row number (1-indexed)
17673
+ * @param {String} mode The sizing mode: "shrink", "grow", or "fixed"
17674
+ * @returns {Object} Updated grid or null on error
17675
+ */
17676
+ }, {
17677
+ key: "changeRowMode",
17678
+ value: function changeRowMode(itemId, rowNumber, mode) {
17679
+ try {
17680
+ var gridContainer = this.getComponentById(itemId);
17681
+ if (!gridContainer || !gridContainer.grid) {
17682
+ return null;
17683
+ }
17684
+ var grid = gridContainer.grid;
17685
+ grid.rowModes = grid.rowModes || {};
17686
+ if (mode === "fixed" || !mode) {
17687
+ delete grid.rowModes[String(rowNumber)];
17688
+ } else {
17689
+ grid.rowModes[String(rowNumber)] = mode;
17690
+ }
17691
+
17692
+ // When switching away from fixed, clear the rowHeights entry for that row
17693
+ if (mode === "shrink" || mode === "grow") {
17694
+ if (grid.rowHeights) {
17695
+ delete grid.rowHeights[String(rowNumber)];
17696
+ if (Object.keys(grid.rowHeights).length === 0) {
17697
+ delete grid.rowHeights;
17698
+ }
17699
+ }
17700
+ }
17701
+
17702
+ // Clean up empty object
17703
+ if (Object.keys(grid.rowModes).length === 0) {
17704
+ delete grid.rowModes;
17705
+ }
17706
+ this.updateLayoutItem(gridContainer);
17707
+ return grid;
17708
+ } catch (e) {
17709
+ return null;
17710
+ }
17711
+ }
17712
+
17556
17713
  /**
17557
17714
  * Add a new row to the grid
17558
17715
  * @param {Number} itemId The id of the grid container
@@ -17595,15 +17752,28 @@ var DashboardModel = /*#__PURE__*/function () {
17595
17752
  // Shift rowHeights keys down (rows after insertion point move +1)
17596
17753
  if (gridContainer.grid.rowHeights) {
17597
17754
  var shifted = {};
17598
- for (var _i0 = 0, _Object$entries = Object.entries(gridContainer.grid.rowHeights); _i0 < _Object$entries.length; _i0++) {
17599
- var _Object$entries$_i = _slicedToArray(_Object$entries[_i0], 2),
17600
- key = _Object$entries$_i[0],
17601
- mult = _Object$entries$_i[1];
17755
+ for (var _i1 = 0, _Object$entries2 = Object.entries(gridContainer.grid.rowHeights); _i1 < _Object$entries2.length; _i1++) {
17756
+ var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i1], 2),
17757
+ key = _Object$entries2$_i[0],
17758
+ mult = _Object$entries2$_i[1];
17602
17759
  var rowNum = Number(key);
17603
17760
  shifted[String(rowNum >= newRowNumber ? rowNum + 1 : rowNum)] = mult;
17604
17761
  }
17605
17762
  gridContainer.grid.rowHeights = Object.keys(shifted).length > 0 ? shifted : undefined;
17606
17763
  }
17764
+
17765
+ // Shift rowModes keys down (rows after insertion point move +1)
17766
+ if (gridContainer.grid.rowModes) {
17767
+ var _shifted = {};
17768
+ for (var _i10 = 0, _Object$entries3 = Object.entries(gridContainer.grid.rowModes); _i10 < _Object$entries3.length; _i10++) {
17769
+ var _Object$entries3$_i = _slicedToArray(_Object$entries3[_i10], 2),
17770
+ _key12 = _Object$entries3$_i[0],
17771
+ mode = _Object$entries3$_i[1];
17772
+ var _rowNum = Number(_key12);
17773
+ _shifted[String(_rowNum >= newRowNumber ? _rowNum + 1 : _rowNum)] = mode;
17774
+ }
17775
+ gridContainer.grid.rowModes = Object.keys(_shifted).length > 0 ? _shifted : undefined;
17776
+ }
17607
17777
  this._normalizeGrid(gridContainer.grid);
17608
17778
  this.updateLayoutItem(gridContainer);
17609
17779
  return gridContainer.grid;
@@ -17655,16 +17825,30 @@ var DashboardModel = /*#__PURE__*/function () {
17655
17825
  // Shift rowHeights keys up and remove the deleted row's entry
17656
17826
  if (gridContainer.grid.rowHeights) {
17657
17827
  var shifted = {};
17658
- for (var _i1 = 0, _Object$entries2 = Object.entries(gridContainer.grid.rowHeights); _i1 < _Object$entries2.length; _i1++) {
17659
- var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i1], 2),
17660
- key = _Object$entries2$_i[0],
17661
- mult = _Object$entries2$_i[1];
17828
+ for (var _i11 = 0, _Object$entries4 = Object.entries(gridContainer.grid.rowHeights); _i11 < _Object$entries4.length; _i11++) {
17829
+ var _Object$entries4$_i = _slicedToArray(_Object$entries4[_i11], 2),
17830
+ key = _Object$entries4$_i[0],
17831
+ mult = _Object$entries4$_i[1];
17662
17832
  var rowNum = Number(key);
17663
17833
  if (rowNum === rowNumber) continue;
17664
17834
  shifted[String(rowNum > rowNumber ? rowNum - 1 : rowNum)] = mult;
17665
17835
  }
17666
17836
  gridContainer.grid.rowHeights = Object.keys(shifted).length > 0 ? shifted : undefined;
17667
17837
  }
17838
+
17839
+ // Shift rowModes keys up and remove the deleted row's entry
17840
+ if (gridContainer.grid.rowModes) {
17841
+ var _shifted2 = {};
17842
+ for (var _i12 = 0, _Object$entries5 = Object.entries(gridContainer.grid.rowModes); _i12 < _Object$entries5.length; _i12++) {
17843
+ var _Object$entries5$_i = _slicedToArray(_Object$entries5[_i12], 2),
17844
+ _key13 = _Object$entries5$_i[0],
17845
+ mode = _Object$entries5$_i[1];
17846
+ var _rowNum2 = Number(_key13);
17847
+ if (_rowNum2 === rowNumber) continue;
17848
+ _shifted2[String(_rowNum2 > rowNumber ? _rowNum2 - 1 : _rowNum2)] = mode;
17849
+ }
17850
+ gridContainer.grid.rowModes = Object.keys(_shifted2).length > 0 ? _shifted2 : undefined;
17851
+ }
17668
17852
  this._normalizeGrid(gridContainer.grid);
17669
17853
  this.updateLayoutItem(gridContainer);
17670
17854
  return gridContainer.grid;