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