]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/USBMapEdit.js
ui: pci map edit: make top fields more clear
[pve-manager.git] / www / manager6 / window / USBMapEdit.js
1 Ext.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];
74 PVE.Parser.filterPropertyStringList(values.map, (e) => {
75 if (e.node === view.nodename) {
76 values = e;
77 }
78 return false;
79 });
80
81 if (values.path) {
82 values.usb = 'path';
83 }
84
85 return values;
86 },
87
88 modeChange: function(field, value) {
89 let me = this;
90 let type = field.inputValue;
91 let usbsel = me.lookup(type);
92 usbsel.setDisabled(!value);
93 },
94
95 nodeChange: function(_field, value) {
96 this.lookup('id').setNodename(value);
97 this.lookup('path').setNodename(value);
98 },
99
100
101 init: function(view) {
102 let me = this;
103
104 if (!view.nodename) {
105 //throw "no nodename given";
106 }
107 },
108
109 control: {
110 'radiofield': {
111 change: 'modeChange',
112 },
113 'pveNodeSelector': {
114 change: 'nodeChange',
115 },
116 },
117 },
118
119 items: [
120 {
121 xtype: 'inputpanel',
122 onGetValues: function(values) {
123 return this.up('window').getController().onGetValues(values);
124 },
125
126 onSetValues: function(values) {
127 return this.up('window').getController().onSetValues(values);
128 },
129
130 column1: [
131 {
132 xtype: 'pmxDisplayEditField',
133 fieldLabel: gettext('Name'),
134 cbind: {
135 editable: '{!name}',
136 value: '{name}',
137 submitValue: '{isCreate}',
138 },
139 name: 'name',
140 allowBlank: false,
141 },
142 {
143 xtype: 'pmxDisplayEditField',
144 fieldLabel: gettext('Node'),
145 name: 'node',
146 editConfig: {
147 xtype: 'pveNodeSelector',
148 },
149 cbind: {
150 editable: '{!nodename}',
151 value: '{nodename}',
152 },
153 allowBlank: false,
154 },
155 ],
156
157 column2: [
158 {
159 xtype: 'fieldcontainer',
160 defaultType: 'radiofield',
161 layout: 'fit',
162 items: [
163 {
164 name: 'usb',
165 inputValue: 'id',
166 checked: true,
167 boxLabel: gettext('Use USB Vendor/Device ID'),
168 submitValue: false,
169 },
170 {
171 xtype: 'pveUSBSelector',
172 type: 'device',
173 reference: 'id',
174 name: 'id',
175 cbind: {
176 nodename: '{nodename}',
177 },
178 editable: true,
179 allowBlank: false,
180 fieldLabel: gettext('Choose Device'),
181 labelAlign: 'right',
182 },
183 {
184 name: 'usb',
185 inputValue: 'path',
186 boxLabel: gettext('Use USB Port'),
187 submitValue: false,
188 },
189 {
190 xtype: 'pveUSBSelector',
191 disabled: true,
192 name: 'path',
193 reference: 'path',
194 cbind: {
195 nodename: '{nodename}',
196 },
197 editable: true,
198 type: 'port',
199 allowBlank: false,
200 fieldLabel: gettext('Choose Port'),
201 labelAlign: 'right',
202 },
203 ],
204 },
205 ],
206
207 columnB: [
208 {
209 xtype: 'proxmoxtextfield',
210 fieldLabel: gettext('Comment'),
211 submitValue: true,
212 name: 'description',
213 },
214 ],
215 },
216 ],
217 });