import Page from "@/src/components/layouts/page"; import { Button } from "@/src/components/ui/button"; import { NewDatasetItemFromExistingObject } from "@/src/features/datasets/components/NewDatasetItemFromExistingObject"; import { DetailPageNav } from "@/src/features/navigate-detail-pages/DetailPageNav"; import { api } from "@/src/utils/api"; import { ListTree, MoreVertical, Pencil, Trash2 } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/router"; import { DatasetStatus } from "@langfuse/shared"; import { useHasProjectAccess } from "@/src/features/rbac/utils/checkProjectAccess"; import { usePostHogClientCapture } from "@/src/features/posthog-analytics/usePostHogClientCapture"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/src/components/ui/dropdown-menu"; import { Popover, PopoverContent, PopoverTrigger, } from "@/src/components/ui/popover"; import { useState } from "react"; import { getDatasetItemTabs } from "@/src/features/navigation/utils/dataset-item-tabs"; import { type DatasetItemTab } from "@/src/features/navigation/utils/dataset-item-tabs"; import { type ReactNode } from "react"; import { Skeleton } from "@/src/components/ui/skeleton"; import { EditDatasetItemDialog } from "@/src/features/datasets/components/EditDatasetItemDialog"; import { useDatasetVersion } from "@/src/features/datasets/hooks/useDatasetVersion"; import { toDatasetSchema } from "@/src/features/datasets/utils/datasetItemUtils"; export const DatasetItemDetailPage = ({ activeTab, withPadding = true, children, }: { activeTab: DatasetItemTab; withPadding?: boolean; children: ReactNode; }) => { const router = useRouter(); const projectId = router.query.projectId as string; const datasetId = router.query.datasetId as string; const itemId = router.query.itemId as string; const hasAccess = useHasProjectAccess({ projectId, scope: "datasets:CUD" }); const capture = usePostHogClientCapture(); const utils = api.useUtils(); const [isArchivePopoverOpen, setIsArchivePopoverOpen] = useState(false); const [editDialogOpen, setEditDialogOpen] = useState(false); const { selectedVersion } = useDatasetVersion(); const isViewingOldVersion = selectedVersion !== null; const dataset = api.datasets.byId.useQuery({ datasetId, projectId, }); const item = api.datasets.itemByIdAtVersion.useQuery( { datasetId, projectId, datasetItemId: itemId, }, { refetchOnWindowFocus: false, // breaks dirty form state }, ); const mutUpdate = api.datasets.updateDatasetItem.useMutation({ onSuccess: () => { utils.datasets.invalidate(); setIsArchivePopoverOpen(false); }, }); const mutDelete = api.datasets.deleteDatasetItem.useMutation({ onSuccess: () => { router.push(`/project/${projectId}/datasets/${datasetId}/items`); }, }); const toggleArchiveStatus = () => { if (!item.data?.status || !hasAccess || mutUpdate.isPending) return; const newStatus = item.data.status === DatasetStatus.ARCHIVED ? DatasetStatus.ACTIVE : DatasetStatus.ARCHIVED; capture("dataset_item:archive_toggle", { status: newStatus === DatasetStatus.ARCHIVED ? "archived" : "unarchived", }); mutUpdate.mutate({ projectId, datasetId, datasetItemId: itemId, status: newStatus, }); }; const handleDelete = () => { if (!hasAccess || mutDelete.isPending) return; if ( window.confirm( "Are you sure you want to delete this item? This will also delete all run items that belong to this item.", ) ) { capture("dataset_item:delete"); mutDelete.mutate({ projectId, datasetId, datasetItemId: itemId, }); } }; return ( {item.data?.status && (

{item.data.status === DatasetStatus.ACTIVE ? "Archive this item?" : "Unarchive this item?"}

{item.data.status === DatasetStatus.ACTIVE ? "Archiving an item will exclude it from new dataset runs." : "Unarchiving an item will include it back in new dataset runs."}

)} {item.data?.sourceTraceId && ( )} ), actionButtonsRight: ( <> `/project/${projectId}/datasets/${datasetId}/items/${entry.id}` } listKey="datasetItems" /> {item.data ? ( ) : ( )} setEditDialogOpen(true)} disabled={!hasAccess || isViewingOldVersion || !item.data} > Edit {mutDelete.isPending ? "Deleting..." : "Delete"} ), }} > {children}
); };