]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/Backup.js
1 Ext
.define('PVE.dc.BackupEdit', {
2 extend
: 'Proxmox.window.Edit',
3 alias
: ['widget.pveDcBackupEdit'],
5 defaultFocus
: undefined,
7 initComponent : function() {
10 me
.isCreate
= !me
.jobid
;
16 url
= '/api2/extjs/cluster/backup';
19 url
= '/api2/extjs/cluster/backup/' + me
.jobid
;
23 var vmidField
= Ext
.create('Ext.form.field.Hidden', {
27 /*jslint confusion: true*/
28 // 'value' can be assigned a string or an array
29 var selModeField
= Ext
.create('Proxmox.form.KVComboBox', {
30 xtype
: 'proxmoxKVComboBox',
32 ['include', gettext('Include selected VMs')],
33 ['all', gettext('All')],
34 ['exclude', gettext('Exclude selected VMs')]
36 fieldLabel
: gettext('Selection mode'),
41 var sm
= Ext
.create('Ext.selection.CheckboxModel', {
44 selectionchange: function(model
, selected
) {
46 Ext
.Array
.each(selected
, function(record
) {
47 sel
.push(record
.data
.vmid
);
50 // to avoid endless recursion suspend the vmidField change
51 // event temporary as it calls us again
52 vmidField
.suspendEvent('change');
53 vmidField
.setValue(sel
);
54 vmidField
.resumeEvent('change');
59 var storagesel
= Ext
.create('PVE.form.StorageSelector', {
60 fieldLabel
: gettext('Storage'),
61 nodename
: 'localhost',
62 storageContent
: 'backup',
67 var store
= new Ext
.data
.Store({
68 model
: 'PVEResources',
75 var vmgrid
= Ext
.createWidget('grid', {
88 header
: gettext('Node'),
92 header
: gettext('Status'),
94 renderer: function(value
) {
96 return Proxmox
.Utils
.runningText
;
98 return Proxmox
.Utils
.stoppedText
;
103 header
: gettext('Name'),
108 header
: gettext('Type'),
114 var nodesel
= Ext
.create('PVE.form.NodeSelector', {
116 fieldLabel
: gettext('Node'),
120 emptyText
: '-- ' + gettext('All') + ' --',
122 change: function(f
, value
) {
123 storagesel
.setNodename(value
|| 'localhost');
124 var mode
= selModeField
.getValue();
126 store
.filterBy(function(rec
) {
127 return (!value
|| rec
.get('node') === value
);
129 if (mode
=== 'all') {
140 xtype
: 'pveDayOfWeekSelector',
142 fieldLabel
: gettext('Day of week'),
149 fieldLabel
: gettext('Start Time'),
161 fieldLabel
: gettext('Send email to'),
165 xtype
: 'pveEmailNotificationSelector',
166 fieldLabel
: gettext('Email notification'),
167 name
: 'mailnotification',
168 deleteEmpty
: me
.isCreate
? false : true,
169 value
: me
.isCreate
? 'always' : ''
172 xtype
: 'pveCompressionSelector',
173 fieldLabel
: gettext('Compression'),
175 deleteEmpty
: me
.isCreate
? false : true,
179 xtype
: 'pveBackupModeSelector',
180 fieldLabel
: gettext('Mode'),
185 xtype
: 'proxmoxcheckbox',
186 fieldLabel
: gettext('Enable'),
194 /*jslint confusion: false*/
196 var ipanel
= Ext
.create('PVE.panel.InputPanel', {
197 onlineHelp
: 'chapter_vzdump',
200 onGetValues: function(values
) {
203 Proxmox
.Utils
.assemble_field_data(values
, { 'delete': 'node' });
208 var selMode
= values
.selMode
;
209 delete values
.selMode
;
211 if (selMode
=== 'all') {
215 } else if (selMode
=== 'exclude') {
217 values
.exclude
= values
.vmid
;
224 var update_vmid_selection = function(list
, mode
) {
225 if (mode
!== 'all') {
226 sm
.deselectAll(true);
228 Ext
.Array
.each(list
.split(','), function(vmid
) {
229 var rec
= store
.findRecord('vmid', vmid
);
231 sm
.select(rec
, true);
238 vmidField
.on('change', function(f
, value
) {
239 var mode
= selModeField
.getValue();
240 update_vmid_selection(value
, mode
);
243 selModeField
.on('change', function(f
, value
, oldValue
) {
244 if (value
=== 'all') {
246 vmgrid
.setDisabled(true);
248 vmgrid
.setDisabled(false);
250 if (oldValue
=== 'all') {
251 sm
.deselectAll(true);
252 vmidField
.setValue('');
254 var list
= vmidField
.getValue();
255 update_vmid_selection(list
, value
);
258 var reload = function() {
260 params
: { type
: 'vm' },
261 callback: function() {
262 var node
= nodesel
.getValue();
264 store
.filterBy(function(rec
) {
265 return (!node
|| node
.length
=== 0 || rec
.get('node') === node
);
267 var list
= vmidField
.getValue();
268 var mode
= selModeField
.getValue();
269 if (mode
=== 'all') {
272 update_vmid_selection(list
, mode
);
279 subject
: gettext("Backup Job"),
282 items
: [ ipanel
, vmgrid
]
288 selModeField
.setValue('include');
291 success: function(response
, options
) {
292 var data
= response
.result
.data
;
294 data
.dow
= data
.dow
.split(',');
296 if (data
.all
|| data
.exclude
) {
298 data
.vmid
= data
.exclude
;
299 data
.selMode
= 'exclude';
302 data
.selMode
= 'all';
305 data
.selMode
= 'include';
318 Ext
.define('PVE.dc.BackupView', {
319 extend
: 'Ext.grid.GridPanel',
321 alias
: ['widget.pveDcBackupView'],
323 onlineHelp
: 'chapter_vzdump',
325 allText
: '-- ' + gettext('All') + ' --',
326 allExceptText
: gettext('All except {0}'),
328 initComponent : function() {
331 var store
= new Ext
.data
.Store({
332 model
: 'pve-cluster-backup',
335 url
: "/api2/json/cluster/backup"
339 var reload = function() {
343 var sm
= Ext
.create('Ext.selection.RowModel', {});
345 var run_editor = function() {
346 var rec
= sm
.getSelection()[0];
351 var win
= Ext
.create('PVE.dc.BackupEdit',{
354 win
.on('destroy', reload
);
358 var edit_btn
= new Proxmox
.button
.Button({
359 text
: gettext('Edit'),
365 var remove_btn
= Ext
.create('Proxmox.button.StdRemoveButton', {
367 baseurl
: '/cluster/backup',
368 callback: function() {
373 Proxmox
.Utils
.monStoreErrors(me
, store
);
379 stateId
: 'grid-dc-backup',
385 text
: gettext('Add'),
386 handler: function() {
387 var win
= Ext
.create('PVE.dc.BackupEdit',{});
388 win
.on('destroy', reload
);
397 header
: gettext('Enabled'),
399 dataIndex
: 'enabled',
400 xtype
: 'checkcolumn',
403 disabledCls
: 'x-item-enabled',
407 header
: gettext('Node'),
411 renderer: function(value
) {
419 header
: gettext('Day of week'),
423 renderer: function(val
) {
424 var dows
= ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
427 val
.split(',').forEach(function(day
){
429 var dow
= (dows
.indexOf(day
)+6)%7;
431 if (selected
.length
=== 0 || selected
[selected
.length
-1] === 0) {
434 selected
[selected
.length
-1]++;
447 selected
.forEach(function(item
) {
450 days
.push(Ext
.Date
.dayNames
[(cur
+1)] + '-' + Ext
.Date
.dayNames
[(cur
+item
)%7]);
452 } else if (item
== 2) {
453 days
.push(Ext
.Date
.dayNames
[cur
+1]);
454 days
.push(Ext
.Date
.dayNames
[(cur
+2)%7]);
456 } else if (item
== 1) {
457 days
.push(Ext
.Date
.dayNames
[(cur
+1)%7]);
460 return days
.join(', ');
464 header
: gettext('Start Time'),
467 dataIndex
: 'starttime'
470 header
: gettext('Storage'),
476 header
: gettext('Selection'),
480 renderer: function(value
, metaData
, record
) {
481 /*jslint confusion: true */
482 if (record
.data
.all
) {
483 if (record
.data
.exclude
) {
484 return Ext
.String
.format(me
.allExceptText
, record
.data
.exclude
);
488 if (record
.data
.vmid
) {
489 return record
.data
.vmid
;
498 itemdblclick
: run_editor
506 Ext
.define('pve-cluster-backup', {
507 extend
: 'Ext.data.Model',
509 'id', 'starttime', 'dow',
510 'storage', 'node', 'vmid', 'exclude',
512 { name
: 'enabled', type
: 'boolean' },
513 { name
: 'all', type
: 'boolean' },
514 { name
: 'snapshot', type
: 'boolean' },
515 { name
: 'stop', type
: 'boolean' },
516 { name
: 'suspend', type
: 'boolean' },
517 { name
: 'compress', type
: 'boolean' }