A list of valid ostypes for each architecture is defined in PVE.Utils,
and this is used for the os type selector to only show relevant os
types.

Use a setter for 'arch' so we can bind the values again in the wizard,
similar to how the scsi selector is done.

Also update 'me.nodename' in 'setNodename'. This was never necessary
until now, but it is with the 'setArch' logic.

Signed-off-by: Dominik Csapak <[email protected]>
---
 www/manager6/qemu/OSPanel.js    | 10 ++++++++--
 www/manager6/qemu/OSTypeEdit.js | 26 ++++++++++++++++++++++++++
 www/manager6/qemu/Options.js    |  4 +++-
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/www/manager6/qemu/OSPanel.js b/www/manager6/qemu/OSPanel.js
index dd44c865..136c0316 100644
--- a/www/manager6/qemu/OSPanel.js
+++ b/www/manager6/qemu/OSPanel.js
@@ -36,7 +36,9 @@ Ext.define('PVE.qemu.OSPanel', {
         onOSTypeChange: function (field) {
             var me = this,
                 ostype = field.getValue();
-            var targetValues = PVE.qemu.OSDefaults.getDefaults(ostype);
+
+            let arch = me.getViewModel().get('current.architecture');
+            var targetValues = PVE.qemu.OSDefaults.getDefaults(ostype, arch);
 
             me.setWidget('pveBusSelector', targetValues.busType);
             me.setWidget('pveNetworkCardSelector', targetValues.networkCard);
@@ -77,7 +79,8 @@ Ext.define('PVE.qemu.OSPanel', {
                 updateVMConfig();
                 me.setWidget('pveBusSelector', 'scsi');
                 let ostype = me.getView().down('[name=ostype]').getValue();
-                let targetValues = PVE.qemu.OSDefaults.getDefaults(ostype);
+                let arch = vm.get('current.architecture');
+                let targetValues = PVE.qemu.OSDefaults.getDefaults(ostype, 
arch);
                 me.setWidget('pveBusSelector', targetValues.busType);
             }
         },
@@ -110,6 +113,9 @@ Ext.define('PVE.qemu.OSPanel', {
                 {
                     xtype: 'pveQemuOSTypePanel',
                     insideWizard: true,
+                    bind: {
+                        arch: '{current.architecture}',
+                    },
                 },
                 {
                     xtype: 'inputpanel',
diff --git a/www/manager6/qemu/OSTypeEdit.js b/www/manager6/qemu/OSTypeEdit.js
index a9508539..dd84d40e 100644
--- a/www/manager6/qemu/OSTypeEdit.js
+++ b/www/manager6/qemu/OSTypeEdit.js
@@ -17,6 +17,25 @@ Ext.define('PVE.qemu.OSTypeInputPanel', {
         },
     },
 
+    setArch: function (arch) {
+        let me = this;
+        me.arch = arch;
+
+        let osbaseStore = me.lookup('osbase').getStore();
+        osbaseStore.clearFilter();
+        let list = PVE.qemu.Architecture.kvmOSTypes[arch]?.bases;
+        if (list) {
+            osbaseStore.addFilter((rec) => list.indexOf(rec.data.field1) !== 
-1);
+        }
+
+        let ostypeStore = me.lookup('ostype').getStore();
+        ostypeStore.clearFilter();
+        list = PVE.qemu.Architecture.kvmOSTypes[arch]?.ostypes;
+        if (list) {
+            ostypeStore.addFilter((rec) => list.indexOf(rec.data.val) !== -1);
+        }
+    },
+
     onGetValues: function (values) {
         if (values.ide0) {
             let drive = {
@@ -36,6 +55,7 @@ Ext.define('PVE.qemu.OSTypeInputPanel', {
                 xtype: 'combobox',
                 submitValue: false,
                 name: 'osbase',
+                reference: 'osbase',
                 fieldLabel: gettext('Type'),
                 editable: false,
                 queryMode: 'local',
@@ -77,6 +97,7 @@ Ext.define('PVE.qemu.OSTypeInputPanel', {
 
 Ext.define('PVE.qemu.OSTypeEdit', {
     extend: 'Proxmox.window.Edit',
+    alias: 'widget.pveQemuOSTypeEdit',
 
     subject: 'OS Type',
 
@@ -92,6 +113,11 @@ Ext.define('PVE.qemu.OSTypeEdit', {
                 var value = response.result.data.ostype || 'other';
                 var osinfo = PVE.Utils.get_kvm_osinfo(value);
                 me.setValues({ ostype: value, osbase: osinfo.base });
+                let arch = PVE.qemu.Architecture.getNodeArchitecture(
+                    response.result.data.arch,
+                    me.nodename,
+                );
+                me.down('pveQemuOSTypePanel').setArch(arch);
             },
         });
     },
diff --git a/www/manager6/qemu/Options.js b/www/manager6/qemu/Options.js
index 0c0de699..8a4721a0 100644
--- a/www/manager6/qemu/Options.js
+++ b/www/manager6/qemu/Options.js
@@ -86,7 +86,9 @@ Ext.define('PVE.qemu.Options', {
             },
             ostype: {
                 header: gettext('OS Type'),
-                editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.OSTypeEdit' 
: undefined,
+                editor: caps.vms['VM.Config.Options']
+                    ? { xtype: 'pveQemuOSTypeEdit', nodename }
+                    : undefined,
                 renderer: PVE.Utils.render_kvm_ostype,
                 defaultValue: 'other',
             },
-- 
2.47.3




Reply via email to