[pve-devel] [PATCH pve-manager v3 6/6] fix #4225: ui: qemu: hardware: add eject button for cdroms

Daniel Herzig d.herzig at proxmox.com
Thu Jan 30 12:31:21 CET 2025


This commit adds a button in the hardware view for quickly ejecting
unnecessary cdroms or ISO files by setting file to 'none'.

Signed-off-by: Daniel Herzig <d.herzig at proxmox.com>
---
 www/manager6/qemu/HardwareView.js | 42 +++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/www/manager6/qemu/HardwareView.js b/www/manager6/qemu/HardwareView.js
index c6d193fc..d8a9e187 100644
--- a/www/manager6/qemu/HardwareView.js
+++ b/www/manager6/qemu/HardwareView.js
@@ -541,6 +541,44 @@ Ext.define('PVE.qemu.HardwareView', {
 	    apiurl: '/api2/extjs/' + baseurl,
 	});
 
+	let eject_btn = new Proxmox.button.Button({
+	    text: gettext('Eject'),
+	    disabled: true,
+	    selModel: sm,
+	    RESTMethod: 'POST',
+	    confirmMsg: function(rec) {
+		let confirmMessage = gettext("Are you sure you want to eject '{0}' ?");
+		let isoFile = PVE.Parser.parsePropertyString(rec.data.value, 'volid').volid;
+		return Ext.htmlEncode(Ext.String.format(confirmMessage, isoFile));
+	    },
+	    handler: function(btn, e, rec) {
+		let params = {};
+		params[rec.data.key] = 'none,media=cdrom';
+		if (btn.RESTMethod === 'POST') {
+		    params.background_delay = 5;
+		}
+		Proxmox.Utils.API2Request({
+		    url: '/api2/extjs/' + baseurl,
+		    waitMsgTarget: me,
+		    method: btn.RESTMethod,
+		    params: params,
+		    callback: () => me.reload(),
+		    failure: response => Ext.Msg.alert('Error', response.htmlStatus),
+		    success: function(response, options) {
+			if (btn.RESTMethod === 'POST' && response.result.data !== null) {
+			    Ext.create('Proxmox.window.TaskProgress', {
+				autoShow: true,
+				upid: response.result.data,
+				listeners: {
+				    destroy: () => me.reload(),
+				},
+			    });
+			}
+		    },
+		});
+	    },
+	});
+
 	let efidisk_menuitem = Ext.create('Ext.menu.Item', {
 	    text: gettext('EFI Disk'),
 	    iconCls: 'fa fa-fw fa-hdd-o black',
@@ -611,6 +649,7 @@ Ext.define('PVE.qemu.HardwareView', {
 		edit_btn.disable();
 		diskaction_btn.disable();
 		revert_btn.disable();
+		eject_btn.disable();
 		return;
 	    }
 	    const { key, value } = rec.data;
@@ -622,6 +661,7 @@ Ext.define('PVE.qemu.HardwareView', {
 
 	    const isCloudInit = isCloudInitKey(value);
 	    const isCDRom = value && !!value.toString().match(/media=cdrom/);
+	    const isEjectedCDRom = value && !!value.toString().match(/none,media=cdrom/);
 
 	    const isUnusedDisk = key.match(/^unused\d+/);
 	    const isUsedDisk = !isUnusedDisk && row.isOnStorageBus && !isCDRom;
@@ -651,6 +691,7 @@ Ext.define('PVE.qemu.HardwareView', {
 	    resize_menuitem.setDisabled(pending || !isUsedDisk);
 
 	    revert_btn.setDisabled(!pending);
+	    eject_btn.setDisabled(!cdromCap || !isCDRom || isCloudInit || isEjectedCDRom);
 	};
 
 	let editorFactory = (classPath, extraOptions) => {
@@ -754,6 +795,7 @@ Ext.define('PVE.qemu.HardwareView', {
 		remove_btn,
 		edit_btn,
 		diskaction_btn,
+		eject_btn,
 		revert_btn,
 	    ],
 	    rows: rows,
-- 
2.39.5




More information about the pve-devel mailing list