diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 36ad601ab..e0b830544 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -17,7 +17,7 @@ "filesize": "^10.1.1", "marked": "^12.0.1", "moment": "^2.30.1", - "pankow": "^1.3.0", + "pankow": "^1.3.1", "primeicons": "^6.0.1", "primevue": "^3.50.0", "superagent": "^8.1.2", @@ -1593,9 +1593,9 @@ } }, "node_modules/pankow": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pankow/-/pankow-1.3.0.tgz", - "integrity": "sha512-eZT0QjXD334V6v/ft0qN2SXZR+XyVpe0RTgM4140Bj9skYaIRC4rwB8hV5bUldi4CgOyicZ0EtlEbyhW8Ihk7w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pankow/-/pankow-1.3.1.tgz", + "integrity": "sha512-+HYBLx7UVBE8FJlkT27V/MUxf61FW1uqKB6F/m7PKPpJKgOYYafoUIAeUMQUGsAZhaf113P5quF1mHGPmpHkzQ==", "dependencies": { "@fortawesome/fontawesome-free": "^6.5.1", "filesize": "^10.1.1", diff --git a/frontend/package.json b/frontend/package.json index df40f34bc..49992ebd2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,7 +15,7 @@ "filesize": "^10.1.1", "marked": "^12.0.1", "moment": "^2.30.1", - "pankow": "^1.3.0", + "pankow": "^1.3.1", "primeicons": "^6.0.1", "primevue": "^3.50.0", "superagent": "^8.1.2", diff --git a/frontend/src/models/DirectoryModel.js b/frontend/src/models/DirectoryModel.js index ac4845a95..03107d94d 100644 --- a/frontend/src/models/DirectoryModel.js +++ b/frontend/src/models/DirectoryModel.js @@ -67,11 +67,11 @@ export function createDirectoryModel(origin, accessToken, api) { return result.body.entries; }, - async upload(targetDir, file, progressHandler) { + upload(targetDir, file, progressHandler) { // file may contain a file name or a file path + file name const relativefilePath = (file.webkitRelativePath ? file.webkitRelativePath : file.name); - await superagent.post(`${origin}/api/v1/${api}/files/${encodeURIComponent(sanitize(targetDir + '/' + relativefilePath))}`) + return superagent.post(`${origin}/api/v1/${api}/files/${encodeURIComponent(sanitize(targetDir + '/' + relativefilePath))}`) .query({ access_token: accessToken }) .attach('file', file) .on('progress', progressHandler); diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index 247bb8d73..c8cbb1ac2 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -107,6 +107,7 @@ @@ -131,6 +132,7 @@ import ProgressSpinner from 'primevue/progressspinner'; import { useConfirm } from 'primevue/useconfirm'; import { DirectoryView, TopBar, PathBreadcrumbs, BottomBar, MainLayout, FileUploader } from 'pankow'; +import Icon from 'pankow/components/Icon.vue'; import { sanitize, sleep } from 'pankow/utils'; import { ISTATES } from '../constants.js'; @@ -160,7 +162,8 @@ export default { PathBreadcrumbs, PreviewPanel, ProgressSpinner, - TopBar + TopBar, + Icon }, data() { return { @@ -188,6 +191,7 @@ export default { resourceType: '', resourceId: '', visible: true, + uploadRequest: null, newFileDialog: { visible: false, busy: false, @@ -233,6 +237,10 @@ export default { onUploadMenu(event) { this.$refs.uploadMenu.toggle(event); }, + onCancelUpload() { + if (!this.uploadRequest) return; + this.uploadRequest.abort(); + }, // generic dialog focus handler onDialogShow(focusElementId) { setTimeout(() => document.getElementById(focusElementId).focus(), 0); @@ -449,7 +457,16 @@ export default { this.extractInProgress = false; }, async uploadHandler(targetDir, file, progressHandler) { - await this.directoryModel.upload(targetDir, file, progressHandler); + this.uploadRequest = this.directoryModel.upload(targetDir, file, progressHandler); + + try { + await this.uploadRequest; + } catch (e) { + console.log('Upload cancelled.'); + } + + this.uploadRequest = null; + await this.loadCwd(); }, async loadCwd() { diff --git a/frontend/vite.config.js b/frontend/vite.config.js index f2b6e814d..ae8db75cf 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -8,7 +8,7 @@ export default defineConfig({ server: { fs: { // Allow serving files from one level up to the project root for monaco editor assets - allow: ['..'] + allow: [ '../..' ] }, }, // https://vitejs.dev/guide/build.html#multi-page-app