'use client' import React, { useState, useEffect } from 'react' import { useParams } from 'next/navigation' interface Component { id: string name: string type: string version: string description: string safety_relevant: boolean parent_id: string | null children: Component[] library_component_id?: string energy_source_ids?: string[] } interface LibraryComponent { id: string name_de: string name_en: string category: string description_de: string typical_hazard_categories: string[] typical_energy_sources: string[] maps_to_component_type: string tags: string[] sort_order: number } interface EnergySource { id: string name_de: string name_en: string description_de: string typical_components: string[] typical_hazard_categories: string[] tags: string[] sort_order: number } const LIBRARY_CATEGORIES: Record = { mechanical: 'Mechanik', structural: 'Struktur', drive: 'Antrieb', hydraulic: 'Hydraulik', pneumatic: 'Pneumatik', electrical: 'Elektrik', control: 'Steuerung', sensor: 'Sensorik', actuator: 'Aktorik', safety: 'Sicherheit', it_network: 'IT/Netzwerk', } const COMPONENT_TYPES = [ { value: 'SW', label: 'Software (SW)' }, { value: 'FW', label: 'Firmware (FW)' }, { value: 'AI', label: 'KI-Modul (AI)' }, { value: 'HMI', label: 'Mensch-Maschine-Schnittstelle (HMI)' }, { value: 'SENSOR', label: 'Sensor' }, { value: 'ACTUATOR', label: 'Aktor' }, { value: 'CONTROLLER', label: 'Steuerung' }, { value: 'NETWORK', label: 'Netzwerk' }, { value: 'MECHANICAL', label: 'Mechanik' }, { value: 'ELECTRICAL', label: 'Elektrik' }, { value: 'OTHER', label: 'Sonstiges' }, ] function ComponentTypeIcon({ type }: { type: string }) { const colors: Record = { SW: 'bg-blue-100 text-blue-700', FW: 'bg-indigo-100 text-indigo-700', AI: 'bg-purple-100 text-purple-700', HMI: 'bg-pink-100 text-pink-700', SENSOR: 'bg-cyan-100 text-cyan-700', ACTUATOR: 'bg-orange-100 text-orange-700', CONTROLLER: 'bg-green-100 text-green-700', NETWORK: 'bg-yellow-100 text-yellow-700', MECHANICAL: 'bg-gray-100 text-gray-700', ELECTRICAL: 'bg-red-100 text-red-700', OTHER: 'bg-gray-100 text-gray-500', } return ( {type} ) } function ComponentTreeNode({ component, depth, onEdit, onDelete, onAddChild, }: { component: Component depth: number onEdit: (c: Component) => void onDelete: (id: string) => void onAddChild: (parentId: string) => void }) { const [expanded, setExpanded] = useState(true) const hasChildren = component.children && component.children.length > 0 return (
{/* Expand/collapse */}
{component.name} {component.version && ( v{component.version} )} {component.safety_relevant && ( Sicherheitsrelevant )} {component.library_component_id && ( Bibliothek )}
{component.description && ( {component.description} )} {/* Actions */}
{expanded && hasChildren && (
{component.children.map((child) => ( ))}
)}
) } interface ComponentFormData { name: string type: string version: string description: string safety_relevant: boolean parent_id: string | null } function ComponentForm({ onSubmit, onCancel, initialData, parentId, }: { onSubmit: (data: ComponentFormData) => void onCancel: () => void initialData?: Component | null parentId?: string | null }) { const [formData, setFormData] = useState({ name: initialData?.name || '', type: initialData?.type || 'SW', version: initialData?.version || '', description: initialData?.description || '', safety_relevant: initialData?.safety_relevant || false, parent_id: parentId || initialData?.parent_id || null, }) return (

{initialData ? 'Komponente bearbeiten' : parentId ? 'Unterkomponente hinzufuegen' : 'Neue Komponente'}

setFormData({ ...formData, name: e.target.value })} placeholder="z.B. Bildverarbeitungsmodul" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent dark:bg-gray-700 dark:border-gray-600 dark:text-white" />
setFormData({ ...formData, version: e.target.value })} placeholder="z.B. 1.2.0" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent dark:bg-gray-700 dark:border-gray-600 dark:text-white" />