diff --git a/.planning/phases/10-ux-interaction/10-06-SUMMARY.md b/.planning/phases/10-ux-interaction/10-06-SUMMARY.md new file mode 100644 index 0000000..d0bf707 --- /dev/null +++ b/.planning/phases/10-ux-interaction/10-06-SUMMARY.md @@ -0,0 +1,152 @@ +--- +phase: 10-ux-interaction +plan: "06" +subsystem: frontend/storage +tags: [wave-1, skeleton, empty-state, breadcrumb, toast, ux, vitest, tdd] +dependency_graph: + requires: [10-02, 10-03, 10-04, 10-05] + provides: [StorageBrowser-skeleton-UX-02, StorageBrowser-EmptyState-UX-01, BreadcrumbBar-wired-UX-12, toast-call-sites-UX-10] + affects: [FileManagerView, CloudFolderView, StorageBrowser] +tech_stack: + added: [] + patterns: [TDD-red-green, skeleton-grid, EmptyState-discriminator, breadcrumb-label-mapping, toast-call-site] +key_files: + created: [] + modified: + - frontend/src/components/storage/StorageBrowser.vue + - frontend/src/views/FileManagerView.vue + - frontend/src/views/CloudFolderView.vue + - frontend/src/components/storage/__tests__/StorageBrowser.skeleton.test.js + - frontend/src/views/__tests__/FileManagerView.test.js + deleted: + - frontend/src/components/folders/FolderBreadcrumb.vue + - frontend/src/components/folders/__tests__/FolderBreadcrumb.test.js +decisions: + - "StorageBrowser uses breadcrumb.length > 0 as in-folder discriminator for EmptyState icon (folder vs document)" + - "BreadcrumbBar receives :root-label based on mode prop ('Cloud' for cloud, 'Home' for local)" + - "FolderBreadcrumb.vue deleted in same commit as BreadcrumbBar swap (no dead code per CLAUDE.md)" + - "FileManagerView.test.js FolderBreadcrumb mock replaced with BreadcrumbBar mock (dead-code hygiene)" + - "Toast wiring: useToastStore() called at call-site inside doMove/doDeleteDoc/onFilesSelected (no top-level const)" +metrics: + duration_minutes: 10 + completed_date: "2026-06-15T20:26:00Z" + tasks_completed: 3 + tasks_total: 3 + files_created: 0 + files_modified: 5 + files_deleted: 2 +--- + +# Phase 10 Plan 06: StorageBrowser Wire-up Summary + +**One-liner:** StorageBrowser replaced Loading text with 5 animated skeleton rows, inline empty divs with three EmptyState variants, and FolderBreadcrumb with BreadcrumbBar; FileManagerView and CloudFolderView mapped breadcrumb segments to `{id, label}` and wired toast call sites for move/delete/upload. + +## Tasks Completed + +| Task | Name | Commit | Files | +|------|------|--------|-------| +| 1 | Promote UX-02 skeleton stubs to RED failing tests | 413d3f0 | `StorageBrowser.skeleton.test.js` | +| 2 | Update StorageBrowser — skeleton, EmptyState, BreadcrumbBar swap | d040e77 | `StorageBrowser.vue` | +| 3 | Update FileManagerView + CloudFolderView; delete FolderBreadcrumb | 9ea51d6 | `FileManagerView.vue`, `CloudFolderView.vue`, `FolderBreadcrumb.vue` (deleted), `FolderBreadcrumb.test.js` (deleted), `FileManagerView.test.js`, `StorageBrowser.skeleton.test.js` | + +## What Was Built + +### Task 1: RED tests for UX-02 skeleton + +Promoted 4 `it.todo` stubs in `StorageBrowser.skeleton.test.js` to real assertions: +- `renders 5 skeleton rows when loading=true and lists empty` — asserts `wrapper.findAll('.animate-pulse').length >= 5` +- `Loading… text is absent when loading=true` — asserts `wrapper.text()` does not contain `'Loading…'` +- `skeleton rows are NOT rendered when loading=false` — asserts zero `.animate-pulse` elements +- `skeleton row grid matches grid-cols-[2rem_1fr_6rem_8rem_6rem]` — asserts at least one matching grid container + +Tests 1 and 2 were RED before Task 2. All 4 turn GREEN after Task 2. + +### Task 2: StorageBrowser.vue updated (GREEN) + +**Imports:** `FolderBreadcrumb` replaced by `BreadcrumbBar` + `EmptyState` added. + +**Template — BreadcrumbBar:** Replaced `` with: +```vue + +``` + +**Template — Skeleton rows (lines 226-238):** Replaced `
Loading…
` with `