import { useMemo } from "react"; import { DatasetItemField } from "./DatasetItemField"; import { useDatasetItemValidation } from "../hooks/useDatasetItemValidation"; import type { DatasetSchema } from "../utils/datasetItemUtils"; import type { Control, FieldPath } from "react-hook-form"; import { FormField } from "@/src/components/ui/form"; type DatasetItemFieldsProps = { inputValue: string; expectedOutputValue: string; metadataValue: string; dataset: DatasetSchema | null; editable: boolean; // For form integration (edit mode) control?: Control; onInputChange?: (value: string) => void; onExpectedOutputChange?: (value: string) => void; onMetadataChange?: (value: string) => void; }; /** * Container component for dataset item fields (Input, Expected Output, Metadata). * Handles validation and error display for all fields. * * Can be used in two modes: * - View mode: read-only display with validation errors shown * - Edit mode: editable fields within a form (validation errors hidden during editing) */ export const DatasetItemFields = ({ inputValue, expectedOutputValue, metadataValue, dataset, editable, control, onInputChange, onExpectedOutputChange, onMetadataChange, }: DatasetItemFieldsProps) => { // Create dataset array for validation hook const datasets = useMemo(() => { if (!dataset) return []; return [dataset]; }, [dataset]); // Validate against dataset schemas const validation = useDatasetItemValidation( inputValue, expectedOutputValue, datasets, ); // Filter validation errors by field const inputErrors = validation.errors.filter((e) => e.field === "input"); const expectedOutputErrors = validation.errors.filter( (e) => e.field === "expectedOutput", ); const isFormMode = !!control; // In form mode, don't show validation errors (only used for submit button state) const showErrors = !isFormMode; return (
{/* Input Field */} {isFormMode && control ? ( } render={({ field }) => ( { onInputChange?.(v); field.onChange(v); }} errors={inputErrors} showErrors={showErrors} hasSchemas={validation.hasSchemas} isFormField /> )} /> ) : ( )} {/* Expected Output Field */} {isFormMode && control ? ( } render={({ field }) => ( { onExpectedOutputChange?.(v); field.onChange(v); }} errors={expectedOutputErrors} showErrors={showErrors} hasSchemas={validation.hasSchemas} isFormField /> )} /> ) : ( )}
{/* Metadata Field */} {isFormMode && control ? ( } render={({ field }) => ( { onMetadataChange?.(v); field.onChange(v); }} isFormField /> )} /> ) : ( )}
); };