]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/form/USBSelector.js
ui: eslint: fix trailing comma and comma related whitespaces errors
[pve-manager.git] / www / manager6 / form / USBSelector.js
1 Ext.define('PVE.form.USBSelector', {
2 extend: 'Proxmox.form.ComboGrid',
3 alias: ['widget.pveUSBSelector'],
4
5 allowBlank: false,
6 autoSelect: false,
7 anyMatch: true,
8 displayField: 'product_and_id',
9 valueField: 'usbid',
10 editable: true,
11
12 validator: function(value) {
13 var me = this;
14 if (!value) {
15 return true; // handled later by allowEmpty in the getErrors call chain
16 }
17 value = me.getValue(); // as the valueField is not the displayfield
18 if (me.type === 'device') {
19 return (/^[a-f0-9]{4}\:[a-f0-9]{4}$/i).test(value);
20 } else if (me.type === 'port') {
21 return (/^[0-9]+\-[0-9]+(\.[0-9]+)*$/).test(value);
22 }
23 return gettext("Invalid Value");
24 },
25
26 initComponent: function() {
27 var me = this;
28
29 var nodename = me.pveSelNode.data.node;
30
31 if (!nodename) {
32 throw "no nodename specified";
33 }
34
35 if (me.type !== 'device' && me.type !== 'port') {
36 throw "no valid type specified";
37 }
38
39 var store = new Ext.data.Store({
40 model: 'pve-usb-' + me.type,
41 proxy: {
42 type: 'proxmox',
43 url: `/api2/json/nodes/${nodename}/hardware/usb`,
44 },
45 filters: [
46 function (item) {
47 return !!item.data.usbpath && !!item.data.prodid && item.data['class'] != 9;
48 },
49 ],
50 });
51 let emptyText = '';
52 if (me.type === 'device') {
53 emptyText = gettext('Passthrough a specific device');
54 } else {
55 emptyText = gettext('Passthrough a full port');
56 }
57
58 Ext.apply(me, {
59 store: store,
60 emptyText: emptyText,
61 listConfig: {
62 width: 520,
63 columns: [
64 {
65 header: (me.type === 'device')?gettext('Device'):gettext('Port'),
66 sortable: true,
67 dataIndex: 'usbid',
68 width: 80,
69 },
70 {
71 header: gettext('Manufacturer'),
72 sortable: true,
73 dataIndex: 'manufacturer',
74 width: 150,
75 },
76 {
77 header: gettext('Product'),
78 sortable: true,
79 dataIndex: 'product',
80 flex: 1,
81 },
82 {
83 header: gettext('Speed'),
84 width: 75,
85 sortable: true,
86 dataIndex: 'speed',
87 renderer: function(value) {
88 let speed_map = {
89 "10000" : "USB 3.1",
90 "5000" : "USB 3.0",
91 "480" : "USB 2.0",
92 "12" : "USB 1.x",
93 "1.5": "USB 1.x",
94 };
95 return speed_map[value] || value + " Mbps";
96 },
97 },
98 ],
99 },
100 });
101
102 me.callParent();
103
104 store.load();
105 },
106
107 }, function() {
108
109 Ext.define('pve-usb-device', {
110 extend: 'Ext.data.Model',
111 fields: [
112 {
113 name: 'usbid',
114 convert: function(val, data) {
115 if (val) {
116 return val;
117 }
118 return data.get('vendid') + ':' + data.get('prodid');
119 },
120 },
121 'speed', 'product', 'manufacturer', 'vendid', 'prodid', 'usbpath',
122 { name: 'port', type: 'number' },
123 { name: 'level', type: 'number' },
124 { name: 'class', type: 'number' },
125 { name: 'devnum', type: 'number' },
126 { name: 'busnum', type: 'number' },
127 {
128 name: 'product_and_id',
129 type: 'string',
130 convert: (v, rec) => {
131 let res = rec.data.product || gettext('Unkown');
132 res += " (" + rec.data.usbid + ")";
133 return res;
134 },
135 },
136 ],
137 });
138
139 Ext.define('pve-usb-port', {
140 extend: 'Ext.data.Model',
141 fields: [
142 {
143 name: 'usbid',
144 convert: function(val, data) {
145 if (val) {
146 return val;
147 }
148 return data.get('busnum') + '-' + data.get('usbpath');
149 },
150 },
151 'speed', 'product', 'manufacturer', 'vendid', 'prodid', 'usbpath',
152 { name: 'port', type: 'number' },
153 { name: 'level', type: 'number' },
154 { name: 'class', type: 'number' },
155 { name: 'devnum', type: 'number' },
156 { name: 'busnum', type: 'number' },
157 {
158 name: 'product_and_id',
159 type: 'string',
160 convert: (v, rec) => {
161 let res = rec.data.product || gettext('Unplugged');
162 res += " (" + rec.data.usbid + ")";
163 return res;
164 },
165 },
166 ],
167 });
168 });