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 let nodename
= me
.nodename
= me
.pveSelNode
.data
.node
;
13 throw "no node name specified";
16 let storage
= me
.storage
= me
.pveSelNode
.data
.storage
;
18 throw "no storage ID specified";
21 me
.content
= 'backup';
23 let sm
= me
.sm
= Ext
.create('Ext.selection.RowModel', {});
25 let pruneButton
= Ext
.create('Proxmox.button.Button', {
26 text
: gettext('Prune group'),
29 setBackupGroup: function(backup
) {
31 let name
= backup
.text
;
32 let vmid
= backup
.vmid
;
33 let format
= backup
.format
;
36 if (name
.startsWith('vzdump-lxc-') || format
=== "pbs-ct") {
38 } else if (name
.startsWith('vzdump-qemu-') || format
=== "pbs-vm") {
43 this.setText(gettext('Prune group') + ` ${vmtype}/${vmid}`);
46 this.setDisabled(false);
50 this.setText(gettext('Prune group'));
53 this.setDisabled(true);
55 handler: function(b
, e
, rec
) {
56 Ext
.create('PVE.window.Prune', {
61 backup_type
: this.vmtype
,
63 destroy
: () => me
.store
.load(),
69 me
.on('selectionchange', function(model
, srecords
, eOpts
) {
70 if (srecords
.length
=== 1) {
71 pruneButton
.setBackupGroup(srecords
[0].data
);
73 pruneButton
.setBackupGroup(null);
77 let isPBS
= me
.pluginType
=== 'pbs';
81 xtype
: 'proxmoxButton',
82 text
: gettext('Restore'),
85 handler: function(b
, e
, rec
) {
87 if (PVE
.Utils
.volume_is_qemu_backup(rec
.data
.volid
, rec
.data
.format
)) {
89 } else if (PVE
.Utils
.volume_is_lxc_backup(rec
.data
.volid
, rec
.data
.format
)) {
95 Ext
.create('PVE.window.Restore', {
98 volid
: rec
.data
.volid
,
99 volidText
: PVE
.Utils
.render_storage_content(rec
.data
.volid
, {}, rec
),
103 destroy
: () => me
.store
.load(),
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 Ext
.create('PVE.window.BackupConfig', {
139 volume
: rec
.data
.volid
,
140 pveSelNode
: me
.pveSelNode
,
145 xtype
: 'proxmoxButton',
146 text
: gettext('Edit Notes'),
149 handler: function(b
, e
, rec
) {
150 let volid
= rec
.data
.volid
;
151 Ext
.create('Proxmox.window.Edit', {
157 title
: gettext('Notes'),
158 url
: `/api2/extjs/nodes/${nodename}/storage/${me.storage}/content/${volid}`,
169 destroy
: () => me
.store
.load(),
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
),
188 callback
: () => sm
.fireEvent('selectionchange', sm
, [record
]),
198 me
.extraColumns
= {};
201 me
.extraColumns
.encrypted
= {
202 header
: gettext('Encrypted'),
203 dataIndex
: 'encrypted',
204 renderer
: PVE
.Utils
.render_backup_encryption
,
206 property
: 'encrypted',
207 transform
: encrypted
=> encrypted
? 1 : 0,
210 me
.extraColumns
.verification
= {
211 header
: gettext('Verify State'),
212 dataIndex
: 'verification',
213 renderer
: PVE
.Utils
.render_backup_verification
,
215 property
: 'verification',
216 transform
: value
=> {
217 let state
= value
?.state
?? 'none';
218 let order
= PVE
.Utils
.verificationStateOrder
;
219 return order
[state
] ?? order
.__default__
;
225 me
.extraColumns
.vmid
= {
226 header
: gettext('VMID'),
229 sorter
: (a
, b
) => (a
.data
.vmid
?? 0) - (b
.data
.vmid
?? 0),
234 me
.store
.getSorters().clear();
235 me
.store
.setSorters([