fix(editor): disable slash menu in callout (#10656)

This commit is contained in:
Flrande
2025-03-06 11:07:10 +00:00
parent d2b45783ea
commit b85812d8dd
3 changed files with 30 additions and 7 deletions

View File

@@ -88,6 +88,7 @@ import {
export type SlashMenuConfig = { export type SlashMenuConfig = {
triggerKeys: string[]; triggerKeys: string[];
ignoreBlockTypes: string[]; ignoreBlockTypes: string[];
ignoreSelector: string;
items: SlashMenuItem[]; items: SlashMenuItem[];
maxHeight: number; maxHeight: number;
tooltipTimeout: number; tooltipTimeout: number;
@@ -142,6 +143,7 @@ export type SlashMenuContext = {
export const defaultSlashMenuConfig: SlashMenuConfig = { export const defaultSlashMenuConfig: SlashMenuConfig = {
triggerKeys: ['/'], triggerKeys: ['/'],
ignoreBlockTypes: ['affine:code'], ignoreBlockTypes: ['affine:code'],
ignoreSelector: 'affine-callout',
maxHeight: 344, maxHeight: 344,
tooltipTimeout: 800, tooltipTimeout: 800,
items: [ items: [

View File

@@ -126,10 +126,13 @@ export class AffineSlashMenuWidget extends WidgetComponent {
const textSelection = this.host.selection.find(TextSelection); const textSelection = this.host.selection.find(TextSelection);
if (!textSelection) return; if (!textSelection) return;
const model = this.host.doc.getBlock(textSelection.blockId)?.model; const block = this.host.view.getBlock(textSelection.blockId);
if (!model) return; if (!block) return;
const model = block.model;
if (this.config.ignoreBlockTypes.includes(model.flavour)) return; if (block.closest(this.config.ignoreSelector)) return;
if (this.config.ignoreBlockTypes.includes(block.flavour)) return;
const inlineRange = inlineEditor.getInlineRange(); const inlineRange = inlineEditor.getInlineRange();
if (!inlineRange) return; if (!inlineRange) return;
@@ -217,7 +220,6 @@ export class AffineSlashMenuWidget extends WidgetComponent {
return; return;
} }
// this.handleEvent('beforeInput', this._onBeforeInput);
this.handleEvent('keyDown', this._onKeyDown); this.handleEvent('keyDown', this._onKeyDown);
this.handleEvent('compositionEnd', this._onCompositionEnd); this.handleEvent('compositionEnd', this._onCompositionEnd);
} }

View File

@@ -1,10 +1,9 @@
import { undoByKeyboard } from '@affine-test/kit/utils/keyboard';
import { openHomePage } from '@affine-test/kit/utils/load-page'; import { openHomePage } from '@affine-test/kit/utils/load-page';
import { type } from '@affine-test/kit/utils/page-logic'; import { type } from '@affine-test/kit/utils/page-logic';
import { expect, test } from '@playwright/test'; import { expect, test } from '@playwright/test';
test('add callout block using slash menu and change emoji', async ({ test.beforeEach(async ({ page }) => {
page,
}) => {
await openHomePage(page); await openHomePage(page);
await page.getByTestId('settings-modal-trigger').click(); await page.getByTestId('settings-modal-trigger').click();
await page.getByText('Experimental features').click(); await page.getByText('Experimental features').click();
@@ -14,7 +13,11 @@ test('add callout block using slash menu and change emoji', async ({
await page.getByTestId('modal-close-button').click(); await page.getByTestId('modal-close-button').click();
await page.getByTestId('sidebar-new-page-button').click(); await page.getByTestId('sidebar-new-page-button').click();
await page.locator('affine-paragraph v-line div').click(); await page.locator('affine-paragraph v-line div').click();
});
test('add callout block using slash menu and change emoji', async ({
page,
}) => {
await type(page, '/callout\naaaa\nbbbb'); await type(page, '/callout\naaaa\nbbbb');
const callout = page.locator('affine-callout'); const callout = page.locator('affine-callout');
const emoji = page.locator('affine-callout .affine-callout-emoji'); const emoji = page.locator('affine-callout .affine-callout-emoji');
@@ -41,3 +44,19 @@ test('add callout block using slash menu and change emoji', async ({
await expect(emojiMenu).not.toBeVisible(); await expect(emojiMenu).not.toBeVisible();
await expect(emoji).toContainText('😆'); await expect(emoji).toContainText('😆');
}); });
test('disable slash menu in callout block', async ({ page }) => {
await type(page, '/callout\n');
const callout = page.locator('affine-callout');
const emoji = page.locator('affine-callout .affine-callout-emoji');
await expect(callout).toBeVisible();
await expect(emoji).toContainText('😀');
await type(page, '/');
const slashMenu = page.locator('.slash-menu');
await expect(slashMenu).not.toBeVisible();
await undoByKeyboard(page);
await undoByKeyboard(page);
await type(page, '/');
await expect(slashMenu).toBeVisible();
});