proxmox-backup/www/datastore/Prune.js
Fabian Ebner 5eafe6aabc ui: prune: show which rule keeps backup
and adjust layout so the description fits.

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
2020-11-10 09:24:13 +01:00

244 lines
4.9 KiB
JavaScript

Ext.define('pbs-prune-list', {
extend: 'Ext.data.Model',
fields: [
'backup-type',
'backup-id',
{
name: 'backup-time',
type: 'date',
dateFormat: 'timestamp',
},
],
});
Ext.define('PBS.DataStorePruneInputPanel', {
extend: 'Proxmox.panel.InputPanel',
alias: 'widget.pbsDataStorePruneInputPanel',
mixins: ['Proxmox.Mixin.CBind'],
onGetValues: function(values) {
var me = this;
values["backup-type"] = me.backup_type;
values["backup-id"] = me.backup_id;
return values;
},
controller: {
xclass: 'Ext.app.ViewController',
init: function(view) {
if (!view.url) {
throw "no url specified";
}
if (!view.backup_type) {
throw "no backup_type specified";
}
if (!view.backup_id) {
throw "no backup_id specified";
}
this.reload(); // initial load
},
reload: function() {
var view = this.getView();
// helper to allow showing why a backup is kept
let addKeepReasons = function(backups, params) {
const rules = [
'keep-last',
'keep-hourly',
'keep-daily',
'keep-weekly',
'keep-monthly',
'keep-yearly',
'keep-all', // when all keep options are not set
];
let counter = {};
backups.sort(function(a, b) {
return a["backup-time"] < b["backup-time"];
});
let ruleIndex = -1;
let nextRule = function() {
let rule;
do {
ruleIndex++;
rule = rules[ruleIndex];
} while (!params[rule] && rule !== 'keep-all');
counter[rule] = 0;
return rule;
};
let rule = nextRule();
for (let backup of backups) {
if (backup.keep) {
counter[rule]++;
backup.keepReason = rule;
if (rule !== 'keep-all' && counter[rule] >= params[rule]) {
rule = nextRule();
}
}
}
};
let params = view.getValues();
params["dry-run"] = true;
Proxmox.Utils.API2Request({
url: view.url,
method: "POST",
params: params,
callback: function() {
// for easy breakpoint setting
},
failure: function(response, opts) {
Ext.Msg.alert(gettext('Error'), response.htmlStatus);
},
success: function(response, options) {
var data = response.result.data;
addKeepReasons(data, params);
view.prune_store.setData(data);
},
});
},
control: {
field: { change: 'reload' },
},
},
column1: [
{
xtype: 'proxmoxintegerfield',
name: 'keep-last',
allowBlank: true,
fieldLabel: gettext('keep-last'),
minValue: 1,
},
{
xtype: 'proxmoxintegerfield',
name: 'keep-hourly',
allowBlank: true,
fieldLabel: gettext('keep-hourly'),
minValue: 1,
},
{
xtype: 'proxmoxintegerfield',
name: 'keep-daily',
allowBlank: true,
fieldLabel: gettext('keep-daily'),
minValue: 1,
},
{
xtype: 'proxmoxintegerfield',
name: 'keep-weekly',
allowBlank: true,
fieldLabel: gettext('keep-weekly'),
minValue: 1,
},
{
xtype: 'proxmoxintegerfield',
name: 'keep-monthly',
allowBlank: true,
fieldLabel: gettext('keep-monthly'),
minValue: 1,
},
{
xtype: 'proxmoxintegerfield',
name: 'keep-yearly',
allowBlank: true,
fieldLabel: gettext('keep-yearly'),
minValue: 1,
},
],
initComponent: function() {
var me = this;
me.prune_store = Ext.create('Ext.data.Store', {
model: 'pbs-prune-list',
sorters: { property: 'backup-time', direction: 'DESC' },
});
me.column2 = [
{
xtype: 'grid',
height: 200,
store: me.prune_store,
columns: [
{
header: gettext('Backup Time'),
sortable: true,
dataIndex: 'backup-time',
renderer: function(value, metaData, record) {
let text = Ext.Date.format(value, 'Y-m-d H:i:s');
if (record.data.keep) {
return text;
} else {
return '<div style="text-decoration: line-through;">'+ text +'</div>';
}
},
flex: 1,
},
{
text: "keep",
dataIndex: 'keep',
renderer: function(value, metaData, record) {
if (record.data.keep) {
return 'true (' + record.data.keepReason + ')';
} else {
return 'false';
}
},
flex: 1,
},
],
},
];
me.callParent();
},
});
Ext.define('PBS.DataStorePrune', {
extend: 'Proxmox.window.Edit',
method: 'POST',
submitText: "Prune",
isCreate: true,
fieldDefaults: { labelWidth: 120 },
initComponent: function() {
var me = this;
if (!me.datastore) {
throw "no datastore specified";
}
if (!me.backup_type) {
throw "no backup_type specified";
}
if (!me.backup_id) {
throw "no backup_id specified";
}
Ext.apply(me, {
url: '/api2/extjs/admin/datastore/' + me.datastore + "/prune",
title: "Prune Datastore '" + me.datastore + "'",
items: [{
xtype: 'pbsDataStorePruneInputPanel',
url: '/api2/extjs/admin/datastore/' + me.datastore + "/prune",
backup_type: me.backup_type,
backup_id: me.backup_id,
}],
});
me.callParent();
},
});