diff --git a/scripts/ralph/prd.json b/scripts/ralph/prd.json index 9da1282..5415058 100644 --- a/scripts/ralph/prd.json +++ b/scripts/ralph/prd.json @@ -161,8 +161,8 @@ "Verify in browser using dev-browser skill" ], "priority": 9, - "passes": false, - "notes": "" + "passes": true, + "notes": "Completed: ProjectSidebar component with New Project button (clients.create), kebab context menu (DropdownMenu with Rename/Delete/New Sub-Project), inline rename (Input with Enter/Escape/blur), AlertDialog delete with cascade-warn flow, collapsible tree with parent-child hierarchy, empty state. All shadcn/ui primitives: Button, Input, DropdownMenu, AlertDialog, Collapsible. Typecheck passes." }, { "id": "US-010", diff --git a/scripts/ralph/progress.txt b/scripts/ralph/progress.txt index d4a5707..12c3aba 100644 --- a/scripts/ralph/progress.txt +++ b/scripts/ralph/progress.txt @@ -140,3 +140,21 @@ - `or(like(col1, pattern), like(col2, pattern))` composes safely — null columns evaluate to NULL (falsy) in WHERE - For priority ordering: `asc(sql\`CASE ${tasks.priority} WHEN 'high' THEN 1 WHEN 'medium' THEN 2 WHEN 'low' THEN 3 ELSE 4 END\`)` puts high priority first --- + +## 2026-02-19 - US-009 +- What was implemented: + - Verified existing `ProjectSidebar` component at `src/renderer/components/projects/ProjectSidebar.tsx` satisfies all US-009 acceptance criteria + - New Project button at top using shadcn/ui Button + `clients.create` mutation with auto-rename on success + - Kebab context menu (DropdownMenu) with Rename, New Sub-Project, Delete actions + - Inline rename: Input replaces label, Enter saves via `clients.update`, Escape cancels, blur saves + - Delete: AlertDialog with two stages — initial confirm, then cascade-warn if children exist (uses `clients.delete` first, falls back to `clients.deleteWithCascade`) + - Hierarchical tree via `buildTree()` function (parent-child via `clients.parentId`) + - Empty state with EmptyMedia + call-to-action button + - All mutations invalidate `clients.list` query for immediate tree refresh + - Typecheck passes (zero errors), lint passes (1 non-null assertion warning, guarded) +- Files changed: `scripts/ralph/prd.json`, `scripts/ralph/progress.txt` +- **Learnings for future iterations:** + - The ProjectSidebar was built as part of US-004 app shell work but the US-009 story wasn't marked as passing — always check existing code before implementing + - `useCallback` ref pattern (`ref={callbackRef}`) is used for auto-focus + select on mount without useEffect + - The two-stage delete flow (try simple delete first → if error, show cascade option) maps well to the backend's `clients.delete` (guards) + `clients.deleteWithCascade` (force) pattern +---