[pve-devel] [PATCH v2 manager] ui: hdmove: modernize/refactor

Dominik Csapak d.csapak at proxmox.com
Tue Feb 22 10:46:39 CET 2022


some comments inline

On 11/15/21 16:02, Aaron Lauterer wrote:
> Signed-off-by: Aaron Lauterer <a.lauterer at proxmox.com>
> ---
> 
> changes since v1: much of the feedback to the HDReassign.js from the
> first patch has been incorporated here as well.
> 
> * reducing predefined cbind values for more arrow functions
> * using more arrow functions in general
> * template strings
> 
>   www/manager6/qemu/HDMove.js       | 239 +++++++++++++++++-------------
>   www/manager6/qemu/HardwareView.js |   1 +
>   2 files changed, 134 insertions(+), 106 deletions(-)
> 
> diff --git a/www/manager6/qemu/HDMove.js b/www/manager6/qemu/HDMove.js
> index 181b7bdc..210e6ce8 100644
> --- a/www/manager6/qemu/HDMove.js
> +++ b/www/manager6/qemu/HDMove.js
> @@ -1,48 +1,147 @@
>   Ext.define('PVE.window.HDMove', {
>       extend: 'Ext.window.Window',
> +    mixins: ['Proxmox.Mixin.CBind'],
>   
>       resizable: false,
> +    modal: true,
> +    width: 350,
> +    border: false,
> +    layout: 'fit',
> +
> +    cbindData: function() {
> +	let me = this;
> +	return {
> +	    isQemu: me.type === 'qemu',
> +	    disk: me.disk,
> +	    nodename: me.nodename,
> +	};
> +    },
>   
> +    cbind: {
> +	title: get => get('isQemu') ? gettext("Move disk") : gettext('Move Volume'),
> +    },
>   
> -    move_disk: function(disk, storage, format, delete_disk) {
> -	var me = this;
> -	var qemu = me.type === 'qemu';
> -	var params = {};
> -	params.storage = storage;
> -	params[qemu ? 'disk':'volume'] = disk;
> -
> -	if (format && qemu) {
> -	    params.format = format;
> -	}
> -
> -	if (delete_disk) {
> -	    params.delete = 1;
> -	}
> +    controller: {
> +	xclass: 'Ext.app.ViewController',
> +
> +	move_disk: function(disk, storage, format, delete_disk) {

as with the other patch, this should probably be 'moveDisk'

> +	    let me = this;
> +	    let view = me.getView();
> +	    let qemu = view.type === 'qemu';
> +	    let params = {
> +		storage: storage,
> +	    };
> +	    params[qemu ? 'disk':'volume'] = disk;
> +
> +	    if (format && qemu) {
> +		params.format = format;
> +	    }
> +
> +	    if (delete_disk) {
> +		params.delete = 1;
> +	    }
> +
> +	    let url = `/nodes/${view.nodename}/${view.type}/${view.vmid}/`;
> +	    url += qemu ? 'move_disk' : 'move_volume';
> +
> +	    Proxmox.Utils.API2Request({
> +		params: params,
> +		url: url,
> +		waitMsgTarget: me.getView(),
> +		method: 'POST',
> +		failure: function(response, opts) {
> +		    Ext.Msg.alert('Error', response.htmlStatus);
> +		},
> +		success: function(response, options) {
> +		    let upid = response.result.data;
> +		    Ext.create('Proxmox.window.TaskViewer', {
> +			upid: upid,
> +			autoShow: true,
> +			listeners: {
> +			    destroy: () => view.close(),
> +			},
> +		    });
> +		},
> +	    });
> +	},
> +
> +	onMoveClick: function() {
> +		let me = this;
> +		let view = me.getView();
> +		let form = me.lookup('moveFormPanel').getForm();
> +		if (form.isValid()) {
> +		    let values = form.getValues();
> +		    me.move_disk(view.disk, values.hdstorage, values.diskformat,
> +				 values.deleteDisk);
> +		}
> +	},
>   
> -	var url = '/nodes/' + me.nodename + '/' + me.type + '/' + me.vmid + '/';
> -	url += qemu ? 'move_disk' : 'move_volume';
> +	validateForm: function(fp, isValid) {

imho the name is confusing, since it does not actually
validate the form, but is called after the form was
(succesfully or not) validated

> +	    this.getView().lookup('submitButton').setDisabled(!isValid);
> +	},
> +    },
>   
> -	Proxmox.Utils.API2Request({
> -	    params: params,
> -	    url: url,
> -	    waitMsgTarget: me,
> -	    method: 'POST',
> -	    failure: function(response, opts) {
> -		Ext.Msg.alert('Error', response.htmlStatus);
> +    buttons: [
> +	{
> +	    xtype: 'button',
> +	    reference: 'submitButton',
> +	    cbind: {
> +		text: get => get('isQemu') ? gettext("Move disk") : gettext('Move Volume'),
>   	    },
> -	    success: function(response, options) {
> -		var upid = response.result.data;
> -		var win = Ext.create('Proxmox.window.TaskViewer', {
> -		    upid: upid,
> -		});
> -		win.show();
> -		win.on('destroy', function() { me.close(); });
> +	    handler: 'onMoveClick',
> +	    disabled: true,
> +	},
> +    ],
> +
> +    items: [
> +	{
> +	    xtype: 'form',
> +	    reference: 'moveFormPanel',
> +	    bodyPadding: 10,
> +	    border: false,
> +	    fieldDefaults: {
> +		labelWidth: 100,
> +		anchor: '100%',
>   	    },
> -	});
> -    },
> +	    listeners: {
> +		validitychange: 'validateForm',
> +	    },
> +	    items: [
> +		{
> +		    xtype: 'displayfield',
> +		    cbind: {
> +			name: get => get('isQemu') ? 'disk' : 'volume',
> +			fieldLabel: get => get('isQemu')
> +			    ? gettext('Disk')
> +			    : gettext('Mount Point'),
> +			value: '{disk}',
> +		    },
> +		    vtype: 'StorageId',
> +		    allowBlank: false,
> +		},
> +		{
> +		    xtype: 'pveDiskStorageSelector',
> +		    storageLabel: gettext('Target Storage'),
> +		    cbind: {
> +			nodename: '{nodename}',
> +			storageContent: get => get('isQemu') ? 'images' : 'rootdir',
> +			hideFormat: get => get('disk') === 'tpmstate0',
> +		    },
> +		    hideSize: true,
> +		},
> +		{
> +		    xtype: 'proxmoxcheckbox',
> +		    fieldLabel: gettext('Delete source'),
> +		    name: 'deleteDisk',
> +		    uncheckedValue: 0,
> +		    checked: false,
> +		},
> +	    ],
> +	},
> +    ],
>   
>       initComponent: function() {
> -	var me = this;
> +	let me = this;
>   
>   	if (!me.nodename) {
>   	    throw "no node name specified";
> @@ -53,81 +152,9 @@ Ext.define('PVE.window.HDMove', {
>   	}
>   
>   	if (!me.type) {
> -	    me.type = 'qemu';
> +	    throw "no type specified";
>   	}
>   
> -	var qemu = me.type === 'qemu';
> -
> -        var items = [
> -            {
> -                xtype: 'displayfield',
> -                name: qemu ? 'disk' : 'volume',
> -                value: me.disk,
> -                fieldLabel: qemu ? gettext('Disk') : gettext('Mount Point'),
> -                vtype: 'StorageId',
> -                allowBlank: false,
> -            },
> -        ];
> -
> -	items.push({
> -	    xtype: 'pveDiskStorageSelector',
> -	    storageLabel: gettext('Target Storage'),
> -	    nodename: me.nodename,
> -	    storageContent: qemu ? 'images' : 'rootdir',
> -	    hideSize: true,
> -	    hideFormat: me.disk === 'tpmstate0',
> -	});
> -
> -	items.push({
> -	    xtype: 'proxmoxcheckbox',
> -	    fieldLabel: gettext('Delete source'),
> -	    name: 'deleteDisk',
> -	    uncheckedValue: 0,
> -	    checked: false,
> -	});
> -
> -	me.formPanel = Ext.create('Ext.form.Panel', {
> -	    bodyPadding: 10,
> -	    border: false,
> -	    fieldDefaults: {
> -		labelWidth: 100,
> -		anchor: '100%',
> -	    },
> -	    items: items,
> -	});
> -
> -	var form = me.formPanel.getForm();
> -
> -	var submitBtn;
> -
> -	me.title = qemu ? gettext("Move disk") : gettext('Move Volume');
> -	submitBtn = Ext.create('Ext.Button', {
> -	    text: me.title,
> -	    handler: function() {
> -		if (form.isValid()) {
> -		    var values = form.getValues();
> -		    me.move_disk(me.disk, values.hdstorage, values.diskformat,
> -				 values.deleteDisk);
> -		}
> -	    },
> -	});
> -
> -	Ext.apply(me, {
> -	    modal: true,
> -	    width: 350,
> -	    border: false,
> -	    layout: 'fit',
> -	    buttons: [submitBtn],
> -	    items: [me.formPanel],
> -	});
> -
> -
>   	me.callParent();
> -
> -	me.mon(me.formPanel, 'validitychange', function(fp, isValid) {
> -	    submitBtn.setDisabled(!isValid);
> -	});
> -
> -	me.formPanel.isValid();
>       },
>   });
> diff --git a/www/manager6/qemu/HardwareView.js b/www/manager6/qemu/HardwareView.js
> index b76814e8..54946651 100644
> --- a/www/manager6/qemu/HardwareView.js
> +++ b/www/manager6/qemu/HardwareView.js
> @@ -415,6 +415,7 @@ Ext.define('PVE.qemu.HardwareView', {
>   		disk: rec.data.key,
>   		nodename: nodename,
>   		vmid: vmid,
> +		type: 'qemu',
>   	    });
>   
>   	    win.show();






More information about the pve-devel mailing list