Adds a new `Summary` button to the backup panel which opens a new
window containing a searchable view of all guests and whether they are
backed up by any job or not.

Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com>
---

I took the code for the search field from the ResourceGrid, simplified
it and adapted it more to having it statically defined and not all in
the initComponent method.

 www/manager6/dc/Backup.js | 200 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 200 insertions(+)

diff --git a/www/manager6/dc/Backup.js b/www/manager6/dc/Backup.js
index f2a28ce7..a7a0ed3a 100644
--- a/www/manager6/dc/Backup.js
+++ b/www/manager6/dc/Backup.js
@@ -678,6 +678,171 @@ Ext.define('PVE.dc.BackupInfo', {
     }
 });
 
+Ext.define('PVE.dc.BackedGuests', {
+    extend: 'Ext.grid.GridPanel',
+    alias: 'widget.pveBackedGuests',
+
+    ostore: [],
+    textfilter: '',
+
+    store: {
+       sorters: 'vmid',
+       data: {},
+    },
+
+    viewModel: {
+       data: {
+           missingPermissions: 0,
+       },
+       formulas: {
+           showPermissionsHint: (get) => get('missingPermissions'),
+       }
+    },
+
+    dockedItems: [{
+       xtype: 'toolbar',
+       dock: 'bottom',
+       userCls: 'pmx-hint',
+       items: [
+           {
+               xtype: 'displayfield',
+               value: gettext("You don't have permission to see all guests."),
+           },
+       ],
+       bind: {
+           hidden: '{!showPermissionsHint}',
+       },
+    }],
+
+    columns: [
+       {
+           header: gettext('Type'),
+           dataIndex: "type",
+           renderer: PVE.Utils.render_resource_type,
+           flex: 1,
+           sortable: true,
+       },
+       {
+           header: gettext('VMID'),
+           dataIndex: 'vmid',
+           flex: 1,
+           sortable: true,
+       },
+       {
+           header: gettext('Name'),
+           dataIndex: 'name',
+           flex: 2,
+           sortable: true,
+       },
+       {
+           header: gettext('Backup'),
+           renderer: PVE.Utils.render_backup_status,
+           dataIndex: "backed_up",
+           flex: 1,
+           sortable: true,
+       },
+    ],
+
+    reload: function() {
+       var me = this;
+       var sm = me.getSelectionModel();
+
+       Proxmox.Utils.API2Request({
+           url: '/cluster/backupsummary/included_status',
+           waitMsgTarget: me,
+           method: 'GET',
+           failure: function(response, opts) {
+               Proxmox.Utils.setErrorMask(me, response.htmlStatus);
+           },
+           success: function(response, opts) {
+               let viewModel = me.getViewModel();
+               viewModel.set('missingPermissions', 
response.result.data['not_all_permissions']);
+
+               me.ostore = response.result.data.guests;
+
+               me.updateGrid();
+           },
+       });
+    },
+
+    textfilter_match: function(item) {
+       let me = this;
+       let match = false;
+       Ext.each(['name', 'vmid', 'type'], function(field) {
+           let v = item[field].toString();
+           if (v !== undefined) {
+               v = v.toLowerCase();
+               if (v.indexOf(me.textfilter) >= 0) {
+                   match = true;
+                   return false;
+               }
+           }
+       });
+       return match;
+    },
+
+    updateGrid: function() {
+       let me = this;
+       me.store.suspendEvents();
+
+       if (me.textfilter) {
+           let matched_items = [];
+
+           Ext.each(me.ostore, function(item) {
+               if (me.textfilter_match(item)) {
+                   matched_items.push(item);
+               }
+           });
+           me.store.setData(matched_items);
+       }
+       else {
+           me.store.setData(me.ostore);
+       }
+
+       me.store.resumeEvents();
+       me.store.fireEvent('refresh', me.store);
+    },
+
+    initComponent: function() {
+       let me = this;
+
+
+       let filter_task = new Ext.util.DelayedTask(function(){
+           me.updateGrid();
+       });
+
+
+       Ext.apply(me, {
+           stateful: true,
+           stateId: 'gird-dc-backed-guests',
+           tbar: [
+               '->',
+               gettext('Search') + ':', ' ',
+               {
+                   xtype: 'textfield',
+                   width: 200,
+                   value: me.textfilter,
+                   enableKeyEvents: true,
+                   listeners: {
+                       keyup: function(field, e) {
+                           var v = field.getValue();
+                           me.textfilter = v.toLowerCase();
+                           filter_task.delay(500);
+                       }
+                   }
+               }
+           ],
+           viewConfig: {
+               stripeRows: true,
+               trackOver: false,
+            },
+       });
+       me.callParent();
+
+       me.reload();
+    }
+});
+
 Ext.define('PVE.dc.BackupView', {
     extend: 'Ext.grid.GridPanel',
 
@@ -754,6 +919,34 @@ Ext.define('PVE.dc.BackupView', {
            }).show();
        };
 
+       var run_summary = function() {
+           var me = this;
+           var backedinfo = Ext.create('PVE.dc.BackedGuests', {
+               title: gettext('Included in a backup'),
+               flex: 1,
+               layout: 'fit',
+           });
+
+           var win = Ext.create('Ext.window.Window', {
+               modal: true,
+               width: 600,
+               height: 500,
+               resizable: true,
+               layout: 'fit',
+               title: gettext('Summary'),
+
+               items:[{
+                   xtype: 'panel',
+                   region: 'center',
+                   layout: {
+                       type: 'vbox',
+                       align: 'stretch'
+                   },
+                   items: [backedinfo],
+               }]
+           }).show();
+       };
+
        var run_backup_now = function(job) {
            job = Ext.clone(job);
 
@@ -862,6 +1055,12 @@ Ext.define('PVE.dc.BackupView', {
            handler: run_detail,
        });
 
+       var summary_btn = new Proxmox.button.Button({
+           text: gettext('Summary'),
+           tooltip: gettext('Show which guests are part of any backup job'),
+           handler: run_summary,
+       });
+
        Proxmox.Utils.monStoreErrors(me, store);
 
        Ext.apply(me, {
@@ -888,6 +1087,7 @@ Ext.define('PVE.dc.BackupView', {
                '-',
                run_btn,
                '-',
+               summary_btn,
            ],
            columns: [
                {
-- 
2.20.1


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to