nodename: 'localhost',
storageContent: 'backup',
allowBlank: false,
- name: 'storage'
+ name: 'storage',
+ listeners: {
+ change: function(f, v) {
+ let store = f.getStore();
+ let rec = store.findRecord('storage', v, 0, false, true, true);
+ let compressionSelector = me.down('pveCompressionSelector');
+
+ if (rec && rec.data && rec.data.type === 'pbs') {
+ compressionSelector.setValue('zstd');
+ compressionSelector.setDisabled(true);
+ } else if (!compressionSelector.getEditable()) {
+ compressionSelector.setDisabled(false);
+ }
+ }
+ }
});
var store = new Ext.data.Store({
sm.deselectAll(true);
if (list) {
Ext.Array.each(list.split(','), function(vmid) {
- var rec = store.findRecord('vmid', vmid);
+ var rec = store.findRecord('vmid', vmid, 0, false, true, true);
if (rec) {
sm.select(rec, true);
}
}
}
],
- tbar: [
- '->',
- gettext('Search') + ':', ' ',
- {
+ header: {
+ items: [{
xtype: 'textfield',
+ fieldLabel: gettext('Search'),
+ labelWidth: 50,
+ emptyText: 'Name, VMID, Type',
width: 200,
+ padding: '0 5 0 0',
enableKeyEvents: true,
listeners: {
buffer: 500,
}
Ext.each(['name', 'id', 'type'], function(property) {
- if (data[property] == null) {
+ if (data[property] === null) {
return;
}
}
}
}
- ],
+ ]},
});
me.callParent();
extend: 'Proxmox.panel.InputPanel',
alias: 'widget.pveBackupInfo',
- padding: 10,
+ padding: '5 0 5 10',
column1: [
{
}
});
+
+Ext.define('PVE.dc.BackedGuests', {
+ extend: 'Ext.grid.GridPanel',
+ alias: 'widget.pveBackedGuests',
+
+ textfilter: '',
+
+ columns: [
+ {
+ header: gettext('Type'),
+ dataIndex: "type",
+ renderer: PVE.Utils.render_resource_type,
+ flex: 1,
+ sortable: true,
+ },
+ {
+ header: gettext('VMID'),
+ dataIndex: 'vmid',
+ flex: 1,
+ sortable: true,
+ },
+ {
+ header: gettext('Name'),
+ dataIndex: 'name',
+ flex: 2,
+ sortable: true,
+ },
+ ],
+
+ initComponent: function() {
+ let me = this;
+
+ me.store.clearFilter(true);
+
+ Ext.apply(me, {
+ stateful: true,
+ stateId: 'grid-dc-backed-guests',
+ tbar: [
+ '->',
+ gettext('Search') + ':', ' ',
+ {
+ xtype: 'textfield',
+ width: 200,
+ emptyText: 'Name, VMID, Type',
+ enableKeyEvents: true,
+ listeners: {
+ buffer: 500,
+ keyup: function(field) {
+ let searchValue = field.getValue();
+ searchValue = searchValue.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 v = record.data[property].toString();
+ if (v !== undefined) {
+ v = v.toLowerCase();
+ if (v.includes(searchValue)) {
+ match = true;
+ return;
+ }
+ }
+ });
+ return match;
+ });
+ }
+ }
+ }
+ ],
+ viewConfig: {
+ stripeRows: true,
+ trackOver: false,
+ },
+ });
+ me.callParent();
+ },
+});
+
Ext.define('PVE.dc.BackupView', {
extend: 'Ext.grid.GridPanel',
}
});
+ var not_backed_store = new Ext.data.Store({
+ sorters: 'vmid',
+ proxy:{
+ type: 'proxmox',
+ url: 'api2/json/cluster/backupinfo/not_backed_up',
+ },
+ });
+
var 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);
+ }
+ },
+ });
};
var sm = Ext.create('Ext.selection.RowModel', {});
};
var run_detail = function() {
+ let me = this;
let record = sm.getSelection()[0]
if (!record) {
return;
}
- var me = this;
- var infoview = Ext.create('PVE.dc.BackupInfo', {
+ let infoview = Ext.create('PVE.dc.BackupInfo', {
flex: 0,
layout: 'fit',
record: record.data,
});
- var disktree = Ext.create('PVE.dc.BackupDiskTree', {
+ let disktree = Ext.create('PVE.dc.BackupDiskTree', {
title: gettext('Included disks'),
flex: 1,
jobid: record.data.id,
});
- var win = Ext.create('Ext.window.Window', {
+ Ext.create('Ext.window.Window', {
modal: true,
- width: 600,
- height: 500,
+ width: 800,
+ height: 600,
stateful: true,
stateId: 'backup-detail-view',
resizable: true,
}));
};
+ 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', {
+ 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: [backedinfo],
+ }]
+ }).show();
+ };
+
var edit_btn = new Proxmox.button.Button({
text: gettext('Edit'),
disabled: true,
});
var detail_btn = new Proxmox.button.Button({
- text: gettext('Detail'),
+ text: gettext('Job Detail'),
disabled: true,
tooltip: gettext('Show job details and which guests and volumes are affected by the backup job'),
selModel: sm,
handler: run_detail,
});
+ var not_backed_warning = 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({
+ text: gettext('Show'),
+ hidden: true,
+ handler: run_show_not_backed,
+ });
+
Proxmox.Utils.monStoreErrors(me, store);
Ext.apply(me, {
detail_btn,
'-',
run_btn,
- '-',
+ '->',
+ not_backed_warning,
+ not_backed_btn,
],
columns: [
{