chore: archive v0.2 phase directories to milestones/v0.2-phases/

Moves phases 08–11 execution artifacts from .planning/phases/ to
.planning/milestones/v0.2-phases/ to keep .planning/phases/ clean
for the next milestone.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
curo1305
2026-06-17 14:34:52 +02:00
co-authored by Claude Sonnet 4.6
parent e008bf7dae
commit 123ae5b29b
101 changed files with 759 additions and 4 deletions
@@ -0,0 +1,234 @@
---
status: resolved
phase: 10-ux-interaction
source: 10-01-SUMMARY.md, 10-02-SUMMARY.md, 10-03-SUMMARY.md, 10-04-SUMMARY.md, 10-06-SUMMARY.md, 10-07-SUMMARY.md, 10-08-SUMMARY.md, 10-09-SUMMARY.md, 10-10-SUMMARY.md, 10-11-SUMMARY.md, 10-12-SUMMARY.md
started: 2026-06-16T00:00:00Z
updated: 2026-06-16T19:31:00Z
resolved_by: 10-13-PLAN.md
---
## Current Test
[testing complete]
## Tests
### 1. File Manager Loading Skeleton
expected: Open the file manager. While documents are loading, the content area shows 5 animated shimmer/pulse rows instead of any "Loading…" text. Once loaded, the shimmer rows disappear and real content (or an empty state) renders.
result: issue
reported: "Cloud folder view: no skeleton visible on load (loading=false on first render). Cloud files unclickable with no feedback."
severity: major
fix_applied: "loading=ref(true) in CloudFolderView; onFileOpen shows info toast. Commit ce67b9f. Local storage loads too fast to verify manually — skeleton confirmed present in template."
### 2. Empty State — No Documents
expected: In a folder with no documents, the content area shows a styled empty state with an icon (folder or document), a headline like "No documents yet" or similar, and descriptive subtext. Not just a blank white area.
result: pass
### 3. Empty State — No Search Results
expected: Type a search query that returns no matches. The content area shows an empty state with a search icon, a "No results" headline, and a "Clear search" link/button that resets the query.
result: pass
note: Search bar only visible inside a folder (breadcrumb.length > 0) — by design, root shows folders only. Empty state confirmed working inside folder.
### 4. Sidebar Loading Skeletons
expected: On first load, the sidebar's Folders, Cloud, and Topics sections show animated shimmer placeholder rows while their data loads. No plain spinner or "Loading" text.
result: issue
reported: "Local storage too fast to see any loading. Nextcloud sidebar section does nothing until folder loads — no skeleton or feedback visible during load."
severity: major
### 5. Sidebar Empty States
expected: With no folders created, no cloud connections, and no topics, each sidebar section shows a small (compact) empty state: a tiny icon with a brief message like "Create a folder in the file manager", "Connect in Settings", or "No topics yet".
result: issue
reported: "Empty states confirmed. But search bar and sorting controls are not visible at the root of the cloud and local file browser."
severity: major
note: Search-at-root absence was previously noted in test 3 as \"by design\", but user is explicitly flagging it as missing expected functionality.
### 6. Sidebar — No Inline "New Folder" Button
expected: The sidebar's Folders section header does NOT have a "New" or "New folder" button next to it. Folder creation happens only via the file manager toolbar.
result: pass
### 7. Breadcrumb Bar in File Manager
expected: The file manager shows a breadcrumb bar above the content. At the root it shows "Home". After navigating into a folder it shows "Home > FolderName". Clicking "Home" navigates back to root.
result: pass
### 8. Breadcrumb Bar in Admin Views
expected: Admin views (Users, Quotas, AI Config, Audit Log) and Settings show a breadcrumb bar with static segments like "Users", "Settings > Account", etc. No "Home" root button in these views.
result: issue
reported: "Admin views still show the normal user sidebar."
severity: major
### 9. Toast on Document Delete
expected: Delete a document. A toast notification appears in the bottom-right corner with a success message (e.g., "Document deleted"). It auto-dismisses after a few seconds.
result: pass
### 10. Toast on File Upload
expected: Upload one or more files. After upload completes, a toast appears summarising the result (e.g., "2 files uploaded" or a per-file message). It appears without a page refresh.
result: pass
note: User also reported drag-and-drop didn't work — covered in tests 1517.
### 11. Keyboard Shortcut — / Focuses Search
expected: While viewing the file manager with focus NOT in a text field, press "/". The search bar receives focus (cursor appears inside it). Pressing "/" while already in a text input does NOT trigger this.
result: issue
reported: "Search bar not visible at directory root (see gap #2). When inside a folder where search IS visible, pressing '/' does nothing."
severity: major
### 12. Keyboard Shortcut — U Opens Upload
expected: While viewing the file manager with focus not in a text field, press "U". The file-picker dialog opens (browser native file chooser), same as clicking the upload button.
result: issue
reported: "Pressing U does not open the file picker."
severity: major
### 13. Keyboard Shortcut — N Starts New Folder
expected: While viewing the file manager with focus not in a text field, press "N". The new-folder inline input appears in the content area, same as clicking the "New folder" toolbar button.
result: issue
reported: "Pressing N does not trigger new folder input."
severity: major
### 14. Keyboard Shortcut — Escape Clears Search
expected: With a search query active in the file manager, press "Escape". The search field clears and the full document list returns.
result: issue
reported: "Field clears on Escape, but search no longer works afterwards — cannot type a new query."
severity: major
### 15. OS Drag Overlay
expected: From the OS (Finder/Explorer), drag a file and hover it over the browser window. A full-screen semi-transparent overlay appears saying something like "Drop files to upload". Releasing the file starts the upload.
result: issue
reported: "Overlay appears correctly, but dropping the file does not start the upload."
severity: major
### 16. Drag Document to Folder
expected: In the file manager, drag a document row onto a folder row. The folder row highlights while the document hovers over it. Releasing drops the document into the folder (it moves; the folder item count updates).
result: pass
### 17. Click-After-Drag Guard
expected: After dragging a document (without dropping it onto a folder — just drag and release), the document does NOT open or navigate. The drag gesture does not accidentally trigger a "file open" action.
result: pass
### 18. Admin View Skeletons
expected: Open the Admin > Audit Log or Admin > Users page while data loads. The table body shows skeleton rows (animated shimmer cells) instead of a spinner or "Loading…" text.
result: pass
note: Skeleton visible but very briefly — data loads fast locally. Skeleton confirmed present.
### 19. Admin Audit Log Empty State
expected: With no audit log entries (or with filters that match nothing), the audit log table shows an empty state with a "Clear filters" button. Not just an empty table with no rows.
result: pass
## Summary
total: 19
passed: 10
issues: 9
pending: 0
skipped: 0
blocked: 0
## Gaps
- truth: "Sidebar Cloud section shows animated shimmer rows while Nextcloud data loads"
status: failed
reason: "User reported: Local storage too fast to see any loading. Nextcloud sidebar section does nothing until folder loads — no skeleton or feedback visible during load."
severity: major
test: 4
root_cause: "TreeItem.vue lines 48-52 render <div class='text-xs text-gray-400 py-1'>Loading…</div> instead of animate-pulse shimmer rows. The loading state ref is tracked correctly but the visual treatment does not match the shimmer pattern used elsewhere in AppSidebar."
artifacts:
- path: "frontend/src/components/ui/TreeItem.vue"
issue: "v-if='loading' branch renders plain text instead of animated skeleton rows (lines 48-52)"
missing:
- "Replace plain Loading… div with 3 shimmer rows using animate-pulse pattern matching AppSidebar lines 60-64"
debug_session: ""
- truth: "Admin views show admin-specific layout (no user sidebar) with breadcrumb bar"
status: failed
reason: "User reported: Admin views still show the normal user sidebar."
severity: major
test: 8
root_cause: "App.vue renders <AppSidebar> in a v-else branch with no admin exemption. When /admin/* routes render, Vue Router places AdminLayout.vue into <router-view> but AppSidebar is outside it — unconditionally rendered for all non-auth routes. Both sidebars appear simultaneously."
artifacts:
- path: "frontend/src/App.vue"
issue: "v-else branch (lines 3-8) renders <AppSidebar> without checking route.meta.requiresAdmin"
missing:
- "Add third branch in App.vue: when route.matched.some(r => r.meta.requiresAdmin), render only <router-view> with no AppSidebar"
debug_session: ""
- truth: "Pressing '/' while in the file manager (with search bar visible) focuses the search input"
status: failed
reason: "User reported: pressing '/' does nothing when search bar is visible inside a folder."
severity: major
test: 11
root_cause: "Shared root cause with tests 12 and 13: ref='routeViewRef' on <router-view> in App.vue resolves to the RouterView component proxy, not the FileManagerView instance. RouterView.setup() never calls expose(), so routeViewRef.value has no focusSearch/triggerUpload/startNewFolder properties. All calls silently no-op via optional chaining ?."
artifacts:
- path: "frontend/src/App.vue"
issue: "ref='routeViewRef' on <router-view> (line 6); shortcut handlers use routeViewRef.value?.focusSearch?.() etc. (lines 37, 43, 46) which are unreachable"
- path: "frontend/src/views/FileManagerView.vue"
issue: "defineExpose({ focusSearch, triggerUpload, startNewFolder }) is correct (lines 190-196) but unreachable via routeViewRef"
missing:
- "Replace routeViewRef approach with router.currentRoute.value.matched[0].instances.default to reach actual FileManagerView instance, or use a Pinia store / event bus for keyboard action dispatch"
debug_session: ""
- truth: "Pressing 'U' while in the file manager opens the file-picker dialog"
status: failed
reason: "User reported: pressing U does not open the file picker."
severity: major
test: 12
root_cause: "Same root cause as test 11: routeViewRef resolves to RouterView proxy, not FileManagerView. triggerUpload?.() is a no-op."
artifacts:
- path: "frontend/src/App.vue"
issue: "routeViewRef.value?.triggerUpload?.() (line 43) silently no-ops"
missing:
- "Fixed by the same routeViewRef fix as test 11"
debug_session: ""
- truth: "Pressing 'N' while in the file manager triggers the new-folder inline input"
status: failed
reason: "User reported: pressing N does not trigger new folder input."
severity: major
test: 13
root_cause: "Same root cause as test 11: routeViewRef resolves to RouterView proxy, not FileManagerView. startNewFolder?.() is a no-op."
artifacts:
- path: "frontend/src/App.vue"
issue: "routeViewRef.value?.startNewFolder?.() (line 46) silently no-ops"
missing:
- "Fixed by the same routeViewRef fix as test 11"
debug_session: ""
- truth: "After pressing Escape to clear search, the search field remains functional for new queries"
status: failed
reason: "User reported: field clears on Escape but search no longer works afterwards — cannot type a new query."
severity: major
test: 14
root_cause: "SearchBar.vue uses type='search' on the input (line 6) and handles @keydown.escape without .prevent. Browsers treat Escape on type='search' as native clear+blur — the field loses focus and the user cannot type without clicking first. Event also bubbles to App.vue global handler (no .stop) causing a redundant clearSearch call."
artifacts:
- path: "frontend/src/components/documents/SearchBar.vue"
issue: "@keydown.escape handler (line 11) lacks .prevent and .stop — browser native blur fires after Vue handler"
- path: "frontend/src/App.vue"
issue: "Global Escape handler (line 39) may fire redundantly after input blurs"
missing:
- "Change @keydown.escape to @keydown.escape.prevent.stop in SearchBar.vue to suppress native blur and prevent bubbling"
debug_session: ""
- truth: "Dropping a file from OS onto the drag overlay starts the upload"
status: failed
reason: "User reported: overlay appears but dropping the file does not start the upload."
severity: major
test: 15
root_cause: "OsDragOverlay registers window 'drop' listener in bubble phase. StorageBrowser registers @drop.prevent on every folder row (line 79), which consumes the native drop event before it bubbles to window. OsDragOverlay has pointer-events-none so drops land on underlying DOM elements (folder rows) which intercept them first. The window listener never fires."
artifacts:
- path: "frontend/src/components/layout/OsDragOverlay.vue"
issue: "window.addEventListener('drop', this.onDrop) registered in bubble phase (line 56) — consumed by folder rows first"
- path: "frontend/src/components/storage/StorageBrowser.vue"
issue: "@drop.prevent on folder rows (line 79) intercepts OS drops; onDropDocOnFolder guard (line 364) exits early for OS drags (draggingFile is null)"
missing:
- "Register OsDragOverlay window listener in capture phase: window.addEventListener('drop', this.onDrop, true) so it runs before element-level handlers"
debug_session: ""
- truth: "Search bar and sorting controls are visible at the root level of the file manager and cloud file browser (currently hidden behind breadcrumb.length > 0 guard)"
status: failed
reason: "User reported: search bar and sorting controls not visible at the root of the cloud and local file browser."
severity: major
test: 5
root_cause: "StorageBrowser.vue line 287: showSearch computed is props.mode === 'local' && props.breadcrumb.length > 0. Both conditions must be true — breadcrumb is [] at root so showSearch is false there; cloud mode also always false because mode guard requires 'local'. SearchBar (line 12) and SortControls (line 14) both share v-if='showSearch' so both disappear."
artifacts:
- path: "frontend/src/components/storage/StorageBrowser.vue"
issue: "showSearch computed (line 287) has breadcrumb.length > 0 and mode === 'local' guards; both incorrect"
missing:
- "Change showSearch to computed(() => props.mode === 'local' || props.mode === 'cloud') — remove breadcrumb depth guard entirely"
debug_session: ""