본문으로 건너뛰기

사건 상세 페이지 — 버튼 Contract SSoT

ADR 0043 v2.66 — Track O. 사건 상세 페이지 (/cases/[caseId]) 의 모든 클릭 가능 요소의 contract (클릭 시 호출되는 handler + 기대 effect) 명세.

검증 경로:

  • 정적 (vitest): apps/web/__tests__/case-detail-contract-invariants.test.ts
  • E2E (Playwright): e2e/regression-case-detail-buttons.spec.ts (visibility 만)

카테고리별 65 버튼

헤더 (CaseHeader.tsx) — 7개

#라벨onClick / hrefHandler 정의 위치기대 effect
1뒤로가기 (←)<Link href="/cases">next/link 자체/cases 로 이동
2이전 사건router.push('/cases/{prev}')CasePrevNextNav.tsx:77이전 사건 상세
3다음 사건router.push('/cases/{next}')CasePrevNextNav.tsx:93다음 사건 상세
4서류 작성onShowDocGenerateCaseDetailClient setShowDocGenerate(true)InlineDocGenerate 모달
5인쇄 (Printer)onPrintSummaryCaseDetailClient window.open + win.print()새 탭 + print dialog
6사건 삭제 (Trash)onDeleteCaseDetailClient setShowDeleteDialog(true)AlertDialog open
7상태 드롭다운setPendingStatus(value)CaseHeader.tsx:288상태 변경 확인 dialog

상태 다이얼로그 (CaseHeader.tsx) — 2개

#라벨onClick기대 effect
8취소AlertDialogCancel다이얼로그 닫기
9변경AlertDialogAction → handleStatusConfirmFirestore mutation: 사건 status 변경 + activityLog

탭 네비게이션 (CaseDetailClient.tsx) — 13개

#라벨onClick기대 effect
10개요TabsTrigger value="overview"overview 탭 활성
11회수 (desktop)value="recovery"recovery 탭
12서류value="documents"documents 탭
13증거 (desktop)value="evidence"evidence 탭
14기일value="hearings"hearings 탭
15변제 (desktop)value="recoveries"recoveries 탭
16대화value="messages"messages 탭
17메모 (desktop)value="notes"notes 탭
18⋯ 더보기 (mobile)DropdownMenuTrigger숨겨진 탭 메뉴
19회수 (mobile)handleTabChange("recovery")recovery 탭 (mobile)
20증거 (mobile)handleTabChange("evidence")evidence 탭 (mobile)
21변제 (mobile)handleTabChange("recoveries")recoveries 탭 (mobile)
22메모 (mobile)handleTabChange("notes")notes 탭 (mobile)

사건 정보 카드 (CaseInfoSection.tsx) — 6개

#라벨onClick기대 effect
23편집setEditing(true)편집 mode 진입
24취소 (편집)setEditing(false)편집 mode 종료
25저장 (form submit)handleSubmit → updateCaseActionFirestore mutation
26의뢰인 포털 링크DialogTriggerPortalLinkDialog open
27계약기한 편집handleStartEdit계약기한 편집 mode
28계약기한 삭제handleDelete계약기한 삭제

포털 링크 다이얼로그 (PortalLinkDialog.tsx) — 7개

#라벨onClick기대 effect
29의뢰인 포털 링크 생성handleGenerate → createPortalTokenActionFirestore mutation: portalTokens add
30복사 (URL)handleCopyUrlclipboard.writeText(url) + toast
31복사 (코드)handleCopyCodeclipboard.writeText(code) + toast
32함께 공유handleShare카카오톡 공유 또는 클립보드
33새 코드로 재발급handleRegenerate새 토큰 발급 + 기존 무효화
34링크 비활성화handleRevokerevokePortalTokenAction
35(Dialog close)DialogClose다이얼로그 닫기

AI 전략 분석 (CaseStrategyReport.tsx) — 5개

#라벨onClick기대 effect
36전략 분석 (초기)handleGenerateexecuteAiAction → Gemini → saveStrategyReportAction
37다시 분석 (top-right)handleGenerate위와 동일
38재분석 (stale 배너)handleGenerate위와 동일
39다시 시도 (error)handleGenerate위와 동일
40이전 분석 (toggle)toggleHistory → listStrategyReportsActionhistory list expand (v2.59)

비슷한 과거 기억 (RelatedMemoriesPanel.tsx) — 3개 + 동적

#라벨onClick / href기대 effect
41기억에서 찾기 + AI 분석handleRunfindRelatedMemoriesAction + Gemini + saveMemoryAnalysisAction (v2.58)
42다시 분석handleRun위와 동일
43이전 분석 (toggle)toggleHistory → listMemoryAnalysesActionhistory list expand (v2.58)
44+검색 결과 카드<Link href="/legacy/{docId}">사무실 기억 상세로 이동 (v2.62)

Tab 컨텐츠 카드 (개요/서류/기일/대화 등) — 21개

#위치라벨onClick기대 effect
45CaseSummaryCards다음 기일 카드onClickhearings 탭 전환
46CaseSummaryCards청구금액 카드onClickrecoveries 탭 전환
47CaseFlowStageBanner다음액션 (동적)onAction권장 액션 (탭/모달)
48CaseNextActionsCard다음 행동 추천onClickstatus 변경/탭 전환
49PostJudgmentActionsPanel판결후 액션onClick항소/집행 액션
50CaseDetailClient서류 생성 (탭 내)setShowDocGenerate(true)InlineDocGenerate 모달
51CaseDetailClient업로드setShowDocUpload(true)CaseDocUploadModal
52RelatedCasesSection연결DialogTrigger관련사건 추가 dialog
53ClientDocChecklistPanel체크리스트 항목handleClick문서 수집 상태 토글
54CaseComments메모 전송handleSendFirestore mutation: comments add
55+기일 row 액션(행별로 다양)결과 입력/수정/삭제hearing mutations

기타 ARIA / 정보성 — 2개

#라벨동작기대 effect
64ℹ️ 상태 안내TooltipTrigger사건 상태 설명 툴팁
65ℹ️ 흐름 단계 안내TooltipTrigger9단계 흐름 설명

Contract 위반 회귀 가드 (정적 vitest)

각 핵심 버튼이 expected handler 와 정확히 연결되었는지 grep 검증.

검증 항목

  1. 헤더 7개onClick={onPrintSummary}, onClick={onDelete}, onClick={onShowDocGenerate}, <Link href="/cases">, disabled={!data.prevId/nextId}, setPendingStatus
  2. 상태 confirm 9 — AlertDialog open + handleStatusConfirm 호출
  3. 탭 13개 — TabsTrigger value 명시 + handleTabChange 모바일 분기
  4. 편집/저장 23~25 — setEditing 분기 + form submit handler
  5. 포털 29~34 — Server Action 호출 명시 (createPortalTokenAction 등)
  6. AI 36~40 — handleGenerate / toggleHistory + 액션 호출
  7. RAG 41~44 — handleRun / toggleHistory + Link href 사무실 기억

본 SSoT 파일 자체도 정적 invariant 가 검증 (위 목록 수가 65인지 + 핵심 키워드 누락 X).