[pve-devel] [PATCH manager] fix #1510: do not scroll back to focus when view gets refreshed

Thomas Lamprecht t.lamprecht at proxmox.com
Mon Oct 2 14:53:03 CEST 2017


Seems to works good, the small code change you made to the
original function looks also good to me:

Reviewed-by: Thomas Lamprecht <t.lamprecht at proxmox.com>

On 09/29/2017 12:51 PM, Dominik Csapak wrote:
> this adds a workaround, so that we restore the scroll position
> when we restore the focus
> 
> with the flag 'jumpToFocus', we can enable the old behaviour
> 
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> the code is copied from view/Table.js and
> only the part before navModel.setPosition and after
> is relevant
>  www/manager6/Toolkit.js | 74 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 74 insertions(+)
> 
> diff --git a/www/manager6/Toolkit.js b/www/manager6/Toolkit.js
> index bb6c26ce..ec25e7cd 100644
> --- a/www/manager6/Toolkit.js
> +++ b/www/manager6/Toolkit.js
> @@ -205,6 +205,80 @@ Ext.define('PVE.form.ComboBox', {
>      }
>  });
>  
> +// when refreshing the view of a grid/tree
> +// the restoring of the focus brings the
> +// focused item back in the view, even when we scrolled away
> +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;
> +

Maybe noteworthy that only this:
> +			// we sometimes want to scroll back to where we were
> +			var x = me.getScrollX();
> +			var y = me.getScrollY();

(this not)
> +
> +                        // Pass "preventNavigation" as true so that that does not cause selection.
> +                        navModel.setPosition(focusPosition, null, null, null, true);
> +

and this:
> +			if (!me.jumpToFocus) {
> +			    me.scrollTo(x,y);
> +			}

parts are new here, the rest stayed the same as in the original method.

> +                    }
> +                }
> +                // 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('PVE.Datepicker', {
> 




More information about the pve-devel mailing list