'use client' import { useState, useEffect, useRef } from 'react' import { ProductModule } from '@/lib/types' import { Plus, Search } from 'lucide-react' interface ModulePopoverProps { assignedModules: ProductModule[] allModules: ProductModule[] onAddModule: (module: ProductModule) => void } export function ModulePopover({ assignedModules, allModules, onAddModule }: ModulePopoverProps) { const [isOpen, setIsOpen] = useState(false) const [search, setSearch] = useState('') const popoverRef = useRef(null) const inputRef = useRef(null) // Filter modules that are not already assigned to this product // We match by name to treat identical modules across products as the same entity const availableModules = allModules.filter(m => { const isAssigned = assignedModules.some(am => am.name.toLowerCase() === m.name.toLowerCase()) const matchesSearch = m.name.toLowerCase().includes(search.toLowerCase()) || (m.description && m.description.toLowerCase().includes(search.toLowerCase())) return !isAssigned && matchesSearch }) // Deduplicate available modules by name to show a clean list const uniqueAvailableModules: ProductModule[] = [] const seenNames = new Set() for (const m of availableModules) { const nameKey = m.name.toLowerCase() if (!seenNames.has(nameKey)) { seenNames.add(nameKey) uniqueAvailableModules.push(m) } } useEffect(() => { if (isOpen && inputRef.current) { inputRef.current.focus() } }, [isOpen]) useEffect(() => { function handleClickOutside(event: MouseEvent) { if (popoverRef.current && !popoverRef.current.contains(event.target as Node)) { setIsOpen(false) } } if (isOpen) { document.addEventListener('mousedown', handleClickOutside) } return () => { document.removeEventListener('mousedown', handleClickOutside) } }, [isOpen]) return (
{isOpen && (
setSearch(e.target.value)} className="w-full bg-white/5 border border-white/10 rounded-lg pl-9 pr-3 py-1.5 text-xs text-white placeholder-slate-400 outline-none focus:border-primary/50 transition-colors" />
{uniqueAvailableModules.length > 0 ? ( uniqueAvailableModules.map((mod) => ( )) ) : (
Keine passenden Module gefunden.
)}
)}
) }