all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH manager v8 0/3] allow importing vm disk images on the UI
@ 2025-07-14 12:28 Dominik Csapak
  2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 1/3] ui: qemu hd edit: allow importing a disk from the import storage Dominik Csapak
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Dominik Csapak @ 2025-07-14 12:28 UTC (permalink / raw)
  To: pve-devel

this is a continuation of my previous series [0]

It enables importing disks on the UI in the HardwareView of a vm,
in the create wizard, and in the storage content view.

I split the patches so that the wizard and storage content view one are
separate, so they can be reviewed independently.

I resend it as is, because the review of my last series was a bit
inconclusive as to what was not right with it, and i had to rebase
for the indent change anyway.

changes from v7:
* rebase on master (indent change)

changes from v6:
* drop applied patches
* make import in hd edit panel dependant on configuration, instead of
  showing a checkbox
* wizard and HardwareView got an explicit import button
* make the import button work on the storage content view for disk
  images
* split patches for hdedit, wizard and storage content

0: https://lore.proxmox.com/pve-devel/20250407101310.3196974-1-d.csapak@proxmox.com/

Dominik Csapak (3):
  ui: qemu hd edit: allow importing a disk from the import storage
  ui: vm create wizard: allow importing disks
  ui: import storage content: allow importing of vm disk images

 www/manager6/panel/MultiDiskEdit.js |  36 ++++-
 www/manager6/qemu/HDEdit.js         | 199 ++++++++++++++++++++++++++--
 www/manager6/qemu/HardwareView.js   |   6 +
 www/manager6/qemu/MultiHDEdit.js    |   5 +-
 www/manager6/storage/Browser.js     |  23 +++-
 5 files changed, 249 insertions(+), 20 deletions(-)

-- 
2.39.5



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pve-devel] [PATCH manager v8 1/3] ui: qemu hd edit: allow importing a disk from the import storage
  2025-07-14 12:28 [pve-devel] [PATCH manager v8 0/3] allow importing vm disk images on the UI Dominik Csapak
