]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/BootOrderEdit.js
1 Ext
.define('pve-boot-order-entry', {
2 extend
: 'Ext.data.Model',
4 {name
: 'name', type
: 'string'},
5 {name
: 'enabled', type
: 'bool'},
6 {name
: 'desc', type
: 'string'},
10 Ext
.define('PVE.qemu.BootOrderPanel', {
11 extend
: 'Proxmox.panel.InputPanel',
12 alias
: 'widget.pveQemuBootOrderPanel',
14 vmconfig
: {}, // store loaded vm config
19 xclass
: 'Ext.app.ViewController',
22 isDisk: function(value
) {
23 return PVE
.Utils
.bus_match
.test(value
);
26 isBootdev: function(dev
, value
) {
27 return this.isDisk(dev
) ||
28 (/^net\d+/).test(dev
) ||
29 (/^hostpci\d+/).test(dev
) ||
30 ((/^usb\d+/).test(dev
) && !(/spice/).test(value
));
33 setVMConfig: function(vmconfig
) {
35 me
.vmconfig
= vmconfig
;
39 let boot
= PVE
.Parser
.parsePropertyString(me
.vmconfig
.boot
, "legacy");
43 bootorder
= boot
.order
.split(';').map(dev
=> ({name
: dev
, enabled
: true}));
44 } else if (!(/^\s*$/).test(me
.vmconfig
.boot
)) {
45 // legacy style, transform to new bootorder
46 let order
= boot
.legacy
|| 'cdn';
47 let bootdisk
= me
.vmconfig
.bootdisk
|| undefined;
49 // get the first 4 characters (acdn)
50 // ignore the rest (there should never be more than 4)
51 let orderList
= order
.split('').slice(0,4);
54 for (let i
= 0; i
< orderList
.length
; i
++) {
56 if (orderList
[i
] === 'c') {
57 if (bootdisk
!== undefined && me
.vmconfig
[bootdisk
]) {
60 } else if (orderList
[i
] === 'd') {
61 Ext
.Object
.each(me
.vmconfig
, function(key
, value
) {
62 if (me
.isDisk(key
) && (/media=cdrom/).test(value
)) {
66 } else if (orderList
[i
] === 'n') {
67 Ext
.Object
.each(me
.vmconfig
, function(key
, value
) {
68 if ((/^net\d+/).test(key
)) {
74 // Object.each iterates in random order, sort alphabetically
76 list
.forEach(dev
=> bootorder
.push({name
: dev
, enabled
: true}));
80 // add disabled devices as well
82 Ext
.Object
.each(me
.vmconfig
, function(key
, value
) {
83 if (me
.isBootdev(key
, value
) &&
84 !Ext
.Array
.some(bootorder
, x
=> x
.name
=== key
))
90 disabled
.forEach(dev
=> bootorder
.push({name
: dev
, enabled
: false}));
93 bootorder
.forEach(entry
=> {
94 entry
.desc
= me
.vmconfig
[entry
.name
];
97 me
.store
.insert(0, bootorder
);
98 me
.store
.fireEvent("update");
101 calculateValue: function() {
103 return me
.store
.getData().items
104 .filter(x
=> x
.data
.enabled
)
105 .map(x
=> x
.data
.name
)
109 onGetValues: function() {
111 // Note: we allow an empty value, so no 'delete' option
112 let val
= { order
: me
.calculateValue() };
113 let res
= { boot
: PVE
.Parser
.printPropertyString(val
) };
132 renderer
: (value
, metaData
, record
, rowIndex
) => {
133 let dragHandle
= "<i class='pve-grid-fa fa fa-fw fa-reorder cursor-move'></i>";
134 let idx
= (rowIndex
+ 1).toString();
135 if (record
.get('enabled')) {
136 return dragHandle
+ idx
;
138 return dragHandle
+ "<span class='faded'>" + idx
+ "</span>";
143 xtype
: 'checkcolumn',
144 header
: gettext('Enabled'),
145 dataIndex
: 'enabled',
149 header
: gettext('Device'),
154 header
: gettext('Description'),
161 ptype
: 'gridviewdragdrop',
162 dragText
: gettext('Drag and drop to reorder'),
167 // doesn't fire automatically on reorder
168 this.getStore().fireEvent("update");
174 html
: gettext('Drag and drop to reorder'),
177 xtype
: 'displayfield',
178 reference
: 'emptyWarning',
180 value
: gettext('Warning: No devices selected, the VM will probably not boot!'),
183 // for dirty marking and 'reset' function
187 setValue: function(val
) {
189 let panel
= me
.up('pveQemuBootOrderPanel');
191 // on form reset, go back to original state
192 if (!panel
.inUpdate
) {
193 panel
.setVMConfig(panel
.vmconfig
);
196 // not a subclass, so no callParent; just do it manually
197 me
.setRawValue(me
.valueToRaw(val
));
198 return me
.mixins
.field
.setValue
.call(me
, val
);
203 initComponent: function() {
208 let controller
= me
.getController();
210 let grid
= controller
.lookup('grid');
211 let marker
= controller
.lookup('marker');
212 let emptyWarning
= controller
.lookup('emptyWarning');
214 marker
.originalValue
= undefined;
216 me
.store
= Ext
.create('Ext.data.Store', {
217 model
: 'pve-boot-order-entry',
220 this.commitChanges();
221 let val
= me
.calculateValue();
222 if (marker
.originalValue
=== undefined) {
223 marker
.originalValue
= val
;
226 marker
.setValue(val
);
229 emptyWarning
.setHidden(val
!== '');
230 grid
.getView().refresh();
234 grid
.setStore(me
.store
);
238 Ext
.define('PVE.qemu.BootOrderEdit', {
239 extend
: 'Proxmox.window.Edit',
242 xtype
: 'pveQemuBootOrderPanel',
246 subject
: gettext('Boot Order'),
249 initComponent : function() {
253 success: function(response
, options
) {
254 me
.down('#inputpanel').setVMConfig(response
.result
.data
);