]>
Commit | Line | Data |
---|---|---|
98425309 DC |
1 | Ext.define('PBS.window.BackupFileDownloader', { |
2 | extend: 'Ext.window.Window', | |
3 | alias: 'widget.pbsBackupFileDownloader', | |
4 | ||
5 | title: gettext('Download Files'), | |
6 | bodyPadding: 10, | |
7 | ||
8 | width: 400, | |
9 | modal: true, | |
10 | resizable: false, | |
11 | ||
12 | layout: { | |
13 | type: 'vbox', | |
14 | align: 'stretch', | |
15 | }, | |
16 | ||
17 | controller: { | |
18 | xclass: 'Ext.app.ViewController', | |
19 | ||
20 | buildUrl: function(baseurl, params) { | |
21 | let url = new URL(baseurl, window.location.origin); | |
22 | for (const [key, value] of Object.entries(params)) { | |
23 | url.searchParams.append(key, value); | |
24 | } | |
25 | ||
26 | return url.href; | |
27 | }, | |
28 | ||
29 | downloadFile: function() { | |
30 | let me = this; | |
31 | let view = me.getView(); | |
32 | let combo = me.lookup('file'); | |
33 | let file = combo.getValue(); | |
34 | ||
35 | let idx = file.lastIndexOf('.'); | |
36 | let filename = file.slice(0, idx); | |
37 | let atag = document.createElement('a'); | |
38 | let params = view.params; | |
39 | params['file-name'] = file; | |
40 | atag.download = filename; | |
41 | atag.href = me.buildUrl(`${view.baseurl}/download-decoded`, params); | |
42 | atag.click(); | |
43 | }, | |
44 | ||
45 | changeFile: function(comob, value) { | |
46 | let me = this; | |
47 | let combo = me.lookup('file'); | |
48 | let rec = combo.getStore().findRecord('filename', value, 0, false, true, true); | |
49 | let canDownload = !rec.data.encrypted; | |
50 | me.lookup('encryptedHint').setVisible(!canDownload); | |
51 | me.lookup('downloadBtn').setDisabled(!canDownload); | |
52 | }, | |
53 | ||
54 | init: function(view) { | |
55 | let me = this; | |
56 | if (!view.baseurl) { | |
57 | throw "no baseurl given"; | |
58 | } | |
59 | ||
60 | if (!view.params) { | |
61 | throw "no params given"; | |
62 | } | |
63 | ||
64 | if (!view.files) { | |
65 | throw "no files given"; | |
66 | } | |
67 | ||
68 | me.lookup('file').getStore().loadData(view.files, false); | |
69 | }, | |
70 | ||
71 | control: { | |
72 | 'proxmoxComboGrid': { | |
73 | change: 'changeFile' | |
74 | }, | |
75 | 'button': { | |
76 | click: 'downloadFile', | |
77 | } | |
78 | }, | |
79 | }, | |
80 | ||
81 | items: [ | |
82 | { | |
83 | xtype: 'proxmoxComboGrid', | |
84 | valueField: 'filename', | |
85 | allowBlank: false, | |
86 | displayField: 'filename', | |
87 | reference: 'file', | |
88 | emptyText: gettext('No file selected'), | |
89 | fieldLabel: gettext('File'), | |
90 | store: { | |
91 | fields: ['filename', 'size', 'encrypted',], | |
92 | idProperty: ['filename'], | |
93 | }, | |
94 | listConfig: { | |
95 | emptyText: gettext('No Data'), | |
96 | columns: [ | |
97 | { | |
98 | text: gettext('Filename'), | |
99 | dataIndex: 'filename', | |
100 | renderer: Ext.String.htmlEncode, | |
101 | flex: 1, | |
102 | }, | |
103 | { | |
104 | text: gettext('Size'), | |
105 | dataIndex: 'size', | |
106 | renderer: val => val === undefined ? '' : Proxmox.Utils.format_size(val), | |
107 | }, | |
108 | { | |
109 | text: gettext('Encrypted'), | |
110 | dataIndex: 'encrypted', | |
111 | renderer: Proxmox.Utils.format_boolean, | |
112 | }, | |
113 | ], | |
114 | }, | |
115 | }, | |
116 | { | |
117 | xtype: 'displayfield', | |
118 | userCls: 'pmx-hint', | |
119 | reference: 'encryptedHint', | |
120 | hidden: true, | |
121 | value: gettext('Encrypted Files cannot be decoded on the server directly. Please use the client where the decryption key is located.'), | |
122 | } | |
123 | ], | |
124 | ||
125 | buttons: [ | |
126 | { | |
127 | text: gettext('Download'), | |
128 | reference: 'downloadBtn', | |
129 | disabled: true, | |
130 | }, | |
131 | ], | |
132 | }); |