feat: 문서 삭제 기능 — 정보 패널에서 확인 후 삭제 (파일+DB)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
<script>
|
<script>
|
||||||
import { X, ExternalLink, Plus, Save } from 'lucide-svelte';
|
import { X, ExternalLink, Plus, Save, Trash2 } from 'lucide-svelte';
|
||||||
import { api } from '$lib/api';
|
import { api } from '$lib/api';
|
||||||
import { addToast } from '$lib/stores/ui';
|
import { addToast } from '$lib/stores/ui';
|
||||||
import FormatIcon from './FormatIcon.svelte';
|
import FormatIcon from './FormatIcon.svelte';
|
||||||
import TagPill from './TagPill.svelte';
|
import TagPill from './TagPill.svelte';
|
||||||
|
|
||||||
let { doc, onclose } = $props();
|
let { doc, onclose, ondelete = () => {} } = $props();
|
||||||
|
|
||||||
// 메모 상태
|
// 메모 상태
|
||||||
let noteText = $state('');
|
let noteText = $state('');
|
||||||
@@ -16,6 +16,24 @@
|
|||||||
let newTag = $state('');
|
let newTag = $state('');
|
||||||
let tagEditing = $state(false);
|
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
|
// 편집 URL
|
||||||
let editUrlText = $state('');
|
let editUrlText = $state('');
|
||||||
let editUrlEditing = $state(false);
|
let editUrlEditing = $state(false);
|
||||||
@@ -273,5 +291,30 @@
|
|||||||
</div>
|
</div>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</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>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
|
|||||||
@@ -258,7 +258,7 @@
|
|||||||
aria-label="정보 패널 닫기"
|
aria-label="정보 패널 닫기"
|
||||||
></button>
|
></button>
|
||||||
<div class="absolute right-0 top-0 bottom-0 z-50 w-[320px] shadow-xl">
|
<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>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
Reference in New Issue
Block a user