diff --git a/frontend/src/routes/inbox/+page.svelte b/frontend/src/routes/inbox/+page.svelte index 0c74b1c..4c2156d 100644 --- a/frontend/src/routes/inbox/+page.svelte +++ b/frontend/src/routes/inbox/+page.svelte @@ -1,20 +1,67 @@ -
+
+
-

Inbox

- {documents.length} +

Inbox

+ {documents.length} + {#if unclassifiedCount > 0} + + + 미분류 {unclassifiedCount} + + {/if}
- - + {selected.size === approvableCount && approvableCount > 0 ? '전체 해제' : '전체 선택'} + + +
-
- {#if loading} -
- {#each Array(3) as _} -
- {/each} -
- {:else if documents.length === 0} -
-

Inbox가 비어 있습니다

-

새 파일이 들어오면 자동으로 표시됩니다

-
- {:else} -
- {#each documents as doc} -
+ +
+
+ +
+ +
+ + + {#if selectionCount > 0} +
+ + {selectionCount}건 선택 + {#if selectionOverLimit} + (최대 {MAX_SELECTION}건 초과) + {/if} + +
+ + +
+ {/if} + + + {#if loading} +
+ {#each Array(3) as _} + + {/each} +
+ {:else if filteredDocs.length === 0} + + {:else} +
+ {#each filteredDocs as doc (doc.id)} + {@const approvable = isApprovable(doc)} + {@const isChecked = selected.has(doc.id)} + {@const ov = overrides.get(doc.id) ?? {}} + {@const displayDomain = effectiveDomain(doc)} + {@const displayTags = effectiveTags(doc)} + {@const hasOverride = ov.domain !== undefined || ov.tags !== undefined} + +
toggleSelect(doc.id)} - class="mt-1 accent-[var(--accent)]" + class="mt-1 h-4 w-4 accent-accent disabled:opacity-40 disabled:cursor-not-allowed" + aria-label="{doc.title || '문서'} 선택" />
-
- {doc.file_format} - {doc.title || '제목 없음'} + +
+ + + {doc.title || '제목 없음'} + + {#if !approvable} + + + 도메인 선택 필요 + + {/if} + {#if hasOverride} + override + {/if}
{#if doc.ai_summary} -

{doc.ai_summary.slice(0, 120)}

+

{doc.ai_summary.slice(0, 140)}

{/if} -
- AI 분류: + + +
+ + {#if doc.extracted_at}{/if} + 추출 + + + {#if doc.ai_processed_at}{/if} + 분류 + + + {#if doc.embedded_at}{/if} + 임베딩 + + + · {doc.source_channel || '-'} + +
+ + +
+ 도메인 - {#if doc.ai_tags?.length > 0} -
- {#each doc.ai_tags.slice(0, 3) as tag} - {tag} + {#if hasOverride} + + {/if} + {#if displayTags.length > 0} +
+ {#each displayTags.slice(0, 6) as tag} + {/each}
{/if}
- {/each} -
- {/if} -
- - - {#if showConfirm} -
-
-

{selected.size}건을 승인합니다

-

AI 분류 결과를 확정하고 Inbox에서 이동합니다.

-
- - -
-
+ + {/each}
{/if}
+ + + + + + +

+ 선택한 {selectionCount}건에 로컬 override 적용. 아직 저장되지 않음 — 승인 시 반영됨. +

+