]>
Commit | Line | Data |
---|---|---|
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 | }); |