@alaarab/ogrid-react 2.1.7 → 2.1.9

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/esm/index.js CHANGED
@@ -74,6 +74,9 @@ function getCellValue(item, col) {
74
74
  if (col.valueGetter) return col.valueGetter(item);
75
75
  return item[col.columnId];
76
76
  }
77
+ function isColumnEditable(col, item) {
78
+ return col.editable === true || typeof col.editable === "function" && col.editable(item);
79
+ }
77
80
  function isColumnGroupDef(c) {
78
81
  return "children" in c && Array.isArray(c.children);
79
82
  }
@@ -735,9 +738,9 @@ function getHeaderFilterConfig(col, input) {
735
738
  function getCellRenderDescriptor(item, col, rowIndex, colIdx, input) {
736
739
  const rowId = input.getRowId(item);
737
740
  const globalColIndex = colIdx + input.colOffset;
738
- const colEditable = col.editable === true || typeof col.editable === "function" && col.editable(item);
739
- const canEditInline = input.editable !== false && !!colEditable && !!input.onCellValueChanged && typeof col.cellEditor !== "function";
740
- const canEditPopup = input.editable !== false && !!colEditable && !!input.onCellValueChanged && typeof col.cellEditor === "function" && col.cellEditorPopup !== false;
741
+ const colEditable = isColumnEditable(col, item);
742
+ const canEditInline = input.editable !== false && colEditable && !!input.onCellValueChanged && typeof col.cellEditor !== "function";
743
+ const canEditPopup = input.editable !== false && colEditable && !!input.onCellValueChanged && typeof col.cellEditor === "function" && col.cellEditorPopup !== false;
741
744
  const canEditAny = canEditInline || canEditPopup;
742
745
  const isEditing = input.editingCell?.rowId === rowId && input.editingCell?.columnId === col.columnId;
743
746
  const isActive = !input.isDragging && input.activeCell?.rowIndex === rowIndex && input.activeCell?.columnIndex === globalColIndex;
@@ -850,6 +853,18 @@ function measureRange(container, range, colOffset) {
850
853
  height: brRect.bottom - tlRect.top
851
854
  };
852
855
  }
856
+ function buildCellIndex(container) {
857
+ const index = /* @__PURE__ */ new Map();
858
+ if (!container) return index;
859
+ const cells = container.querySelectorAll("[data-row-index][data-col-index]");
860
+ for (let i = 0; i < cells.length; i++) {
861
+ const el = cells[i];
862
+ const r = el.getAttribute("data-row-index") ?? "";
863
+ const c = el.getAttribute("data-col-index") ?? "";
864
+ index.set(`${r},${c}`, el);
865
+ }
866
+ return index;
867
+ }
853
868
  function injectGlobalStyles(id, css) {
854
869
  if (typeof document === "undefined") return;
855
870
  if (document.getElementById(id)) return;
@@ -1003,8 +1018,7 @@ function applyCellDeletion(range, items, visibleCols) {
1003
1018
  if (r >= items.length || c >= visibleCols.length) continue;
1004
1019
  const item = items[r];
1005
1020
  const col = visibleCols[c];
1006
- const colEditable = col.editable === true || typeof col.editable === "function" && col.editable(item);
1007
- if (!colEditable) continue;
1021
+ if (!isColumnEditable(col, item)) continue;
1008
1022
  const oldValue = getCellValue(item, col);
1009
1023
  const result = parseValue("", oldValue, item, col);
1010
1024
  if (!result.valid) continue;
@@ -1100,8 +1114,7 @@ function applyPastedValues(parsedRows, anchorRow, anchorCol, items, visibleCols)
1100
1114
  if (targetRow >= items.length || targetCol >= visibleCols.length) continue;
1101
1115
  const item = items[targetRow];
1102
1116
  const col = visibleCols[targetCol];
1103
- const colEditable = col.editable === true || typeof col.editable === "function" && col.editable(item);
1104
- if (!colEditable) continue;
1117
+ if (!isColumnEditable(col, item)) continue;
1105
1118
  const rawValue = cells[c] ?? "";
1106
1119
  const oldValue = getCellValue(item, col);
1107
1120
  const result = parseValue(rawValue, oldValue, item, col);
@@ -1124,8 +1137,7 @@ function applyCutClear(cutRange, items, visibleCols) {
1124
1137
  if (r >= items.length || c >= visibleCols.length) continue;
1125
1138
  const item = items[r];
1126
1139
  const col = visibleCols[c];
1127
- const colEditable = col.editable === true || typeof col.editable === "function" && col.editable(item);
1128
- if (!colEditable) continue;
1140
+ if (!isColumnEditable(col, item)) continue;
1129
1141
  const oldValue = getCellValue(item, col);
1130
1142
  const result = parseValue("", oldValue, item, col);
1131
1143
  if (!result.valid) continue;
@@ -1152,8 +1164,7 @@ function applyFillValues(range, sourceRow, sourceCol, items, visibleCols) {
1152
1164
  if (row >= items.length || col >= visibleCols.length) continue;
1153
1165
  const item = items[row];
1154
1166
  const colDef = visibleCols[col];
1155
- const colEditable = colDef.editable === true || typeof colDef.editable === "function" && colDef.editable(item);
1156
- if (!colEditable) continue;
1167
+ if (!isColumnEditable(colDef, item)) continue;
1157
1168
  const oldValue = getCellValue(item, colDef);
1158
1169
  const result = parseValue(startValue, oldValue, item, colDef);
1159
1170
  if (!result.valid) continue;
@@ -2267,42 +2278,62 @@ function useCellSelection(params) {
2267
2278
  useEffect(() => {
2268
2279
  const markedCells = /* @__PURE__ */ new Set();
2269
2280
  let cellIndex = null;
2270
- const buildCellIndex = () => {
2271
- const wrapper = wrapperRef.current;
2272
- if (!wrapper) return;
2273
- cellIndex = /* @__PURE__ */ new Map();
2274
- const cells = wrapper.querySelectorAll("[data-row-index][data-col-index]");
2275
- for (let i = 0; i < cells.length; i++) {
2276
- const el = cells[i];
2277
- const r = el.getAttribute("data-row-index") ?? "";
2278
- const c = el.getAttribute("data-col-index") ?? "";
2279
- cellIndex.set(`${r},${c}`, el);
2280
- }
2281
- };
2282
- const styleCellInRange = (el, r, c, minR, maxR, minC, maxC, anchor) => {
2281
+ let overlayEl = null;
2282
+ let overlayContainer = null;
2283
+ const styleCellInRange = (el, r, _c, _minR, _maxR, _minC, _maxC, anchor) => {
2283
2284
  if (!el.hasAttribute(DRAG_ATTR)) el.setAttribute(DRAG_ATTR, "");
2284
- const isAnchor = anchor && r === anchor.row && c === anchor.col;
2285
+ const isAnchor = anchor && r === anchor.row && _c === anchor.col;
2285
2286
  if (isAnchor) {
2286
2287
  if (!el.hasAttribute(DRAG_ANCHOR_ATTR)) el.setAttribute(DRAG_ANCHOR_ATTR, "");
2287
2288
  } else {
2288
2289
  if (el.hasAttribute(DRAG_ANCHOR_ATTR)) el.removeAttribute(DRAG_ANCHOR_ATTR);
2289
2290
  }
2290
- const shadows = [];
2291
- if (r === minR) shadows.push("inset 0 2px 0 0 var(--ogrid-selection, #217346)");
2292
- if (r === maxR) shadows.push("inset 0 -2px 0 0 var(--ogrid-selection, #217346)");
2293
- if (c === minC) shadows.push("inset 2px 0 0 0 var(--ogrid-selection, #217346)");
2294
- if (c === maxC) shadows.push("inset -2px 0 0 0 var(--ogrid-selection, #217346)");
2295
- el.style.boxShadow = shadows.length > 0 ? shadows.join(", ") : "";
2296
2291
  markedCells.add(el);
2297
2292
  };
2298
2293
  const unstyleCell = (el) => {
2299
2294
  el.removeAttribute(DRAG_ATTR);
2300
2295
  el.removeAttribute(DRAG_ANCHOR_ATTR);
2301
- el.style.boxShadow = "";
2296
+ };
2297
+ const positionOverlay = (minR, maxR, minC, maxC, colOff) => {
2298
+ const topLeftEl = cellIndex?.get(`${minR},${minC + colOff}`);
2299
+ const bottomRightEl = cellIndex?.get(`${maxR},${maxC + colOff}`);
2300
+ if (!topLeftEl || !bottomRightEl) return;
2301
+ const topLeftTd = topLeftEl.closest("td");
2302
+ const bottomRightTd = bottomRightEl.closest("td");
2303
+ if (!topLeftTd || !bottomRightTd) return;
2304
+ if (!overlayContainer) {
2305
+ overlayContainer = topLeftEl.closest("table")?.parentElement;
2306
+ if (!overlayContainer) return;
2307
+ }
2308
+ if (!overlayEl) {
2309
+ overlayEl = document.createElement("div");
2310
+ overlayEl.style.position = "absolute";
2311
+ overlayEl.style.border = "2px solid var(--ogrid-selection, #217346)";
2312
+ overlayEl.style.pointerEvents = "none";
2313
+ overlayEl.style.zIndex = "4";
2314
+ overlayEl.style.boxSizing = "border-box";
2315
+ overlayContainer.appendChild(overlayEl);
2316
+ }
2317
+ const cRect = overlayContainer.getBoundingClientRect();
2318
+ const tlRect = topLeftTd.getBoundingClientRect();
2319
+ const brRect = bottomRightTd.getBoundingClientRect();
2320
+ overlayEl.style.top = `${Math.round(tlRect.top - cRect.top)}px`;
2321
+ overlayEl.style.left = `${Math.round(tlRect.left - cRect.left)}px`;
2322
+ overlayEl.style.width = `${Math.round(brRect.right - tlRect.left)}px`;
2323
+ overlayEl.style.height = `${Math.round(brRect.bottom - tlRect.top)}px`;
2324
+ overlayEl.style.display = "block";
2325
+ };
2326
+ const hideOverlay = () => {
2327
+ if (overlayEl) overlayEl.style.display = "none";
2328
+ };
2329
+ const removeOverlay = () => {
2330
+ overlayEl?.remove();
2331
+ overlayEl = null;
2332
+ overlayContainer = null;
2302
2333
  };
2303
2334
  const applyDragAttrs = (range) => {
2304
2335
  const wrapper = wrapperRef.current;
2305
- if (!wrapper) return;
2336
+ if (!wrapper || !isDraggingRef.current) return;
2306
2337
  const minR = Math.min(range.startRow, range.endRow);
2307
2338
  const maxR = Math.max(range.startRow, range.endRow);
2308
2339
  const minC = Math.min(range.startCol, range.endCol);
@@ -2318,13 +2349,13 @@ function useCellSelection(params) {
2318
2349
  markedCells.delete(el);
2319
2350
  }
2320
2351
  }
2321
- if (!cellIndex) buildCellIndex();
2352
+ if (!cellIndex) cellIndex = buildCellIndex(wrapperRef.current);
2322
2353
  for (let r = minR; r <= maxR; r++) {
2323
2354
  for (let c = minC; c <= maxC; c++) {
2324
2355
  const key = `${r},${c + colOff}`;
2325
2356
  let el = cellIndex?.get(key);
2326
2357
  if (el && !el.isConnected) {
2327
- buildCellIndex();
2358
+ cellIndex = buildCellIndex(wrapperRef.current);
2328
2359
  el = cellIndex?.get(key);
2329
2360
  }
2330
2361
  if (el) {
@@ -2332,6 +2363,7 @@ function useCellSelection(params) {
2332
2363
  }
2333
2364
  }
2334
2365
  }
2366
+ positionOverlay(minR, maxR, minC, maxC, colOff);
2335
2367
  };
2336
2368
  applyDragAttrsRef.current = applyDragAttrs;
2337
2369
  const clearDragAttrs = () => {
@@ -2340,6 +2372,7 @@ function useCellSelection(params) {
2340
2372
  }
2341
2373
  markedCells.clear();
2342
2374
  cellIndex = null;
2375
+ hideOverlay();
2343
2376
  };
2344
2377
  const resolveRange = (cx, cy) => {
2345
2378
  if (!dragStartRef.current) return null;
@@ -2423,7 +2456,7 @@ function useCellSelection(params) {
2423
2456
  if (!dragMovedRef.current) {
2424
2457
  dragMovedRef.current = true;
2425
2458
  setIsDragging(true);
2426
- buildCellIndex();
2459
+ cellIndex = buildCellIndex(wrapperRef.current);
2427
2460
  }
2428
2461
  lastMousePosRef.current = { cx: e.clientX, cy: e.clientY };
2429
2462
  updateAutoScroll();
@@ -2479,6 +2512,7 @@ function useCellSelection(params) {
2479
2512
  window.removeEventListener("mouseup", onUp, true);
2480
2513
  if (rafRef.current) cancelAnimationFrame(rafRef.current);
2481
2514
  stopAutoScroll();
2515
+ removeOverlay();
2482
2516
  };
2483
2517
  }, [setActiveCell, colOffsetRef, setSelectionRange, wrapperRef]);
2484
2518
  return {
@@ -3000,20 +3034,7 @@ function useFillHandle(params) {
3000
3034
  fillDragEndRef.current = { endRow: fillDrag.startRow, endCol: fillDrag.startCol };
3001
3035
  liveFillRangeRef.current = null;
3002
3036
  const markedCells = /* @__PURE__ */ new Set();
3003
- let cellIndex = null;
3004
- const buildCellIndex = () => {
3005
- const wrapper = wrapperRef.current;
3006
- if (!wrapper) return;
3007
- cellIndex = /* @__PURE__ */ new Map();
3008
- const cells = wrapper.querySelectorAll("[data-row-index][data-col-index]");
3009
- for (let i = 0; i < cells.length; i++) {
3010
- const el = cells[i];
3011
- const r = el.getAttribute("data-row-index") ?? "";
3012
- const c = el.getAttribute("data-col-index") ?? "";
3013
- cellIndex.set(`${r},${c}`, el);
3014
- }
3015
- };
3016
- buildCellIndex();
3037
+ let cellIndex = buildCellIndex(wrapperRef.current);
3017
3038
  const applyDragAttrs = (range) => {
3018
3039
  const wrapper = wrapperRef.current;
3019
3040
  if (!wrapper) return;
@@ -3035,8 +3056,8 @@ function useFillHandle(params) {
3035
3056
  const key = `${r},${c + colOff}`;
3036
3057
  let el = cellIndex?.get(key);
3037
3058
  if (el && !el.isConnected) {
3038
- buildCellIndex();
3039
- el = cellIndex?.get(key);
3059
+ cellIndex = buildCellIndex(wrapperRef.current);
3060
+ el = cellIndex.get(key);
3040
3061
  }
3041
3062
  if (el) {
3042
3063
  if (!el.hasAttribute(DRAG_ATTR2)) el.setAttribute(DRAG_ATTR2, "");
@@ -3050,7 +3071,6 @@ function useFillHandle(params) {
3050
3071
  el.removeAttribute(DRAG_ATTR2);
3051
3072
  }
3052
3073
  markedCells.clear();
3053
- cellIndex = null;
3054
3074
  };
3055
3075
  let lastFillMousePos = null;
3056
3076
  const resolveRange = (cx, cy) => {
@@ -3492,7 +3512,7 @@ function useDataGridLayout(params) {
3492
3512
  if (Object.keys(prev).length !== Object.keys(measured).length) return measured;
3493
3513
  return prev;
3494
3514
  });
3495
- }, [visibleCols, containerWidth, columnSizingOverrides, wrapperRef]);
3515
+ }, [visibleCols, columnSizingOverrides, wrapperRef]);
3496
3516
  const columnWidthMap = useMemo(() => {
3497
3517
  const map = {};
3498
3518
  for (const col of visibleCols) {
@@ -3605,7 +3625,9 @@ function useDataGridEditing(params) {
3605
3625
  pendingEditorValue,
3606
3626
  setPendingEditorValue,
3607
3627
  onCellValueChanged,
3608
- setActiveCell
3628
+ setActiveCell,
3629
+ setSelectionRange,
3630
+ colOffset
3609
3631
  } = params;
3610
3632
  const [popoverAnchorEl, setPopoverAnchorEl] = useState(null);
3611
3633
  const visibleColsRef = useLatestRef(params.visibleCols);
@@ -3635,11 +3657,14 @@ function useDataGridEditing(params) {
3635
3657
  setPopoverAnchorEl(null);
3636
3658
  setPendingEditorValue(void 0);
3637
3659
  if (rowIndex < itemsLengthRef.current - 1) {
3638
- setActiveCell({ rowIndex: rowIndex + 1, columnIndex: globalColIndex });
3660
+ const newRow = rowIndex + 1;
3661
+ const localCol = globalColIndex - colOffset;
3662
+ setActiveCell({ rowIndex: newRow, columnIndex: globalColIndex });
3663
+ setSelectionRange({ startRow: newRow, startCol: localCol, endRow: newRow, endCol: localCol });
3639
3664
  }
3640
3665
  },
3641
3666
  // eslint-disable-next-line react-hooks/exhaustive-deps
3642
- [setEditingCell, setPendingEditorValue, setActiveCell, visibleColsRef, itemsLengthRef]
3667
+ [setEditingCell, setPendingEditorValue, setActiveCell, setSelectionRange, colOffset, visibleColsRef, itemsLengthRef]
3643
3668
  );
3644
3669
  const cancelPopoverEdit = useCallback(() => {
3645
3670
  setEditingCell(null);
@@ -3915,6 +3940,7 @@ function useDataGridState(params) {
3915
3940
  });
3916
3941
  const {
3917
3942
  selectionRange,
3943
+ setSelectionRange,
3918
3944
  cutRange,
3919
3945
  copyRange,
3920
3946
  isDragging,
@@ -3928,7 +3954,9 @@ function useDataGridState(params) {
3928
3954
  visibleCols,
3929
3955
  itemsLength: items.length,
3930
3956
  onCellValueChanged,
3931
- setActiveCell
3957
+ setActiveCell,
3958
+ setSelectionRange,
3959
+ colOffset
3932
3960
  });
3933
3961
  const {
3934
3962
  sortBy,
@@ -3939,6 +3967,7 @@ function useDataGridState(params) {
3939
3967
  loadingFilterOptions,
3940
3968
  peopleSearch
3941
3969
  } = props;
3970
+ const hasPeopleSearch = !!peopleSearch;
3942
3971
  const onFilterChangeRef = useLatestRef(onFilterChange);
3943
3972
  const peopleSearchRef = useLatestRef(peopleSearch);
3944
3973
  const stableOnFilterChange = useCallback(
@@ -3958,7 +3987,7 @@ function useDataGridState(params) {
3958
3987
  onFilterChange: stableOnFilterChange,
3959
3988
  filterOptions,
3960
3989
  loadingFilterOptions,
3961
- peopleSearch: peopleSearch ? stablePeopleSearch : void 0
3990
+ peopleSearch: hasPeopleSearch ? stablePeopleSearch : void 0
3962
3991
  }),
3963
3992
  [
3964
3993
  sortBy,
@@ -3968,7 +3997,7 @@ function useDataGridState(params) {
3968
3997
  stableOnFilterChange,
3969
3998
  filterOptions,
3970
3999
  loadingFilterOptions,
3971
- peopleSearch,
4000
+ hasPeopleSearch,
3972
4001
  stablePeopleSearch
3973
4002
  ]
3974
4003
  );
@@ -6820,7 +6849,8 @@ function MarchingAntsOverlay({
6820
6849
  items,
6821
6850
  visibleColumns,
6822
6851
  columnSizingOverrides,
6823
- columnOrder
6852
+ columnOrder,
6853
+ isDragging
6824
6854
  }) {
6825
6855
  const [selRect, setSelRect] = useState(null);
6826
6856
  const [clipRect, setClipRect] = useState(null);
@@ -6868,7 +6898,7 @@ function MarchingAntsOverlay({
6868
6898
  const selR = selRect ? roundRect(selRect) : null;
6869
6899
  const clipR = clipRect ? roundRect(clipRect) : null;
6870
6900
  return /* @__PURE__ */ jsxs(Fragment, { children: [
6871
- selR && !clipRangeMatchesSel && /* @__PURE__ */ jsx(
6901
+ selR && !isDragging && !clipRangeMatchesSel && /* @__PURE__ */ jsx(
6872
6902
  "svg",
6873
6903
  {
6874
6904
  style: {
@@ -21,5 +21,7 @@ export interface MarchingAntsOverlayProps {
21
21
  }>;
22
22
  /** Column order — triggers re-measurement when columns are reordered */
23
23
  columnOrder: readonly string[] | undefined;
24
+ /** True while the user is drag-selecting — hides the selection SVG (drag overlay handles it) */
25
+ isDragging?: boolean;
24
26
  }
25
- export declare function MarchingAntsOverlay({ containerRef, selectionRange, copyRange, cutRange, colOffset, items, visibleColumns, columnSizingOverrides, columnOrder, }: MarchingAntsOverlayProps): React.ReactElement | null;
27
+ export declare function MarchingAntsOverlay({ containerRef, selectionRange, copyRange, cutRange, colOffset, items, visibleColumns, columnSizingOverrides, columnOrder, isDragging, }: MarchingAntsOverlayProps): React.ReactElement | null;
@@ -24,6 +24,13 @@ export interface UseDataGridEditingParams<T> {
24
24
  rowIndex: number;
25
25
  columnIndex: number;
26
26
  } | null) => void;
27
+ setSelectionRange: (range: {
28
+ startRow: number;
29
+ startCol: number;
30
+ endRow: number;
31
+ endCol: number;
32
+ } | null) => void;
33
+ colOffset: number;
27
34
  }
28
35
  export interface UseDataGridEditingResult<T> {
29
36
  editing: DataGridEditingState<T>;
@@ -1,4 +1,4 @@
1
- export { escapeCsvValue, buildCsvHeader, buildCsvRows, exportToCsv, triggerCsvDownload, getCellValue, flattenColumns, buildHeaderRows, getFilterField, mergeFilter, deriveFilterOptionsFromData, getMultiSelectFilterFields, getStatusBarParts, getDataGridStatusBarConfig, getPaginationViewModel, PAGE_SIZE_OPTIONS, MAX_PAGE_BUTTONS, GRID_CONTEXT_MENU_ITEMS, COLUMN_HEADER_MENU_ITEMS, getContextMenuHandlers, getColumnHeaderMenuItems, formatShortcut, parseValue, numberParser, currencyParser, dateParser, emailParser, booleanParser, computeAggregations, processClientSideData, computeNextSortState, measureColumnContentWidth, AUTOSIZE_EXTRA_PX, AUTOSIZE_MAX_PX, findCtrlArrowTarget, computeTabNavigation, rangesEqual, clampSelectionToBounds, computeAutoScrollSpeed, formatCellValueForTsv, formatSelectionAsTsv, parseTsvClipboard, applyPastedValues, applyCutClear, applyFillValues, computeArrowNavigation, applyCellDeletion, applyRangeRowSelection, computeRowSelectionState, UndoRedoStack, } from '@alaarab/ogrid-core';
1
+ export { escapeCsvValue, buildCsvHeader, buildCsvRows, exportToCsv, triggerCsvDownload, getCellValue, flattenColumns, buildHeaderRows, getFilterField, mergeFilter, deriveFilterOptionsFromData, getMultiSelectFilterFields, getStatusBarParts, getDataGridStatusBarConfig, getPaginationViewModel, PAGE_SIZE_OPTIONS, MAX_PAGE_BUTTONS, GRID_CONTEXT_MENU_ITEMS, COLUMN_HEADER_MENU_ITEMS, getContextMenuHandlers, getColumnHeaderMenuItems, formatShortcut, parseValue, numberParser, currencyParser, dateParser, emailParser, booleanParser, computeAggregations, processClientSideData, computeNextSortState, measureColumnContentWidth, AUTOSIZE_EXTRA_PX, AUTOSIZE_MAX_PX, findCtrlArrowTarget, computeTabNavigation, rangesEqual, clampSelectionToBounds, computeAutoScrollSpeed, formatCellValueForTsv, formatSelectionAsTsv, parseTsvClipboard, applyPastedValues, applyCutClear, applyFillValues, computeArrowNavigation, applyCellDeletion, applyRangeRowSelection, computeRowSelectionState, UndoRedoStack, buildCellIndex, } from '@alaarab/ogrid-core';
2
2
  export type { CsvColumn, StatusBarPart, StatusBarPartsInput, GridContextMenuItem, GridContextMenuHandlerProps, PaginationViewModel, ParseValueResult, AggregationResult, IColumnHeaderMenuItem, ColumnHeaderMenuInput, ColumnHeaderMenuHandlers, ArrowNavigationContext, ArrowNavigationResult, } from '@alaarab/ogrid-core';
3
3
  export { getHeaderFilterConfig, getCellRenderDescriptor, resolveCellDisplayContent, resolveCellStyle, buildInlineEditorProps, buildPopoverEditorProps, getCellInteractionProps, } from './dataGridViewModel';
4
4
  export type { HeaderFilterConfigInput, HeaderFilterConfig, CellRenderDescriptorInput, CellRenderDescriptor, CellRenderMode, CellInteractionHandlers, } from './dataGridViewModel';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alaarab/ogrid-react",
3
- "version": "2.1.7",
3
+ "version": "2.1.9",
4
4
  "description": "OGrid React – React hooks, headless components, and utilities for OGrid data grids.",
5
5
  "main": "dist/esm/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -39,7 +39,7 @@
39
39
  "node": ">=18"
40
40
  },
41
41
  "dependencies": {
42
- "@alaarab/ogrid-core": "2.1.7",
42
+ "@alaarab/ogrid-core": "2.1.9",
43
43
  "@tanstack/react-virtual": "^3.0.0"
44
44
  },
45
45
  "peerDependencies": {