Ext.define('PVE.window.HDResize', { extend: 'Ext.window.Window', resizable: false, resize_disk: function (disk, size) { var me = this; var params = { disk: disk, size: '+' + size + 'G' }; Proxmox.Utils.API2Request({ params: params, url: '/nodes/' + me.nodename + '/qemu/' + me.vmid + '/resize', waitMsgTarget: me, method: 'PUT', failure: function (response, opts) { Ext.Msg.alert(gettext('Error'), response.htmlStatus); }, success: function (response, options) { Ext.create('Proxmox.window.TaskProgress', { autoShow: true, upid: response.result.data, }); me.close(); }, }); }, updateNewSize: function () { let me = this; let newSize = ''; if (me.currentSize !== undefined && me.hdsizesel.isValid()) { newSize = Proxmox.Utils.format_size( me.currentSize + me.hdsizesel.getValue() * 1024 ** 3, ); } me.down('#newSize').setValue(newSize); }, initComponent: function () { var me = this; if (!me.nodename) { throw 'no node name specified'; } if (!me.vmid) { throw 'no VM ID specified'; } var items = [ { xtype: 'displayfield', name: 'disk', value: me.disk, fieldLabel: gettext('Disk'), vtype: 'StorageId', allowBlank: false, }, { xtype: 'displayfield', itemId: 'currentSize', fieldLabel: gettext('Current Size'), }, ]; me.hdsizesel = Ext.createWidget('numberfield', { name: 'size', minValue: 0, maxValue: 128 * 1024, decimalPrecision: 3, value: '0', fieldLabel: `${gettext('Size Increment')} (${gettext('GiB')})`, allowBlank: false, listeners: { change: () => me.updateNewSize(), }, }); items.push(me.hdsizesel); items.push({ xtype: 'displayfield', itemId: 'newSize', fieldLabel: gettext('New Size'), }); me.formPanel = Ext.create('Ext.form.Panel', { bodyPadding: 10, border: false, fieldDefaults: { labelWidth: 140, anchor: '100%', }, items: items, }); var form = me.formPanel.getForm(); var submitBtn; me.title = gettext('Resize disk'); submitBtn = Ext.create('Ext.Button', { text: gettext('Resize disk'), handler: function () { if (form.isValid()) { let values = form.getValues(); me.resize_disk(me.disk, values.size); } }, }); Ext.apply(me, { modal: true, width: 250, border: false, layout: 'fit', buttons: [submitBtn], items: [me.formPanel], }); me.callParent(); Proxmox.Utils.API2Request({ url: `/nodes/${me.nodename}/qemu/${me.vmid}/config`, method: 'GET', waitMsgTarget: me, failure: (response) => Ext.Msg.alert(gettext('Error'), response.htmlStatus), success: function (response) { let size = PVE.Parser.parseQemuDrive(me.disk, response.result.data[me.disk])?.size; me.currentSize = size ? PVE.Utils.parse_disk_size(size) : undefined; me.down('#currentSize').setValue( me.currentSize !== undefined ? Proxmox.Utils.format_size(me.currentSize) : Proxmox.Utils.unknownText, ); me.updateNewSize(); }, }); }, });