133 lines
2.9 KiB
JavaScript
133 lines
2.9 KiB
JavaScript
|
Ext.define('PBS.window.BackupFileDownloader', {
|
||
|
extend: 'Ext.window.Window',
|
||
|
alias: 'widget.pbsBackupFileDownloader',
|
||
|
|
||
|
title: gettext('Download Files'),
|
||
|
bodyPadding: 10,
|
||
|
|
||
|
width: 400,
|
||
|
modal: true,
|
||
|
resizable: false,
|
||
|
|
||
|
layout: {
|
||
|
type: 'vbox',
|
||
|
align: 'stretch',
|
||
|
},
|
||
|
|
||
|
controller: {
|
||
|
xclass: 'Ext.app.ViewController',
|
||
|
|
||
|
buildUrl: function(baseurl, params) {
|
||
|
let url = new URL(baseurl, window.location.origin);
|
||
|
for (const [key, value] of Object.entries(params)) {
|
||
|
url.searchParams.append(key, value);
|
||
|
}
|
||
|
|
||
|
return url.href;
|
||
|
},
|
||
|
|
||
|
downloadFile: function() {
|
||
|
let me = this;
|
||
|
let view = me.getView();
|
||
|
let combo = me.lookup('file');
|
||
|
let file = combo.getValue();
|
||
|
|
||
|
let idx = file.lastIndexOf('.');
|
||
|
let filename = file.slice(0, idx);
|
||
|
let atag = document.createElement('a');
|
||
|
let params = view.params;
|
||
|
params['file-name'] = file;
|
||
|
atag.download = filename;
|
||
|
atag.href = me.buildUrl(`${view.baseurl}/download-decoded`, params);
|
||
|
atag.click();
|
||
|
},
|
||
|
|
||
|
changeFile: function(comob, value) {
|
||
|
let me = this;
|
||
|
let combo = me.lookup('file');
|
||
|
let rec = combo.getStore().findRecord('filename', value, 0, false, true, true);
|
||
|
let canDownload = !rec.data.encrypted;
|
||
|
me.lookup('encryptedHint').setVisible(!canDownload);
|
||
|
me.lookup('downloadBtn').setDisabled(!canDownload);
|
||
|
},
|
||
|
|
||
|
init: function(view) {
|
||
|
let me = this;
|
||
|
if (!view.baseurl) {
|
||
|
throw "no baseurl given";
|
||
|
}
|
||
|
|
||
|
if (!view.params) {
|
||
|
throw "no params given";
|
||
|
}
|
||
|
|
||
|
if (!view.files) {
|
||
|
throw "no files given";
|
||
|
}
|
||
|
|
||
|
me.lookup('file').getStore().loadData(view.files, false);
|
||
|
},
|
||
|
|
||
|
control: {
|
||
|
'proxmoxComboGrid': {
|
||
|
change: 'changeFile'
|
||
|
},
|
||
|
'button': {
|
||
|
click: 'downloadFile',
|
||
|
}
|
||
|
},
|
||
|
},
|
||
|
|
||
|
items: [
|
||
|
{
|
||
|
xtype: 'proxmoxComboGrid',
|
||
|
valueField: 'filename',
|
||
|
allowBlank: false,
|
||
|
displayField: 'filename',
|
||
|
reference: 'file',
|
||
|
emptyText: gettext('No file selected'),
|
||
|
fieldLabel: gettext('File'),
|
||
|
store: {
|
||
|
fields: ['filename', 'size', 'encrypted',],
|
||
|
idProperty: ['filename'],
|
||
|
},
|
||
|
listConfig: {
|
||
|
emptyText: gettext('No Data'),
|
||
|
columns: [
|
||
|
{
|
||
|
text: gettext('Filename'),
|
||
|
dataIndex: 'filename',
|
||
|
renderer: Ext.String.htmlEncode,
|
||
|
flex: 1,
|
||
|
},
|
||
|
{
|
||
|
text: gettext('Size'),
|
||
|
dataIndex: 'size',
|
||
|
renderer: val => val === undefined ? '' : Proxmox.Utils.format_size(val),
|
||
|
},
|
||
|
{
|
||
|
text: gettext('Encrypted'),
|
||
|
dataIndex: 'encrypted',
|
||
|
renderer: Proxmox.Utils.format_boolean,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
xtype: 'displayfield',
|
||
|
userCls: 'pmx-hint',
|
||
|
reference: 'encryptedHint',
|
||
|
hidden: true,
|
||
|
value: gettext('Encrypted Files cannot be decoded on the server directly. Please use the client where the decryption key is located.'),
|
||
|
}
|
||
|
],
|
||
|
|
||
|
buttons: [
|
||
|
{
|
||
|
text: gettext('Download'),
|
||
|
reference: 'downloadBtn',
|
||
|
disabled: true,
|
||
|
},
|
||
|
],
|
||
|
});
|