From 8e447b4c32331ddb093c35a80c69830db06b6040 Mon Sep 17 00:00:00 2001 From: Aakansha Doshi Date: Tue, 22 Mar 2022 15:32:49 +0530 Subject: [PATCH] fix: don't bind text to container if already present (#4946) * fix: don't bind text to container if already present * Add specs and update condition --- src/components/App.tsx | 6 ++++- src/element/textWysiwyg.test.tsx | 44 +++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/components/App.tsx b/src/components/App.tsx index 90b8158c..5a9c6881 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -2215,7 +2215,11 @@ class App extends React.Component { (shouldBind || parentCenterPosition) ) { container = getTextBindableContainerAtPosition( - this.scene.getElements().filter((ele) => !isTextElement(ele)), + this.scene + .getElements() + .filter( + (ele) => isTextBindableContainer(ele) && !getBoundTextElement(ele), + ), sceneX, sceneY, ); diff --git a/src/element/textWysiwyg.test.tsx b/src/element/textWysiwyg.test.tsx index 4d14cfb5..d9753c89 100644 --- a/src/element/textWysiwyg.test.tsx +++ b/src/element/textWysiwyg.test.tsx @@ -704,7 +704,7 @@ describe("textWysiwyg", () => { expect(text.width).toBe(rectangle.width - BOUND_TEXT_PADDING * 2); }); - it("should unbind bound text when unbind action from context menu is triggred", async () => { + it("should unbind bound text when unbind action from context menu is triggered", async () => { expect(h.elements.length).toBe(1); expect(h.elements[0].id).toBe(rectangle.id); @@ -745,5 +745,47 @@ describe("textWysiwyg", () => { null, ); }); + it("shouldn't bind to container if container has bound text", async () => { + expect(h.elements.length).toBe(1); + + Keyboard.withModifierKeys({}, () => { + Keyboard.keyPress(KEYS.ENTER); + }); + + expect(h.elements.length).toBe(2); + + // Bind first text + let text = h.elements[1] as ExcalidrawTextElementWithContainer; + expect(text.containerId).toBe(rectangle.id); + let editor = document.querySelector( + ".excalidraw-textEditorContainer > textarea", + ) as HTMLTextAreaElement; + await new Promise((r) => setTimeout(r, 0)); + fireEvent.change(editor, { target: { value: "Hello World!" } }); + editor.blur(); + expect(rectangle.boundElements).toStrictEqual([ + { id: text.id, type: "text" }, + ]); + + // Attempt to bind another text + UI.clickTool("text"); + mouse.clickAt( + rectangle.x + rectangle.width / 2, + rectangle.y + rectangle.height / 2, + ); + mouse.down(); + expect(h.elements.length).toBe(3); + text = h.elements[2] as ExcalidrawTextElementWithContainer; + editor = document.querySelector( + ".excalidraw-textEditorContainer > textarea", + ) as HTMLTextAreaElement; + await new Promise((r) => setTimeout(r, 0)); + fireEvent.change(editor, { target: { value: "Whats up?" } }); + editor.blur(); + expect(rectangle.boundElements).toStrictEqual([ + { id: h.elements[1].id, type: "text" }, + ]); + expect(text.containerId).toBe(null); + }); }); });