@ 2025-07-14 12:28 ` Dominik Csapak
  2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 2/3] ui: vm create wizard: allow importing disks Dominik Csapak
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Dominik Csapak @ 2025-07-14 12:28 UTC (permalink / raw)
  To: pve-devel

from the hardware view of a virtual machine, by adding a new 'Import
Hard Disk' option in the 'Add' menu.

It replaces the standard storage selector by a import storage selector,
the file selector for the image to be imported, and a target storage
selector.

partially fixes #2424

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 www/manager6/qemu/HDEdit.js       | 67 +++++++++++++++++++++++++++----
 www/manager6/qemu/HardwareView.js |  6 +++
 2 files changed, 65 insertions(+), 8 deletions(-)

diff --git a/www/manager6/qemu/HDEdit.js b/www/manager6/qemu/HDEdit.js
index c3a5d0af..8cc99183 100644
--- a/www/manager6/qemu/HDEdit.js
+++ b/www/manager6/qemu/HDEdit.js
@@ -8,6 +8,8 @@ Ext.define('PVE.qemu.HDInputPanel', {
 
     unused: false, // ADD usused disk imaged
 
+    importDisk: false, // use import options
+
     vmconfig: {}, // used to select usused disks
 
     viewModel: {
@@ -78,7 +80,9 @@ Ext.define('PVE.qemu.HDInputPanel', {
             if (values.hdimage) {
                 me.drive.file = values.hdimage;
             } else {
-                me.drive.file = values.hdstorage + ':' + values.disksize;
+                let disksize = values['import-from'] ? 0 : values.disksize;
+                me.drive.file = `${values.hdstorage}:${disksize}`;
+                PVE.Utils.propertyStringSet(me.drive, values['import-from'], 'import-from');
             }
             me.drive.format = values.diskformat;
         }
@@ -168,6 +172,11 @@ Ext.define('PVE.qemu.HDInputPanel', {
         var me = this;
         me.down('#hdstorage').setNodename(nodename);
         me.down('#hdimage').setStorage(undefined, nodename);
+
+        me.lookup('new-disk')?.setNodename(nodename);
+        me.lookup('import-source')?.setNodename(nodename);
+        me.lookup('import-source-file')?.setNodename(nodename);
+        me.lookup('import-target')?.setNodename(nodename);
     },
 
     hasAdvanced: true,
@@ -222,13 +231,52 @@ Ext.define('PVE.qemu.HDInputPanel', {
             });
             column1.push(me.unusedDisks);
         } else if (me.isCreate) {
-            column1.push({
-                xtype: 'pveDiskStorageSelector',
-                storageContent: 'images',
-                name: 'disk',
-                nodename: me.nodename,
-                autoSelect: me.insideWizard,
-            });
+            if (!me.importDisk) {
+                column1.push({
+                    reference: 'new-disk',
+                    xtype: 'pveDiskStorageSelector',
+                    storageContent: 'images',
+                    name: 'disk',
+                    nodename: me.nodename,
+                    autoSelect: me.insideWizard,
+                });
+            } else {
+                column1.push({
+                    xtype: 'pveStorageSelector',
+                    reference: 'import-source',
+                    fieldLabel: gettext('Import Storage'),
+                    name: 'import-source-storage',
+                    storageContent: 'import',
+                    nodename: me.nodename,
+                    autoSelect: me.insideWizard,
+                    disabled: false,
+                    listeners: {
+                        change: function (_selector, storage) {
+                            me.lookup('import-source-file').setStorage(storage);
+                            me.lookup('import-source-file').setDisabled(!storage);
+                        },
+                    },
+                });
+                column1.push({
+                    xtype: 'pveFileSelector',
+                    reference: 'import-source-file',
+                    fieldLabel: gettext('Select Image'),
+                    storageContent: 'import',
+                    name: 'import-from',
+                    filter: (rec) => ['qcow2', 'vmdk', 'raw'].indexOf(rec?.data?.format) !== -1,
+                    nodename: me.nodename,
+                });
+                column1.push({
+                    xtype: 'pveDiskStorageSelector',
+                    reference: 'import-target',
+                    storageLabel: gettext('Target Storage'),
+                    hideSize: true,
+                    storageContent: 'images',
+                    name: 'disk',
+                    nodename: me.nodename,
+                    autoSelect: me.insideWizard,
+                });
+            }
         } else {
             column1.push({
                 xtype: 'textfield',
@@ -455,6 +503,8 @@ Ext.define('PVE.qemu.HDEdit', {
     width: 600,
     bodyPadding: 0,
 
+    importDisk: false,
+
     initComponent: function () {
         var me = this;
 
@@ -472,6 +522,7 @@ Ext.define('PVE.qemu.HDEdit', {
             nodename: nodename,
             unused: unused,
             isCreate: me.isCreate,
+            importDisk: me.importDisk,
         });
 
         if (unused) {
diff --git a/www/manager6/qemu/HardwareView.js b/www/manager6/qemu/HardwareView.js
index ece3de3d..f1f715eb 100644
--- a/www/manager6/qemu/HardwareView.js
+++ b/www/manager6/qemu/HardwareView.js
@@ -727,6 +727,12 @@ Ext.define('PVE.qemu.HardwareView', {
                                 disabled: !caps.vms['VM.Config.Disk'],
                                 handler: editorFactory('HDEdit'),
                             },
+                            {
+                                text: gettext('Import Hard Disk'),
+                                iconCls: 'fa fa-fw fa-cloud-download',
+                                disabled: !caps.vms['VM.Config.Disk'],
+                                handler: editorFactory('HDEdit', { importDisk: true }),
+                            },
                             {
                                 text: gettext('CD/DVD Drive'),
                                 iconCls: 'pve-itype-icon-cdrom',
-- 
2.39.5



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pve-devel] [PATCH manager v8 2/3] ui: vm create wizard: allow importing disks
  2025-07-14 12:28 [pve-devel] [PATCH manager v8 0/3] allow importing vm disk images on the UI Dominik Csapak
  2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 1/3] ui: qemu hd edit: allow importing a disk from the import storage Dominik Csapak
@ 2025-07-14 12:28 ` Dominik Csapak
  2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 3/3] ui: import storage content: allow importing of vm disk images Dominik Csapak
  2025-07-15 18:46 ` [pve-devel] applied-series: [PATCH manager v8 0/3] allow importing vm disk images on the UI Thomas Lamprecht
  3 siblings, 0 replies; 5+ messages in thread
From: Dominik Csapak @ 2025-07-14 12:28 UTC (permalink / raw)
  To: pve-devel

by adding a new 'import' button in the disk tab, which adds the same
input panel as the one we have when doing an 'Import Hard Disk' for an
existing VM.

partially fixes #2424

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 www/manager6/panel/MultiDiskEdit.js | 36 +++++++++++++++++++++++++----
 www/manager6/qemu/MultiHDEdit.js    |  5 +++-
 2 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/www/manager6/panel/MultiDiskEdit.js b/www/manager6/panel/MultiDiskEdit.js
index a4954775..32fad5dc 100644
--- a/www/manager6/panel/MultiDiskEdit.js
+++ b/www/manager6/panel/MultiDiskEdit.js
@@ -1,6 +1,8 @@
 Ext.define('PVE.panel.MultiDiskPanel', {
     extend: 'Ext.panel.Panel',
 
+    mixins: ['Proxmox.Mixin.CBind'],
+
     setNodename: function (nodename) {
         this.items.each((panel) => panel.setNodename(nodename));
     },
@@ -8,6 +10,8 @@ Ext.define('PVE.panel.MultiDiskPanel', {
     border: false,
     bodyBorder: false,
 
+    importDisk: false, // allow import panel
+
     layout: 'card',
 
     controller: {
@@ -16,25 +20,35 @@ Ext.define('PVE.panel.MultiDiskPanel', {
         vmconfig: {},
 
         onAdd: function () {
+            this.addDiskChecked(false);
+        },
+
+        onImport: function () {
+            this.addDiskChecked(true);
+        },
+
+        addDiskChecked: function (importDisk) {
             let me = this;
             me.lookup('addButton').setDisabled(true);
-            me.addDisk();
+            me.lookup('addImportButton').setDisabled(true);
+            me.addDisk(importDisk);
             let count = me.lookup('grid').getStore().getCount() + 1; // +1 is from ide2
             me.lookup('addButton').setDisabled(count >= me.maxCount);
+            me.lookup('addImportButton').setDisabled(count >= me.maxCount);
         },
 
         getNextFreeDisk: function (vmconfig) {
             throw 'implement in subclass';
         },
 
-        addPanel: function (itemId, vmconfig, nextFreeDisk) {
+        addPanel: function (itemId, vmconfig, nextFreeDisk, importDisk) {
             throw 'implement in subclass';
         },
 
         // define in subclass
         diskSorter: undefined,
 
-        addDisk: function () {
+        addDisk: function (importDisk) {
             let me = this;
             let grid = me.lookup('grid');
             let store = grid.getStore();
@@ -53,7 +67,7 @@ Ext.define('PVE.panel.MultiDiskPanel', {
                 itemId,
             })[0];
 
-            let panel = me.addPanel(itemId, vmconfig, nextFreeDisk);
+            let panel = me.addPanel(itemId, vmconfig, nextFreeDisk, importDisk);
             panel.updateVMConfig(vmconfig);
 
             // we need to setup a validitychange handler, so that we can show
@@ -175,6 +189,7 @@ Ext.define('PVE.panel.MultiDiskPanel', {
             store.remove(record);
             me.getView().remove(record.get('itemId'));
             me.lookup('addButton').setDisabled(false);
+            me.lookup('addImportButton').setDisabled(false);
             me.updateVMConfig();
             me.checkValidity();
         },
@@ -214,6 +229,7 @@ Ext.define('PVE.panel.MultiDiskPanel', {
             dock: 'left',
             border: false,
             width: 130,
+            cbind: {}, // for nested cbinds
             items: [
                 {
                     xtype: 'grid',
@@ -261,6 +277,18 @@ Ext.define('PVE.panel.MultiDiskPanel', {
                     iconCls: 'fa fa-plus-circle',
                     handler: 'onAdd',
                 },
+                {
+                    xtype: 'button',
+                    reference: 'addImportButton',
+                    text: gettext('Import'),
+                    iconCls: 'fa fa-cloud-download',
+                    handler: 'onImport',
+                    margin: '5 0 0 0',
+                    cbind: {
+                        disabled: '{!importDisk}',
+                        hidden: '{!importDisk}',
+                    },
+                },
                 {
                     // dummy field to control wizard validation
                     xtype: 'textfield',
diff --git a/www/manager6/qemu/MultiHDEdit.js b/www/manager6/qemu/MultiHDEdit.js
index 06b186fd..0b048709 100644
--- a/www/manager6/qemu/MultiHDEdit.js
+++ b/www/manager6/qemu/MultiHDEdit.js
@@ -4,6 +4,8 @@ Ext.define('PVE.qemu.MultiHDPanel', {
 
     onlineHelp: 'qm_hard_disk',
 
+    importDisk: true,
+
     controller: {
         xclass: 'Ext.app.ViewController',
 
@@ -19,7 +21,7 @@ Ext.define('PVE.qemu.MultiHDPanel', {
             return PVE.Utils.nextFreeDisk(clist, vmconfig);
         },
 
-        addPanel: function (itemId, vmconfig, nextFreeDisk) {
+        addPanel: function (itemId, vmconfig, nextFreeDisk, importDisk) {
             let me = this;
             return me.getView().add({
                 vmconfig,
@@ -33,6 +35,7 @@ Ext.define('PVE.qemu.MultiHDPanel', {
                 itemId,
                 isCreate: true,
                 insideWizard: true,
+                importDisk,
             });
         },
 
-- 
2.39.5



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pve-devel] [PATCH manager v8 3/3] ui: import storage content: allow importing of vm disk images
  2025-07-14 12:28 [pve-devel] [PATCH manager v8 0/3] allow importing vm disk images on the UI Dominik Csapak
  2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 1/3] ui: qemu hd edit: allow importing a disk from the import storage Dominik Csapak
  2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 2/3] ui: vm create wizard: allow importing disks Dominik Csapak
@ 2025-07-14 12:28 ` Dominik Csapak
  2025-07-15 18:46 ` [pve-devel] applied-series: [PATCH manager v8 0/3] allow importing vm disk images on the UI Thomas Lamprecht
  3 siblings, 0 replies; 5+ messages in thread
From: Dominik Csapak @ 2025-07-14 12:28 UTC (permalink / raw)
  To: pve-devel

By enabling the import button for qcow2/vmdk/raw files, and showing a
window with a VMID selector and the disk edit panel.

Change the edit panel so that when we give an explicit volume id
directly, we don't let the user select one. Instead it show it in a
displayfield.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 www/manager6/qemu/HDEdit.js     | 180 +++++++++++++++++++++++++++-----
 www/manager6/storage/Browser.js |  23 ++--
 2 files changed, 172 insertions(+), 31 deletions(-)

diff --git a/www/manager6/qemu/HDEdit.js b/www/manager6/qemu/HDEdit.js
index 8cc99183..d5ebfdb9 100644
--- a/www/manager6/qemu/HDEdit.js
+++ b/www/manager6/qemu/HDEdit.js
@@ -9,6 +9,7 @@ Ext.define('PVE.qemu.HDInputPanel', {
     unused: false, // ADD usused disk imaged
 
     importDisk: false, // use import options
+    importSelection: undefined, // preselect a disk to import
 
     vmconfig: {}, // used to select usused disks
 
@@ -241,31 +242,44 @@ Ext.define('PVE.qemu.HDInputPanel', {
                     autoSelect: me.insideWizard,
                 });
             } else {
-                column1.push({
-                    xtype: 'pveStorageSelector',
-                    reference: 'import-source',
-                    fieldLabel: gettext('Import Storage'),
-                    name: 'import-source-storage',
-                    storageContent: 'import',
-                    nodename: me.nodename,
-                    autoSelect: me.insideWizard,
-                    disabled: false,
-                    listeners: {
-                        change: function (_selector, storage) {
-                            me.lookup('import-source-file').setStorage(storage);
-                            me.lookup('import-source-file').setDisabled(!storage);
+                if (me.importSelection) {
+                    column1.push({
+                        xtype: 'displayfield',
+                        fieldLabel: gettext('Selected Image'),
+                        value: me.importSelection,
+                    });
+                    column1.push({
+                        xtype: 'hiddenfield',
+                        name: 'import-from',
+                        value: me.importSelection,
+                    });
+                } else {
+                    column1.push({
+                        xtype: 'pveStorageSelector',
+                        reference: 'import-source',
+                        fieldLabel: gettext('Import Storage'),
+                        name: 'import-source-storage',
+                        storageContent: 'import',
+                        nodename: me.nodename,
+                        autoSelect: me.insideWizard,
+                        disabled: false,
+                        listeners: {
+                            change: function (_selector, storage) {
+                                me.lookup('import-source-file').setStorage(storage);
+                                me.lookup('import-source-file').setDisabled(!storage);
+                            },
                         },
-                    },
-                });
-                column1.push({
-                    xtype: 'pveFileSelector',
-                    reference: 'import-source-file',
-                    fieldLabel: gettext('Select Image'),
-                    storageContent: 'import',
-                    name: 'import-from',
-                    filter: (rec) => ['qcow2', 'vmdk', 'raw'].indexOf(rec?.data?.format) !== -1,
-                    nodename: me.nodename,
-                });
+                    });
+                    column1.push({
+                        xtype: 'pveFileSelector',
+                        reference: 'import-source-file',
+                        fieldLabel: gettext('Select Image'),
+                        storageContent: 'import',
+                        name: 'import-from',
+                        filter: (rec) => ['qcow2', 'vmdk', 'raw'].indexOf(rec?.data?.format) !== -1,
+                        nodename: me.nodename,
+                    });
+                }
                 column1.push({
                     xtype: 'pveDiskStorageSelector',
                     reference: 'import-target',
@@ -557,3 +571,121 @@ Ext.define('PVE.qemu.HDEdit', {
         });
     },
 });
+
+Ext.define('PVE.qemu.HDImportEdit', {
+    extend: 'Proxmox.window.Edit',
+    mixins: ['Proxmox.Mixin.CBind'],
+
+    isAdd: true,
+    isCreate: true,
+
+    backgroundDelay: 5,
+
+    width: 600,
+    bodyPadding: 0,
+
+    title: gettext('Import Hard Disk'),
+
+    url: 'dummy', // will be set on vmid change
+
+    cbindData: function () {
+        let me = this;
+
+        if (!me.nodename) {
+            throw 'no nodename given';
+        }
+
+        if (!me.selection) {
+            throw 'no image preselected';
+        }
+
+        return {
+            nodename: me.nodename,
+            selection: me.selection,
+        };
+    },
+
+    controller: {
+        xclass: 'Ext.app.ViewController',
+
+        onVmidChange: function (_selector, value) {
+            let me = this;
+            let view = me.getView();
+            let ipanel = me.lookup('ipanel');
+            ipanel.setDisabled(true);
+            ipanel.setVisible(!!value);
+            let validation = me.lookup('validationProxy');
+            validation.setValue(false);
+            view.url = `/api2/extjs/nodes/${view.nodename}/qemu/${value}/config`;
+            Proxmox.Utils.setErrorMask(ipanel, true);
+
+            Proxmox.Utils.API2Request({
+                url: view.url,
+                method: 'GET',
+                success: function (response, opts) {
+                    ipanel.setVMConfig(response.result.data);
+
+                    validation.setValue(true);
+
+                    ipanel.setDisabled(false);
+                    Proxmox.Utils.setErrorMask(ipanel, false);
+                },
+                failure: function (response, _opts) {
+                    Proxmox.Utils.setErrorMask(ipanel, response.htmlStatus);
+                },
+            });
+        },
+    },
+
+    items: [
+        {
+            xtype: 'vmComboSelector',
+            padding: 10,
+            allowBlank: false,
+            fieldLabel: gettext('Target Guest'),
+            submitValue: false,
+            cbind: {}, // for nested cbinds
+            store: {
+                model: 'PVEResources',
+                autoLoad: true,
+                sorters: 'vmid',
+                cbind: {}, // for nested cbinds
+                filters: [
+                    {
+                        property: 'type',
+                        value: 'qemu',
+                    },
+                    {
+                        property: 'node',
+                        cbind: {
+                            value: '{nodename}',
+                        },
+                    },
+                ],
+            },
+            listeners: {
+                change: 'onVmidChange',
+            },
+        },
+        {
+            // used to prevent submitting while vm config is being loaded or that returns an error
+            xtype: 'textfield',
+            reference: 'validationProxy',
+            submitValue: false,
+            hidden: true,
+            validator: (val) => !!val,
+        },
+        {
+            xtype: 'pveQemuHDInputPanel',
+            reference: 'ipanel',
+            hidden: true,
+            disabled: true,
+            isCreate: true,
+            importDisk: true,
+            cbind: {
+                importSelection: '{selection}',
+                nodename: '{nodename}',
+            },
+        },
+    ],
+});
diff --git a/www/manager6/storage/Browser.js b/www/manager6/storage/Browser.js
index 73adc76a..d0237948 100644
--- a/www/manager6/storage/Browser.js
+++ b/www/manager6/storage/Browser.js
@@ -130,7 +130,8 @@ Ext.define('PVE.storage.Browser', {
                 });
             }
             if (contents.includes('import')) {
-                let isImportable = (format) => ['ova', 'ovf', 'vmx'].indexOf(format) !== -1;
+                let isImportable = (format) =>
+                    ['ova', 'ovf', 'vmx', 'raw', 'qcow2', 'vmdk'].indexOf(format) !== -1;
                 let createGuestImportWindow = (selection) => {
                     if (!selection) {
                         return;
@@ -138,12 +139,20 @@ Ext.define('PVE.storage.Browser', {
 
                     let volumeName = selection.data.volid.replace(/^.*?:/, '');
 
-                    Ext.create('PVE.window.GuestImport', {
-                        storage: storeid,
-                        volumeName,
-                        nodename,
-                        autoShow: true,
-                    });
+                    if (['raw', 'vmdk', 'qcow2'].indexOf(selection.data.format) !== -1) {
+                        Ext.create('PVE.qemu.HDImportEdit', {
+                            selection: selection.data.volid,
+                            nodename,
+                            autoShow: true,
+                        });
+                    } else {
+                        Ext.create('PVE.window.GuestImport', {
+                            storage: storeid,
+                            volumeName,
+                            nodename,
+                            autoShow: true,
+                        });
+                    }
                 };
                 me.items.push({
                     xtype: 'pveStorageContentView',
-- 
2.39.5



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pve-devel] applied-series: [PATCH manager v8 0/3] allow importing vm disk images on the UI
  2025-07-14 12:28 [pve-devel] [PATCH manager v8 0/3] allow importing vm disk images on the UI Dominik Csapak
                   ` (2 preceding siblings ...)
  2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 3/3] ui: import storage content: allow importing of vm disk images Dominik Csapak
