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>
14 KiB
status, phase, source, started, updated, resolved_by
| status | phase | source | started | updated | resolved_by |
|---|---|---|---|---|---|
| resolved | 10-ux-interaction | 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 | 2026-06-16T00:00:00Z | 2026-06-16T19:31:00Z | 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 15–17.
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
Loading…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 in a v-else branch with no admin exemption. When /admin/* routes render, Vue Router places AdminLayout.vue into 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 without checking route.meta.requiresAdmin" missing:
- "Add third branch in App.vue: when route.matched.some(r => r.meta.requiresAdmin), render only 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 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 (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: ""