[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