]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/CreateWizard.js
ui: wizards: allow adding tags in the qemu/lxc create wizard
[pve-manager.git] / www / manager6 / qemu / CreateWizard.js
1 Ext.define('PVE.qemu.CreateWizard', {
2 extend: 'PVE.window.Wizard',
3 alias: 'widget.pveQemuCreateWizard',
4 mixins: ['Proxmox.Mixin.CBind'],
5
6 viewModel: {
7 data: {
8 nodename: '',
9 current: {
10 scsihw: '',
11 },
12 },
13 formulas: {
14 cgroupMode: function(get) {
15 const nodeInfo = PVE.data.ResourceStore.getNodes().find(
16 node => node.node === get('nodename'),
17 );
18 return nodeInfo ? nodeInfo['cgroup-mode'] : 2;
19 },
20 },
21 },
22
23 cbindData: {
24 nodename: undefined,
25 },
26
27 subject: gettext('Virtual Machine'),
28
29 items: [
30 {
31 xtype: 'inputpanel',
32 title: gettext('General'),
33 onlineHelp: 'qm_general_settings',
34 column1: [
35 {
36 xtype: 'pveNodeSelector',
37 name: 'nodename',
38 cbind: {
39 selectCurNode: '{!nodename}',
40 preferredValue: '{nodename}',
41 },
42 bind: {
43 value: '{nodename}',
44 },
45 fieldLabel: gettext('Node'),
46 allowBlank: false,
47 onlineValidator: true,
48 },
49 {
50 xtype: 'pveGuestIDSelector',
51 name: 'vmid',
52 guestType: 'qemu',
53 value: '',
54 loadNextFreeID: true,
55 validateExists: false,
56 },
57 {
58 xtype: 'textfield',
59 name: 'name',
60 vtype: 'DnsName',
61 value: '',
62 fieldLabel: gettext('Name'),
63 allowBlank: true,
64 },
65 ],
66 column2: [
67 {
68 xtype: 'pvePoolSelector',
69 fieldLabel: gettext('Resource Pool'),
70 name: 'pool',
71 value: '',
72 allowBlank: true,
73 },
74 ],
75 advancedColumn1: [
76 {
77 xtype: 'proxmoxcheckbox',
78 name: 'onboot',
79 uncheckedValue: 0,
80 defaultValue: 0,
81 deleteDefaultValue: true,
82 fieldLabel: gettext('Start at boot'),
83 },
84 ],
85 advancedColumn2: [
86 {
87 xtype: 'textfield',
88 name: 'order',
89 defaultValue: '',
90 emptyText: 'any',
91 labelWidth: 120,
92 fieldLabel: gettext('Start/Shutdown order'),
93 },
94 {
95 xtype: 'textfield',
96 name: 'up',
97 defaultValue: '',
98 emptyText: 'default',
99 labelWidth: 120,
100 fieldLabel: gettext('Startup delay'),
101 },
102 {
103 xtype: 'textfield',
104 name: 'down',
105 defaultValue: '',
106 emptyText: 'default',
107 labelWidth: 120,
108 fieldLabel: gettext('Shutdown timeout'),
109 },
110 ],
111
112 advancedColumnB: [
113 {
114 xtype: 'pveTagFieldSet',
115 name: 'tags',
116 maxHeight: 150,
117 },
118 ],
119
120 onGetValues: function(values) {
121 ['name', 'pool', 'onboot', 'agent'].forEach(function(field) {
122 if (!values[field]) {
123 delete values[field];
124 }
125 });
126
127 var res = PVE.Parser.printStartup({
128 order: values.order,
129 up: values.up,
130 down: values.down,
131 });
132
133 if (res) {
134 values.startup = res;
135 }
136
137 delete values.order;
138 delete values.up;
139 delete values.down;
140
141 return values;
142 },
143 },
144 {
145 xtype: 'container',
146 layout: 'hbox',
147 defaults: {
148 flex: 1,
149 padding: '0 10',
150 },
151 title: gettext('OS'),
152 items: [
153 {
154 xtype: 'pveQemuCDInputPanel',
155 bind: {
156 nodename: '{nodename}',
157 },
158 confid: 'ide2',
159 insideWizard: true,
160 },
161 {
162 xtype: 'pveQemuOSTypePanel',
163 insideWizard: true,
164 },
165 ],
166 },
167 {
168 xtype: 'pveQemuSystemPanel',
169 title: gettext('System'),
170 isCreate: true,
171 insideWizard: true,
172 },
173 {
174 xtype: 'pveMultiHDPanel',
175 bind: {
176 nodename: '{nodename}',
177 },
178 title: gettext('Disks'),
179 },
180 {
181 xtype: 'pveQemuProcessorPanel',
182 insideWizard: true,
183 title: gettext('CPU'),
184 },
185 {
186 xtype: 'pveQemuMemoryPanel',
187 insideWizard: true,
188 title: gettext('Memory'),
189 },
190 {
191 xtype: 'pveQemuNetworkInputPanel',
192 bind: {
193 nodename: '{nodename}',
194 },
195 title: gettext('Network'),
196 insideWizard: true,
197 },
198 {
199 title: gettext('Confirm'),
200 layout: 'fit',
201 items: [
202 {
203 xtype: 'grid',
204 store: {
205 model: 'KeyValue',
206 sorters: [{
207 property: 'key',
208 direction: 'ASC',
209 }],
210 },
211 columns: [
212 { header: 'Key', width: 150, dataIndex: 'key' },
213 { header: 'Value', flex: 1, dataIndex: 'value' },
214 ],
215 },
216 ],
217 dockedItems: [
218 {
219 xtype: 'proxmoxcheckbox',
220 name: 'start',
221 dock: 'bottom',
222 margin: '5 0 0 0',
223 boxLabel: gettext('Start after created'),
224 },
225 ],
226 listeners: {
227 show: function(panel) {
228 var kv = this.up('window').getValues();
229 var data = [];
230 Ext.Object.each(kv, function(key, value) {
231 if (key === 'delete') { // ignore
232 return;
233 }
234 data.push({ key: key, value: value });
235 });
236
237 var summarystore = panel.down('grid').getStore();
238 summarystore.suspendEvents();
239 summarystore.removeAll();
240 summarystore.add(data);
241 summarystore.sort();
242 summarystore.resumeEvents();
243 summarystore.fireEvent('refresh');
244 },
245 },
246 onSubmit: function() {
247 var wizard = this.up('window');
248 var kv = wizard.getValues();
249 delete kv.delete;
250
251 var nodename = kv.nodename;
252 delete kv.nodename;
253
254 Proxmox.Utils.API2Request({
255 url: '/nodes/' + nodename + '/qemu',
256 waitMsgTarget: wizard,
257 method: 'POST',
258 params: kv,
259 success: function(response) {
260 wizard.close();
261 },
262 failure: function(response, opts) {
263 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
264 },
265 });
266 },
267 },
268 ],
269 });
270
271