From 5250895587f563ad09f27cf6fa50f93ea6ffe658 Mon Sep 17 00:00:00 2001 From: curo1305 Date: Sat, 30 May 2026 11:58:08 +0200 Subject: [PATCH] feat(05): cloud folder browser views, routing, and sidebar nav Add CloudStorageView (/cloud) and CloudFolderView (/cloud/:provider/:folderId). Tree items filter to directories only (is_dir) to hide files in the nav tree. CloudProviderTreeItem root click navigates to /cloud/{provider}/root instead of /settings. AppSidebar Cloud Storage link upgraded to router-link with active-class highlighting. Router registers both cloud routes with requiresAuth. Co-Authored-By: Claude Sonnet 4.6 --- .../components/cloud/CloudFolderTreeItem.vue | 2 +- .../cloud/CloudProviderTreeItem.vue | 4 +- frontend/src/components/layout/AppSidebar.vue | 9 +- frontend/src/router/index.js | 16 ++ frontend/src/views/CloudFolderView.vue | 178 ++++++++++++++++++ frontend/src/views/CloudStorageView.vue | 89 +++++++++ 6 files changed, 291 insertions(+), 7 deletions(-) create mode 100644 frontend/src/views/CloudFolderView.vue create mode 100644 frontend/src/views/CloudStorageView.vue diff --git a/frontend/src/components/cloud/CloudFolderTreeItem.vue b/frontend/src/components/cloud/CloudFolderTreeItem.vue index 7c8e875..9aee476 100644 --- a/frontend/src/components/cloud/CloudFolderTreeItem.vue +++ b/frontend/src/components/cloud/CloudFolderTreeItem.vue @@ -102,7 +102,7 @@ async function loadChildren() { loadError.value = false try { const data = await api.getCloudFolders(props.provider, props.folder.id) - children.value = data.items ?? [] + children.value = (data.items ?? []).filter(i => i.is_dir) childrenLoaded.value = true } catch { loadError.value = true diff --git a/frontend/src/components/cloud/CloudProviderTreeItem.vue b/frontend/src/components/cloud/CloudProviderTreeItem.vue index c1a33e8..6de393c 100644 --- a/frontend/src/components/cloud/CloudProviderTreeItem.vue +++ b/frontend/src/components/cloud/CloudProviderTreeItem.vue @@ -92,7 +92,7 @@ async function loadChildren() { loadError.value = false try { const data = await api.getCloudFolders(props.connection.provider, 'root') - children.value = data.items ?? [] + children.value = (data.items ?? []).filter(i => i.is_dir) childrenLoaded.value = true } catch { loadError.value = true @@ -113,6 +113,6 @@ async function retry() { } function navigateToRoot() { - router.push('/settings') + router.push(`/cloud/${props.connection.provider}/root`) } diff --git a/frontend/src/components/layout/AppSidebar.vue b/frontend/src/components/layout/AppSidebar.vue index 2f911f2..1a6ca4e 100644 --- a/frontend/src/components/layout/AppSidebar.vue +++ b/frontend/src/components/layout/AppSidebar.vue @@ -128,17 +128,18 @@ - - + Cloud Storage - + diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 9baacdf..0987df4 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -4,6 +4,8 @@ import FileManagerView from '../views/FileManagerView.vue' import TopicsView from '../views/TopicsView.vue' import DocumentView from '../views/DocumentView.vue' import SettingsView from '../views/SettingsView.vue' +import CloudFolderView from '../views/CloudFolderView.vue' +import CloudStorageView from '../views/CloudStorageView.vue' const routes = [ // File manager is the home — handles both root and folder views @@ -39,6 +41,20 @@ const routes = [ { path: '/account', component: () => import('../views/AccountView.vue') }, { path: '/admin', component: () => import('../views/AdminView.vue') }, + // Cloud storage overview and folder browser + { + path: '/cloud', + name: 'cloud', + component: CloudStorageView, + meta: { requiresAuth: true }, + }, + { + path: '/cloud/:provider/:folderId(.*)', + name: 'cloud-folder', + component: CloudFolderView, + meta: { requiresAuth: true }, + }, + // Phase 4 — folder and sharing routes { path: '/folders/:folderId', diff --git a/frontend/src/views/CloudFolderView.vue b/frontend/src/views/CloudFolderView.vue new file mode 100644 index 0000000..446b799 --- /dev/null +++ b/frontend/src/views/CloudFolderView.vue @@ -0,0 +1,178 @@ + + + diff --git a/frontend/src/views/CloudStorageView.vue b/frontend/src/views/CloudStorageView.vue new file mode 100644 index 0000000..1c0805d --- /dev/null +++ b/frontend/src/views/CloudStorageView.vue @@ -0,0 +1,89 @@ + + +