]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/window/USBMapEdit.js
ui: pci/usb map edit: improve new host mappings dialog
[pve-manager.git] / www / manager6 / window / USBMapEdit.js
CommitLineData
5b775e5d
DC
1Ext.define('PVE.window.USBMapEditWindow', {
2 extend: 'Proxmox.window.Edit',
3
4 mixins: ['Proxmox.Mixin.CBind'],
5
6 cbindData: function(initialConfig) {
7 let me = this;
8 me.isCreate = !me.name;
9 me.method = me.isCreate ? 'POST' : 'PUT';
10 return {
11 name: me.name,
12 nodename: me.nodename,
13 };
14 },
15
16 submitUrl: function(_url, data) {
17 let me = this;
18 let name = me.isCreate ? '' : me.name;
19 return `/cluster/mapping/usb/${name}`;
20 },
21
22 title: gettext('Add USB mapping'),
23
24 onlineHelp: 'resource_mapping',
25
26 method: 'POST',
27
28 controller: {
29 xclass: 'Ext.app.ViewController',
30
31 onGetValues: function(values) {
32 let me = this;
33 let view = me.getView();
34 values.node ??= view.nodename;
35
36 let type = me.getView().down('radiofield').getGroupValue();
37 let name = values.name;
38 let description = values.description;
39 delete values.description;
40 delete values.name;
41
42 if (type === 'path') {
43 let usbsel = me.lookup(type);
44 let usbDev = usbsel.getStore().findRecord('usbid', values[type], 0, false, true, true);
45
46 if (!usbDev) {
47 return {};
48 }
49 values.id = `${usbDev.data.vendid}:${usbDev.data.prodid}`;
50 }
51
52 let map = [];
53 if (me.originalMap) {
54 map = PVE.Parser.filterPropertyStringList(me.originalMap, (e) => e.node !== values.node);
55 }
56 map.push(PVE.Parser.printPropertyString(values));
57
58 values = {
59 map,
60 description,
61 };
62
63 if (view.isCreate) {
64 values.id = name;
65 }
66
67 return values;
68 },
69
70 onSetValues: function(values) {
71 let me = this;
72 let view = me.getView();
73 me.originalMap = [...values.map];
746323ce 74 let configuredNodes = [];
5b775e5d 75 PVE.Parser.filterPropertyStringList(values.map, (e) => {
746323ce 76 configuredNodes.push(e.node);
5b775e5d
DC
77 if (e.node === view.nodename) {
78 values = e;
79 }
80 return false;
81 });
82
746323ce 83 me.lookup('nodeselector').disallowedNodes = configuredNodes;
5b775e5d
DC
84 if (values.path) {
85 values.usb = 'path';
86 }
87
88 return values;
89 },
90
91 modeChange: function(field, value) {
92 let me = this;
93 let type = field.inputValue;
94 let usbsel = me.lookup(type);
95 usbsel.setDisabled(!value);
96 },
97
98 nodeChange: function(_field, value) {
99 this.lookup('id').setNodename(value);
100 this.lookup('path').setNodename(value);
101 },
102
103
104 init: function(view) {
105 let me = this;
106
107 if (!view.nodename) {
108 //throw "no nodename given";
109 }
110 },
111
112 control: {
113 'radiofield': {
114 change: 'modeChange',
115 },
116 'pveNodeSelector': {
117 change: 'nodeChange',
118 },
119 },
120 },
121
122 items: [
123 {
124 xtype: 'inputpanel',
125 onGetValues: function(values) {
126 return this.up('window').getController().onGetValues(values);
127 },
128
129 onSetValues: function(values) {
130 return this.up('window').getController().onSetValues(values);
131 },
132
133 column1: [
134 {
135 xtype: 'pmxDisplayEditField',
136 fieldLabel: gettext('Name'),
137 cbind: {
138 editable: '{!name}',
139 value: '{name}',
140 submitValue: '{isCreate}',
141 },
142 name: 'name',
143 allowBlank: false,
144 },
145 {
146 xtype: 'pmxDisplayEditField',
147 fieldLabel: gettext('Node'),
148 name: 'node',
149 editConfig: {
150 xtype: 'pveNodeSelector',
746323ce 151 reference: 'nodeselector',
5b775e5d
DC
152 },
153 cbind: {
154 editable: '{!nodename}',
155 value: '{nodename}',
156 },
157 allowBlank: false,
158 },
159 ],
160
161 column2: [
162 {
163 xtype: 'fieldcontainer',
164 defaultType: 'radiofield',
165 layout: 'fit',
166 items: [
167 {
168 name: 'usb',
169 inputValue: 'id',
170 checked: true,
171 boxLabel: gettext('Use USB Vendor/Device ID'),
172 submitValue: false,
173 },
174 {
175 xtype: 'pveUSBSelector',
176 type: 'device',
177 reference: 'id',
178 name: 'id',
179 cbind: {
180 nodename: '{nodename}',
181 },
182 editable: true,
183 allowBlank: false,
184 fieldLabel: gettext('Choose Device'),
185 labelAlign: 'right',
186 },
187 {
188 name: 'usb',
189 inputValue: 'path',
190 boxLabel: gettext('Use USB Port'),
191 submitValue: false,
192 },
193 {
194 xtype: 'pveUSBSelector',
195 disabled: true,
196 name: 'path',
197 reference: 'path',
198 cbind: {
199 nodename: '{nodename}',
200 },
201 editable: true,
202 type: 'port',
203 allowBlank: false,
204 fieldLabel: gettext('Choose Port'),
205 labelAlign: 'right',
206 },
207 ],
208 },
209 ],
210
211 columnB: [
212 {
213 xtype: 'proxmoxtextfield',
214 fieldLabel: gettext('Comment'),
215 submitValue: true,
216 name: 'description',
217 },
218 ],
219 },
220 ],
221});