]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/window/FileBrowser.js
1 Ext
.define('proxmox-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
47 return `fa fa-${icon}`;
51 idProperty
: 'filepath',
54 Ext
.define("Proxmox.window.FileBrowser", {
55 extend
: "Ext.window.Window",
63 // the base-URL to get the list of files. required.
66 // the base download URL, e.g., something like '/api2/...'
69 // extra parameters set as proxy paramns and for an actual download request
72 // the file types for which the download button should be enabled
73 downloadableFileTypes
: {
74 'h': true, // hardlinks
75 'f': true, // "normal" files
76 'd': true, // directories
81 xclass
: 'Ext.app.ViewController',
83 buildUrl: function(baseurl
, params
) {
84 let url
= new URL(baseurl
, window
.location
.origin
);
85 for (const [key
, value
] of Object
.entries(params
)) {
86 url
.searchParams
.append(key
, value
);
92 downloadFile: function() {
94 let view
= me
.getView();
95 let tree
= me
.lookup('tree');
96 let selection
= tree
.getSelection();
97 if (!selection
|| selection
.length
< 1) return;
99 let data
= selection
[0].data
;
101 let atag
= document
.createElement('a');
103 atag
.download
= data
.text
;
104 let params
= { ...view
.extraParams
};
105 params
.filepath
= data
.filepath
;
106 atag
.download
= data
.text
;
107 if (data
.type
=== 'd') {
108 atag
.download
+= ".zip";
110 atag
.href
= me
.buildUrl(view
.downloadURL
, params
);
114 fileChanged: function() {
116 let view
= me
.getView();
117 let tree
= me
.lookup('tree');
118 let selection
= tree
.getSelection();
119 if (!selection
|| selection
.length
< 1) return;
121 let data
= selection
[0].data
;
122 let canDownload
= view
.downloadURL
&& view
.downloadableFileTypes
[data
.type
];
123 me
.lookup('downloadBtn').setDisabled(!canDownload
);
126 init: function(view
) {
128 let tree
= me
.lookup('tree');
131 throw "no list URL given";
134 let store
= tree
.getStore();
135 let proxy
= store
.getProxy();
137 Proxmox
.Utils
.monStoreErrors(tree
, store
, true);
138 proxy
.setUrl(view
.listURL
);
139 proxy
.setExtraParams(view
.extraParams
);
141 let root
= store
.getRoot();
142 root
.expand(); // always expand invisible root node
144 let child
= root
.findChild('text', view
.archive
);
147 setTimeout(function() {
148 tree
.setSelection(child
);
149 tree
.getView().focusRow(child
);
152 } else if (root
.childNodes
.length
=== 1) {
153 root
.firstChild
.expand();
160 selectionchange
: 'fileChanged',
174 model
: 'proxmox-file-tree',
176 nodeParam
: 'filepath',
186 text
: gettext('Name'),
190 renderer
: Ext
.String
.htmlEncode
,
193 text
: gettext('Size'),
195 renderer
: value
=> value
=== undefined ? '' : Proxmox
.Utils
.format_size(value
),
197 sorterFn: function(a
, b
) {
198 let asize
= a
.data
.size
|| 0;
199 let bsize
= b
.data
.size
|| 0;
201 return asize
- bsize
;
206 text
: gettext('Modified'),
211 text
: gettext('Type'),
213 renderer: function(value
) {
215 case 'b': return gettext('Block Device');
216 case 'c': return gettext('Character Device');
217 case 'd': return gettext('Directory');
218 case 'f': return gettext('File');
219 case 'h': return gettext('Hardlink');
220 case 'l': return gettext('Softlink');
221 case 'p': return gettext('Pipe/Fifo');
222 case 's': return gettext('Socket');
223 case 'v': return gettext('Virtual');
224 default: return Proxmox
.Utils
.unknownText
;
234 text
: gettext('Download'),
235 handler
: 'downloadFile',
236 reference
: 'downloadBtn',