fix: text never goes beyond max width for unbound text elements (#6288)

This commit is contained in:
Aakansha Doshi 2023-02-27 16:54:29 +05:30 committed by GitHub
parent e1dc748aef
commit 38fc51b4e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 6 deletions

View File

@ -3,7 +3,11 @@ import ExcalidrawApp from "../excalidraw-app";
import { GlobalTestState, render, screen } from "../tests/test-utils"; import { GlobalTestState, render, screen } from "../tests/test-utils";
import { Keyboard, Pointer, UI } from "../tests/helpers/ui"; import { Keyboard, Pointer, UI } from "../tests/helpers/ui";
import { CODES, KEYS } from "../keys"; import { CODES, KEYS } from "../keys";
import { fireEvent } from "../tests/test-utils"; import {
fireEvent,
mockBoundingClientRect,
restoreOriginalGetBoundingClientRect,
} from "../tests/test-utils";
import { queryByText } from "@testing-library/react"; import { queryByText } from "@testing-library/react";
import { FONT_FAMILY } from "../constants"; import { FONT_FAMILY } from "../constants";
@ -221,11 +225,19 @@ describe("textWysiwyg", () => {
describe("Test container-unbound text", () => { describe("Test container-unbound text", () => {
const { h } = window; const { h } = window;
const dimensions = { height: 400, width: 800 };
let textarea: HTMLTextAreaElement; let textarea: HTMLTextAreaElement;
let textElement: ExcalidrawTextElement; let textElement: ExcalidrawTextElement;
beforeAll(() => {
mockBoundingClientRect(dimensions);
});
beforeEach(async () => { beforeEach(async () => {
await render(<ExcalidrawApp />); await render(<ExcalidrawApp />);
//@ts-ignore
h.app.refreshDeviceState(h.app.excalidrawContainerRef.current!);
textElement = UI.createElement("text"); textElement = UI.createElement("text");
@ -235,6 +247,10 @@ describe("textWysiwyg", () => {
)!; )!;
}); });
afterAll(() => {
restoreOriginalGetBoundingClientRect();
});
it("should add a tab at the start of the first line", () => { it("should add a tab at the start of the first line", () => {
const event = new KeyboardEvent("keydown", { key: KEYS.TAB }); const event = new KeyboardEvent("keydown", { key: KEYS.TAB });
textarea.value = "Line#1\nLine#2"; textarea.value = "Line#1\nLine#2";
@ -433,6 +449,27 @@ describe("textWysiwyg", () => {
); );
expect(h.state.zoom.value).toBe(1); expect(h.state.zoom.value).toBe(1);
}); });
it("text should never go beyond max width", async () => {
UI.clickTool("text");
mouse.clickAt(750, 300);
textarea = document.querySelector(
".excalidraw-textEditorContainer > textarea",
)!;
fireEvent.change(textarea, {
target: {
value:
"Excalidraw is an opensource virtual collaborative whiteboard for sketching hand-drawn like diagrams!",
},
});
textarea.dispatchEvent(new Event("input"));
await new Promise((cb) => setTimeout(cb, 0));
textarea.blur();
expect(textarea.style.width).toBe("792px");
expect(h.elements[0].width).toBe(1000);
});
}); });
describe("Test container-bound text", () => { describe("Test container-bound text", () => {
@ -631,11 +668,11 @@ describe("textWysiwyg", () => {
["freedraw", "line"].forEach((type: any) => { ["freedraw", "line"].forEach((type: any) => {
it(`shouldn't create text element when pressing 'Enter' key on ${type} `, async () => { it(`shouldn't create text element when pressing 'Enter' key on ${type} `, async () => {
h.elements = []; h.elements = [];
const elemnet = UI.createElement(type, { const element = UI.createElement(type, {
width: 100, width: 100,
height: 50, height: 50,
}); });
API.setSelectedElements([elemnet]); API.setSelectedElements([element]);
Keyboard.keyPress(KEYS.ENTER); Keyboard.keyPress(KEYS.ENTER);
expect(h.elements.length).toBe(1); expect(h.elements.length).toBe(1);
}); });

View File

@ -272,9 +272,9 @@ export const textWysiwyg = ({
: updatedTextElement.height / lines.length; : updatedTextElement.height / lines.length;
if (!container) { if (!container) {
maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value; maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;
} textElementWidth = Math.min(textElementWidth, maxWidth);
// As firefox, Safari needs little higher dimensions on DOM } else if (isFirefox || isSafari) {
if (isFirefox || isSafari) { // As firefox, Safari needs little higher dimensions on DOM
textElementWidth += 0.5; textElementWidth += 0.5;
} }
// Make sure text editor height doesn't go beyond viewport // Make sure text editor height doesn't go beyond viewport