diff --git a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts index 58ffb026ab32..6868e9738923 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/data_controller/m_data_controller.ts @@ -29,41 +29,6 @@ import gridCoreUtils from '../m_utils'; import type { VirtualScrollController } from '../virtual_scrolling/m_virtual_scrolling_core'; import { DataHelperMixin } from './m_data_helper_mixin'; -const changePaging = function (that, optionName, value) { - const dataSource = that._dataSource; - - if (dataSource) { - if (value !== undefined) { - const oldValue = that._getPagingOptionValue(optionName); - if (oldValue !== value) { - if (optionName === 'pageSize') { - dataSource.pageIndex(0); - } - dataSource[optionName](value); - - that._skipProcessingPagingChange = true; - that.option(`paging.${optionName}`, value); - that._skipProcessingPagingChange = false; - const pageIndex = dataSource.pageIndex(); - that._isPaging = optionName === 'pageIndex'; - return dataSource[optionName === 'pageIndex' ? 'load' : 'reload']() - .done(() => { - that._isPaging = false; - that.pageChanged.fire(pageIndex); - }); - } - return Deferred().resolve().promise(); - } - return dataSource[optionName](); - } - - if (optionName === 'pageIndex' && value !== undefined) { - return Deferred().resolve().promise(); - } - - return 0; -}; - interface HandleDataChangedArguments { changeType?: 'refresh' | 'update' | 'loadError'; isDelayed?: boolean; @@ -110,7 +75,7 @@ export class DataController extends DataHelperMixin(modules.Controller) { protected _changes!: any[]; - private readonly _skipProcessingPagingChange: boolean | undefined; + private _skipProcessingPagingChange: boolean | undefined; private _useSortingGroupingFromColumns: boolean | undefined; @@ -1598,15 +1563,51 @@ export class DataController extends DataHelperMixin(modules.Controller) { return result; } + protected changePaging(optionName, value) { + const dataSource = this._dataSource; + + if (dataSource) { + if (value !== undefined) { + const oldValue = this._getPagingOptionValue(optionName); + if (oldValue !== value) { + if (optionName === 'pageSize') { + dataSource.pageIndex(0); + } + dataSource[optionName](value); + + this._skipProcessingPagingChange = true; + // @ts-expect-error + this.option(`paging.${optionName}`, value); + this._skipProcessingPagingChange = false; + const pageIndex = dataSource.pageIndex(); + this._isPaging = optionName === 'pageIndex'; + return dataSource[optionName === 'pageIndex' ? 'load' : 'reload']() + .done(() => { + this._isPaging = false; + this.pageChanged.fire(pageIndex); + }); + } + return Deferred().resolve().promise(); + } + return dataSource[optionName](); + } + + if (optionName === 'pageIndex' && value !== undefined) { + return Deferred().resolve().promise(); + } + + return 0; + } + /** * @extended: virtual_scrolling */ public pageIndex(value?) { - return changePaging(this, 'pageIndex', value); + return this.changePaging('pageIndex', value); } public pageSize(value?) { - return changePaging(this, 'pageSize', value); + return this.changePaging('pageSize', value); } private beginCustomLoading(messageText) { diff --git a/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling.ts b/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling.ts index e4253eea2839..8a30d0bd060e 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling.ts @@ -462,6 +462,32 @@ export const data = (Base: ModuleType) => class VirtualScrolling private _itemCount: any; + protected changePaging(optionName, value) { + if (value !== undefined && (isVirtualMode(this) || isAppendMode(this))) { + let scrollPosition = 0; + const pageSize = this._dataSource.pageSize() ?? 0; + const itemSize = this + .getItemSize(); + const itemSizes = this + .getItemSizes(); + const pageIndex = optionName === 'pageIndex' ? value : 0; + const itemIndex = pageIndex * pageSize; + + scrollPosition = itemIndex * itemSize; + + for (const index in itemSizes) { + // eslint-disable-next-line radix + if (parseInt(index) < itemIndex) { + scrollPosition += itemSizes[index] - itemSize; + } + } + + this._rowsScrollController?.setViewportItemIndexByScrollPosition(scrollPosition); + } + + return super.changePaging(optionName, value); + } + public dispose() { const rowsScrollController = this._rowsScrollController; diff --git a/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling_core.ts b/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling_core.ts index 6126c458ccc9..247cc266eac4 100644 --- a/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling_core.ts +++ b/packages/devextreme/js/__internal/grids/grid_core/virtual_scrolling/m_virtual_scrolling_core.ts @@ -266,6 +266,14 @@ class VirtualScrollController { return this._isScrollingBack; } + public setViewportItemIndexByScrollPosition(position) { + this._position = position; + + const itemIndex = this.getItemIndexByPosition(); + + this.setViewportItemIndex(itemIndex); + } + private _setViewportPositionCore(position) { const prevPosition = this._position || 0; this._position = position; diff --git a/packages/devextreme/playground/T1220800_1.html b/packages/devextreme/playground/T1220800_1.html new file mode 100644 index 000000000000..f24876176ca2 --- /dev/null +++ b/packages/devextreme/playground/T1220800_1.html @@ -0,0 +1,126 @@ + + + + DevExtreme jQuery Example + + + + + + + + + + + + + + + + + + + +
+

Test header

+ + +
+
+
+ +
+ + diff --git a/packages/devextreme/playground/T1220800_2.html b/packages/devextreme/playground/T1220800_2.html new file mode 100644 index 000000000000..d52e1b8e10ac --- /dev/null +++ b/packages/devextreme/playground/T1220800_2.html @@ -0,0 +1,135 @@ + + + + DevExtreme jQuery Example + + + + + + + + + + + + + + + + + + + +
+

Test header

+ + +
+
+
+
+ +
+ + diff --git a/packages/devextreme/playground/T1267691.html b/packages/devextreme/playground/T1267691.html new file mode 100644 index 000000000000..c381869d4668 --- /dev/null +++ b/packages/devextreme/playground/T1267691.html @@ -0,0 +1,128 @@ + + + + DevExtreme jQuery Example + + + + + + + + + + + + + + + + + + + + +
+

Test header

+ + +
+ +
+

+
+ +
+ +