import { useState, useEffect } from 'react' import { Stack, Group, TextInput, Textarea, Text } from '@mantine/core' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, SimpleSelect, Button } from '@fn_library' import type { Entity, EntityTypePreset, EntityInput } from '../types' interface Props { presets: EntityTypePreset[] entity: Entity | null onSubmit: (input: EntityInput) => void onClose: () => void } export function EntityDialog({ presets, entity, onSubmit, onClose }: Props) { const [name, setName] = useState(entity?.name ?? '') const [typeRef, setTypeRef] = useState(entity?.type_ref ?? presets[0]?.type_ref ?? '') const [description, setDescription] = useState(entity?.description ?? '') const [notes, setNotes] = useState(entity?.notes ?? '') const [tagsStr, setTagsStr] = useState((entity?.tags ?? []).join(', ')) const [metadata, setMetadata] = useState>(() => { const m: Record = {} if (entity?.metadata) { for (const [k, v] of Object.entries(entity.metadata)) { m[k] = String(v ?? '') } } return m }) const currentPreset = presets.find(p => p.type_ref === typeRef) const metadataFields = currentPreset?.metadata_fields ?? [] useEffect(() => { if (!entity) { const m: Record = {} for (const f of metadataFields) { m[f] = metadata[f] ?? '' } setMetadata(m) } }, [typeRef]) // eslint-disable-line react-hooks/exhaustive-deps const handleSubmit = () => { const cleanMeta: Record = {} for (const [k, v] of Object.entries(metadata)) { if (v.trim()) { const num = Number(v) if (!isNaN(num) && v.trim() !== '') { cleanMeta[k] = num } else if (v === 'true') { cleanMeta[k] = true } else if (v === 'false') { cleanMeta[k] = false } else { cleanMeta[k] = v.trim() } } } onSubmit({ name: name.trim(), type_ref: typeRef, description: description.trim(), tags: tagsStr.split(',').map(t => t.trim()).filter(Boolean), metadata: cleanMeta, notes: notes.trim(), }) } return ( { if (!open) onClose() }}> {entity ? 'Edit Entity' : 'New Entity'} setName(e.currentTarget.value)} size="sm" />
Type ({ value: p.type_ref, label: p.label }))} />
setDescription(e.currentTarget.value)} size="sm" /> setTagsStr(e.currentTarget.value)} placeholder="osint, high-risk" size="sm" /> {metadataFields.length > 0 && (
Metadata ({currentPreset?.label}) {metadataFields.map(field => ( {field} setMetadata(prev => ({ ...prev, [field]: e.currentTarget.value }))} size="xs" flex={1} /> ))}
)}