X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=www%2Fmanager6%2Fwindow%2FPCIMapEdit.js;h=d43f04eb2f7e2468cbc08955904804ac98f5c996;hb=81c46efcd80cb25c3736fe6446c4988408136b15;hp=516678e095285b6af86f2b7563c97abbd093311f;hpb=bd712824fa05c4595e7bd0d9e530ac5a4de1e70f;p=pve-manager.git diff --git a/www/manager6/window/PCIMapEdit.js b/www/manager6/window/PCIMapEdit.js index 516678e0..d43f04eb 100644 --- a/www/manager6/window/PCIMapEdit.js +++ b/www/manager6/window/PCIMapEdit.js @@ -13,8 +13,12 @@ Ext.define('PVE.window.PCIMapEditWindow', { cbindData: function(initialConfig) { let me = this; - me.isCreate = !me.name || !me.nodename; + me.isCreate = (!me.name || !me.nodename) && !me.entryOnly; me.method = me.name ? 'PUT' : 'POST'; + me.hideMapping = !!me.entryOnly; + me.hideComment = me.name && !me.entryOnly; + me.hideNodeSelector = me.nodename || me.entryOnly; + me.hideNode = !me.nodename || !me.hideNodeSelector; return { name: me.name, nodename: me.nodename, @@ -58,7 +62,13 @@ Ext.define('PVE.window.PCIMapEditWindow', { let me = this; let view = me.getView(); me.originalMap = [...values.map]; - values.map = PVE.Parser.filterPropertyStringList(values.map, (e) => e.node === view.nodename); + let configuredNodes = []; + values.map = PVE.Parser.filterPropertyStringList(values.map, (e) => { + configuredNodes.push(e.node); + return e.node === view.nodename; + }); + + me.lookup('nodeselector').disallowedNodes = configuredNodes; return values; }, @@ -70,6 +80,46 @@ Ext.define('PVE.window.PCIMapEditWindow', { me.lookup('iommu_warning').setVisible( records.every((val) => val.data.iommugroup === -1), ); + + let value = me.lookup('pciselector').getValue(); + me.checkIsolated(value); + }, + + checkIsolated: function(value) { + let me = this; + + let store = me.lookup('pciselector').getStore(); + + let isIsolated = function(entry) { + let isolated = true; + let parsed = PVE.Parser.parsePropertyString(entry); + parsed.iommugroup = parseInt(parsed.iommugroup, 10); + if (!parsed.iommugroup) { + return isolated; + } + store.each(({ data }) => { + let isSubDevice = data.id.startsWith(parsed.path); + if (data.iommugroup === parsed.iommugroup && data.id !== parsed.path && !isSubDevice) { + isolated = false; + return false; + } + return true; + }); + return isolated; + }; + + let showWarning = false; + if (Ext.isArray(value)) { + for (const entry of value) { + if (!isIsolated(entry)) { + showWarning = true; + break; + } + } + } else { + showWarning = isIsolated(value); + } + me.lookup('group_warning').setVisible(showWarning); }, mdevChange: function(mdevField, value) { @@ -83,6 +133,7 @@ Ext.define('PVE.window.PCIMapEditWindow', { pciChange: function(_field, value) { let me = this; me.lookup('multiple_warning').setVisible(Ext.isArray(value) && value.length > 1); + me.checkIsolated(value); }, control: { @@ -116,8 +167,7 @@ Ext.define('PVE.window.PCIMapEditWindow', { hidden: true, columnWidth: 1, padding: '0 0 10 0', - value: 'No IOMMU detected, please activate it.' + - 'See Documentation for further information.', + value: gettext('No IOMMU detected, please activate it. See Documentation for further information.'), userCls: 'pmx-hint', }, { @@ -126,8 +176,7 @@ Ext.define('PVE.window.PCIMapEditWindow', { hidden: true, columnWidth: 1, padding: '0 0 10 0', - value: 'When multiple devices are selected, the first free one will be chosen' + - ' on guest start.', + value: gettext('When multiple devices are selected, the first free one will be chosen on guest start.'), userCls: 'pmx-hint', }, { @@ -137,7 +186,7 @@ Ext.define('PVE.window.PCIMapEditWindow', { columnWidth: 1, padding: '0 0 10 0', itemId: 'iommuwarning', - value: 'The selected Device is not in a seperate IOMMU group, make sure this is intended.', + value: gettext('A selected device is not in a separate IOMMU group, make sure this is intended.'), userCls: 'pmx-hint', }, ], @@ -156,34 +205,41 @@ Ext.define('PVE.window.PCIMapEditWindow', { allowBlank: false, }, { - xtype: 'pmxDisplayEditField', + xtype: 'displayfield', fieldLabel: gettext('Mapping on Node'), labelWidth: 120, name: 'node', - editConfig: { - xtype: 'pveNodeSelector', - }, cbind: { - editable: '{!nodename}', value: '{nodename}', + disabled: '{hideNode}', + hidden: '{hideNode}', + }, + allowBlank: false, + }, + { + xtype: 'pveNodeSelector', + reference: 'nodeselector', + fieldLabel: gettext('Mapping on Node'), + labelWidth: 120, + name: 'node', + cbind: { + disabled: '{hideNodeSelector}', + hidden: '{hideNodeSelector}', }, allowBlank: false, }, ], column2: [ - { - // as spacer - xtype: 'displayfield', - }, { xtype: 'proxmoxcheckbox', - fieldLabel: gettext('Mediated Devices'), - labelWidth: 120, + fieldLabel: gettext('Use with Mediated Devices'), + labelWidth: 200, reference: 'mdev', name: 'mdev', cbind: { deleteEmpty: '{!isCreate}', + disabled: '{hideComment}', }, }, ], @@ -198,6 +254,8 @@ Ext.define('PVE.window.PCIMapEditWindow', { name: 'map', cbind: { nodename: '{nodename}', + disabled: '{hideMapping}', + hidden: '{hideMapping}', }, allowBlank: false, onLoadCallBack: 'checkIommu', @@ -211,6 +269,8 @@ Ext.define('PVE.window.PCIMapEditWindow', { name: 'description', cbind: { deleteEmpty: '{!isCreate}', + disabled: '{hideComment}', + hidden: '{hideComment}', }, }, ],