]>
Commit | Line | Data |
---|---|---|
f46721af | 1 | Ext.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 | ||
150 | Ext.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 | }); |