mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-05-26 04:13:42 +00:00
205 lines
4.6 KiB
JavaScript
205 lines
4.6 KiB
JavaScript
Ext.define('PVE.qemu.USBInputPanel', {
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
setVMConfig: function(vmconfig) {
|
|
var me = this;
|
|
me.vmconfig = vmconfig;
|
|
},
|
|
|
|
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();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
var val = "";
|
|
var type = me.down('radiofield').getGroupValue();
|
|
switch (type) {
|
|
case 'spice':
|
|
val = 'spice'; 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';
|
|
}
|
|
break;
|
|
default:
|
|
throw "invalid type selected";
|
|
}
|
|
|
|
values[me.confid] = val;
|
|
return values;
|
|
},
|
|
|
|
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',
|
|
cbind: { pveSelNode: '{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',
|
|
cbind: { pveSelNode: '{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.define('PVE.qemu.USBEdit', {
|
|
extend: 'Proxmox.window.Edit',
|
|
|
|
vmconfig: undefined,
|
|
|
|
isAdd: true,
|
|
|
|
subject: gettext('USB Device'),
|
|
|
|
|
|
initComponent : function() {
|
|
var me = this;
|
|
|
|
me.isCreate = !me.confid;
|
|
|
|
var ipanel = Ext.create('PVE.qemu.USBInputPanel', {
|
|
confid: me.confid,
|
|
pveSelNode: me.pveSelNode
|
|
});
|
|
|
|
Ext.apply(me, {
|
|
items: [ ipanel ]
|
|
});
|
|
|
|
me.callParent();
|
|
|
|
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;
|
|
}
|
|
}
|
|
var values = {
|
|
usb : type,
|
|
hostdevice: hostdevice,
|
|
port: port,
|
|
usb3: usb3
|
|
};
|
|
|
|
ipanel.setValues(values);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|