"use client"; import { useEffect, useRef, useState, useMemo } from "react"; import { X } from "lucide-react"; import { cn } from "@/shared/lib/utils"; import type { SubjectTemplate } from "../services/subject-template-service"; import type { Tag } from "@/core/tagging/types"; interface SubjectTemplateInputProps { template: SubjectTemplate; fieldValues: Record; onFieldChange: (fieldId: string, value: string) => void; onClear: () => void; /** Project tags for {proiect} field autocomplete */ projectTags?: Tag[]; } export function SubjectTemplateInput({ template, fieldValues, onFieldChange, onClear, projectTags, }: SubjectTemplateInputProps) { const firstFieldRef = useRef(null); // Auto-focus first field on mount useEffect(() => { const timer = setTimeout(() => firstFieldRef.current?.focus(), 50); return () => clearTimeout(timer); }, []); let fieldRendered = 0; return (
{template.tokens.map((token, i) => { if (token.type === "static") { return ( {token.value} ); } const field = token.field!; const isFirst = fieldRendered === 0; fieldRendered++; // Project field — render with mini-autocomplete if (field.fieldType === "proiect" && projectTags && projectTags.length > 0) { return ( onFieldChange(field.id, val)} projectTags={projectTags} inputRef={isFirst ? firstFieldRef : undefined} /> ); } return ( onFieldChange(field.id, e.target.value)} placeholder={field.placeholder} className={cn( "border-b-2 border-dashed border-primary/40 bg-transparent", "text-sm font-medium text-foreground", "px-1 py-0 outline-none", "focus:border-primary focus:border-solid", "placeholder:text-muted-foreground/50 placeholder:italic placeholder:text-xs", field.width, )} /> ); })}
); } // ── Project Field with mini-autocomplete ── interface ProjectFieldInputProps { field: { id: string; placeholder: string; width: string }; value: string; onChange: (value: string) => void; projectTags: Tag[]; inputRef?: React.Ref; } function ProjectFieldInput({ field, value, onChange, projectTags, inputRef, }: ProjectFieldInputProps) { const [focused, setFocused] = useState(false); const suggestions = useMemo(() => { if (!value || value.length < 1) return projectTags.slice(0, 8); const q = value.toLowerCase(); return projectTags .filter( (t) => t.label.toLowerCase().includes(q) || (t.projectCode && t.projectCode.toLowerCase().includes(q)), ) .slice(0, 8); }, [value, projectTags]); const showDropdown = focused && suggestions.length > 0; return ( onChange(e.target.value)} onFocus={() => setFocused(true)} onBlur={() => setTimeout(() => setFocused(false), 200)} placeholder={field.placeholder} className={cn( "border-b-2 border-dashed border-primary/40 bg-transparent", "text-sm font-medium text-foreground", "px-1 py-0 outline-none", "focus:border-primary focus:border-solid", "placeholder:text-muted-foreground/50 placeholder:italic placeholder:text-xs", field.width, )} /> {showDropdown && (
{suggestions.map((tag) => ( ))}
)}
); }