diff --git a/src/lib/components/chat/FileNav.svelte b/src/lib/components/chat/FileNav.svelte index 144beccf4..77445bd02 100644 --- a/src/lib/components/chat/FileNav.svelte +++ b/src/lib/components/chat/FileNav.svelte @@ -20,7 +20,10 @@ } from '$lib/apis/terminal'; import Folder from '../icons/Folder.svelte'; import Document from '../icons/Document.svelte'; + import PenAlt from '../icons/PenAlt.svelte'; + import Reset from '../icons/Reset.svelte'; import Spinner from '../common/Spinner.svelte'; + import Tooltip from '../common/Tooltip.svelte'; import ConfirmDialog from '../common/ConfirmDialog.svelte'; import FileNavToolbar from './FileNav/FileNavToolbar.svelte'; @@ -45,6 +48,19 @@ let fileLoading = false; let filePreviewRef: FilePreview; + // ── File preview toolbar state (bound from FilePreview) ───────────── + let editing = false; + let showRaw = false; + let saving = false; + + const MD_EXTS = new Set(['md', 'markdown', 'mdx']); + const CSV_EXTS = new Set(['csv', 'tsv']); + const getFileExt = (path: string | null) => path?.split('.').pop()?.toLowerCase() ?? ''; + + $: isMarkdown = MD_EXTS.has(getFileExt(selectedFile)); + $: isCsv = CSV_EXTS.has(getFileExt(selectedFile)); + $: isTextFile = fileContent !== null && fileImageUrl === null && filePdfData === null; + // ── Upload / folder creation ───────────────────────────────────────── let isDragOver = false; let uploading = false; @@ -428,19 +444,108 @@ onNewFolder={startNewFolder} onNewFile={startNewFile} onUploadFiles={handleUploadFiles} - /> + > + {#if fileImageUrl !== null} + + + + {/if} + {#if (isMarkdown || isCsv) && fileContent !== null} + + + + {/if} + {#if isTextFile} + {#if editing} + + + + + + + {:else} + + + + {/if} + {/if} + + + +
{#if selectedFile !== null} downloadFile(selectedFile)} onSave={async (content) => { const terminal = selectedTerminal; if (!terminal || !selectedFile) return; diff --git a/src/lib/components/chat/FileNav/FileNavToolbar.svelte b/src/lib/components/chat/FileNav/FileNavToolbar.svelte index 8b3b8de24..db5b3732a 100644 --- a/src/lib/components/chat/FileNav/FileNavToolbar.svelte +++ b/src/lib/components/chat/FileNav/FileNavToolbar.svelte @@ -127,5 +127,7 @@ uploadInput.value = ''; }} /> + {:else} + {/if}
diff --git a/src/lib/components/chat/FileNav/FilePreview.svelte b/src/lib/components/chat/FileNav/FilePreview.svelte index 5489aa3bc..a28bde13e 100644 --- a/src/lib/components/chat/FileNav/FilePreview.svelte +++ b/src/lib/components/chat/FileNav/FilePreview.svelte @@ -5,9 +5,6 @@ import DOMPurify from 'dompurify'; import Spinner from '../../common/Spinner.svelte'; import PDFViewer from '../../common/PDFViewer.svelte'; - import Tooltip from '../../common/Tooltip.svelte'; - import Reset from '../../icons/Reset.svelte'; - import PenAlt from '../../icons/PenAlt.svelte'; const i18n = getContext('i18n'); @@ -17,12 +14,11 @@ export let filePdfData: ArrayBuffer | null = null; export let fileContent: string | null = null; - export let onDownload: () => void = () => {}; export let onSave: ((content: string) => Promise) | null = null; - let editing = false; + export let editing = false; let editContent = ''; - let saving = false; + export let saving = false; // Reset edit state when switching files $: selectedFile, resetEdit(); @@ -33,13 +29,13 @@ saving = false; }; - const startEdit = () => { + export const startEdit = () => { editContent = fileContent ?? ''; editing = true; showRaw = true; }; - const saveEdit = async () => { + export const saveEdit = async () => { if (!onSave) return; saving = true; await onSave(editContent); @@ -47,7 +43,7 @@ editing = false; }; - const cancelEdit = () => { + export const cancelEdit = () => { editing = false; editContent = ''; }; @@ -109,7 +105,7 @@ $: csvHeader = csvRows.length > 0 ? csvRows[0] : []; $: csvBody = csvRows.length > 1 ? csvRows.slice(1) : []; - let showRaw = false; + export let showRaw = false; $: selectedFile, (showRaw = false); // reset to preview mode when switching files let pzInstance: PanZoom | null = null; @@ -122,7 +118,7 @@ }); }; - const resetImageView = () => { + export const resetImageView = () => { if (pzInstance) { pzInstance.moveTo(0, 0); pzInstance.zoomAbs(0, 0, 1); @@ -146,135 +142,6 @@ ? 'overflow-hidden' : 'overflow-y-auto'} min-h-0 relative h-full" > - -
- {#if fileImageUrl !== null} - - - - {/if} - {#if (isMarkdown || isCsv) && fileContent !== null} - - - - {/if} - {#if isTextFile && onSave} - {#if editing} - - - - - - - {:else} - - - - {/if} - {/if} - -
- {#if fileLoading}