Skip to content
Merged
7 changes: 6 additions & 1 deletion packages/core/src/editor/managers/StyleManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,12 @@ export class StyleManager<
const { from, to } = tr.selection;

if (text) {
tr.insertText(text, from, to).addMark(from, from + text.length, mark);
const existingText = tr.doc.textBetween(from, to);
if (text !== existingText) {
tr.insertText(text, from, to);
}

tr.addMark(from, from + text.length, mark);
} else {
tr.setSelection(TextSelection.create(tr.doc, to)).addMark(
from,
Expand Down
7 changes: 6 additions & 1 deletion packages/core/src/extensions/LinkToolbar/LinkToolbar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,12 @@ export const LinkToolbarExtension = createExtension(({ editor }) => {
if (!range) {
return;
}
tr.insertText(text, range.from, range.to);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should actually probably use style manager.createLink here no?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not exactly, since editLink takes an optional position whereas createLink always uses the selection start position to insert the link. This is necessary for hovered links, as the editor selection isn't related to the link position in this case.

We could ofc just update createLink to take an optional position/range, but because it's part of the editor API, I don't think we want to have anything related to ProseMirror positions there. Ideally this would be solved when we finish our own locations API.

const existingText = tr.doc.textBetween(range.from, range.to);
if (text !== existingText) {
tr.insertText(text, range.from, range.to);
}

tr.addMark(
range.from,
range.from + text.length,
Expand Down
50 changes: 50 additions & 0 deletions tests/src/end-to-end/linktoolbar/linktoolbar.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { expect } from "@playwright/test";
import { test } from "../../setup/setupScript.js";
import { BASE_URL, LINK_BUTTON_SELECTOR } from "../../utils/const.js";
import { focusOnEditor } from "../../utils/editor.js";

test.beforeEach(async ({ page }) => {
await page.goto(BASE_URL);
});

test.describe("Check Link Toolbar functionality", () => {
test("Should preserve existing marks when editing a link", async ({
page,
}) => {
await focusOnEditor(page);

// Type bold text
await page.keyboard.type("hello");
await page.keyboard.press("Shift+Home");

// Make it bold via formatting toolbar
await page.waitForSelector(`[data-test="bold"]`);
await page.click(`[data-test="bold"]`);

// Add link
await page.keyboard.press("Shift+Home");
await page.waitForSelector(LINK_BUTTON_SELECTOR);
await page.click(LINK_BUTTON_SELECTOR);
await page.keyboard.type("https://example.com");
await page.keyboard.press("Enter");

// Move cursor back onto the linked text to trigger link toolbar
await page.keyboard.press("ArrowLeft");
await page.waitForTimeout(500);
Comment thread
matthewlipski marked this conversation as resolved.
Outdated

// Click Edit link button
const editButton = page.getByText("Edit link");
await editButton.waitFor({ state: "visible" });

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - firefox (2/2)

[firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - firefox (2/2)

[firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - firefox (2/2)

[firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - chromium (2/2)

[chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - chromium (2/2)

[chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - chromium (2/2)

[chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - webkit (2/2)

[webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - webkit (2/2)

[webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - webkit (2/2)

[webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - firefox (2/2)

[firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - firefox (2/2)

[firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - firefox (2/2)

[firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [firefox] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - chromium (2/2)

[chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - chromium (2/2)

[chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - chromium (2/2)

[chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [chromium] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - webkit (2/2)

[webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - webkit (2/2)

[webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22

Check failure on line 37 in tests/src/end-to-end/linktoolbar/linktoolbar.test.ts

View workflow job for this annotation

GitHub Actions / Playwright Tests - webkit (2/2)

[webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link

1) [webkit] › src/end-to-end/linktoolbar/linktoolbar.test.ts:11:7 › Check Link Toolbar functionality › Should preserve existing marks when editing a link Error: locator.waitFor: Test timeout of 30000ms exceeded. Call log: - waiting for getByText('Edit link') to be visible 35 | // Click Edit link button 36 | const editButton = page.getByText("Edit link"); > 37 | await editButton.waitFor({ state: "visible" }); | ^ 38 | await editButton.click(); 39 | 40 | await page.keyboard.press("Control+A"); at /__w/BlockNote/BlockNote/tests/src/end-to-end/linktoolbar/linktoolbar.test.ts:37:22
await editButton.click();

await page.keyboard.press("Control+A");
await page.keyboard.type("https://example2.com");
await page.keyboard.press("Enter");

await page.waitForTimeout(300);

// Verify bold mark is still present on the text
const boldText = page.locator("strong a, a strong");
await expect(boldText).toBeVisible();
Comment thread
matthewlipski marked this conversation as resolved.
Outdated
});
});
Loading