From f85adf0577721e44dd353cc866671bef07b46cfb Mon Sep 17 00:00:00 2001 From: Karen Mkrtumyan Date: Sun, 8 Jun 2025 00:22:31 +0400 Subject: [PATCH] Fix fit window, move hardcoded constants to `constants.js` (#482) * fix fit window, move hardcoded constants to constants.js * comment fixes * change import from utils.js to utils --- src/components/EditorCanvas/Canvas.jsx | 3 +- src/components/EditorCanvas/Note.jsx | 32 ++++++------ src/components/EditorCanvas/Table.jsx | 4 +- src/components/EditorHeader/ControlPanel.jsx | 51 +++++++++++++++++--- src/components/Thumbnail.jsx | 37 +++++++------- src/data/constants.js | 3 ++ src/utils/utils.js | 14 ++++++ 7 files changed, 99 insertions(+), 45 deletions(-) diff --git a/src/components/EditorCanvas/Canvas.jsx b/src/components/EditorCanvas/Canvas.jsx index 4fb5234..4724ac5 100644 --- a/src/components/EditorCanvas/Canvas.jsx +++ b/src/components/EditorCanvas/Canvas.jsx @@ -28,6 +28,7 @@ import { useTranslation } from "react-i18next"; import { useEventListener } from "usehooks-ts"; import { areFieldsCompatible } from "../../utils/utils"; import { getRectFromEndpoints, isInsideRect } from "../../utils/rect"; +import { noteWidth } from "../../data/constants"; export default function Canvas() { const { t } = useTranslation(); @@ -154,7 +155,7 @@ export default function Canvas() { { x: note.x, y: note.y, - width: 180, + width: noteWidth, height: note.height, }, rect, diff --git a/src/components/EditorCanvas/Note.jsx b/src/components/EditorCanvas/Note.jsx index 4703377..1885efb 100644 --- a/src/components/EditorCanvas/Note.jsx +++ b/src/components/EditorCanvas/Note.jsx @@ -15,11 +15,9 @@ import { useSaveState, } from "../../hooks"; import { useTranslation } from "react-i18next"; +import { noteWidth, noteRadius, noteFold } from "../../data/constants"; export default function Note({ data, onPointerDown }) { - const w = 180; - const r = 3; - const fold = 24; const [editField, setEditField] = useState({}); const [hovered, setHovered] = useState(false); const { layout } = useLayout(); @@ -102,15 +100,15 @@ export default function Note({ data, onPointerDown }) { }} > diff --git a/src/components/EditorCanvas/Table.jsx b/src/components/EditorCanvas/Table.jsx index b016a7d..1a3bf5e 100644 --- a/src/components/EditorCanvas/Table.jsx +++ b/src/components/EditorCanvas/Table.jsx @@ -22,6 +22,7 @@ import { useTranslation } from "react-i18next"; import { dbToTypes } from "../../data/datatypes"; import { isRtl } from "../../i18n/utils/rtl"; import i18n from "../../i18n/i18n"; +import { getTableHeight } from "../../utils/utils"; export default function Table(props) { const [hoveredField, setHoveredField] = useState(null); @@ -45,8 +46,7 @@ export default function Table(props) { [settings.mode], ); - const height = - tableData.fields.length * tableFieldHeight + tableHeaderHeight + 7; + const height = getTableHeight(tableData); const isSelected = useMemo(() => { return ( diff --git a/src/components/EditorHeader/ControlPanel.jsx b/src/components/EditorHeader/ControlPanel.jsx index dfb920b..955fe54 100644 --- a/src/components/EditorHeader/ControlPanel.jsx +++ b/src/components/EditorHeader/ControlPanel.jsx @@ -42,6 +42,7 @@ import { SIDESHEET, DB, IMPORT_FROM, + noteWidth, } from "../../data/constants"; import jsPDF from "jspdf"; import { useHotkeys } from "react-hotkeys-hook"; @@ -79,6 +80,7 @@ import { socials } from "../../data/socials"; import { toDBML } from "../../utils/exportAs/dbml"; import { exportSavedData } from "../../utils/exportSavedData"; import { nanoid } from "nanoid"; +import { getTableHeight } from "../../utils/utils"; export default function ControlPanel({ diagramId, @@ -516,19 +518,52 @@ export default function ControlPanel({ const resetView = () => setTransform((prev) => ({ ...prev, zoom: 1, pan: { x: 0, y: 0 } })); const fitWindow = () => { - const diagram = document.getElementById("diagram").getBoundingClientRect(); const canvas = document.getElementById("canvas").getBoundingClientRect(); - const scaleX = canvas.width / diagram.width; - const scaleY = canvas.height / diagram.height; - const scale = Math.min(scaleX, scaleY); - const translateX = canvas.left; - const translateY = canvas.top; + const minMaxXY = { + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity, + }; + + tables.forEach((table) => { + minMaxXY.minX = Math.min(minMaxXY.minX, table.x); + minMaxXY.minY = Math.min(minMaxXY.minY, table.y); + minMaxXY.maxX = Math.max(minMaxXY.maxX, table.x + settings.tableWidth); + minMaxXY.maxY = Math.max(minMaxXY.maxY, table.y + getTableHeight(table)); + }); + + areas.forEach((area) => { + minMaxXY.minX = Math.min(minMaxXY.minX, area.x); + minMaxXY.minY = Math.min(minMaxXY.minY, area.y); + minMaxXY.maxX = Math.max(minMaxXY.maxX, area.x + area.width); + minMaxXY.maxY = Math.max(minMaxXY.maxY, area.y + area.height); + }); + + notes.forEach((note) => { + minMaxXY.minX = Math.min(minMaxXY.minX, note.x); + minMaxXY.minY = Math.min(minMaxXY.minY, note.y); + minMaxXY.maxX = Math.max(minMaxXY.maxX, note.x + noteWidth); + minMaxXY.maxY = Math.max(minMaxXY.maxY, note.y + note.height); + }); + + const padding = 10; + const width = minMaxXY.maxX - minMaxXY.minX + padding; + const height = minMaxXY.maxY - minMaxXY.minY + padding; + + const scaleX = canvas.width / width; + const scaleY = canvas.height / height; + // Making sure the scale is a multiple of 0.05 + const scale = Math.floor(Math.min(scaleX, scaleY) * 20) / 20; + + const centerX = (minMaxXY.minX + minMaxXY.maxX) / 2; + const centerY = (minMaxXY.minY + minMaxXY.maxY) / 2; setTransform((prev) => ({ ...prev, - zoom: scale - 0.01, - pan: { x: translateX, y: translateY }, + zoom: scale, + pan: { x: centerX, y: centerY }, })); }; const edit = () => { diff --git a/src/components/Thumbnail.jsx b/src/components/Thumbnail.jsx index 17f3749..e70ed6f 100644 --- a/src/components/Thumbnail.jsx +++ b/src/components/Thumbnail.jsx @@ -1,4 +1,10 @@ -import { tableFieldHeight, tableHeaderHeight } from "../data/constants"; +import { + tableFieldHeight, + tableHeaderHeight, + noteWidth, + noteRadius, + noteFold, +} from "../data/constants"; export default function Thumbnail({ diagram, i, zoom, theme }) { return ( @@ -111,37 +117,34 @@ export default function Thumbnail({ diagram, i, zoom, theme }) { {diagram.notes?.map((n) => { const x = n.x; const y = n.y; - const w = 180; - const r = 3; - const fold = 24; const h = n.height; return ( - +