]>
git.proxmox.com Git - proxmox-backup.git/blob - www/window/SyncJobEdit.js
1 Ext
.define('PBS.window.SyncJobEdit', {
2 extend
: 'Proxmox.window.Edit',
3 alias
: 'widget.pbsSyncJobEdit',
4 mixins
: ['Proxmox.Mixin.CBind'],
8 onlineHelp
: 'syncjobs',
12 subject
: gettext('Sync Job'),
16 fieldDefaults
: { labelWidth
: 120 },
17 defaultFocus
: 'proxmoxtextfield[name=comment]',
19 cbindData: function(initialConfig
) {
22 let baseurl
= '/api2/extjs/config/sync';
23 let id
= initialConfig
.id
;
26 me
.url
= id
? `${baseurl}/${id}` : baseurl
;
27 me
.method
= id
? 'PUT' : 'POST';
29 me
.scheduleValue
= id
? null : 'hourly';
30 me
.authid
= id
? null : Proxmox
.UserName
;
31 me
.editDatastore
= me
.datastore
=== undefined && me
.isCreate
;
36 xclass
: 'Ext.app.ViewController',
38 'pbsDataStoreSelector[name=store]': {
39 change
: 'storeChange',
43 storeChange: function(field
, value
) {
44 let view
= this.getView();
45 let nsSelector
= view
.down('pbsNamespaceSelector[name=ns]');
46 nsSelector
.setDatastore(value
);
50 setValues: function(values
) {
52 if (values
.id
&& !values
.remote
) {
53 values
.location
= 'local';
55 values
.location
= 'remote';
57 me
.callParent([values
]);
68 onGetValues: function(values
) {
71 if (!values
.id
&& me
.up('pbsSyncJobEdit').isCreate
) {
72 values
.id
= 's-' + Ext
.data
.identifier
.Uuid
.Global
.generate().slice(0, 13);
75 PBS
.Utils
.delete_if_default(values
, 'rate-in');
76 PBS
.Utils
.delete_if_default(values
, 'remote');
77 if (typeof values
.delete === 'string') {
78 values
.delete = values
.delete.split(',');
84 isCreate
: '{isCreate}', // pass it through
88 xtype
: 'pmxDisplayEditField',
89 fieldLabel
: gettext('Local Datastore'),
93 editable
: '{editDatastore}',
97 xtype
: 'pbsDataStoreSelector',
102 xtype
: 'pbsNamespaceSelector',
103 fieldLabel
: gettext('Local Namespace'),
106 datastore
: '{datastore}',
109 change: function(field
, localNs
) {
111 let view
= me
.up('pbsSyncJobEdit');
113 let remoteNs
= view
.down('pbsRemoteNamespaceSelector[name=remote-ns]').getValue();
114 let maxDepthField
= view
.down('field[name=max-depth]');
115 maxDepthField
.setLimit(localNs
, remoteNs
);
116 maxDepthField
.validate();
121 fieldLabel
: gettext('Local Owner'),
122 xtype
: 'pbsAuthidSelector',
126 deleteEmpty
: '{!isCreate}',
130 fieldLabel
: gettext('Sync Schedule'),
131 xtype
: 'pbsCalendarEvent',
133 emptyText
: gettext('none (disabled)'),
135 deleteEmpty
: '{!isCreate}',
136 value
: '{scheduleValue}',
140 xtype
: 'pmxBandwidthField',
142 fieldLabel
: gettext('Rate Limit'),
143 emptyText
: gettext('Unlimited'),
144 submitAutoScaledSizeUnit
: true,
145 // NOTE: handle deleteEmpty in onGetValues due to bandwidth field having a cbind too
152 fieldLabel
: gettext('Location'),
153 defaultType
: 'radiofield',
164 inputValue
: 'remote',
170 change: function(_group
, radio
) {
172 let form
= me
.up('pbsSyncJobEdit');
173 let nsField
= form
.down('field[name=remote-ns]');
174 let rateLimitField
= form
.down('field[name=rate-in]');
175 let remoteField
= form
.down('field[name=remote]');
176 let storeField
= form
.down('field[name=remote-store]');
178 if (!storeField
.value
) {
179 nsField
.clearValue();
180 nsField
.setDisabled(true);
183 let isLocalSync
= radio
.location
=== 'local';
184 rateLimitField
.setDisabled(isLocalSync
);
185 remoteField
.allowBlank
= isLocalSync
;
186 remoteField
.setDisabled(isLocalSync
);
187 storeField
.setDisabled(!isLocalSync
&& !remoteField
.value
);
188 if (isLocalSync
=== !!remoteField
.value
) {
189 remoteField
.clearValue();
193 storeField
.setDisabled(false);
194 rateLimitField
.setValue(null);
195 storeField
.setRemote(null, true);
197 storeField
.clearValue();
198 remoteField
.validate();
204 fieldLabel
: gettext('Source Remote'),
205 xtype
: 'pbsRemoteSelector',
210 change: function(f
, value
) {
212 let remoteStoreField
= me
.up('pbsSyncJobEdit').down('field[name=remote-store]');
213 remoteStoreField
.setRemote(value
);
214 let rateLimitField
= me
.up('pbsSyncJobEdit').down('field[name=rate-in]');
215 rateLimitField
.setDisabled(!value
);
217 rateLimitField
.setValue(null);
219 let remoteNamespaceField
= me
.up('pbsSyncJobEdit').down('field[name=remote-ns]');
220 remoteNamespaceField
.setRemote(value
);
225 fieldLabel
: gettext('Source Datastore'),
226 xtype
: 'pbsRemoteStoreSelector',
229 name
: 'remote-store',
231 datastore
: '{datastore}',
234 change: function(field
, value
) {
236 let remoteField
= me
.up('pbsSyncJobEdit').down('field[name=remote]');
237 let remote
= remoteField
.getValue();
238 let remoteNamespaceField
= me
.up('pbsSyncJobEdit').down('field[name=remote-ns]');
239 remoteNamespaceField
.setRemote(remote
);
240 remoteNamespaceField
.setRemoteStore(value
);
241 me
.up('tabpanel').down('pbsGroupFilter').setRemoteDatastore(remote
, value
);
246 fieldLabel
: gettext('Source Namespace'),
247 xtype
: 'pbsRemoteNamespaceSelector',
253 change: function(field
, remoteNs
) {
255 let view
= me
.up('pbsSyncJobEdit');
257 let remote
= view
.down('field[name=remote]').getValue();
258 let remoteStore
= view
.down('field[name=remote-store]').getValue();
259 me
.up('tabpanel').down('pbsGroupFilter').setRemoteNamespace(remote
, remoteStore
, remoteNs
);
261 let localNs
= view
.down('pbsNamespaceSelector[name=ns]').getValue();
262 let maxDepthField
= view
.down('field[name=max-depth]');
263 maxDepthField
.setLimit(localNs
, remoteNs
);
264 maxDepthField
.validate();
269 xtype
: 'pbsNamespaceMaxDepthReduced',
271 fieldLabel
: gettext('Max. Depth'),
273 deleteEmpty
: '{!isCreate}',
277 fieldLabel
: gettext('Remove vanished'),
278 xtype
: 'proxmoxcheckbox',
279 name
: 'remove-vanished',
282 'data-qtip': gettext('Remove snapshots from local datastore if they vanished from source datastore?'),
284 uncheckedValue
: false,
291 fieldLabel
: gettext('Comment'),
292 xtype
: 'proxmoxtextfield',
295 deleteEmpty
: '{!isCreate}',
301 xtype
: 'pmxDisplayEditField',
302 fieldLabel
: gettext('Job ID'),
303 emptyText
: gettext('Autogenerate'),
306 regex
: PBS
.Utils
.SAFE_ID_RE
,
308 editable
: '{isCreate}',
312 fieldLabel
: gettext('Transfer Last'),
313 xtype
: 'pbsPruneKeepInput',
314 name
: 'transfer-last',
315 emptyText
: gettext('all'),
318 'data-qtip': gettext('The maximum amount of snapshots to be transferred (per group)'),
321 deleteEmpty
: '{!isCreate}',
328 onGetValues: function(values
) {
330 PBS
.Utils
.delete_if_default(values
, 'group-filter');
331 if (Ext
.isArray(values
['group-filter'])) {
332 if (values
['group-filter'].length
=== 0) {
333 delete values
['group-filter'];
334 values
.delete = 'group-filter';
337 values
['group-filter'] = [...new Set(values
['group-filter'])];
341 delete values
.delete;
346 isCreate
: '{isCreate}', // pass it through
348 title
: gettext('Group Filter'),
351 xtype
: 'pbsGroupFilter',
352 name
: 'group-filter',