]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/grid/BackupView.js
ui: change comment column to notes
[pve-manager.git] / www / manager6 / grid / BackupView.js
index 69b0cc75b37ebd95d9e589a7cc6aaa468a024cdf..191b2e3fd6c31ccf61f9079529845d7b4b50175e 100644 (file)
@@ -3,6 +3,10 @@ Ext.define('PVE.grid.BackupView', {
 
     alias: ['widget.pveBackupView'],
 
+    onlineHelp: 'chapter_vzdump',
+
+    stateful: true,
+    stateId: 'grid-guest-backup',
 
     initComponent : function() {
        var me = this;
@@ -22,34 +26,55 @@ Ext.define('PVE.grid.BackupView', {
            throw "no VM type specified";
        }
 
-       var filterFn;
-       if (vmtype === 'openvz') {
-           filterFn = function(item) {
-               return item.data.volid.match(':backup/vzdump-openvz-');
-           };
-       } else if (vmtype === 'lxc') {
-           filterFn = function(item) {
-               return item.data.volid.match(':backup/vzdump-lxc-');
+       var vmtypeFilter;
+       if (vmtype === 'lxc' || vmtype === 'openvz') {
+           vmtypeFilter = function(item) {
+               return PVE.Utils.volume_is_lxc_backup(item.data.volid, item.data.format);
            };
        } else if (vmtype === 'qemu') {
-           filterFn = function(item) {
-               return item.data.volid.match(':backup/vzdump-qemu-');
+           vmtypeFilter = function(item) {
+               return PVE.Utils.volume_is_qemu_backup(item.data.volid, item.data.format);
            };
        } else {
            throw "unsupported VM type '" + vmtype + "'";
        }
 
+       var searchFilter = {
+           property: 'volid',
+           value: '',
+           anyMatch: true,
+           caseSensitive: false
+       };
+
+       var vmidFilter = {
+           property: 'vmid',
+           value: vmid,
+           exactMatch: true,
+       };
+
        me.store = Ext.create('Ext.data.Store', {
            model: 'pve-storage-content',
            sorters: { 
                property: 'volid', 
                order: 'DESC' 
            },
-           filters: { filterFn: filterFn }
+           filters: [
+               vmtypeFilter,
+               searchFilter,
+               vmidFilter,
+               ]
        });
 
+       let updateFilter = function() {
+           me.store.filter([
+               vmtypeFilter,
+               searchFilter,
+               vmidFilter,
+           ]);
+       };
+
        var reload = Ext.Function.createBuffered(function() {
-           if (me.store.proxy.url) {
+           if (me.store) {
                me.store.load();
            }
        }, 100);
@@ -59,7 +84,7 @@ Ext.define('PVE.grid.BackupView', {
            url += '?content=backup';
 
            me.store.setProxy({
-               type: 'pve',
+               type: 'proxmox',
                url: url
            });
 
@@ -74,6 +99,15 @@ Ext.define('PVE.grid.BackupView', {
            allowBlank: false,
            listeners: {
                change: function(f, value) {
+                   let storage = f.getStore().findRecord('storage', value);
+                   if (storage) {
+                       let isPBS = storage.data.type === 'pbs';
+                       me.getColumns().forEach((column) => {
+                           if (column.dataIndex === 'verification') {
+                               column.setHidden(!isPBS);
+                           }
+                       });
+                   }
                    setStorage(value);
                }
            }
@@ -84,22 +118,29 @@ Ext.define('PVE.grid.BackupView', {
            labelWidth: 50,
            labelAlign: 'right',
            enableKeyEvents: true,
+           value: searchFilter.value,
            listeners: {
                buffer: 500,
                keyup: function(field) {
                    me.store.clearFilter(true);
-                   me.store.filter([
-                       {
-                           property: 'volid',
-                           value: field.getValue(),
-                           anyMatch: true,
-                           caseSensitive: false
-                       }
-                   ]);
+                   searchFilter.value = field.getValue();
+                   updateFilter();
                }
            }
        });
 
+       var vmidfilterCB = Ext.create('Ext.form.field.Checkbox', {
+           boxLabel: gettext('Filter VMID'),
+           value: '1',
+           listeners: {
+               change: function(cb, value) {
+                   vmidFilter.value = value ? vmid : '';
+                   vmidFilter.exactMatch = !!value;
+                   updateFilter();
+               },
+           },
+       });
+
        var sm = Ext.create('Ext.selection.RowModel', {});
 
        var backup_btn = Ext.create('Ext.button.Button', {
@@ -109,13 +150,18 @@ Ext.define('PVE.grid.BackupView', {
                    nodename: nodename,
                    vmid: vmid,
                    vmtype: vmtype,
-                   storage: storagesel.getValue()
+                   storage: storagesel.getValue(),
+                   listeners : {
+                       close: function() {
+                           reload();
+                       }
+                   }
                });
                win.show();
            }
        });
 
-       var restore_btn = Ext.create('PVE.button.Button', {
+       var restore_btn = Ext.create('Proxmox.button.Button', {
            text: gettext('Restore'),
            disabled: true,
            selModel: sm,
@@ -123,9 +169,7 @@ Ext.define('PVE.grid.BackupView', {
                return !!rec;
            },
            handler: function(b, e, rec) {
-               var volid = rec.data.volid;
-
-               var win = Ext.create('PVE.window.Restore', {
+               let win = Ext.create('PVE.window.Restore', {
                    nodename: nodename,
                    vmid: vmid,
                    volid: rec.data.volid,
@@ -137,54 +181,73 @@ Ext.define('PVE.grid.BackupView', {
            }
        });
 
-       var delete_btn = Ext.create('PVE.button.Button', {
-           text: gettext('Remove'),
-           disabled: true,
+       var delete_btn = Ext.create('Proxmox.button.StdRemoveButton', {
            selModel: sm,
-           dangerous: true,        
+           dangerous: true,
+           delay: 5,
            confirmMsg: function(rec) {
                var msg = Ext.String.format(gettext('Are you sure you want to remove entry {0}'),
                                            "'" + rec.data.volid + "'");
-               msg += " " + gettext('This will permanently erase all image data.');
+               msg += " " + gettext('This will permanently erase all data.');
 
                return msg;
            },
+           getUrl: function(rec) {
+               var storage = storagesel.getValue();
+               return '/nodes/' + nodename + '/storage/' + storage + '/content/' + rec.data.volid;
+           },
+           callback: function() {
+               reload();
+           }
+       });
+
+       var config_btn = Ext.create('Proxmox.button.Button', {
+           text: gettext('Show Configuration'),
+           disabled: true,
+           selModel: sm,
            enableFn: function(rec) {
                return !!rec;
            },
-           handler: function(b, e, rec){
+           handler: function(b, e, rec) {
                var storage = storagesel.getValue();
                if (!storage) {
                    return;
                }
 
-               var volid = rec.data.volid;
-               PVE.Utils.API2Request({
-                   url: "/nodes/" + nodename + "/storage/" + storage + "/content/" + volid,
-                   method: 'DELETE',
-                   waitMsgTarget: me,
-                   failure: function(response, opts) {
-                       Ext.Msg.alert('Error', response.htmlStatus);
-                   },
-                   success: function(response, options) {
-                       reload();
-                   }
+               var win = Ext.create('PVE.window.BackupConfig', {
+                   volume: rec.data.volid,
+                   pveSelNode: me.pveSelNode
                });
+
+               win.show();
            }
        });
 
        Ext.apply(me, {
-           stateful: false,
            selModel: sm,
-           tbar: [ backup_btn, restore_btn, delete_btn, '->', storagesel, storagefilter ],
+           tbar: {
+               overflowHandler: 'scroller',
+               items: [ backup_btn, restore_btn, delete_btn,config_btn, '->', storagesel, '-', vmidfilterCB, storagefilter ],
+           },
            columns: [
                {
                    header: gettext('Name'),
-                   flex: 1,
+                   flex: 2,
                    sortable: true,
                    renderer: PVE.Utils.render_storage_content,
                    dataIndex: 'volid'
                },
+               {
+                   header: gettext('Notes'),
+                   dataIndex: 'notes',
+                   flex: 1,
+                   renderer: Ext.htmlEncode,
+               },
+               {
+                   header: gettext('Date'),
+                   width: 150,
+                   dataIndex: 'vdate'
+               },
                {
                    header: gettext('Format'),
                    width: 100,
@@ -193,13 +256,41 @@ Ext.define('PVE.grid.BackupView', {
                {
                    header: gettext('Size'),
                    width: 100,
-                   renderer: PVE.Utils.format_size,
+                   renderer: Proxmox.Utils.format_size,
                    dataIndex: 'size'
+               },
+               {
+                   header: gettext('VMID'),
+                   dataIndex: 'vmid',
+                   hidden: true,
+               },
+               {
+                   header: gettext('Verify State'),
+                   dataIndex: 'verification',
+                   renderer: function(v) {
+                       let i = (cls, txt) => `<i class="fa fa-fw fa-${cls}"></i> ${txt}`;
+                       if (v === undefined || v === null) {
+                           return i('question-circle-o warning', gettext('None'));
+                       }
+                       let tip = ""
+                       let txt = gettext('Failed');
+                       let iconCls = 'times critical';
+                       if (v.state === 'ok') {
+                           txt = gettext('OK');
+                           iconCls = 'check good';
+                           let now = Date.now() / 1000;
+                           let task = Proxmox.Utils.parse_task_upid(v.upid);
+                           let verify_time = Proxmox.Utils.render_timestamp(task.starttime);
+                           tip = `Last verify task started on ${verify_time}`;
+                           if (now - v.starttime > 30 * 24 * 60 * 60) {
+                               tip = `Last verify task over 30 days ago: ${verify_time}`;
+                               iconCls = 'check warning';
+                           }
+                       }
+                       return `<span data-qtip="${tip}"> ${i(iconCls, txt)} </span>`;
+                   }
                }
-           ],
-           listeners: {
-               activate: reload
-           }
+           ]
        });
 
        me.callParent();