]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/qemu/HDEdit.js
add advanced checkbox to the wizard
[pve-manager.git] / www / manager6 / qemu / HDEdit.js
CommitLineData
df15b3da 1/*jslint confusion: true */
d5e771ce 2/* 'change' property is assigned a string and then a function */
df15b3da 3Ext.define('PVE.qemu.HDInputPanel', {
ef4ef788 4 extend: 'Proxmox.panel.InputPanel',
85806e47 5 alias: 'widget.pveQemuHDInputPanel',
c8802a60 6 onlineHelp: 'qm_hard_disk',
df15b3da
DM
7
8 insideWizard: false,
9
10 unused: false, // ADD usused disk imaged
11
12 vmconfig: {}, // used to select usused disks
13
180d7ef5
DM
14 controller: {
15
16 xclass: 'Ext.app.ViewController',
17
18 onControllerChange: function(field) {
19 var value = field.getValue();
ed1ac8f4
TL
20
21 var allowIOthread = value.match(/^(virtio|scsi)/);
22 this.lookup('iothread').setDisabled(!allowIOthread);
23 if (!allowIOthread) {
24 this.lookup('iothread').setValue(false);
25 }
36958639 26
42bd6556
EK
27 var scsi = value.match(/^scsi/);
28 this.lookup('discard').setDisabled(!scsi);
29 if (!scsi) {
36958639
TL
30 this.lookup('discard').setValue(false);
31 }
42bd6556 32 this.lookup('scsiController').setVisible(scsi);
180d7ef5
DM
33 },
34
35 control: {
9cac6b75 36 'field[name=controller]': {
180d7ef5
DM
37 change: 'onControllerChange',
38 afterrender: 'onControllerChange'
9cac6b75 39 },
2414ef15
EK
40 'field[name=iothread]' : {
41 change: function(f, value) {
42 if (!this.getView().insideWizard) {
43 return;
44 }
45 var vmScsiType = value ? 'virtio-scsi-single': 'virtio-scsi-pci';
46 this.lookupReference('scsiController').setValue(vmScsiType);
47 }
180d7ef5
DM
48 }
49 }
50 },
51
df15b3da
DM
52 onGetValues: function(values) {
53 var me = this;
54
9a8a5735 55 var params = {};
df15b3da 56 var confid = me.confid || (values.controller + values.deviceid);
7a6e0635 57
df15b3da
DM
58 if (me.unused) {
59 me.drive.file = me.vmconfig[values.unusedId];
60 confid = values.controller + values.deviceid;
d5e771ce 61 } else if (me.isCreate) {
df15b3da
DM
62 if (values.hdimage) {
63 me.drive.file = values.hdimage;
64 } else {
65 me.drive.file = values.hdstorage + ":" + values.disksize;
66 }
67 me.drive.format = values.diskformat;
68 }
7a6e0635 69
df15b3da
DM
70 if (values.nobackup) {
71 me.drive.backup = 'no';
72 } else {
73 delete me.drive.backup;
74 }
75
1b6f87ab
EK
76 if (values.noreplicate) {
77 me.drive.replicate = 'no';
78 } else {
79 delete me.drive.replicate;
80 }
81
df15b3da
DM
82 if (values.discard) {
83 me.drive.discard = 'on';
84 } else {
85 delete me.drive.discard;
86 }
87
ed1ac8f4 88 if (values.iothread) {
df15b3da
DM
89 me.drive.iothread = 'on';
90 } else {
91 delete me.drive.iothread;
92 }
93
94 if (values.cache) {
95 me.drive.cache = values.cache;
96 } else {
97 delete me.drive.cache;
98 }
99
2414ef15
EK
100 if (values.scsihw) {
101 params.scsihw = values.scsihw;
102 }
103
df15b3da 104 params[confid] = PVE.Parser.printQemuDrive(me.drive);
7a6e0635
TL
105
106 return params;
df15b3da
DM
107 },
108
109 setVMConfig: function(vmconfig) {
110 var me = this;
111
112 me.vmconfig = vmconfig;
113
114 if (me.bussel) {
7206af4b 115 me.bussel.setVMConfig(vmconfig);
42bd6556 116 me.scsiController.setValue(vmconfig.scsihw);
df15b3da
DM
117 }
118 if (me.unusedDisks) {
7a6e0635 119 var disklist = [];
df15b3da
DM
120 Ext.Object.each(vmconfig, function(key, value) {
121 if (key.match(/^unused\d+$/)) {
122 disklist.push([key, value]);
123 }
124 });
125 me.unusedDisks.store.loadData(disklist);
126 me.unusedDisks.setValue(me.confid);
127 }
128 },
129
130 setDrive: function(drive) {
131 var me = this;
132
133 me.drive = drive;
134
135 var values = {};
136 var match = drive.file.match(/^([^:]+):/);
137 if (match) {
138 values.hdstorage = match[1];
139 }
140
141 values.hdimage = drive.file;
142 values.nobackup = !PVE.Parser.parseBoolean(drive.backup, 1);
1b6f87ab 143 values.noreplicate = !PVE.Parser.parseBoolean(drive.replicate, 1);
df15b3da 144 values.diskformat = drive.format || 'raw';
ac7db8f7 145 values.cache = drive.cache || '__default__';
df15b3da
DM
146 values.discard = (drive.discard === 'on');
147 values.iothread = PVE.Parser.parseBoolean(drive.iothread);
148
149 me.setValues(values);
150 },
151
152 setNodename: function(nodename) {
153 var me = this;
771aec96
DC
154 me.down('#hdstorage').setNodename(nodename);
155 me.down('#hdimage').setStorage(undefined, nodename);
df15b3da
DM
156 },
157
158 initComponent : function() {
159 var me = this;
160
161 me.drive = {};
162
163 me.column1 = [];
164 me.column2 = [];
165
166 if (!me.confid || me.unused) {
42902182 167 me.bussel = Ext.create('PVE.form.ControllerSelector', {
df15b3da
DM
168 vmconfig: me.insideWizard ? {ide2: 'cdrom'} : {}
169 });
170 me.column1.push(me.bussel);
2414ef15 171
42bd6556 172 me.scsiController = Ext.create('Ext.form.field.Display', {
2414ef15 173 name: 'scsihw',
42bd6556
EK
174 fieldLabel: gettext('SCSI Controller'),
175 reference: 'scsiController',
176 renderer: PVE.Utils.render_scsihw,
2414ef15
EK
177 // do not change a VM wide option after creation
178 submitValue: me.insideWizard,
42bd6556
EK
179 hidden: true
180 });
181 me.column1.push(me.scsiController);
df15b3da
DM
182 }
183
184 if (me.unused) {
09cacce7 185 me.unusedDisks = Ext.create('Proxmox.form.KVComboBox', {
7a6e0635 186 name: 'unusedId',
df15b3da
DM
187 fieldLabel: gettext('Disk image'),
188 matchFieldWidth: false,
189 listConfig: {
190 width: 350
191 },
192 data: [],
193 allowBlank: false
194 });
195 me.column1.push(me.unusedDisks);
d5e771ce 196 } else if (me.isCreate) {
771aec96
DC
197 me.column1.push({
198 xtype: 'pveDiskStorageSelector',
df15b3da 199 storageContent: 'images',
771aec96 200 name: 'disk',
df15b3da 201 nodename: me.nodename,
771aec96 202 autoSelect: me.insideWizard
df15b3da 203 });
df15b3da
DM
204 } else {
205 me.column1.push({
206 xtype: 'textfield',
207 disabled: true,
208 submitValue: false,
209 fieldLabel: gettext('Disk image'),
210 name: 'hdimage'
211 });
212 }
213
214 me.column2.push({
215 xtype: 'CacheTypeSelector',
216 name: 'cache',
ca6372bd 217 value: '__default__',
df15b3da 218 fieldLabel: gettext('Cache')
2d06e723
TL
219 },
220 {
896c0d50 221 xtype: 'proxmoxcheckbox',
df15b3da
DM
222 fieldLabel: gettext('No backup'),
223 name: 'nobackup'
2d06e723
TL
224 },
225 {
896c0d50 226 xtype: 'proxmoxcheckbox',
1b6f87ab
EK
227 hidden: me.insideWizard,
228 fieldLabel: gettext('Skip replication'),
229 name: 'noreplicate'
2d06e723
TL
230 },
231 {
896c0d50 232 xtype: 'proxmoxcheckbox',
df15b3da 233 fieldLabel: gettext('Discard'),
36958639
TL
234 disabled: me.confid && !me.confid.match(/^scsi/),
235 reference: 'discard',
df15b3da 236 name: 'discard'
2d06e723
TL
237 },
238 {
896c0d50 239 xtype: 'proxmoxcheckbox',
ed1ac8f4 240 disabled: me.confid && !me.confid.match(/^(virtio|scsi)/),
a1af3e38 241 fieldLabel: 'IO thread',
180d7ef5 242 reference: 'iothread',
df15b3da
DM
243 name: 'iothread'
244 });
245
246 me.callParent();
247 }
248});
d5e771ce 249/*jslint confusion: false */
df15b3da
DM
250
251Ext.define('PVE.qemu.HDEdit', {
9fccc702 252 extend: 'Proxmox.window.Edit',
df15b3da
DM
253
254 isAdd: true,
255
256 initComponent : function() {
257 var me = this;
258
259 var nodename = me.pveSelNode.data.node;
7a6e0635
TL
260 if (!nodename) {
261 throw "no node name specified";
df15b3da
DM
262 }
263
264 var unused = me.confid && me.confid.match(/^unused\d+$/);
265
d5e771ce 266 me.isCreate = me.confid ? unused : true;
df15b3da
DM
267
268 var ipanel = Ext.create('PVE.qemu.HDInputPanel', {
269 confid: me.confid,
270 nodename: nodename,
271 unused: unused,
d5e771ce 272 isCreate: me.isCreate
df15b3da
DM
273 });
274
275 var subject;
276 if (unused) {
277 me.subject = gettext('Unused Disk');
d5e771ce 278 } else if (me.isCreate) {
df15b3da
DM
279 me.subject = gettext('Hard Disk');
280 } else {
281 me.subject = gettext('Hard Disk') + ' (' + me.confid + ')';
282 }
283
284 me.items = [ ipanel ];
285
286 me.callParent();
d5e771ce
EK
287 /*jslint confusion: true*/
288 /* 'data' is assigned an empty array in same file, and here we
289 * use it like an object
290 */
df15b3da
DM
291 me.load({
292 success: function(response, options) {
293 ipanel.setVMConfig(response.result.data);
294 if (me.confid) {
295 var value = response.result.data[me.confid];
296 var drive = PVE.Parser.parseQemuDrive(me.confid, value);
297 if (!drive) {
185a77e5 298 Ext.Msg.alert(gettext('Error'), 'Unable to parse drive options');
df15b3da
DM
299 me.close();
300 return;
301 }
302 ipanel.setDrive(drive);
303 me.isValid(); // trigger validation
304 }
305 }
306 });
d5e771ce 307 /*jslint confusion: false*/
df15b3da
DM
308 }
309});