]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/window/Backup.js
ui: backup window: also reset removal fields when defaults API call fails
[pve-manager.git] / www / manager6 / window / Backup.js
CommitLineData
56c8ef92
DM
1Ext.define('PVE.window.Backup', {
2 extend: 'Ext.window.Window',
3
4 resizable: false,
5
8058410f 6 initComponent: function() {
56c8ef92
DM
7 var me = this;
8
9 if (!me.nodename) {
10 throw "no node name specified";
11 }
12
13 if (!me.vmid) {
14 throw "no VM ID specified";
15 }
16
17 if (!me.vmtype) {
18 throw "no VM type specified";
19 }
20
62ce8928
TL
21 let compressionSelector = Ext.create('PVE.form.CompressionSelector', {
22 name: 'compress',
23 value: 'zstd',
24 fieldLabel: gettext('Compression'),
25 });
26
fddb0412
FE
27 let modeSelector = Ext.create('PVE.form.BackupModeSelector', {
28 fieldLabel: gettext('Mode'),
29 value: 'snapshot',
30 name: 'mode',
31 });
32
33 let mailtoField = Ext.create('Ext.form.field.Text', {
34 fieldLabel: gettext('Send email to'),
35 name: 'mailto',
36 emptyText: Proxmox.Utils.noneText,
37 });
38
170f8fb4
FE
39 const keepNames = [
40 ['keep-last', gettext('Keep Last')],
41 ['keep-hourly', gettext('Keep Hourly')],
42 ['keep-daily', gettext('Keep Daily')],
43 ['keep-weekly', gettext('Keep Weekly')],
44 ['keep-monthly', gettext('Keep Monthly')],
45 ['keep-yearly', gettext('Keep Yearly')],
46 ];
47
48 let pruneSettings = keepNames.map(
49 name => Ext.create('Ext.form.field.Display', {
50 name: name[0],
51 fieldLabel: name[1],
52 hidden: true,
53 }),
54 );
55
56 let removeCheckbox = Ext.create('Proxmox.form.Checkbox', {
57 name: 'remove',
58 checked: false,
59 hidden: true,
60 uncheckedValue: 0,
61 fieldLabel: gettext('Prune'),
62 autoEl: {
63 tag: 'div',
64 'data-qtip': gettext('Prune older backups afterwards'),
65 },
66 handler: function(checkbox, value) {
67 pruneSettings.forEach(field => field.setHidden(!value));
68 },
69 });
70
fddb0412
FE
71 let initialDefaults = false;
72
56c8ef92
DM
73 var storagesel = Ext.create('PVE.form.StorageSelector', {
74 nodename: me.nodename,
75 name: 'storage',
56c8ef92
DM
76 fieldLabel: gettext('Storage'),
77 storageContent: 'backup',
62ce8928
TL
78 allowBlank: false,
79 listeners: {
80 change: function(f, v) {
5ad3fbfa
FE
81 if (!initialDefaults) {
82 me.setLoading(false);
83 }
84
6d52223b
FE
85 if (v === null || v === undefined || v === '') {
86 return;
87 }
88
62ce8928 89 let store = f.getStore();
8267aa63 90 let rec = store.findRecord('storage', v, 0, false, true, true);
62ce8928
TL
91
92 if (rec && rec.data && rec.data.type === 'pbs') {
93 compressionSelector.setValue('zstd');
94 compressionSelector.setDisabled(true);
95 } else if (!compressionSelector.getEditable()) {
96 compressionSelector.setDisabled(false);
97 }
fddb0412
FE
98
99 Proxmox.Utils.API2Request({
100 url: `/nodes/${me.nodename}/vzdump/defaults`,
101 method: 'GET',
102 params: {
103 storage: v,
104 },
105 waitMsgTarget: me,
106 success: function(response, opts) {
107 const data = response.result.data;
108
109 if (!initialDefaults && data.mailto !== undefined) {
110 mailtoField.setValue(data.mailto);
111 }
112 if (!initialDefaults && data.mode !== undefined) {
113 modeSelector.setValue(data.mode);
114 }
115
116 initialDefaults = true;
170f8fb4
FE
117
118 // always update storage dependent properties
119 if (data['prune-backups'] !== undefined) {
120 const keepParams = PVE.Parser.parsePropertyString(
121 data["prune-backups"],
122 );
123 if (!keepParams['keep-all']) {
124 removeCheckbox.setHidden(false);
125 pruneSettings.forEach(function(field) {
126 const keep = keepParams[field.name];
127 if (keep) {
128 field.setValue(keep);
129 } else {
130 field.reset();
131 }
132 });
133 return;
134 }
135 }
136
137 // no defaults or keep-all=1
138 removeCheckbox.setHidden(true);
139 removeCheckbox.setValue(false);
140 pruneSettings.forEach(field => field.reset());
fddb0412
FE
141 },
142 failure: function(response, opts) {
b0d716e4 143 initialDefaults = true;
01a69af4
FE
144
145 removeCheckbox.setHidden(true);
146 removeCheckbox.setValue(false);
147 pruneSettings.forEach(field => field.reset());
148
fddb0412
FE
149 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
150 },
151 });
f6710aac 152 },
62ce8928 153 },
56c8ef92
DM
154 });
155
bef57f5c 156 me.formPanel = Ext.create('Proxmox.panel.InputPanel', {
56c8ef92
DM
157 bodyPadding: 10,
158 border: false,
0b240dbf 159 column1: [
56c8ef92 160 storagesel,
fddb0412 161 modeSelector,
170f8fb4 162 removeCheckbox,
0b240dbf
FE
163 ],
164 column2: [
62ce8928 165 compressionSelector,
fddb0412 166 mailtoField,
aa396ea6 167 ],
170f8fb4
FE
168 columnB: [{
169 layout: 'hbox',
170 border: false,
171 defaults: {
172 border: false,
173 layout: 'anchor',
174 flex: 1,
175 },
176 items: [
177 {
178 padding: '0 10 0 0',
179 defaults: {
180 labelWidth: 110,
181 },
182 items: [
183 pruneSettings[0],
184 pruneSettings[2],
185 pruneSettings[4],
186 ],
187 },
188 {
189 padding: '0 0 0 10',
190 defaults: {
191 labelWidth: 110,
192 },
193 items: [
194 pruneSettings[1],
195 pruneSettings[3],
196 pruneSettings[5],
197 ],
198 },
199 ],
200 }],
56c8ef92
DM
201 });
202
56c8ef92
DM
203 var submitBtn = Ext.create('Ext.Button', {
204 text: gettext('Backup'),
8058410f 205 handler: function() {
56c8ef92 206 var storage = storagesel.getValue();
bef57f5c 207 let values = me.formPanel.getValues();
56c8ef92
DM
208 var params = {
209 storage: storage,
210 vmid: me.vmid,
211 mode: values.mode,
170f8fb4 212 remove: values.remove,
56c8ef92 213 };
8b8a4583 214
8058410f 215 if (values.mailto) {
8b8a4583
DC
216 params.mailto = values.mailto;
217 }
218
56c8ef92
DM
219 if (values.compress) {
220 params.compress = values.compress;
221 }
222
e7ade592 223 Proxmox.Utils.API2Request({
56c8ef92
DM
224 url: '/nodes/' + me.nodename + '/vzdump',
225 params: params,
226 method: 'POST',
8058410f 227 failure: function(response, opts) {
f6710aac 228 Ext.Msg.alert('Error', response.htmlStatus);
56c8ef92
DM
229 },
230 success: function(response, options) {
e83e60bf
EK
231 // close later so we reload the grid
232 // after the task has completed
233 me.hide();
234
56c8ef92 235 var upid = response.result.data;
2a4971d8 236
8cbc11a7 237 var win = Ext.create('Proxmox.window.TaskViewer', {
e83e60bf
EK
238 upid: upid,
239 listeners: {
240 close: function() {
241 me.close();
f6710aac
TL
242 },
243 },
56c8ef92
DM
244 });
245 win.show();
f6710aac 246 },
56c8ef92 247 });
f6710aac 248 },
56c8ef92
DM
249 });
250
672a6270 251 var helpBtn = Ext.create('Proxmox.button.Help', {
0de33b54
EK
252 onlineHelp: 'chapter_vzdump',
253 listenToGlobalEvent: false,
f6710aac 254 hidden: false,
0de33b54
EK
255 });
256
2a4971d8 257 var title = gettext('Backup') + " " +
53e3ea84 258 (me.vmtype === 'lxc' ? "CT" : "VM") +
56c8ef92
DM
259 " " + me.vmid;
260
261 Ext.apply(me, {
262 title: title,
56c8ef92
DM
263 modal: true,
264 layout: 'auto',
265 border: false,
8058410f
TL
266 items: [me.formPanel],
267 buttons: [helpBtn, '->', submitBtn],
5ad3fbfa
FE
268 listeners: {
269 afterrender: function() {
270 /// cleared within the storage selector's change listener
271 me.setLoading(gettext('Please wait...'));
272 storagesel.setValue(me.storage);
273 },
274 },
56c8ef92
DM
275 });
276
277 me.callParent();
f6710aac 278 },
56c8ef92 279});