]> 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 ad36050611e55d99af6cb48bc79eb5626945e54a..b372d53d3b90649d04da07d0ffca2c1ebf1189e7 100644 (file)
@@ -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);
+           },
        });
-    }
+    },
 });