X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=www%2Fmanager6%2Fqemu%2FUSBEdit.js;h=fe51d186f1948e7f353abb657ac3459e16ff47df;hb=refs%2Fheads%2Fmaster;hp=ad36050611e55d99af6cb48bc79eb5626945e54a;hpb=f46721af8e19a329097e29406a288190a55029b6;p=pve-manager.git diff --git a/www/manager6/qemu/USBEdit.js b/www/manager6/qemu/USBEdit.js index ad360506..b372d53d 100644 --- a/www/manager6/qemu/USBEdit.js +++ b/www/manager6/qemu/USBEdit.js @@ -1,58 +1,40 @@ Ext.define('PVE.qemu.USBInputPanel', { - extend: 'PVE.panel.InputPanel', + extend: 'Proxmox.panel.InputPanel', + mixins: ['Proxmox.Mixin.CBind'], autoComplete: false, onlineHelp: 'qm_usb_passthrough', - controller: { - xclass: 'Ext.app.ViewController', - - control: { - 'field[name=usb]': { - change: function(field, newValue, oldValue) { - var hwidfield = this.lookupReference('hwid'); - var portfield = this.lookupReference('port'); - var usb3field = this.lookupReference('usb3'); - if (field.inputValue === 'hostdevice') { - hwidfield.setDisabled(!newValue); - } else if(field.inputValue === 'port') { - portfield.setDisabled(!newValue); - } else if(field.inputValue === 'spice') { - usb3field.setDisabled(newValue); - } - } - }, - 'pveUSBSelector': { - change: function(field, newValue, oldValue) { - var usbval = field.getUSBValue(); - var usb3field = this.lookupReference('usb3'); - var usb3 = /usb3/.test(usbval); - if(usb3 && !usb3field.isDisabled()) { - usb3field.savedVal = usb3field.getValue(); - usb3field.setValue(true); - usb3field.setDisabled(true); - } else if(!usb3 && usb3field.isDisabled()){ - var val = (usb3field.savedVal === undefined)?usb3field.originalValue:usb3field.savedVal; - usb3field.setValue(val); - usb3field.setDisabled(false); - } - } - } + cbindData: function(initialConfig) { + let me = this; + if (!me.pveSelNode) { + throw "no pveSelNode given"; } + + return { nodename: me.pveSelNode.data.node }; + }, + + viewModel: { + data: {}, }, setVMConfig: function(vmconfig) { var me = this; me.vmconfig = vmconfig; + let max_usb = PVE.Utils.get_max_usb_count(me.vmconfig.ostype, me.vmconfig.machine); + if (max_usb > PVE.Utils.hardware_counts.usb_old) { + me.down('field[name=usb3]').setDisabled(true); + } }, onGetValues: function(values) { var me = this; - if(!me.confid) { - var i; - for (i = 0; i < 6; i++) { - if (!me.vmconfig['usb' + i.toString()]) { - me.confid = 'usb' + i.toString(); + if (!me.confid) { + let max_usb = PVE.Utils.get_max_usb_count(me.vmconfig.ostype, me.vmconfig.machine); + for (let i = 0; i < max_usb; i++) { + let id = 'usb' + i.toString(); + if (!me.vmconfig[id]) { + me.confid = id; break; } } @@ -61,116 +43,131 @@ Ext.define('PVE.qemu.USBInputPanel', { var type = me.down('radiofield').getGroupValue(); switch (type) { case 'spice': - val = 'spice'; break; + val = 'spice'; + break; + case 'mapped': + val = `mapping=${values[type]}`; + delete values.mapped; + break; case 'hostdevice': case 'port': - val = me.down('pveUSBSelector[name=' + type + ']').getUSBValue(); - if (!/usb3/.test(val) && me.down('field[name=usb3]').getValue() === true) { - val += ',usb3=1'; - } + val = 'host=' + values[type]; + delete values[type]; break; default: throw "invalid type selected"; } + if (values.usb3) { + delete values.usb3; + val += ',usb3=1'; + } values[me.confid] = val; return values; }, - initComponent: function () { - var me = this; - - var items = [ - { - xtype: 'fieldcontainer', - defaultType: 'radiofield', - items:[ - { - name: 'usb', - inputValue: 'spice', - boxLabel: gettext('Spice Port'), - submitValue: false, - checked: true - }, - { - name: 'usb', - inputValue: 'hostdevice', - boxLabel: gettext('Use USB Vendor/Device ID'), - submitValue: false - }, - { - xtype: 'pveUSBSelector', - disabled: true, - type: 'device', - name: 'hostdevice', - pveSelNode: me.pveSelNode, - editable: true, - reference: 'hwid', - allowBlank: false, - fieldLabel: 'Choose Device', - labelAlign: 'right', - submitValue: false - }, - { - name: 'usb', - inputValue: 'port', - boxLabel: gettext('Use USB Port'), - submitValue: false - }, - { - xtype: 'pveUSBSelector', - disabled: true, - name: 'port', - pveSelNode: me.pveSelNode, - editable: true, - type: 'port', - reference: 'port', - allowBlank: false, - fieldLabel: gettext('Choose Port'), - labelAlign: 'right', - submitValue: false - }, - { - xtype: 'checkbox', - name: 'usb3', - submitValue: false, - reference: 'usb3', - fieldLabel: gettext('Use USB3') - } - ] - } - ]; - - Ext.apply(me, { - items: items - }); - - me.callParent(); - } + items: [ + { + xtype: 'fieldcontainer', + defaultType: 'radiofield', + layout: 'fit', + items: [ + { + name: 'usb', + inputValue: 'spice', + boxLabel: gettext('Spice Port'), + submitValue: false, + checked: true, + }, + { + name: 'usb', + inputValue: 'mapped', + boxLabel: gettext('Use mapped Device'), + reference: 'mapped', + submitValue: false, + }, + { + xtype: 'pveUSBMapSelector', + disabled: true, + name: 'mapped', + cbind: { nodename: '{nodename}' }, + bind: { disabled: '{!mapped.checked}' }, + allowBlank: false, + fieldLabel: gettext('Choose Device'), + labelAlign: 'right', + }, + { + name: 'usb', + inputValue: 'hostdevice', + boxLabel: gettext('Use USB Vendor/Device ID'), + reference: 'hostdevice', + submitValue: false, + }, + { + xtype: 'pveUSBSelector', + disabled: true, + type: 'device', + name: 'hostdevice', + cbind: { pveSelNode: '{pveSelNode}' }, + bind: { disabled: '{!hostdevice.checked}' }, + editable: true, + allowBlank: false, + fieldLabel: gettext('Choose Device'), + labelAlign: 'right', + }, + { + name: 'usb', + inputValue: 'port', + boxLabel: gettext('Use USB Port'), + reference: 'port', + submitValue: false, + }, + { + xtype: 'pveUSBSelector', + disabled: true, + name: 'port', + cbind: { pveSelNode: '{pveSelNode}' }, + bind: { disabled: '{!port.checked}' }, + editable: true, + type: 'port', + allowBlank: false, + fieldLabel: gettext('Choose Port'), + labelAlign: 'right', + }, + { + xtype: 'checkbox', + name: 'usb3', + inputValue: true, + checked: true, + reference: 'usb3', + fieldLabel: gettext('Use USB3'), + }, + ], + }, + ], }); Ext.define('PVE.qemu.USBEdit', { - extend: 'PVE.window.Edit', + extend: 'Proxmox.window.Edit', vmconfig: undefined, isAdd: true, - + width: 400, subject: gettext('USB Device'), - - initComponent : function() { + initComponent: function() { var me = this; me.isCreate = !me.confid; var ipanel = Ext.create('PVE.qemu.USBInputPanel', { confid: me.confid, - pveSelNode: me.pveSelNode + pveSelNode: me.pveSelNode, }); Ext.apply(me, { - items: [ ipanel ] + items: [ipanel], }); me.callParent(); @@ -178,36 +175,41 @@ Ext.define('PVE.qemu.USBEdit', { me.load({ success: function(response, options) { ipanel.setVMConfig(response.result.data); - if (me.confid) { - var data = response.result.data[me.confid].split(','); - var port, hostdevice, usb3 = false; - var type = 'spice'; - var i; - for (i = 0; i < data.length; i++) { - if (/^(host=)?(0x)?[a-zA-Z0-9]{4}\:(0x)?[a-zA-Z0-9]{4}$/.test(data[i])) { - hostdevice = data[i]; - hostdevice = hostdevice.replace('host=', '').replace('0x',''); - type = 'hostdevice'; - } else if (/^(host=)?(\d+)\-(\d+(\.\d+)*)$/.test(data[i])) { - port = data[i]; - port = port.replace('host=',''); - type = 'port'; - } - - if (/^usb3=(1|on|true)$/.test(data[i])) { - usb3 = true; - } + if (me.isCreate) { + return; + } + + let data = PVE.Parser.parsePropertyString(response.result.data[me.confid], 'host'); + let port, hostdevice, mapped, usb3 = false; + let usb; + + if (data.host) { + if (/^(0x)?[a-zA-Z0-9]{4}:(0x)?[a-zA-Z0-9]{4}$/.test(data.host)) { + hostdevice = data.host.replace('0x', ''); + usb = 'hostdevice'; + } else if (/^(\d+)-(\d+(\.\d+)*)$/.test(data.host)) { + port = data.host; + usb = 'port'; + } else if (/^spice$/i.test(data.host)) { + usb = 'spice'; } - var values = { - usb : type, - hostdevice: hostdevice, - port: port, - usb3: usb3 - }; - - ipanel.setValues(values); + } else if (data.mapping) { + mapped = data.mapping; + usb = 'mapped'; } - } + + usb3 = data.usb3 ?? false; + + var values = { + usb, + hostdevice, + port, + usb3, + mapped, + }; + + ipanel.setValues(values); + }, }); - } + }, });