[pve-devel] [PATCH widget-toolkit 3/5] toolkit: fix #1510: don't scroll back to focus when view refreshes

Thomas Lamprecht t.lamprecht at proxmox.com
Tue Dec 19 08:16:13 CET 2017


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 at proxmox.com>
---
 Toolkit.js | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/Toolkit.js b/Toolkit.js
index 166da4d..9e37352 100644
--- a/Toolkit.js
+++ b/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', {
-- 
2.11.0





More information about the pve-devel mailing list