]>
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); | |
2774566b | 49 | let canDownload = rec.data['crypt-mode'] !== 'encrypt'; |
98425309 | 50 | me.lookup('encryptedHint').setVisible(!canDownload); |
2774566b | 51 | me.lookup('signedHint').setVisible(rec.data['crypt-mode'] === 'sign-only'); |
98425309 DC |
52 | me.lookup('downloadBtn').setDisabled(!canDownload); |
53 | }, | |
54 | ||
55 | init: function(view) { | |
56 | let me = this; | |
57 | if (!view.baseurl) { | |
58 | throw "no baseurl given"; | |
59 | } | |
60 | ||
61 | if (!view.params) { | |
62 | throw "no params given"; | |
63 | } | |
64 | ||
65 | if (!view.files) { | |
66 | throw "no files given"; | |
67 | } | |
68 | ||
69 | me.lookup('file').getStore().loadData(view.files, false); | |
70 | }, | |
71 | ||
72 | control: { | |
73 | 'proxmoxComboGrid': { | |
65b0cea6 | 74 | change: 'changeFile', |
98425309 DC |
75 | }, |
76 | 'button': { | |
77 | click: 'downloadFile', | |
65b0cea6 | 78 | }, |
98425309 DC |
79 | }, |
80 | }, | |
81 | ||
82 | items: [ | |
83 | { | |
84 | xtype: 'proxmoxComboGrid', | |
85 | valueField: 'filename', | |
86 | allowBlank: false, | |
87 | displayField: 'filename', | |
88 | reference: 'file', | |
89 | emptyText: gettext('No file selected'), | |
90 | fieldLabel: gettext('File'), | |
91 | store: { | |
65b0cea6 | 92 | fields: ['filename', 'size', 'crypt-mode'], |
98425309 DC |
93 | idProperty: ['filename'], |
94 | }, | |
95 | listConfig: { | |
96 | emptyText: gettext('No Data'), | |
97 | columns: [ | |
98 | { | |
99 | text: gettext('Filename'), | |
100 | dataIndex: 'filename', | |
101 | renderer: Ext.String.htmlEncode, | |
102 | flex: 1, | |
103 | }, | |
104 | { | |
105 | text: gettext('Size'), | |
106 | dataIndex: 'size', | |
107 | renderer: val => val === undefined ? '' : Proxmox.Utils.format_size(val), | |
108 | }, | |
109 | { | |
110 | text: gettext('Encrypted'), | |
2774566b DC |
111 | dataIndex: 'crypt-mode', |
112 | renderer: function(value) { | |
113 | let mode = -1; | |
114 | if (value !== undefined) { | |
115 | mode = PBS.Utils.cryptmap.indexOf(value); | |
116 | } | |
117 | return PBS.Utils.cryptText[mode] || Proxmox.Utils.unknownText; | |
65b0cea6 | 118 | }, |
98425309 DC |
119 | }, |
120 | ], | |
121 | }, | |
122 | }, | |
2774566b DC |
123 | { |
124 | xtype: 'displayfield', | |
125 | userCls: 'pmx-hint', | |
126 | reference: 'signedHint', | |
127 | hidden: true, | |
128 | value: gettext('Note: Signatures of signed files will not be verified on the server. Please use the client to do this.'), | |
129 | }, | |
98425309 DC |
130 | { |
131 | xtype: 'displayfield', | |
132 | userCls: 'pmx-hint', | |
133 | reference: 'encryptedHint', | |
134 | hidden: true, | |
135 | value: gettext('Encrypted Files cannot be decoded on the server directly. Please use the client where the decryption key is located.'), | |
65b0cea6 | 136 | }, |
98425309 DC |
137 | ], |
138 | ||
139 | buttons: [ | |
140 | { | |
141 | text: gettext('Download'), | |
142 | reference: 'downloadBtn', | |
143 | disabled: true, | |
144 | }, | |
145 | ], | |
146 | }); |