[pve-devel] [PATCH manager 1/2] ui: backup job edit: move notification related settings to separate tab

Lukas Wagner l.wagner at proxmox.com
Tue Jun 17 10:56:59 CEST 2025


Thanks a lot for testing and the review, Michael.

On  2025-06-13 15:51, Michael Köppl wrote:
> Tested both creating a scheduled backup job and creating a backup of a
> single guest. For both cases I tested:
> - using the global settings
> - using sendemail with specific email addresses
> Both worked as expected and I think UI-wise the tab makes more sense and
> unclutters the General tab a bit.
> 
> Additionally, I set the notification mode to 'Auto' before applying the
> patch and checked that the mapping is applied correctly in the new tab,
> i.e.:
> - if an email was entered in addition to auto mode, the Notifications
> tab correctly selected sendemail mode with the email address
> - if no email was entered, the Notifications tab correctly selected the
> global notification settings
> 
> Consider this:
> Tested-by: Michael Köppl <m.koeppl at proxmox.com>
> 
> The remaining comments are mostly suggestions, so with the Recipient
> typo addressed, also consider this:
> Reviewed-by: Michael Köppl <m.koeppl at proxmox.com>
> 
> On 6/11/25 14:59, Lukas Wagner wrote:
>> The notification settings in the 'General' tab were unfortunately a
>> source of regular confusion for many people. This was primarily due to
>> the behavior of the 'motification mode'. The notification mode can
> 
> nit: s/motification/notification

Fixed, thanks!

> 
>> one of the following:
>>   - notification-system: Emit a notification event to the global
>>     notification system, where it can be matched on by notification
>>     matchers and then sent to one or more targets.
>>   - legacy-sendmail: Old-style notifications, where one can directly
>>     enter some email address. The system uses 'sendmail' to
>>     send the notification to the specified address, circumventing
>>     the regular notification stack.
>>   - auto: Use legacy-sendmail if an email is entered and the
>>     notification system if not
>>
>> The behavior of 'auto' is quite surprising for many users, and therefore
>> we remove it from the UI altogether.
> 
> nit: I think this can be rephrased as "Remove the 'Auto' option from the
> notification mode selection, since the behavior is quite surprising for
> many users" to avoid using "we" and imperatively state the effect of the
> change first and some rationale for the change after.
> 

Rephrased in v2, thank you!

