]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/window/Backup.js
ui: vzdump: remove left-overs from target/policy based notifications
[pve-manager.git] / www / manager6 / window / Backup.js
index 8d9824f3041a0cb48417396acbaeb85fed8f9cdf..8d8c9ff019d72f37220fa30d4d61383cd371ada8 100644 (file)
@@ -18,7 +18,7 @@ Ext.define('PVE.window.Backup', {
            throw "no VM type specified";
        }
 
-       let compressionSelector = Ext.create('PVE.form.CompressionSelector', {
+       let compressionSelector = Ext.create('PVE.form.BackupCompressionSelector', {
            name: 'compress',
            value: 'zstd',
            fieldLabel: gettext('Compression'),
@@ -36,6 +36,39 @@ Ext.define('PVE.window.Backup', {
            emptyText: Proxmox.Utils.noneText,
        });
 
+       const keepNames = [
+           ['keep-last', gettext('Keep Last')],
+           ['keep-hourly', gettext('Keep Hourly')],
+           ['keep-daily', gettext('Keep Daily')],
+           ['keep-weekly', gettext('Keep Weekly')],
+           ['keep-monthly', gettext('Keep Monthly')],
+           ['keep-yearly', gettext('Keep Yearly')],
+       ];
+
+       let pruneSettings = keepNames.map(
+           name => Ext.create('Ext.form.field.Display', {
+               name: name[0],
+               fieldLabel: name[1],
+               hidden: true,
+           }),
+       );
+
+       let removeCheckbox = Ext.create('Proxmox.form.Checkbox', {
+           name: 'remove',
+           checked: false,
+           hidden: true,
+           uncheckedValue: 0,
+           fieldLabel: gettext('Prune'),
+           autoEl: {
+               tag: 'div',
+               'data-qtip': gettext('Prune older backups afterwards'),
+           },
+           handler: function(checkbox, value) {
+               pruneSettings.forEach(field => field.setHidden(!value));
+               me.down('label[name="pruneLabel"]').setHidden(!value);
+           },
+       });
+
        let initialDefaults = false;
 
        var storagesel = Ext.create('PVE.form.StorageSelector', {
@@ -80,11 +113,45 @@ Ext.define('PVE.window.Backup', {
                            if (!initialDefaults && data.mode !== undefined) {
                                modeSelector.setValue(data.mode);
                            }
+                           if (!initialDefaults && (data['notes-template'] ?? false)) {
+                               me.down('field[name=notes-template]').setValue(
+                                   PVE.Utils.unEscapeNotesTemplate(data['notes-template']),
+                               );
+                           }
 
                            initialDefaults = true;
+
+                           // always update storage dependent properties
+                           if (data['prune-backups'] !== undefined) {
+                               const keepParams = PVE.Parser.parsePropertyString(
+                                   data["prune-backups"],
+                               );
+                               if (!keepParams['keep-all']) {
+                                   removeCheckbox.setHidden(false);
+                                   pruneSettings.forEach(function(field) {
+                                       const keep = keepParams[field.name];
+                                       if (keep) {
+                                           field.setValue(keep);
+                                       } else {
+                                           field.reset();
+                                       }
+                                   });
+                                   return;
+                               }
+                           }
+
+                           // no defaults or keep-all=1
+                           removeCheckbox.setHidden(true);
+                           removeCheckbox.setValue(false);
+                           pruneSettings.forEach(field => field.reset());
                        },
                        failure: function(response, opts) {
                            initialDefaults = true;
+
+                           removeCheckbox.setHidden(true);
+                           removeCheckbox.setValue(false);
+                           pruneSettings.forEach(field => field.reset());
+
                            Ext.Msg.alert(gettext('Error'), response.htmlStatus);
                        },
                    });
@@ -92,33 +159,97 @@ Ext.define('PVE.window.Backup', {
            },
        });
 
-       me.formPanel = Ext.create('Ext.form.Panel', {
+       let protectedCheckbox = Ext.create('Proxmox.form.Checkbox', {
+           name: 'protected',
+           checked: false,
+           uncheckedValue: 0,
+           fieldLabel: gettext('Protected'),
+       });
+
+       me.formPanel = Ext.create('Proxmox.panel.InputPanel', {
            bodyPadding: 10,
            border: false,
-           fieldDefaults: {
-               labelWidth: 100,
-               anchor: '100%',
-           },
-           items: [
+           column1: [
                storagesel,
                modeSelector,
+               protectedCheckbox,
+           ],
+           column2: [
                compressionSelector,
                mailtoField,
+               removeCheckbox,
+           ],
+           columnB: [
+               {
+                   xtype: 'textareafield',
+                   name: 'notes-template',
+                   fieldLabel: gettext('Notes'),
+                   anchor: '100%',
+                   value: '{{guestname}}',
+               },
+               {
+                   xtype: 'box',
+                   style: {
+                       margin: '8px 0px',
+                       'line-height': '1.5em',
+                   },
+                   html: Ext.String.format(
+                       gettext('Possible template variables are: {0}'),
+                       PVE.Utils.notesTemplateVars.map(v => `<code>{{${v}}}</code>`).join(', '),
+                   ),
+               },
+               {
+                   xtype: 'label',
+                   name: 'pruneLabel',
+                   text: gettext('Storage Retention Configuration') + ':',
+                   hidden: true,
+               },
+               {
+                   layout: 'hbox',
+                   border: false,
+                   defaults: {
+                       border: false,
+                       layout: 'anchor',
+                       flex: 1,
+                   },
+                   items: [
+                       {
+                           padding: '0 10 0 0',
+                           defaults: {
+                               labelWidth: 110,
+                           },
+                           items: [
+                               pruneSettings[0],
+                               pruneSettings[2],
+                               pruneSettings[4],
+                           ],
+                       },
+                       {
+                           padding: '0 0 0 10',
+                           defaults: {
+                               labelWidth: 110,
+                           },
+                           items: [
+                               pruneSettings[1],
+                               pruneSettings[3],
+                               pruneSettings[5],
+                           ],
+                       },
+                   ],
+               },
            ],
        });
 
-       var form = me.formPanel.getForm();
-
        var submitBtn = Ext.create('Ext.Button', {
            text: gettext('Backup'),
            handler: function() {
                var storage = storagesel.getValue();
-               var values = form.getValues();
+               let values = me.formPanel.getValues();
                var params = {
                    storage: storage,
                    vmid: me.vmid,
                    mode: values.mode,
-                   remove: 0,
+                   remove: values.remove,
                };
 
                if (values.mailto) {
@@ -129,6 +260,15 @@ Ext.define('PVE.window.Backup', {
                    params.compress = values.compress;
                }
 
+               if (values.protected) {
+                   params.protected = values.protected;
+               }
+
+               if (values['notes-template']) {
+                   params['notes-template'] = PVE.Utils.escapeNotesTemplate(
+                       values['notes-template']);
+               }
+
                Proxmox.Utils.API2Request({
                    url: '/nodes/' + me.nodename + '/vzdump',
                    params: params,
@@ -169,10 +309,10 @@ Ext.define('PVE.window.Backup', {
 
        Ext.apply(me, {
            title: title,
-           width: 350,
            modal: true,
            layout: 'auto',
            border: false,
+           width: 600,
            items: [me.formPanel],
            buttons: [helpBtn, '->', submitBtn],
            listeners: {