]>
Commit | Line | Data |
---|---|---|
34c235be DC |
1 | /*jslint confusion: true*/ |
2 | /* hidden: boolean and string | |
3 | * bind: function and object | |
4 | * disabled: boolean and string | |
5 | */ | |
342225bf | 6 | Ext.define('PVE.lxc.MountPointInputPanel', { |
ef4ef788 | 7 | extend: 'Proxmox.panel.InputPanel', |
34c235be | 8 | xtype: 'pveLxcMountPointInputPanel', |
342225bf DC |
9 | |
10 | insideWizard: false, | |
11 | ||
12 | onlineHelp: 'pct_container_storage', | |
13 | ||
14 | unused: false, // add unused disk imaged | |
15 | ||
16 | unprivileged: false, | |
17 | ||
18 | vmconfig: {}, // used to select unused disks | |
19 | ||
658bf725 | 20 | setUnprivileged: function(unprivileged) { |
34c235be DC |
21 | var me = this; |
22 | var vm = me.getViewModel(); | |
23 | me.unprivileged = unprivileged; | |
24 | vm.set('unpriv', unprivileged); | |
658bf725 TL |
25 | }, |
26 | ||
342225bf DC |
27 | onGetValues: function(values) { |
28 | var me = this; | |
29 | ||
30 | var confid = me.confid || values.mpsel; | |
34c235be | 31 | values.file = me.down('field[name=file]').getValue(); |
342225bf DC |
32 | |
33 | if (me.unused) { | |
342225bf DC |
34 | confid = values.mpsel; |
35 | } else if (me.isCreate) { | |
34c235be | 36 | values.file = values.hdstorage + ':' + values.disksize; |
342225bf DC |
37 | } |
38 | ||
34c235be DC |
39 | // delete unnecessary fields |
40 | delete values.mpsel; | |
41 | delete values.hdstorage; | |
42 | delete values.disksize; | |
43 | delete values.diskformat; | |
342225bf DC |
44 | |
45 | var res = {}; | |
34c235be | 46 | res[confid] = PVE.Parser.printLxcMountPoint(values); |
342225bf DC |
47 | return res; |
48 | }, | |
49 | ||
34c235be | 50 | |
342225bf DC |
51 | setMountPoint: function(mp) { |
52 | var me = this; | |
34c235be DC |
53 | var vm = this.getViewModel(); |
54 | vm.set('mptype', mp.type); | |
342225bf DC |
55 | me.setValues(mp); |
56 | }, | |
57 | ||
58 | setVMConfig: function(vmconfig) { | |
59 | var me = this; | |
34c235be | 60 | var vm = me.getViewModel(); |
342225bf | 61 | me.vmconfig = vmconfig; |
34c235be DC |
62 | vm.set('unpriv', vmconfig.unprivileged); |
63 | vm.notify(); | |
64 | ||
65 | PVE.Utils.forEachMP(function(bus, i) { | |
66 | var name = "mp" + i.toString(); | |
67 | if (!Ext.isDefined(vmconfig[name])) { | |
68 | me.down('field[name=mpsel]').setValue(name); | |
69 | return false; | |
342225bf | 70 | } |
34c235be | 71 | }); |
342225bf DC |
72 | }, |
73 | ||
74 | setNodename: function(nodename) { | |
75 | var me = this; | |
34c235be DC |
76 | var vm = me.getViewModel(); |
77 | vm.set('node', nodename); | |
78 | vm.notify(); | |
79 | me.down('#diskstorage').setNodename(nodename); | |
342225bf DC |
80 | }, |
81 | ||
34c235be DC |
82 | controller: { |
83 | xclass: 'Ext.app.ViewController', | |
342225bf | 84 | |
34c235be DC |
85 | control: { |
86 | 'field[name=mpsel]': { | |
87 | change: function(field, value) { | |
88 | field.validate(); | |
89 | } | |
90 | }, | |
91 | '#hdstorage': { | |
92 | change: function(field, newValue) { | |
93 | var me = this; | |
94 | if (!newValue) { | |
342225bf DC |
95 | return; |
96 | } | |
34c235be DC |
97 | |
98 | var rec = field.store.getById(newValue); | |
99 | if (!rec) { | |
100 | return; | |
342225bf | 101 | } |
34c235be DC |
102 | |
103 | var vm = me.getViewModel(); | |
104 | vm.set('type', rec.data.type); | |
105 | vm.notify(); | |
342225bf | 106 | } |
34c235be DC |
107 | } |
108 | }, | |
109 | ||
110 | init: function(view) { | |
111 | var me = this; | |
112 | var vm = this.getViewModel(); | |
113 | vm.set('confid', view.confid); | |
114 | vm.set('unused', view.unused); | |
115 | vm.set('node', view.nodename); | |
116 | vm.set('unpriv', view.unprivileged); | |
117 | vm.set('hideStorSelector', view.unused || !view.isCreate); | |
118 | vm.notify(); | |
119 | } | |
120 | }, | |
121 | ||
122 | viewModel: { | |
123 | data: { | |
124 | unpriv: false, | |
125 | unused: false, | |
126 | showStorageSelector: false, | |
127 | mptype: '', | |
128 | type: '', | |
129 | confid: '', | |
130 | node: '' | |
131 | }, | |
132 | ||
133 | formulas: { | |
134 | quota: function(get) { | |
135 | return !(get('type') === 'zfs' || | |
136 | get('type') === 'zfspool' || | |
137 | get('unpriv') || | |
138 | get('isBind')); | |
139 | }, | |
140 | hasMP: function(get) { | |
141 | return !!get('confid') && !get('unused'); | |
142 | }, | |
143 | isRoot: function(get) { | |
144 | return get('confid') === 'rootfs'; | |
145 | }, | |
146 | isBind: function(get) { | |
147 | return get('mptype') === 'bind'; | |
148 | }, | |
149 | isBindOrRoot: function(get) { | |
150 | return get('isBind') || get('isRoot'); | |
151 | } | |
342225bf | 152 | } |
34c235be | 153 | }, |
342225bf | 154 | |
34c235be DC |
155 | column1: [ |
156 | { | |
157 | xtype: 'proxmoxKVComboBox', | |
158 | name: 'mpsel', | |
159 | fieldLabel: gettext('Mount Point'), | |
160 | matchFieldWidth: false, | |
161 | hidden: true, | |
162 | allowBlank: false, | |
6c442961 | 163 | disabled: true, |
34c235be DC |
164 | bind: { |
165 | hidden: '{hasMP}', | |
166 | disabled: '{hasMP}' | |
167 | }, | |
168 | comboItems: (function(){ | |
169 | var mps = []; | |
170 | PVE.Utils.forEachMP(function(bus,i) { | |
171 | var name = 'mp' + i.toString(); | |
172 | mps.push([name,name]); | |
173 | }); | |
174 | return mps; | |
175 | }()), | |
176 | validator: function(value) { | |
177 | var me = this.up('inputpanel'); | |
178 | if (!me.rendered) { | |
179 | return; | |
180 | } | |
181 | if (Ext.isDefined(me.vmconfig[value])) { | |
182 | return "Mount point is already in use."; | |
183 | } | |
184 | /*jslint confusion: true*/ | |
185 | /* returns a string above */ | |
186 | return true; | |
187 | } | |
188 | }, | |
189 | { | |
234d2e37 | 190 | xtype: 'pveDiskStorageSelector', |
34c235be | 191 | itemId: 'diskstorage', |
342225bf | 192 | storageContent: 'rootdir', |
34c235be | 193 | hidden: true, |
342225bf | 194 | autoSelect: true, |
34c235be | 195 | selectformat: false, |
c6c8e2fc | 196 | defaultSize: 8, |
34c235be DC |
197 | bind: { |
198 | hidden: '{hideStorSelector}', | |
199 | disabled: '{hideStorSelector}', | |
200 | nodename: '{node}' | |
201 | } | |
202 | }, | |
203 | { | |
204 | xtype: 'textfield', | |
205 | disabled: true, | |
206 | submitValue: false, | |
207 | fieldLabel: gettext('Disk image'), | |
208 | name: 'file', | |
209 | bind: { | |
210 | hidden: '{!hideStorSelector}' | |
211 | } | |
342225bf | 212 | } |
34c235be DC |
213 | ], |
214 | ||
215 | column2: [ | |
216 | { | |
217 | xtype: 'textfield', | |
218 | name: 'mp', | |
219 | value: '', | |
220 | emptyText: gettext('/some/path'), | |
221 | allowBlank: false, | |
6c442961 | 222 | disabled: true, |
34c235be DC |
223 | fieldLabel: gettext('Path'), |
224 | bind: { | |
225 | hidden: '{isRoot}', | |
226 | disabled: '{isRoot}' | |
227 | } | |
228 | }, | |
229 | { | |
230 | xtype: 'proxmoxcheckbox', | |
231 | name: 'backup', | |
232 | fieldLabel: gettext('Backup'), | |
233 | bind: { | |
234 | hidden: '{isRoot}', | |
235 | disabled: '{isBindOrRoot}' | |
236 | } | |
237 | } | |
238 | ], | |
342225bf | 239 | |
34c235be DC |
240 | advancedColumn1: [ |
241 | { | |
242 | xtype: 'proxmoxcheckbox', | |
342225bf DC |
243 | name: 'quota', |
244 | defaultValue: 0, | |
34c235be DC |
245 | bind: { |
246 | disabled: '{!quota}' | |
247 | }, | |
658bf725 TL |
248 | fieldLabel: gettext('Enable quota'), |
249 | listeners: { | |
250 | disable: function() { | |
251 | this.reset(); | |
252 | } | |
253 | } | |
34c235be DC |
254 | }, |
255 | { | |
256 | xtype: 'proxmoxcheckbox', | |
257 | name: 'ro', | |
258 | defaultValue: 0, | |
259 | bind: { | |
260 | hidden: '{isRoot}', | |
261 | disabled: '{isRoot}' | |
262 | }, | |
263 | fieldLabel: gettext('Read-only') | |
342225bf | 264 | } |
34c235be | 265 | ], |
342225bf | 266 | |
34c235be DC |
267 | advancedColumn2: [ |
268 | { | |
269 | xtype: 'proxmoxKVComboBox', | |
270 | name: 'acl', | |
271 | fieldLabel: 'ACLs', | |
272 | deleteEmpty: false, | |
273 | comboItems: [ | |
274 | ['__default__', Proxmox.Utils.defaultText], | |
275 | ['1', Proxmox.Utils.enabledText], | |
276 | ['0', Proxmox.Utils.disabledText] | |
277 | ], | |
278 | value: '__default__', | |
279 | bind: { | |
280 | disabled: '{isBind}' | |
281 | }, | |
282 | allowBlank: true | |
283 | }, | |
284 | { | |
285 | xtype: 'proxmoxcheckbox', | |
286 | inputValue: '0', // reverses the logic | |
287 | name: 'replicate', | |
288 | fieldLabel: gettext('Skip replication') | |
234d2e37 | 289 | } |
34c235be | 290 | ] |
342225bf DC |
291 | }); |
292 | ||
293 | Ext.define('PVE.lxc.MountPointEdit', { | |
9fccc702 | 294 | extend: 'Proxmox.window.Edit', |
342225bf DC |
295 | |
296 | unprivileged: false, | |
297 | ||
298 | initComponent : function() { | |
299 | var me = this; | |
300 | ||
301 | var nodename = me.pveSelNode.data.node; | |
302 | if (!nodename) { | |
303 | throw "no node name specified"; | |
304 | } | |
305 | ||
306 | var unused = me.confid && me.confid.match(/^unused\d+$/); | |
307 | ||
308 | me.isCreate = me.confid ? unused : true; | |
309 | ||
310 | var ipanel = Ext.create('PVE.lxc.MountPointInputPanel', { | |
311 | confid: me.confid, | |
312 | nodename: nodename, | |
313 | unused: unused, | |
314 | unprivileged: me.unprivileged, | |
315 | isCreate: me.isCreate | |
316 | }); | |
317 | ||
318 | var subject; | |
319 | if (unused) { | |
320 | subject = gettext('Unused Disk'); | |
321 | } else if (me.isCreate) { | |
322 | subject = gettext('Mount Point'); | |
323 | } else { | |
324 | subject = gettext('Mount Point') + ' (' + me.confid + ')'; | |
325 | } | |
326 | ||
327 | Ext.apply(me, { | |
328 | subject: subject, | |
dc683ca0 | 329 | defaultFocus: me.confid !== 'rootfs' ? 'textfield[name=mp]' : 'tool', |
342225bf DC |
330 | items: ipanel |
331 | }); | |
332 | ||
333 | me.callParent(); | |
334 | ||
335 | me.load({ | |
336 | success: function(response, options) { | |
337 | ipanel.setVMConfig(response.result.data); | |
338 | if (me.confid) { | |
339 | /*jslint confusion: true*/ | |
340 | /*data is defined as array above*/ | |
341 | var value = response.result.data[me.confid]; | |
342 | /*jslint confusion: false*/ | |
343 | var mp = PVE.Parser.parseLxcMountPoint(value); | |
344 | ||
345 | if (!mp) { | |
346 | Ext.Msg.alert(gettext('Error'), 'Unable to parse mount point options'); | |
347 | me.close(); | |
348 | return; | |
349 | } | |
350 | ||
351 | ipanel.setMountPoint(mp); | |
352 | me.isValid(); // trigger validation | |
353 | } | |
354 | } | |
355 | }); | |
356 | } | |
357 | }); |