add relationships

This commit is contained in:
1ilit 2023-09-19 15:47:45 +03:00
parent e39feea551
commit 5e2c205f39
2 changed files with 46 additions and 7 deletions

View File

@ -11,8 +11,12 @@ export default function Canvas(props) {
endX: 0, endX: 0,
endY: 0, endY: 0,
}); });
const [relationships, setRelationships] = useState([]);
const [offset, setOffset] = useState({ x: 0, y: 0 }); const [offset, setOffset] = useState({ x: 0, y: 0 });
const [onRect, setOnRect] = useState(false); const [onRect, setOnRect] = useState({
tableId: -1,
field: -2,
});
const [panning, setPanning] = useState(false); const [panning, setPanning] = useState(false);
const [panOffset, setPanOffset] = useState({ x: 0, y: 0 }); const [panOffset, setPanOffset] = useState({ x: 0, y: 0 });
const [cursor, setCursor] = useState("default"); const [cursor, setCursor] = useState("default");
@ -71,7 +75,7 @@ export default function Canvas(props) {
const handleMouseDown = (e) => { const handleMouseDown = (e) => {
if (dragging < 0) { if (dragging < 0) {
if (!onRect) { if (onRect.tableId < 0) {
setPanning(true); setPanning(true);
setPanOffset({ x: e.clientX, y: e.clientY }); setPanOffset({ x: e.clientX, y: e.clientY });
setCursor("grabbing"); setCursor("grabbing");
@ -83,6 +87,7 @@ export default function Canvas(props) {
setDragging(-1); setDragging(-1);
setPanning(false); setPanning(false);
setCursor("default"); setCursor("default");
if (linking) handleLinking();
setLinking(false); setLinking(false);
}; };
@ -96,10 +101,21 @@ export default function Canvas(props) {
setPanning(false); setPanning(false);
setDragging(-1); setDragging(-1);
setLinking(true); setLinking(true);
handleLinking();
}; };
const handleLinking = () => {}; const handleLinking = () => {
if (onRect.tableId < 0) return;
if (onRect.field < 0) return;
setRelationships((prev) => [
...prev,
{
startX: line.startX,
startY: line.startY,
endX: props.tables[onRect.tableId].x + 15,
endY: props.tables[onRect.tableId].y + onRect.field * 36 + 40 + 19,
},
]);
};
const [, drop] = useDrop( const [, drop] = useDrop(
() => ({ () => ({
@ -203,6 +219,15 @@ export default function Canvas(props) {
strokeDasharray="5,5" strokeDasharray="5,5"
/> />
)} )}
{relationships.map((e) => (
<line
x1={e.startX}
y1={e.startY}
x2={e.endX}
y2={e.endY}
stroke="gray"
/>
))}
</svg> </svg>
</div> </div>
</div> </div>

View File

@ -96,11 +96,13 @@ export default function Table(props) {
onMouseDown={props.onMouseDown} onMouseDown={props.onMouseDown}
onMouseEnter={() => { onMouseEnter={() => {
setIsHovered(true); setIsHovered(true);
props.setOnRect(true);
}} }}
onMouseLeave={() => { onMouseLeave={() => {
setIsHovered(false); setIsHovered(false);
props.setOnRect(false); props.setOnRect({
tableId: -1,
field: -2,
});
}} }}
> >
<div <div
@ -110,7 +112,15 @@ export default function Table(props) {
> >
<div className="p-3 font-bold text-slate-800 h-[40px] bg-gray-400 rounded-t-md flex justify-between items-center"> <div className="p-3 font-bold text-slate-800 h-[40px] bg-gray-400 rounded-t-md flex justify-between items-center">
{ {
<form onSubmit={(e) => e.preventDefault()}> <form
onSubmit={(e) => e.preventDefault()}
onMouseEnter={() =>
props.setOnRect({
tableId: props.id,
field: -1,
})
}
>
<input <input
type="text" type="text"
value={name} value={name}
@ -200,6 +210,10 @@ export default function Table(props) {
} h-[36px] p-2 flex justify-between`} } h-[36px] p-2 flex justify-between`}
onMouseEnter={() => { onMouseEnter={() => {
setHoveredField(i); setHoveredField(i);
props.setOnRect({
tableId: props.id,
field: i,
});
}} }}
onMouseLeave={() => { onMouseLeave={() => {
setHoveredField(-1); setHoveredField(-1);