]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/PCIMapEdit.js
ui: pci map edit: make top fields more clear
[pve-manager.git] / www / manager6 / window / PCIMapEdit.js
1 Ext.define('PVE.window.PCIMapEditWindow', {
2 extend: 'Proxmox.window.Edit',
3
4 mixins: ['Proxmox.Mixin.CBind'],
5
6 width: 800,
7
8 subject: gettext('PCI mapping'),
9
10 onlineHelp: 'resource_mapping',
11
12 method: 'POST',
13
14 cbindData: function(initialConfig) {
15 let me = this;
16 me.isCreate = !me.name || !me.nodename;
17 me.method = me.name ? 'PUT' : 'POST';
18 return {
19 name: me.name,
20 nodename: me.nodename,
21 };
22 },
23
24 submitUrl: function(_url, data) {
25 let me = this;
26 let name = me.method === 'PUT' ? me.name : '';
27 return `/cluster/mapping/pci/${name}`;
28 },
29
30 controller: {
31 xclass: 'Ext.app.ViewController',
32
33 onGetValues: function(values) {
34 let me = this;
35 let view = me.getView();
36 if (view.method === "POST") {
37 delete me.digest;
38 }
39
40 if (values.iommugroup === -1) {
41 delete values.iommugroup;
42 }
43
44 let nodename = values.node ?? view.nodename;
45 delete values.node;
46 if (me.originalMap) {
47 let otherMaps = PVE.Parser
48 .filterPropertyStringList(me.originalMap, (e) => e.node !== nodename);
49 if (otherMaps.length) {
50 values.map = values.map.concat(otherMaps);
51 }
52 }
53
54 return values;
55 },
56
57 onSetValues: function(values) {
58 let me = this;
59 let view = me.getView();
60 me.originalMap = [...values.map];
61 values.map = PVE.Parser.filterPropertyStringList(values.map, (e) => e.node === view.nodename);
62 return values;
63 },
64
65 checkIommu: function(store, records, success) {
66 let me = this;
67 if (!success || !records.length) {
68 return;
69 }
70 me.lookup('iommu_warning').setVisible(
71 records.every((val) => val.data.iommugroup === -1),
72 );
73 },
74
75 mdevChange: function(mdevField, value) {
76 this.lookup('pciselector').setMdev(value);
77 },
78
79 nodeChange: function(_field, value) {
80 this.lookup('pciselector').setNodename(value);
81 },
82
83 pciChange: function(_field, value) {
84 let me = this;
85 me.lookup('multiple_warning').setVisible(Ext.isArray(value) && value.length > 1);
86 },
87
88 control: {
89 'field[name=mdev]': {
90 change: 'mdevChange',
91 },
92 'pveNodeSelector': {
93 change: 'nodeChange',
94 },
95 'pveMultiPCISelector': {
96 change: 'pciChange',
97 },
98 },
99 },
100
101 items: [
102 {
103 xtype: 'inputpanel',
104 onGetValues: function(values) {
105 return this.up('window').getController().onGetValues(values);
106 },
107
108 onSetValues: function(values) {
109 return this.up('window').getController().onSetValues(values);
110 },
111
112 columnT: [
113 {
114 xtype: 'displayfield',
115 reference: 'iommu_warning',
116 hidden: true,
117 columnWidth: 1,
118 padding: '0 0 10 0',
119 value: 'No IOMMU detected, please activate it.' +
120 'See Documentation for further information.',
121 userCls: 'pmx-hint',
122 },
123 {
124 xtype: 'displayfield',
125 reference: 'multiple_warning',
126 hidden: true,
127 columnWidth: 1,
128 padding: '0 0 10 0',
129 value: 'When multiple devices are selected, the first free one will be chosen' +
130 ' on guest start.',
131 userCls: 'pmx-hint',
132 },
133 {
134 xtype: 'displayfield',
135 reference: 'group_warning',
136 hidden: true,
137 columnWidth: 1,
138 padding: '0 0 10 0',
139 itemId: 'iommuwarning',
140 value: 'The selected Device is not in a seperate IOMMU group, make sure this is intended.',
141 userCls: 'pmx-hint',
142 },
143 ],
144
145 column1: [
146 {
147 xtype: 'pmxDisplayEditField',
148 fieldLabel: gettext('Name'),
149 labelWidth: 120,
150 cbind: {
151 editable: '{!name}',
152 value: '{name}',
153 submitValue: '{isCreate}',
154 },
155 name: 'id',
156 allowBlank: false,
157 },
158 {
159 xtype: 'pmxDisplayEditField',
160 fieldLabel: gettext('Mapping on Node'),
161 labelWidth: 120,
162 name: 'node',
163 editConfig: {
164 xtype: 'pveNodeSelector',
165 },
166 cbind: {
167 editable: '{!nodename}',
168 value: '{nodename}',
169 },
170 allowBlank: false,
171 },
172 ],
173
174 column2: [
175 {
176 // as spacer
177 xtype: 'displayfield',
178 },
179 {
180 xtype: 'proxmoxcheckbox',
181 fieldLabel: gettext('Mediated Devices'),
182 labelWidth: 120,
183 reference: 'mdev',
184 name: 'mdev',
185 cbind: {
186 deleteEmpty: '{!isCreate}',
187 },
188 },
189 ],
190
191 columnB: [
192 {
193 xtype: 'pveMultiPCISelector',
194 fieldLabel: gettext('Device'),
195 labelWidth: 120,
196 height: 300,
197 reference: 'pciselector',
198 name: 'map',
199 cbind: {
200 nodename: '{nodename}',
201 },
202 allowBlank: false,
203 onLoadCallBack: 'checkIommu',
204 margin: '0 0 10 0',
205 },
206 {
207 xtype: 'proxmoxtextfield',
208 fieldLabel: gettext('Comment'),
209 labelWidth: 120,
210 submitValue: true,
211 name: 'description',
212 cbind: {
213 deleteEmpty: '{!isCreate}',
214 },
215 },
216 ],
217 },
218 ],
219 });