1 Ext
.define('PVE.grid.BackupView', {
2 extend
: 'Ext.grid.GridPanel',
4 alias
: ['widget.pveBackupView'],
6 onlineHelp
: 'chapter_vzdump',
9 stateId
: 'grid-guest-backup',
11 initComponent: function() {
14 var nodename
= me
.pveSelNode
.data
.node
;
16 throw "no node name specified";
19 var vmid
= me
.pveSelNode
.data
.vmid
;
21 throw "no VM ID specified";
24 var vmtype
= me
.pveSelNode
.data
.type
;
26 throw "no VM type specified";
30 if (vmtype
=== 'lxc' || vmtype
=== 'openvz') {
31 vmtypeFilter = function(item
) {
32 return PVE
.Utils
.volume_is_lxc_backup(item
.data
.volid
, item
.data
.format
);
34 } else if (vmtype
=== 'qemu') {
35 vmtypeFilter = function(item
) {
36 return PVE
.Utils
.volume_is_qemu_backup(item
.data
.volid
, item
.data
.format
);
39 throw "unsupported VM type '" + vmtype
+ "'";
55 me
.store
= Ext
.create('Ext.data.Store', {
56 model
: 'pve-storage-content',
74 let updateFilter = function() {
82 const reload
= Ext
.Function
.createBuffered((options
) => {
84 me
.store
.load(options
);
89 var setStorage = function(storage
) {
90 var url
= '/api2/json/nodes/' + nodename
+ '/storage/' + storage
+ '/content';
91 url
+= '?content=backup';
98 Proxmox
.Utils
.monStoreErrors(me
.view
, me
.store
, true);
103 let file_restore_btn
;
105 var storagesel
= Ext
.create('PVE.form.StorageSelector', {
107 fieldLabel
: gettext('Storage'),
109 storageContent
: 'backup',
112 change: function(f
, value
) {
113 let storage
= f
.getStore().findRecord('storage', value
, 0, false, true, true);
115 isPBS
= storage
.data
.type
=== 'pbs';
116 me
.getColumns().forEach((column
) => {
117 let id
= column
.dataIndex
;
118 if (id
=== 'verification' || id
=== 'encrypted') {
119 column
.setHidden(!isPBS
);
126 if (file_restore_btn
) {
127 file_restore_btn
.setHidden(!isPBS
);
133 var storagefilter
= Ext
.create('Ext.form.field.Text', {
134 fieldLabel
: gettext('Search'),
137 enableKeyEvents
: true,
138 value
: searchFilter
.value
,
141 keyup: function(field
) {
142 me
.store
.clearFilter(true);
143 searchFilter
.value
= field
.getValue();
149 var vmidfilterCB
= Ext
.create('Ext.form.field.Checkbox', {
150 boxLabel
: gettext('Filter VMID'),
153 change: function(cb
, value
) {
154 vmidFilter
.value
= value
? vmid
: '';
155 vmidFilter
.exactMatch
= !!value
;
161 var sm
= Ext
.create('Ext.selection.RowModel', {});
163 var backup_btn
= Ext
.create('Ext.button.Button', {
164 text
: gettext('Backup now'),
165 handler: function() {
166 var win
= Ext
.create('PVE.window.Backup', {
170 storage
: storagesel
.getValue(),
181 var restore_btn
= Ext
.create('Proxmox.button.Button', {
182 text
: gettext('Restore'),
185 enableFn: function(rec
) {
188 handler: function(b
, e
, rec
) {
189 let win
= Ext
.create('PVE.window.Restore', {
192 volid
: rec
.data
.volid
,
193 volidText
: PVE
.Utils
.render_storage_content(rec
.data
.volid
, {}, rec
),
198 win
.on('destroy', reload
);
202 let delete_btn
= Ext
.create('Proxmox.button.StdRemoveButton', {
206 enableFn
: rec
=> !rec
?.data
?.protected,
207 confirmMsg
: ({ data
}) => {
208 let msg
= Ext
.String
.format(
209 gettext('Are you sure you want to remove entry {0}'), `'${data.volid}'`);
210 return msg
+ " " + gettext('This will permanently erase all data.');
212 getUrl
: ({ data
}) => `/nodes/${nodename}/storage/${storagesel.getValue()}/content/${data.volid}`,
213 callback
: () => reload(),
216 let config_btn
= Ext
.create('Proxmox.button.Button', {
217 text
: gettext('Show Configuration'),
220 enableFn
: rec
=> !!rec
,
221 handler: function(b
, e
, rec
) {
222 let storage
= storagesel
.getValue();
226 Ext
.create('PVE.window.BackupConfig', {
227 volume
: rec
.data
.volid
,
228 pveSelNode
: me
.pveSelNode
,
234 // declared above so that the storage selector can change this buttons hidden state
235 file_restore_btn
= Ext
.create('Proxmox.button.Button', {
236 text
: gettext('File Restore'),
239 enableFn
: rec
=> !!rec
&& isPBS
,
241 handler: function(b
, e
, rec
) {
242 let storage
= storagesel
.getValue();
243 let isVMArchive
= PVE
.Utils
.volume_is_qemu_backup(rec
.data
.volid
, rec
.data
.format
);
244 Ext
.create('Proxmox.window.FileBrowser', {
245 title
: gettext('File Restore') + " - " + rec
.data
.text
,
246 listURL
: `/api2/json/nodes/localhost/storage/${storage}/file-restore/list`,
247 downloadURL
: `/api2/json/nodes/localhost/storage/${storage}/file-restore/download`,
249 volume
: rec
.data
.volid
,
251 archive
: isVMArchive
? 'all' : undefined,
260 overflowHandler
: 'scroller',
268 xtype
: 'proxmoxButton',
269 text
: gettext('Edit Notes'),
271 handler: function() {
272 let volid
= sm
.getSelection()[0].data
.volid
;
273 var storage
= storagesel
.getValue();
274 Ext
.create('Proxmox.window.Edit', {
279 title
: gettext('Notes'),
280 url
: `/api2/extjs/nodes/${nodename}/storage/${storage}/content/${volid}`,
291 destroy
: () => reload(),
297 xtype
: 'proxmoxButton',
298 text
: gettext('Change Protection'),
300 handler: function(button
, event
, record
) {
301 let volid
= record
.data
.volid
, storage
= storagesel
.getValue();
302 let url
= `/api2/extjs/nodes/${nodename}/storage/${storage}/content/${volid}`;
303 Proxmox
.Utils
.API2Request({
308 'protected': record
.data
.protected ? 0 : 1,
310 failure
: (response
) => Ext
.Msg
.alert('Error', response
.htmlStatus
),
313 callback
: () => sm
.fireEvent('selectionchange', sm
, [record
]),
330 header
: gettext('Name'),
333 renderer
: PVE
.Utils
.render_storage_content
,
337 header
: gettext('Notes'),
340 renderer
: Ext
.htmlEncode
,
343 header
: `<i class="fa fa-shield"></i>`,
344 tooltip
: gettext('Protected'),
346 renderer
: v
=> v
? `<i data-qtip="${gettext('Protected')}" class="fa fa-shield"></i>` : '',
347 sorter
: (a
, b
) => (b
.data
.protected || 0) - (a
.data
.protected || 0),
348 dataIndex
: 'protected',
351 header
: gettext('Date'),
356 header
: gettext('Format'),
361 header
: gettext('Size'),
363 renderer
: Proxmox
.Utils
.format_size
,
372 header
: gettext('Encrypted'),
373 dataIndex
: 'encrypted',
374 renderer
: PVE
.Utils
.render_backup_encryption
,
377 header
: gettext('Verify State'),
378 dataIndex
: 'verification',
379 renderer
: PVE
.Utils
.render_backup_verification
,