]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/qemu/USBEdit.js
api: add proxmox-firewall to versions pkg list
[pve-manager.git] / www / manager6 / qemu / USBEdit.js
index 1e854a2e3e62e62dd1307eb2738c05500d9c0767..b372d53d3b90649d04da07d0ffca2c1ebf1189e7 100644 (file)
@@ -1,56 +1,40 @@
 Ext.define('PVE.qemu.USBInputPanel', {
     extend: 'Proxmox.panel.InputPanel',
-    mixins: ['Proxmox.Mixin.CBind' ],
+    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');
-                   if (field.inputValue === 'hostdevice') {
-                       hwidfield.setDisabled(!newValue);
-                   } else if(field.inputValue === 'port') {
-                       portfield.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;
                }
            }
@@ -59,10 +43,16 @@ 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();
+               val = 'host=' + values[type];
+               delete values[type];
                break;
            default:
                throw "invalid type selected";
@@ -80,19 +70,38 @@ Ext.define('PVE.qemu.USBInputPanel', {
        {
            xtype: 'fieldcontainer',
            defaultType: 'radiofield',
-           items:[
+           layout: 'fit',
+           items: [
                {
                    name: 'usb',
                    inputValue: 'spice',
                    boxLabel: gettext('Spice Port'),
                    submitValue: false,
-                   checked: true
+                   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'),
-                   submitValue: false
+                   reference: 'hostdevice',
+                   submitValue: false,
                },
                {
                    xtype: 'pveUSBSelector',
@@ -100,42 +109,42 @@ Ext.define('PVE.qemu.USBInputPanel', {
                    type: 'device',
                    name: 'hostdevice',
                    cbind: { pveSelNode: '{pveSelNode}' },
+                   bind: { disabled: '{!hostdevice.checked}' },
                    editable: true,
-                   reference: 'hwid',
                    allowBlank: false,
-                   fieldLabel: 'Choose Device',
+                   fieldLabel: gettext('Choose Device'),
                    labelAlign: 'right',
-                   submitValue: false
                },
                {
                    name: 'usb',
                    inputValue: 'port',
                    boxLabel: gettext('Use USB Port'),
-                   submitValue: false
+                   reference: 'port',
+                   submitValue: false,
                },
                {
                    xtype: 'pveUSBSelector',
                    disabled: true,
                    name: 'port',
                    cbind: { pveSelNode: '{pveSelNode}' },
+                   bind: { disabled: '{!port.checked}' },
                    editable: true,
                    type: 'port',
-                   reference: 'port',
                    allowBlank: false,
                    fieldLabel: gettext('Choose Port'),
                    labelAlign: 'right',
-                   submitValue: false
                },
                {
                    xtype: 'checkbox',
                    name: 'usb3',
                    inputValue: true,
+                   checked: true,
                    reference: 'usb3',
-                   fieldLabel: gettext('Use USB3')
-               }
-           ]
-       }
-    ]
+                   fieldLabel: gettext('Use USB3'),
+               },
+           ],
+       },
+    ],
 });
 
 Ext.define('PVE.qemu.USBEdit', {
@@ -144,22 +153,21 @@ Ext.define('PVE.qemu.USBEdit', {
     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();
@@ -167,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);
+           },
        });
-    }
+    },
 });