@ 2025-07-15 18:46 ` Thomas Lamprecht
  3 siblings, 0 replies; 5+ messages in thread
From: Thomas Lamprecht @ 2025-07-15 18:46 UTC (permalink / raw)
  To: pve-devel, Dominik Csapak

On Mon, 14 Jul 2025 14:28:32 +0200, Dominik Csapak wrote:
> this is a continuation of my previous series [0]
> 
> It enables importing disks on the UI in the HardwareView of a vm,
> in the create wizard, and in the storage content view.
> 
> I split the patches so that the wizard and storage content view one are
> separate, so they can be reviewed independently.
> 
> [...]

Rechecking the UI/UX again and changed my mind now a bit, the wizard ones
might indeed be quite useful for some users. FWIW, in the wizard we could
reduce the amount of buttons slightly by moving the "import" one into the
"add" one, i.e., make the latter a split button defaulting to "add" with
"import" as sub-menu option–but just to throw out an idea, I did not
actually test if would really look and work OK that way.

Applied, thanks!

[1/3] ui: qemu hd edit: allow importing a disk from the import storage
      commit: e44afffab0102b041402e9726d2fcc372ea7a664
[2/3] ui: vm create wizard: allow importing disks
      commit: 77d70937a7ba36b314fbaa7cfdcb41f9b2172b57
[3/3] ui: import storage content: allow importing of vm disk images
      commit: 51a75f07ebcef67b1ea8508318618e8533763ed6


_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-07-15 18:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-07-14 12:28 [pve-devel] [PATCH manager v8 0/3] allow importing vm disk images on the UI Dominik Csapak
2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 1/3] ui: qemu hd edit: allow importing a disk from the import storage Dominik Csapak
2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 2/3] ui: vm create wizard: allow importing disks Dominik Csapak
2025-07-14 12:28 ` [pve-devel] [PATCH manager v8 3/3] ui: import storage content: allow importing of vm disk images Dominik Csapak
2025-07-15 18:46 ` [pve-devel] applied-series: [PATCH manager v8 0/3] allow importing vm disk images on the UI Thomas Lamprecht

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal