defaultFocus: undefined,
initComponent: function() {
- var me = this;
-
- me.isCreate = !me.jobid;
+ let me = this;
- var url;
- var method;
+ me.isCreate = !me.jobid;
+ let url, method;
if (me.isCreate) {
- url = '/api2/extjs/cluster/backup';
- method = 'POST';
- } else {
- url = '/api2/extjs/cluster/backup/' + me.jobid;
- method = 'PUT';
- }
-
- var vmidField = Ext.create('Ext.form.field.Hidden', {
+ url = '/api2/extjs/cluster/backup';
+ method = 'POST';
+ } else {
+ url = '/api2/extjs/cluster/backup/' + me.jobid;
+ method = 'PUT';
+ }
+
+ let vmidField = Ext.create('Ext.form.field.Hidden', {
name: 'vmid',
});
// 'value' can be assigned a string or an array
- var selModeField = Ext.create('Proxmox.form.KVComboBox', {
+ let selModeField = Ext.create('Proxmox.form.KVComboBox', {
xtype: 'proxmoxKVComboBox',
comboItems: [
['include', gettext('Include selected VMs')],
value: '',
});
- var sm = Ext.create('Ext.selection.CheckboxModel', {
+ let sm = Ext.create('Ext.selection.CheckboxModel', {
mode: 'SIMPLE',
listeners: {
selectionchange: function(model, selected) {
},
});
- var storagesel = Ext.create('PVE.form.StorageSelector', {
+ let storagesel = Ext.create('PVE.form.StorageSelector', {
fieldLabel: gettext('Storage'),
nodename: 'localhost',
storageContent: 'backup',
},
});
- var store = new Ext.data.Store({
+ let store = new Ext.data.Store({
model: 'PVEResources',
sorters: {
property: 'vmid',
},
});
- var vmgrid = Ext.createWidget('grid', {
+ let vmgrid = Ext.createWidget('grid', {
store: store,
border: true,
height: 300,
],
});
- var selectPoolMembers = function(poolid) {
+ let selectPoolMembers = function(poolid) {
if (!poolid) {
return;
}
sm.selectAll(true);
};
- var selPool = Ext.create('PVE.form.PoolSelector', {
+ let selPool = Ext.create('PVE.form.PoolSelector', {
fieldLabel: gettext('Pool to backup'),
hidden: true,
allowBlank: true,
},
});
- var nodesel = Ext.create('PVE.form.NodeSelector', {
+ let nodesel = Ext.create('PVE.form.NodeSelector', {
name: 'node',
fieldLabel: gettext('Node'),
allowBlank: true,
listeners: {
change: function(f, value) {
storagesel.setNodename(value || 'localhost');
- var mode = selModeField.getValue();
+ let mode = selModeField.getValue();
store.clearFilter();
store.filterBy(function(rec) {
return !value || rec.get('node') === value;
if (mode === 'all') {
sm.selectAll(true);
}
-
if (mode === 'pool') {
selectPoolMembers(selPool.value);
}
},
});
- var column1 = [
+ let column1 = [
nodesel,
storagesel,
{
selPool,
];
- var column2 = [
+ let column2 = [
{
xtype: 'textfield',
fieldLabel: gettext('Send email to'),
vmidField,
];
- var ipanel = Ext.create('Proxmox.panel.InputPanel', {
+ let ipanel = Ext.create('Proxmox.panel.InputPanel', {
onlineHelp: 'chapter_vzdump',
column1: column1,
column2: column2,
delete values.node;
}
- var selMode = values.selMode;
+ let selMode = values.selMode;
delete values.selMode;
if (selMode === 'all') {
},
});
- var update_vmid_selection = function(list, mode) {
+ let update_vmid_selection = function(list, mode) {
if (mode !== 'all' && mode !== 'pool') {
sm.deselectAll(true);
if (list) {
};
vmidField.on('change', function(f, value) {
- var mode = selModeField.getValue();
+ let mode = selModeField.getValue();
update_vmid_selection(value, mode);
});
selPool.setVisible(false);
selPool.allowBlank = true;
}
- var list = vmidField.getValue();
+ let list = vmidField.getValue();
update_vmid_selection(list, value);
});
- var reload = function() {
+ let reload = function() {
store.load({
- params: { type: 'vm' },
+ params: {
+ type: 'vm',
+ },
callback: function() {
- var node = nodesel.getValue();
+ let node = nodesel.getValue();
store.clearFilter();
- store.filterBy(function(rec) {
- return !node || node.length === 0 || rec.get('node') === node;
- });
- var list = vmidField.getValue();
- var mode = selModeField.getValue();
+ store.filterBy(rec => !node || node.length === 0 || rec.get('node') === node);
+ let list = vmidField.getValue();
+ let mode = selModeField.getValue();
if (mode === 'all') {
sm.selectAll(true);
} else if (mode === 'pool') {
});
};
- Ext.applyIf(me, {
- subject: gettext("Backup Job"),
- url: url,
- method: method,
+ Ext.applyIf(me, {
+ subject: gettext("Backup Job"),
+ url: url,
+ method: method,
items: [ipanel, vmgrid],
- });
+ });
- me.callParent();
+ me.callParent();
- if (me.isCreate) {
+ if (me.isCreate) {
selModeField.setValue('include');
} else {
me.load({
success: function(response, options) {
- var data = response.result.data;
+ let data = response.result.data;
data.dow = data.dow.split(',');
}
me.setValues(data);
- },
- });
- }
+ },
+ });
+ }
reload();
},
{
type: 'expand',
tooltip: gettext('Expand All'),
- scope: this,
- callback: function(panel) {
- panel.expandAll();
- },
+ callback: panel => panel.expandAll(),
},
{
type: 'collapse',
tooltip: gettext('Collapse All'),
- scope: this,
- callback: function(panel) {
- panel.collapseAll();
- },
+ callback: panel => panel.collapseAll(),
},
],
}
return ret;
} else {
- // volume level
- // extJS needs unique IDs but we only want to show the
- // volumes key from "vmid:key"
+ // extJS needs unique IDs but we only want to show the volumes key from "vmid:key"
return value.split(':')[1] + " - " + record.data.name;
}
},
],
reload: function() {
- var me = this;
- var sm = me.getSelectionModel();
+ let me = this;
+ let sm = me.getSelectionModel();
Proxmox.Utils.API2Request({
- url: "/cluster/backup/" + me.jobid + "/included_volumes",
+ url: `/cluster/backup/${me.jobid}/included_volumes`,
waitMsgTarget: me,
method: 'GET',
failure: function(response, opts) {
listeners: {
buffer: 500,
keyup: function(field) {
- let searchValue = field.getValue();
- searchValue = searchValue.toLowerCase();
-
+ let searchValue = field.getValue().toLowerCase();
me.store.clearFilter(true);
me.store.filterBy(function(record) {
- let match = false;
-
- let data = '';
- if (record.data.depth == 0) {
+ let data = {};
+ if (record.data.depth === 0) {
return true;
- } else if (record.data.depth == 1) {
+ } else if (record.data.depth === 1) {
data = record.data;
- } else if (record.data.depth == 2) {
+ } else if (record.data.depth === 2) {
data = record.parentNode.data;
}
- Ext.each(['name', 'id', 'type'], function(property) {
+ for (const property in ['name', 'id', 'type']) {
if (data[property] === null) {
- return;
+ continue;
}
-
let v = data[property].toString();
if (v !== undefined) {
v = v.toLowerCase();
if (v.includes(searchValue)) {
- match = true;
- return;
+ return true;
}
}
- });
- return match;
+ }
+ return false;
});
},
},
- },
- ],
-},
+ }],
+ },
});
me.callParent();
listeners: {
buffer: 500,
keyup: function(field) {
- let searchValue = field.getValue();
- searchValue = searchValue.toLowerCase();
-
+ let searchValue = field.getValue().toLowerCase();
me.store.clearFilter(true);
me.store.filterBy(function(record) {
- let match = false;
-
- Ext.each(['name', 'vmid', 'type'], function(property) {
- if (record.data[property] == null) {
- return;
+ let data = record.data;
+ for (const property in ['name', 'id', 'type']) {
+ if (data[property] === null) {
+ continue;
}
-
- let v = record.data[property].toString();
+ let v = data[property].toString();
if (v !== undefined) {
v = v.toLowerCase();
if (v.includes(searchValue)) {
- match = true;
- return;
+ return true;
}
}
- });
- return match;
+ }
+ return false;
});
},
},
allText: '-- ' + gettext('All') + ' --',
initComponent: function() {
- var me = this;
+ let me = this;
- var store = new Ext.data.Store({
+ let store = new Ext.data.Store({
model: 'pve-cluster-backup',
proxy: {
- type: 'proxmox',
+ type: 'proxmox',
url: "/api2/json/cluster/backup",
},
});
- var not_backed_store = new Ext.data.Store({
+ let not_backed_store = new Ext.data.Store({
sorters: 'vmid',
proxy: {
type: 'proxmox',
},
});
- var reload = function() {
+ let noBackupJobWarning, noBackupJobInfoButton;
+ let reload = function() {
store.load();
not_backed_store.load({
callback: function(records, operation, success) {
- if (records.length) {
- not_backed_warning.setVisible(true);
- not_backed_btn.setVisible(true);
- } else {
- not_backed_warning.setVisible(false);
- not_backed_btn.setVisible(false);
- }
+ noBackupJobWarning.setVisible(records.length > 0);
+ noBackupJobInfoButton.setVisible(records.length > 0);
},
});
};
- var sm = Ext.create('Ext.selection.RowModel', {});
+ let sm = Ext.create('Ext.selection.RowModel', {});
- var run_editor = function() {
- var rec = sm.getSelection()[0];
+ let run_editor = function() {
+ let rec = sm.getSelection()[0];
if (!rec) {
return;
}
- var win = Ext.create('PVE.dc.BackupEdit', {
+ let win = Ext.create('PVE.dc.BackupEdit', {
jobid: rec.data.id,
});
win.on('destroy', reload);
win.show();
};
- var run_detail = function() {
- let me = this;
+ let run_detail = function() {
let record = sm.getSelection()[0];
if (!record) {
return;
}
- let infoview = Ext.create('PVE.dc.BackupInfo', {
- flex: 0,
- layout: 'fit',
- record: record.data,
- });
- let disktree = Ext.create('PVE.dc.BackupDiskTree', {
- title: gettext('Included disks'),
- flex: 1,
- jobid: record.data.id,
- });
-
Ext.create('Ext.window.Window', {
modal: true,
width: 800,
resizable: true,
layout: 'fit',
title: gettext('Backup Details'),
-
- items: [{
- xtype: 'panel',
- region: 'center',
- layout: {
- type: 'vbox',
- align: 'stretch',
+ items: [
+ {
+ xtype: 'panel',
+ region: 'center',
+ layout: {
+ type: 'vbox',
+ align: 'stretch',
+ },
+ items: [
+ {
+ xtype: 'pveBackupInfo',
+ flex: 0,
+ layout: 'fit',
+ record: record.data,
+ },
+ {
+ xtype: 'pveBackupDiskTree',
+ title: gettext('Included disks'),
+ flex: 1,
+ jobid: record.data.id,
+ },
+ ],
},
- items: [infoview, disktree],
- }],
+ ],
}).show();
};
- var run_backup_now = function(job) {
+ let run_backup_now = function(job) {
job = Ext.clone(job);
let jobNode = job.node;
nodes = [jobNode];
} else {
let unkownNodes = allNodes.filter(node => node.status !== 'online');
- if (unkownNodes.length > 0)
- errors.push(unkownNodes.map(node => node.node + ": " + gettext("Node is offline")));
+ if (unkownNodes.length > 0) {errors.push(unkownNodes.map(node => node.node + ": " + gettext("Node is offline")));}
}
let jobTotalCount = nodes.length, jobsStarted = 0;
jobsStarted++;
Ext.Msg.updateProgress(jobsStarted / jobTotalCount, jobsStarted + '/' + jobTotalCount);
- if (jobsStarted == jobTotalCount) {
+ if (jobsStarted === jobTotalCount) {
Ext.Msg.hide();
if (errors.length > 0) {
Ext.Msg.alert('Error', 'Some errors have been encountered:<br />' + errors.join('<br />'));
}));
};
- var run_show_not_backed = function() {
- var me = this;
- var backedinfo = Ext.create('PVE.dc.BackedGuests', {
- flex: 1,
- layout: 'fit',
- store: not_backed_store,
- });
-
- var win = Ext.create('Ext.window.Window', {
+ let run_show_not_backed = function() {
+ Ext.create('Ext.window.Window', {
modal: true,
width: 600,
height: 500,
resizable: true,
layout: 'fit',
title: gettext('Guests without backup job'),
-
- items: [{
- xtype: 'panel',
- region: 'center',
- layout: {
- type: 'vbox',
- align: 'stretch',
+ items: [
+ {
+ xtype: 'panel',
+ region: 'center',
+ layout: {
+ type: 'vbox',
+ align: 'stretch',
+ },
+ items: [
+ {
+ xtype: 'pveBackedGuests',
+ flex: 1,
+ layout: 'fit',
+ store: not_backed_store,
+ },
+ ],
},
- items: [backedinfo],
- }],
+ ],
}).show();
};
handler: run_detail,
});
- var not_backed_warning = Ext.create('Ext.toolbar.TextItem', {
+ noBackupJobWarning = Ext.create('Ext.toolbar.TextItem', {
html: '<i class="fa fa-fw fa-exclamation-circle"></i>' + gettext('Some guests are not covered by any backup job.'),
hidden: true,
});
- var not_backed_btn = new Proxmox.button.Button({
+ noBackupJobInfoButton = new Proxmox.button.Button({
text: gettext('Show'),
hidden: true,
handler: run_show_not_backed,
'-',
run_btn,
'->',
- not_backed_warning,
- not_backed_btn,
+ noBackupJobWarning,
+ noBackupJobInfoButton,
],
columns: [
{
Ext.define('pve-cluster-backup', {
extend: 'Ext.data.Model',
fields: [
- 'id', 'starttime', 'dow',
- 'storage', 'node', 'vmid', 'exclude',
- 'mailto', 'pool', 'compress', 'mode',
+ 'id',
+ 'compress',
+ 'dow',
+ 'exclude',
+ 'mailto',
+ 'mode',
+ 'node',
+ 'pool',
+ 'starttime',
+ 'storage',
+ 'vmid',
{ name: 'enabled', type: 'boolean' },
{ name: 'all', type: 'boolean' },
],