]> git.proxmox.com Git - pve-manager.git/commitdiff
ui: backup: allow to select notification target for jobs
authorLukas Wagner <l.wagner@proxmox.com>
Thu, 3 Aug 2023 12:17:04 +0000 (14:17 +0200)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Wed, 16 Aug 2023 09:11:12 +0000 (11:11 +0200)
This commit adds a possibility to choose between different options
for notifications for backup jobs:
    - Notify via email, in the same manner as before
    - Notify via an endpoint/group

If 'notify via mail' is selected, a text field where an email address
can be entered is displayed:

    Notify:         | Always notify  v |
    Notify via:     | E-Mail         v |
    Send Mail to:   | foo@example.com  |
    Compression:    | .....          v |

If the other option is selected selected, a combo picker for selecting
a channel is displayed:

    Notify:         | Always notify  v |
    Notify via:     | Endpoint/Group v |
    Target:         | endpoint-foo   v |
    Compression:    | .....          v |

The code has also been adapted to use the newly introduced
'notification-policy' parameter, which replaces the 'mailnotification'
paramter for backup jobs. Some logic which automatically migrates from
'mailnotification' has been added.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
www/manager6/Makefile
www/manager6/dc/Backup.js
www/manager6/form/EmailNotificationSelector.js [deleted file]
www/manager6/form/NotificationModeSelector.js [new file with mode: 0644]
www/manager6/form/NotificationPolicySelector.js [new file with mode: 0644]
www/manager6/form/NotificationTargetSelector.js [new file with mode: 0644]

index 7ec9d7a5627e293e42b3634e8e905a5199629c21..5ea4e4a26d34de1417e44a67edd9190397d085a9 100644 (file)
@@ -36,7 +36,6 @@ JSSRC=                                                        \
        form/DayOfWeekSelector.js                       \
        form/DiskFormatSelector.js                      \
        form/DiskStorageSelector.js                     \
-       form/EmailNotificationSelector.js               \
        form/FileSelector.js                            \
        form/FirewallPolicySelector.js                  \
        form/GlobalSearchField.js                       \
@@ -51,6 +50,9 @@ JSSRC=                                                        \
        form/MultiPCISelector.js                        \
        form/NetworkCardSelector.js                     \
        form/NodeSelector.js                            \
+       form/NotificationModeSelector.js                \
+       form/NotificationTargetSelector.js              \
+       form/NotificationPolicySelector.js              \
        form/PCISelector.js                             \
        form/PCIMapSelector.js                          \
        form/PermPathSelector.js                        \
