[pve-devel] [PATCH manager 2/2] fix combogrid multiselect bug

Dominik Csapak d.csapak at proxmox.com
Tue Apr 26 11:32:44 CEST 2016


this fixes a nasty combogrid/multiselect/storeload bug
in which the value of a combogrid gets set to a string instead
of an array, under certain circumstances

we add a pseudo valuefield where we need, and throw an
error in the combogrid initcomponent when this specific
configuration is detected

details are in the comment in the combogrid class, above
the throw statement

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 www/manager6/form/ComboGrid.js     | 26 ++++++++++++++++++++++++++
 www/manager6/form/GroupSelector.js | 11 +++++++++--
 www/manager6/form/NodeSelector.js  | 10 ++++++++--
 3 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/www/manager6/form/ComboGrid.js b/www/manager6/form/ComboGrid.js
index 33f3059..00e9bc7 100644
--- a/www/manager6/form/ComboGrid.js
+++ b/www/manager6/form/ComboGrid.js
@@ -255,6 +255,32 @@ Ext.define('PVE.form.ComboGrid', {
             me.createPicker();
         }
 
+	if (me.multiSelect &&
+	    (me.displayField == me.valueField) &&
+	    me.store) {
+	    // warning, if this configuration is selected,
+	    // the following problem can occur:
+	    //
+	    // if the field is in an inputpanel/editwindow
+	    // there we maybe call resetOriginalValue before
+	    // our store is loaded and then we get a string
+	    // of form: "value1, value2, value3" instead of
+	    // an array
+	    //
+	    // this is because setValue of the combobox class
+	    // writes the joined array to rawvalue if displayfield
+	    // and valuefield are the same, and the store is
+	    // not yet loaded
+	    //
+	    // if we call getvalue after,
+	    // there is a test of getDisplayValue !== rawvalue
+	    // which fails (because displayvalue is "" in this case)
+	    // and sets the value to rawvalue,
+	    // which is now a string and not an array
+	    throw "warning: this configuration leads to errors";
+	}
+
+
 	me.mon(me.store, 'beforeload', function() {
 	    if (!me.isDisabled()) {
 		me.enableAfterLoad = true;
diff --git a/www/manager6/form/GroupSelector.js b/www/manager6/form/GroupSelector.js
index 8404d5f..9f2dd8f 100644
--- a/www/manager6/form/GroupSelector.js
+++ b/www/manager6/form/GroupSelector.js
@@ -5,7 +5,7 @@ Ext.define('PVE.form.GroupSelector', {
     allowBlank: false,
     autoSelect: false,
     valueField: 'groupid',
-    displayField: 'groupid',
+    displayField: 'groupname',
     listConfig: {
 	columns: [
 	    {
@@ -43,7 +43,14 @@ Ext.define('PVE.form.GroupSelector', {
 
     Ext.define('pve-groups', {
 	extend: 'Ext.data.Model',
-	fields: [ 'groupid', 'comment' ],
+	fields: [ 'groupid', 'comment',
+	    {
+		name: 'groupname',
+		calculate: function(data) {
+		    return data.groupid;
+		}
+	    }
+	],
 	proxy: {
             type: 'pve',
 	    url: "/api2/json/access/groups"
diff --git a/www/manager6/form/NodeSelector.js b/www/manager6/form/NodeSelector.js
index 8c69430..29c4437 100644
--- a/www/manager6/form/NodeSelector.js
+++ b/www/manager6/form/NodeSelector.js
@@ -14,9 +14,15 @@ Ext.define('PVE.form.NodeSelector', {
     // triggering dirtychange
     value: [],
     valueField: 'node',
-    displayField: 'node',
+    displayField: 'nodename',
     store: {
-	    fields: [ 'node', 'cpu', 'maxcpu', 'mem', 'maxmem', 'uptime' ],
+	    fields: [ 'node', 'cpu', 'maxcpu', 'mem', 'maxmem', 'uptime',
+		{
+		    name: 'nodename',
+		    calculate: function(data) {
+			return data.node;
+		}
+	    } ],
 	    proxy: {
 		type: 'pve',
 		url: '/api2/json/nodes'
-- 
2.1.4




More information about the pve-devel mailing list