diff --git a/frontend/src/app/knowledge/chunks/page.tsx b/frontend/src/app/knowledge/chunks/page.tsx index cdc9fcc3..cb96eddc 100644 --- a/frontend/src/app/knowledge/chunks/page.tsx +++ b/frontend/src/app/knowledge/chunks/page.tsx @@ -1,12 +1,6 @@ "use client"; -import { - ArrowLeft, - Copy, - File as FileIcon, - Loader2, - Search, -} from "lucide-react"; +import { ArrowLeft, Check, Copy, Loader2, Search } from "lucide-react"; import { Suspense, useCallback, useEffect, useMemo, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { ProtectedRoute } from "@/components/protected-route"; @@ -41,6 +35,9 @@ function ChunksPageContent() { ChunkResult[] >([]); const [selectedChunks, setSelectedChunks] = useState>(new Set()); + const [activeCopiedChunkIndex, setActiveCopiedChunkIndex] = useState< + number | null + >(null); // Calculate average chunk length const averageChunkLength = useMemo( @@ -70,8 +67,11 @@ function ChunksPageContent() { } }, [queryInputText, chunks]); - const handleCopy = useCallback((text: string) => { - navigator.clipboard.writeText(text); + const handleCopy = useCallback((text: string, index: number) => { + // Trim whitespace and remove new lines/tabs for cleaner copy + navigator.clipboard.writeText(text.trim().replace(/[\n\r\t]/gm, "")); + setActiveCopiedChunkIndex(index); + setTimeout(() => setActiveCopiedChunkIndex(null), 10 * 1000); // 10 seconds }, []); const fileData = (data as File[]).find( @@ -148,17 +148,29 @@ function ChunksPageContent() {
{/* Header */}
-
- +

+ {/* Removes file extension from filename */} + {filename.replace(/\.[^/.]+$/, "")} +

-
-
+
+
+ : null} + id="search-query" + type="text" + defaultValue={parsedFilterData?.query} + value={queryInputText} + onChange={(e) => setQueryInputText(e.target.value)} + placeholder="Search chunks..." + /> +
+
-
- setQueryInputText(e.target.value)} - placeholder="Search chunks..." - className="flex-1 bg-muted/20 rounded-lg border border-border/50 px-4 py-3 focus-visible:ring-1 focus-visible:ring-ring" - /> - -
{/* Content Area - matches knowledge page structure */} -
+
{isFetching ? (
@@ -237,12 +234,15 @@ function ChunksPageContent() {