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

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Oct 6 11:28:38 CEST 2016


On 10/06/2016 09:39 AM, Dominik Csapak wrote:
> both patches look good to me

Ok, thanks, will resend v3 with a few jslint warnings addressed.

>
> 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