]>
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 insideUpdate
= false;
40 var sm
= Ext
.create('Ext.selection.CheckboxModel', {
43 selectionchange: function(model
, selected
) {
44 if (!insideUpdate
) { // avoid endless loop
46 Ext
.Array
.each(selected
, function(record
) {
47 sel
.push(record
.data
.vmid
);
51 vmidField
.setValue(sel
);
58 var storagesel
= Ext
.create('PVE.form.StorageSelector', {
59 fieldLabel
: gettext('Storage'),
60 nodename
: 'localhost',
61 storageContent
: 'backup',
66 var store
= new Ext
.data
.Store({
67 model
: 'PVEResources',
74 var vmgrid
= Ext
.createWidget('grid', {
87 header
: gettext('Node'),
91 header
: gettext('Status'),
93 renderer: function(value
) {
95 return PVE
.Utils
.runningText
;
97 return PVE
.Utils
.stoppedText
;
102 header
: gettext('Name'),
107 header
: gettext('Type'),
113 var nodesel
= Ext
.create('PVE.form.NodeSelector', {
115 fieldLabel
: gettext('Node'),
119 emptyText
: '-- ' + gettext('All') + ' --',
121 change: function(f
, value
) {
122 storagesel
.setNodename(value
|| 'localhost');
123 var mode
= selModeField
.getValue();
125 store
.filterBy(function(rec
) {
126 return (!value
|| rec
.get('node') === value
);
128 if (mode
=== 'all') {
139 xtype
: 'pveDayOfWeekSelector',
141 fieldLabel
: gettext('Day of week'),
148 fieldLabel
: gettext('Start Time'),
160 fieldLabel
: gettext('Send email to'),
164 xtype
: 'pveEmailNotificationSelector',
165 fieldLabel
: gettext('Email notification'),
166 name
: 'mailnotification',
167 deleteEmpty
: me
.create
? false : true,
168 value
: me
.create
? 'always' : ''
171 xtype
: 'pveCompressionSelector',
172 fieldLabel
: gettext('Compression'),
174 deleteEmpty
: me
.create
? false : true,
178 xtype
: 'pveBackupModeSelector',
179 fieldLabel
: gettext('Mode'),
184 xtype
: 'pvecheckbox',
185 fieldLabel
: gettext('Enable'),
194 var ipanel
= Ext
.create('PVE.panel.InputPanel', {
197 onGetValues: function(values
) {
200 PVE
.Utils
.assemble_field_data(values
, { 'delete': 'node' });
205 var selMode
= values
.selMode
;
206 delete values
.selMode
;
208 if (selMode
=== 'all') {
212 } else if (selMode
=== 'exclude') {
214 values
.exclude
= values
.vmid
;
221 var update_vmid_selection = function(list
, mode
) {
223 return; // should not happen - just to be sure
226 if (mode
!== 'all') {
227 sm
.deselectAll(true);
229 Ext
.Array
.each(list
.split(','), function(vmid
) {
230 var rec
= store
.findRecord('vmid', vmid
);
232 sm
.select(rec
, true);
237 insideUpdate
= false;
240 vmidField
.on('change', function(f
, value
) {
241 var mode
= selModeField
.getValue();
242 update_vmid_selection(value
, mode
);
245 selModeField
.on('change', function(f
, value
, oldValue
) {
246 if (value
=== 'all') {
248 vmgrid
.setDisabled(true);
250 vmgrid
.setDisabled(false);
252 if (oldValue
=== 'all') {
253 sm
.deselectAll(true);
254 vmidField
.setValue('');
256 var list
= vmidField
.getValue();
257 update_vmid_selection(list
, value
);
260 var reload = function() {
262 params
: { type
: 'vm' },
263 callback: function() {
264 var node
= nodesel
.getValue();
266 store
.filterBy(function(rec
) {
267 return (!node
|| rec
.get('node') === node
);
269 var list
= vmidField
.getValue();
270 var mode
= selModeField
.getValue();
271 if (mode
=== 'all') {
274 update_vmid_selection(list
, mode
);
281 subject
: gettext("Backup Job"),
284 items
: [ ipanel
, vmgrid
]
290 selModeField
.setValue('include');
293 success: function(response
, options
) {
294 var data
= response
.result
.data
;
296 data
.dow
= data
.dow
.split(',');
298 if (data
.all
|| data
.exclude
) {
300 data
.vmid
= data
.exclude
;
301 data
.selMode
= 'exclude';
304 data
.selMode
= 'all';
307 data
.selMode
= 'include';
320 Ext
.define('PVE.dc.BackupView', {
321 extend
: 'Ext.grid.GridPanel',
323 alias
: ['widget.pveDcBackupView'],
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 PVE
.button
.Button({
359 text
: gettext('Edit'),
365 var remove_btn
= new PVE
.button
.Button({
366 text
: gettext('Remove'),
369 confirmMsg
: gettext('Are you sure you want to remove this entry'),
370 handler: function(btn
, event
, rec
) {
371 PVE
.Utils
.API2Request({
372 url
: '/cluster/backup/' + rec
.data
.id
,
375 callback: function() {
378 failure: function (response
, opts
) {
379 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
385 PVE
.Utils
.monStoreErrors(me
, store
);
396 text
: gettext('Add'),
397 handler: function() {
398 var win
= Ext
.create('PVE.dc.BackupEdit',{});
399 win
.on('destroy', reload
);
408 header
: gettext('Enabled'),
410 dataIndex
: 'enabled',
411 xtype
: 'checkcolumn',
414 disabledCls
: 'x-item-enabled',
418 header
: gettext('Node'),
422 renderer: function(value
) {
430 header
: gettext('Day of week'),
434 renderer: function(val
) {
435 var dows
= ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
438 val
.split(',').forEach(function(day
){
440 dow
= (dows
.indexOf(day
)+6)%7;
442 if (selected
.length
=== 0 || selected
[selected
.length
-1] === 0) {
445 selected
[selected
.length
-1]++;
458 selected
.forEach(function(item
) {
461 days
.push(Ext
.Date
.dayNames
[(cur
+1)] + '-' + Ext
.Date
.dayNames
[(cur
+item
)%7]);
463 } else if (item
== 2) {
464 days
.push(Ext
.Date
.dayNames
[cur
+1]);
465 days
.push(Ext
.Date
.dayNames
[(cur
+2)%7]);
467 } else if (item
== 1) {
468 days
.push(Ext
.Date
.dayNames
[(cur
+1)%7]);
471 return days
.join(', ');
475 header
: gettext('Start Time'),
478 dataIndex
: 'starttime'
481 header
: gettext('Storage'),
487 header
: gettext('Selection'),
491 renderer: function(value
, metaData
, record
) {
492 /*jslint confusion: true */
493 if (record
.data
.all
) {
494 if (record
.data
.exclude
) {
495 return Ext
.String
.format(me
.allExceptText
, record
.data
.exclude
);
499 if (record
.data
.vmid
) {
500 return record
.data
.vmid
;
509 itemdblclick
: run_editor
517 Ext
.define('pve-cluster-backup', {
518 extend
: 'Ext.data.Model',
520 'id', 'starttime', 'dow',
521 'storage', 'node', 'vmid', 'exclude',
523 { name
: 'enabled', type
: 'boolean' },
524 { name
: 'all', type
: 'boolean' },
525 { name
: 'snapshot', type
: 'boolean' },
526 { name
: 'stop', type
: 'boolean' },
527 { name
: 'suspend', type
: 'boolean' },
528 { name
: 'compress', type
: 'boolean' }