import { useEffect, useState, useRef } from "react"; import { Cardinality } from "../data/data"; import { calcPath } from "../utils"; function Table({ table, grab }) { const [isHovered, setIsHovered] = useState(false); const [hoveredField, setHoveredField] = useState(-1); const height = table.fields.length * 36 + 50 + 7; return ( setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} > {table.name} {table.fields.map((e, i) => ( setHoveredField(i)} onMouseLeave={() => setHoveredField(-1)} > {e.name} {e.type} ))} ); } function Relationship({ relationship }) { const pathRef = useRef(); let start = { x: 0, y: 0 }; let end = { x: 0, y: 0 }; let cardinalityStart = "1"; let cardinalityEnd = "1"; switch (relationship.cardinality) { case Cardinality.MANY_TO_ONE: cardinalityStart = "n"; cardinalityEnd = "1"; break; case Cardinality.ONE_TO_MANY: cardinalityStart = "1"; cardinalityEnd = "n"; break; case Cardinality.ONE_TO_ONE: cardinalityStart = "1"; cardinalityEnd = "1"; break; default: break; } const length = 32; const [refAquired, setRefAquired] = useState(false); useEffect(() => { setRefAquired(true); }, []); if (refAquired) { const pathLength = pathRef.current.getTotalLength(); const point1 = pathRef.current.getPointAtLength(length); start = { x: point1.x, y: point1.y }; const point2 = pathRef.current.getPointAtLength(pathLength - length); end = { x: point2.x, y: point2.y }; } return ( console.log(pathRef.current)}> {pathRef.current && ( <> {cardinalityStart} {cardinalityEnd} > )} ); } export default function Canvas({ diagram }) { const [tables, setTables] = useState(diagram.tables); const [relationships, setRelationships] = useState(diagram.relationships); const [dragging, setDragging] = useState(-1); const [offset, setOffset] = useState({ x: 0, y: 0 }); const grabTable = (e, id) => { setDragging(id); setOffset({ x: e.clientX - tables[id].x, y: e.clientY - tables[id].y, }); }; const moveTable = (e) => { if (dragging !== -1) { const dx = e.clientX - offset.x; const dy = e.clientY - offset.y; setTables((prev) => prev.map((table, i) => { if (i === dragging) { setRelationships((prev) => prev.map((r) => { if (r.startTableId === i) { return { ...r, startX: dx + 15, startY: dy + r.startFieldId * 36 + 69, endX: tables[r.endTableId].x + 15, endY: tables[r.endTableId].y + r.endFieldId * 36 + 69, }; } else if (r.endTableId === i) { return { ...r, startX: tables[r.startTableId].x + 15, startY: tables[r.startTableId].y + r.startFieldId * 36 + 69, endX: dx + 15, endY: dy + r.endFieldId * 36 + 69, }; } return r; }) ); return { ...table, x: dx, y: dy, }; } return table; }) ); } }; const releaseTable = () => { setDragging(-1); setOffset({ x: 0, y: 0 }); }; return ( {tables.map((t, i) => ( grabTable(e, i)} /> ))} {relationships.map((r, i) => ( ))} ); }