]> git.proxmox.com Git - pve-manager-legacy.git/commitdiff
ui: guest selector: improve set/getValue handling during store load
authorDominik Csapak <d.csapak@proxmox.com>
Mon, 6 Mar 2023 14:23:30 +0000 (15:23 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Sat, 11 Mar 2023 17:47:34 +0000 (18:47 +0100)
When one calls setValue or getValue during a store load, the store
might be empty or incomplete, so defer the selection after the load
and cache the value for getValue invocations until the store is
loaded

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
www/manager6/form/VMSelector.js

index d80a21ec089ddf847b113e71d81c7dc290ef6348..bb670f9302bc61352534337fd6bfa1456f169b7f 100644 (file)
@@ -117,6 +117,9 @@ Ext.define('PVE.form.VMSelector', {
 
     getValue: function() {
        var me = this;
+       if (me.savedValue !== undefined) {
+           return me.savedValue;
+       }
        var sm = me.getSelectionModel();
        var selection = sm.getSelection();
        var values = [];
@@ -130,6 +133,20 @@ Ext.define('PVE.form.VMSelector', {
        return values;
     },
 
+    setValueSelection: function(value) {
+       let me = this;
+
+       let store = me.getStore();
+       let selection = value.map(item => store.findRecord('vmid', item, 0, false, true, true)).filter(r => r);
+
+       let sm = me.getSelectionModel();
+       if (selection.length) {
+           sm.select(selection);
+       } else {
+           sm.deselectAll();
+       }
+    },
+
     setValue: function(value) {
        let me = this;
        if (!Ext.isArray(value)) {
@@ -137,10 +154,15 @@ Ext.define('PVE.form.VMSelector', {
        }
 
        let store = me.getStore();
-       let selection = value.map(item => store.findRecord('vmid', item, 0, false, true, true)).filter(r => r);
-
-       me.getSelectionModel().select(selection);
-
+       if (!store.isLoaded()) {
+           me.savedValue = value;
+           store.on('load', function() {
+               me.setValueSelection(value);
+               delete me.savedValue;
+           }, { single: true });
+       } else {
+           me.setValueSelection(value);
+       }
        return me.mixins.field.setValue.call(me, value);
     },