]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/Backup.js
1 Ext
.define('PVE.dc.BackupEdit', {
2 extend
: 'PVE.window.Edit',
3 alias
: ['widget.pveDcBackupEdit'],
5 initComponent : function() {
6 /*jslint confusion: true */
15 url
= '/api2/extjs/cluster/backup';
18 url
= '/api2/extjs/cluster/backup/' + me
.jobid
;
22 var vmidField
= Ext
.create('Ext.form.field.Hidden', {
26 var selModeField
= Ext
.create('PVE.form.KVComboBox', {
27 xtype
: 'pveKVComboBox',
29 ['include', gettext('Include selected VMs')],
30 ['all', gettext('All')],
31 ['exclude', gettext('Exclude selected VMs')]
33 fieldLabel
: gettext('Selection mode'),
38 var sm
= Ext
.create('Ext.selection.CheckboxModel', {
41 selectionchange: function(model
, selected
) {
43 Ext
.Array
.each(selected
, function(record
) {
44 sel
.push(record
.data
.vmid
);
47 // to avoid endless recursion suspend the vmidField change
48 // event temporary as it calls us again
49 vmidField
.suspendEvent('change');
50 vmidField
.setValue(sel
);
51 vmidField
.resumeEvent('change');
56 var storagesel
= Ext
.create('PVE.form.StorageSelector', {
57 fieldLabel
: gettext('Storage'),
58 nodename
: 'localhost',
59 storageContent
: 'backup',
64 var store
= new Ext
.data
.Store({
65 model
: 'PVEResources',
72 var vmgrid
= Ext
.createWidget('grid', {
85 header
: gettext('Node'),
89 header
: gettext('Status'),
91 renderer: function(value
) {
93 return PVE
.Utils
.runningText
;
95 return PVE
.Utils
.stoppedText
;
100 header
: gettext('Name'),
105 header
: gettext('Type'),
111 var nodesel
= Ext
.create('PVE.form.NodeSelector', {
113 fieldLabel
: gettext('Node'),
117 emptyText
: '-- ' + gettext('All') + ' --',
119 change: function(f
, value
) {
120 storagesel
.setNodename(value
|| 'localhost');
121 var mode
= selModeField
.getValue();
123 store
.filterBy(function(rec
) {
124 return (!value
|| rec
.get('node') === value
);
126 if (mode
=== 'all') {
137 xtype
: 'pveDayOfWeekSelector',
139 fieldLabel
: gettext('Day of week'),
146 fieldLabel
: gettext('Start Time'),
158 fieldLabel
: gettext('Send email to'),
162 xtype
: 'pveEmailNotificationSelector',
163 fieldLabel
: gettext('Email notification'),
164 name
: 'mailnotification',
165 deleteEmpty
: me
.create
? false : true,
166 value
: me
.create
? 'always' : ''
169 xtype
: 'pveCompressionSelector',
170 fieldLabel
: gettext('Compression'),
172 deleteEmpty
: me
.create
? false : true,
176 xtype
: 'pveBackupModeSelector',
177 fieldLabel
: gettext('Mode'),
182 xtype
: 'pvecheckbox',
183 fieldLabel
: gettext('Enable'),
192 var ipanel
= Ext
.create('PVE.panel.InputPanel', {
195 onGetValues: function(values
) {
198 PVE
.Utils
.assemble_field_data(values
, { 'delete': 'node' });
203 var selMode
= values
.selMode
;
204 delete values
.selMode
;
206 if (selMode
=== 'all') {
210 } else if (selMode
=== 'exclude') {
212 values
.exclude
= values
.vmid
;
219 var update_vmid_selection = function(list
, mode
) {
220 if (mode
!== 'all') {
221 sm
.deselectAll(true);
223 Ext
.Array
.each(list
.split(','), function(vmid
) {
224 var rec
= store
.findRecord('vmid', vmid
);
226 sm
.select(rec
, true);
233 vmidField
.on('change', function(f
, value
) {
234 var mode
= selModeField
.getValue();
235 update_vmid_selection(value
, mode
);
238 selModeField
.on('change', function(f
, value
, oldValue
) {
239 if (value
=== 'all') {
241 vmgrid
.setDisabled(true);
243 vmgrid
.setDisabled(false);
245 if (oldValue
=== 'all') {
246 sm
.deselectAll(true);
247 vmidField
.setValue('');
249 var list
= vmidField
.getValue();
250 update_vmid_selection(list
, value
);
253 var reload = function() {
255 params
: { type
: 'vm' },
256 callback: function() {
257 var node
= nodesel
.getValue();
259 store
.filterBy(function(rec
) {
260 return (!node
|| node
.length
=== 0 || rec
.get('node') === node
);
262 var list
= vmidField
.getValue();
263 var mode
= selModeField
.getValue();
264 if (mode
=== 'all') {
267 update_vmid_selection(list
, mode
);
274 subject
: gettext("Backup Job"),
277 items
: [ ipanel
, vmgrid
]
283 selModeField
.setValue('include');
286 success: function(response
, options
) {
287 var data
= response
.result
.data
;
289 data
.dow
= data
.dow
.split(',');
291 if (data
.all
|| data
.exclude
) {
293 data
.vmid
= data
.exclude
;
294 data
.selMode
= 'exclude';
297 data
.selMode
= 'all';
300 data
.selMode
= 'include';
313 Ext
.define('PVE.dc.BackupView', {
314 extend
: 'Ext.grid.GridPanel',
316 alias
: ['widget.pveDcBackupView'],
318 onlineHelp
: 'chapter_vzdump',
320 allText
: '-- ' + gettext('All') + ' --',
321 allExceptText
: gettext('All except {0}'),
323 initComponent : function() {
326 var store
= new Ext
.data
.Store({
327 model
: 'pve-cluster-backup',
330 url
: "/api2/json/cluster/backup"
334 var reload = function() {
338 var sm
= Ext
.create('Ext.selection.RowModel', {});
340 var run_editor = function() {
341 var rec
= sm
.getSelection()[0];
346 var win
= Ext
.create('PVE.dc.BackupEdit',{
349 win
.on('destroy', reload
);
353 var edit_btn
= new PVE
.button
.Button({
354 text
: gettext('Edit'),
360 var remove_btn
= new PVE
.button
.Button({
361 text
: gettext('Remove'),
364 confirmMsg
: gettext('Are you sure you want to remove this entry'),
365 handler: function(btn
, event
, rec
) {
366 PVE
.Utils
.API2Request({
367 url
: '/cluster/backup/' + rec
.data
.id
,
370 callback: function() {
373 failure: function (response
, opts
) {
374 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
380 PVE
.Utils
.monStoreErrors(me
, store
);
391 text
: gettext('Add'),
392 handler: function() {
393 var win
= Ext
.create('PVE.dc.BackupEdit',{});
394 win
.on('destroy', reload
);
403 header
: gettext('Enabled'),
405 dataIndex
: 'enabled',
406 xtype
: 'checkcolumn',
409 disabledCls
: 'x-item-enabled',
413 header
: gettext('Node'),
417 renderer: function(value
) {
425 header
: gettext('Day of week'),
429 renderer: function(val
) {
430 var dows
= ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
433 val
.split(',').forEach(function(day
){
435 var dow
= (dows
.indexOf(day
)+6)%7;
437 if (selected
.length
=== 0 || selected
[selected
.length
-1] === 0) {
440 selected
[selected
.length
-1]++;
453 selected
.forEach(function(item
) {
456 days
.push(Ext
.Date
.dayNames
[(cur
+1)] + '-' + Ext
.Date
.dayNames
[(cur
+item
)%7]);
458 } else if (item
== 2) {
459 days
.push(Ext
.Date
.dayNames
[cur
+1]);
460 days
.push(Ext
.Date
.dayNames
[(cur
+2)%7]);
462 } else if (item
== 1) {
463 days
.push(Ext
.Date
.dayNames
[(cur
+1)%7]);
466 return days
.join(', ');
470 header
: gettext('Start Time'),
473 dataIndex
: 'starttime'
476 header
: gettext('Storage'),
482 header
: gettext('Selection'),
486 renderer: function(value
, metaData
, record
) {
487 /*jslint confusion: true */
488 if (record
.data
.all
) {
489 if (record
.data
.exclude
) {
490 return Ext
.String
.format(me
.allExceptText
, record
.data
.exclude
);
494 if (record
.data
.vmid
) {
495 return record
.data
.vmid
;
504 itemdblclick
: run_editor
512 Ext
.define('pve-cluster-backup', {
513 extend
: 'Ext.data.Model',
515 'id', 'starttime', 'dow',
516 'storage', 'node', 'vmid', 'exclude',
518 { name
: 'enabled', type
: 'boolean' },
519 { name
: 'all', type
: 'boolean' },
520 { name
: 'snapshot', type
: 'boolean' },
521 { name
: 'stop', type
: 'boolean' },
522 { name
: 'suspend', type
: 'boolean' },
523 { name
: 'compress', type
: 'boolean' }