]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/BackupJobDetail.js
1 Ext
.define('PVE.dc.BackupDiskTree', {
2 extend
: 'Ext.tree.Panel',
3 alias
: 'widget.pveBackupDiskTree',
16 tooltip
: gettext('Expand All'),
17 callback
: panel
=> panel
.expandAll(),
21 tooltip
: gettext('Collapse All'),
22 callback
: panel
=> panel
.collapseAll(),
29 text
: gettext('Guest Image'),
30 renderer: function(value
, meta
, record
) {
31 if (record
.data
.type
) {
34 if (record
.data
.name
) {
35 ret
+= " (" + record
.data
.name
+ ")";
39 // extJS needs unique IDs but we only want to show the volumes key from "vmid:key"
40 return value
.split(':')[1] + " - " + record
.data
.name
;
47 text
: gettext('Type'),
52 text
: gettext('Backup Job'),
53 renderer
: PVE
.Utils
.render_backup_status
,
54 dataIndex
: 'included',
61 let sm
= me
.getSelectionModel();
63 Proxmox
.Utils
.API2Request({
64 url
: `/cluster/backup/${me.jobid}/included_volumes`,
67 failure: function(response
, opts
) {
68 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
70 success: function(response
, opts
) {
72 me
.setRootNode(response
.result
.data
);
78 initComponent: function() {
82 throw "no job id specified";
85 var sm
= Ext
.create('Ext.selection.TreeModel', {});
89 fields
: ['id', 'type',
93 calculate: function(data
) {
94 var txt
= 'fa x-fa-tree fa-';
95 if (data
.leaf
&& !data
.type
) {
97 } else if (data
.type
=== 'qemu') {
98 return txt
+ 'desktop';
99 } else if (data
.type
=== 'lxc') {
102 return txt
+ 'question-circle';
110 fieldLabel
: gettext('Search'),
112 emptyText
: 'Name, VMID, Type',
115 enableKeyEvents
: true,
118 keyup: function(field
) {
119 let searchValue
= field
.getValue().toLowerCase();
120 me
.store
.clearFilter(true);
121 me
.store
.filterBy(function(record
) {
123 if (record
.data
.depth
=== 0) {
125 } else if (record
.data
.depth
=== 1) {
127 } else if (record
.data
.depth
=== 2) {
128 data
= record
.parentNode
.data
;
131 for (const property
of ['name', 'id', 'type']) {
132 if (!data
[property
]) {
135 let v
= data
[property
].toString();
136 if (v
!== undefined) {
138 if (v
.includes(searchValue
)) {
157 Ext
.define('PVE.dc.BackupInfo', {
158 extend
: 'Proxmox.panel.InputPanel',
159 alias
: 'widget.pveBackupInfo',
163 retentionType
: 'none',
166 hasRetention
: (get) => get('retentionType') !== 'none',
167 retentionKeepAll
: (get) => get('retentionType') === 'all',
175 xtype
: 'displayfield',
177 fieldLabel
: gettext('Node'),
178 renderer
: value
=> value
|| `-- ${gettext('All')} --`,
181 xtype
: 'displayfield',
183 fieldLabel
: gettext('Storage'),
186 xtype
: 'displayfield',
188 fieldLabel
: gettext('Schedule'),
191 xtype
: 'displayfield',
193 fieldLabel
: gettext('Next Run'),
194 renderer
: PVE
.Utils
.render_next_event
,
197 xtype
: 'displayfield',
199 fieldLabel
: gettext('Selection mode'),
204 xtype
: 'displayfield',
205 name
: 'mailnotification',
206 fieldLabel
: gettext('Notification'),
207 renderer: function(value
) {
208 let mailto
= this.up('pveBackupInfo')?.record
?.mailto
|| 'root@localhost';
209 let when
= gettext('Always');
210 if (value
=== 'failure') {
211 when
= gettext('On failure only');
213 return `${when} (${mailto})`;
217 xtype
: 'displayfield',
219 fieldLabel
: gettext('Compression'),
222 xtype
: 'displayfield',
224 fieldLabel
: gettext('Mode'),
225 renderer: function(value
) {
226 const modeToDisplay
= {
227 snapshot
: gettext('Snapshot'),
228 stop
: gettext('Stop'),
229 suspend
: gettext('Snapshot'),
231 return modeToDisplay
[value
] ?? gettext('Unknown');
235 xtype
: 'displayfield',
237 fieldLabel
: gettext('Enabled'),
238 renderer
: v
=> PVE
.Parser
.parseBoolean(v
.toString()) ? gettext('Yes') : gettext('No'),
241 xtype
: 'displayfield',
243 fieldLabel
: gettext('Pool to backup'),
249 xtype
: 'displayfield',
251 fieldLabel
: gettext('Comment'),
256 text
: gettext('Retention Configuration') + ':',
258 hidden
: '{!hasRetention}',
276 xtype
: 'displayfield',
278 fieldLabel
: gettext('Keep All'),
279 renderer
: Proxmox
.Utils
.format_boolean
,
281 hidden
: '{!retentionKeepAll}',
285 ['keep-last', gettext('Keep Last')],
286 ['keep-hourly', gettext('Keep Hourly')],
289 xtype
: 'displayfield',
293 hidden
: '{!hasRetention || retentionKeepAll}',
305 ['keep-daily', gettext('Keep Daily')],
306 ['keep-weekly', gettext('Keep Weekly')],
309 xtype
: 'displayfield',
313 hidden
: '{!hasRetention || retentionKeepAll}',
324 ['keep-monthly', gettext('Keep Monthly')],
325 ['keep-yearly', gettext('Keep Yearly')],
328 xtype
: 'displayfield',
332 hidden
: '{!hasRetention || retentionKeepAll}',
341 setValues: function(values
) {
343 let vm
= me
.getViewModel();
345 Ext
.iterate(values
, function(fieldId
, val
) {
346 let field
= me
.query('[isFormField][name=' + fieldId
+ ']')[0];
352 if (values
['prune-backups'] || values
.maxfiles
!== undefined) {
354 if (values
['prune-backups']) {
355 keepValues
= values
['prune-backups'];
356 } else if (values
.maxfiles
> 0) {
357 keepValues
= { 'keep-last': values
.maxfiles
};
359 keepValues
= { 'keep-all': 1 };
362 vm
.set('retentionType', keepValues
['keep-all'] ? 'all' : 'other');
364 // set values of all keep-X fields
365 ['all', 'last', 'hourly', 'daily', 'weekly', 'monthly', 'yearly'].forEach(time
=> {
366 let name
= `keep-${time}`;
367 me
.query(`[isFormField][name=${name}]`)[0]?.setValue(keepValues
[name
]);
370 vm
.set('retentionType', 'none');
373 // selection Mode depends on the presence/absence of several keys
374 let selModeField
= me
.query('[isFormField][name=selMode]')[0];
375 let selMode
= 'none';
377 selMode
= gettext('Include selected VMs');
380 selMode
= gettext('All');
382 if (values
.exclude
) {
383 selMode
= gettext('Exclude selected VMs');
386 selMode
= gettext('Pool based');
388 selModeField
.setValue(selMode
);
391 let poolField
= me
.query('[isFormField][name=pool]')[0];
392 poolField
.setVisible(0);
396 initComponent: function() {
400 throw "no data provided";
404 me
.setValues(me
.record
);
409 Ext
.define('PVE.dc.BackedGuests', {
410 extend
: 'Ext.grid.GridPanel',
411 alias
: 'widget.pveBackedGuests',
414 stateId
: 'grid-dc-backed-guests',
420 header
: gettext('Type'),
422 renderer
: PVE
.Utils
.render_resource_type
,
427 header
: gettext('VMID'),
433 header
: gettext('Name'),
444 initComponent: function() {
447 me
.store
.clearFilter(true);
452 gettext('Search') + ':',
457 emptyText
: 'Name, VMID, Type',
458 enableKeyEvents
: true,
461 keyup: function(field
) {
462 let searchValue
= field
.getValue().toLowerCase();
463 me
.store
.clearFilter(true);
464 me
.store
.filterBy(function(record
) {
465 let data
= record
.data
;
466 for (const property
in ['name', 'id', 'type']) {
467 if (data
[property
] === null) {
470 let v
= data
[property
].toString();
471 if (v
!== undefined) {
472 if (v
.toLowerCase().includes(searchValue
)) {