]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/window/Wizard.js
ui: vm create: allow configuring a TPM in wizard
[pve-manager.git] / www / manager6 / window / Wizard.js
CommitLineData
ee93ce96
DM
1Ext.define('PVE.window.Wizard', {
2 extend: 'Ext.window.Window',
f677074b
DM
3
4 activeTitle: '', // used for automated testing
bd2118c6
TL
5
6 width: 700,
7 height: 510,
8
9 modal: true,
10 border: false,
11
12 draggable: true,
13 closable: true,
14 resizable: false,
15
16 layout: 'border',
17
ee93ce96
DM
18 getValues: function(dirtyOnly) {
19 var me = this;
20
21 var values = {};
22
23 var form = me.down('form').getForm();
24
25 form.getFields().each(function(field) {
26 if (!field.up('inputpanel') && (!dirtyOnly || field.isDirty())) {
e7ade592 27 Proxmox.Utils.assemble_field_data(values, field.getSubmitData());
ee93ce96
DM
28 }
29 });
30
31 Ext.Array.each(me.query('inputpanel'), function(panel) {
e7ade592 32 Proxmox.Utils.assemble_field_data(values, panel.getValues(dirtyOnly));
ee93ce96
DM
33 });
34
35 return values;
36 },
37
38 initComponent: function() {
39 var me = this;
40
41 var tabs = me.items || [];
42 delete me.items;
2a4971d8
TL
43
44 /*
ee93ce96
DM
45 * Items may have the following functions:
46 * validator(): per tab custom validation
47 * onSubmit(): submit handler
48 * onGetValues(): overwrite getValues results
49 */
50
51 Ext.Array.each(tabs, function(tab) {
52 tab.disabled = true;
53 });
54 tabs[0].disabled = false;
55
3fb9e6f9 56 let maxidx = 0, curidx = 0;
373d7ea4 57
3fb9e6f9
TL
58 let check_card = function(card) {
59 let fields = card.query('field, fieldcontainer');
ee93ce96
DM
60 if (card.isXType('fieldcontainer')) {
61 fields.unshift(card);
62 }
3fb9e6f9
TL
63 let valid = true;
64 for (const field of fields) {
ee93ce96
DM
65 // Note: not all fielcontainer have isValid()
66 if (Ext.isFunction(field.isValid) && !field.isValid()) {
67 valid = false;
68 }
3fb9e6f9 69 }
ee93ce96
DM
70 if (Ext.isFunction(card.validator)) {
71 return card.validator();
72 }
ee93ce96
DM
73 return valid;
74 };
75
3fb9e6f9
TL
76 let disableTab = function(card) {
77 let tp = me.down('#wizcontent');
78 for (let idx = tp.items.indexOf(card); idx < tp.items.getCount(); idx++) {
79 let tab = tp.items.getAt(idx);
80 if (tab) {
81 tab.disable();
ee93ce96
DM
82 }
83 }
84 };
85
3fb9e6f9 86 let tabchange = function(tp, newcard, oldcard) {
ee93ce96
DM
87 if (newcard.onSubmit) {
88 me.down('#next').setVisible(false);
2a4971d8 89 me.down('#submit').setVisible(true);
ee93ce96
DM
90 } else {
91 me.down('#next').setVisible(true);
2a4971d8 92 me.down('#submit').setVisible(false);
ee93ce96 93 }
3fb9e6f9 94 let valid = check_card(newcard);
2a4971d8
TL
95 me.down('#next').setDisabled(!valid);
96 me.down('#submit').setDisabled(!valid);
3fb9e6f9 97 me.down('#back').setDisabled(tp.items.indexOf(newcard) === 0);
ee93ce96 98
3fb9e6f9 99 let idx = tp.items.indexOf(newcard);
373d7ea4
DC
100 if (idx > maxidx) {
101 maxidx = idx;
102 }
103 curidx = idx;
104
3fb9e6f9 105 let ntab = tp.items.getAt(idx + 1);
ee93ce96
DM
106 if (valid && ntab && !newcard.onSubmit) {
107 ntab.enable();
108 }
109 };
110
111 if (me.subject && !me.title) {
e7ade592 112 me.title = Proxmox.Utils.dialog_title(me.subject, true, false);
ee93ce96
DM
113 }
114
3fb9e6f9
TL
115 let sp = Ext.state.Manager.getProvider();
116 let advancedOn = sp.get('proxmox-advanced-cb');
3e0ea404 117
60575f19 118 Ext.apply(me, {
ee93ce96 119 items: [
ee93ce96
DM
120 {
121 xtype: 'form',
122 region: 'center',
123 layout: 'fit',
124 border: false,
125 margins: '5 5 0 5',
126 fieldDefaults: {
127 labelWidth: 100,
f6710aac 128 anchor: '100%',
ee93ce96
DM
129 },
130 items: [{
131 itemId: 'wizcontent',
132 xtype: 'tabpanel',
133 activeItem: 0,
74c0b9a9 134 bodyPadding: 0,
ee93ce96
DM
135 listeners: {
136 afterrender: function(tp) {
3fb9e6f9 137 tabchange(tp, this.getActiveTab());
ee93ce96
DM
138 },
139 tabchange: function(tp, newcard, oldcard) {
ee93ce96 140 tabchange(tp, newcard, oldcard);
f6710aac 141 },
ee93ce96 142 },
74c0b9a9
DC
143 defaults: {
144 padding: 10,
145 },
f6710aac
TL
146 items: tabs,
147 }],
148 },
18f4718f
TL
149 ],
150 fbar: [
151 {
152 xtype: 'proxmoxHelpButton',
f6710aac 153 itemId: 'help',
18f4718f
TL
154 },
155 '->',
3e0ea404
DC
156 {
157 xtype: 'proxmoxcheckbox',
158 boxLabelAlign: 'before',
159 boxLabel: gettext('Advanced'),
3fb9e6f9 160 value: advancedOn,
3e0ea404 161 listeners: {
3fb9e6f9
TL
162 change: function(_, value) {
163 let tp = me.down('#wizcontent');
3e0ea404 164 tp.query('inputpanel').forEach(function(ip) {
3fb9e6f9 165 ip.setAdvancedVisible(value);
3e0ea404 166 });
3fb9e6f9 167 sp.set('proxmox-advanced-cb', value);
f6710aac
TL
168 },
169 },
3e0ea404 170 },
18f4718f
TL
171 {
172 text: gettext('Back'),
173 disabled: true,
174 itemId: 'back',
175 minWidth: 60,
176 handler: function() {
3fb9e6f9
TL
177 let tp = me.down('#wizcontent');
178 let prev = tp.items.indexOf(tp.getActiveTab()) - 1;
18f4718f
TL
179 if (prev < 0) {
180 return;
181 }
3fb9e6f9 182 let ntab = tp.items.getAt(prev);
18f4718f
TL
183 if (ntab) {
184 tp.setActiveTab(ntab);
185 }
f6710aac 186 },
18f4718f
TL
187 },
188 {
189 text: gettext('Next'),
190 disabled: true,
191 itemId: 'next',
192 minWidth: 60,
193 handler: function() {
3fb9e6f9
TL
194 let tp = me.down('#wizcontent');
195 let activeTab = tp.getActiveTab();
196 if (!check_card(activeTab)) {
18f4718f
TL
197 return;
198 }
3fb9e6f9
TL
199 let next = tp.items.indexOf(activeTab) + 1;
200 let ntab = tp.items.getAt(next);
18f4718f
TL
201 if (ntab) {
202 ntab.enable();
203 tp.setActiveTab(ntab);
204 }
f6710aac 205 },
ee93ce96 206 },
18f4718f
TL
207 {
208 text: gettext('Finish'),
209 minWidth: 60,
210 hidden: true,
211 itemId: 'submit',
212 handler: function() {
3fb9e6f9
TL
213 let tp = me.down('#wizcontent');
214 tp.getActiveTab().onSubmit();
f6710aac
TL
215 },
216 },
217 ],
ee93ce96
DM
218 });
219 me.callParent();
ee93ce96 220
3e0ea404 221 Ext.Array.each(me.query('inputpanel'), function(panel) {
3fb9e6f9 222 panel.setAdvancedVisible(advancedOn);
3e0ea404
DC
223 });
224
ee93ce96 225 Ext.Array.each(me.query('field'), function(field) {
3fb9e6f9
TL
226 let validcheck = function() {
227 let tp = me.down('#wizcontent');
373d7ea4 228
3fb9e6f9
TL
229 // check validity for current to last enabled tab, as local change may affect validity of a later one
230 for (let i = curidx; i <= maxidx && i < tp.items.getCount(); i++) {
231 let tab = tp.items.getAt(i);
232 let valid = check_card(tab);
373d7ea4
DC
233
234 // only set the buttons on the current panel
235 if (i === curidx) {
236 me.down('#next').setDisabled(!valid);
237 me.down('#submit').setDisabled(!valid);
238 }
3fb9e6f9
TL
239 // if a panel is invalid, then disable all following, else enable the next tab
240 let nextTab = tp.items.getAt(i + 1);
373d7ea4 241 if (!valid) {
3fb9e6f9 242 disableTab(nextTab);
373d7ea4 243 return;
3fb9e6f9
TL
244 } else if (nextTab && !tab.onSubmit) {
245 nextTab.enable();
373d7ea4 246 }
ee93ce96 247 }
a1304e1e
DC
248 };
249 field.on('change', validcheck);
250 field.on('validitychange', validcheck);
ee93ce96 251 });
f6710aac 252 },
ee93ce96 253});