From 17d41a8526193afe1384ee4c3c49f46a7844a469 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Fri, 3 Apr 2026 09:27:18 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Phase=201D+2=20=E2=80=94=20=EB=AA=A8?= =?UTF-8?q?=EB=B0=94=EC=9D=BC=20=EB=8C=80=EC=9D=91,=20=EC=8A=A4=EB=A7=88?= =?UTF-8?q?=ED=8A=B8=20=EA=B7=B8=EB=A3=B9,=20=EB=A9=94=EB=AA=A8,=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=20=ED=8E=B8=EC=A7=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모바일: 카드 클릭 시 detail 페이지로 이동 (뷰어 패널 미표시) - 스마트 그룹: 사이드바에 최근 7일/법령 알림/이메일 프리셋 필터 - 메모: user_note 컬럼 추가 (migration 004), PATCH API, PreviewPanel 인라인 편집 - 태그 편집: PreviewPanel에서 태그 추가(+)/삭제(×) 기능 - DB 모델 + API 스키마 user_note 필드 추가 Co-Authored-By: Claude Opus 4.6 (1M context) --- app/api/documents.py | 2 + app/models/document.py | 3 + .../src/lib/components/DocumentCard.svelte | 5 + .../src/lib/components/PreviewPanel.svelte | 170 +++++++++++++++--- frontend/src/lib/components/Sidebar.svelte | 25 ++- migrations/004_user_note.sql | 2 + 6 files changed, 177 insertions(+), 30 deletions(-) create mode 100644 migrations/004_user_note.sql diff --git a/app/api/documents.py b/app/api/documents.py index affaa43..714e3d0 100644 --- a/app/api/documents.py +++ b/app/api/documents.py @@ -36,6 +36,7 @@ class DocumentResponse(BaseModel): ai_sub_group: str | None ai_tags: list | None ai_summary: str | None + user_note: str | None source_channel: str | None data_origin: str | None extracted_at: datetime | None @@ -60,6 +61,7 @@ class DocumentUpdate(BaseModel): ai_domain: str | None = None ai_sub_group: str | None = None ai_tags: list | None = None + user_note: str | None = None source_channel: str | None = None data_origin: str | None = None diff --git a/app/models/document.py b/app/models/document.py index 4352852..ce56d94 100644 --- a/app/models/document.py +++ b/app/models/document.py @@ -44,6 +44,9 @@ class Document(Base): embed_model_version: Mapped[str | None] = mapped_column(String(50)) embedded_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) + # 사용자 메모 + user_note: Mapped[str | None] = mapped_column(Text) + # 메타데이터 source_channel: Mapped[str | None] = mapped_column( Enum("law_monitor", "devonagent", "email", "web_clip", diff --git a/frontend/src/lib/components/DocumentCard.svelte b/frontend/src/lib/components/DocumentCard.svelte index aa3443a..2530d17 100644 --- a/frontend/src/lib/components/DocumentCard.svelte +++ b/frontend/src/lib/components/DocumentCard.svelte @@ -24,6 +24,11 @@ } function handleClick() { + // 모바일에서는 항상 detail 페이지로 이동 + if (window.innerWidth < 1024) { + goto(`/documents/${doc.id}`); + return; + } if (onselect) { onselect(doc); } else { diff --git a/frontend/src/lib/components/PreviewPanel.svelte b/frontend/src/lib/components/PreviewPanel.svelte index 603a14f..de9459c 100644 --- a/frontend/src/lib/components/PreviewPanel.svelte +++ b/frontend/src/lib/components/PreviewPanel.svelte @@ -1,10 +1,79 @@