]>
git.proxmox.com Git - proxmox-backup.git/blob - www/window/FileBrowser.js
1 Ext
.define('pbs-file-tree', {
2 extend
: 'Ext.data.Model',
4 fields
: ['filepath', 'text', 'type', 'size',
8 dateFormat
: 'timestamp',
12 calculate: function(data
) {
15 case 'b': // block device
18 case 'c': // char device
22 icon
= data
.expanded
? 'folder-open-o' : 'folder-o';
24 case 'f': //regular file
33 case 'p': // pipe/fifo
44 return `fa fa-${icon}`;
48 idProperty
: 'filepath',
51 Ext
.define("PBS.window.FileBrowser", {
52 extend
: "Ext.window.Window",
60 xclass
: 'Ext.app.ViewController',
62 buildUrl: function(baseurl
, params
) {
63 let url
= new URL(baseurl
, window
.location
.origin
);
64 for (const [key
, value
] of Object
.entries(params
)) {
65 url
.searchParams
.append(key
, value
);
71 downloadFile: function() {
73 let view
= me
.getView();
74 let tree
= me
.lookup('tree');
75 let selection
= tree
.getSelection();
76 if (!selection
|| selection
.length
< 1) return;
78 let data
= selection
[0].data
;
80 let atag
= document
.createElement('a');
82 atag
.download
= data
.text
;
84 'backup-id': view
['backup-id'],
85 'backup-type': view
['backup-type'],
86 'backup-time': view
['backup-time'],
88 params
.filepath
= data
.filepath
;
89 atag
.download
= data
.text
;
90 if (data
.type
=== 'd') {
91 atag
.download
+= ".zip";
94 .buildUrl(`/api2/json/admin/datastore/${view.datastore}/pxar-file-download`, params
);
98 fileChanged: function() {
100 let tree
= me
.lookup('tree');
101 let selection
= tree
.getSelection();
102 if (!selection
|| selection
.length
< 1) return;
104 let data
= selection
[0].data
;
106 let canDownload
= false;
113 if (data
.depth
> 1) {
120 me
.lookup('downloadBtn').setDisabled(!canDownload
);
123 init: function(view
) {
125 let tree
= me
.lookup('tree');
127 if (!view
['backup-id']) {
128 throw "no backup-id given";
131 if (!view
['backup-type']) {
132 throw "no backup-id given";
135 if (!view
['backup-time']) {
136 throw "no backup-id given";
139 if (!view
.datastore
) {
140 throw "no datastore given";
143 let store
= tree
.getStore();
144 let proxy
= store
.getProxy();
146 Proxmox
.Utils
.monStoreErrors(tree
, store
, true);
147 proxy
.setUrl(`/api2/json/admin/datastore/${view.datastore}/catalog`);
148 proxy
.setExtraParams({
149 'backup-id': view
['backup-id'],
150 'backup-type': view
['backup-type'],
151 'backup-time': view
['backup-time'],
154 let root
= store
.getRoot();
155 root
.expand(); // always expand invisible root node
157 let child
= root
.findChild('text', view
.archive
);
160 setTimeout(function() {
161 tree
.setSelection(child
);
162 tree
.getView().focusRow(child
);
165 } else if (root
.childNodes
.length
=== 1) {
166 root
.firstChild
.expand();
173 selectionchange
: 'fileChanged',
187 model
: 'pbs-file-tree',
189 nodeParam
: 'filepath',
199 text
: gettext('Name'),
203 renderer
: Ext
.String
.htmlEncode
,
206 text
: gettext('Size'),
208 renderer
: value
=> value
=== undefined ? '' : Proxmox
.Utils
.format_size(value
),
210 sorterFn: function(a
, b
) {
211 let asize
= a
.data
.size
|| 0;
212 let bsize
= b
.data
.size
|| 0;
214 return asize
- bsize
;
219 text
: gettext('Modified'),
224 text
: gettext('Type'),
226 renderer: function(value
) {
228 case 'b': return gettext('Block Device');
229 case 'c': return gettext('Character Device');
230 case 'd': return gettext('Directory');
231 case 'f': return gettext('File');
232 case 'h': return gettext('Hardlink');
233 case 'l': return gettext('Softlink');
234 case 'p': return gettext('Pipe/Fifo');
235 case 's': return gettext('Socket');
236 default: return Proxmox
.Utils
.unknownText
;
246 text
: gettext('Download'),
247 handler
: 'downloadFile',
248 reference
: 'downloadBtn',