>>
>> In the new 'Notifications' tab one can now choose between
>>   ( ) Use global notification settings
>>   (x) Use sendmail to send an email
>>       Recipients: [              ]
>>       When:       [Always/On Error]
>>
>> 'Recipients' and 'When' are disabled if the first radio box is selected.
>>
>> The new tab can later also be used to house other controls. For example,
>> we could display all matchers that could potentially match this backup
>> job, or maybe even allow to create a new matcher with a pre-populated
>> match-field rule.>
>> We also stop using the term 'Notification System' altogether in the UI.
>> It is not necessarily clear to a user that this refers to the settings
>> in Datacenter > Notifications.
>>
>> Signed-off-by: Lukas Wagner <l.wagner at proxmox.com>
>> ---
>>  www/manager6/Makefile                         |   1 +
>>  www/manager6/dc/Backup.js                     |  65 ++---------
>>  .../panel/BackupNotificationOptions.js        | 103 ++++++++++++++++++
>>  3 files changed, 111 insertions(+), 58 deletions(-)
>>  create mode 100644 www/manager6/panel/BackupNotificationOptions.js
>>
>> diff --git a/www/manager6/Makefile b/www/manager6/Makefile
>> index fdf0e816..5eb17edb 100644
>> --- a/www/manager6/Makefile
>> +++ b/www/manager6/Makefile
>> @@ -100,6 +100,7 @@ JSSRC= 							\
>>  	grid/ResourceGrid.js				\
>>  	panel/ConfigPanel.js				\
>>  	panel/BackupAdvancedOptions.js			\
>> +	panel/BackupNotificationOptions.js		\
>>  	panel/BackupJobPrune.js				\
>>  	panel/HealthWidget.js				\
>>  	panel/IPSet.js					\
>> diff --git a/www/manager6/dc/Backup.js b/www/manager6/dc/Backup.js
>> index 381402ca..f861ed3d 100644
>> --- a/www/manager6/dc/Backup.js
>> +++ b/www/manager6/dc/Backup.js
>> @@ -224,24 +224,12 @@ 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',
>> -	    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';
>> -	    },
>>  	},
>>      },
>>  
>> @@ -331,52 +319,6 @@ 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('Send email'),
>> -				    name: 'mailnotification',
>> -				    cbind: {
>> -					value: (get) => get('isCreate') ? 'always' : '',
>> -					deleteEmpty: '{!isCreate}',
>> -				    },
>> -				    bind: {
>> -					hidden: '{!showMailtoFields}',
>> -					disabled: '{!enableMailnotificationField}',
>> -					value: '{mailNotification}',
>> -				    },
>> -				},
>>  				{
>>  				    xtype: 'pveBackupCompressionSelector',
>>  				    reference: 'compressionSelector',
>> @@ -439,6 +381,13 @@ Ext.define('PVE.dc.BackupEdit', {
>>  			},
>>  		    ],
>>  		},
>> +		{
>> +		    xtype: 'pveBackupNotificationOptionsPanel',
>> +		    title: gettext('Notifications'),
>> +		    cbind: {
>> +			isCreate: '{isCreate}',
>> +		    },
>> +		},
>>  		{
>>  		    xtype: 'pveBackupJobPrunePanel',
>>  		    title: gettext('Retention'),
>> diff --git a/www/manager6/panel/BackupNotificationOptions.js b/www/manager6/panel/BackupNotificationOptions.js
>> new file mode 100644
>> index 00000000..f0b2bf33
>> --- /dev/null
>> +++ b/www/manager6/panel/BackupNotificationOptions.js
>> @@ -0,0 +1,103 @@
>> +/*
>> + * Input panel for notification options of backup jobs.
>> + */
>> +Ext.define('PVE.panel.BackupNotificationOptions', {
>> +    extend: 'Proxmox.panel.InputPanel',
>> +    xtype: 'pveBackupNotificationOptionsPanel',
>> +    mixins: ['Proxmox.Mixin.CBind'],
>> +
>> +    onlineHelp: 'chapter_notifications',
>> +
>> +    cbindData: function() {
>> +	let me = this;
>> +	me.isCreate = !!me.isCreate;
>> +	return {};
>> +    },
>> +
>> +    viewModel: {
>> +	data: {
>> +	    notificationMode: undefined,
>> +	},
>> +	formulas: {
>> +	    showMailtoFields: (get) => {
>> +		let mode = get('notificationMode');
>> +		return mode['notification-mode'] === 'legacy-sendmail';
>> +	    },
>> +	},
>> +    },
>> +
>> +    onSetValues: function(values) {
>> +	let me = this;
>> +
>> +	let mode = values['notification-mode'] ?? 'auto';
>> +	let mailto = values.mailto;
>> +
>> +	let mappedMode = 'legacy-sendmail';
>> +
>> +	// The 'auto' mode is a bit annoying and confusing, so we try
>> +	// to map it to the equivalent behavior.
>> +	if ((mode === 'auto' && !mailto) || mode === 'notification-system') {
>> +	    mappedMode = 'notification-system';
>> +	}
>> +
>> +	me.getViewModel().set('notificationMode', { 'notification-mode': mappedMode });
>> +
>> +	values['notification-mode'] = mappedMode;
>> +	return values;
>> +    },
>> +
>> +    items: [
>> +	{
>> +	    xtype: 'radiogroup',
>> +	    height: '15px',
>> +	    layout: {
>> +		type: 'vbox',
>> +	    },
>> +	    bind: {
>> +		value: '{notificationMode}',
>> +	    },
>> +	    items: [
>> +		{
>> +		    xtype: 'radiofield',
>> +		    name: 'notification-mode',
>> +		    inputValue: 'notification-system',
>> +		    boxLabel: 'Use global notification settings',
>> +		    cbind: {
>> +			checked: '{isCreate}',
>> +		    },
>> +		},
>> +		{
>> +		    xtype: 'radiofield',
>> +		    name: 'notification-mode',
>> +		    inputValue: 'legacy-sendmail',
>> +		    boxLabel: 'Use sendmail to send an email',
>> +		},
>> +	    ],
>> +	},
>> +	{
>> +	    xtype: 'textfield',
>> +	    fieldLabel: gettext('Recipents'),
> 
> s/Recipents/Recipients

Fixed, thank you!

> 
>> +	    emptyText: 'test at example.com, ...',
>> +	    name: 'mailto',
>> +	    padding: '0 0 0 50',
>> +	    disabled: true,
>> +	    bind: {
>> +		disabled: '{!showMailtoFields}',
>> +	    },
> 
> In my tests I was able to create a backup job with "Use sendmail to send
> an email" but with this field left empty. I'm aware that this is the
> current behavior as well, but UX-wise I think it would make sense to
> make this field mandatory if sendmail is used. Or is this to allow users
> to not send anything at all for that specific backup job? If so, maybe a
> radio button "Off" would make this more clear UX-wise?
> 

I can definitely see your point, thanks for the suggestion.

In my original plans for the overhaul I planned to include a "Do not send a notification"
radio toggle as well, doing exactly what you described. However, during development
I realized that this becomes very very awkward with any node-local fallback values for
mailto in /etc/vzdump.conf. Without introducing a new notifcation-mode 'none' (or similar),
'no notifications' boils down to: 
  notification-mode: legacy-sendmail
  (no mailto setting)

Now, when 'mailto' is set via /etc/vzdump.conf, this would still mean that an email would be
sent, even though "Don't send" is selected in the UI. This is due to the value
from /etc/vzdump.conf being used as a fallback for any value that is not
explicitly set for a backup job.

Hope this makes it somewhat clear :)

-- 
- Lukas





More information about the pve-devel mailing list