]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/form/ControllerSelector.js
ui: refactor sortByPreviousUsage and nextFreeDisk
[pve-manager.git] / www / manager6 / form / ControllerSelector.js
CommitLineData
711c07d1
DM
1Ext.define('PVE.form.ControllerSelector', {
2 extend: 'Ext.form.FieldContainer',
42902182 3 alias: 'widget.pveControllerSelector',
711c07d1
DM
4
5 noVirtIO: false,
6
711c07d1
DM
7 vmconfig: {}, // used to check for existing devices
8
ecfd8bcd
TL
9 setToFree: function(controllers, busField, deviceIDField) {
10 let me = this;
2aa645da
DC
11 let freeId = PVE.Utils.nextFreeDisk(controllers, me.vmconfig);
12
13 if (freeId !== undefined) {
14 busField.setValue(freeId.controller);
15 deviceIDField.setValue(freeId.id);
ecfd8bcd 16 }
2aa645da 17
ecfd8bcd
TL
18 },
19
711c07d1 20 setVMConfig: function(vmconfig, autoSelect) {
ecfd8bcd 21 let me = this;
711c07d1
DM
22
23 me.vmconfig = Ext.apply({}, vmconfig);
7206af4b 24
ecfd8bcd
TL
25 let bussel = me.down('field[name=controller]');
26 let deviceid = me.down('field[name=deviceid]');
0e09929d 27
2aa645da 28 let clist;
7206af4b 29 if (autoSelect === 'cdrom') {
7206af4b 30 if (!Ext.isDefined(me.vmconfig.ide2)) {
0e09929d
EK
31 bussel.setValue('ide');
32 deviceid.setValue(2);
7206af4b 33 return;
711c07d1 34 }
c7139315 35 clist = ['ide', 'scsi', 'sata'];
8058410f 36 } else {
ecfd8bcd 37 // in most cases we want to add a disk to the same controller we previously used
2aa645da 38 clist = PVE.Utils.sortByPreviousUsage(me.vmconfig);
7206af4b 39 }
711c07d1 40
ecfd8bcd
TL
41 me.setToFree(clist, bussel, deviceid);
42
0e09929d 43 deviceid.validate();
711c07d1
DM
44 },
45
46 initComponent: function() {
47 var me = this;
48
49 Ext.apply(me, {
50 fieldLabel: gettext('Bus/Device'),
51 layout: 'hbox',
711c07d1 52 defaults: {
f6710aac 53 hideLabel: true,
711c07d1
DM
54 },
55 items: [
56 {
42902182 57 xtype: 'pveBusSelector',
711c07d1 58 name: 'controller',
39c06c69 59 value: PVE.qemu.OSDefaults.generic.busType,
711c07d1 60 noVirtIO: me.noVirtIO,
711c07d1 61 allowBlank: false,
a1fe04b6 62 flex: 2,
711c07d1
DM
63 listeners: {
64 change: function(t, value) {
369e3ecd 65 if (!value) {
711c07d1
DM
66 return;
67 }
ecfd8bcd 68 let field = me.down('field[name=deviceid]');
3d0b402b 69 field.setMaxValue(PVE.Utils.diskControllerMaxIDs[value] - 1);
711c07d1 70 field.validate();
f6710aac
TL
71 },
72 },
711c07d1
DM
73 },
74 {
bf96f60d 75 xtype: 'proxmoxintegerfield',
711c07d1
DM
76 name: 'deviceid',
77 minValue: 0,
3d0b402b 78 maxValue: PVE.Utils.diskControllerMaxIDs.ide - 1,
711c07d1 79 value: '0',
a1fe04b6 80 flex: 1,
bf96f60d 81 allowBlank: false,
711c07d1 82 validator: function(value) {
711c07d1 83 if (!me.rendered) {
ecfd8bcd 84 return undefined;
711c07d1 85 }
ecfd8bcd
TL
86 let controller = me.down('field[name=controller]').getValue();
87 let confid = controller + value;
711c07d1
DM
88 if (Ext.isDefined(me.vmconfig[confid])) {
89 return "This device is already in use.";
90 }
91 return true;
f6710aac
TL
92 },
93 },
94 ],
711c07d1
DM
95 });
96
97 me.callParent();
f6710aac 98 },
711c07d1 99});