feat: 문서 삭제 기능 — 정보 패널에서 확인 후 삭제 (파일+DB)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
<script>
|
||||
import { X, ExternalLink, Plus, Save } from 'lucide-svelte';
|
||||
import { X, ExternalLink, Plus, Save, Trash2 } from 'lucide-svelte';
|
||||
import { api } from '$lib/api';
|
||||
import { addToast } from '$lib/stores/ui';
|
||||
import FormatIcon from './FormatIcon.svelte';
|
||||
import TagPill from './TagPill.svelte';
|
||||
|
||||
let { doc, onclose } = $props();
|
||||
let { doc, onclose, ondelete = () => {} } = $props();
|
||||
|
||||
// 메모 상태
|
||||
let noteText = $state('');
|
||||
@@ -16,6 +16,24 @@
|
||||
let newTag = $state('');
|
||||
let tagEditing = $state(false);
|
||||
|
||||
// 삭제
|
||||
let deleteConfirm = $state(false);
|
||||
let deleting = $state(false);
|
||||
|
||||
async function deleteDoc() {
|
||||
deleting = true;
|
||||
try {
|
||||
await api(`/documents/${doc.id}?delete_file=true`, { method: 'DELETE' });
|
||||
addToast('success', '문서 삭제됨');
|
||||
ondelete();
|
||||
} catch (err) {
|
||||
addToast('error', '삭제 실패');
|
||||
} finally {
|
||||
deleting = false;
|
||||
deleteConfirm = false;
|
||||
}
|
||||
}
|
||||
|
||||
// 편집 URL
|
||||
let editUrlText = $state('');
|
||||
let editUrlEditing = $state(false);
|
||||
@@ -273,5 +291,30 @@
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
<!-- 삭제 -->
|
||||
<div class="pt-2 border-t border-[var(--border)]">
|
||||
{#if deleteConfirm}
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="text-xs text-[var(--error)]">정말 삭제?</span>
|
||||
<button
|
||||
onclick={deleteDoc}
|
||||
disabled={deleting}
|
||||
class="px-2 py-1 text-xs bg-[var(--error)] text-white rounded disabled:opacity-50"
|
||||
>{deleting ? '삭제 중...' : '확인'}</button>
|
||||
<button
|
||||
onclick={() => deleteConfirm = false}
|
||||
class="px-2 py-1 text-xs text-[var(--text-dim)]"
|
||||
>취소</button>
|
||||
</div>
|
||||
{:else}
|
||||
<button
|
||||
onclick={() => deleteConfirm = true}
|
||||
class="flex items-center gap-1 text-xs text-[var(--text-dim)] hover:text-[var(--error)]"
|
||||
>
|
||||
<Trash2 size={12} /> 문서 삭제
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
@@ -258,7 +258,7 @@
|
||||
aria-label="정보 패널 닫기"
|
||||
></button>
|
||||
<div class="absolute right-0 top-0 bottom-0 z-50 w-[320px] shadow-xl">
|
||||
<PreviewPanel doc={selectedDoc} onclose={() => infoPanelOpen = false} />
|
||||
<PreviewPanel doc={selectedDoc} onclose={() => infoPanelOpen = false} ondelete={() => { selectedDoc = null; infoPanelOpen = false; loadDocuments(); }} />
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
Reference in New Issue
Block a user