diff --git a/src/components/composer/content_editable_helper.ts b/src/components/composer/content_editable_helper.ts index 3ab9536a4..f114cf4c4 100644 --- a/src/components/composer/content_editable_helper.ts +++ b/src/components/composer/content_editable_helper.ts @@ -32,6 +32,7 @@ export class ContentEditableHelper { ); if (start < 0) start = 0; if (end > textLength) end = textLength; + if (start > textLength) start = textLength; } let startNode = this.findChildAtCharacterIndex(start); let endNode = this.findChildAtCharacterIndex(end); diff --git a/src/components/grid/grid.ts b/src/components/grid/grid.ts index 36ac022b1..75e30df4d 100644 --- a/src/components/grid/grid.ts +++ b/src/components/grid/grid.ts @@ -466,6 +466,10 @@ export class Grid extends Component { } onInput(ev: InputEvent) { + // the user meant to paste in the sheet, not open the composer with the pasted content + if (!ev.isComposing && ev.inputType === "insertFromPaste") { + return; + } if (ev.data) { // if the user types a character on the grid, it means he wants to start composing the selected cell with that // character diff --git a/tests/components/grid.test.ts b/tests/components/grid.test.ts index 5656a9695..1d5084020 100644 --- a/tests/components/grid.test.ts +++ b/tests/components/grid.test.ts @@ -759,6 +759,20 @@ describe("Grid component", () => { await nextTick(); expect(fixture.querySelector(".o-menu")).toBeTruthy(); }); + + test("input event triggered from a paste should not open composer", async () => { + const input = fixture.querySelector(".o-grid>input"); + input?.dispatchEvent( + new InputEvent("input", { + data: "d", + bubbles: true, + isComposing: false, + inputType: "insertFromPaste", + }) + ); + await nextTick(); + expect(model.getters.getEditionMode()).toBe("inactive"); + }); }); });