defaultFocus: undefined,
subject: gettext("Backup Job"),
+ width: 720,
bodyPadding: 0,
url: '/api2/extjs/cluster/backup',
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);
}
}
},
+ 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);
},
});
}
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';
+ },
},
},
},
],
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',
deleteEmpty: '{!isCreate}',
},
value: 'zstd',
+ listeners: {
+ change: 'compressionChange',
+ disable: 'compressionDisable',
+ enable: 'compressionEnable',
+ },
},
{
xtype: 'pveBackupModeSelector',
},
},
],
- 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);
},
},
],
},
+ {
+ xtype: 'pveBackupAdvancedOptionsPanel',
+ reference: 'backupAdvanced',
+ title: gettext('Advanced'),
+ cbind: {
+ isCreate: '{isCreate}',
+ },
+ },
],
},
],
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() {
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]);
}
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,
},
{