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