From c8fa32780c33f48545182112cd21b8faa3ebb6f1 Mon Sep 17 00:00:00 2001 From: Alex Kim <45559664+alex-kim-dev@users.noreply.github.com> Date: Thu, 4 May 2023 20:13:54 +0500 Subject: [PATCH] fix: bound text coordinates not being updated --- src/element/resizeElements.ts | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/element/resizeElements.ts b/src/element/resizeElements.ts index 4a9f01095c..ee30eae5ba 100644 --- a/src/element/resizeElements.ts +++ b/src/element/resizeElements.ts @@ -51,6 +51,7 @@ import { measureText, getMaxContainerHeight, } from "./textElement"; +import { LinearElementEditor } from "./linearElementEditor"; export const normalizeAngle = (angle: number): number => { if (angle < 0) { @@ -634,12 +635,23 @@ export const resizeMultipleElements = ( // getCommonBoundingBox() uses getBoundTextElement() which returns null for // original elements from pointerDownState, so we have to find and add these - // bound text elements manually - const boundTextElements = targetElements - .map(({ orig }) => getBoundTextElementId(orig)) - .filter((id): id is string => typeof id === "string") - .map((id) => pointerDownState.originalElements.get(id) ?? null) - .filter(isBoundToContainer); + // bound text elements manually. Additionally, the coordinates of bound text + // elements aren't always up to date. + const boundTextElements = targetElements.reduce((acc, { orig }) => { + if (!isLinearElement(orig)) { + return acc; + } + const textId = getBoundTextElementId(orig); + if (!textId) { + return acc; + } + const text = pointerDownState.originalElements.get(textId) ?? null; + if (!isBoundToContainer(text)) { + return acc; + } + const xy = LinearElementEditor.getBoundTextElementPosition(orig, text); + return [...acc, { ...text, ...xy }]; + }, [] as ExcalidrawTextElementWithContainer[]); const { minX, minY, maxX, maxY, midX, midY } = getCommonBoundingBox( targetElements.map(({ orig }) => orig).concat(boundTextElements),