mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-08-08 00:04:14 +00:00
Use component references via lookupReference()
This allows to add the components in each column in the order they appear in the Clone Window. References from child components are kept in an object in the parent component so it should be the same performance-wise (contrary to to Ext.ComponentQuery which is doing DOM parsing)
This commit is contained in:
parent
7edaceb484
commit
406ac585db
@ -25,11 +25,11 @@ Ext.define('PVE.window.Clone', {
|
|||||||
create_clone: function(values) {
|
create_clone: function(values) {
|
||||||
var me = this;
|
var me = this;
|
||||||
|
|
||||||
var params = { newid: values.newvmid };
|
var params = { newid: values.newvmid };
|
||||||
|
|
||||||
if (values.snapname && values.snapname !== 'current') {
|
if (values.snapname && values.snapname !== 'current') {
|
||||||
params.snapname = values.snapname;
|
params.snapname = values.snapname;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (values.pool) {
|
if (values.pool) {
|
||||||
params.pool = values.pool;
|
params.pool = values.pool;
|
||||||
@ -75,40 +75,43 @@ Ext.define('PVE.window.Clone', {
|
|||||||
updateVisibility: function() {
|
updateVisibility: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
|
|
||||||
var clonemode = me.cloneModeSel.getValue();
|
var storagesel = me.lookupReference('storagesel');
|
||||||
var storage = me.hdstoragesel.getValue();
|
var formatsel = me.lookupReference('formatsel');
|
||||||
var rec = me.hdstoragesel.store.getById(storage);
|
|
||||||
|
|
||||||
me.hdstoragesel.setDisabled(clonemode === 'clone');
|
var clonemode = me.lookupReference('clonemodesel').getValue();
|
||||||
|
var storage = storagesel.getValue();
|
||||||
|
var rec = storagesel.store.getById(storage);
|
||||||
|
|
||||||
|
storagesel.setDisabled(clonemode === 'clone');
|
||||||
|
|
||||||
if (!rec || clonemode === 'clone') {
|
if (!rec || clonemode === 'clone') {
|
||||||
me.formatsel.setDisabled(true);
|
formatsel.setDisabled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rec.data.type === 'lvm' ||
|
if (rec.data.type === 'lvm' ||
|
||||||
rec.data.type === 'lvmthin' ||
|
rec.data.type === 'lvmthin' ||
|
||||||
rec.data.type === 'rbd' ||
|
rec.data.type === 'rbd' ||
|
||||||
rec.data.type === 'iscsi' ||
|
rec.data.type === 'iscsi' ||
|
||||||
rec.data.type === 'sheepdog' ||
|
rec.data.type === 'sheepdog' ||
|
||||||
rec.data.type === 'zfs' ||
|
rec.data.type === 'zfs' ||
|
||||||
rec.data.type === 'zfspool'
|
rec.data.type === 'zfspool'
|
||||||
) {
|
) {
|
||||||
me.formatsel.setValue('raw');
|
formatsel.setValue('raw');
|
||||||
me.formatsel.setDisabled(true);
|
formatsel.setDisabled(true);
|
||||||
} else {
|
} else {
|
||||||
me.formatsel.setValue('qcow2');
|
formatsel.setValue('qcow2');
|
||||||
me.formatsel.setDisabled(false);
|
formatsel.setDisabled(false);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// add to the list of valid nodes each node where
|
// add to the list of valid nodes each node where
|
||||||
// all the VM disks are available
|
// all the VM disks are available
|
||||||
verifyFeature: function() {
|
verifyFeature: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
|
|
||||||
var snapname = me.snapshotSel.getValue();
|
var snapname = me.lookupReference('snapshotsel').getValue();
|
||||||
var clonemode = me.cloneModeSel.getValue();
|
var clonemode = me.lookupReference('clonemodesel').getValue();
|
||||||
|
|
||||||
var params = { feature: clonemode };
|
var params = { feature: clonemode };
|
||||||
if (snapname !== 'current') {
|
if (snapname !== 'current') {
|
||||||
@ -125,10 +128,10 @@ Ext.define('PVE.window.Clone', {
|
|||||||
Ext.Msg.alert('Error', response.htmlStatus);
|
Ext.Msg.alert('Error', response.htmlStatus);
|
||||||
},
|
},
|
||||||
success: function(response, options) {
|
success: function(response, options) {
|
||||||
var res = response.result.data;
|
var res = response.result.data;
|
||||||
|
|
||||||
me.targetSel.allowedNodes = res.nodes;
|
me.lookupReference('targetsel').allowedNodes = res.nodes;
|
||||||
me.targetSel.validate();
|
me.lookupReference('targetsel').validate();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -148,117 +151,117 @@ Ext.define('PVE.window.Clone', {
|
|||||||
me.snapname = 'current';
|
me.snapname = 'current';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var titletext = me.isTemplate ? "Template" : "VM";
|
||||||
|
me.title = "Clone " + titletext + " " + me.vmid;
|
||||||
|
|
||||||
var col1 = [];
|
var col1 = [];
|
||||||
var col2 = [];
|
var col2 = [];
|
||||||
|
|
||||||
me.targetSel = Ext.create('PVE.form.NodeSelector', {
|
col1.push({
|
||||||
|
xtype: 'pveNodeSelector',
|
||||||
name: 'target',
|
name: 'target',
|
||||||
|
reference: 'targetsel',
|
||||||
fieldLabel: gettext('Target node'),
|
fieldLabel: gettext('Target node'),
|
||||||
selectCurNode: true,
|
selectCurNode: true,
|
||||||
allowBlank: false,
|
allowBlank: false,
|
||||||
onlineValidator: true
|
onlineValidator: true,
|
||||||
|
listeners: {
|
||||||
|
change: function(f, value) {
|
||||||
|
me.lookupReference('storagesel').setTargetNode(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
col1.push(me.targetSel);
|
|
||||||
|
|
||||||
var modelist = [['copy', gettext('Full Clone')]];
|
var modelist = [['copy', gettext('Full Clone')]];
|
||||||
if (me.isTemplate) {
|
if (me.isTemplate) {
|
||||||
modelist.push(['clone', gettext('Linked Clone')]);
|
modelist.push(['clone', gettext('Linked Clone')]);
|
||||||
}
|
}
|
||||||
|
|
||||||
me.cloneModeSel = Ext.create('PVE.form.KVComboBox', {
|
col1.push({
|
||||||
fieldLabel: gettext('Mode'),
|
xtype: 'pveGuestIDSelector',
|
||||||
name: 'clonemode',
|
name: 'newvmid',
|
||||||
allowBlank: false,
|
guestType: 'qemu',
|
||||||
hidden: !me.isTemplate,
|
value: '',
|
||||||
|
loadNextFreeID: true,
|
||||||
|
validateExists: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'textfield',
|
||||||
|
name: 'name',
|
||||||
|
allowBlank: true,
|
||||||
|
fieldLabel: gettext('Name')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'pvePoolSelector',
|
||||||
|
fieldLabel: gettext('Resource Pool'),
|
||||||
|
name: 'pool',
|
||||||
|
value: '',
|
||||||
|
allowBlank: true
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
col2.push({
|
||||||
|
xtype: 'pveKVComboBox',
|
||||||
|
fieldLabel: gettext('Mode'),
|
||||||
|
name: 'clonemode',
|
||||||
|
reference: 'clonemodesel',
|
||||||
|
allowBlank: false,
|
||||||
|
hidden: !me.isTemplate,
|
||||||
value: me.isTemplate ? 'clone' : 'copy',
|
value: me.isTemplate ? 'clone' : 'copy',
|
||||||
comboItems: modelist
|
comboItems: modelist,
|
||||||
});
|
listeners: {
|
||||||
|
change: function(t, value) {
|
||||||
me.mon(me.cloneModeSel, 'change', function(t, value) {
|
me.updateVisibility();
|
||||||
me.updateVisibility();
|
me.verifyFeature();
|
||||||
me.verifyFeature();
|
}
|
||||||
});
|
}
|
||||||
|
},
|
||||||
col2.push(me.cloneModeSel);
|
{
|
||||||
|
xtype: 'PVE.form.SnapshotSelector',
|
||||||
me.snapshotSel = Ext.create('PVE.form.SnapshotSelector', {
|
|
||||||
name: 'snapname',
|
name: 'snapname',
|
||||||
|
reference: 'snapshotsel',
|
||||||
fieldLabel: gettext('Snapshot'),
|
fieldLabel: gettext('Snapshot'),
|
||||||
nodename: me.nodename,
|
nodename: me.nodename,
|
||||||
vmid: me.vmid,
|
vmid: me.vmid,
|
||||||
hidden: me.isTemplate || !me.hasSnapshots ? true : false,
|
hidden: me.isTemplate || !me.hasSnapshots ? true : false,
|
||||||
disabled: false,
|
disabled: false,
|
||||||
allowBlank: false,
|
allowBlank: false,
|
||||||
value : me.snapname,
|
value : me.snapname,
|
||||||
listeners: {
|
listeners: {
|
||||||
change: function(f, value) {
|
change: function(f, value) {
|
||||||
// current selected snaphshot has maybe local disks
|
|
||||||
me.verifyFeature();
|
me.verifyFeature();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
{
|
||||||
col2.push(me.snapshotSel);
|
xtype: 'pveStorageSelector',
|
||||||
|
name: 'storage',
|
||||||
col1.push(
|
reference: 'storagesel',
|
||||||
{
|
nodename: me.nodename,
|
||||||
xtype: 'pveGuestIDSelector',
|
fieldLabel: gettext('Target Storage'),
|
||||||
name: 'newvmid',
|
storageContent: 'images',
|
||||||
guestType: 'qemu',
|
autoSelect: true,
|
||||||
value: '',
|
allowBlank: true,
|
||||||
loadNextFreeID: true,
|
disabled: me.isTemplate ? true : false, // because default mode is clone for templates
|
||||||
validateExists: false
|
hidden: false,
|
||||||
},
|
listeners: {
|
||||||
{
|
change: function(f, value) {
|
||||||
xtype: 'textfield',
|
me.updateVisibility();
|
||||||
name: 'name',
|
}
|
||||||
allowBlank: true,
|
}
|
||||||
fieldLabel: gettext('Name')
|
},
|
||||||
},
|
{
|
||||||
{
|
xtype: 'pveDiskFormatSelector',
|
||||||
xtype: 'pvePoolSelector',
|
|
||||||
fieldLabel: gettext('Resource Pool'),
|
|
||||||
name: 'pool',
|
|
||||||
value: '',
|
|
||||||
allowBlank: true
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
me.hdstoragesel = Ext.create('PVE.form.StorageSelector', {
|
|
||||||
name: 'storage',
|
|
||||||
nodename: me.nodename,
|
|
||||||
fieldLabel: gettext('Target Storage'),
|
|
||||||
storageContent: 'images',
|
|
||||||
autoSelect: me.insideWizard,
|
|
||||||
allowBlank: true,
|
|
||||||
disabled: me.isTemplate ? true : false, // because default mode is clone for templates
|
|
||||||
hidden: false,
|
|
||||||
listeners: {
|
|
||||||
change: function(f, value) {
|
|
||||||
me.updateVisibility();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
me.targetSel.on('change', function(f, value) {
|
|
||||||
me.hdstoragesel.setTargetNode(value);
|
|
||||||
});
|
|
||||||
|
|
||||||
me.formatsel = Ext.create('PVE.form.DiskFormatSelector', {
|
|
||||||
name: 'diskformat',
|
name: 'diskformat',
|
||||||
|
reference: 'formatsel',
|
||||||
fieldLabel: gettext('Format'),
|
fieldLabel: gettext('Format'),
|
||||||
value: 'raw',
|
value: 'raw',
|
||||||
disabled: true,
|
disabled: true,
|
||||||
hidden: false,
|
hidden: false,
|
||||||
allowBlank: false
|
allowBlank: false
|
||||||
});
|
});
|
||||||
|
|
||||||
col2.push(me.hdstoragesel);
|
var formPanel = Ext.create('Ext.form.Panel', {
|
||||||
col2.push(me.formatsel);
|
|
||||||
|
|
||||||
me.formPanel = Ext.create('Ext.form.Panel', {
|
|
||||||
bodyPadding: 10,
|
bodyPadding: 10,
|
||||||
reference: 'cloneform',
|
reference: 'cloneform',
|
||||||
border: false,
|
border: false,
|
||||||
@ -285,36 +288,31 @@ Ext.define('PVE.window.Clone', {
|
|||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
var form = me.formPanel.getForm();
|
|
||||||
|
|
||||||
var titletext = me.isTemplate ? "Template" : "VM";
|
|
||||||
me.title = "Clone " + titletext + " " + me.vmid;
|
|
||||||
|
|
||||||
me.submitBtn = Ext.create('Ext.Button', {
|
|
||||||
reference: 'submitBtn',
|
|
||||||
text: gettext('Clone'),
|
|
||||||
disabled: true,
|
|
||||||
handler: function() {
|
|
||||||
if (form.isValid()) {
|
|
||||||
var values = form.getValues();
|
|
||||||
me.create_clone(values);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var helpButton = Ext.create('PVE.button.Help', {
|
|
||||||
listenToGlobalEvent: false,
|
|
||||||
hidden: false,
|
|
||||||
onlineHelp: me.onlineHelp});
|
|
||||||
|
|
||||||
Ext.apply(me, {
|
Ext.apply(me, {
|
||||||
modal: true,
|
modal: true,
|
||||||
width: 600,
|
width: 600,
|
||||||
height: 250,
|
height: 250,
|
||||||
border: false,
|
border: false,
|
||||||
layout: 'fit',
|
layout: 'fit',
|
||||||
buttons: [ helpButton, '->', me.submitBtn ],
|
buttons: [ {
|
||||||
items: [ me.formPanel ]
|
xtype: 'pveHelpButton',
|
||||||
|
listenToGlobalEvent: false,
|
||||||
|
hidden: false,
|
||||||
|
onlineHelp: me.onlineHelp
|
||||||
|
},
|
||||||
|
'->',
|
||||||
|
{
|
||||||
|
reference: 'submitBtn',
|
||||||
|
text: gettext('Clone'),
|
||||||
|
disabled: true,
|
||||||
|
handler: function() {
|
||||||
|
var cloneForm = me.lookupReference('cloneform');
|
||||||
|
if (cloneForm.isValid()) {
|
||||||
|
me.create_clone(cloneForm.getValues());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ],
|
||||||
|
items: [ formPanel ]
|
||||||
});
|
});
|
||||||
|
|
||||||
me.callParent();
|
me.callParent();
|
||||||
|
Loading…
Reference in New Issue
Block a user