Skip to content

Commit b6e2423

Browse files
committed
Add uploading a directory and its contents
This only works for one top level directory at a time.
1 parent 4b1d1fd commit b6e2423

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

supervisor/shared/web_workflow/static/directory.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ <h1><a href="/"><img src="/favicon.ico"/></a>&nbsp;<span id="path"></span></h1>
1616
<tbody></tbody>
1717
</table>
1818
<hr>
19-
<input type="file" id="files" multiple><button type="submit" id="upload">Upload</button>
19+
<input type="file" id="files" multiple>
20+
<input type="file" id="dirs" multiple webkitdirectory>
21+
<button type="submit" id="upload">Upload</button>
2022
<hr>
2123
+📁&nbsp;<input type="text" id="name"><button type="submit" id="mkdir">Create Directory</button>
2224
</body></html>

supervisor/shared/web_workflow/static/directory.js

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
let new_directory_name = document.getElementById("name");
22
let files = document.getElementById("files");
3+
let dirs = document.getElementById("dirs");
34

45
var url_base = window.location;
56
var current_path;
@@ -148,8 +149,21 @@ async function mkdir(e) {
148149
}
149150

150151
async function upload(e) {
151-
for (const file of files.files) {
152-
let file_path = new URL("/fs" + current_path + file.name, url_base);
152+
let made_dirs = new Set();
153+
for (const file of [...files.files, ...dirs.files]) {
154+
let file_name = file.name;
155+
if (file.webkitRelativePath) {
156+
file_name = file.webkitRelativePath;
157+
let components = file_name.split("/");
158+
components.pop();
159+
let parent_dir = components.join("/");
160+
if (!made_dirs.has(parent_dir)) {
161+
new_directory_name.value = parent_dir;
162+
await mkdir(null);
163+
made_dirs.add(parent_dir);
164+
}
165+
}
166+
let file_path = new URL("/fs" + current_path + file_name, url_base);
153167
const response = await fetch(file_path,
154168
{
155169
method: "PUT",
@@ -165,6 +179,7 @@ async function upload(e) {
165179
}
166180
}
167181
files.value = "";
182+
dirs.value = "";
168183
upload_button.disabled = true;
169184
}
170185

@@ -196,10 +211,14 @@ mkdir_button.onclick = mkdir;
196211
let upload_button = document.getElementById("upload");
197212
upload_button.onclick = upload;
198213

199-
upload_button.disabled = files.files.length == 0;
214+
upload_button.disabled = files.files.length == 0 && dirs.files.length == 0;
200215

201216
files.onchange = () => {
202-
upload_button.disabled = files.files.length == 0;
217+
upload_button.disabled = files.files.length == 0 && dirs.files.length == 0;
218+
}
219+
220+
dirs.onchange = () => {
221+
upload_button.disabled = files.files.length == 0 && dirs.files.length == 0;
203222
}
204223

205224
mkdir_button.disabled = new_directory_name.value.length == 0;

0 commit comments

Comments
 (0)