]>
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 isCloudinit
: (v
) => v
.match(/media=cdrom/) && v
.match(/[:/]vm
-\d
+-cloudinit
/),
24 isDisk: function(value
) {
25 return PVE
.Utils
.bus_match
.test(value
);
28 isBootdev: function(dev
, value
) {
29 return (this.isDisk(dev
) && !this.isCloudinit(value
)) ||
30 (/^net\d+/).test(dev
) ||
31 (/^hostpci\d+/).test(dev
) ||
32 ((/^usb\d+/).test(dev
) && !(/spice/).test(value
));
35 setVMConfig: function(vmconfig
) {
37 me
.vmconfig
= vmconfig
;
41 let boot
= PVE
.Parser
.parsePropertyString(me
.vmconfig
.boot
, "legacy");
45 bootorder
= boot
.order
.split(';').map(dev
=> ({ name
: dev
, enabled
: true }));
46 } else if (!(/^\s*$/).test(me
.vmconfig
.boot
)) {
47 // legacy style, transform to new bootorder
48 let order
= boot
.legacy
|| 'cdn';
49 let bootdisk
= me
.vmconfig
.bootdisk
|| undefined;
51 // get the first 4 characters (acdn)
52 // ignore the rest (there should never be more than 4)
53 let orderList
= order
.split('').slice(0, 4);
56 for (let i
= 0; i
< orderList
.length
; i
++) {
58 if (orderList
[i
] === 'c') {
59 if (bootdisk
!== undefined && me
.vmconfig
[bootdisk
]) {
62 } else if (orderList
[i
] === 'd') {
63 Ext
.Object
.each(me
.vmconfig
, function(key
, value
) {
64 if (me
.isDisk(key
) && value
.match(/media=cdrom/) && !me
.isCloudinit(value
)) {
68 } else if (orderList
[i
] === 'n') {
69 Ext
.Object
.each(me
.vmconfig
, function(key
, value
) {
70 if ((/^net\d+/).test(key
)) {
76 // Object.each iterates in random order, sort alphabetically
78 list
.forEach(dev
=> bootorder
.push({ name
: dev
, enabled
: true }));
82 // add disabled devices as well
84 Ext
.Object
.each(me
.vmconfig
, function(key
, value
) {
85 if (me
.isBootdev(key
, value
) &&
86 !Ext
.Array
.some(bootorder
, x
=> x
.name
=== key
)) {
91 disabled
.forEach(dev
=> bootorder
.push({ name
: dev
, enabled
: false }));
94 bootorder
.forEach(entry
=> {
95 entry
.desc
= me
.vmconfig
[entry
.name
];
98 me
.store
.insert(0, bootorder
);
99 me
.store
.fireEvent("update");
102 calculateValue: function() {
104 return me
.store
.getData().items
105 .filter(x
=> x
.data
.enabled
)
106 .map(x
=> x
.data
.name
)
110 onGetValues: function() {
112 // Note: we allow an empty value, so no 'delete' option
113 let val
= { order
: me
.calculateValue() };
114 let res
= { boot
: PVE
.Parser
.printPropertyString(val
) };
133 renderer
: (value
, metaData
, record
, rowIndex
) => {
134 let dragHandle
= "<i class='pve-grid-fa fa fa-fw fa-reorder cursor-move'></i>";
135 let idx
= (rowIndex
+ 1).toString();
136 if (record
.get('enabled')) {
137 return dragHandle
+ idx
;
139 return dragHandle
+ "<span class='faded'>" + idx
+ "</span>";
144 xtype
: 'checkcolumn',
145 header
: gettext('Enabled'),
146 dataIndex
: 'enabled',
150 header
: gettext('Device'),
153 renderer
: (value
, metaData
, record
, rowIndex
) => {
154 let desc
= record
.get('desc');
156 let icon
= '', iconCls
;
157 if (value
.match(/^net\d+$/)) {
158 iconCls
= 'exchange';
159 } else if (desc
.match(/media=cdrom/)) {
160 metaData
.tdCls
= 'pve-itype-icon-cdrom';
164 if (iconCls
!== undefined) {
165 metaData
.tdCls
+= 'pve-itype-fa';
166 icon
= `<i class="pve-grid-fa fa fa-fw fa-${iconCls}"></i>`;
173 header
: gettext('Description'),
180 ptype
: 'gridviewdragdrop',
181 dragText
: gettext('Drag and drop to reorder'),
186 // doesn't fire automatically on reorder
187 this.getStore().fireEvent("update");
193 html
: gettext('Drag and drop to reorder'),
196 xtype
: 'displayfield',
197 reference
: 'emptyWarning',
199 value
: gettext('Warning: No devices selected, the VM will probably not boot!'),
202 // for dirty marking and 'reset' function
206 setValue: function(val
) {
208 let panel
= me
.up('pveQemuBootOrderPanel');
210 // on form reset, go back to original state
211 if (!panel
.inUpdate
) {
212 panel
.setVMConfig(panel
.vmconfig
);
215 // not a subclass, so no callParent; just do it manually
216 me
.setRawValue(me
.valueToRaw(val
));
217 return me
.mixins
.field
.setValue
.call(me
, val
);
222 initComponent: function() {
227 let controller
= me
.getController();
229 let grid
= controller
.lookup('grid');
230 let marker
= controller
.lookup('marker');
231 let emptyWarning
= controller
.lookup('emptyWarning');
233 marker
.originalValue
= undefined;
235 me
.store
= Ext
.create('Ext.data.Store', {
236 model
: 'pve-boot-order-entry',
239 this.commitChanges();
240 let val
= me
.calculateValue();
241 if (marker
.originalValue
=== undefined) {
242 marker
.originalValue
= val
;
245 marker
.setValue(val
);
248 emptyWarning
.setHidden(val
!== '');
249 grid
.getView().refresh();
253 grid
.setStore(me
.store
);
257 Ext
.define('PVE.qemu.BootOrderEdit', {
258 extend
: 'Proxmox.window.Edit',
261 xtype
: 'pveQemuBootOrderPanel',
262 itemId
: 'inputpanel',
265 subject
: gettext('Boot Order'),
268 initComponent: function() {
272 success: function(response
, options
) {
273 me
.down('#inputpanel').setVMConfig(response
.result
.data
);