Files
hyungi_document_server/frontend/src/lib/components/editors/FileInfoView.svelte
T
Hyungi Ahn 5c58778a41 feat(library): doc_purpose 필드 + 자료실 업로드 기능
지식/업무 문서 1차 구분을 위한 doc_purpose(business|knowledge) 추가.
- 마이그레이션: document_purpose enum + 컬럼
- AI 분류: docPurpose 자동 추론 (빈 값만 채움)
- 업로드 API: doc_purpose + library_path Form 파라미터
- 자료실 업로드: business 기본값 + 선택 경로 자동 태깅
- FileInfoView: 용도 select (수동 변경, 실패 롤백)
- DocumentCard: 업무/참조 배지

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:26:59 +09:00

86 lines
2.5 KiB
Svelte

<script>
// Phase E.1 — 파일 메타 정보 read-only 표시.
import { api } from '$lib/api';
import { addToast } from '$lib/stores/toast';
let { doc } = $props();
function formatDate(dateStr) {
if (!dateStr) return '-';
return new Date(dateStr).toLocaleDateString('ko-KR', {
year: 'numeric',
month: 'short',
day: 'numeric',
});
}
function formatSize(bytes) {
if (!bytes) return '-';
if (bytes < 1024) return `${bytes}B`;
if (bytes < 1048576) return `${(bytes / 1024).toFixed(0)}KB`;
return `${(bytes / 1048576).toFixed(1)}MB`;
}
async function updatePurpose(e) {
const val = e.target.value || null;
const prev = doc.doc_purpose;
doc.doc_purpose = val;
try {
await api(`/documents/${doc.id}`, {
method: 'PATCH',
body: JSON.stringify({ doc_purpose: val }),
});
addToast('success', '용도 변경됨');
} catch {
doc.doc_purpose = prev;
addToast('error', '용도 변경 실패');
}
}
</script>
<div>
<h4 class="text-xs font-semibold text-dim uppercase mb-1.5">정보</h4>
<dl class="space-y-1.5 text-xs">
<div class="flex justify-between">
<dt class="text-dim">포맷</dt>
<dd class="text-text uppercase">
{doc.file_format}{doc.original_format ? ` (원본: ${doc.original_format})` : ''}
</dd>
</div>
<div class="flex justify-between">
<dt class="text-dim">크기</dt>
<dd class="text-text">{formatSize(doc.file_size)}</dd>
</div>
{#if doc.source_channel}
<div class="flex justify-between">
<dt class="text-dim">출처</dt>
<dd class="text-text">{doc.source_channel}</dd>
</div>
{/if}
{#if doc.data_origin}
<div class="flex justify-between">
<dt class="text-dim">구분</dt>
<dd class="text-text">{doc.data_origin}</dd>
</div>
{/if}
<div class="flex justify-between items-center">
<dt class="text-dim">용도</dt>
<dd>
<select
value={doc.doc_purpose || ''}
onchange={updatePurpose}
class="bg-bg border border-default rounded px-1 py-0.5 text-xs text-text outline-none focus:border-accent"
>
<option value="">미분류</option>
<option value="business">업무용</option>
<option value="knowledge">참조용</option>
</select>
</dd>
</div>
<div class="flex justify-between">
<dt class="text-dim">등록일</dt>
<dd class="text-text">{formatDate(doc.created_at)}</dd>
</div>
</dl>
</div>