Skip to content

Commit fdf605e

Browse files
committed
fix: move an image doesn't work with drag and drop (#2603)
1 parent 9da3e59 commit fdf605e

2 files changed

Lines changed: 65 additions & 7 deletions

File tree

packages/core/src/extensions/FormattingToolbar/FormattingToolbar.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,17 @@ export const FormattingToolbarExtension = createExtension(({ editor }) => {
6161
* We want to mimic the Notion behavior of not showing the toolbar while the user is holding down the mouse button (to create a selection)
6262
*/
6363
let preventShowWhileMouseDown = false;
64+
let preventShowWhileDragging = false;
6465

6566
const unsubscribeOnChange = editor.onChange(() => {
66-
if (preventShowWhileMouseDown) {
67+
if (preventShowWhileMouseDown || preventShowWhileDragging) {
6768
return;
6869
}
6970
// re-evaluate whether the toolbar should be shown
7071
store.setState(shouldShow());
7172
});
7273
const unsubscribeOnSelectionChange = editor.onSelectionChange(() => {
73-
if (preventShowWhileMouseDown) {
74+
if (preventShowWhileMouseDown || preventShowWhileDragging) {
7475
return;
7576
}
7677
// re-evaluate whether the toolbar should be shown
@@ -91,6 +92,7 @@ export const FormattingToolbarExtension = createExtension(({ editor }) => {
9192
"pointerup",
9293
() => {
9394
preventShowWhileMouseDown = false;
95+
9496
// We only want to re-show the toolbar if the mouse made the selection
9597
if (editor.isFocused()) {
9698
store.setState(shouldShow());
@@ -102,12 +104,27 @@ export const FormattingToolbarExtension = createExtension(({ editor }) => {
102104
dom.addEventListener(
103105
"pointercancel",
104106
() => {
105-
preventShowWhileMouseDown = false;
107+
preventShowWhileMouseDown = true;
108+
},
109+
{ signal,
110+
capture: true },
111+
);
112+
113+
editor.prosemirrorView.root.addEventListener(
114+
"dragstart",
115+
() => {
116+
preventShowWhileDragging = true;
117+
store.setState(false);
106118
},
107-
{
108-
signal,
109-
capture: true,
119+
{ signal },
120+
);
121+
122+
editor.prosemirrorView.root.addEventListener(
123+
"dragend",
124+
() => {
125+
preventShowWhileDragging = false;
110126
},
127+
{ signal },
111128
);
112129

113130
signal.addEventListener("abort", () => {

tests/src/end-to-end/images/images.test.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ import { FileChooser, expect } from "@playwright/test";
22
import { test } from "../../setup/setupScript.js";
33
import {
44
BASE_URL,
5+
DRAG_HANDLE_SELECTOR,
56
H_ONE_BLOCK_SELECTOR,
67
IMAGE_SELECTOR,
78
} from "../../utils/const.js";
89
import { insertHeading } from "../../utils/copypaste.js";
910
import { compareDocToSnapshot, focusOnEditor } from "../../utils/editor.js";
10-
import { dragAndDropBlock } from "../../utils/mouse.js";
11+
import { dragAndDropBlock, moveMouseOverElement } from "../../utils/mouse.js";
1112
import { executeSlashCommand } from "../../utils/slashmenu.js";
1213

1314
const IMAGE_UPLOAD_PATH = "src/end-to-end/images/placeholder.png";
@@ -128,4 +129,44 @@ test.describe("Check Image Block and Toolbar functionality", () => {
128129

129130
await compareDocToSnapshot(page, "dragImage");
130131
});
132+
test("Formatting toolbar should not appear when dragging image block", async ({
133+
page,
134+
}) => {
135+
await focusOnEditor(page);
136+
await executeSlashCommand(page, "image");
137+
await insertHeading(page, 1);
138+
139+
// move mouse over image to reveal drag handle
140+
const dragTarget = page.locator(IMAGE_SELECTOR);
141+
await moveMouseOverElement(page, dragTarget);
142+
await page.waitForTimeout(100);
143+
144+
await page.waitForSelector(DRAG_HANDLE_SELECTOR);
145+
const dragHandle = page.locator(DRAG_HANDLE_SELECTOR);
146+
const dragHandleBox = (await dragHandle.boundingBox())!;
147+
148+
// start drag from the drag handle
149+
await page.mouse.move(
150+
dragHandleBox.x + dragHandleBox.width / 2,
151+
dragHandleBox.y + dragHandleBox.height / 2,
152+
{ steps: 5 },
153+
);
154+
await page.mouse.down();
155+
await page.waitForTimeout(100);
156+
157+
// move mid-drag to the heading block
158+
const dropTarget = page.locator(H_ONE_BLOCK_SELECTOR);
159+
const dropTargetBox = (await dropTarget.boundingBox())!;
160+
await page.mouse.move(
161+
dropTargetBox.x + dropTargetBox.width / 2,
162+
dropTargetBox.y + dropTargetBox.height / 2,
163+
{ steps: 5 },
164+
);
165+
166+
// assert formatting toolbar is not visible during drag
167+
const toolbar = page.locator(".bn-formatting-toolbar");
168+
await expect(toolbar).not.toBeVisible();
169+
170+
await page.mouse.up();
171+
});
131172
});

0 commit comments

Comments
 (0)