From 90cebb0e0f0f54e1f1afa130bcde07740c31cda8 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 1 May 2026 13:48:42 +0300 Subject: [PATCH] fix: project create UX + project picker in DocumentEdit - Projects.tsx: pre-validate empty name, show fieldErrors on Field (root cause of '400 validation_error' was empty name silently rejected) - ProjectPicker component for DocumentEdit; selecting a project autofills default client when no client is yet set Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/web/src/components/ProjectPicker.tsx | 33 +++++++++++++++++++++++ apps/web/src/pages/DocumentEdit.tsx | 14 ++++++++++ apps/web/src/pages/Projects.tsx | 22 ++++++++++++--- 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 apps/web/src/components/ProjectPicker.tsx diff --git a/apps/web/src/components/ProjectPicker.tsx b/apps/web/src/components/ProjectPicker.tsx new file mode 100644 index 0000000..adf2883 --- /dev/null +++ b/apps/web/src/components/ProjectPicker.tsx @@ -0,0 +1,33 @@ +import { useEffect, useState } from 'react'; +import { api, type ProjectSummary } from '../api.js'; + +export function ProjectPicker({ + value, + onChange, +}: { + value: string | null; + onChange: (id: string | null, project?: ProjectSummary | null) => void; +}) { + const [projects, setProjects] = useState([]); + useEffect(() => { + api.get<{ items: ProjectSummary[] }>('/api/projects?status=active&limit=200') + .then((r) => setProjects(r.items)) + .catch(() => setProjects([])); + }, []); + return ( + + ); +} diff --git a/apps/web/src/pages/DocumentEdit.tsx b/apps/web/src/pages/DocumentEdit.tsx index c1dfc4a..e23fb23 100644 --- a/apps/web/src/pages/DocumentEdit.tsx +++ b/apps/web/src/pages/DocumentEdit.tsx @@ -4,6 +4,7 @@ import { api, ApiError, type Block, type DocBody, type DocStatus, type DocType, import { BlocksEditor } from '../components/BlocksEditor.js'; import { ClientPicker } from '../components/ClientPicker.js'; import { LinesEditor, type LineDraft } from '../components/LinesEditor.js'; +import { ProjectPicker } from '../components/ProjectPicker.js'; import { Button, Field, Select } from '../components/ui.js'; import { emptyRich } from '../lib/richtext.js'; @@ -257,6 +258,19 @@ export function DocumentEditPage() { value={issuedAt} onChange={(e) => setIssuedAt(e.target.value)} /> +