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.koe...@proxmox.com>
> 
> The remaining comments are mostly suggestions, so with the Recipient
> typo addressed, also consider this:
> Reviewed-by: Michael Köppl <m.koe...@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.wag...@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: 't...@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



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to