1 Ext
.define('PVE.storage.BackupView', {
2 extend
: 'PVE.storage.ContentView',
4 alias
: 'widget.pveStorageBackupView',
6 showColumns
: ['name', 'notes', 'protected', 'date', 'format', 'size'],
8 initComponent: function() {
11 var nodename
= me
.nodename
= me
.pveSelNode
.data
.node
;
13 throw "no node name specified";
16 var storage
= me
.storage
= me
.pveSelNode
.data
.storage
;
18 throw "no storage ID specified";
21 me
.content
= 'backup';
23 var sm
= me
.sm
= Ext
.create('Ext.selection.RowModel', {});
25 var reload = function() {
29 let pruneButton
= Ext
.create('Proxmox.button.Button', {
30 text
: gettext('Prune group'),
33 setBackupGroup: function(backup
) {
35 let name
= backup
.text
;
36 let vmid
= backup
.vmid
;
37 let format
= backup
.format
;
40 if (name
.startsWith('vzdump-lxc-') || format
=== "pbs-ct") {
42 } else if (name
.startsWith('vzdump-qemu-') || format
=== "pbs-vm") {
47 this.setText(gettext('Prune group') + ` ${vmtype}/${vmid}`);
50 this.setDisabled(false);
54 this.setText(gettext('Prune group'));
57 this.setDisabled(true);
59 handler: function(b
, e
, rec
) {
60 let win
= Ext
.create('PVE.window.Prune', {
64 backup_type
: this.vmtype
,
67 win
.on('destroy', reload
);
71 me
.on('selectionchange', function(model
, srecords
, eOpts
) {
72 if (srecords
.length
=== 1) {
73 pruneButton
.setBackupGroup(srecords
[0].data
);
75 pruneButton
.setBackupGroup(null);
79 let isPBS
= me
.pluginType
=== 'pbs';
83 xtype
: 'proxmoxButton',
84 text
: gettext('Restore'),
87 handler: function(b
, e
, rec
) {
89 if (PVE
.Utils
.volume_is_qemu_backup(rec
.data
.volid
, rec
.data
.format
)) {
91 } else if (PVE
.Utils
.volume_is_lxc_backup(rec
.data
.volid
, rec
.data
.format
)) {
97 var win
= Ext
.create('PVE.window.Restore', {
99 volid
: rec
.data
.volid
,
100 volidText
: PVE
.Utils
.render_storage_content(rec
.data
.volid
, {}, rec
),
105 win
.on('destroy', reload
);
111 xtype
: 'proxmoxButton',
112 text
: gettext('File Restore'),
115 handler: function(b
, e
, rec
) {
116 let isVMArchive
= PVE
.Utils
.volume_is_qemu_backup(rec
.data
.volid
, rec
.data
.format
);
117 Ext
.create('Proxmox.window.FileBrowser', {
118 title
: gettext('File Restore') + " - " + rec
.data
.text
,
119 listURL
: `/api2/json/nodes/localhost/storage/${me.storage}/file-restore/list`,
120 downloadURL
: `/api2/json/nodes/localhost/storage/${me.storage}/file-restore/download`,
122 volume
: rec
.data
.volid
,
124 archive
: isVMArchive
? 'all' : undefined,
132 xtype
: 'proxmoxButton',
133 text
: gettext('Show Configuration'),
136 handler: function(b
, e
, rec
) {
137 var win
= Ext
.create('PVE.window.BackupConfig', {
138 volume
: rec
.data
.volid
,
139 pveSelNode
: me
.pveSelNode
,
146 xtype
: 'proxmoxButton',
147 text
: gettext('Edit Notes'),
150 handler: function(b
, e
, rec
) {
151 let volid
= rec
.data
.volid
;
152 Ext
.create('Proxmox.window.Edit', {
157 title
: gettext('Notes'),
158 url
: `/api2/extjs/nodes/${nodename}/storage/${me.storage}/content/${volid}`,
169 destroy
: () => reload(),
175 xtype
: 'proxmoxButton',
176 text
: gettext('Change Protection'),
178 handler: function(button
, event
, record
) {
179 const volid
= record
.data
.volid
;
180 Proxmox
.Utils
.API2Request({
181 url
: `/api2/extjs/nodes/${nodename}/storage/${me.storage}/content/${volid}`,
184 params
: { 'protected': record
.data
.protected ? 0 : 1 },
185 failure
: (response
) => Ext
.Msg
.alert('Error', response
.htmlStatus
),
186 success
: (response
) => reload(),
197 header
: gettext('Encrypted'),
198 dataIndex
: 'encrypted',
199 renderer
: PVE
.Utils
.render_backup_encryption
,
201 property
: 'encrypted',
202 transform
: (value
) => value
? 1 : 0,
206 header
: gettext('Verify State'),
207 dataIndex
: 'verification',
208 renderer
: PVE
.Utils
.render_backup_verification
,
210 property
: 'verification',
211 transform
: (value
) => {
212 let state
= value
?.state
?? 'none';
213 let order
= PVE
.Utils
.verificationStateOrder
;
214 return order
[state
] ?? order
.__default__
;
223 me
.store
.getSorters().clear();
224 me
.store
.setSorters([