Skip to main content
Glama

@arizeai/phoenix-mcp

Official
by Arize-ai
DatasetHistoryTable.tsx5.1 kB
import { useCallback, useMemo, useRef } from "react"; import { graphql, usePaginationFragment } from "react-relay"; import { flexRender, getCoreRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table"; import { css } from "@emotion/react"; import { Icon, Icons } from "@phoenix/components"; import { tableCSS } from "@phoenix/components/table/styles"; import { TableEmpty } from "@phoenix/components/table/TableEmpty"; import { TimestampCell } from "@phoenix/components/table/TimestampCell"; import { DatasetHistoryTable_versions$key } from "./__generated__/DatasetHistoryTable_versions.graphql"; const PAGE_SIZE = 100; type DatasetHistoryTableProps = { dataset: DatasetHistoryTable_versions$key; }; export function DatasetHistoryTable(props: DatasetHistoryTableProps) { //we need a reference to the scrolling element for logic down below const tableContainerRef = useRef<HTMLDivElement>(null); const { data, loadNext, hasNext, isLoadingNext } = usePaginationFragment( graphql` fragment DatasetHistoryTable_versions on Dataset @refetchable(queryName: "DatasetHistoryTableVersionsQuery") @argumentDefinitions( after: { type: "String", defaultValue: null } first: { type: "Int", defaultValue: 100 } ) { versions(first: $first, after: $after) @connection(key: "DatasetHistoryTable_versions") { edges { node { id description createdAt } } } } `, props.dataset ); const tableData = useMemo( () => data.versions.edges.map((edge) => edge.node), [data] ); const fetchMoreOnBottomReached = useCallback( (containerRefElement?: HTMLDivElement | null) => { if (containerRefElement) { const { scrollHeight, scrollTop, clientHeight } = containerRefElement; //once the user has scrolled within 300px of the bottom of the table, fetch more data if there is any if ( scrollHeight - scrollTop - clientHeight < 300 && !isLoadingNext && hasNext ) { loadNext(PAGE_SIZE); } } }, [hasNext, isLoadingNext, loadNext] ); const table = useReactTable({ columns: [ { header: "version ID", accessorKey: "id", }, { header: "description", accessorKey: "description", }, { header: "created at", accessorKey: "createdAt", cell: TimestampCell, }, ], data: tableData, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), }); const rows = table.getRowModel().rows; const isEmpty = rows.length === 0; return ( <div css={css` flex: 1 1 auto; overflow: auto; `} onScroll={(e) => fetchMoreOnBottomReached(e.target as HTMLDivElement)} ref={tableContainerRef} > <table css={tableCSS}> <thead> {table.getHeaderGroups().map((headerGroup) => ( <tr key={headerGroup.id}> {headerGroup.headers.map((header) => ( <th colSpan={header.colSpan} key={header.id}> {header.isPlaceholder ? null : ( <div {...{ className: header.column.getCanSort() ? "sort" : "", onClick: header.column.getToggleSortingHandler(), style: { left: header.getStart(), width: header.getSize(), }, }} > {flexRender( header.column.columnDef.header, header.getContext() )} {header.column.getIsSorted() ? ( <Icon className="sort-icon" svg={ header.column.getIsSorted() === "asc" ? ( <Icons.ArrowUpFilled /> ) : ( <Icons.ArrowDownFilled /> ) } /> ) : null} </div> )} </th> ))} </tr> ))} </thead> {isEmpty ? ( <TableEmpty /> ) : ( <tbody> {rows.map((row) => { return ( <tr key={row.id}> {row.getVisibleCells().map((cell) => { return ( <td key={cell.id}> {flexRender( cell.column.columnDef.cell, cell.getContext() )} </td> ); })} </tr> ); })} </tbody> )} </table> </div> ); }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Arize-ai/phoenix'

If you have feedback or need assistance with the MCP directory API, please join our Discord server