From 3fab44b466a90e721bde0fd16cbed8ca3d351fe3 Mon Sep 17 00:00:00 2001 From: altair823 Date: Sat, 9 May 2026 16:46:55 +0900 Subject: [PATCH] =?UTF-8?q?chore(v029):=20final=20review=20minor=20cleanup?= =?UTF-8?q?=20=E2=80=94=20statusLabelWithParticle=20+=20initialTarget=20dr?= =?UTF-8?q?op?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 한국어 조사 분기: '보관로/휴지통로/활성로' → '보관으로/휴지통으로/활성으로' ('완료로' 만 받침 X). 받침 jongseong 검사 helper. - MoveStatusModal 의 unused initialTarget prop 제거 + caller (NoteCard) 정리 548/548 + typecheck 0 유지. Co-Authored-By: Claude Opus 4.7 (1M context) --- package-lock.json | 4 ++-- .../inbox/components/MoveStatusModal.tsx | 19 ++++++++++++++----- src/renderer/inbox/components/NoteCard.tsx | 5 ++--- tests/unit/MoveStatusModal.test.tsx | 4 ---- tests/unit/NoteCard.test.tsx | 6 +++--- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index c293371..d9ecb20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "inkling", - "version": "0.2.7", + "version": "0.2.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "inkling", - "version": "0.2.7", + "version": "0.2.8", "dependencies": { "better-sqlite3": "12.9.0", "electron-log": "5.2.0", diff --git a/src/renderer/inbox/components/MoveStatusModal.tsx b/src/renderer/inbox/components/MoveStatusModal.tsx index 9ac14f6..814f0b7 100644 --- a/src/renderer/inbox/components/MoveStatusModal.tsx +++ b/src/renderer/inbox/components/MoveStatusModal.tsx @@ -6,7 +6,6 @@ interface Props { noteId: string; rawText: string; summary: string; - initialTarget: NoteStatus; onClose: () => void; onMoved: (status: NoteStatus, reason: string | null) => void; } @@ -14,13 +13,10 @@ interface Props { /** * v0.2.9 Cut B Task 7 — 메모 이동 Modal. * - * 사유 입력 + 4 status 버튼 (활성/완료/보관/휴지통) + AI 자동 분류 placeholder. - * AI 분류는 Task 9 에서 정식 구현 — 본 task 는 stub IPC (`ai:classify-status`) - * 호출 path 만 working state. 추천 결과는 화면 표시 + 확정 버튼 두 단계. + * 사유 입력 + 3 status 버튼 (완료/보관/휴지통) + AI 자동 분류. */ export function MoveStatusModal({ noteId, - initialTarget: _initialTarget, onClose, onMoved }: Props): React.ReactElement { @@ -139,3 +135,16 @@ export function statusLabel(s: NoteStatus): string { return '휴지통'; } } + +/** + * status 의 한글 라벨에 적절한 조사를 붙여 반환. 받침 있으면 "으로", 없으면 "로". + * 예: '완료로' / '보관으로' / '휴지통으로' / '활성으로'. + */ +export function statusLabelWithParticle(s: NoteStatus): string { + const label = statusLabel(s); + const last = label.charCodeAt(label.length - 1); + // 한글 syllable block 외 → "로" default + if (last < 0xAC00 || last > 0xD7A3) return `${label}로`; + const jongseong = (last - 0xAC00) % 28; + return jongseong === 0 ? `${label}로` : `${label}으로`; +} diff --git a/src/renderer/inbox/components/NoteCard.tsx b/src/renderer/inbox/components/NoteCard.tsx index 008016d..52934c4 100644 --- a/src/renderer/inbox/components/NoteCard.tsx +++ b/src/renderer/inbox/components/NoteCard.tsx @@ -5,7 +5,7 @@ import { useInbox } from '../store.js'; import { EditableField } from './EditableField.js'; import { IntentBanner } from './IntentBanner.js'; import { pushTagUndo } from './TagUndoToast.js'; -import { MoveStatusModal, statusLabel } from './MoveStatusModal.js'; +import { MoveStatusModal, statusLabelWithParticle } from './MoveStatusModal.js'; interface Props { note: Note; @@ -438,7 +438,7 @@ export function NoteCard({ note, onDeleted, onUpdated, mode = 'inbox', onRestore cursor: 'pointer' }} > - {statusLabel(t)}로 이동 + {statusLabelWithParticle(t)} 이동 ))} @@ -476,7 +476,6 @@ export function NoteCard({ note, onDeleted, onUpdated, mode = 'inbox', onRestore noteId={local.id} rawText={local.rawText} summary={local.aiSummary ?? ''} - initialTarget={moveTarget} onClose={() => setMoveTarget(null)} onMoved={(newStatus, reason) => { const updated = { ...local, status: newStatus, moveReason: reason }; diff --git a/tests/unit/MoveStatusModal.test.tsx b/tests/unit/MoveStatusModal.test.tsx index a77ef0e..c083a86 100644 --- a/tests/unit/MoveStatusModal.test.tsx +++ b/tests/unit/MoveStatusModal.test.tsx @@ -32,7 +32,6 @@ describe('MoveStatusModal', () => { noteId="n1" rawText="t" summary="" - initialTarget="completed" onClose={vi.fn()} onMoved={vi.fn()} /> @@ -51,7 +50,6 @@ describe('MoveStatusModal', () => { noteId="n1" rawText="t" summary="" - initialTarget="completed" onClose={vi.fn()} onMoved={onMoved} /> @@ -71,7 +69,6 @@ describe('MoveStatusModal', () => { noteId="n1" rawText="t" summary="" - initialTarget="completed" onClose={vi.fn()} onMoved={onMoved} /> @@ -91,7 +88,6 @@ describe('MoveStatusModal', () => { noteId="n1" rawText="t" summary="" - initialTarget="archived" onClose={vi.fn()} onMoved={onMoved} /> diff --git a/tests/unit/NoteCard.test.tsx b/tests/unit/NoteCard.test.tsx index edd864e..df3a65d 100644 --- a/tests/unit/NoteCard.test.tsx +++ b/tests/unit/NoteCard.test.tsx @@ -134,9 +134,9 @@ describe('NoteCard — 이동 메뉴 (v0.2.9 Cut B Task 6)', () => { render( {}} mode="inbox" />); fireEvent.click(screen.getByRole('button', { name: '이동' })); expect(screen.getByRole('button', { name: '완료로 이동' })).toBeInTheDocument(); - expect(screen.getByRole('button', { name: '보관로 이동' })).toBeInTheDocument(); - expect(screen.getByRole('button', { name: '휴지통로 이동' })).toBeInTheDocument(); - expect(screen.queryByRole('button', { name: '활성로 이동' })).toBeNull(); + expect(screen.getByRole('button', { name: '보관으로 이동' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: '휴지통으로 이동' })).toBeInTheDocument(); + expect(screen.queryByRole('button', { name: '활성으로 이동' })).toBeNull(); }); it('메뉴 항목 클릭 → MoveStatusModal 열림 + 확정 시 setStatus 호출', async () => {