Clean up relationship component

This commit is contained in:
1ilit 2024-03-10 21:00:27 +02:00
parent 23bc6278a2
commit 91549d3089

View File

@ -1,17 +1,16 @@
import { useRef, useState } from "react"; import { useRef } from "react";
import { calcPath } from "../utils"; import { calcPath } from "../utils";
import { Cardinality } from "../data/data"; import { Cardinality } from "../data/data";
import useSettings from "../hooks/useSettings"; import useSettings from "../hooks/useSettings";
export default function Relationship(props) { export default function Relationship({ data }) {
const [hovered, setHovered] = useState(false);
const { settings } = useSettings(); const { settings } = useSettings();
const pathRef = useRef(); const pathRef = useRef();
let cardinalityStart = "1"; let cardinalityStart = "1";
let cardinalityEnd = "1"; let cardinalityEnd = "1";
switch (props.data.cardinality) { switch (data.cardinality) {
case Cardinality.MANY_TO_ONE: case Cardinality.MANY_TO_ONE:
cardinalityStart = "n"; cardinalityStart = "n";
cardinalityEnd = "1"; cardinalityEnd = "1";
@ -33,48 +32,37 @@ export default function Relationship(props) {
let cardinalityStartY = 0; let cardinalityStartY = 0;
let cardinalityEndY = 0; let cardinalityEndY = 0;
const length = 32; const cardinalityOffset = 28;
if (pathRef.current) { if (pathRef.current) {
const pathLength = pathRef.current.getTotalLength(); const pathLength = pathRef.current.getTotalLength();
const point1 = pathRef.current.getPointAtLength(length); const point1 = pathRef.current.getPointAtLength(cardinalityOffset);
cardinalityStartX = point1.x; cardinalityStartX = point1.x;
cardinalityStartY = point1.y; cardinalityStartY = point1.y;
const point2 = pathRef.current.getPointAtLength(pathLength - length); const point2 = pathRef.current.getPointAtLength(
pathLength - cardinalityOffset
);
cardinalityEndX = point2.x; cardinalityEndX = point2.x;
cardinalityEndY = point2.y; cardinalityEndY = point2.y;
} }
return ( return (
<g className="select-none"> <g className="select-none group">
<defs>
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow
dx="0"
dy="0"
stdDeviation="4"
floodColor="gray"
floodOpacity="0.3"
/>
</filter>
</defs>
<path <path
ref={pathRef} ref={pathRef}
d={calcPath( d={calcPath(
props.data.startX, data.startX,
props.data.endX, data.endX,
props.data.startY, data.startY,
props.data.endY, data.endY,
props.data.startFieldId, data.startFieldId,
props.data.endFieldId data.endFieldId
)} )}
stroke={hovered ? "blue" : "gray"} stroke="gray"
className="group-hover:stroke-sky-700"
fill="none" fill="none"
strokeWidth={2} strokeWidth={2}
filter="url(#shadow)"
cursor="pointer" cursor="pointer"
onMouseEnter={() => setHovered(true)}
onMouseLeave={() => setHovered(false)}
/> />
{pathRef.current && settings.showCardinality && ( {pathRef.current && settings.showCardinality && (
<> <>
@ -83,6 +71,7 @@ export default function Relationship(props) {
cy={cardinalityStartY} cy={cardinalityStartY}
r="12" r="12"
fill="grey" fill="grey"
className="group-hover:fill-sky-700"
></circle> ></circle>
<text <text
x={cardinalityStartX} x={cardinalityStartX}
@ -99,6 +88,7 @@ export default function Relationship(props) {
cy={cardinalityEndY} cy={cardinalityEndY}
r="12" r="12"
fill="grey" fill="grey"
className="group-hover:fill-sky-700"
></circle> ></circle>
<text <text
x={cardinalityEndX} x={cardinalityEndX}