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

Lukas Wagner l.wagner at proxmox.com
Tue Jun 24 14:01:42 CEST 2025


Superseded-by: https://lore.proxmox.com/all/20250624120032.153539-1-l.wagner@proxmox.com/T/#t

On  2025-06-17 10:44, 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 'notification mode'. The notification mode can
> 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 'auto' mode was originally intended to ease migration between the
> old and the new system. From a user's perspective however, 'auto' is
> quite surprising and unintuitive. The UI preselected 'auto' as a
> default, which would, as explained above, favor the new notification
> stack with the 'mailto' field empty. However, the UI would still invite
> the user to enter their email address, which would then entail the
> 'legacy-sendmail' mode. Some users were led to believe that this email
> address would then be used for a configured email target of the new
> notification stack. As a consequence, 'auto' is now completely hidden in
> the UI.
> 
> 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.
> 
> The term 'Notification System' is altogether from 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>
> Tested-by: Michael Köppl <m.koeppl at proxmox.com>
> Reviewed-by: Michael Köppl <m.koeppl at proxmox.com>
> ---
> 
> Notes:
>     Changelog:
>     
>     v2:
>       - Use gettext for the radiogroup box labels
>       - Include '(legacy)' in the legacy-sendmail options
>         (While we are not going to remove the option in the near future,
>          I still want to gently nudge users to use the new stack)
>       - Clarified in rephrased parts of the commit message
> 
>  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..f745a074
> --- /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: gettext('Use global notification settings'),
> +		    cbind: {
> +			checked: '{isCreate}',
> +		    },
> +		},
> +		{
> +		    xtype: 'radiofield',
> +		    name: 'notification-mode',
> +		    inputValue: 'legacy-sendmail',
> +		    boxLabel: gettext('Use sendmail to send an email (legacy)'),
> +		},
> +	    ],
> +	},
> +	{
> +	    xtype: 'textfield',
> +	    fieldLabel: gettext('Recipients'),
> +	    emptyText: 'test at example.com, ...',
> +	    name: 'mailto',
> +	    padding: '0 0 0 50',
> +	    disabled: true,
> +	    bind: {
> +		disabled: '{!showMailtoFields}',
> +	    },
> +	},
> +	{
> +	    xtype: 'pveEmailNotificationSelector',
> +	    fieldLabel: gettext('When'),
> +	    name: 'mailnotification',
> +	    padding: '0 0 0 50',
> +	    disabled: true,
> +	    value: 'always',
> +	    cbind: {
> +		deleteEmpty: '{!isCreate}',
> +	    },
> +	    bind: {
> +		disabled: '{!showMailtoFields}',
> +	    },
> +	},
> +    ],
> +});

-- 
- Lukas





More information about the pve-devel mailing list