feat: show file match count badge in search results

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-24 16:19:40 +01:00
parent 0faacc214b
commit 094001f9f7
3 changed files with 24 additions and 6 deletions

View File

@@ -23,12 +23,15 @@ export interface PackageRow {
id: string; id: string;
title: string; title: string;
}; };
matchedFileCount: number;
matchedByContent: boolean;
} }
interface PackageColumnsProps { interface PackageColumnsProps {
onViewFiles: (pkg: PackageRow) => void; onViewFiles: (pkg: PackageRow) => void;
onSetCreator: (pkg: PackageRow) => void; onSetCreator: (pkg: PackageRow) => void;
onSetTags: (pkg: PackageRow) => void; onSetTags: (pkg: PackageRow) => void;
searchTerm: string;
} }
function formatBytes(bytesStr: string): string { function formatBytes(bytesStr: string): string {
@@ -62,6 +65,7 @@ export function getPackageColumns({
onViewFiles, onViewFiles,
onSetCreator, onSetCreator,
onSetTags, onSetTags,
searchTerm,
}: PackageColumnsProps): ColumnDef<PackageRow, unknown>[] { }: PackageColumnsProps): ColumnDef<PackageRow, unknown>[] {
return [ return [
{ {
@@ -76,12 +80,22 @@ export function getPackageColumns({
accessorKey: "fileName", accessorKey: "fileName",
header: ({ column }) => <DataTableColumnHeader column={column} title="File Name" />, header: ({ column }) => <DataTableColumnHeader column={column} title="File Name" />,
cell: ({ row }) => ( cell: ({ row }) => (
<div className="flex items-center gap-2 min-w-0"> <div className="min-w-0">
<span className="font-medium truncate max-w-[300px]">{row.original.fileName}</span> <div className="flex items-center gap-2">
{row.original.isMultipart && ( <span className="font-medium truncate max-w-[300px]">{row.original.fileName}</span>
<Badge variant="outline" className="text-[10px] shrink-0"> {row.original.isMultipart && (
Multi <Badge variant="outline" className="text-[10px] shrink-0">
</Badge> Multi
</Badge>
)}
</div>
{searchTerm && row.original.matchedByContent && (
<button
className="text-[11px] text-amber-500 hover:text-amber-400 hover:underline cursor-pointer mt-0.5"
onClick={() => onViewFiles(row.original)}
>
{row.original.matchedFileCount.toLocaleString()} file match{row.original.matchedFileCount !== 1 ? "es" : ""}
</button>
)} )}
</div> </div>
), ),

View File

@@ -29,6 +29,7 @@ interface StlTableProps {
totalCount: number; totalCount: number;
ingestionStatus: IngestionAccountStatus[]; ingestionStatus: IngestionAccountStatus[];
availableTags: string[]; availableTags: string[];
searchTerm: string;
} }
export function StlTable({ export function StlTable({
@@ -37,6 +38,7 @@ export function StlTable({
totalCount, totalCount,
ingestionStatus, ingestionStatus,
availableTags, availableTags,
searchTerm,
}: StlTableProps) { }: StlTableProps) {
const router = useRouter(); const router = useRouter();
const pathname = usePathname(); const pathname = usePathname();
@@ -77,6 +79,7 @@ export function StlTable({
const columns = getPackageColumns({ const columns = getPackageColumns({
onViewFiles: (pkg) => setViewPkg(pkg), onViewFiles: (pkg) => setViewPkg(pkg),
searchTerm,
onSetCreator: (pkg) => { onSetCreator: (pkg) => {
const value = prompt("Enter creator name:", pkg.creator ?? ""); const value = prompt("Enter creator name:", pkg.creator ?? "");
if (value === null) return; if (value === null) return;

View File

@@ -49,6 +49,7 @@ export default async function StlFilesPage({ searchParams }: Props) {
totalCount={result.pagination.total} totalCount={result.pagination.total}
ingestionStatus={ingestionStatus} ingestionStatus={ingestionStatus}
availableTags={availableTags} availableTags={availableTags}
searchTerm={search}
/> />
); );
} }