diff --git a/src/components/EditorCanvas/Canvas.jsx b/src/components/EditorCanvas/Canvas.jsx index 2a6751671..44ea706eb 100644 --- a/src/components/EditorCanvas/Canvas.jsx +++ b/src/components/EditorCanvas/Canvas.jsx @@ -3,6 +3,7 @@ import { Action, Cardinality, Constraint, + darkBgTheme, ObjectType, } from "../../data/constants"; import { Toast } from "@douyinfe/semi-ui"; @@ -431,9 +432,9 @@ export default function Canvas() { cardinality: Cardinality.ONE_TO_ONE, updateConstraint: Constraint.NONE, deleteConstraint: Constraint.NONE, - name: `${tables[linkingLine.startTableId].name}_${ + name: `fk_${tables[linkingLine.startTableId].name}_${ tables[linkingLine.startTableId].fields[linkingLine.startFieldId].name - }_fk`, + }_${tables[hoveredTable.tableId].name}`, id: relationships.length, }; delete newRelationship.startX; @@ -498,7 +499,7 @@ export default function Canvas() { className="w-full h-full" style={{ cursor: pointer.style, - backgroundColor: theme === "dark" ? "rgba(22, 22, 26, 1)" : "white", + backgroundColor: theme === "dark" ? darkBgTheme : "white", }} > {settings.showGrid && ( diff --git a/src/components/EditorCanvas/Relationship.jsx b/src/components/EditorCanvas/Relationship.jsx index 9f512a9a0..fd2935435 100644 --- a/src/components/EditorCanvas/Relationship.jsx +++ b/src/components/EditorCanvas/Relationship.jsx @@ -1,18 +1,29 @@ import { useRef } from "react"; -import { Cardinality, ObjectType, Tab } from "../../data/constants"; +import { + Cardinality, + darkBgTheme, + ObjectType, + Tab, +} from "../../data/constants"; import { calcPath } from "../../utils/calcPath"; import { useDiagram, useSettings, useLayout, useSelect } from "../../hooks"; import { useTranslation } from "react-i18next"; import { SideSheet } from "@douyinfe/semi-ui"; import RelationshipInfo from "../EditorSidePanel/RelationshipsTab/RelationshipInfo"; +const labelFontSize = 16; + export default function Relationship({ data }) { const { settings } = useSettings(); const { tables } = useDiagram(); const { layout } = useLayout(); const { selectedElement, setSelectedElement } = useSelect(); const { t } = useTranslation(); + + const theme = localStorage.getItem("theme"); + const pathRef = useRef(); + const labelRef = useRef(); let cardinalityStart = "1"; let cardinalityEnd = "1"; @@ -42,11 +53,21 @@ export default function Relationship({ data }) { let cardinalityEndX = 0; let cardinalityStartY = 0; let cardinalityEndY = 0; + let labelX = 0; + let labelY = 0; + + let labelWidth = labelRef.current?.getBBox().width ?? 0; + let labelHeight = labelRef.current?.getBBox().height ?? 0; const cardinalityOffset = 28; if (pathRef.current) { const pathLength = pathRef.current.getTotalLength(); + + const labelPoint = pathRef.current.getPointAtLength(pathLength / 2); + labelX = labelPoint.x - (labelWidth ?? 0) / 2; + labelY = labelPoint.y + (labelHeight ?? 0) / 2; + const point1 = pathRef.current.getPointAtLength(cardinalityOffset); cardinalityStartX = point1.x; cardinalityStartY = point1.y; @@ -105,6 +126,28 @@ export default function Relationship({ data }) { strokeWidth={2} cursor="pointer" /> + {settings.showRelationshipLabels && ( + <> + + + {data.name} + + + )} {pathRef.current && settings.showCardinality && ( <> - prev.map((e, idx) => (idx === a.rid ? { ...e, ...a.undo } : e)), - ); + updateRelationship(a.rid, a.undo); } else if (a.element === ObjectType.TYPE) { if (a.component === "field_add") { updateType(a.tid, { @@ -455,9 +454,7 @@ export default function ControlPanel({ updateTable(a.tid, a.redo, false); } } else if (a.element === ObjectType.RELATIONSHIP) { - setRelationships((prev) => - prev.map((e, idx) => (idx === a.rid ? { ...e, ...a.redo } : e)), - ); + updateRelationship(a.rid, a.redo); } else if (a.element === ObjectType.TYPE) { if (a.component === "field_add") { updateType(a.tid, { @@ -1232,6 +1229,18 @@ export default function ControlPanel({ showCardinality: !prev.showCardinality, })), }, + show_relationship_labels: { + state: settings.showRelationshipLabels ? ( + + ) : ( + + ), + function: () => + setSettings((prev) => ({ + ...prev, + showRelationshipLabels: !prev.showRelationshipLabels, + })), + }, show_debug_coordinates: { state: settings.showDebugCoordinates ? ( diff --git a/src/components/EditorSidePanel/RelationshipsTab/RelationshipInfo.jsx b/src/components/EditorSidePanel/RelationshipsTab/RelationshipInfo.jsx index fe9ec9ae9..3cfc4516b 100644 --- a/src/components/EditorSidePanel/RelationshipsTab/RelationshipInfo.jsx +++ b/src/components/EditorSidePanel/RelationshipsTab/RelationshipInfo.jsx @@ -1,4 +1,12 @@ -import { Row, Col, Select, Button, Popover, Table } from "@douyinfe/semi-ui"; +import { + Row, + Col, + Select, + Button, + Popover, + Table, + Input, +} from "@douyinfe/semi-ui"; import { IconDeleteStroked, IconLoopTextStroked, @@ -13,6 +21,7 @@ import { import { useDiagram, useUndoRedo } from "../../../hooks"; import i18n from "../../../i18n/i18n"; import { useTranslation } from "react-i18next"; +import { useState } from "react"; const columns = [ { @@ -27,8 +36,10 @@ const columns = [ export default function RelationshipInfo({ data }) { const { setUndoStack, setRedoStack } = useUndoRedo(); - const { tables, setRelationships, deleteRelationship } = useDiagram(); + const { tables, setRelationships, deleteRelationship, updateRelationship } = + useDiagram(); const { t } = useTranslation(); + const [editField, setEditField] = useState({}); const swapKeys = () => { setUndoStack((prev) => [ @@ -61,9 +72,9 @@ export default function RelationshipInfo({ data }) { idx === data.id ? { ...e, - name: `${tables[e.startTableId].name}_${ - tables[e.startTableId].fields[e.startFieldId].name - }_fk`, + name: `fk_${tables[e.endTableId].name}_${ + tables[e.endTableId].fields[e.endFieldId].name + }_${tables[e.startTableId].name}`, startTableId: e.endTableId, startFieldId: e.endFieldId, endTableId: e.startTableId, @@ -121,6 +132,36 @@ export default function RelationshipInfo({ data }) { return ( <> +
+
{t("name")}:
+ updateRelationship(data.id, { name: value })} + onFocus={(e) => setEditField({ name: e.target.value })} + onBlur={(e) => { + if (e.target.value === editField.name) return; + setUndoStack((prev) => [ + ...prev, + { + action: Action.EDIT, + element: ObjectType.RELATIONSHIP, + component: "self", + rid: data.id, + undo: editField, + redo: { name: e.target.value }, + message: t("edit_relationship", { + refName: e.target.value, + extra: "[name]", + }), + }, + ]); + setRedoStack([]); + }} + /> +
{t("primary")}: diff --git a/src/context/DiagramContext.jsx b/src/context/DiagramContext.jsx index 440f8a999..76ba79401 100644 --- a/src/context/DiagramContext.jsx +++ b/src/context/DiagramContext.jsx @@ -246,6 +246,12 @@ export default function DiagramContextProvider({ children }) { ); }; + const updateRelationship = (id, updatedValues) => { + setRelationships((prev) => + prev.map((t) => (t.id === id ? { ...t, ...updatedValues } : t)), + ); + }; + return ( { if ( expr.action === "add" && - expr.create_definitions.constraint_type.toLowerCase() === "foreign key" + expr.create_definitions.constraint_type.toLowerCase() === + "foreign key" ) { const relationship = {}; const startTable = e.table[0].table; @@ -230,7 +232,8 @@ export function fromMariaDB(ast, diagramDb = DB.GENERIC) { ); if (startFieldId === -1) return; - relationship.name = startTable + "_" + startField + "_fk"; + relationship.name = + "fk_" + startTable + "_" + startField + "_" + endTable; relationship.startTableId = startTableId; relationship.startFieldId = startFieldId; relationship.endTableId = endTableId; diff --git a/src/utils/importSQL/mssql.js b/src/utils/importSQL/mssql.js index fa5d1fd24..5f61e0fd1 100644 --- a/src/utils/importSQL/mssql.js +++ b/src/utils/importSQL/mssql.js @@ -138,7 +138,8 @@ export function fromMSSQL(ast, diagramDb = DB.GENERIC) { ); if (startFieldId === -1) return; - relationship.name = startTable + "_" + startField + "_fk"; + relationship.name = + "fk_" + startTable + "_" + startField + "_" + endTable; relationship.startTableId = startTableId; relationship.endTableId = endTableId; relationship.endFieldId = endFieldId; @@ -243,7 +244,8 @@ export function fromMSSQL(ast, diagramDb = DB.GENERIC) { ); if (startFieldId === -1) return; - relationship.name = startTable + "_" + startField + "_fk"; + relationship.name = + "fk_" + startTable + "_" + startField + "_" + endTable; relationship.startTableId = startTableId; relationship.startFieldId = startFieldId; relationship.endTableId = endTableId; diff --git a/src/utils/importSQL/mysql.js b/src/utils/importSQL/mysql.js index 075b3789e..aac8fa0a5 100644 --- a/src/utils/importSQL/mysql.js +++ b/src/utils/importSQL/mysql.js @@ -126,7 +126,8 @@ export function fromMySQL(ast, diagramDb = DB.GENERIC) { ); if (startFieldId === -1) return; - relationship.name = startTable + "_" + startField + "_fk"; + relationship.name = + "fk_" + startTable + "_" + startField + "_" + endTable; relationship.startTableId = startTableId; relationship.endTableId = endTableId; relationship.endFieldId = endFieldId; @@ -187,7 +188,8 @@ export function fromMySQL(ast, diagramDb = DB.GENERIC) { e.expr.forEach((expr) => { if ( expr.action === "add" && - expr.create_definitions.constraint_type.toLowerCase() === "foreign key" + expr.create_definitions.constraint_type.toLowerCase() === + "foreign key" ) { const relationship = {}; const startTable = e.table[0].table; @@ -230,7 +232,8 @@ export function fromMySQL(ast, diagramDb = DB.GENERIC) { ); if (startFieldId === -1) return; - relationship.name = startTable + "_" + startField + "_fk"; + relationship.name = + "fk_" + startTable + "_" + startField + "_" + endTable; relationship.startTableId = startTableId; relationship.startFieldId = startFieldId; relationship.endTableId = endTableId; diff --git a/src/utils/importSQL/postgres.js b/src/utils/importSQL/postgres.js index 3ac7a4b52..7ac90526a 100644 --- a/src/utils/importSQL/postgres.js +++ b/src/utils/importSQL/postgres.js @@ -129,7 +129,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) { ); if (startFieldId === -1) return; - relationship.name = startTable + "_" + startField + "_fk"; + relationship.name = + "fk_" + startTable + "_" + startField + "_" + endTable; relationship.startTableId = startTableId; relationship.endTableId = endTableId; relationship.endFieldId = endFieldId; @@ -199,7 +200,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) { ); if (startFieldId === -1) return; - relationship.name = startTable + "_" + startField + "_fk"; + relationship.name = + "fk_" + startTable + "_" + startField + "_" + endTable; relationship.startTableId = startTableId; relationship.startFieldId = startFieldId; relationship.endTableId = endTableId; @@ -326,7 +328,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) { ); if (startFieldId === -1) return; - relationship.name = startTable + "_" + startField + "_fk"; + relationship.name = + "fk_" + startTable + "_" + startField + "_" + endTable; relationship.startTableId = startTableId; relationship.startFieldId = startFieldId; relationship.endTableId = endTableId; diff --git a/src/utils/importSQL/sqlite.js b/src/utils/importSQL/sqlite.js index 93af6ab18..00a0e4e41 100644 --- a/src/utils/importSQL/sqlite.js +++ b/src/utils/importSQL/sqlite.js @@ -62,7 +62,8 @@ export function fromSQLite(ast, diagramDb = DB.GENERIC) { ); if (startFieldId === -1) return; - relationship.name = startTable.name + "_" + startFieldName + "_fk"; + relationship.name = + "fk_" + startTable.name + "_" + startFieldName + "_" + endTableName; relationship.startTableId = startTable.id; relationship.endTableId = endTableId; relationship.endFieldId = endFieldId;