mirror of
https://git.proxmox.com/git/proxmox-widget-toolkit
synced 2025-05-09 06:22:05 +00:00
toolkit: fix #1510: don't scroll back to focus when view refreshes
adds a workaround, so that we restore the scroll position when we restore the focus. Fixies an annoying issue where, if a user had an ellemtn selected, scrolled down and then a store refresh re-rendered the view it was scrolled back to the selected item and the user lost his scrolling position. Add also the 'jumpToFocus' flag to allow enabling the old behaviour commit e6f2a94f4fff3c125e8406a21d8d6159aca1421e from pve-manager Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
3c15824972
commit
47d1c80c37
73
Toolkit.js
73
Toolkit.js
@ -213,6 +213,79 @@ Ext.define('Proxmox.form.ComboBox', {
|
||||
}
|
||||
});
|
||||
|
||||
// when refreshing a grid/tree view, restoring the focus moves the view back to
|
||||
// the previously focused item. Save scroll position before refocusing.
|
||||
Ext.define(null, {
|
||||
override: 'Ext.view.Table',
|
||||
|
||||
jumpToFocus: false,
|
||||
|
||||
saveFocusState: function() {
|
||||
var me = this,
|
||||
store = me.dataSource,
|
||||
actionableMode = me.actionableMode,
|
||||
navModel = me.getNavigationModel(),
|
||||
focusPosition = actionableMode ? me.actionPosition : navModel.getPosition(true),
|
||||
refocusRow, refocusCol;
|
||||
|
||||
if (focusPosition) {
|
||||
// Separate this from the instance that the nav model is using.
|
||||
focusPosition = focusPosition.clone();
|
||||
|
||||
// Exit actionable mode.
|
||||
// We must inform any Actionables that they must relinquish control.
|
||||
// Tabbability must be reset.
|
||||
if (actionableMode) {
|
||||
me.ownerGrid.setActionableMode(false);
|
||||
}
|
||||
|
||||
// Blur the focused descendant, but do not trigger focusLeave.
|
||||
me.el.dom.focus();
|
||||
|
||||
// Exiting actionable mode navigates to the owning cell, so in either focus mode we must
|
||||
// clear the navigation position
|
||||
navModel.setPosition();
|
||||
|
||||
// The following function will attempt to refocus back in the same mode to the same cell
|
||||
// as it was at before based upon the previous record (if it's still inthe store), or the row index.
|
||||
return function() {
|
||||
// If we still have data, attempt to refocus in the same mode.
|
||||
if (store.getCount()) {
|
||||
|
||||
// Adjust expectations of where we are able to refocus according to what kind of destruction
|
||||
// might have been wrought on this view's DOM during focus save.
|
||||
refocusRow = Math.min(focusPosition.rowIdx, me.all.getCount() - 1);
|
||||
refocusCol = Math.min(focusPosition.colIdx, me.getVisibleColumnManager().getColumns().length - 1);
|
||||
focusPosition = new Ext.grid.CellContext(me).setPosition(
|
||||
store.contains(focusPosition.record) ? focusPosition.record : refocusRow, refocusCol);
|
||||
|
||||
if (actionableMode) {
|
||||
me.ownerGrid.setActionableMode(true, focusPosition);
|
||||
} else {
|
||||
me.cellFocused = true;
|
||||
|
||||
// we sometimes want to scroll back to where we were
|
||||
var x = me.getScrollX();
|
||||
var y = me.getScrollY();
|
||||
|
||||
// Pass "preventNavigation" as true so that that does not cause selection.
|
||||
navModel.setPosition(focusPosition, null, null, null, true);
|
||||
|
||||
if (!me.jumpToFocus) {
|
||||
me.scrollTo(x,y);
|
||||
}
|
||||
}
|
||||
}
|
||||
// No rows - focus associated column header
|
||||
else {
|
||||
focusPosition.column.focus();
|
||||
}
|
||||
};
|
||||
}
|
||||
return Ext.emptyFn;
|
||||
}
|
||||
});
|
||||
|
||||
// should be fixed with ExtJS 6.0.2, see:
|
||||
// https://www.sencha.com/forum/showthread.php?307244-Bug-with-datefield-in-window-with-scroll
|
||||
Ext.define('Proxmox.Datepicker', {
|
||||
|
Loading…
Reference in New Issue
Block a user