[pve-devel] [PATCH manager v2 2/2] ha/groups: allow editing node priorities through UI

Dominik Csapak d.csapak at proxmox.com
Thu Oct 6 09:39:16 CEST 2016


both patches look good to me

On 10/05/2016 11:09 AM, Thomas Lamprecht wrote:
> This allows the setting and editing node priorities in HA groups.
>
> Also fixes the bug where the priorities of an existing group (e.g.
> set through the CLI) where deleted when editing said group through
> the GUI.
>
> Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
> ---
>
> changes since v1:
> * use getWidgetRecord() instead of up.find()
> * set sane maximum value for priority numberfield (1000)
> * remove insideUpdate "lock" and just suspend the change event when updating
>   the hidden nodefield to avoid an endless recursion
> * the hidden nodefiled stays as it is without it we have to hack the form
>   falidation and dirty tracking ourself, which is not nice
>
> Note: it seems ExtJS has a bug with focusing numberfields in widgetcolumns.
> You cannot click directly in the widget field and edit it, you have to use
> the spinner buttons first, then the focus works. I saw this as a minor
> problem as the user may a) click on the spinner as work around b) only use
> the spinners
>
>  www/manager6/ha/GroupEdit.js | 146 +++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 133 insertions(+), 13 deletions(-)
>
> diff --git a/www/manager6/ha/GroupEdit.js b/www/manager6/ha/GroupEdit.js
> index 0d9c3c5..4032ae2 100644
> --- a/www/manager6/ha/GroupEdit.js
> +++ b/www/manager6/ha/GroupEdit.js
> @@ -16,6 +16,136 @@ Ext.define('PVE.ha.GroupInputPanel', {
>      initComponent : function() {
>  	var me = this;
>
> +	var sm = Ext.create('Ext.selection.CheckboxModel', {
> +	    mode: 'SIMPLE',
> +	    listeners: {
> +		selectionchange: function(model, selected) {
> +		    update_nodefield(selected);
> +		}
> +	    }
> +	});
> +
> +	// use already cached data to avoid an API call
> +	var data = PVE.data.ResourceStore.getNodes();
> +
> +	var store = Ext.create('Ext.data.Store', {
> +	    fields: [ 'node', 'mem', 'cpu', 'priority' ],
> +	    data: data,
> +	    proxy: {
> +		type: 'memory',
> +		reader: {type: 'json'}
> +	    },
> +	    sorters: [
> +		{
> +		    property : 'node',
> +		    direction: 'ASC'
> +		}
> +	    ]
> +	});
> +
> +	nodegrid = Ext.createWidget('grid', {
> +	    store: store,
> +	    border: true,
> +	    height: 300,
> +	    selModel: sm,
> +	    columns: [
> +		{
> +		    header: gettext('Node'),
> +		    flex: 1,
> +		    dataIndex: 'node'
> +		},
> +		{
> +		    header: gettext('Memory usage') + " %",
> +		    renderer: PVE.Utils.render_mem_usage_percent,
> +		    sortable: true,
> +		    width: 150,
> +		    dataIndex: 'mem'
> +		},
> +		{
> +		    header: gettext('CPU usage'),
> +		    renderer: PVE.Utils.render_cpu,
> +		    sortable: true,
> +		    width: 150,
> +		    dataIndex: 'cpu'
> +		},
> +		{
> +		    header: 'Priority',
> +		    xtype: 'widgetcolumn',
> +		    dataIndex: 'priority',
> +		    sortable: true,
> +		    stopSelection: true,
> +		    widget: {
> +			xtype: 'numberfield',
> +			minValue: 0,
> +			maxValue: 1000,
> +			listeners: {
> +			    change: function(numberfield, value, old_value) {
> +				var record = numberfield.getWidgetRecord();
> +				record.set('priority', value);
> +				update_nodefield(sm.getSelection());
> +			    }
> +			}
> +		    }
> +		}
> +	    ]
> +	});
> +
> +	var nodefield = Ext.create('Ext.form.field.Hidden', {
> +	    name: 'nodes',
> +	    value: '',
> +	    listeners: {
> +		change: function (nodefield, value) {
> +		    update_node_selection(value);
> +		}
> +	    },
> +	    isValid: function () {
> +		var value = nodefield.getValue();
> +		return (value && 0 !== value.length);
> +	    }
> +	});
> +
> +	var update_node_selection = function(string) {
> +	    sm.deselectAll(true);
> +
> +	    string.split(',').forEach(function (e, idx, array) {
> +		res = e.split(':');
> +
> +		store.each(function(record) {
> +		    node = record.get('node');
> +
> +		    if (node == res[0]) {
> +			sm.select(record, true);
> +			record.set('priority', res[1]);
> +			record.commit();
> +		    }
> +		});
> +	    });
> +	    nodegrid.reconfigure(store);
> +
> +	};
> +
> +	var update_nodefield = function(selected) {
> +	    var nodes = '';
> +	    var first_iteration = true;
> +	    Ext.Array.each(selected, function(record) {
> +		if (!first_iteration) {
> +		    nodes += ',';
> +		}
> +		first_iteration = false;
> +
> +		nodes += record.data.node;
> +		if (record.data.priority) {
> +		    nodes += ':' + record.data.priority;
> +		}
> +	    });
> +
> +	    // nodefield change listener calls us again, which results in a
> +	    // endless recursion, suspend the event temporary to avoid this
> +	    nodefield.suspendEvent('change');
> +	    nodefield.setValue(nodes);
> +	    nodefield.resumeEvent('change');
> +	}
> +
>  	me.column1 = [
>  	    {
>  		xtype: me.create ? 'textfield' : 'displayfield',
> @@ -25,14 +155,7 @@ Ext.define('PVE.ha.GroupInputPanel', {
>  		vtype: 'StorageId',
>  		allowBlank: false
>  	    },
> -	    {
> -		xtype: 'pveNodeSelector',
> -		name: 'nodes',
> -		fieldLabel: gettext('Nodes'),
> -		allowBlank: false,
> -		multiSelect: true,
> -		autoSelect: false
> -	    }
> +	    nodefield
>  	];
>
>  	me.column2 = [
> @@ -55,7 +178,8 @@ Ext.define('PVE.ha.GroupInputPanel', {
>  		xtype: 'textfield',
>  		name: 'comment',
>  		fieldLabel: gettext('Comment')
> -	    }
> +	    },
> +	    nodegrid
>  	];
>  	
>  	me.callParent();
> @@ -97,10 +221,6 @@ Ext.define('PVE.ha.GroupEdit', {
>  		success:  function(response, options) {
>  		    var values = response.result.data;
>
> -		    if (values.nodes) {
> -			values.nodes = values.nodes.split(',');
> -		    }
> -
>  		    ipanel.setValues(values);
>  		}
>  	    });
>





More information about the pve-devel mailing list