import { ChevronDown, CopyIcon, LockIcon, PlusIcon } from "lucide-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/src/components/ui/dialog"; import { api } from "@/src/utils/api"; import { cn } from "@/src/utils/tailwind"; import { useState } from "react"; import { DropdownMenuItem, DropdownMenuSeparator, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, } from "@/src/components/ui/dropdown-menu"; import Link from "next/link"; import { NewDatasetItemForm } from "@/src/features/datasets/components/NewDatasetItemForm"; import { useHasProjectAccess } from "@/src/features/rbac/utils/checkProjectAccess"; import { Button } from "@/src/components/ui/button"; import { usePostHogClientCapture } from "@/src/features/posthog-analytics/usePostHogClientCapture"; import { useIsAuthenticatedAndProjectMember } from "@/src/features/auth/hooks"; import { parseJsonPrioritised } from "@langfuse/shared"; import { ActionButton } from "@/src/components/ActionButton"; import { type MetadataDomainClient } from "@/src/utils/clientSideDomainTypes"; /** * Component for creating a new dataset item from an existing object. * * This component can be used in two different contexts: * 1. From a trace/observation: Creates a dataset item using data from a trace or observation * (requires traceId and optionally observationId) * 2. From an existing dataset item: Creates a new dataset item based on an existing one * (requires fromDatasetId) -> isCopyItem */ export const NewDatasetItemFromExistingObject = (props: { projectId: string; traceId?: string; observationId?: string; fromDatasetId?: string; input: string | null; output: string | null; metadata: MetadataDomainClient; isCopyItem?: boolean; buttonVariant?: "outline" | "secondary"; size?: "default" | "sm" | "xs" | "lg" | "icon" | "icon-xs" | "icon-sm"; }) => { const parsedInput = props.input && typeof props.input === "string" ? (parseJsonPrioritised(props.input) ?? null) : null; const parsedOutput = props.output && typeof props.output === "string" ? (parseJsonPrioritised(props.output) ?? null) : null; const [isFormOpen, setIsFormOpen] = useState(false); const isAuthenticatedAndProjectMember = useIsAuthenticatedAndProjectMember( props.projectId, ); const observationInDatasets = api.datasets.datasetItemsBasedOnTraceOrObservation.useQuery( { projectId: props.projectId, traceId: props.traceId as string, observationId: props.observationId, }, { enabled: isAuthenticatedAndProjectMember && !!props.traceId, }, ); const hasAccess = useHasProjectAccess({ projectId: props.projectId, scope: "datasets:CUD", }); const capture = usePostHogClientCapture(); const buttonVariant = props.buttonVariant || "secondary"; const buttonSize = props.size || "default"; return ( <> {props.isCopyItem ? ( { setIsFormOpen(true); }} > ) : observationInDatasets.data && observationInDatasets.data.length > 0 ? (
{observationInDatasets.data.map( ({ id: datasetItemId, datasetName, datasetId }) => ( {datasetName} ), )} { setIsFormOpen(true); }} >
) : ( )} Add item to datasets {isFormOpen && ( setIsFormOpen(false)} className="h-full overflow-y-auto" currentDatasetId={props.fromDatasetId} /> )} ); };