5c58778a41
지식/업무 문서 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>
86 lines
2.5 KiB
Svelte
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>
|