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