diff --git a/frontend/app/(sidebar)/data-pipeline/create/create-pipeline-multiform.tsx b/frontend/app/(sidebar)/data-pipeline/create/create-pipeline-multiform.tsx index eade1e1..1f10c02 100644 --- a/frontend/app/(sidebar)/data-pipeline/create/create-pipeline-multiform.tsx +++ b/frontend/app/(sidebar)/data-pipeline/create/create-pipeline-multiform.tsx @@ -14,6 +14,8 @@ import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Form } from "@/components/ui/form"; import { cn } from "@/lib/utils"; +import { pipelineSchema, PipelineFormValues } from "@/lib/validations/pipeline"; +import { zodResolver } from "@hookform/resolvers/zod"; const TOTAL_STEPS = 5; @@ -37,7 +39,9 @@ export default function CratePipelineForm() { const isFirstStep = step === 0; const isLastStep = step === TOTAL_STEPS - 1; - const form = useForm(); + const form = useForm({ + resolver: zodResolver(pipelineSchema), + }); const { handleSubmit, reset } = form; const onSubmit = async (formData: unknown) => { diff --git a/frontend/components/pipeline/ai-assistant.tsx b/frontend/components/pipeline/ai-assistant.tsx index 1ce3375..dc1259c 100644 --- a/frontend/components/pipeline/ai-assistant.tsx +++ b/frontend/components/pipeline/ai-assistant.tsx @@ -1,3 +1,4 @@ +import { useFormContext } from "react-hook-form"; import { Card, CardContent, @@ -9,6 +10,12 @@ import { Label } from "../ui/label"; import { Textarea } from "../ui/textarea"; export function PipelineAiAssistant() { + const { + handleSubmit, + reset, + register, + formState: { errors }, + } = useFormContext(); return ( @@ -24,6 +31,7 @@ export function PipelineAiAssistant() { placeholder="E.g., Focus on extracting pricing trends, ignore promotional content, prioritize property features..." rows={4} className="border-primary/20" + {...register("aiPrompt")} />

Provide specific instructions to guide the AI in processing your diff --git a/frontend/components/pipeline/details.tsx b/frontend/components/pipeline/details.tsx index b97b06f..edadad0 100644 --- a/frontend/components/pipeline/details.tsx +++ b/frontend/components/pipeline/details.tsx @@ -13,7 +13,12 @@ import { Label } from "../ui/label"; import { Textarea } from "../ui/textarea"; export function PipelineDetails() { - const { register } = useFormContext(); + const { + handleSubmit, + reset, + register, + formState: { errors }, + } = useFormContext(); return ( @@ -33,6 +38,13 @@ export function PipelineDetails() { {...register("name")} /> + {errors.name && ( +

+ {typeof errors.name?.message === "string" + ? errors.name.message + : ""} +

+ )}
@@ -43,6 +55,13 @@ export function PipelineDetails() { {...register("description")} />
+ {errors.description && ( +

+ {typeof errors.description?.message === "string" + ? errors.description.message + : ""} +

+ )}
diff --git a/frontend/lib/validations/pipeline.ts b/frontend/lib/validations/pipeline.ts new file mode 100644 index 0000000..44e0f56 --- /dev/null +++ b/frontend/lib/validations/pipeline.ts @@ -0,0 +1,10 @@ +import { z } from "zod"; + +export const pipelineSchema = z.object({ + name: z.string().min(1, "Pipeline name is required"), + description: z.string().min(1, "Description is required"), + aiPrompt: z.string().optional(), + tags: z.string().optional(), +}); + +export type PipelineFormValues = z.infer;