From af8b9fc0e7835bfab54ad745a0f07c60127257d2 Mon Sep 17 00:00:00 2001 From: Maksim Zakharov <251575087+bit-byte0@users.noreply.github.com> Date: Mon, 28 Sep 2026 02:18:11 +0400 Subject: [PATCH 1/8] fix(dataGrid): correct resize separator position for right-fixed sticky column --- .../m_sticky_columns.columns_resizer.test.ts | 98 +++++++++++++++++++ .../sticky_columns/m_sticky_columns.ts | 11 ++- 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts diff --git a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts new file mode 100644 index 000000000000..e7b141b301ad --- /dev/null +++ b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts @@ -0,0 +1,98 @@ +import { + afterEach, describe, expect, it, jest, +} from '@jest/globals'; +import type { dxElementWrapper } from '@js/core/renderer'; + +import { GridCoreStickyColumnsDom } from '../dom'; +import { stickyColumnsModule } from '../m_sticky_columns'; + +const SUPER_OFFSET = 540; +const CELL_LEFT = 419; +const NEXT_CELL_LEFT = 399; + +const { columnsResizer } = stickyColumnsModule.extenders.controllers; + +const $nextCell = { + length: 1, + offset: () => ({ left: NEXT_CELL_LEFT }), +} as unknown as dxElementWrapper; + +const $cell = { + offset: () => ({ left: CELL_LEFT }), + next: () => $nextCell, +} as unknown as dxElementWrapper; + +describe('sticky columns resizer separator offset', () => { + let superGetSeparatorOffsetX: ReturnType; + + const createController = ({ + hasStickyColumns = true, + columnResizingMode = 'nextColumn', + }: { + hasStickyColumns?: boolean; + columnResizingMode?: string; + } = {}): any => { + superGetSeparatorOffsetX = jest.fn(() => SUPER_OFFSET); + + class Base { + // eslint-disable-next-line class-methods-use-this + public getSeparatorOffsetX(...args: unknown[]): number { + return superGetSeparatorOffsetX(...args) as number; + } + } + + const Controller = columnsResizer(Base as any); + const controller = new Controller() as any; + + controller._columnHeadersView = { + hasStickyColumns: (): boolean => hasStickyColumns, + getContent: (): undefined => undefined, + }; + controller.option = (): string => columnResizingMode; + controller.addWidgetPrefix = (name: string): string => name; + + return controller; + }; + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it('returns the next column left edge when the next column is pinned to the right in nextColumn mode (T1335911)', () => { + jest.spyOn(GridCoreStickyColumnsDom, 'isFixedCellPinnedToRight') + .mockImplementation((cell) => cell === $nextCell); + + const controller = createController({ columnResizingMode: 'nextColumn' }); + + expect(controller.getSeparatorOffsetX($cell)).toBe(NEXT_CELL_LEFT); + expect(superGetSeparatorOffsetX).not.toHaveBeenCalled(); + }); + + it('returns the cell left edge for a right-pinned column in widget mode (T1335911)', () => { + jest.spyOn(GridCoreStickyColumnsDom, 'isFixedCellPinnedToRight') + .mockImplementation((cell) => cell === $cell); + + const controller = createController({ columnResizingMode: 'widget' }); + + expect(controller.getSeparatorOffsetX($cell)).toBe(CELL_LEFT); + expect(superGetSeparatorOffsetX).not.toHaveBeenCalled(); + }); + + it('falls back to the base offset when neither the cell nor its next column is pinned to the right (T1335911)', () => { + jest.spyOn(GridCoreStickyColumnsDom, 'isFixedCellPinnedToRight').mockReturnValue(false); + + const controller = createController({ columnResizingMode: 'nextColumn' }); + + expect(controller.getSeparatorOffsetX($cell)).toBe(SUPER_OFFSET); + expect(superGetSeparatorOffsetX).toHaveBeenCalledWith($cell); + }); + + it('falls back to the base offset when there are no sticky columns (T1335911)', () => { + const spy = jest.spyOn(GridCoreStickyColumnsDom, 'isFixedCellPinnedToRight'); + + const controller = createController({ hasStickyColumns: false }); + + expect(controller.getSeparatorOffsetX($cell)).toBe(SUPER_OFFSET); + expect(spy).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts index 60e76e3f355e..32ce4107bb4a 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts @@ -537,16 +537,25 @@ const columnsResizer = (Base: ModuleType) => class if (hasStickyColumns) { const $container = $(this._columnHeadersView.getContent()); + const addWidgetPrefix = this.addWidgetPrefix.bind(this); const isFixedCellPinnedToRight = GridCoreStickyColumnsDom.isFixedCellPinnedToRight( $cell, $container, - this.addWidgetPrefix.bind(this), + addWidgetPrefix, ); const isWidgetResizingMode = this.option('columnResizingMode') === 'widget'; if (isWidgetResizingMode && isFixedCellPinnedToRight) { return $cell.offset()?.left ?? 0; } + + const $nextCell = $cell.next(); + const isNextCellPinnedToRight = $nextCell.length > 0 + && GridCoreStickyColumnsDom.isFixedCellPinnedToRight($nextCell, $container, addWidgetPrefix); + + if (isNextCellPinnedToRight) { + return $nextCell.offset()?.left ?? 0; + } } return super.getSeparatorOffsetX($cell); From 9eab518bebd426010b782b0db4ea15266de48319 Mon Sep 17 00:00:00 2001 From: Maksim Zakharov <251575087+bit-byte0@users.noreply.github.com> Date: Tue, 29 Sep 2026 17:02:21 +0400 Subject: [PATCH 2/8] fix(dataGrid): resolve sticky resize separator next column by index --- .../m_columns_resizing_reordering.ts | 2 +- .../__tests__/m_sticky_columns.columns_resizer.test.ts | 8 +++++++- .../grids/grid_core/sticky_columns/m_sticky_columns.ts | 8 ++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts index e41d7c631827..d02e7d398de4 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts @@ -665,7 +665,7 @@ export class ColumnsResizerViewController extends modules.ViewController { public _targetPoint?: ColumnPoint | null; - private _resizingInfo: any; + protected _resizingInfo: any; protected _columnsController!: ColumnsController; diff --git a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts index e7b141b301ad..d0f4686af68f 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts @@ -9,6 +9,7 @@ import { stickyColumnsModule } from '../m_sticky_columns'; const SUPER_OFFSET = 540; const CELL_LEFT = 419; const NEXT_CELL_LEFT = 399; +const NEXT_COLUMN_INDEX = 4; const { columnsResizer } = stickyColumnsModule.extenders.controllers; @@ -19,9 +20,12 @@ const $nextCell = { const $cell = { offset: () => ({ left: CELL_LEFT }), - next: () => $nextCell, } as unknown as dxElementWrapper; +const columnElements = { + eq: (index: number) => (index === NEXT_COLUMN_INDEX ? $nextCell : { length: 0 }), +}; + describe('sticky columns resizer separator offset', () => { let superGetSeparatorOffsetX: ReturnType; @@ -47,7 +51,9 @@ describe('sticky columns resizer separator offset', () => { controller._columnHeadersView = { hasStickyColumns: (): boolean => hasStickyColumns, getContent: (): undefined => undefined, + getColumnElements: () => columnElements, }; + controller._resizingInfo = { nextColumnIndex: NEXT_COLUMN_INDEX }; controller.option = (): string => columnResizingMode; controller.addWidgetPrefix = (name: string): string => name; diff --git a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts index 32ce4107bb4a..32f50434d112 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts @@ -549,11 +549,11 @@ const columnsResizer = (Base: ModuleType) => class return $cell.offset()?.left ?? 0; } - const $nextCell = $cell.next(); - const isNextCellPinnedToRight = $nextCell.length > 0 - && GridCoreStickyColumnsDom.isFixedCellPinnedToRight($nextCell, $container, addWidgetPrefix); + const nextColumnIndex = this._resizingInfo?.nextColumnIndex; + const $nextCell = this._columnHeadersView.getColumnElements()?.eq(nextColumnIndex); - if (isNextCellPinnedToRight) { + if ($nextCell?.length + && GridCoreStickyColumnsDom.isFixedCellPinnedToRight($nextCell, $container, addWidgetPrefix)) { return $nextCell.offset()?.left ?? 0; } } From 7fea01d0a5332c6626a6e0e0d2ddf74959b02458 Mon Sep 17 00:00:00 2001 From: Maksim Zakharov <251575087+bit-byte0@users.noreply.github.com> Date: Wed, 30 Sep 2026 03:19:06 +0400 Subject: [PATCH 3/8] fix(dataGrid): correct resize separator for directly-resized right-fixed column --- .../m_sticky_columns.columns_resizer.test.ts | 22 ++++++++++++++++++- .../sticky_columns/m_sticky_columns.ts | 7 +++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts index d0f4686af68f..88df809b0ac2 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/__tests__/m_sticky_columns.columns_resizer.test.ts @@ -74,7 +74,17 @@ describe('sticky columns resizer separator offset', () => { expect(superGetSeparatorOffsetX).not.toHaveBeenCalled(); }); - it('returns the cell left edge for a right-pinned column in widget mode (T1335911)', () => { + it('returns the cell left edge when the resized column itself is pinned to the right in nextColumn mode (T1335911)', () => { + jest.spyOn(GridCoreStickyColumnsDom, 'isFixedCellPinnedToRight') + .mockImplementation((cell) => cell === $cell); + + const controller = createController({ columnResizingMode: 'nextColumn' }); + + expect(controller.getSeparatorOffsetX($cell)).toBe(CELL_LEFT); + expect(superGetSeparatorOffsetX).not.toHaveBeenCalled(); + }); + + it('returns the cell left edge when the resized column itself is pinned to the right in widget mode (T1335911)', () => { jest.spyOn(GridCoreStickyColumnsDom, 'isFixedCellPinnedToRight') .mockImplementation((cell) => cell === $cell); @@ -84,6 +94,16 @@ describe('sticky columns resizer separator offset', () => { expect(superGetSeparatorOffsetX).not.toHaveBeenCalled(); }); + it('falls back to the base offset when only the next column is pinned to the right in widget mode (T1335911)', () => { + jest.spyOn(GridCoreStickyColumnsDom, 'isFixedCellPinnedToRight') + .mockImplementation((cell) => cell === $nextCell); + + const controller = createController({ columnResizingMode: 'widget' }); + + expect(controller.getSeparatorOffsetX($cell)).toBe(SUPER_OFFSET); + expect(superGetSeparatorOffsetX).toHaveBeenCalledWith($cell); + }); + it('falls back to the base offset when neither the cell nor its next column is pinned to the right (T1335911)', () => { jest.spyOn(GridCoreStickyColumnsDom, 'isFixedCellPinnedToRight').mockReturnValue(false); diff --git a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts index 2bd311780db9..24ed0f09e0b7 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts @@ -543,16 +543,15 @@ const columnsResizer = (Base: ModuleType) => class $container, addWidgetPrefix, ); - const isWidgetResizingMode = this.option('columnResizingMode') === 'widget'; - - if (isWidgetResizingMode && isFixedCellPinnedToRight) { + if (isFixedCellPinnedToRight) { return $cell.offset()?.left ?? 0; } + const isWidgetResizingMode = this.option('columnResizingMode') === 'widget'; const nextColumnIndex = this._resizingInfo?.nextColumnIndex; const $nextCell = this._columnHeadersView.getColumnElements()?.eq(nextColumnIndex); - if ($nextCell?.length + if (!isWidgetResizingMode && $nextCell?.length && GridCoreStickyColumnsDom.isFixedCellPinnedToRight($nextCell, $container, addWidgetPrefix)) { return $nextCell.offset()?.left ?? 0; } From eb752db36e6a648e6c9fbe6fa92442314df78835 Mon Sep 17 00:00:00 2001 From: Maksim Zakharov <251575087+bit-byte0@users.noreply.github.com> Date: Thu, 1 Oct 2026 12:52:32 +0400 Subject: [PATCH 4/8] fix(dataGrid): constrain resize separator --- ...ns_resizing_reordering.integration.test.ts | 97 +++++++++++++++++++ .../m_columns_resizing_reordering.ts | 15 ++- .../sticky_columns/m_sticky_columns.ts | 27 ++++++ 3 files changed, 138 insertions(+), 1 deletion(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts index a7ce8c5184ea..0034e4b3c7ca 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts @@ -10,6 +10,7 @@ import type { dxElementWrapper } from '@js/core/renderer'; import $ from '@js/core/renderer'; import type DataGrid from '@js/ui/data_grid'; import errors from '@js/ui/widget/ui.errors'; +import { fire } from '@ts/__tests__/utils'; import type { DataGridModel } from '@ts/grids/data_grid/__tests__/__mock__/model/data_grid'; import { @@ -149,3 +150,99 @@ describe('Performance optimization', () => { }); }); }); + +describe('Widget column resize separator bounds (T1335911)', () => { + beforeEach(beforeTest); + afterEach(() => { + afterTest(); + jest.restoreAllMocks(); + }); + + const createResizableGrid = async (fixed: boolean): ReturnType => { + let grid: DataGrid | null = null; + const fields = ['CompanyName', 'City', 'State', 'Phone', 'Fax']; + const initialWidths = [180, 100, 100, 100, 100]; + + jest.spyOn(Element.prototype, 'getBoundingClientRect').mockImplementation(function getRect(this: Element): DOMRect { + const widths = fields.map((field, index) => Number(grid?.columnOption(field, 'width') ?? initialWidths[index])); + if (this.matches('.dx-header-row > td')) { + const index = Array.from(this.parentElement?.children ?? []).indexOf(this); + const left = fixed && index >= 3 + ? 600 - widths.slice(index).reduce((sum, width) => sum + width, 0) + : 100 + widths.slice(0, index).reduce((sum, width) => sum + width, 0); + + return new DOMRect(left, 50, widths[index], 24); + } + + return new DOMRect(100, 50, 500, 24); + }); + jest.spyOn(Element.prototype, 'getClientRects').mockImplementation(function getRects(this: Element): DOMRectList { + return [this.getBoundingClientRect()] as unknown as DOMRectList; + }); + jest.spyOn(HTMLElement.prototype, 'offsetWidth', 'get').mockImplementation(function getWidth(this: HTMLElement): number { + return this.getBoundingClientRect().width; + }); + jest.spyOn(HTMLElement.prototype, 'offsetHeight', 'get').mockReturnValue(24); + + const result = await createDataGrid({ + dataSource: [{ id: 1, City: 'Atlanta' }], + columns: fields.map((dataField, index) => ({ + dataField, + width: initialWidths[index], + fixed: fixed && index >= 3, + fixedPosition: 'right', + })), + width: 500, + height: 300, + allowColumnResizing: true, + columnResizingMode: 'widget', + }); + grid = result.instance; + result.$container.find('.dx-header-row').css('height', 24); + result.$container.find('.dx-datagrid-columns-separator').css('width', 3); + + return result; + }; + + it('keeps the separator before right-fixed columns while the resized column continues growing (T1335911)', async () => { + const { $container, instance } = await createResizableGrid(true); + const header = $container.find('.dx-header-row > td').get(1); + + fire(header, 'dxpointermove', { x: 380, y: 60, pointerType: 'mouse' }); + fire(header, 'dxpointerdown', { x: 380, y: 60, pointerType: 'mouse' }); + fire(header, 'dxpointermove', { x: 800, y: 60, pointerType: 'mouse' }); + + expect(instance.columnOption('City', 'width')).toBe(520); + expect($container.find('.dx-datagrid-columns-separator').css('left')).toBe('297px'); + + fire($container.get(0), 'dxpointermove', { x: 330, y: 60, pointerType: 'mouse' }); + + expect(instance.columnOption('City', 'width')).toBe(50); + expect($container.find('.dx-datagrid-columns-separator').css('left')).toBe('230px'); + }); + + it('keeps the entire separator inside the grid without fixed columns while the resized column continues growing (T1335911)', async () => { + const { $container, instance } = await createResizableGrid(false); + const header = $container.find('.dx-header-row > td').get(1); + + fire(header, 'dxpointermove', { x: 380, y: 60, pointerType: 'mouse' }); + fire(header, 'dxpointerdown', { x: 380, y: 60, pointerType: 'mouse' }); + fire(header, 'dxpointermove', { x: 800, y: 60, pointerType: 'mouse' }); + + expect(instance.columnOption('City', 'width')).toBe(520); + expect($container.find('.dx-datagrid-columns-separator').css('left')).toBe('497px'); + }); + + it('keeps the separator before right-fixed columns when the page scrolls horizontally during resizing (T1335911)', async () => { + const { $container, instance } = await createResizableGrid(true); + const header = $container.find('.dx-header-row > td').get(1); + + fire(header, 'dxpointermove', { x: 380, y: 60, pointerType: 'mouse' }); + fire(header, 'dxpointerdown', { x: 380, y: 60, pointerType: 'mouse' }); + jest.replaceProperty(window, 'pageXOffset', 120); + fire(header, 'dxpointermove', { x: 800, y: 60, pointerType: 'mouse' }); + + expect(instance.columnOption('City', 'width')).toBe(520); + expect($container.find('.dx-datagrid-columns-separator').css('left')).toBe('297px'); + }); +}); diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts index d02e7d398de4..fa0508af3739 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.ts @@ -15,6 +15,7 @@ import type { Callback } from '@js/core/utils/callbacks'; import Callbacks from '@js/core/utils/callbacks'; import { extend } from '@js/core/utils/extend'; import { each } from '@js/core/utils/iterator'; +import { fitIntoRange } from '@js/core/utils/math'; import { getBoundingRect } from '@js/core/utils/position'; import { getHeight, getWidth, @@ -815,6 +816,12 @@ export class ColumnsResizerViewController extends modules.ViewController { return cellOffset + ((isNextColumnMode || isRtlParentStyle) && rtlEnabled ? 0 : outerWidth); } + protected getSeparatorBounds(): { left: number; right: number } { + const left = this._$parentContainer.offset()?.left ?? 0; + + return { left, right: left + getWidth(this._$parentContainer) }; + } + private _moveSeparator(args) { const e = args.event; const that = e.data; @@ -833,7 +840,13 @@ export class ColumnsResizerViewController extends modules.ViewController { const $cell = that._columnHeadersView.getColumnElements().eq(that._resizingInfo.currentColumnIndex); if ($cell.length) { - const offsetX = this.getSeparatorOffsetX($cell); + let offsetX = this.getSeparatorOffsetX($cell); + + if (!isNextColumnMode) { + const { left, right } = this.getSeparatorBounds(); + + offsetX = fitIntoRange(offsetX, left, Math.max(left, right - columnsSeparatorWidth)); + } that._columnsSeparatorView.moveByX(offsetX); that._tablePositionController.update(that._targetPoint.y); diff --git a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts index 24ed0f09e0b7..657258bc7d39 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts @@ -531,6 +531,33 @@ const footerView = ( ) => class FooterViewStickyColumnsExtender extends baseStickyColumns(Base) {}; const columnsResizer = (Base: ModuleType) => class ColumnResizerStickyColumnsExtender extends Base { + protected getSeparatorBounds(): { left: number; right: number } { + const bounds = super.getSeparatorBounds(); + + if (this.option('columnFixing.legacyMode') === true + || !this._columnsController.getStickyColumns().length) { + return bounds; + } + + const $cells = this._columnHeadersView.getColumnElements(); + const $cell = $cells?.eq(this._resizingInfo.currentColumnIndex); + const addWidgetPrefix = this.addWidgetPrefix.bind(this); + + if (!$cells || !$cell?.length || GridCoreStickyColumnsDom.isFixedCell($cell, addWidgetPrefix)) { + return bounds; + } + + const $container = $(this._columnHeadersView.getContent()); + const { left, right } = GridCoreStickyColumnsDom + .getNonFixedAreaBoundingRect($cells, $container, addWidgetPrefix); + const offsetLeft = ($container.offset()?.left ?? 0) - getBoundingRect($container.get(0)).left; + + return { + left: Math.max(bounds.left, left + offsetLeft), + right: Math.min(bounds.right, right + offsetLeft), + }; + } + protected getSeparatorOffsetX($cell: dxElementWrapper): number { // @ts-expect-error const hasStickyColumns = this._columnHeadersView?.hasStickyColumns(); From f60ac1e9c67190945e1ff5d87effb4b8c7e38095 Mon Sep 17 00:00:00 2001 From: Maksim Zakharov <251575087+bit-byte0@users.noreply.github.com> Date: Thu, 1 Oct 2026 12:53:04 +0400 Subject: [PATCH 5/8] fix(dataGrid): preserve scroll during measurement --- .../columns_view.integration.test.ts | 58 ++++++++++++++++++- .../grids/grid_core/views/m_grid_view.ts | 21 +++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/views/__tests__/columns_view.integration.test.ts b/packages/devextreme/js/__internal/grids/grid_core/views/__tests__/columns_view.integration.test.ts index a9046fe27ade..999b1ac06b15 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/views/__tests__/columns_view.integration.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/views/__tests__/columns_view.integration.test.ts @@ -1,5 +1,5 @@ import { - afterEach, beforeEach, describe, expect, it, + afterEach, beforeEach, describe, expect, it, jest, } from '@jest/globals'; import { @@ -8,6 +8,62 @@ import { const SCROLLER_SPACING_CLASS = 'dx-datagrid-scroller-spacing'; +describe('ColumnsView scroll preservation (T1335911)', () => { + beforeEach(() => { + beforeTest(); + }); + + afterEach(() => { + afterTest(); + jest.restoreAllMocks(); + }); + + it.each([true, false])('preserves header and footer scroll during auto-width measurement with rtlEnabled=%s (T1335911)', async (rtlEnabled) => { + jest.spyOn(HTMLElement.prototype, 'offsetWidth', 'get').mockReturnValue(500); + jest.spyOn(HTMLElement.prototype, 'offsetHeight', 'get').mockReturnValue(24); + const { $container, instance } = await createDataGrid({ + dataSource: [{ + id: 1, City: 'Atlanta', Phone: '123', Fax: '456', + }], + columns: ['City', { + dataField: 'Phone', fixed: true, fixedPosition: 'right', + }, { + dataField: 'Fax', fixed: true, fixedPosition: 'right', + }], + columnWidth: 'auto', + rtlEnabled, + width: 500, + summary: { totalItems: [{ column: 'City', summaryType: 'count' }] }, + }); + const header = $container.find('.dx-datagrid-headers .dx-datagrid-scroll-container').get(0) as HTMLElement; + const footer = $container.find('.dx-datagrid-total-footer .dx-datagrid-scroll-container').get(0) as HTMLElement; + const scrollLeft = rtlEnabled ? -50 : 50; + header.scrollLeft = scrollLeft; + footer.scrollLeft = scrollLeft; + const { appendChild } = Node.prototype; + let measured = false; + jest.spyOn(Node.prototype, 'appendChild').mockImplementation(function append(this: Node, child: T): T { + const isHeader = child instanceof HTMLElement && !!child.querySelector('.dx-header-row'); + const result = appendChild.call(this, child) as T; + if (isHeader && this instanceof HTMLElement && this.closest('.dx-datagrid-rowsview')) { + measured = true; + header.scrollLeft = 0; + footer.scrollLeft = 0; + header.dispatchEvent(new Event('scroll')); + footer.dispatchEvent(new Event('scroll')); + } + return result; + }); + + instance.updateDimensions(); + jest.runAllTimers(); + + expect(measured).toBe(true); + expect(header.scrollLeft).toBe(scrollLeft); + expect(footer.scrollLeft).toBe(scrollLeft); + }); +}); + describe('ColumnsView scroller spacing (T1306973)', () => { beforeEach(() => { beforeTest(); diff --git a/packages/devextreme/js/__internal/grids/grid_core/views/m_grid_view.ts b/packages/devextreme/js/__internal/grids/grid_core/views/m_grid_view.ts index c30560361fd2..931669fc2ee5 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/views/m_grid_view.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/views/m_grid_view.ts @@ -131,6 +131,8 @@ export class ResizingController extends modules.ViewController { private isMaxWidthSet = false; + public isMeasuringColumns = false; + protected callbackNames() { return ['resizeCompleted']; } @@ -395,6 +397,14 @@ export class ResizingController extends modules.ViewController { const hasUndefinedColumnWidth = visibleColumns.some((column) => !isDefined(column.width)); const needBestFit = this._needBestFit() || visibleColumns.some((column) => column.width === 'auto'); const hasMinWidth = visibleColumns.some((column) => !!column.minWidth); + const scrollPositions = needBestFit + ? [this._columnHeadersView, this._footerView].map((view) => { + const $content = view?.getContent(); + return { $content, left: $content?.scrollLeft() }; + }) + : []; + + this.isMeasuringColumns = needBestFit; this._toggleContentMinHeight(this._hasHeight); // T1047239, T1270354 this._setVisibleWidths(visibleColumns, []); @@ -445,6 +455,13 @@ export class ResizingController extends modules.ViewController { } this._toggleContentMinHeight(false); + + scrollPositions.forEach(({ $content, left }) => { + if (isDefined(left)) { + $content?.scrollLeft(left); + } + }); + this.isMeasuringColumns = false; }); }); } @@ -896,6 +913,10 @@ export class ResizingController extends modules.ViewController { export class SynchronizeScrollingController extends modules.ViewController { private _scrollChangedHandler(views, pos, viewName) { + if (this.getController('resizing').isMeasuringColumns) { + return; + } + for (let j = 0; j < views.length; j++) { if (views[j] && views[j].name !== viewName) { views[j].scrollTo({ left: pos.left, top: pos.top }); From 3205e6abfc402b436d01d18fc9a603984e495e0d Mon Sep 17 00:00:00 2001 From: Maksim Zakharov <251575087+bit-byte0@users.noreply.github.com> Date: Thu, 1 Oct 2026 13:16:20 +0400 Subject: [PATCH 6/8] fix(dataGrid): ensure release compatibility --- ...olumns_resizing_reordering.integration.test.ts | 15 +++++++++++++-- .../grids/grid_core/views/m_grid_view.ts | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts index 0034e4b3c7ca..a38dbb4deaec 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts @@ -162,6 +162,17 @@ describe('Widget column resize separator bounds (T1335911)', () => { let grid: DataGrid | null = null; const fields = ['CompanyName', 'City', 'State', 'Phone', 'Fax']; const initialWidths = [180, 100, 100, 100, 100]; + const createRect = (left: number, width: number): DOMRect => ({ + x: left, + y: 50, + width, + height: 24, + top: 50, + right: left + width, + bottom: 74, + left, + toJSON: () => ({}), + }); jest.spyOn(Element.prototype, 'getBoundingClientRect').mockImplementation(function getRect(this: Element): DOMRect { const widths = fields.map((field, index) => Number(grid?.columnOption(field, 'width') ?? initialWidths[index])); @@ -171,10 +182,10 @@ describe('Widget column resize separator bounds (T1335911)', () => { ? 600 - widths.slice(index).reduce((sum, width) => sum + width, 0) : 100 + widths.slice(0, index).reduce((sum, width) => sum + width, 0); - return new DOMRect(left, 50, widths[index], 24); + return createRect(left, widths[index]); } - return new DOMRect(100, 50, 500, 24); + return createRect(100, 500); }); jest.spyOn(Element.prototype, 'getClientRects').mockImplementation(function getRects(this: Element): DOMRectList { return [this.getBoundingClientRect()] as unknown as DOMRectList; diff --git a/packages/devextreme/js/__internal/grids/grid_core/views/m_grid_view.ts b/packages/devextreme/js/__internal/grids/grid_core/views/m_grid_view.ts index 931669fc2ee5..5bd83cdf0efd 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/views/m_grid_view.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/views/m_grid_view.ts @@ -404,7 +404,7 @@ export class ResizingController extends modules.ViewController { }) : []; - this.isMeasuringColumns = needBestFit; + this.isMeasuringColumns = !!needBestFit; this._toggleContentMinHeight(this._hasHeight); // T1047239, T1270354 this._setVisibleWidths(visibleColumns, []); From 09a0e824f541bf33e145614cb036b2cc68ff5450 Mon Sep 17 00:00:00 2001 From: Maksim Zakharov <251575087+bit-byte0@users.noreply.github.com> Date: Thu, 1 Oct 2026 14:23:54 +0400 Subject: [PATCH 7/8] test(dataGrid): update resize separator baselines --- ...de_and_rtl_=_true) (fluent.blue.light).png | Bin 25578 -> 25645 bytes ...de_and_rtl_=_true) (fluent.blue.light).png | Bin 25555 -> 25624 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/separator_position_with_fixed_column_on_right_(widget_mode_and_rtl_=_true) (fluent.blue.light).png b/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/separator_position_with_fixed_column_on_right_(widget_mode_and_rtl_=_true) (fluent.blue.light).png index 13fc39f64c44a1ad936457edc874a843c1c91e0f..01be66ad2a653de213328564c05307031e4cdd83 100644 GIT binary patch literal 25645 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 literal 25578 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 diff --git a/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/separator_position_with_window_scroll_top_(widget_mode_and_rtl_=_true) (fluent.blue.light).png b/e2e/testcafe-devextreme/tests/dataGrid/sticky/common/etalons/separator_position_with_window_scroll_top_(widget_mode_and_rtl_=_true) (fluent.blue.light).png index 92b8d98914345fb2a061c390b0c268aac0ea0969..31c99e47093ac48a979423ee04ed9872caf92ae3 100644 GIT binary patch literal 25624 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 literal 25555 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 Y@%-X`6S+X}XC2Ed_E_yM+vOJZ2b1qQ761SM From 348ed93080634f36b9f87fb0664b40b0d1a6244f Mon Sep 17 00:00:00 2001 From: Maksim Zakharov <251575087+bit-byte0@users.noreply.github.com> Date: Thu, 1 Oct 2026 18:40:44 +0400 Subject: [PATCH 8/8] fix(dataGrid): align adjacent fixed separator --- ...ns_resizing_reordering.integration.test.ts | 28 +++++++++++++++++-- .../sticky_columns/m_sticky_columns.ts | 20 +++++++++---- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts index a38dbb4deaec..27de5edfc99e 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering.integration.test.ts @@ -151,14 +151,17 @@ describe('Performance optimization', () => { }); }); -describe('Widget column resize separator bounds (T1335911)', () => { +describe('Column resize separator bounds (T1335911)', () => { beforeEach(beforeTest); afterEach(() => { afterTest(); jest.restoreAllMocks(); }); - const createResizableGrid = async (fixed: boolean): ReturnType => { + const createResizableGrid = async ( + fixed: boolean, + columnResizingMode: 'widget' | 'nextColumn' = 'widget', + ): ReturnType => { let grid: DataGrid | null = null; const fields = ['CompanyName', 'City', 'State', 'Phone', 'Fax']; const initialWidths = [180, 100, 100, 100, 100]; @@ -206,7 +209,7 @@ describe('Widget column resize separator bounds (T1335911)', () => { width: 500, height: 300, allowColumnResizing: true, - columnResizingMode: 'widget', + columnResizingMode, }); grid = result.instance; result.$container.find('.dx-header-row').css('height', 24); @@ -215,6 +218,25 @@ describe('Widget column resize separator bounds (T1335911)', () => { return result; }; + it('keeps the separator between adjacent right-fixed columns in nextColumn mode (T1335911)', async () => { + const { $container, instance } = await createResizableGrid(true, 'nextColumn'); + const header = $container.find('.dx-header-row > td').get(3); + + fire(header, 'dxpointermove', { x: 500, y: 60, pointerType: 'mouse' }); + fire(header, 'dxpointerdown', { x: 500, y: 60, pointerType: 'mouse' }); + fire(header, 'dxpointermove', { x: 470, y: 60, pointerType: 'mouse' }); + + expect(instance.columnOption('Phone', 'width')).toBe(70); + expect(instance.columnOption('Fax', 'width')).toBe(130); + expect($container.find('.dx-datagrid-columns-separator').css('left')).toBe('370px'); + + fire($container.get(0), 'dxpointermove', { x: 530, y: 60, pointerType: 'mouse' }); + + expect(instance.columnOption('Phone', 'width')).toBe(130); + expect(instance.columnOption('Fax', 'width')).toBe(70); + expect($container.find('.dx-datagrid-columns-separator').css('left')).toBe('430px'); + }); + it('keeps the separator before right-fixed columns while the resized column continues growing (T1335911)', async () => { const { $container, instance } = await createResizableGrid(true); const header = $container.find('.dx-header-row > td').get(1); diff --git a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts index 657258bc7d39..679987e87132 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/sticky_columns/m_sticky_columns.ts @@ -570,16 +570,24 @@ const columnsResizer = (Base: ModuleType) => class $container, addWidgetPrefix, ); - if (isFixedCellPinnedToRight) { - return $cell.offset()?.left ?? 0; - } - const isWidgetResizingMode = this.option('columnResizingMode') === 'widget'; const nextColumnIndex = this._resizingInfo?.nextColumnIndex; const $nextCell = this._columnHeadersView.getColumnElements()?.eq(nextColumnIndex); + const isNextCellPinnedToRight = !isWidgetResizingMode + && $nextCell !== undefined && $nextCell.length > 0 + && GridCoreStickyColumnsDom.isFixedCellPinnedToRight( + $nextCell, + $container, + addWidgetPrefix, + ); + + if (isFixedCellPinnedToRight) { + return isNextCellPinnedToRight + ? super.getSeparatorOffsetX($cell) + : $cell.offset()?.left ?? 0; + } - if (!isWidgetResizingMode && $nextCell?.length - && GridCoreStickyColumnsDom.isFixedCellPinnedToRight($nextCell, $container, addWidgetPrefix)) { + if (isNextCellPinnedToRight) { return $nextCell.offset()?.left ?? 0; } }