diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 06ca1251c..af8f6eb26 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -17,16 +17,16 @@ "filesize": "^10.1.4", "marked": "^13.0.3", "moment": "^2.30.1", - "pankow": "^1.7.0", + "pankow": "^1.7.2", "pankow-viewers": "^1.0.4", "superagent": "^9.0.2", - "vue": "^3.4.35", - "vue-i18n": "^9.13.1", - "vue-router": "^4.4.2" + "vue": "^3.4.38", + "vue-i18n": "^9.14.0", + "vue-router": "^4.4.3" }, "devDependencies": { "@vitejs/plugin-vue": "^5.1.2", - "vite": "^5.3.5" + "vite": "^5.4.1" } }, "node_modules/@babel/helper-string-parser": { @@ -454,12 +454,12 @@ } }, "node_modules/@intlify/core-base": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.13.1.tgz", - "integrity": "sha512-+bcQRkJO9pcX8d0gel9ZNfrzU22sZFSA0WVhfXrf5jdJOS24a+Bp8pozuS9sBI9Hk/tGz83pgKfmqcn/Ci7/8w==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.0.tgz", + "integrity": "sha512-zJn0imh9HIsZZUtt9v8T16PeVstPv6bP2YzlrYJwoF8F30gs4brZBwW2KK6EI5WYKFi3NeqX6+UU4gniz5TkGg==", "dependencies": { - "@intlify/message-compiler": "9.13.1", - "@intlify/shared": "9.13.1" + "@intlify/message-compiler": "9.14.0", + "@intlify/shared": "9.14.0" }, "engines": { "node": ">= 16" @@ -469,11 +469,11 @@ } }, "node_modules/@intlify/message-compiler": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.13.1.tgz", - "integrity": "sha512-SKsVa4ajYGBVm7sHMXd5qX70O2XXjm55zdZB3VeMFCvQyvLew/dLvq3MqnaIsTMF1VkkOb9Ttr6tHcMlyPDL9w==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.0.tgz", + "integrity": "sha512-sXNsoMI0YsipSXW8SR75drmVK56tnJHoYbPXUv2Cf9lz6FzvwsosFm6JtC1oQZI/kU+n7qx0qRrEWkeYFTgETA==", "dependencies": { - "@intlify/shared": "9.13.1", + "@intlify/shared": "9.14.0", "source-map-js": "^1.0.2" }, "engines": { @@ -484,9 +484,9 @@ } }, "node_modules/@intlify/shared": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.13.1.tgz", - "integrity": "sha512-u3b6BKGhE6j/JeRU6C/RL2FgyJfy6LakbtfeVF8fJXURpZZTzfh3e05J0bu0XPw447Q6/WUp3C4ajv4TMS4YsQ==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.0.tgz", + "integrity": "sha512-r+N8KRQL7LgN1TMTs1A2svfuAU0J94Wu9wWdJVJqYsoMMLIeJxrPjazihfHpmJqfgZq0ah3Y9Q4pgWV2O90Fyg==", "engines": { "node": ">= 16" }, @@ -696,36 +696,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.35.tgz", - "integrity": "sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.38.tgz", + "integrity": "sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.35", + "@vue/shared": "3.4.38", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.35.tgz", - "integrity": "sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz", + "integrity": "sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==", "dependencies": { - "@vue/compiler-core": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/compiler-core": "3.4.38", + "@vue/shared": "3.4.38" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.35.tgz", - "integrity": "sha512-xacnRS/h/FCsjsMfxBkzjoNxyxEyKyZfBch/P4vkLRvYJwe5ChXmZZrj8Dsed/752H2Q3JE8kYu9Uyha9J6PgA==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.38.tgz", + "integrity": "sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.35", - "@vue/compiler-dom": "3.4.35", - "@vue/compiler-ssr": "3.4.35", - "@vue/shared": "3.4.35", + "@vue/compiler-core": "3.4.38", + "@vue/compiler-dom": "3.4.38", + "@vue/compiler-ssr": "3.4.38", + "@vue/shared": "3.4.38", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.40", @@ -733,12 +733,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.35.tgz", - "integrity": "sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.38.tgz", + "integrity": "sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==", "dependencies": { - "@vue/compiler-dom": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/compiler-dom": "3.4.38", + "@vue/shared": "3.4.38" } }, "node_modules/@vue/devtools-api": { @@ -747,49 +747,49 @@ "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" }, "node_modules/@vue/reactivity": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.35.tgz", - "integrity": "sha512-Ggtz7ZZHakriKioveJtPlStYardwQH6VCs9V13/4qjHSQb/teE30LVJNrbBVs4+aoYGtTQKJbTe4CWGxVZrvEw==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.38.tgz", + "integrity": "sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==", "dependencies": { - "@vue/shared": "3.4.35" + "@vue/shared": "3.4.38" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.35.tgz", - "integrity": "sha512-D+BAjFoWwT5wtITpSxwqfWZiBClhBbR+bm0VQlWYFOadUUXFo+5wbe9ErXhLvwguPiLZdEF13QAWi2vP3ZD5tA==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.38.tgz", + "integrity": "sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==", "dependencies": { - "@vue/reactivity": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/reactivity": "3.4.38", + "@vue/shared": "3.4.38" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.35.tgz", - "integrity": "sha512-yGOlbos+MVhlS5NWBF2HDNgblG8e2MY3+GigHEyR/dREAluvI5tuUUgie3/9XeqhPE4LF0i2wjlduh5thnfOqw==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.38.tgz", + "integrity": "sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==", "dependencies": { - "@vue/reactivity": "3.4.35", - "@vue/runtime-core": "3.4.35", - "@vue/shared": "3.4.35", + "@vue/reactivity": "3.4.38", + "@vue/runtime-core": "3.4.38", + "@vue/shared": "3.4.38", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.35.tgz", - "integrity": "sha512-iZ0e/u9mRE4T8tNhlo0tbA+gzVkgv8r5BX6s1kRbOZqfpq14qoIvCZ5gIgraOmYkMYrSEZgkkojFPr+Nyq/Mnw==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.38.tgz", + "integrity": "sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==", "dependencies": { - "@vue/compiler-ssr": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/compiler-ssr": "3.4.38", + "@vue/shared": "3.4.38" }, "peerDependencies": { - "vue": "3.4.35" + "vue": "3.4.38" } }, "node_modules/@vue/shared": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.35.tgz", - "integrity": "sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==" + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.38.tgz", + "integrity": "sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==" }, "node_modules/@xterm/addon-attach": { "version": "0.11.0", @@ -1249,9 +1249,9 @@ } }, "node_modules/pankow": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pankow/-/pankow-1.7.0.tgz", - "integrity": "sha512-I2sZOjW7yuq3sSM1RQVDlWM8yBm9P159/CaQF53UW4/YSmZOr7q90FOP3ADiEM5j+vpz80yLIDOIIB9M+iYAuA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/pankow/-/pankow-1.7.2.tgz", + "integrity": "sha512-fucWdciJquHfu6EcydtZpUNXqkFpluE4iPP+8VdzqDKR+yjuiIRZCau2vaDWGzoSg3Fh8rTCnPDF43lP6MFRtw==", "dependencies": { "@fontsource/noto-sans": "^5.0.22", "@fortawesome/fontawesome-free": "^6.6.0", @@ -1273,9 +1273,9 @@ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "funding": [ { "type": "opencollective", @@ -1414,13 +1414,13 @@ } }, "node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", + "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==", "dev": true, "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", + "postcss": "^8.4.41", "rollup": "^4.13.0" }, "bin": { @@ -1440,6 +1440,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -1457,6 +1458,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -1469,15 +1473,15 @@ } }, "node_modules/vue": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.35.tgz", - "integrity": "sha512-+fl/GLmI4GPileHftVlCdB7fUL4aziPcqTudpTGXCT8s+iZWuOCeNEB5haX6Uz2IpRrbEXOgIFbe+XciCuGbNQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.38.tgz", + "integrity": "sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==", "dependencies": { - "@vue/compiler-dom": "3.4.35", - "@vue/compiler-sfc": "3.4.35", - "@vue/runtime-dom": "3.4.35", - "@vue/server-renderer": "3.4.35", - "@vue/shared": "3.4.35" + "@vue/compiler-dom": "3.4.38", + "@vue/compiler-sfc": "3.4.38", + "@vue/runtime-dom": "3.4.38", + "@vue/server-renderer": "3.4.38", + "@vue/shared": "3.4.38" }, "peerDependencies": { "typescript": "*" @@ -1489,12 +1493,12 @@ } }, "node_modules/vue-i18n": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.13.1.tgz", - "integrity": "sha512-mh0GIxx0wPtPlcB1q4k277y0iKgo25xmDPWioVVYanjPufDBpvu5ySTjP5wOrSvlYQ2m1xI+CFhGdauv/61uQg==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.0.tgz", + "integrity": "sha512-LxmpRuCt2rI8gqU+kxeflRZMQn4D5+4M3oP3PWZdowW/ePJraHqhF7p4CuaME52mUxdw3Mmy2yAUKgfZYgCRjA==", "dependencies": { - "@intlify/core-base": "9.13.1", - "@intlify/shared": "9.13.1", + "@intlify/core-base": "9.14.0", + "@intlify/shared": "9.14.0", "@vue/devtools-api": "^6.5.0" }, "engines": { @@ -1508,9 +1512,9 @@ } }, "node_modules/vue-router": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.2.tgz", - "integrity": "sha512-1qNybkn2L7QsLzaXs8nvlQmRKp8XF8DCxZys/Jr1JpQcHsKUxTKzTxCVA1G7NfBfwRIBgCJPoujOG5lHCCNUxw==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.3.tgz", + "integrity": "sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==", "dependencies": { "@vue/devtools-api": "^6.6.3" }, diff --git a/frontend/package.json b/frontend/package.json index fa0cc1eee..5ebb80b54 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,15 +18,15 @@ "filesize": "^10.1.4", "marked": "^13.0.3", "moment": "^2.30.1", - "pankow": "^1.7.0", + "pankow": "^1.7.2", "pankow-viewers": "^1.0.4", "superagent": "^9.0.2", - "vue": "^3.4.35", - "vue-i18n": "^9.13.1", - "vue-router": "^4.4.2" + "vue": "^3.4.38", + "vue-i18n": "^9.14.0", + "vue-router": "^4.4.3" }, "devDependencies": { "@vitejs/plugin-vue": "^5.1.2", - "vite": "^5.3.5" + "vite": "^5.4.1" } } diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index 6f57d30e4..f52c4ca08 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -292,36 +292,78 @@ export default { async onDrop(targetFolder, dataTransfer, files) { const fullTargetFolder = sanitize(this.cwd + '/' + targetFolder); + console.log('---') + console.log(dataTransfer) + // return; + + // if dataTransfer is set, we have a file/folder drop from outside if (dataTransfer) { - // figure if a folder was dropped on a modern browser, in this case the first would have to be a directory - let folderItem; - try { - folderItem = dataTransfer.items[0].webkitGetAsEntry(); - if (folderItem.isFile) return this.$refs.fileUploader.addFiles(dataTransfer.files, fullTargetFolder, false); - } catch (e) { - return this.$refs.fileUploader.addFiles(dataTransfer.files, fullTargetFolder, false); + + async function getFile(entry) { + return new Promise((resolve, reject) => { + entry.file(resolve, reject); + }); + } + + const fileList = []; + async function traverseFileTree(item, path) { + return new Promise(async (resolve, reject) => { + if (item.isFile) { + item.file((file) => { + fileList.push(file); + resolve(); + }, reject); + } else if (item.isDirectory) { + // Get folder contents + const dirReader = item.createReader(); + const entries = await new Promise((resolve, reject) => { dirReader.readEntries(resolve, reject); }); + + for (let i in entries) { + await traverseFileTree(entries[i], item.name); + } + + resolve(); + } else { + console.log('Skipping uknown file type', item); + resolve(); + } + }); } // if we got here we have a folder drop and a modern browser // now traverse the folder tree and create a file list - var that = this; - function traverseFileTree(item, path) { - if (item.isFile) { - item.file(function (file) { - that.$refs.fileUploader.addFiles([file], sanitize(`${that.cwd}/${targetFolder}`), false); - }); - } else if (item.isDirectory) { - // Get folder contents - var dirReader = item.createReader(); - dirReader.readEntries(function (entries) { - for (let i in entries) { - traverseFileTree(entries[i], item.name); - } - }); - } - } + await traverseFileTree(folderItem, ''); + this.$refs.fileUploader.addFiles(fileList, sanitize(`${this.cwd}/${targetFolder}`)); - traverseFileTree(folderItem, ''); + // // figure if a folder was dropped on a modern browser, in this case the first would have to be a directory + // let folderItem; + // try { + // folderItem = dataTransfer.items[0].webkitGetAsEntry(); + // if (folderItem.isFile) return this.$refs.fileUploader.addFiles(dataTransfer.files, fullTargetFolder, false); + // } catch (e) { + // return this.$refs.fileUploader.addFiles(dataTransfer.files, fullTargetFolder, false); + // } + + // // if we got here we have a folder drop and a modern browser + // // now traverse the folder tree and create a file list + // var that = this; + // function traverseFileTree(item, path) { + // if (item.isFile) { + // item.file(function (file) { + // that.$refs.fileUploader.addFiles([file], sanitize(`${that.cwd}/${targetFolder}`), false); + // }); + // } else if (item.isDirectory) { + // // Get folder contents + // var dirReader = item.createReader(); + // dirReader.readEntries(function (entries) { + // for (let i in entries) { + // traverseFileTree(entries[i], item.name); + // } + // }); + // } + // } + + // traverseFileTree(folderItem, ''); } else { if (!files.length) return;