ui: add support for optional Remote in SyncJob

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>
This commit is contained in:
Hannes Laimer 2023-11-21 15:31:55 +01:00 committed by Thomas Lamprecht
parent 4ec733279b
commit 535ca853c2
4 changed files with 106 additions and 13 deletions

View 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')})`,

View 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'),

View File

@ -44,20 +44,25 @@ Ext.define('PBS.form.RemoteStoreSelector', {
me.store.removeAll();
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;
} else {
me.setDisabled(true);
me.setDisabled(false);
if (!me.firstLoad) {
me.clearValue();
}
if (me.remote) {
me.store.proxy.url = `/api2/json/config/remote/${encodeURIComponent(me.remote)}/scan`;
me.store.removeFilter('storeFilter');
} else {
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);

View 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;