]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/dc/Backup.js
update shipped appliance info index
[pve-manager.git] / www / manager6 / dc / Backup.js
index 03a026513a3ef9de94c25e2241f994a9f41dcb45..4ba80b315172ea825037d7bae760a890dc01220e 100644 (file)
@@ -7,6 +7,7 @@ Ext.define('PVE.dc.BackupEdit', {
     defaultFocus: undefined,
 
     subject: gettext("Backup Job"),
+    width: 720,
     bodyPadding: 0,
 
     url: '/api2/extjs/cluster/backup',
@@ -36,6 +37,14 @@ Ext.define('PVE.dc.BackupEdit', {
                delete values.node;
            }
 
+           // Get rid of new-old parameters for notification settings.
+           // These should only be set for those selected few who ran
+           // pve-manager from pvetest.
+           if (!isCreate) {
+               Proxmox.Utils.assemble_field_data(values, { 'delete': 'notification-policy' });
+               Proxmox.Utils.assemble_field_data(values, { 'delete': 'notification-target' });
+           }
+
            if (!values.id && isCreate) {
                values.id = 'backup-' + Ext.data.identifier.Uuid.Global.generate().slice(0, 13);
            }
@@ -137,48 +146,79 @@ Ext.define('PVE.dc.BackupEdit', {
            }
        },
 
+       compressionChange: function(f, value, oldValue) {
+           this.getView().lookup('backupAdvanced').updateCompression(value, f.isDisabled());
+       },
+
+       compressionDisable: function(f) {
+           this.getView().lookup('backupAdvanced').updateCompression(f.getValue(), true);
+       },
+
+       compressionEnable: function(f) {
+           this.getView().lookup('backupAdvanced').updateCompression(f.getValue(), false);
+       },
+
+       prepareValues: function(data) {
+           let me = this;
+           let viewModel = me.getViewModel();
+
+           // Migrate 'new'-old notification-policy back to old-old mailnotification.
+           // Only should affect users who used pve-manager from pvetest. This was a remnant of
+           // notifications before the  overhaul.
+           let policy = data['notification-policy'];
+           if (policy === 'always' || policy === 'failure') {
+               data.mailnotification = policy;
+           }
+
+           if (data.exclude) {
+               data.vmid = data.exclude;
+               data.selMode = 'exclude';
+           } else if (data.all) {
+               data.vmid = '';
+               data.selMode = 'all';
+           } else if (data.pool) {
+               data.selMode = 'pool';
+               data.selPool = data.pool;
+           } else {
+               data.selMode = 'include';
+           }
+           viewModel.set('selMode', data.selMode);
+
+           if (data['prune-backups']) {
+               Object.assign(data, data['prune-backups']);
+               delete data['prune-backups'];
+           } else if (data.maxfiles !== undefined) {
+               if (data.maxfiles > 0) {
+                   data['keep-last'] = data.maxfiles;
+               } else {
+                   data['keep-all'] = 1;
+               }
+               delete data.maxfiles;
+           }
+
+           if (data['notes-template']) {
+               data['notes-template'] =
+                   PVE.Utils.unEscapeNotesTemplate(data['notes-template']);
+           }
+
+           if (data.performance) {
+               Object.assign(data, data.performance);
+               delete data.performance;
+           }
+
+           return data;
+       },
+
        init: function(view) {
            let me = this;
+
            if (view.isCreate) {
                me.lookup('modeSelector').setValue('include');
            } else {
                view.load({
                    success: function(response, _options) {
-                       let data = response.result.data;
-
-                       if (data.exclude) {
-                           data.vmid = data.exclude;
-                           data.selMode = 'exclude';
-                       } else if (data.all) {
-                           data.vmid = '';
-                           data.selMode = 'all';
-                       } else if (data.pool) {
-                           data.selMode = 'pool';
-                           data.selPool = data.pool;
-                       } else {
-                           data.selMode = 'include';
-                       }
-
-                       me.getViewModel().set('selMode', data.selMode);
-
-                       if (data['prune-backups']) {
-                           Object.assign(data, data['prune-backups']);
-                           delete data['prune-backups'];
-                       } else if (data.maxfiles !== undefined) {
-                           if (data.maxfiles > 0) {
-                               data['keep-last'] = data.maxfiles;
-                           } else {
-                               data['keep-all'] = 1;
-                           }
-                           delete data.maxfiles;
-                       }
-
-                       if (data['notes-template']) {
-                           data['notes-template'] =
-                               PVE.Utils.unEscapeNotesTemplate(data['notes-template']);
-                       }
-
-                       view.setValues(data);
+                       let values = me.prepareValues(response.result.data);
+                       view.setValues(values);
                    },
                });
            }
@@ -188,11 +228,24 @@ Ext.define('PVE.dc.BackupEdit', {
     viewModel: {
        data: {
            selMode: 'include',
+           notificationMode: '__default__',
+           mailto: '',
+           mailNotification: 'always',
        },
 
        formulas: {
            poolMode: (get) => get('selMode') === 'pool',
-           disableVMSelection: (get) => get('selMode') !== 'include' && get('selMode') !== 'exclude',
+           disableVMSelection: (get) => get('selMode') !== 'include' &&
+               get('selMode') !== 'exclude',
+           showMailtoFields: (get) =>
+               ['auto', 'legacy-sendmail', '__default__'].includes(get('notificationMode')),
+           enableMailnotificationField: (get) => {
+               let mode = get('notificationMode');
+               let mailto = get('mailto');
+
+               return (['auto', '__default__'].includes(mode) && mailto) ||
+                   mode === 'legacy-sendmail';
+           },
        },
     },
 
@@ -282,22 +335,54 @@ Ext.define('PVE.dc.BackupEdit', {
                                },
                            ],
                            column2: [
+                               {
+                                   xtype: 'proxmoxKVComboBox',
+                                   comboItems: [
+                                       [
+                                           '__default__',
+                                           Ext.String.format(
+                                               gettext('{0} (Auto)'), Proxmox.Utils.defaultText,
+                                           ),
+                                       ],
+                                       ['auto', gettext('Auto')],
+                                       ['legacy-sendmail', gettext('Email (legacy)')],
+                                       ['notification-system', gettext('Notification system')],
+                                   ],
+                                   fieldLabel: gettext('Notification mode'),
+                                   name: 'notification-mode',
+                                   value: '__default__',
+                                   cbind: {
+                                       deleteEmpty: '{!isCreate}',
+                                   },
+                                   bind: {
+                                       value: '{notificationMode}',
+                                   },
+                               },
                                {
                                    xtype: 'textfield',
                                    fieldLabel: gettext('Send email to'),
                                    name: 'mailto',
+                                   bind: {
+                                       hidden: '{!showMailtoFields}',
+                                       value: '{mailto}',
+                                   },
                                },
                                {
                                    xtype: 'pveEmailNotificationSelector',
-                                   fieldLabel: gettext('Email'),
+                                   fieldLabel: gettext('Send email'),
                                    name: 'mailnotification',
                                    cbind: {
                                        value: (get) => get('isCreate') ? 'always' : '',
                                        deleteEmpty: '{!isCreate}',
                                    },
+                                   bind: {
+                                       hidden: '{!showMailtoFields}',
+                                       disabled: '{!enableMailnotificationField}',
+                                       value: '{mailNotification}',
+                                   },
                                },
                                {
-                                   xtype: 'pveCompressionSelector',
+                                   xtype: 'pveBackupCompressionSelector',
                                    reference: 'compressionSelector',
                                    fieldLabel: gettext('Compression'),
                                    name: 'compress',
@@ -305,6 +390,11 @@ Ext.define('PVE.dc.BackupEdit', {
                                        deleteEmpty: '{!isCreate}',
                                    },
                                    value: 'zstd',
+                                   listeners: {
+                                       change: 'compressionChange',
+                                       disable: 'compressionDisable',
+                                       enable: 'compressionEnable',
+                                   },
                                },
                                {
                                    xtype: 'pveBackupModeSelector',
@@ -347,18 +437,6 @@ Ext.define('PVE.dc.BackupEdit', {
                                    },
                                },
                            ],
-                           advancedColumn1: [
-                               {
-                                   xtype: 'proxmoxcheckbox',
-                                   fieldLabel: gettext('Repeat missed'),
-                                   name: 'repeat-missed',
-                                   uncheckedValue: 0,
-                                   defaultValue: 0,
-                                   cbind: {
-                                       deleteDefaultValue: '{!isCreate}',
-                                   },
-                               },
-                           ],
                            onGetValues: function(values) {
                                return this.up('window').getController().onGetValues(values);
                            },
@@ -417,6 +495,14 @@ Ext.define('PVE.dc.BackupEdit', {
                        },
                    ],
                },
+               {
+                   xtype: 'pveBackupAdvancedOptionsPanel',
+                   reference: 'backupAdvanced',
+                   title: gettext('Advanced'),
+                   cbind: {
+                       isCreate: '{isCreate}',
+                   },
+               },
            ],
        },
     ],
@@ -466,11 +552,13 @@ Ext.define('PVE.dc.BackupView', {
                return;
            }
 
-           let win = Ext.create('PVE.dc.BackupEdit', {
+           Ext.create('PVE.dc.BackupEdit', {
+               autoShow: true,
                jobid: rec.data.id,
+               listeners: {
+                   destroy: () => reload(),
+               },
            });
-           win.on('destroy', reload);
-           win.show();
        };
 
        let run_detail = function() {
@@ -529,7 +617,7 @@ Ext.define('PVE.dc.BackupView', {
            delete job['repeat-missed'];
            job.all = job.all === true ? 1 : 0;
 
-           ['performance', 'prune-backups'].forEach(key => {
+           ['performance', 'prune-backups', 'fleecing'].forEach(key => {
                if (job[key]) {
                    job[key] = PVE.Parser.printPropertyString(job[key]);
                }
@@ -722,8 +810,7 @@ Ext.define('PVE.dc.BackupView', {
                    width: 80,
                    dataIndex: 'enabled',
                    align: 'center',
-                   // TODO: switch to Proxmox.Utils.renderEnabledIcon once available
-                   renderer: enabled => `<i class="fa fa-${enabled ? 'check' : 'minus'}"></i>`,
+                   renderer: Proxmox.Utils.renderEnabledIcon,
                    sortable: true,
                },
                {