]> git.proxmox.com Git - proxmox-backup.git/commitdiff
ui: add support for optional Remote in SyncJob
authorHannes Laimer <h.laimer@proxmox.com>
Tue, 21 Nov 2023 14:31:55 +0000 (15:31 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Sat, 25 Nov 2023 16:07:42 +0000 (17:07 +0100)
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Tested-by: Gabriel Goller <g.goller@proxmox.com>
www/Utils.js
www/config/SyncView.js
www/form/RemoteTargetSelector.js
www/window/SyncJobEdit.js

index 2eca600e096a4de5a43bb1688775cc886a5ef39f..d7f11cb6006a2a0ad14c6097ab493cacbe2b798f 100644 (file)
@@ -711,6 +711,11 @@ Ext.define('PBS.Utils', {
        return Ext.String.htmlEncode(value);
     },
 
+    render_optional_remote: function(value, metadata, record) {
+       if (!value) return `- (${gettext('Local')})`;
+       return Ext.String.htmlEncode(value);
+    },
+
     tuningOptions: {
        'chunk-order': {
            '__default__': Proxmox.Utils.defaultText + ` (${gettext('Inode')})`,
index bf9072cb84844fd126ba628305208434e2555907..c6458a9eb94cb4e061698dc9c6fe2024e3734261 100644 (file)
@@ -208,6 +208,7 @@ Ext.define('PBS.config.SyncJobView', {
            dataIndex: 'remote',
            width: 120,
            sortable: true,
+           renderer: PBS.Utils.render_optional_remote,
        },
        {
            header: gettext('Remote Store'),
index 2a94c4d79f20a5718c15dc83af838aeaa1991040..9ea802d14710f04bded3b2a71ef0d1c1c074faa1 100644 (file)
@@ -44,20 +44,25 @@ Ext.define('PBS.form.RemoteStoreSelector', {
 
        me.store.removeAll();
 
+       me.setDisabled(false);
+       if (!me.firstLoad) {
+           me.clearValue();
+       }
        if (me.remote) {
-           me.setDisabled(false);
-           if (!me.firstLoad) {
-               me.clearValue();
-           }
-
            me.store.proxy.url = `/api2/json/config/remote/${encodeURIComponent(me.remote)}/scan`;
-           me.store.load();
-
-           me.firstLoad = false;
+           me.store.removeFilter('storeFilter');
        } else {
-           me.setDisabled(true);
-           me.clearValue();
+           me.store.proxy.url = '/api2/json/admin/datastore';
+           me.store.addFilter({
+               filterFn: function(item) {
+                   return item.get('store') !== me.datastore;
+               },
+               id: 'storeFilter',
+           });
        }
+       me.store.load();
+
+       me.firstLoad = false;
     },
 
     initComponent: function() {
@@ -175,6 +180,17 @@ Ext.define('PBS.form.RemoteNamespaceSelector', {
            me.store.proxy.url = `/api2/json/config/remote/${encodedRemote}/scan/${encodedStore}/namespaces`;
            me.store.load();
 
+           me.firstLoad = false;
+       } else if (me.remoteStore) {
+           me.setDisabled(false);
+           if (!me.firstLoad) {
+               me.clearValue();
+           }
+           let encodedStore = encodeURIComponent(me.remoteStore);
+
+           me.store.proxy.url = `/api2/json/admin/datastore/${encodedStore}/namespace`;
+           me.store.load();
+
            me.firstLoad = false;
        } else if (previousStore) {
            me.setDisabled(true);
index 48a0c7a92d14e3cbbe74c93c068cd4cc323a97c5..282f16a30532b8628e31b95dc095a98b13570a79 100644 (file)
@@ -47,6 +47,15 @@ Ext.define('PBS.window.SyncJobEdit', {
        },
     },
 
+    setValues: function(values) {
+       let me = this;
+       if (values.id && !values.remote) {
+           values.location = 'local';
+       } else {
+           values.location = 'remote';
+       }
+       me.callParent([values]);
+    },
 
     items: {
        xtype: 'tabpanel',
@@ -134,16 +143,76 @@ Ext.define('PBS.window.SyncJobEdit', {
                ],
 
                column2: [
+                   {
+                       xtype: 'radiogroup',
+                       fieldLabel: gettext('Location'),
+                       defaultType: 'radiofield',
+                       items: [
+                           {
+                               boxLabel: 'Local',
+                               name: 'location',
+                               inputValue: 'local',
+                               submitValue: false,
+                           },
+                           {
+                               boxLabel: 'Remote',
+                               name: 'location',
+                               inputValue: 'remote',
+                               submitValue: false,
+                               checked: true,
+                           },
+                       ],
+                       listeners: {
+                           change: function(_group, radio) {
+                               let me = this;
+                               let form = me.up('pbsSyncJobEdit');
+                               let nsField = form.down('field[name=remote-ns]');
+                               let rateLimitField = form.down('field[name=rate-in]');
+                               let remoteField = form.down('field[name=remote]');
+                               let storeField = form.down('field[name=remote-store]');
+
+                               if (!storeField.value) {
+                                   nsField.clearValue();
+                                   nsField.setDisabled(true);
+                               }
+
+                               let isLocalSync = radio.location === 'local';
+                               remoteField.allowBlank = isLocalSync;
+                               remoteField.setDisabled(isLocalSync);
+                               storeField.setDisabled(!isLocalSync && !remoteField.value);
+                               if (isLocalSync === !!remoteField.value) {
+                                   storeField.clearValue();
+                                   remoteField.clearValue();
+                               }
+
+                               if (isLocalSync) {
+                                   storeField.setDisabled(false);
+                                   rateLimitField.setValue(null);
+                               } else {
+                                   remoteField.validate();
+                               }
+                           },
+                       },
+                   },
                    {
                        fieldLabel: gettext('Source Remote'),
                        xtype: 'pbsRemoteSelector',
                        allowBlank: false,
                        name: 'remote',
+                       cbind: {
+                           deleteEmpty: '{!isCreate}',
+                       },
+                       skipEmptyText: true,
                        listeners: {
                            change: function(f, value) {
                                let me = this;
                                let remoteStoreField = me.up('pbsSyncJobEdit').down('field[name=remote-store]');
                                remoteStoreField.setRemote(value);
+                               let rateLimitField = me.up('pbsSyncJobEdit').down('field[name=rate-in]');
+                               rateLimitField.setDisabled(!value);
+                               if (!value) {
+                                   rateLimitField.setValue(null);
+                               }
                                let remoteNamespaceField = me.up('pbsSyncJobEdit').down('field[name=remote-ns]');
                                remoteNamespaceField.setRemote(value);
                            },
@@ -155,7 +224,9 @@ Ext.define('PBS.window.SyncJobEdit', {
                        allowBlank: false,
                        autoSelect: false,
                        name: 'remote-store',
-                       disabled: true,
+                       cbind: {
+                           datastore: '{datastore}',
+                       },
                        listeners: {
                            change: function(field, value) {
                                let me = this;