diff --git a/src/app/(main)/(admin)/indexes/[id]/[part]/page.tsx b/src/app/(main)/(admin)/indexes/[id]/[part]/page.tsx index ca82334e..bdf90570 100644 --- a/src/app/(main)/(admin)/indexes/[id]/[part]/page.tsx +++ b/src/app/(main)/(admin)/indexes/[id]/[part]/page.tsx @@ -12,7 +12,7 @@ import dynamic from 'next/dynamic'; import { type ReactElement, Suspense } from 'react'; const GraphEditor = dynamic(() => import('@/components/graph/GraphEditor').then(m => m.GraphEditor), { ssr: false }); -const GraphEntitiesTable = dynamic(() => import('@/components/graph/GraphEntitiesTable').then(m => m.GraphEntitiesTable), { ssr: false }); +const GraphCreateEntity = dynamic(() => import('@/components/graph/GraphCreateEntity').then(m => m.GraphCreateEntity), { ssr: false }); export default function Page ({ params }: PageProps<{ part: string }>) { const index = useIndex(); @@ -52,7 +52,7 @@ export default function Page ({ params }: PageProps<{ part: string }>) { case 'graph-entities': el = ( }> - + ); break; diff --git a/src/components/graph/GraphCreateEntity.tsx b/src/components/graph/GraphCreateEntity.tsx new file mode 100644 index 00000000..48965129 --- /dev/null +++ b/src/components/graph/GraphCreateEntity.tsx @@ -0,0 +1,169 @@ +import { createSynopsisEntity, type Entity } from '@/components/graph/api'; +import { JsonEditor } from '@/components/graph/components/JsonEditor'; +import { SearchEntity } from '@/components/graph/components/SearchEntity'; +import { SearchEntityById } from '@/components/graph/components/SearchEntityById'; +import { useEntities } from '@/components/graph/selectEntities'; +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Textarea } from '@/components/ui/textarea'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; +import type { Index } from '@/core/repositories/index_'; +import { cn } from '@/lib/utils'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { Loader2Icon, Maximize2Icon } from 'lucide-react'; +import type monaco from 'monaco-editor'; +import { useRouter } from 'next/navigation'; +import { type ReactNode, useRef } from 'react'; +import { useForm } from 'react-hook-form'; +import z from 'zod'; + +export function GraphCreateEntity ({ index, className }: { index: Index, className?: string }) { + const useEntitiesReturns = useEntities(); + const { clearSelection, ...useEntitiesRequired } = useEntitiesReturns; + const { selectedEntities } = useEntitiesRequired; + const router = useRouter(); + + return ( +
+
+ { + const createdEntity = await createSynopsisEntity(data); + router.push(`/indexes/${index.id}/graph-editor?query=entity:${createdEntity.id}`); + }} + onClearSelection={clearSelection} + afterEntities={( + <> + + + + )} + /> +
+
+ ); +} + +function CreateEntityForm ({ className, entities, onSubmit, onClearSelection, afterEntities }: { className?: string, entities: Entity[], onSubmit: (data: z.infer & { meta: any, entities: number[] }) => Promise, onClearSelection: (id?: number) => void, afterEntities?: ReactNode }) { + const form = useForm>({ + resolver: zodResolver(createEntitySchema), + defaultValues: { + name: '', + description: '', + topic: '', + }, + }); + const metaRef = useRef(null); + + const handleSubmit = form.handleSubmit(async values => onSubmit({ + ...values, + meta: JSON.parse(metaRef.current!.getValue()), + entities: entities.map(entity => Number(entity.id)), + })); + + const containerRef = useRef(null); + + const handleClickFullscreen = () => { + containerRef.current?.requestFullscreen(); + }; + + return ( +
+ +

Create synopsis entity

+ ( + + Name + + + + + + )} + /> + ( + + Description + +