mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-08-15 06:00:48 +00:00
removed extra breadcrumb and made link in VS page more explicit
Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
This commit is contained in:
parent
6c4e4e7dde
commit
e703d5d41d
2 changed files with 104 additions and 69 deletions
|
@ -1,16 +1,31 @@
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import React from "react";
|
import { useParams, usePathname } from "next/navigation";
|
||||||
import LogsLayout from "@/components/layout/logs-layout";
|
import {
|
||||||
|
PageBreadcrumb,
|
||||||
|
BreadcrumbSegment,
|
||||||
|
} from "@/components/layout/page-breadcrumb";
|
||||||
|
|
||||||
export default function VectorStoresLayout({
|
export default function VectorStoreDetailLayout({
|
||||||
children,
|
children,
|
||||||
}: {
|
}: {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}) {
|
}) {
|
||||||
|
const params = useParams();
|
||||||
|
const pathname = usePathname();
|
||||||
|
const vectorStoreId = params.id as string;
|
||||||
|
|
||||||
|
const breadcrumbSegments: BreadcrumbSegment[] = [
|
||||||
|
{ label: "Vector Stores", href: "/logs/vector-stores" },
|
||||||
|
{ label: `Details (${vectorStoreId})` },
|
||||||
|
];
|
||||||
|
|
||||||
|
const isBaseDetailPage = pathname === `/logs/vector-stores/${vectorStoreId}`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<LogsLayout sectionLabel="Vector Stores" basePath="/logs/vector-stores">
|
<div className="space-y-4">
|
||||||
|
{isBaseDetailPage && <PageBreadcrumb segments={breadcrumbSegments} />}
|
||||||
{children}
|
{children}
|
||||||
</LogsLayout>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import type {
|
||||||
} from "llama-stack-client/resources/vector-stores/vector-stores";
|
} from "llama-stack-client/resources/vector-stores/vector-stores";
|
||||||
import { useRouter } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
import { usePagination } from "@/hooks/use-pagination";
|
import { usePagination } from "@/hooks/use-pagination";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
import {
|
import {
|
||||||
Table,
|
Table,
|
||||||
TableBody,
|
TableBody,
|
||||||
|
@ -49,73 +50,92 @@ export default function VectorStoresPage() {
|
||||||
}
|
}
|
||||||
}, [status, hasMore, loadMore]);
|
}, [status, hasMore, loadMore]);
|
||||||
|
|
||||||
if (status === "loading") {
|
const renderContent = () => {
|
||||||
|
if (status === "loading") {
|
||||||
|
return (
|
||||||
|
<div className="space-y-2">
|
||||||
|
<Skeleton className="h-8 w-full"/>
|
||||||
|
<Skeleton className="h-4 w-full"/>
|
||||||
|
<Skeleton className="h-4 w-full"/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status === "error") {
|
||||||
|
return <div className="text-destructive">Error: {error?.message}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stores || stores.length === 0) {
|
||||||
|
return <p>No vector stores found.</p>;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-2">
|
<div className="overflow-auto flex-1 min-h-0">
|
||||||
<Skeleton className="h-8 w-full" />
|
<Table>
|
||||||
<Skeleton className="h-4 w-full" />
|
<TableHeader>
|
||||||
<Skeleton className="h-4 w-full" />
|
<TableRow>
|
||||||
</div>
|
<TableHead>ID</TableHead>
|
||||||
|
<TableHead>Name</TableHead>
|
||||||
|
<TableHead>Created</TableHead>
|
||||||
|
<TableHead>Completed</TableHead>
|
||||||
|
<TableHead>Cancelled</TableHead>
|
||||||
|
<TableHead>Failed</TableHead>
|
||||||
|
<TableHead>In Progress</TableHead>
|
||||||
|
<TableHead>Total</TableHead>
|
||||||
|
<TableHead>Usage Bytes</TableHead>
|
||||||
|
<TableHead>Provider ID</TableHead>
|
||||||
|
<TableHead>Provider Vector DB ID</TableHead>
|
||||||
|
</TableRow>
|
||||||
|
</TableHeader>
|
||||||
|
<TableBody>
|
||||||
|
{stores.map((store) => {
|
||||||
|
const fileCounts = store.file_counts;
|
||||||
|
const metadata = store.metadata || {};
|
||||||
|
const providerId = metadata.provider_id ?? "";
|
||||||
|
const providerDbId = metadata.provider_vector_db_id ?? "";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TableRow
|
||||||
|
key={store.id}
|
||||||
|
onClick={() => router.push(`/logs/vector-stores/${store.id}`)}
|
||||||
|
className="cursor-pointer hover:bg-muted/50"
|
||||||
|
>
|
||||||
|
<TableCell>
|
||||||
|
<Button
|
||||||
|
variant="link"
|
||||||
|
className="p-0 h-auto font-mono text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300"
|
||||||
|
onClick={() =>
|
||||||
|
router.push(`/logs/vector-stores/${store.id}`)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{store.id}
|
||||||
|
</Button>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell>{store.name}</TableCell>
|
||||||
|
<TableCell>
|
||||||
|
{new Date(store.created_at * 1000).toLocaleString()}
|
||||||
|
</TableCell>
|
||||||
|
<TableCell>{fileCounts.completed}</TableCell>
|
||||||
|
<TableCell>{fileCounts.cancelled}</TableCell>
|
||||||
|
<TableCell>{fileCounts.failed}</TableCell>
|
||||||
|
<TableCell>{fileCounts.in_progress}</TableCell>
|
||||||
|
<TableCell>{fileCounts.total}</TableCell>
|
||||||
|
<TableCell>{store.usage_bytes}</TableCell>
|
||||||
|
<TableCell>{providerId}</TableCell>
|
||||||
|
<TableCell>{providerDbId}</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
if (status === "error") {
|
|
||||||
return <div className="text-destructive">Error: {error?.message}</div>;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stores || stores.length === 0) {
|
|
||||||
return <p>No vector stores found.</p>;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="overflow-auto flex-1 min-h-0">
|
<div className="space-y-4">
|
||||||
<Table>
|
<h1 className="text-2xl font-semibold">Vector Stores</h1>
|
||||||
<TableHeader>
|
{renderContent()}
|
||||||
<TableRow>
|
</div>
|
||||||
<TableHead>ID</TableHead>
|
|
||||||
<TableHead>Name</TableHead>
|
|
||||||
<TableHead>Created</TableHead>
|
|
||||||
<TableHead>Completed</TableHead>
|
|
||||||
<TableHead>Cancelled</TableHead>
|
|
||||||
<TableHead>Failed</TableHead>
|
|
||||||
<TableHead>In Progress</TableHead>
|
|
||||||
<TableHead>Total</TableHead>
|
|
||||||
<TableHead>Usage Bytes</TableHead>
|
|
||||||
<TableHead>Provider ID</TableHead>
|
|
||||||
<TableHead>Provider Vector DB ID</TableHead>
|
|
||||||
</TableRow>
|
|
||||||
</TableHeader>
|
|
||||||
<TableBody>
|
|
||||||
{stores.map((store) => {
|
|
||||||
const fileCounts = store.file_counts;
|
|
||||||
const metadata = store.metadata || {};
|
|
||||||
const providerId = metadata.provider_id ?? "";
|
|
||||||
const providerDbId = metadata.provider_vector_db_id ?? "";
|
|
||||||
|
|
||||||
return (
|
|
||||||
<TableRow
|
|
||||||
key={store.id}
|
|
||||||
onClick={() => router.push(`/logs/vector-stores/${store.id}`)}
|
|
||||||
className="cursor-pointer hover:bg-muted/50"
|
|
||||||
>
|
|
||||||
<TableCell>{store.id}</TableCell>
|
|
||||||
<TableCell>{store.name}</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
{new Date(store.created_at * 1000).toLocaleString()}
|
|
||||||
</TableCell>
|
|
||||||
<TableCell>{fileCounts.completed}</TableCell>
|
|
||||||
<TableCell>{fileCounts.cancelled}</TableCell>
|
|
||||||
<TableCell>{fileCounts.failed}</TableCell>
|
|
||||||
<TableCell>{fileCounts.in_progress}</TableCell>
|
|
||||||
<TableCell>{fileCounts.total}</TableCell>
|
|
||||||
<TableCell>{store.usage_bytes}</TableCell>
|
|
||||||
<TableCell>{providerId}</TableCell>
|
|
||||||
<TableCell>{providerDbId}</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue