diff --git a/packages/common/src/services/__tests__/resizer.service.spec.ts b/packages/common/src/services/__tests__/resizer.service.spec.ts index 664b4f058..dce4d400d 100644 --- a/packages/common/src/services/__tests__/resizer.service.spec.ts +++ b/packages/common/src/services/__tests__/resizer.service.spec.ts @@ -1,3 +1,5 @@ +/// + import { EventPubSubService } from '@slickgrid-universal/event-pub-sub'; import { afterEach, beforeEach, describe, expect, it, vi, type Mock } from 'vitest'; import { SlickEvent, type SlickDataView, type SlickGrid } from '../../core/index.js'; @@ -680,6 +682,20 @@ describe('Resizer Service', () => { expect(mockColDefs[1].width).toBe(56); // longest word "Destinee" (length 8 * charWidth(7) * ratio(0.88)) + cellPadding(6) = 55.28 ceil to => 56 }); + it('should leave the column unchanged when the DataView has no accessible items', () => { + const reRenderSpy = vi.spyOn(gridStub, 'reRenderColumns'); + const initialWidth = 120; + mockColDefs[1].width = initialWidth; + vi.spyOn(mockDataView, 'getItems').mockReturnValue([]); + + mockGridOptions.enableColumnResizeOnDoubleClick = true; + service.init(gridStub, divContainer); + gridStub.onColumnsResizeDblClick.notify({ triggeredByColumn: 'firstName', grid: gridStub }); + + expect(reRenderSpy).not.toHaveBeenCalled(); + expect(mockColDefs[1].width).toBe(initialWidth); + }); + it('should call handleSingleColumnResizeByContent when "onHeaderMenuColumnResizeByContent" gets triggered but expect a resized column width when left section width becomes greater than full viewport width', () => { const viewportLeft = document.createElement('div'); viewportLeft.className = 'slick-viewport-left'; diff --git a/packages/common/src/services/resizer.service.ts b/packages/common/src/services/resizer.service.ts index 8bbdaf6c1..0daf1ed94 100644 --- a/packages/common/src/services/resizer.service.ts +++ b/packages/common/src/services/resizer.service.ts @@ -668,6 +668,15 @@ export class ResizerService { } protected handleSingleColumnResizeByContent(columnId: string): void { + // A custom DataView might not expose all rows through getItems() (for example, a windowed + // DataView can intentionally return an empty array). In that case we cannot calculate a + // content width, so leave the current column width unchanged and let the consumer provide + // its own resize handler if it can fetch the rows asynchronously. + const dataItems = this.dataView?.getItems?.(); + if (!Array.isArray(dataItems) || dataItems.length === 0) { + return; + } + const columns = this._grid.getColumns(); const columnDefIdx = columns.findIndex((col) => col.id === columnId);