diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte
index 65a17bf1b4..fbe5082fe3 100644
--- a/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte
+++ b/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte
@@ -33,6 +33,7 @@
export let onRenameDirectory = (id: string, name: string) => {};
export let onDeleteDirectory = (id: string) => {};
export let onMoveFileToDirectory = (fileId: string, directoryId: string) => {};
+ export let onMoveDirectoryToDirectory = (dirId: string, targetDirectoryId: string) => {};
@@ -45,6 +46,7 @@
onRename={(id, name) => onRenameDirectory(id, name)}
onDelete={(id) => onDeleteDirectory(id)}
onFileDrop={(fileId, directoryId) => onMoveFileToDirectory(fileId, directoryId)}
+ onDirDrop={(dirId, targetId) => onMoveDirectoryToDirectory(dirId, targetId)}
/>
{/each}
diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase/KnowledgeBreadcrumbs.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase/KnowledgeBreadcrumbs.svelte
index d3f152c214..f124acb2ff 100644
--- a/src/lib/components/workspace/Knowledge/KnowledgeBase/KnowledgeBreadcrumbs.svelte
+++ b/src/lib/components/workspace/Knowledge/KnowledgeBase/KnowledgeBreadcrumbs.svelte
@@ -7,12 +7,49 @@
export let rootLabel: string = 'Root';
export let breadcrumbs: { id: string; name: string }[] = [];
export let onNavigate: (directoryId: string | null) => void = () => {};
+ export let onMoveFile: (fileId: string, targetDirectoryId: string | null) => void = () => {};
+ export let onMoveDir: (dirId: string, targetDirectoryId: string | null) => void = () => {};
let breadcrumbEl: HTMLDivElement;
+ let dragOverCrumb: number | null = null;
afterUpdate(() => {
if (breadcrumbEl) breadcrumbEl.scrollLeft = breadcrumbEl.scrollWidth;
});
+
+ const handleDragOver = (e: DragEvent, index: number) => {
+ const hasFile = e.dataTransfer?.types.includes('application/x-kb-file-move');
+ const hasDir = e.dataTransfer?.types.includes('application/x-kb-dir-move');
+ if (!hasFile && !hasDir) return;
+ e.preventDefault();
+ e.stopPropagation();
+ dragOverCrumb = index;
+ };
+
+ const handleDragLeave = (index: number) => {
+ if (dragOverCrumb === index) dragOverCrumb = null;
+ };
+
+ const handleDrop = (e: DragEvent, targetDirId: string | null) => {
+ e.preventDefault();
+ e.stopPropagation();
+ dragOverCrumb = null;
+ const fileRaw = e.dataTransfer?.getData('application/x-kb-file-move');
+ if (fileRaw) {
+ try {
+ const data = JSON.parse(fileRaw);
+ if (data.fileId) onMoveFile(data.fileId, targetDirId);
+ } catch {}
+ return;
+ }
+ const dirRaw = e.dataTransfer?.getData('application/x-kb-dir-move');
+ if (dirRaw) {
+ try {
+ const data = JSON.parse(dirRaw);
+ if (data.dirId) onMoveDir(data.dirId, targetDirId);
+ } catch {}
+ }
+ };
onNavigate(null)}
+ on:dragover={(e) => handleDragOver(e, -1)}
+ on:dragleave={() => handleDragLeave(-1)}
+ on:drop={(e) => handleDrop(e, null)}
>
{rootLabel}
@@ -35,8 +78,14 @@
class="text-xs shrink-0 py-0.5 hover:underline transition
{i === breadcrumbs.length - 1
? 'text-gray-700 dark:text-gray-300'
- : 'text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-400'}"
+ : 'text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-400'}
+ {dragOverCrumb === i
+ ? 'bg-gray-100 dark:bg-gray-800 rounded-lg'
+ : ''}"
on:click={() => onNavigate(crumb.id)}
+ on:dragover={(e) => handleDragOver(e, i)}
+ on:dragleave={() => handleDragLeave(i)}
+ on:drop={(e) => handleDrop(e, crumb.id)}
>
{crumb.name}