From b5a4ef30031a97e27717be505ecdcbccff2a75a6 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Sun, 14 Jun 2026 23:12:46 +0200 Subject: [PATCH 1/9] chore: prepare migration of files to Vue 3 Signed-off-by: Ferdinand Thiessen --- build/frontend-legacy/webpack.modules.cjs | 9 - .../{frontend-legacy => frontend}/apps/files | 0 build/frontend/vite.config.ts | 9 + package-lock.json | 389 ++++++++++-------- package.json | 3 +- 5 files changed, 239 insertions(+), 171 deletions(-) rename build/{frontend-legacy => frontend}/apps/files (100%) diff --git a/build/frontend-legacy/webpack.modules.cjs b/build/frontend-legacy/webpack.modules.cjs index f560508674162..b0cad14a80c26 100644 --- a/build/frontend-legacy/webpack.modules.cjs +++ b/build/frontend-legacy/webpack.modules.cjs @@ -27,15 +27,6 @@ module.exports = { dashboard: { main: path.join(__dirname, 'apps/dashboard/src', 'main.js'), }, - files: { - sidebar: path.join(__dirname, 'apps/files/src', 'sidebar.ts'), - main: path.join(__dirname, 'apps/files/src', 'main.ts'), - init: path.join(__dirname, 'apps/files/src', 'init.ts'), - search: path.join(__dirname, 'apps/files/src/plugins/search', 'folderSearch.ts'), - 'settings-admin': path.join(__dirname, 'apps/files/src', 'main-settings-admin.ts'), - 'settings-personal': path.join(__dirname, 'apps/files/src', 'main-settings-personal.ts'), - 'reference-files': path.join(__dirname, 'apps/files/src', 'reference-files.ts'), - }, files_sharing: { additionalScripts: path.join(__dirname, 'apps/files_sharing/src', 'additionalScripts.js'), collaboration: path.join(__dirname, 'apps/files_sharing/src', 'collaborationresourceshandler.js'), diff --git a/build/frontend-legacy/apps/files b/build/frontend/apps/files similarity index 100% rename from build/frontend-legacy/apps/files rename to build/frontend/apps/files diff --git a/build/frontend/vite.config.ts b/build/frontend/vite.config.ts index c07ff0359b7c1..22df74f8ec6b9 100644 --- a/build/frontend/vite.config.ts +++ b/build/frontend/vite.config.ts @@ -33,6 +33,15 @@ const modules = { 'settings-admin': resolve(import.meta.dirname, 'apps/federatedfilesharing/src', 'settings-admin.ts'), 'settings-personal': resolve(import.meta.dirname, 'apps/federatedfilesharing/src', 'settings-personal.ts'), }, + files: { + sidebar: resolve(import.meta.dirname, 'apps/files/src', 'sidebar.ts'), + main: resolve(import.meta.dirname, 'apps/files/src', 'main.ts'), + init: resolve(import.meta.dirname, 'apps/files/src', 'init.ts'), + search: resolve(import.meta.dirname, 'apps/files/src/plugins/search', 'folderSearch.ts'), + 'settings-admicn': resolve(import.meta.dirname, 'apps/files/src', 'main-settings-admin.ts'), + 'settings-personal': resolve(import.meta.dirname, 'apps/files/src', 'main-settings-personal.ts'), + 'reference-files': resolve(import.meta.dirname, 'apps/files/src', 'reference-files.ts'), + }, files_external: { auth_rsa: resolve(import.meta.dirname, 'apps/files_external/src', 'auth-rsa.ts'), diff --git a/package-lock.json b/package-lock.json index 66c5ee75c2295..896f7be972565 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@nextcloud/capabilities": "^1.2.1", "@nextcloud/dialogs": "^7.4.0", "@nextcloud/event-bus": "^3.3.3", - "@nextcloud/files": "^4.0.0", + "@nextcloud/files": "^4.1.0-beta.0", "@nextcloud/initial-state": "^3.0.0", "@nextcloud/l10n": "^3.4.1", "@nextcloud/logger": "^3.0.3", @@ -34,6 +34,7 @@ "marked": "^17.0.1", "p-queue": "^9.2.0", "pinia": "^3.0.4", + "query-string": "^9.4.0", "sortablejs": "^1.15.7", "vue": "^3.5.35", "vue-router": "^5.0.6", @@ -856,7 +857,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -873,7 +873,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -890,7 +889,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -907,7 +905,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -924,7 +921,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -941,7 +937,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -958,7 +953,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -975,7 +969,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -992,7 +985,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1009,7 +1001,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1026,7 +1017,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1043,7 +1033,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1060,7 +1049,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1077,7 +1065,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1094,7 +1081,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1111,7 +1097,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1128,7 +1113,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1145,7 +1129,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1162,7 +1145,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1179,7 +1161,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1196,7 +1177,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1213,7 +1193,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1230,7 +1209,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1247,7 +1225,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1264,7 +1241,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1281,7 +1257,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2240,6 +2215,66 @@ "node": "^20 || ^22 || ^24" } }, + "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/files": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-4.0.0.tgz", + "integrity": "sha512-TmecnZIS+PGWGtRh7RpGEboCT4K6iTbHULUcfR6hs3eEzjDVsCc1Ldf8popGY/70lbpdlfYle8xbXnPIo3qaXA==", + "license": "AGPL-3.0-or-later", + "dependencies": { + "@nextcloud/auth": "^2.5.3", + "@nextcloud/capabilities": "^1.2.1", + "@nextcloud/l10n": "^3.4.1", + "@nextcloud/logger": "^3.0.3", + "@nextcloud/paths": "^3.0.0", + "@nextcloud/router": "^3.1.0", + "@nextcloud/sharing": "^0.3.0", + "is-svg": "^6.1.0", + "typescript-event-target": "^1.1.2", + "webdav": "^5.9.0" + }, + "engines": { + "node": "^24.0.0" + } + }, + "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/files/node_modules/@nextcloud/files": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.12.2.tgz", + "integrity": "sha512-vBo8tf3Xh6efiF8CrEo3pKj9AtvAF6RdDGO1XKL65IxV8+UUd9Uxl2lUExHlzoDRRczCqfGfaWfRRaFhYqce5Q==", + "license": "AGPL-3.0-or-later", + "optional": true, + "dependencies": { + "@nextcloud/auth": "^2.5.3", + "@nextcloud/capabilities": "^1.2.1", + "@nextcloud/l10n": "^3.4.1", + "@nextcloud/logger": "^3.0.3", + "@nextcloud/paths": "^3.0.0", + "@nextcloud/router": "^3.1.0", + "@nextcloud/sharing": "^0.3.0", + "cancelable-promise": "^4.3.1", + "is-svg": "^6.1.0", + "typescript-event-target": "^1.1.1", + "webdav": "^5.8.0" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + } + }, + "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/files/node_modules/@nextcloud/sharing": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.3.0.tgz", + "integrity": "sha512-kV7qeUZvd1fTKeFyH+W5Qq5rNOqG9rLATZM3U9MBxWXHJs3OxMqYQb8UQ3NYONzsX3zDGJmdQECIGHm1ei2sCA==", + "license": "GPL-3.0-or-later", + "dependencies": { + "@nextcloud/initial-state": "^3.0.0", + "is-svg": "^6.1.0" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + }, + "optionalDependencies": { + "@nextcloud/files": "^3.12.0" + } + }, "node_modules/@nextcloud/dialogs/node_modules/@vueuse/core": { "version": "14.3.0", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz", @@ -2346,63 +2381,27 @@ } }, "node_modules/@nextcloud/files": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-4.0.0.tgz", - "integrity": "sha512-TmecnZIS+PGWGtRh7RpGEboCT4K6iTbHULUcfR6hs3eEzjDVsCc1Ldf8popGY/70lbpdlfYle8xbXnPIo3qaXA==", + "version": "4.1.0-beta.0", + "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-4.1.0-beta.0.tgz", + "integrity": "sha512-0V6yO3yVUkYb5hzo4FAl1Rp/ysSr6D56fvq+5W/mhIoha0hTecfvx05Q+yzQJAziCBxLeMrWIuXrY4epDE/rZQ==", "license": "AGPL-3.0-or-later", "dependencies": { - "@nextcloud/auth": "^2.5.3", + "@nextcloud/auth": "^2.6.0", + "@nextcloud/axios": "^2.6.0", "@nextcloud/capabilities": "^1.2.1", "@nextcloud/l10n": "^3.4.1", "@nextcloud/logger": "^3.0.3", - "@nextcloud/paths": "^3.0.0", + "@nextcloud/paths": "^3.1.0", "@nextcloud/router": "^3.1.0", - "@nextcloud/sharing": "^0.3.0", + "@nextcloud/sharing": "^0.4.0", + "axios-retry": "^4.5.0", "is-svg": "^6.1.0", + "p-queue": "^9.3.0", "typescript-event-target": "^1.1.2", - "webdav": "^5.9.0" - }, - "engines": { - "node": "^24.0.0" - } - }, - "node_modules/@nextcloud/files/node_modules/@nextcloud/files": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.12.2.tgz", - "integrity": "sha512-vBo8tf3Xh6efiF8CrEo3pKj9AtvAF6RdDGO1XKL65IxV8+UUd9Uxl2lUExHlzoDRRczCqfGfaWfRRaFhYqce5Q==", - "license": "AGPL-3.0-or-later", - "optional": true, - "dependencies": { - "@nextcloud/auth": "^2.5.3", - "@nextcloud/capabilities": "^1.2.1", - "@nextcloud/l10n": "^3.4.1", - "@nextcloud/logger": "^3.0.3", - "@nextcloud/paths": "^3.0.0", - "@nextcloud/router": "^3.1.0", - "@nextcloud/sharing": "^0.3.0", - "cancelable-promise": "^4.3.1", - "is-svg": "^6.1.0", - "typescript-event-target": "^1.1.1", - "webdav": "^5.8.0" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || ^24.0.0" - } - }, - "node_modules/@nextcloud/files/node_modules/@nextcloud/sharing": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.3.0.tgz", - "integrity": "sha512-kV7qeUZvd1fTKeFyH+W5Qq5rNOqG9rLATZM3U9MBxWXHJs3OxMqYQb8UQ3NYONzsX3zDGJmdQECIGHm1ei2sCA==", - "license": "GPL-3.0-or-later", - "dependencies": { - "@nextcloud/initial-state": "^3.0.0", - "is-svg": "^6.1.0" + "webdav": "^5.10.0" }, "engines": { - "node": "^20.0.0 || ^22.0.0 || ^24.0.0" - }, - "optionalDependencies": { - "@nextcloud/files": "^3.12.0" + "node": "^24.0.0 || >=26.0.0" } }, "node_modules/@nextcloud/initial-state": { @@ -2497,6 +2496,68 @@ "@nextcloud/files": "^3.12.2 || ^4.0.0" } }, + "node_modules/@nextcloud/sharing/node_modules/@nextcloud/files": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-4.0.0.tgz", + "integrity": "sha512-TmecnZIS+PGWGtRh7RpGEboCT4K6iTbHULUcfR6hs3eEzjDVsCc1Ldf8popGY/70lbpdlfYle8xbXnPIo3qaXA==", + "license": "AGPL-3.0-or-later", + "optional": true, + "dependencies": { + "@nextcloud/auth": "^2.5.3", + "@nextcloud/capabilities": "^1.2.1", + "@nextcloud/l10n": "^3.4.1", + "@nextcloud/logger": "^3.0.3", + "@nextcloud/paths": "^3.0.0", + "@nextcloud/router": "^3.1.0", + "@nextcloud/sharing": "^0.3.0", + "is-svg": "^6.1.0", + "typescript-event-target": "^1.1.2", + "webdav": "^5.9.0" + }, + "engines": { + "node": "^24.0.0" + } + }, + "node_modules/@nextcloud/sharing/node_modules/@nextcloud/sharing": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.3.0.tgz", + "integrity": "sha512-kV7qeUZvd1fTKeFyH+W5Qq5rNOqG9rLATZM3U9MBxWXHJs3OxMqYQb8UQ3NYONzsX3zDGJmdQECIGHm1ei2sCA==", + "license": "GPL-3.0-or-later", + "optional": true, + "dependencies": { + "@nextcloud/initial-state": "^3.0.0", + "is-svg": "^6.1.0" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + }, + "optionalDependencies": { + "@nextcloud/files": "^3.12.0" + } + }, + "node_modules/@nextcloud/sharing/node_modules/@nextcloud/sharing/node_modules/@nextcloud/files": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.12.2.tgz", + "integrity": "sha512-vBo8tf3Xh6efiF8CrEo3pKj9AtvAF6RdDGO1XKL65IxV8+UUd9Uxl2lUExHlzoDRRczCqfGfaWfRRaFhYqce5Q==", + "license": "AGPL-3.0-or-later", + "optional": true, + "dependencies": { + "@nextcloud/auth": "^2.5.3", + "@nextcloud/capabilities": "^1.2.1", + "@nextcloud/l10n": "^3.4.1", + "@nextcloud/logger": "^3.0.3", + "@nextcloud/paths": "^3.0.0", + "@nextcloud/router": "^3.1.0", + "@nextcloud/sharing": "^0.3.0", + "cancelable-promise": "^4.3.1", + "is-svg": "^6.1.0", + "typescript-event-target": "^1.1.1", + "webdav": "^5.8.0" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + } + }, "node_modules/@nextcloud/stylelint-config": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@nextcloud/stylelint-config/-/stylelint-config-3.2.2.tgz", @@ -2756,7 +2817,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -2796,7 +2856,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2817,7 +2876,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2838,7 +2896,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2859,7 +2916,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2880,7 +2936,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2901,7 +2956,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2922,7 +2976,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2943,7 +2996,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2964,7 +3016,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2985,7 +3036,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3006,7 +3056,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3027,7 +3076,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3048,7 +3096,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3245,7 +3292,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3259,7 +3305,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3273,7 +3318,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3287,7 +3331,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3301,7 +3344,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3315,7 +3357,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3329,7 +3370,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3343,7 +3383,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3357,7 +3396,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3371,7 +3409,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3385,7 +3422,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3399,7 +3435,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3413,7 +3448,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3427,7 +3461,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3441,7 +3474,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3455,7 +3487,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3469,7 +3500,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3483,7 +3513,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3497,7 +3526,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3511,7 +3539,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3525,7 +3552,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3539,7 +3565,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3553,7 +3578,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3567,7 +3591,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3581,7 +3604,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4093,7 +4115,7 @@ "version": "24.9.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -5554,6 +5576,18 @@ "proxy-from-env": "^2.1.0" } }, + "node_modules/axios-retry": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", + "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", + "license": "Apache-2.0", + "dependencies": { + "is-retry-allowed": "^2.2.0" + }, + "peerDependencies": { + "axios": "0.x || 1.x" + } + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -5731,7 +5765,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -7269,6 +7303,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -7452,7 +7495,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, "license": "Apache-2.0", "optional": true, "bin": { @@ -8141,7 +8183,7 @@ "version": "0.25.11", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -8993,7 +9035,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -9002,6 +9044,18 @@ "node": ">=8" } }, + "node_modules/filter-obj": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-cypress-specs": { "version": "1.54.12", "resolved": "https://registry.npmjs.org/find-cypress-specs/-/find-cypress-specs-1.54.12.tgz", @@ -9246,7 +9300,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -9398,7 +9451,7 @@ "version": "4.13.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -10072,7 +10125,7 @@ "version": "5.1.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/import-fresh": { @@ -10348,7 +10401,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -10388,7 +10441,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -10465,7 +10518,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -10567,6 +10620,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -12418,7 +12483,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -12432,7 +12497,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -12832,7 +12897,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, "license": "MIT", "optional": true }, @@ -13184,9 +13248,9 @@ } }, "node_modules/p-queue": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.2.0.tgz", - "integrity": "sha512-dWgLE8AH0HjQ9fe74pUkKkvzzYT18Inp4zra3lKHnnwqGvcfcUBrvF2EAVX+envufDNBOzpPq/IBUONDbI7+3g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", + "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", "license": "MIT", "dependencies": { "eventemitter3": "^5.0.4", @@ -14070,6 +14134,23 @@ ], "license": "MIT" }, + "node_modules/query-string": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.4.0.tgz", + "integrity": "sha512-ivvWyHqU9K1Log4hJFhqVIIMoEi0nzmlRhvk2pPcTuQH/Y0K5iTTMxEx7R0PRHD2Z1hMVbWnjfsEWbIKIK+3IA==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -14492,7 +14573,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -14809,7 +14890,7 @@ "version": "1.100.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "chokidar": "^5.0.0", @@ -15409,6 +15490,18 @@ "dev": true, "license": "ISC" }, + "node_modules/split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/splitpanes": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-4.0.4.tgz", @@ -16617,7 +16710,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -16758,7 +16851,7 @@ "version": "4.20.6", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "esbuild": "~0.25.0", @@ -16913,7 +17006,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/unicorn-magic": { @@ -17391,7 +17484,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17408,7 +17500,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17425,7 +17516,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17442,7 +17532,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17459,7 +17548,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17476,7 +17564,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17493,7 +17580,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17510,7 +17596,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17527,7 +17612,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17544,7 +17628,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17561,7 +17644,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17578,7 +17660,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17595,7 +17676,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17612,7 +17692,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17629,7 +17708,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17646,7 +17724,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17663,7 +17740,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17680,7 +17756,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17697,7 +17772,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17714,7 +17788,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17731,7 +17804,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17748,7 +17820,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17765,7 +17836,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17782,7 +17852,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17799,7 +17868,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -17816,7 +17884,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ diff --git a/package.json b/package.json index 4136e02ed9c3e..16d9b29ec8cd6 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@nextcloud/capabilities": "^1.2.1", "@nextcloud/dialogs": "^7.4.0", "@nextcloud/event-bus": "^3.3.3", - "@nextcloud/files": "^4.0.0", + "@nextcloud/files": "^4.1.0-beta.0", "@nextcloud/initial-state": "^3.0.0", "@nextcloud/l10n": "^3.4.1", "@nextcloud/logger": "^3.0.3", @@ -65,6 +65,7 @@ "marked": "^17.0.1", "p-queue": "^9.2.0", "pinia": "^3.0.4", + "query-string": "^9.4.0", "sortablejs": "^1.15.7", "vue": "^3.5.35", "vue-router": "^5.0.6", From 0b4794b62f940f98dcc0b2eae3eae3f2f1d1d12b Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Mon, 15 Jun 2026 14:25:52 +0200 Subject: [PATCH 2/9] fix: allow legacy apps to import from other apps Signed-off-by: Ferdinand Thiessen --- .../src/files_views/publicFileShare.ts | 2 +- .../src/files_views/publicShare.ts | 11 ++++++----- apps/files_sharing/src/init-public.ts | 2 +- apps/files_sharing/src/mixins/SharesMixin.js | 2 +- build/frontend-legacy/package-lock.json | 17 ++++++++++------- build/frontend-legacy/webpack.common.cjs | 2 ++ 6 files changed, 21 insertions(+), 15 deletions(-) diff --git a/apps/files_sharing/src/files_views/publicFileShare.ts b/apps/files_sharing/src/files_views/publicFileShare.ts index bf4fd0df573ab..cba5094caf869 100644 --- a/apps/files_sharing/src/files_views/publicFileShare.ts +++ b/apps/files_sharing/src/files_views/publicFileShare.ts @@ -9,8 +9,8 @@ import LinkSvg from '@mdi/svg/svg/link.svg?raw' import { Folder, getNavigation, Permission, View } from '@nextcloud/files' import { getDefaultPropfind, getRemoteURL, getRootPath, resultToNode } from '@nextcloud/files/dav' import { translate as t } from '@nextcloud/l10n' -import { client } from '../../../files/src/services/WebdavClient.ts' import logger from '../services/logger.ts' +import { client } from '~/apps/files/src/services/WebdavClient.ts' export default () => { const view = new View({ diff --git a/apps/files_sharing/src/files_views/publicShare.ts b/apps/files_sharing/src/files_views/publicShare.ts index 1666eeece97eb..435352c89c93e 100644 --- a/apps/files_sharing/src/files_views/publicShare.ts +++ b/apps/files_sharing/src/files_views/publicShare.ts @@ -1,11 +1,12 @@ -import LinkSvg from '@mdi/svg/svg/link.svg?raw' -import { getNavigation, View } from '@nextcloud/files' -/** +/* * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { translate as t } from '@nextcloud/l10n' -import { getContents } from '../../../files/src/services/Files.ts' + +import LinkSvg from '@mdi/svg/svg/link.svg?raw' +import { getNavigation, View } from '@nextcloud/files' +import { t } from '@nextcloud/l10n' +import { getContents } from '~/apps/files/src/services/Files.ts' export default () => { const view = new View({ diff --git a/apps/files_sharing/src/init-public.ts b/apps/files_sharing/src/init-public.ts index b59389cb5c22e..2c53693bd20a4 100644 --- a/apps/files_sharing/src/init-public.ts +++ b/apps/files_sharing/src/init-public.ts @@ -9,7 +9,7 @@ import type { ShareAttribute } from './sharing.d.ts' import { emit, subscribe, unsubscribe } from '@nextcloud/event-bus' import { getNavigation } from '@nextcloud/files' import { loadState } from '@nextcloud/initial-state' -import RouterService from '../../files/src/services/RouterService.ts' +import RouterService from '~/apps/files/src/services/RouterService.ts' import registerFileDropView from './files_views/publicFileDrop.ts' import registerPublicFileShareView from './files_views/publicFileShare.ts' import registerPublicShareView from './files_views/publicShare.ts' diff --git a/apps/files_sharing/src/mixins/SharesMixin.js b/apps/files_sharing/src/mixins/SharesMixin.js index fa5dc2d5d27b6..5abb55916a481 100644 --- a/apps/files_sharing/src/mixins/SharesMixin.js +++ b/apps/files_sharing/src/mixins/SharesMixin.js @@ -9,7 +9,6 @@ import { emit } from '@nextcloud/event-bus' import { ShareType } from '@nextcloud/sharing' import debounce from 'debounce' import PQueue from 'p-queue' -import { fetchNode } from '../../../files/src/services/WebdavClient.ts' import { ATOMIC_PERMISSIONS, getBundledPermissions, @@ -19,6 +18,7 @@ import Config from '../services/ConfigService.ts' import logger from '../services/logger.ts' import GeneratePassword from '../utils/GeneratePassword.ts' import SharesRequests from './ShareRequests.js' +import { fetchNode } from '~/apps/files/src/services/WebdavClient.ts' export default { mixins: [SharesRequests], diff --git a/build/frontend-legacy/package-lock.json b/build/frontend-legacy/package-lock.json index 96d4af1d29bfb..838abb8866ebc 100644 --- a/build/frontend-legacy/package-lock.json +++ b/build/frontend-legacy/package-lock.json @@ -7505,12 +7505,15 @@ "peer": true }, "node_modules/baseline-browser-mapping": { - "version": "2.9.11", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", - "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "version": "2.10.37", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz", + "integrity": "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/batch": { @@ -7964,9 +7967,9 @@ "license": "MIT" }, "node_modules/caniuse-lite": { - "version": "1.0.30001761", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", - "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", "funding": [ { "type": "opencollective", diff --git a/build/frontend-legacy/webpack.common.cjs b/build/frontend-legacy/webpack.common.cjs index f9b6f435c0313..e526cba45f877 100644 --- a/build/frontend-legacy/webpack.common.cjs +++ b/build/frontend-legacy/webpack.common.cjs @@ -255,6 +255,8 @@ const config = { alias: { // make sure to use the handlebar runtime when importing handlebars: 'handlebars/runtime', + // allow to import from root (cross reference already migrated apps) + '~*': path.resolve(__dirname, '../../*'), }, extensions: ['*', '.ts', '.js', '.vue'], extensionAlias: { From 8386c753a3a8537bd54785ca0c55956d53add065 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Mon, 15 Jun 2026 01:01:30 +0200 Subject: [PATCH 3/9] refactor(files): migrate to Vue 3 Assisted-by: ClaudeCode:claude-opus-4-8 Signed-off-by: Ferdinand Thiessen --- apps/files/src/actions/favoriteAction.ts | 3 +- apps/files/src/actions/moveOrCopyAction.ts | 6 +-- apps/files/src/components/BreadCrumbs.vue | 4 +- .../src/components/DragAndDropPreview.vue | 6 ++- apps/files/src/components/FileEntry.vue | 10 ++--- .../components/FileEntry/FileEntryName.vue | 11 +++-- apps/files/src/components/FileEntryGrid.vue | 10 ++--- apps/files/src/components/FileEntryMixin.ts | 7 +-- apps/files/src/components/FilesListHeader.vue | 2 +- .../FilesListTableHeaderActions.vue | 6 +-- apps/files/src/components/VirtualList.vue | 6 +-- .../src/composables/useBeforeNavigation.ts | 2 +- apps/files/src/composables/useFileActions.ts | 6 +-- .../src/composables/useFileListActions.ts | 6 +-- apps/files/src/composables/useHotKeys.spec.ts | 12 ++--- apps/files/src/composables/useHotKeys.ts | 2 +- apps/files/src/composables/usePreviewImage.ts | 5 +-- .../src/composables/useRouteParameters.ts | 4 +- apps/files/src/filters/ModifiedFilter.ts | 20 ++------- apps/files/src/filters/TypeFilter.ts | 27 ++---------- apps/files/src/main-settings-admin.ts | 12 +++-- apps/files/src/main-settings-personal.ts | 12 +++-- apps/files/src/main.ts | 22 ++++------ apps/files/src/mixins/filesSorting.ts | 4 +- apps/files/src/newMenu/newFromTemplate.ts | 23 ++++------ apps/files/src/reference-files.ts | 44 ++++++++----------- apps/files/src/store/dragging.ts | 5 +-- apps/files/src/store/files.ts | 6 +-- apps/files/src/store/keyboard.ts | 9 ++-- apps/files/src/store/paths.ts | 11 +++-- apps/files/src/store/renaming.ts | 6 +-- apps/files/src/store/selection.ts | 13 +++--- apps/files/src/store/userconfig.ts | 4 +- apps/files/src/store/viewConfig.ts | 6 +-- apps/files/src/utils/actionUtils.ts | 5 +-- apps/files/src/utils/dragUtils.ts | 22 ++++++---- apps/files/src/utils/generateUrl.spec.ts | 42 ++++++++++++++++++ apps/files/src/utils/generateUrl.ts | 32 ++++++++++++++ .../src/views/FileReferencePickerElement.vue | 10 +++-- apps/files/src/views/FilesNavigation.spec.ts | 2 +- apps/files/src/views/FilesNavigation.vue | 8 ++-- apps/files/src/views/FilesSidebar.vue | 2 +- apps/files/src/views/ReferenceFileWidget.vue | 2 +- apps/files/src/views/search.ts | 18 ++++---- 44 files changed, 245 insertions(+), 230 deletions(-) create mode 100644 apps/files/src/utils/generateUrl.spec.ts create mode 100644 apps/files/src/utils/generateUrl.ts diff --git a/apps/files/src/actions/favoriteAction.ts b/apps/files/src/actions/favoriteAction.ts index f3b109871b2f0..865dc3575fa9f 100644 --- a/apps/files/src/actions/favoriteAction.ts +++ b/apps/files/src/actions/favoriteAction.ts @@ -15,7 +15,6 @@ import { encodePath } from '@nextcloud/paths' import { generateUrl } from '@nextcloud/router' import { isPublicShare } from '@nextcloud/sharing/public' import PQueue from 'p-queue' -import Vue from 'vue' import { logger } from '../utils/logger.ts' const queue = new PQueue({ concurrency: 5 }) @@ -107,7 +106,7 @@ export async function favoriteNode(node: INode, view: IView, willFavorite: boole } // Update the node webdav attribute - Vue.set(node.attributes, 'favorite', willFavorite ? 1 : 0) + node.attributes.favorite = willFavorite ? 1 : 0 emit('files:node:updated', node) // Dispatch event to whoever is interested diff --git a/apps/files/src/actions/moveOrCopyAction.ts b/apps/files/src/actions/moveOrCopyAction.ts index 2920a1cb5f743..9984c72ab187f 100644 --- a/apps/files/src/actions/moveOrCopyAction.ts +++ b/apps/files/src/actions/moveOrCopyAction.ts @@ -16,8 +16,6 @@ import { FileType, getUniqueName, NodeStatus, Permission } from '@nextcloud/file import { defaultRootPath, getClient, getDefaultPropfind, resultToNode } from '@nextcloud/files/dav' import { n, t } from '@nextcloud/l10n' import { basename, join } from '@nextcloud/paths' -import { getConflicts } from '@nextcloud/upload' -import Vue from 'vue' import { getContents } from '../services/Files.ts' import { logger } from '../utils/logger.ts' import { canCopy, canMove, getQueue, MoveCopyAction } from './moveOrCopyActionUtils.ts' @@ -165,7 +163,7 @@ export async function* handleCopyMoveNodesTo(nodes: INode[], destination: IFolde try { for (const node of nodes) { // Set loading state - Vue.set(node, 'status', NodeStatus.LOADING) + node.status = NodeStatus.LOADING yield queue.add(async () => { try { const client = getClient() @@ -211,7 +209,7 @@ export async function* handleCopyMoveNodesTo(nodes: INode[], destination: IFolde } throw error } finally { - Vue.set(node, 'status', undefined) + node.status = undefined } }) } diff --git a/apps/files/src/components/BreadCrumbs.vue b/apps/files/src/components/BreadCrumbs.vue index 39bd54da0d6c5..1e309c45f503b 100644 --- a/apps/files/src/components/BreadCrumbs.vue +++ b/apps/files/src/components/BreadCrumbs.vue @@ -18,10 +18,10 @@ :to="section.to" :force-icon-text="index === 0 && !isNarrow" force-menu - :open.sync="isMenuOpen" + v-model:open="isMenuOpen" :title="titleForSection(index, section)" :aria-description="ariaForSection(section)" - @dragover.native="onDragOver($event, section.dir)" + @dragover="onDragOver($event, section.dir)" @drop="onDrop($event, section.dir)"> @@ -31,7 +31,9 @@ :name="t('files', 'Files settings')" data-cy-files-navigation-settings-button @click.prevent.stop="settingsOpened = true"> - + @@ -43,7 +45,7 @@ import { emit } from '@nextcloud/event-bus' import { getNavigation } from '@nextcloud/files' import { t } from '@nextcloud/l10n' import { computed, provide, ref, watchEffect } from 'vue' -import { useRoute } from 'vue-router/composables' +import { useRoute } from 'vue-router' import NcAppNavigation from '@nextcloud/vue/components/NcAppNavigation' import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem' import IconCog from 'vue-material-design-icons/CogOutline.vue' diff --git a/apps/files/src/views/FilesSidebar.vue b/apps/files/src/views/FilesSidebar.vue index c83a7cf794ed4..6e5f2a318b424 100644 --- a/apps/files/src/views/FilesSidebar.vue +++ b/apps/files/src/views/FilesSidebar.vue @@ -73,7 +73,7 @@ function onToggle(open: boolean) { import('./SearchEmptyView.vue')) + let instance: App const Navigation = getNavigation() Navigation.register(new View({ @@ -28,13 +28,11 @@ export function registerSearchView() { caption: t('files', 'Search results within your files.'), async emptyView(el) { - if (!view) { - view = (await import('./SearchEmptyView.vue')).default - } else { - instance.$destroy() + if (instance) { + instance.unmount() } - instance = new Vue(view) - instance.$mount(el) + instance = createApp(EmptyView) + instance.mount(el) }, icon: MagnifySvg, From 9e959b0be0af11ec0ebf83eabf9965a57fea4ba2 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Mon, 15 Jun 2026 14:28:29 +0200 Subject: [PATCH 4/9] chore: resolve pinia as shared module Signed-off-by: Ferdinand Thiessen --- apps/files/src/actions/deleteUtils.ts | 4 ++-- apps/files/src/actions/downloadAction.ts | 6 +++--- apps/files/src/actions/renameAction.spec.ts | 4 ++-- apps/files/src/actions/renameAction.ts | 4 ++-- .../FileListFilter/FileListFilterToSearch.vue | 4 ++-- apps/files/src/composables/useHotKeys.spec.ts | 10 +++++----- apps/files/src/filters/FilenameFilter.ts | 4 ++-- apps/files/src/router/router.ts | 12 ++++++------ apps/files/src/services/Files.ts | 6 +++--- apps/files/src/services/Recent.ts | 10 +++++----- apps/files/src/services/Search.ts | 4 ++-- apps/files/src/sidebar.ts | 4 ++-- apps/files/src/store/index.ts | 11 ++--------- apps/files/src/views/SearchEmptyView.vue | 4 ++-- apps/files/src/views/folderTree.ts | 4 ++-- 15 files changed, 42 insertions(+), 49 deletions(-) diff --git a/apps/files/src/actions/deleteUtils.ts b/apps/files/src/actions/deleteUtils.ts index 6b1cbb9138b10..46f010e6146b0 100644 --- a/apps/files/src/actions/deleteUtils.ts +++ b/apps/files/src/actions/deleteUtils.ts @@ -11,7 +11,7 @@ import { getCapabilities } from '@nextcloud/capabilities' import { emit } from '@nextcloud/event-bus' import { FileType } from '@nextcloud/files' import { n, t } from '@nextcloud/l10n' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { useUserConfigStore } from '../store/userconfig.ts' export const isTrashbinEnabled = () => (getCapabilities() as Capabilities)?.files?.undelete === true @@ -134,7 +134,7 @@ export function displayName({ nodes, view }: { nodes: INode[], view: IView }) { * */ export function shouldAskForConfirmation() { - const userConfig = useUserConfigStore(getPinia()) + const userConfig = useUserConfigStore(pinia) return userConfig.userConfig.show_dialog_deletion !== false } diff --git a/apps/files/src/actions/downloadAction.ts b/apps/files/src/actions/downloadAction.ts index 63f943ddcedb3..14a476676758e 100644 --- a/apps/files/src/actions/downloadAction.ts +++ b/apps/files/src/actions/downloadAction.ts @@ -12,7 +12,7 @@ import { emit } from '@nextcloud/event-bus' import { DefaultType, FileType } from '@nextcloud/files' import { t } from '@nextcloud/l10n' import { useFilesStore } from '../store/files.ts' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { usePathsStore } from '../store/paths.ts' import { logger } from '../utils/logger.ts' import { isDownloadable } from '../utils/permissions.ts' @@ -161,8 +161,8 @@ async function downloadNodes(nodes: INode[]) { * @return The current directory node or null if not found */ function getCurrentDirectory(view: IView, directory: string): INode | null { - const filesStore = useFilesStore(getPinia()) - const pathsStore = usePathsStore(getPinia()) + const filesStore = useFilesStore(pinia) + const pathsStore = usePathsStore(pinia) if (!view?.id) { return null } diff --git a/apps/files/src/actions/renameAction.spec.ts b/apps/files/src/actions/renameAction.spec.ts index 1f25b86d4ebea..89e3f01001f7e 100644 --- a/apps/files/src/actions/renameAction.spec.ts +++ b/apps/files/src/actions/renameAction.spec.ts @@ -9,7 +9,7 @@ import * as eventBus from '@nextcloud/event-bus' import { File, Folder, Permission } from '@nextcloud/files' import { beforeEach, describe, expect, test, vi } from 'vitest' import { useFilesStore } from '../store/files.ts' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { action } from './renameAction.ts' const view = { @@ -25,7 +25,7 @@ beforeEach(() => { permissions: Permission.CREATE, root: '/files/admin', }) - const files = useFilesStore(getPinia()) + const files = useFilesStore(pinia) files.setRoot({ service: 'files', root }) }) diff --git a/apps/files/src/actions/renameAction.ts b/apps/files/src/actions/renameAction.ts index 28b2bcd29a853..b63f4e9fb2be5 100644 --- a/apps/files/src/actions/renameAction.ts +++ b/apps/files/src/actions/renameAction.ts @@ -11,7 +11,7 @@ import { Permission } from '@nextcloud/files' import { translate as t } from '@nextcloud/l10n' import { dirname } from 'path' import { useFilesStore } from '../store/files.ts' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' export const ACTION_RENAME = 'rename' @@ -31,7 +31,7 @@ export const action: IFileAction = { } const node = nodes[0] - const filesStore = useFilesStore(getPinia()) + const filesStore = useFilesStore(pinia) const parentNode = node.dirname === '/' ? filesStore.getRoot(view.id) : filesStore.getNode(dirname(node.source)) diff --git a/apps/files/src/components/FileListFilter/FileListFilterToSearch.vue b/apps/files/src/components/FileListFilter/FileListFilterToSearch.vue index 695f9c8ae76c5..882aca89d46e5 100644 --- a/apps/files/src/components/FileListFilter/FileListFilterToSearch.vue +++ b/apps/files/src/components/FileListFilter/FileListFilterToSearch.vue @@ -13,10 +13,10 @@ import { t } from '@nextcloud/l10n' import { computed } from 'vue' import NcButton from '@nextcloud/vue/components/NcButton' -import { getPinia } from '../../store/index.ts' +import { pinia } from '../../store/index.ts' import { useSearchStore } from '../../store/search.ts' -const searchStore = useSearchStore(getPinia()) +const searchStore = useSearchStore(pinia) const isVisible = computed(() => searchStore.query.length >= 3 && searchStore.scope === 'filter') diff --git a/apps/files/src/composables/useHotKeys.spec.ts b/apps/files/src/composables/useHotKeys.spec.ts index e5cf8e5ec124c..89fe0604dbdcd 100644 --- a/apps/files/src/composables/useHotKeys.spec.ts +++ b/apps/files/src/composables/useHotKeys.spec.ts @@ -14,7 +14,7 @@ import { defineComponent, nextTick } from 'vue' import { action as deleteAction } from '../actions/deleteAction.ts' import { useActiveStore } from '../store/active.ts' import { useFilesStore } from '../store/files.ts' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { useUserConfigStore } from '../store/userconfig.ts' import { useHotKeys } from './useHotKeys.ts' @@ -72,7 +72,7 @@ beforeAll(() => { }) describe('HotKeysService testing', () => { - const activeStore = useActiveStore(getPinia()) + const activeStore = useActiveStore(pinia) let initialState: HTMLInputElement let component: ReturnType @@ -105,7 +105,7 @@ describe('HotKeysService testing', () => { permissions: Permission.CREATE, }) - const files = useFilesStore(getPinia()) + const files = useFilesStore(pinia) files.setRoot({ service: 'files', root }) // Setting the view first as it reset the active node @@ -158,7 +158,7 @@ describe('HotKeysService testing', () => { it('Pressing v should toggle grid view', async () => { vi.spyOn(axios, 'put').mockImplementationOnce(() => Promise.resolve()) - const userConfigStore = useUserConfigStore(getPinia()) + const userConfigStore = useUserConfigStore(pinia) userConfigStore.userConfig.grid_view = false expect(userConfigStore.userConfig.grid_view).toBe(false) @@ -174,7 +174,7 @@ describe('HotKeysService testing', () => { ])('Pressing v with modifier key %s should not toggle grid view', async (modifier: string) => { vi.spyOn(axios, 'put').mockImplementationOnce(() => Promise.resolve()) - const userConfigStore = useUserConfigStore(getPinia()) + const userConfigStore = useUserConfigStore(pinia) userConfigStore.userConfig.grid_view = false expect(userConfigStore.userConfig.grid_view).toBe(false) diff --git a/apps/files/src/filters/FilenameFilter.ts b/apps/files/src/filters/FilenameFilter.ts index 4bbc3c10da570..4985b7fd4a963 100644 --- a/apps/files/src/filters/FilenameFilter.ts +++ b/apps/files/src/filters/FilenameFilter.ts @@ -7,7 +7,7 @@ import type { IFileListFilterChip, INode } from '@nextcloud/files' import { subscribe } from '@nextcloud/event-bus' import { FileListFilter, registerFileListFilter } from '@nextcloud/files' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { useSearchStore } from '../store/search.ts' /** @@ -55,7 +55,7 @@ class FilenameFilter extends FileListFilter { }) } else { // make sure to also reset the search store when pressing the "X" on the filter chip - const store = useSearchStore(getPinia()) + const store = useSearchStore(pinia) if (store.scope === 'filter') { store.query = '' } diff --git a/apps/files/src/router/router.ts b/apps/files/src/router/router.ts index 94becd075382e..5825fb36b07ec 100644 --- a/apps/files/src/router/router.ts +++ b/apps/files/src/router/router.ts @@ -13,7 +13,7 @@ import queryString from 'query-string' import Vue from 'vue' import Router, { isNavigationFailure, NavigationFailureType } from 'vue-router' import { useFilesStore } from '../store/files.ts' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { usePathsStore } from '../store/paths.ts' import { defaultView } from '../utils/filesViews.ts' import { logger } from '../utils/logger.ts' @@ -148,11 +148,11 @@ router.beforeResolve((to, from, next) => { }) subscribe('files:node:deleted', (node: INode) => { - if (router.currentRoute.params.fileid === String(node.fileid)) { - const params = { ...router.currentRoute.params } - const { getPath } = usePathsStore(getPinia()) - const { getNode } = useFilesStore(getPinia()) - const source = getPath(router.currentRoute.params.view, node.dirname) + if (router.currentRoute.value.params.fileid === String(node.fileid)) { + const params = { ...router.currentRoute.value.params } + const { getPath } = usePathsStore(pinia) + const { getNode } = useFilesStore(pinia) + const source = getPath(router.currentRoute.value.params.view as string, node.dirname) const parentFolder = getNode(source!) if (source && parentFolder) { params.fileid = String(parentFolder.fileid) diff --git a/apps/files/src/services/Files.ts b/apps/files/src/services/Files.ts index 3941ee20ede96..e80a9d60b9aa0 100644 --- a/apps/files/src/services/Files.ts +++ b/apps/files/src/services/Files.ts @@ -8,7 +8,7 @@ import type { FileStat, ResponseDataDetailed } from 'webdav' import { getDefaultPropfind, getRootPath, resultToNode } from '@nextcloud/files/dav' import { join } from 'path' import { useFilesStore } from '../store/files.ts' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { useSearchStore } from '../store/search.ts' import { logger } from '../utils/logger.ts' import { client } from './WebdavClient.ts' @@ -23,7 +23,7 @@ import { searchNodes } from './WebDavSearch.ts' * @param options.signal - Abort signal to cancel the request */ export async function getContents(path = '/', options?: { signal: AbortSignal }): Promise { - const searchStore = useSearchStore(getPinia()) + const searchStore = useSearchStore(pinia) if (searchStore.query.length < 3) { return await defaultGetContents(path, options) @@ -78,7 +78,7 @@ export async function defaultGetContents(path: string, options?: { signal: Abort * @param signal - The aboort signal */ async function getLocalSearch(path: string, query: string, signal?: AbortSignal): Promise { - const filesStore = useFilesStore(getPinia()) + const filesStore = useFilesStore(pinia) let folder = filesStore.getDirectoryByPath('files', path) if (!folder) { const rootPath = join(getRootPath(), path) diff --git a/apps/files/src/services/Recent.ts b/apps/files/src/services/Recent.ts index 9bdf674b111cf..6673dacffee9c 100644 --- a/apps/files/src/services/Recent.ts +++ b/apps/files/src/services/Recent.ts @@ -9,7 +9,7 @@ import { getCurrentUser } from '@nextcloud/auth' import { Folder, Permission } from '@nextcloud/files' import { getRecentSearch, getRemoteURL, getRootPath, resultToNode } from '@nextcloud/files/dav' import { loadState } from '@nextcloud/initial-state' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { useUserConfigStore } from '../store/userconfig.ts' import { logger } from '../utils/logger.ts' import { client } from './WebdavClient.ts' @@ -27,8 +27,8 @@ const recentLimit = loadState('files', 'recent_limit', 100) * @param options Options including abort signal * @param options.signal Abort signal to cancel the request */ -export async function getContents(path = '/', options: { signal: AbortSignal }): Promise { - const store = useUserConfigStore(getPinia()) +export async function getContents(path = '/', options?: { signal: AbortSignal }): Promise { + const store = useUserConfigStore(pinia) /** * Filter function that returns only the visible nodes - or hidden if explicitly configured @@ -41,7 +41,7 @@ export async function getContents(path = '/', options: { signal: AbortSignal }): try { const contentsResponse = await client.search('/', { - signal: options.signal, + signal: options?.signal, details: true, data: getRecentSearch(lastTwoWeeksTimestamp, recentLimit), }) as ResponseDataDetailed @@ -65,7 +65,7 @@ export async function getContents(path = '/', options: { signal: AbortSignal }): contents, } } catch (error) { - if (options.signal.aborted) { + if (options?.signal.aborted) { logger.info('Fetching recent files aborted') throw new DOMException('Aborted', 'AbortError') } diff --git a/apps/files/src/services/Search.ts b/apps/files/src/services/Search.ts index ade5ef2b245be..b211bc088c91d 100644 --- a/apps/files/src/services/Search.ts +++ b/apps/files/src/services/Search.ts @@ -8,7 +8,7 @@ import type { ContentsWithRoot } from '@nextcloud/files' import { getCurrentUser } from '@nextcloud/auth' import { Folder, Permission } from '@nextcloud/files' import { defaultRemoteURL, getRootPath } from '@nextcloud/files/dav' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { useSearchStore } from '../store/search.ts' import { logger } from '../utils/logger.ts' import { searchNodes } from './WebDavSearch.ts' @@ -21,7 +21,7 @@ import { searchNodes } from './WebDavSearch.ts' * @param options.signal - Abort signal to cancel the request */ export async function getContents(path, options: { signal: AbortSignal }): Promise { - const searchStore = useSearchStore(getPinia()) + const searchStore = useSearchStore(pinia) try { const contents = await searchNodes(searchStore.query, { signal: options.signal }) diff --git a/apps/files/src/sidebar.ts b/apps/files/src/sidebar.ts index c8c98cc7940ff..008d92b687763 100644 --- a/apps/files/src/sidebar.ts +++ b/apps/files/src/sidebar.ts @@ -5,9 +5,9 @@ import type { ISidebar } from '@nextcloud/files' -import { getPinia } from './store/index.ts' +import { pinia } from './store/index.ts' import { useSidebarStore } from './store/sidebar.ts' // Provide sidebar implementation which is proxied by the `@nextcloud/files` library for app usage. window.OCA.Files ??= {} -window.OCA.Files._sidebar = () => useSidebarStore(getPinia()) satisfies Omit +window.OCA.Files._sidebar = () => useSidebarStore(pinia) satisfies Omit diff --git a/apps/files/src/store/index.ts b/apps/files/src/store/index.ts index e80661bdd16e8..b80efcdad15ba 100644 --- a/apps/files/src/store/index.ts +++ b/apps/files/src/store/index.ts @@ -6,13 +6,6 @@ import { createPinia } from 'pinia' /** - * Get the Pinia instance for the Files app. + * The Pinia instance for the Files app. */ -export function getPinia() { - if (window._nc_files_pinia) { - return window._nc_files_pinia - } - - window._nc_files_pinia = createPinia() - return window._nc_files_pinia -} +export const pinia = createPinia() diff --git a/apps/files/src/views/SearchEmptyView.vue b/apps/files/src/views/SearchEmptyView.vue index 00669493a3442..f99ca48189bfa 100644 --- a/apps/files/src/views/SearchEmptyView.vue +++ b/apps/files/src/views/SearchEmptyView.vue @@ -10,10 +10,10 @@ import debounce from 'debounce' import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent' import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper' import NcInputField from '@nextcloud/vue/components/NcInputField' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' import { useSearchStore } from '../store/search.ts' -const searchStore = useSearchStore(getPinia()) +const searchStore = useSearchStore(pinia) const debouncedUpdate = debounce((value: string) => { searchStore.query = value }, 500) diff --git a/apps/files/src/views/folderTree.ts b/apps/files/src/views/folderTree.ts index 3e854a6b66a66..4b9693fb54d64 100644 --- a/apps/files/src/views/folderTree.ts +++ b/apps/files/src/views/folderTree.ts @@ -22,7 +22,7 @@ import { sourceRoot, } from '../services/FolderTree.ts' import { useFilesStore } from '../store/files.ts' -import { getPinia } from '../store/index.ts' +import { pinia } from '../store/index.ts' interface IFolderTreeView extends IView { loading?: boolean @@ -170,7 +170,7 @@ function getLoadChildViews(node: TreeNode | IFolder) { */ async function updateTreeChildren(path: string = '/') { await queue.add(async () => { - const filesStore = useFilesStore(getPinia()) + const filesStore = useFilesStore(pinia) const cachedNodes = filesStore.getNodesByPath(Navigation.active!.id, path) if (cachedNodes.length > 0) { // if there are nodes loaded in the path we dont need to fetch from API From e83ad62fbdfa8d36060b4b5e063675c780b58e1c Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Mon, 15 Jun 2026 14:29:07 +0200 Subject: [PATCH 5/9] refactor(files): migrate from mixin to composable for files sorting Signed-off-by: Ferdinand Thiessen --- .../src/components/FilesListTableHeader.vue | 10 ++- .../components/FilesListTableHeaderButton.vue | 49 +++++--------- apps/files/src/composables/filesSorting.ts | 65 +++++++++++++++++++ apps/files/src/mixins/filesSorting.ts | 52 --------------- apps/files/src/views/FilesList.vue | 8 +-- 5 files changed, 89 insertions(+), 95 deletions(-) create mode 100644 apps/files/src/composables/filesSorting.ts delete mode 100644 apps/files/src/mixins/filesSorting.ts diff --git a/apps/files/src/components/FilesListTableHeader.vue b/apps/files/src/components/FilesListTableHeader.vue index 6553e698e29b3..c2a0e9e3f6e51 100644 --- a/apps/files/src/components/FilesListTableHeader.vue +++ b/apps/files/src/components/FilesListTableHeader.vue @@ -11,7 +11,7 @@ v-bind="selectAllBind" :id="FILES_LIST_HEADER_SELECT_ALL_CHECKBOX_ID" data-cy-files-list-selection-checkbox - @update:model-value="onToggleAll" /> + @update:modelValue="onToggleAll" /> @@ -86,9 +86,9 @@ import { defineComponent } from 'vue' import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch' import { FILE_LIST_HEAD_FIRST_BATCH_ACTION_ID } from './FilesListTableHeaderActions.vue' import FilesListTableHeaderButton from './FilesListTableHeaderButton.vue' +import { useFilesSorting } from '../composables/filesSorting.ts' import { useFileListWidth } from '../composables/useFileListWidth.ts' import { useRouteParameters } from '../composables/useRouteParameters.ts' -import filesSortingMixin from '../mixins/filesSorting.ts' import { useActiveStore } from '../store/active.ts' import { useFilesStore } from '../store/files.ts' import { useSelectionStore } from '../store/selection.ts' @@ -104,10 +104,6 @@ export default defineComponent({ NcCheckboxRadioSwitch, }, - mixins: [ - filesSortingMixin, - ], - props: { isMimeAvailable: { type: Boolean, @@ -146,6 +142,8 @@ export default defineComponent({ directory, isNarrow, + ...useFilesSorting(), + FILES_LIST_HEADER_SELECT_ALL_CHECKBOX_ID, } }, diff --git a/apps/files/src/components/FilesListTableHeaderButton.vue b/apps/files/src/components/FilesListTableHeaderButton.vue index c37c685446b2f..dea93fa79b76f 100644 --- a/apps/files/src/components/FilesListTableHeaderButton.vue +++ b/apps/files/src/components/FilesListTableHeaderButton.vue @@ -21,43 +21,28 @@ -