+ calculateConfig: function() {
+ let me = this;
+ let inputPanel = me.lookup('mainInputPanel');
+ let summaryGrid = me.lookup('summaryGrid');
+ let values = inputPanel.getValues();
+ summaryGrid.getStore().setData(Object.entries(values).map(([key, value]) => ({ key, value })));
+ },
+
+ calculateAdditionalCDIdx: function() {
+ let me = this;
+
+ let maxIde = me.getMaxControllerId('ide');
+ let maxSata = me.getMaxControllerId('sata');
+ // only ide0 and ide2 can be used reliably for isos (e.g. for q35)
+ if (maxIde < 0) {
+ return 'ide0';
+ }
+ if (maxIde < 2) {
+ return 'ide2';
+ }
+ if (maxSata < PVE.Utils.diskControllerMaxIDs.sata - 1) {
+ return `sata${maxSata+1}`;
+ }
+
+ return '';
+ },
+
+ // assume assigned sata disks indices are continuous, so without holes
+ getMaxControllerId: function(controller) {
+ let me = this;
+ let view = me.getView();
+ if (!controller) {
+ return -1;
+ }
+
+ let max = view[`max${controller}`];
+ if (max !== undefined) {
+ return max;
+ }
+
+ max = -1;
+ for (const key of Object.keys(me.getView().vmConfig)) {
+ if (!key.toLowerCase().startsWith(controller)) {
+ continue;
+ }
+ let idx = parseInt(key.slice(controller.length), 10);
+ if (idx > max) {
+ max = idx;
+ }
+ }
+ me.lookup('diskGrid').getStore().each(rec => {
+ if (!rec.data.id.toLowerCase().startsWith(controller)) {
+ return;
+ }
+ let idx = parseInt(rec.data.id.slice(controller.length), 10);
+ if (idx > max) {
+ max = idx;
+ }
+ });
+ me.lookup('cdGrid').getStore().each(rec => {
+ if (!rec.data.id.toLowerCase().startsWith(controller) || rec.data.hidden) {
+ return;
+ }
+ let idx = parseInt(rec.data.id.slice(controller.length), 10);
+ if (idx > max) {
+ max = idx;
+ }
+ });
+
+ view[`max${controller}`] = max;
+ return max;
+ },
+
+ mapDisk: function(value, metaData) {
+ let me = this;
+ let prepareForVirtIO = me.lookup('prepareForVirtIO');
+ if (prepareForVirtIO.isDisabled() || !prepareForVirtIO.getValue()) {
+ return value;
+ }
+ if (!value.toLowerCase().startsWith('scsi')) {
+ return value;
+ }
+ let offset = parseInt(value.slice(4), 10);
+ let newIdx = offset + me.getMaxControllerId('sata') + 1;
+ if (me.getViewModel().get('isWindows') && me.getView().additionalCdIdx?.startsWith('sata')) {
+ // additionalCdIdx takes the highest sata port
+ newIdx++;
+ }
+ if (newIdx >= PVE.Utils.diskControllerMaxIDs.sata) {
+ let prefix = '';
+ if (metaData !== undefined) {
+ // we're in the renderer so put a warning here
+ let warning = gettext('Too many disks, could not map to SATA.');
+ prefix = `<i data-qtip="${warning}" class="fa fa-exclamation-triangle warning"></i> `;
+ }
+ return `${prefix}${value}`;
+ }
+ return `sata${newIdx}`;
+ },
+
+ refreshGrids: function() {
+ this.lookup('diskGrid').reconfigure();
+ this.lookup('cdGrid').reconfigure();
+ this.lookup('netGrid').reconfigure();
+ },
+
+ onOSTypeChange: function(_cb, value) {
+ let me = this;
+ if (!value) {
+ return;
+ }
+ let store = me.lookup('cdGrid').getStore();
+ let collection = store.getData().getSource() ?? store.getData();
+ let rec = collection.find('autogenerated', true);
+
+ let isWindows = (value ?? '').startsWith('w');
+ if (rec) {
+ rec.set('hidden', !isWindows);
+ rec.commit();
+ }
+ let prepareVirtio = me.lookup('prepareForVirtIO').getValue();
+ let defaultScsiHw = me.getView().vmConfig.scsihw ?? '__default__';
+ me.lookup('scsihw').setValue(prepareVirtio && isWindows ? 'virtio-scsi-single' : defaultScsiHw);
+
+ me.refreshGrids();
+ },
+
+ onPrepareVirtioChange: function(_cb, value) {
+ let me = this;
+
+ let scsihw = me.lookup('scsihw');
+ scsihw.suspendEvents();
+ scsihw.setValue(value ? 'virtio-scsi-single' : me.getView().vmConfig.scsihw);
+ scsihw.resumeEvents();
+
+ me.refreshGrids();
+ },
+
+ onScsiHwChange: function(_field, value) {
+ let me = this;
+ me.getView().vmConfig.scsihw = value;
+ },
+
+ onUniqueMACChange: function(_cb, value) {
+ let me = this;
+
+ me.getViewModel().set('uniqueMACAdresses', value);
+
+ me.lookup('netGrid').reconfigure();
+ },
+
+ renderMacAddress: function(value, metaData, record, rowIndex, colIndex, store, view) {
+ let me = this;
+ let vm = me.getViewModel();
+
+ return !vm.get('uniqueMACAdresses') && value ? value : 'auto';
+ },
+