import React, { useRef, useState, useEffect } from "react"; import { FormControl, FormField, FormItem, FormLabel, } from "@/components/ui/form.tsx"; import { Input } from "@/components/ui/input.tsx"; import { Button } from "@/components/ui/button.tsx"; import type { Control, UseFormWatch } from "react-hook-form"; interface CredentialGeneralTabProps { control: Control; watch: UseFormWatch; folders: string[]; t: (key: string, params?: any) => string; } export function CredentialGeneralTab({ control, watch, folders, t, }: CredentialGeneralTabProps) { const [tagInput, setTagInput] = useState(""); const [folderDropdownOpen, setFolderDropdownOpen] = useState(false); const folderInputRef = useRef(null); const folderDropdownRef = useRef(null); const folderValue = watch("folder"); const filteredFolders = React.useMemo(() => { if (!folderValue) return folders; return folders.filter((f) => f.toLowerCase().includes(folderValue.toLowerCase()), ); }, [folderValue, folders]); const handleFolderClick = ( folder: string, onChange: (value: string) => void, ) => { onChange(folder); setFolderDropdownOpen(false); }; useEffect(() => { function handleClickOutside(event: MouseEvent) { if ( folderDropdownRef.current && !folderDropdownRef.current.contains(event.target as Node) && folderInputRef.current && !folderInputRef.current.contains(event.target as Node) ) { setFolderDropdownOpen(false); } } if (folderDropdownOpen) { document.addEventListener("mousedown", handleClickOutside); } else { document.removeEventListener("mousedown", handleClickOutside); } return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [folderDropdownOpen]); return ( <> {t("credentials.basicInformation")}
( {t("credentials.credentialName")} )} /> ( {t("credentials.username")} )} />
{t("credentials.organization")}
( {t("credentials.description")} )} /> ( {t("credentials.folder")} setFolderDropdownOpen(true)} onChange={(e) => { field.onChange(e); setFolderDropdownOpen(true); }} /> {folderDropdownOpen && filteredFolders.length > 0 && (
{filteredFolders.map((folder) => ( ))}
)}
)} /> ( {t("credentials.tags")}
{(field.value || []).map((tag: string, idx: number) => ( {tag} ))} setTagInput(e.target.value)} onKeyDown={(e) => { if (e.key === " " && tagInput.trim() !== "") { e.preventDefault(); const currentTags = field.value || []; if (!currentTags.includes(tagInput.trim())) { field.onChange([...currentTags, tagInput.trim()]); } setTagInput(""); } else if (e.key === "Enter" && tagInput.trim() !== "") { e.preventDefault(); const currentTags = field.value || []; if (!currentTags.includes(tagInput.trim())) { field.onChange([...currentTags, tagInput.trim()]); } setTagInput(""); } else if ( e.key === "Backspace" && tagInput === "" && (field.value || []).length > 0 ) { const currentTags = field.value || []; field.onChange(currentTags.slice(0, -1)); } }} placeholder={t("credentials.addTagsSpaceToAdd")} />
)} />
); }