]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/dc/Backup.js
ui: fix usage of findRecord
[pve-manager.git] / www / manager6 / dc / Backup.js
index 1e0705104aa32efb40a2c52ac7e934c3920c22dc..059d01c7480da9f793951ef4e843d7b09d8ce11d 100644 (file)
@@ -61,7 +61,21 @@ Ext.define('PVE.dc.BackupEdit', {
            nodename: 'localhost',
            storageContent: 'backup',
            allowBlank: false,
-           name: 'storage'
+           name: 'storage',
+           listeners: {
+               change: function(f, v) {
+                   let store = f.getStore();
+                   let rec = store.findRecord('storage', v, 0, false, true, true);
+                   let compressionSelector = me.down('pveCompressionSelector');
+
+                   if (rec && rec.data && rec.data.type === 'pbs') {
+                       compressionSelector.setValue('zstd');
+                       compressionSelector.setDisabled(true);
+                   } else if (!compressionSelector.getEditable()) {
+                       compressionSelector.setDisabled(false);
+                   }
+               }
+           }
        });
 
        var store = new Ext.data.Store({
@@ -264,7 +278,7 @@ Ext.define('PVE.dc.BackupEdit', {
                sm.deselectAll(true);
                if (list) {
                    Ext.Array.each(list.split(','), function(vmid) {
-                       var rec = store.findRecord('vmid', vmid);
+                       var rec = store.findRecord('vmid', vmid, 0, false, true, true);
                        if (rec) {
                            sm.select(rec, true);
                        }
@@ -489,12 +503,14 @@ Ext.define('PVE.dc.BackupDiskTree', {
                    }
                }
            ],
-           tbar: [
-               '->',
-               gettext('Search') + ':', ' ',
-               {
+           header: {
+               items: [{
                    xtype: 'textfield',
+                   fieldLabel: gettext('Search'),
+                   labelWidth: 50,
+                   emptyText: 'Name, VMID, Type',
                    width: 200,
+                   padding: '0 5 0 0',
                    enableKeyEvents: true,
                    listeners: {
                        buffer: 500,
@@ -516,7 +532,7 @@ Ext.define('PVE.dc.BackupDiskTree', {
                                }
 
                                Ext.each(['name', 'id', 'type'], function(property) {
-                                   if (data[property] == null) {
+                                   if (data[property] === null) {
                                        return;
                                    }
 
@@ -534,7 +550,7 @@ Ext.define('PVE.dc.BackupDiskTree', {
                        }
                    }
                }
-           ],
+           ]},
        });
 
        me.callParent();
@@ -547,7 +563,7 @@ Ext.define('PVE.dc.BackupInfo', {
     extend: 'Proxmox.panel.InputPanel',
     alias: 'widget.pveBackupInfo',
 
-    padding: 10,
+    padding: '5 0 5 10',
 
     column1: [
        {
@@ -696,6 +712,90 @@ Ext.define('PVE.dc.BackupInfo', {
     }
 });
 
+
+Ext.define('PVE.dc.BackedGuests', {
+    extend: 'Ext.grid.GridPanel',
+    alias: 'widget.pveBackedGuests',
+
+    textfilter: '',
+
+    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,
+       },
+    ],
+
+    initComponent: function() {
+       let me = this;
+
+       me.store.clearFilter(true);
+
+       Ext.apply(me, {
+           stateful: true,
+           stateId: 'grid-dc-backed-guests',
+           tbar: [
+               '->',
+               gettext('Search') + ':', ' ',
+               {
+                   xtype: 'textfield',
+                   width: 200,
+                   emptyText: 'Name, VMID, Type',
+                   enableKeyEvents: true,
+                   listeners: {
+                       buffer: 500,
+                       keyup: function(field) {
+                           let searchValue = field.getValue();
+                           searchValue = searchValue.toLowerCase();
+
+                           me.store.clearFilter(true);
+                           me.store.filterBy(function(record) {
+                               let match = false;
+
+                               Ext.each(['name', 'vmid', 'type'], function(property) {
+                                   if (record.data[property] == null) {
+                                       return;
+                                   }
+
+                                   let v = record.data[property].toString();
+                                   if (v !== undefined) {
+                                       v = v.toLowerCase();
+                                       if (v.includes(searchValue)) {
+                                           match = true;
+                                           return;
+                                       }
+                                   }
+                               });
+                               return match;
+                           });
+                       }
+                   }
+               }
+           ],
+           viewConfig: {
+               stripeRows: true,
+               trackOver: false,
+            },
+       });
+       me.callParent();
+    },
+});
+
 Ext.define('PVE.dc.BackupView', {
     extend: 'Ext.grid.GridPanel',
 
@@ -716,8 +816,27 @@ Ext.define('PVE.dc.BackupView', {
            }
        });
 
+       var not_backed_store = new Ext.data.Store({
+           sorters: 'vmid',
+           proxy:{
+               type: 'proxmox',
+               url: 'api2/json/cluster/backupinfo/not_backed_up',
+           },
+       });
+
        var reload = function() {
            store.load();
+           not_backed_store.load({
+               callback: function(records, operation, success) {
+                   if (records.length) {
+                       not_backed_warning.setVisible(true);
+                       not_backed_btn.setVisible(true);
+                   } else {
+                       not_backed_warning.setVisible(false);
+                       not_backed_btn.setVisible(false);
+                   }
+               },
+           });
        };
 
        var sm = Ext.create('Ext.selection.RowModel', {});
@@ -736,26 +855,26 @@ Ext.define('PVE.dc.BackupView', {
        };
 
        var run_detail = function() {
+           let me = this;
            let record = sm.getSelection()[0]
            if (!record) {
                return;
            }
-           var me = this;
-           var infoview = Ext.create('PVE.dc.BackupInfo', {
+           let infoview = Ext.create('PVE.dc.BackupInfo', {
                flex: 0,
                layout: 'fit',
                record: record.data,
            });
-           var disktree = Ext.create('PVE.dc.BackupDiskTree', {
+           let disktree = Ext.create('PVE.dc.BackupDiskTree', {
                title: gettext('Included disks'),
                flex: 1,
                jobid: record.data.id,
            });
 
-           var win = Ext.create('Ext.window.Window', {
+           Ext.create('Ext.window.Window', {
                modal: true,
-               width: 600,
-               height: 500,
+               width: 800,
+               height: 600,
                stateful: true,
                stateId: 'backup-detail-view',
                resizable: true,
@@ -834,6 +953,34 @@ Ext.define('PVE.dc.BackupView', {
            }));
        };
 
+       var run_show_not_backed = function() {
+           var me = this;
+           var backedinfo = Ext.create('PVE.dc.BackedGuests', {
+               flex: 1,
+               layout: 'fit',
+               store: not_backed_store,
+           });
+
+           var win = Ext.create('Ext.window.Window', {
+               modal: true,
+               width: 600,
+               height: 500,
+               resizable: true,
+               layout: 'fit',
+               title: gettext('Guests without backup job'),
+
+               items:[{
+                   xtype: 'panel',
+                   region: 'center',
+                   layout: {
+                       type: 'vbox',
+                       align: 'stretch'
+                   },
+                   items: [backedinfo],
+               }]
+           }).show();
+       };
+
        var edit_btn = new Proxmox.button.Button({
            text: gettext('Edit'),
            disabled: true,
@@ -875,13 +1022,24 @@ Ext.define('PVE.dc.BackupView', {
        });
 
        var detail_btn = new Proxmox.button.Button({
-           text: gettext('Detail'),
+           text: gettext('Job Detail'),
            disabled: true,
            tooltip: gettext('Show job details and which guests and volumes are affected by the backup job'),
            selModel: sm,
            handler: run_detail,
        });
 
+       var not_backed_warning = Ext.create('Ext.toolbar.TextItem', {
+           html: '<i class="fa fa-fw fa-exclamation-circle"></i>' + gettext('Some guests are not covered by any backup job.'),
+           hidden: true,
+       });
+
+       var not_backed_btn = new Proxmox.button.Button({
+           text: gettext('Show'),
+           hidden: true,
+           handler: run_show_not_backed,
+       });
+
        Proxmox.Utils.monStoreErrors(me, store);
 
        Ext.apply(me, {
@@ -907,7 +1065,9 @@ Ext.define('PVE.dc.BackupView', {
                detail_btn,
                '-',
                run_btn,
-               '-',
+               '->',
+               not_backed_warning,
+               not_backed_btn,
            ],
            columns: [
                {