]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/form/ControllerSelector.js
use IntegerField from widget toolkit
[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 statics: {
6 maxIds: {
7 ide: 3,
8 sata: 5,
9 virtio: 15,
10 scsi: 13
11 }
12 },
13
14 noVirtIO: false,
15
16 vmconfig: {}, // used to check for existing devices
17
18 sortByPreviousUsage: function(vmconfig, controllerList) {
19
20 var usedControllers = Ext.clone(PVE.form.ControllerSelector.maxIds);
21
22 var type;
23 for (type in usedControllers) {
24 if(usedControllers.hasOwnProperty(type)) {
25 usedControllers[type] = 0;
26 }
27 }
28
29 var property;
30 for (property in vmconfig) {
31 if (vmconfig.hasOwnProperty(property)) {
32 if (property.match(PVE.Utils.bus_match) && !vmconfig[property].match(/media=cdrom/)) {
33 var foundController = property.match(PVE.Utils.bus_match)[1];
34 usedControllers[foundController]++;
35 }
36 }
37 }
38
39 var vmDefaults = PVE.qemu.OSDefaults[vmconfig.ostype];
40
41 var sortPriority = vmDefaults && vmDefaults.busPriority
42 ? vmDefaults.busPriority : PVE.qemu.OSDefaults.generic;
43
44 var sortedList = Ext.clone(controllerList);
45 sortedList.sort(function(a,b) {
46 if (usedControllers[b] == usedControllers[a]) {
47 return sortPriority[b] - sortPriority[a];
48 }
49 return usedControllers[b] - usedControllers[a];
50 });
51
52 return sortedList;
53 },
54
55 setVMConfig: function(vmconfig, autoSelect) {
56 var me = this;
57
58 me.vmconfig = Ext.apply({}, vmconfig);
59
60 var clist = ['ide', 'virtio', 'scsi', 'sata'];
61 var bussel = me.down('field[name=controller]');
62 var deviceid = me.down('field[name=deviceid]');
63
64 if (autoSelect === 'cdrom') {
65 clist = ['ide', 'scsi', 'sata'];
66 if (!Ext.isDefined(me.vmconfig.ide2)) {
67 bussel.setValue('ide');
68 deviceid.setValue(2);
69 return;
70 }
71 } else {
72 // in most cases we want to add a disk to the same controller
73 // we previously used
74 clist = me.sortByPreviousUsage(me.vmconfig, clist);
75 }
76
77 Ext.Array.each(clist, function(controller) {
78 var confid, i;
79 bussel.setValue(controller);
80 for (i = 0; i <= PVE.form.ControllerSelector.maxIds[controller]; i++) {
81 confid = controller + i.toString();
82 if (!Ext.isDefined(me.vmconfig[confid])) {
83 deviceid.setValue(i);
84 return false; // break
85 }
86 }
87 });
88 deviceid.validate();
89 },
90
91 initComponent: function() {
92 var me = this;
93
94 Ext.apply(me, {
95 fieldLabel: gettext('Bus/Device'),
96 layout: 'hbox',
97 defaults: {
98 hideLabel: true
99 },
100 items: [
101 {
102 xtype: 'pveBusSelector',
103 name: 'controller',
104 value: PVE.qemu.OSDefaults.generic.busType,
105 noVirtIO: me.noVirtIO,
106 allowBlank: false,
107 flex: 2,
108 listeners: {
109 change: function(t, value) {
110 if (!me.rendered || !value) {
111 return;
112 }
113 var field = me.down('field[name=deviceid]');
114 field.setMaxValue(PVE.form.ControllerSelector.maxIds[value]);
115 field.validate();
116 }
117 }
118 },
119 {
120 xtype: 'proxmoxintegerfield',
121 name: 'deviceid',
122 minValue: 0,
123 maxValue: PVE.form.ControllerSelector.maxIds.ide,
124 value: '0',
125 flex: 1,
126 allowBlank: false,
127 validator: function(value) {
128 /*jslint confusion: true */
129 if (!me.rendered) {
130 return;
131 }
132 var field = me.down('field[name=controller]');
133 var controller = field.getValue();
134 var confid = controller + value;
135 if (Ext.isDefined(me.vmconfig[confid])) {
136 return "This device is already in use.";
137 }
138 return true;
139 }
140 }
141 ]
142 });
143
144 me.callParent();
145 }
146 });