]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/grid/BackupView.js
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',
68 let updateFilter = function() {
76 var reload
= Ext
.Function
.createBuffered(function() {
82 var setStorage = function(storage
) {
83 var url
= '/api2/json/nodes/' + nodename
+ '/storage/' + storage
+ '/content';
84 url
+= '?content=backup';
94 var storagesel
= Ext
.create('PVE.form.StorageSelector', {
96 fieldLabel
: gettext('Storage'),
98 storageContent
: 'backup',
101 change: function(f
, value
) {
102 let storage
= f
.getStore().findRecord('storage', value
);
104 let isPBS
= storage
.data
.type
=== 'pbs';
105 me
.getColumns().forEach((column
) => {
106 if (column
.dataIndex
=== 'verification') {
107 column
.setHidden(!isPBS
);
116 var storagefilter
= Ext
.create('Ext.form.field.Text', {
117 fieldLabel
: gettext('Search'),
120 enableKeyEvents
: true,
121 value
: searchFilter
.value
,
124 keyup: function(field
) {
125 me
.store
.clearFilter(true);
126 searchFilter
.value
= field
.getValue();
132 var vmidfilterCB
= Ext
.create('Ext.form.field.Checkbox', {
133 boxLabel
: gettext('Filter VMID'),
136 change: function(cb
, value
) {
137 vmidFilter
.value
= value
? vmid
: '';
138 vmidFilter
.exactMatch
= !!value
;
144 var sm
= Ext
.create('Ext.selection.RowModel', {});
146 var backup_btn
= Ext
.create('Ext.button.Button', {
147 text
: gettext('Backup now'),
148 handler: function() {
149 var win
= Ext
.create('PVE.window.Backup', {
153 storage
: storagesel
.getValue(),
164 var restore_btn
= Ext
.create('Proxmox.button.Button', {
165 text
: gettext('Restore'),
168 enableFn: function(rec
) {
171 handler: function(b
, e
, rec
) {
172 let win
= Ext
.create('PVE.window.Restore', {
175 volid
: rec
.data
.volid
,
176 volidText
: PVE
.Utils
.render_storage_content(rec
.data
.volid
, {}, rec
),
180 win
.on('destroy', reload
);
184 var delete_btn
= Ext
.create('Proxmox.button.StdRemoveButton', {
188 confirmMsg: function(rec
) {
189 var msg
= Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
190 "'" + rec
.data
.volid
+ "'");
191 msg
+= " " + gettext('This will permanently erase all data.');
195 getUrl: function(rec
) {
196 var storage
= storagesel
.getValue();
197 return '/nodes/' + nodename
+ '/storage/' + storage
+ '/content/' + rec
.data
.volid
;
199 callback: function() {
204 var config_btn
= Ext
.create('Proxmox.button.Button', {
205 text
: gettext('Show Configuration'),
208 enableFn: function(rec
) {
211 handler: function(b
, e
, rec
) {
212 var storage
= storagesel
.getValue();
217 var win
= Ext
.create('PVE.window.BackupConfig', {
218 volume
: rec
.data
.volid
,
219 pveSelNode
: me
.pveSelNode
229 overflowHandler
: 'scroller',
230 items
: [ backup_btn
, restore_btn
, delete_btn
,config_btn
, '->', storagesel
, '-', vmidfilterCB
, storagefilter
],
234 header
: gettext('Name'),
237 renderer
: PVE
.Utils
.render_storage_content
,
241 header
: gettext('Notes'),
244 renderer
: Ext
.htmlEncode
,
247 header
: gettext('Date'),
252 header
: gettext('Format'),
257 header
: gettext('Size'),
259 renderer
: Proxmox
.Utils
.format_size
,
263 header
: gettext('VMID'),
268 header
: gettext('Verify State'),
269 dataIndex
: 'verification',
270 renderer: function(v
) {
271 let i
= (cls
, txt
) => `<i class="fa fa-fw fa-${cls}"></i> ${txt}`;
272 if (v
=== undefined || v
=== null) {
273 return i('question-circle-o warning', gettext('None'));
276 let txt
= gettext('Failed');
277 let iconCls
= 'times critical';
278 if (v
.state
=== 'ok') {
280 iconCls
= 'check good';
281 let now
= Date
.now() / 1000;
282 let task
= Proxmox
.Utils
.parse_task_upid(v
.upid
);
283 let verify_time
= Proxmox
.Utils
.render_timestamp(task
.starttime
);
284 tip
= `Last verify task started on ${verify_time}`;
285 if (now
- v
.starttime
> 30 * 24 * 60 * 60) {
286 tip
= `Last verify task over 30 days ago: ${verify_time}`;
287 iconCls
= 'check warning';
290 return `<span data-qtip="${tip}"> ${i(iconCls, txt)} </span>`;