mirror of
https://git.proxmox.com/git/proxmox-backup
synced 2025-08-15 06:45:27 +00:00
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:
parent
4ec733279b
commit
535ca853c2
@ -711,6 +711,11 @@ Ext.define('PBS.Utils', {
|
|||||||
return Ext.String.htmlEncode(value);
|
return Ext.String.htmlEncode(value);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
render_optional_remote: function(value, metadata, record) {
|
||||||
|
if (!value) return `- (${gettext('Local')})`;
|
||||||
|
return Ext.String.htmlEncode(value);
|
||||||
|
},
|
||||||
|
|
||||||
tuningOptions: {
|
tuningOptions: {
|
||||||
'chunk-order': {
|
'chunk-order': {
|
||||||
'__default__': Proxmox.Utils.defaultText + ` (${gettext('Inode')})`,
|
'__default__': Proxmox.Utils.defaultText + ` (${gettext('Inode')})`,
|
||||||
|
@ -208,6 +208,7 @@ Ext.define('PBS.config.SyncJobView', {
|
|||||||
dataIndex: 'remote',
|
dataIndex: 'remote',
|
||||||
width: 120,
|
width: 120,
|
||||||
sortable: true,
|
sortable: true,
|
||||||
|
renderer: PBS.Utils.render_optional_remote,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
header: gettext('Remote Store'),
|
header: gettext('Remote Store'),
|
||||||
|
@ -44,20 +44,25 @@ Ext.define('PBS.form.RemoteStoreSelector', {
|
|||||||
|
|
||||||
me.store.removeAll();
|
me.store.removeAll();
|
||||||
|
|
||||||
if (me.remote) {
|
|
||||||
me.setDisabled(false);
|
me.setDisabled(false);
|
||||||
if (!me.firstLoad) {
|
if (!me.firstLoad) {
|
||||||
me.clearValue();
|
me.clearValue();
|
||||||
}
|
}
|
||||||
|
if (me.remote) {
|
||||||
me.store.proxy.url = `/api2/json/config/remote/${encodeURIComponent(me.remote)}/scan`;
|
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.store.load();
|
||||||
|
|
||||||
me.firstLoad = false;
|
me.firstLoad = false;
|
||||||
} else {
|
|
||||||
me.setDisabled(true);
|
|
||||||
me.clearValue();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
initComponent: function() {
|
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.proxy.url = `/api2/json/config/remote/${encodedRemote}/scan/${encodedStore}/namespaces`;
|
||||||
me.store.load();
|
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;
|
me.firstLoad = false;
|
||||||
} else if (previousStore) {
|
} else if (previousStore) {
|
||||||
me.setDisabled(true);
|
me.setDisabled(true);
|
||||||
|
@ -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: {
|
items: {
|
||||||
xtype: 'tabpanel',
|
xtype: 'tabpanel',
|
||||||
@ -134,16 +143,76 @@ Ext.define('PBS.window.SyncJobEdit', {
|
|||||||
],
|
],
|
||||||
|
|
||||||
column2: [
|
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'),
|
fieldLabel: gettext('Source Remote'),
|
||||||
xtype: 'pbsRemoteSelector',
|
xtype: 'pbsRemoteSelector',
|
||||||
allowBlank: false,
|
allowBlank: false,
|
||||||
name: 'remote',
|
name: 'remote',
|
||||||
|
cbind: {
|
||||||
|
deleteEmpty: '{!isCreate}',
|
||||||
|
},
|
||||||
|
skipEmptyText: true,
|
||||||
listeners: {
|
listeners: {
|
||||||
change: function(f, value) {
|
change: function(f, value) {
|
||||||
let me = this;
|
let me = this;
|
||||||
let remoteStoreField = me.up('pbsSyncJobEdit').down('field[name=remote-store]');
|
let remoteStoreField = me.up('pbsSyncJobEdit').down('field[name=remote-store]');
|
||||||
remoteStoreField.setRemote(value);
|
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]');
|
let remoteNamespaceField = me.up('pbsSyncJobEdit').down('field[name=remote-ns]');
|
||||||
remoteNamespaceField.setRemote(value);
|
remoteNamespaceField.setRemote(value);
|
||||||
},
|
},
|
||||||
@ -155,7 +224,9 @@ Ext.define('PBS.window.SyncJobEdit', {
|
|||||||
allowBlank: false,
|
allowBlank: false,
|
||||||
autoSelect: false,
|
autoSelect: false,
|
||||||
name: 'remote-store',
|
name: 'remote-store',
|
||||||
disabled: true,
|
cbind: {
|
||||||
|
datastore: '{datastore}',
|
||||||
|
},
|
||||||
listeners: {
|
listeners: {
|
||||||
change: function(field, value) {
|
change: function(field, value) {
|
||||||
let me = this;
|
let me = this;
|
||||||
|
Loading…
Reference in New Issue
Block a user