index 03a026513a3ef9de94c25e2241f994a9f41dcb45..625b5430005b9d52c8f595233057a99ef72c8979 100644 (file)
@@ -36,6 +36,30 @@ Ext.define('PVE.dc.BackupEdit', {
                delete values.node;
            }
 
+           if (!isCreate) {
+               // 'mailnotification' is deprecated in favor of 'notification-policy'
+               // -> Migration to the new parameter happens in init, so we are
+               //    safe to remove the old parameter here.
+               Proxmox.Utils.assemble_field_data(values, { 'delete': 'mailnotification' });
+
+               // If sending notifications via mail, remove the current value of
+               // 'notification-target'
+               if (values['notification-mode'] === "mailto") {
+                   Proxmox.Utils.assemble_field_data(
+                       values,
+                       { 'delete': 'notification-target' },
+                   );
+               } else {
+                   // and vice versa...
+                   Proxmox.Utils.assemble_field_data(
+                       values,
+                       { 'delete': 'mailto' },
+                   );
+               }
+           }
+
+           delete values['notification-mode'];
+
            if (!values.id && isCreate) {
                values.id = 'backup-' + Ext.data.identifier.Uuid.Global.generate().slice(0, 13);
            }
@@ -146,6 +170,22 @@ Ext.define('PVE.dc.BackupEdit', {
                    success: function(response, _options) {
                        let data = response.result.data;
 
+                       // 'mailnotification' is deprecated. Let's automatically
+                       // migrate to the compatible 'notification-policy' parameter
+                       if (data.mailnotification) {
+                           if (!data["notification-policy"]) {
+                               data["notification-policy"] = data.mailnotification;
+                           }
+
+                           delete data.mailnotification;
+                       }
+
+                       if (data['notification-target']) {
+                           data['notification-mode'] = 'notification-target';
+                       } else if (data.mailto) {
+                           data['notification-mode'] = 'mailto';
+                       }
+
                        if (data.exclude) {
                            data.vmid = data.exclude;
                            data.selMode = 'exclude';
@@ -188,11 +228,13 @@ Ext.define('PVE.dc.BackupEdit', {
     viewModel: {
        data: {
            selMode: 'include',
+           notificationMode: 'notification-target',
        },
 
        formulas: {
            poolMode: (get) => get('selMode') === 'pool',
            disableVMSelection: (get) => get('selMode') !== 'include' && get('selMode') !== 'exclude',
+           mailNotificationSelected: (get) => get('notificationMode') === 'mailto',
        },
     },
 
@@ -282,20 +324,48 @@ Ext.define('PVE.dc.BackupEdit', {
                                },
                            ],
                            column2: [
-                               {
-                                   xtype: 'textfield',
-                                   fieldLabel: gettext('Send email to'),
-                                   name: 'mailto',
-                               },
                                {
                                    xtype: 'pveEmailNotificationSelector',
-                                   fieldLabel: gettext('Email'),
-                                   name: 'mailnotification',
+                                   fieldLabel: gettext('Notify'),
+                                   name: 'notification-policy',
                                    cbind: {
                                        value: (get) => get('isCreate') ? 'always' : '',
                                        deleteEmpty: '{!isCreate}',
                                    },
                                },
+                               {
+                                   xtype: 'pveNotificationModeSelector',
+                                   fieldLabel: gettext('Notify via'),
+                                   name: 'notification-mode',
+                                   bind: {
+                                       value: '{notificationMode}',
+                                   },
+                               },
+                               {
+                                   xtype: 'pveNotificationTargetSelector',
+                                   fieldLabel: gettext('Notification Target'),
+                                   name: 'notification-target',
+                                   allowBlank: true,
+                                   editable: true,
+                                   autoSelect: false,
+                                   bind: {
+                                       hidden: '{mailNotificationSelected}',
+                                       disabled: '{mailNotificationSelected}',
+                                   },
+                                   cbind: {
+                                       deleteEmpty: '{!isCreate}',
+                                   },
+                               },
+                               {
+                                   xtype: 'textfield',
+                                   fieldLabel: gettext('Send email to'),
+                                   name: 'mailto',
+                                   hidden: true,
+                                   bind: {
+                                       hidden: '{!mailNotificationSelected}',
+                                       disabled: '{!mailNotificationSelected}',
+                                   },
+                               },
                                {
                                    xtype: 'pveCompressionSelector',
                                    reference: 'compressionSelector',
diff --git a/www/manager6/form/EmailNotificationSelector.js b/www/manager6/form/EmailNotificationSelector.js
deleted file mode 100644 (file)
index f318ea1..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-Ext.define('PVE.form.EmailNotificationSelector', {
-    extend: 'Proxmox.form.KVComboBox',
-    alias: ['widget.pveEmailNotificationSelector'],
-    comboItems: [
-       ['always', gettext('Notify always')],
-       ['failure', gettext('On failure only')],
-    ],
-});
diff --git a/www/manager6/form/NotificationModeSelector.js b/www/manager6/form/NotificationModeSelector.js
new file mode 100644 (file)
index 0000000..58fddd5
--- /dev/null
@@ -0,0 +1,8 @@
+Ext.define('PVE.form.NotificationModeSelector', {
+    extend: 'Proxmox.form.KVComboBox',
+    alias: ['widget.pveNotificationModeSelector'],
+    comboItems: [
+       ['notification-target', gettext('Target')],
+       ['mailto', gettext('E-Mail')],
+    ],
+});
diff --git a/www/manager6/form/NotificationPolicySelector.js b/www/manager6/form/NotificationPolicySelector.js
new file mode 100644 (file)
index 0000000..6808727
--- /dev/null
@@ -0,0 +1,9 @@
+Ext.define('PVE.form.EmailNotificationSelector', {
+    extend: 'Proxmox.form.KVComboBox',
+    alias: ['widget.pveEmailNotificationSelector'],
+    comboItems: [
+       ['always', gettext('Notify always')],
+       ['failure', gettext('On failure only')],
+       ['never', gettext('Notify never')],
+    ],
+});
diff --git a/www/manager6/form/NotificationTargetSelector.js b/www/manager6/form/NotificationTargetSelector.js
new file mode 100644 (file)
index 0000000..9ead28e
--- /dev/null
@@ -0,0 +1,54 @@
+Ext.define('PVE.form.NotificationTargetSelector', {
+    extend: 'Proxmox.form.ComboGrid',
+    alias: ['widget.pveNotificationTargetSelector'],
+
+    // set default value to empty array, else it inits it with
+    // null and after the store load it is an empty array,
+    // triggering dirtychange
+    value: [],
+    valueField: 'name',
+    displayField: 'name',
+    deleteEmpty: true,
+    skipEmptyText: true,
+
+    store: {
+           fields: ['name', 'type', 'comment'],
+           proxy: {
+               type: 'proxmox',
+               url: '/api2/json/cluster/notifications/targets',
+           },
+           sorters: [
+               {
+                   property: 'name',
+                   direction: 'ASC',
+               },
+           ],
+           autoLoad: true,
+       },
+
+    listConfig: {
+       columns: [
+           {
+               header: gettext('Target'),
+               dataIndex: 'name',
+               sortable: true,
+               hideable: false,
+               flex: 1,
+           },
+           {
+               header: gettext('Type'),
+               dataIndex: 'type',
+               sortable: true,
+               hideable: false,
+               flex: 1,
+           },
+           {
+               header: gettext('Comment'),
+               dataIndex: 'comment',
+               sortable: true,
+               hideable: false,
+               flex: 2,
+           },
+       ],
+    },
+});