X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=www%2Fmanager6%2Fdc%2FBackup.js;h=4ba80b315172ea825037d7bae760a890dc01220e;hb=HEAD;hp=03a026513a3ef9de94c25e2241f994a9f41dcb45;hpb=25f7446c90fc69db0f8931dc46928faef519f799;p=pve-manager.git diff --git a/www/manager6/dc/Backup.js b/www/manager6/dc/Backup.js index 03a02651..4ba80b31 100644 --- a/www/manager6/dc/Backup.js +++ b/www/manager6/dc/Backup.js @@ -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 => ``, + renderer: Proxmox.Utils.renderEnabledIcon, sortable: true, }, {