]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/qemu/USBEdit.js
update shipped appliance info index
[pve-manager.git] / www / manager6 / qemu / USBEdit.js
CommitLineData
f46721af 1Ext.define('PVE.qemu.USBInputPanel', {
ef4ef788 2 extend: 'Proxmox.panel.InputPanel',
8058410f 3 mixins: ['Proxmox.Mixin.CBind'],
f46721af
DC
4
5 autoComplete: false,
6 onlineHelp: 'qm_usb_passthrough',
7
f7b5386a
DC
8 cbindData: function(initialConfig) {
9 let me = this;
10 if (!me.pveSelNode) {
11 throw "no pveSelNode given";
12 }
13
14 return { nodename: me.pveSelNode.data.node };
15 },
16
4292a318 17 viewModel: {
f6710aac 18 data: {},
4292a318
TL
19 },
20
f46721af
DC
21 setVMConfig: function(vmconfig) {
22 var me = this;
23 me.vmconfig = vmconfig;
17dcba38
DC
24 let max_usb = PVE.Utils.get_max_usb_count(me.vmconfig.ostype, me.vmconfig.machine);
25 if (max_usb > PVE.Utils.hardware_counts.usb_old) {
26 me.down('field[name=usb3]').setDisabled(true);
27 }
f46721af
DC
28 },
29
30 onGetValues: function(values) {
31 var me = this;
2e8f031f 32 if (!me.confid) {
17dcba38
DC
33 let max_usb = PVE.Utils.get_max_usb_count(me.vmconfig.ostype, me.vmconfig.machine);
34 for (let i = 0; i < max_usb; i++) {
2e8f031f
TL
35 let id = 'usb' + i.toString();
36 if (!me.vmconfig[id]) {
37 me.confid = id;
f46721af
DC
38 break;
39 }
40 }
41 }
42 var val = "";
43 var type = me.down('radiofield').getGroupValue();
44 switch (type) {
45 case 'spice':
17f6a3f6
TL
46 val = 'spice';
47 break;
f7b5386a
DC
48 case 'mapped':
49 val = `mapping=${values[type]}`;
50 delete values.mapped;
51 break;
f46721af
DC
52 case 'hostdevice':
53 case 'port':
17f6a3f6
TL
54 val = 'host=' + values[type];
55 delete values[type];
f46721af
DC
56 break;
57 default:
58 throw "invalid type selected";
59 }
60
4d51f657
AL
61 if (values.usb3) {
62 delete values.usb3;
63 val += ',usb3=1';
64 }
f46721af
DC
65 values[me.confid] = val;
66 return values;
67 },
68
d49d0443
TL
69 items: [
70 {
71 xtype: 'fieldcontainer',
72 defaultType: 'radiofield',
d155bbc9
TL
73 layout: 'fit',
74 items: [
d49d0443
TL
75 {
76 name: 'usb',
77 inputValue: 'spice',
78 boxLabel: gettext('Spice Port'),
79 submitValue: false,
f6710aac 80 checked: true,
d49d0443 81 },
f7b5386a
DC
82 {
83 name: 'usb',
84 inputValue: 'mapped',
85 boxLabel: gettext('Use mapped Device'),
86 reference: 'mapped',
87 submitValue: false,
88 },
89 {
90 xtype: 'pveUSBMapSelector',
91 disabled: true,
92 name: 'mapped',
93 cbind: { nodename: '{nodename}' },
94 bind: { disabled: '{!mapped.checked}' },
95 allowBlank: false,
96 fieldLabel: gettext('Choose Device'),
97 labelAlign: 'right',
98 },
d49d0443
TL
99 {
100 name: 'usb',
101 inputValue: 'hostdevice',
102 boxLabel: gettext('Use USB Vendor/Device ID'),
4292a318 103 reference: 'hostdevice',
f6710aac 104 submitValue: false,
d49d0443
TL
105 },
106 {
107 xtype: 'pveUSBSelector',
108 disabled: true,
109 type: 'device',
110 name: 'hostdevice',
111 cbind: { pveSelNode: '{pveSelNode}' },
4292a318 112 bind: { disabled: '{!hostdevice.checked}' },
d49d0443 113 editable: true,
d49d0443 114 allowBlank: false,
cc9c5af4 115 fieldLabel: gettext('Choose Device'),
d49d0443 116 labelAlign: 'right',
d49d0443
TL
117 },
118 {
119 name: 'usb',
120 inputValue: 'port',
121 boxLabel: gettext('Use USB Port'),
4292a318 122 reference: 'port',
f6710aac 123 submitValue: false,
d49d0443
TL
124 },
125 {
126 xtype: 'pveUSBSelector',
127 disabled: true,
128 name: 'port',
129 cbind: { pveSelNode: '{pveSelNode}' },
4292a318 130 bind: { disabled: '{!port.checked}' },
d49d0443
TL
131 editable: true,
132 type: 'port',
d49d0443
TL
133 allowBlank: false,
134 fieldLabel: gettext('Choose Port'),
135 labelAlign: 'right',
d49d0443
TL
136 },
137 {
138 xtype: 'checkbox',
139 name: 'usb3',
4d51f657 140 inputValue: true,
0d077e81 141 checked: true,
d49d0443 142 reference: 'usb3',
f6710aac
TL
143 fieldLabel: gettext('Use USB3'),
144 },
145 ],
146 },
147 ],
f46721af
DC
148});
149
150Ext.define('PVE.qemu.USBEdit', {
9fccc702 151 extend: 'Proxmox.window.Edit',
f46721af
DC
152
153 vmconfig: undefined,
154
155 isAdd: true,
d155bbc9 156 width: 400,
f46721af
DC
157 subject: gettext('USB Device'),
158
8058410f 159 initComponent: function() {
f46721af
DC
160 var me = this;
161
162 me.isCreate = !me.confid;
163
164 var ipanel = Ext.create('PVE.qemu.USBInputPanel', {
165 confid: me.confid,
f6710aac 166 pveSelNode: me.pveSelNode,
f46721af
DC
167 });
168
169 Ext.apply(me, {
8058410f 170 items: [ipanel],
f46721af
DC
171 });
172
173 me.callParent();
174
175 me.load({
176 success: function(response, options) {
177 ipanel.setVMConfig(response.result.data);
2e8f031f
TL
178 if (me.isCreate) {
179 return;
180 }
f46721af 181
f7b5386a
DC
182 let data = PVE.Parser.parsePropertyString(response.result.data[me.confid], 'host');
183 let port, hostdevice, mapped, usb3 = false;
184 let usb;
185
186 if (data.host) {
187 if (/^(0x)?[a-zA-Z0-9]{4}:(0x)?[a-zA-Z0-9]{4}$/.test(data.host)) {
188 hostdevice = data.host.replace('0x', '');
189 usb = 'hostdevice';
190 } else if (/^(\d+)-(\d+(\.\d+)*)$/.test(data.host)) {
191 port = data.host;
192 usb = 'port';
193 } else if (/^spice$/i.test(data.host)) {
194 usb = 'spice';
f46721af 195 }
f7b5386a
DC
196 } else if (data.mapping) {
197 mapped = data.mapping;
198 usb = 'mapped';
f46721af 199 }
f7b5386a
DC
200
201 usb3 = data.usb3 ?? false;
202
2e8f031f 203 var values = {
f7b5386a
DC
204 usb,
205 hostdevice,
206 port,
207 usb3,
208 mapped,
2e8f031f
TL
209 };
210
211 ipanel.setValues(values);
f6710aac 212 },
f46721af 213 });
f6710aac 214 },
f46721af 215});