]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/qemu/HDEdit.js
use Checkbox from widget toolkit
[pve-manager.git] / www / manager6 / qemu / HDEdit.js
index 219fe9db3c1546611be011241395cc02a216639b..1b5bb80fba492050f68dc4e18b4d041ac69e6d1d 100644 (file)
@@ -1,8 +1,8 @@
-// fixme: howto avoid jslint type confusion?
 /*jslint confusion: true */
+/* 'change' property is assigned a string and then a function */
 Ext.define('PVE.qemu.HDInputPanel', {
     extend: 'PVE.panel.InputPanel',
-    alias: 'widget.PVE.qemu.HDInputPanel',
+    alias: 'widget.pveQemuHDInputPanel',
     onlineHelp: 'qm_hard_disk',
 
     insideWizard: false,
@@ -17,7 +17,19 @@ Ext.define('PVE.qemu.HDInputPanel', {
 
        onControllerChange: function(field) {
            var value = field.getValue();
-           this.lookup('iothread').setDisabled(!value.match(/^(virtio|scsi)/));
+
+           var allowIOthread = value.match(/^(virtio|scsi)/);
+           this.lookup('iothread').setDisabled(!allowIOthread);
+           if (!allowIOthread) {
+               this.lookup('iothread').setValue(false);
+           }
+
+           var scsi = value.match(/^scsi/);
+           this.lookup('discard').setDisabled(!scsi);
+           if (!scsi) {
+               this.lookup('discard').setValue(false);
+           }
+           this.lookup('scsiController').setVisible(scsi);
        },
 
        control: {
@@ -25,42 +37,13 @@ Ext.define('PVE.qemu.HDInputPanel', {
                change: 'onControllerChange',
                afterrender: 'onControllerChange'
            },
-           'field[name=hdstorage]': {
+           'field[name=iothread]' : {
                change: function(f, value) {
-                   if (!value) { // initial store loading fires an unwanted 'change'
+                   if (!this.getView().insideWizard) {
                        return;
                    }
-                   var me = this.getView();
-                   var rec = f.store.getById(value);
-                   if (rec.data.type === 'iscsi') {
-                       me.hdfilesel.setStorage(value);
-                       me.hdfilesel.setDisabled(false);
-                       me.formatsel.setValue('raw');
-                       me.formatsel.setDisabled(true);
-                       me.hdfilesel.setVisible(true);
-                       me.hdsizesel.setDisabled(true);
-                       me.hdsizesel.setVisible(false);
-                   } else if (rec.data.type === 'lvm' ||
-                              rec.data.type === 'lvmthin' ||
-                              rec.data.type === 'drbd' ||
-                              rec.data.type === 'rbd' ||
-                              rec.data.type === 'sheepdog' ||
-                              rec.data.type === 'zfs' ||
-                              rec.data.type === 'zfspool') {
-                       me.hdfilesel.setDisabled(true);
-                       me.hdfilesel.setVisible(false);
-                       me.formatsel.setValue('raw');
-                       me.formatsel.setDisabled(true);
-                       me.hdsizesel.setDisabled(false);
-                       me.hdsizesel.setVisible(true);
-                   } else {
-                       me.hdfilesel.setDisabled(true);
-                       me.hdfilesel.setVisible(false);
-                       me.formatsel.setValue('qcow2');
-                       me.formatsel.setDisabled(false);
-                       me.hdsizesel.setDisabled(false);
-                       me.hdsizesel.setVisible(true);
-                   }
+                   var vmScsiType = value ? 'virtio-scsi-single': 'virtio-scsi-pci';
+                   this.lookupReference('scsiController').setValue(vmScsiType);
                }
            }
        }
@@ -69,12 +52,13 @@ Ext.define('PVE.qemu.HDInputPanel', {
     onGetValues: function(values) {
        var me = this;
 
+       var params = {};
        var confid = me.confid || (values.controller + values.deviceid);
-       
+
        if (me.unused) {
            me.drive.file = me.vmconfig[values.unusedId];
            confid = values.controller + values.deviceid;
-       } else if (me.create) {
+       } else if (me.isCreate) {
            if (values.hdimage) {
                me.drive.file = values.hdimage;
            } else {
@@ -82,20 +66,26 @@ Ext.define('PVE.qemu.HDInputPanel', {
            }
            me.drive.format = values.diskformat;
        }
-       
+
        if (values.nobackup) {
            me.drive.backup = 'no';
        } else {
            delete me.drive.backup;
        }
 
+       if (values.noreplicate) {
+           me.drive.replicate = 'no';
+       } else {
+           delete me.drive.replicate;
+       }
+
        if (values.discard) {
            me.drive.discard = 'on';
        } else {
            delete me.drive.discard;
        }
 
-       if (values.iothread && confid.match(/^(virtio|scsi)\d+$/)) {
+       if (values.iothread) {
            me.drive.iothread = 'on';
        } else {
            delete me.drive.iothread;
@@ -107,11 +97,13 @@ Ext.define('PVE.qemu.HDInputPanel', {
            delete me.drive.cache;
        }
 
-       var params = {};
-               
+       if (values.scsihw) {
+           params.scsihw = values.scsihw;
+       }
+
        params[confid] = PVE.Parser.printQemuDrive(me.drive);
-       
-       return params;  
+
+       return params;
     },
 
     setVMConfig: function(vmconfig) {
@@ -120,10 +112,11 @@ Ext.define('PVE.qemu.HDInputPanel', {
        me.vmconfig = vmconfig;
 
        if (me.bussel) {
-           me.bussel.setVMConfig(vmconfig, true);
+           me.bussel.setVMConfig(vmconfig);
+           me.scsiController.setValue(vmconfig.scsihw);
        }
        if (me.unusedDisks) {
-           var disklist = [];      
+           var disklist = [];
            Ext.Object.each(vmconfig, function(key, value) {
                if (key.match(/^unused\d+$/)) {
                    disklist.push([key, value]);
@@ -147,6 +140,7 @@ Ext.define('PVE.qemu.HDInputPanel', {
 
        values.hdimage = drive.file;
        values.nobackup = !PVE.Parser.parseBoolean(drive.backup, 1);
+       values.noreplicate = !PVE.Parser.parseBoolean(drive.replicate, 1);
        values.diskformat = drive.format || 'raw';
        values.cache = drive.cache || '__default__';
        values.discard = (drive.discard === 'on');
@@ -157,8 +151,8 @@ Ext.define('PVE.qemu.HDInputPanel', {
 
     setNodename: function(nodename) {
        var me = this;
-       me.hdstoragesel.setNodename(nodename);
-       me.hdfilesel.setStorage(undefined, nodename);
+       me.down('#hdstorage').setNodename(nodename);
+       me.down('#hdimage').setStorage(undefined, nodename);
     },
 
     initComponent : function() {
@@ -174,11 +168,22 @@ Ext.define('PVE.qemu.HDInputPanel', {
                vmconfig: me.insideWizard ? {ide2: 'cdrom'} : {}
            });
            me.column1.push(me.bussel);
+
+           me.scsiController = Ext.create('Ext.form.field.Display', {
+               name: 'scsihw',
+               fieldLabel: gettext('SCSI Controller'),
+               reference: 'scsiController',
+               renderer: PVE.Utils.render_scsihw,
+               // do not change a VM wide option after creation
+               submitValue: me.insideWizard,
+               hidden: true
+           });
+           me.column1.push(me.scsiController);
        }
 
        if (me.unused) {
            me.unusedDisks = Ext.create('PVE.form.KVComboBox', {
-               name: 'unusedId',       
+               name: 'unusedId',
                fieldLabel: gettext('Disk image'),
                matchFieldWidth: false,
                listConfig: {
@@ -188,47 +193,14 @@ Ext.define('PVE.qemu.HDInputPanel', {
                allowBlank: false
            });
            me.column1.push(me.unusedDisks);
-       } else if (me.create) {
-           me.formatsel = Ext.create('PVE.form.DiskFormatSelector', {
-               name: 'diskformat',
-               fieldLabel: gettext('Format'),
-               value: 'qcow2',
-               allowBlank: false
-           });
-
-           me.hdfilesel = Ext.create('PVE.form.FileSelector', {
-               name: 'hdimage',
-               nodename: me.nodename,
+       } else if (me.isCreate) {
+           me.column1.push({
+               xtype: 'pveDiskStorageSelector',
                storageContent: 'images',
-               fieldLabel: gettext('Disk image'),
-               disabled: true,
-               hidden: true,
-               allowBlank: false
-           });
-
-           me.hdsizesel = Ext.createWidget('numberfield', {
-               name: 'disksize',
-               minValue: 0.001,
-               maxValue: 128*1024,
-               decimalPrecision: 3,
-               value: '32',
-               fieldLabel: gettext('Disk size') + ' (GB)',
-               allowBlank: false
-           });
-
-           me.hdstoragesel = Ext.create('PVE.form.StorageSelector', {
-               name: 'hdstorage',
+               name: 'disk',
                nodename: me.nodename,
-               fieldLabel: gettext('Storage'),
-               storageContent: 'images',
-               autoSelect: me.insideWizard,
-               allowBlank: false
+               autoSelect: me.insideWizard
            });
-           me.column1.push(me.hdstoragesel);
-           me.column1.push(me.hdfilesel);
-           me.column1.push(me.hdsizesel);
-           me.column1.push(me.formatsel);
-
        } else {
            me.column1.push({
                xtype: 'textfield',
@@ -244,24 +216,29 @@ Ext.define('PVE.qemu.HDInputPanel', {
            name: 'cache',
            value: '__default__',
            fieldLabel: gettext('Cache')
-       });
-
-       me.column2.push({
-           xtype: 'pvecheckbox',
+       },
+       {
+           xtype: 'proxmoxcheckbox',
            fieldLabel: gettext('No backup'),
            name: 'nobackup'
-       });
-
-       me.column2.push({
-           xtype: 'pvecheckbox',
+       },
+       {
+           xtype: 'proxmoxcheckbox',
+           hidden: me.insideWizard,
+           fieldLabel: gettext('Skip replication'),
+           name: 'noreplicate'
+       },
+       {
+           xtype: 'proxmoxcheckbox',
            fieldLabel: gettext('Discard'),
+           disabled: me.confid && !me.confid.match(/^scsi/),
+           reference: 'discard',
            name: 'discard'
-       });
-
-       me.column2.push({
-           xtype: 'pvecheckbox',
-           disabled: me.insideWizard || (me.confid && !me.confid.match(/^(virtio|scsi)/)),
-           fieldLabel: gettext('IO thread'),
+       },
+       {
+           xtype: 'proxmoxcheckbox',
+           disabled: me.confid && !me.confid.match(/^(virtio|scsi)/),
+           fieldLabel: 'IO thread',
            reference: 'iothread',
            name: 'iothread'
        });
@@ -269,6 +246,7 @@ Ext.define('PVE.qemu.HDInputPanel', {
        me.callParent();
     }
 });
+/*jslint confusion: false */
 
 Ext.define('PVE.qemu.HDEdit', {
     extend: 'PVE.window.Edit',
@@ -279,25 +257,25 @@ Ext.define('PVE.qemu.HDEdit', {
        var me = this;
 
        var nodename = me.pveSelNode.data.node;
-       if (!nodename) { 
-           throw "no node name specified";         
+       if (!nodename) {
+           throw "no node name specified";
        }
 
        var unused = me.confid && me.confid.match(/^unused\d+$/);
 
-       me.create = me.confid ? unused : true;
+       me.isCreate = me.confid ? unused : true;
 
        var ipanel = Ext.create('PVE.qemu.HDInputPanel', {
            confid: me.confid,
            nodename: nodename,
            unused: unused,
-           create: me.create
+           isCreate: me.isCreate
        });
 
        var subject;
        if (unused) {
            me.subject = gettext('Unused Disk');
-       } else if (me.create) {
+       } else if (me.isCreate) {
             me.subject = gettext('Hard Disk');
        } else {
            me.subject = gettext('Hard Disk') + ' (' + me.confid + ')';
@@ -306,7 +284,10 @@ Ext.define('PVE.qemu.HDEdit', {
        me.items = [ ipanel ];
 
        me.callParent();
-       
+       /*jslint confusion: true*/
+       /* 'data' is assigned an empty array in same file, and here we
+        * use it like an object
+        */
        me.load({
            success: function(response, options) {
                ipanel.setVMConfig(response.result.data);
@@ -323,5 +304,6 @@ Ext.define('PVE.qemu.HDEdit', {
                }
            }
        });
+       /*jslint confusion: false*/
     }
 });