fix(editor): add hoverable container for image and surface-ref (#11458)

Closes: [BS-3012](https://linear.app/affine-design/issue/BS-3012/hover-yuan素时冲突)
This commit is contained in:
fundon
2025-04-03 13:43:55 +00:00
parent 90a3bd53cd
commit 363476a46c
3 changed files with 56 additions and 4 deletions

View File

@@ -75,14 +75,13 @@ export class ImageBlockComponent extends CaptionedBlockComponent<ImageBlockModel
}, },
{ enterDelay: 500 } { enterDelay: 500 }
); );
setReference(this); setReference(this.hoverableContainer);
this._disposables.add(dispose); this._disposables.add(dispose);
} }
override connectedCallback() { override connectedCallback() {
super.connectedCallback(); super.connectedCallback();
this._initHover();
this.refreshData(); this.refreshData();
this.contentEditable = 'false'; this.contentEditable = 'false';
this._disposables.add( this._disposables.add(
@@ -104,6 +103,7 @@ export class ImageBlockComponent extends CaptionedBlockComponent<ImageBlockModel
override firstUpdated() { override firstUpdated() {
// lazy bindings // lazy bindings
this.disposables.addFromEvent(this, 'click', this._handleClick); this.disposables.addFromEvent(this, 'click', this._handleClick);
this._initHover();
} }
override renderBlock() { override renderBlock() {
@@ -160,6 +160,9 @@ export class ImageBlockComponent extends CaptionedBlockComponent<ImageBlockModel
@query('affine-page-image') @query('affine-page-image')
private accessor pageImage: ImageBlockPageComponent | null = null; private accessor pageImage: ImageBlockPageComponent | null = null;
@query('.affine-image-container')
accessor hoverableContainer!: HTMLDivElement;
@property({ attribute: false }) @property({ attribute: false })
accessor retryCount = 0; accessor retryCount = 0;

View File

@@ -376,7 +376,7 @@ export class SurfaceRefBlockComponent extends BlockComponent<SurfaceRefBlockMode
}, },
{ enterDelay: 500 } { enterDelay: 500 }
); );
setReference(this); setReference(this.hoverableContainer);
this._disposables.add(dispose); this._disposables.add(dispose);
} }
@@ -437,6 +437,11 @@ export class SurfaceRefBlockComponent extends BlockComponent<SurfaceRefBlockMode
this._initViewport(); this._initViewport();
this._initReferencedModel(); this._initReferencedModel();
this._initSelection(); this._initSelection();
}
override firstUpdated() {
if (!this._shouldRender) return;
this._initHover(); this._initHover();
} }
@@ -486,6 +491,9 @@ export class SurfaceRefBlockComponent extends BlockComponent<SurfaceRefBlockMode
@state() @state()
private accessor _focused: boolean = false; private accessor _focused: boolean = false;
@query('.affine-surface-ref')
accessor hoverableContainer!: HTMLDivElement;
@query('affine-surface-ref > block-caption-editor') @query('affine-surface-ref > block-caption-editor')
accessor captionElement!: BlockCaptionEditor; accessor captionElement!: BlockCaptionEditor;

View File

@@ -5,7 +5,12 @@ import {
locateToolbar, locateToolbar,
setEdgelessTool, setEdgelessTool,
} from '@affine-test/kit/utils/editor'; } from '@affine-test/kit/utils/editor';
import { selectAllByKeyboard } from '@affine-test/kit/utils/keyboard'; import { importImage } from '@affine-test/kit/utils/image';
import {
pasteByKeyboard,
selectAllByKeyboard,
writeTextToClipboard,
} 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 { import {
clickNewPageButton, clickNewPageButton,
@@ -232,3 +237,39 @@ test('should not show inner toolbar of surface-ref in note under edgeless', asyn
await expect(toolbar).toBeHidden(); await expect(toolbar).toBeHidden();
}); });
test('should show toolbar when inline link is preceded by image or surface-ref', async ({
page,
}) => {
await page.keyboard.press('Enter');
await importImage(page, 'affine-preview.png');
const image = page.locator('affine-image');
await image.click();
await page.keyboard.press('Enter');
const url = new URL(page.url());
await writeTextToClipboard(page, url.toString());
await pasteByKeyboard(page);
const toolbar = locateToolbar(page);
const inlineLink = page.locator('affine-reference');
await inlineLink.hover();
await expect(toolbar).toBeVisible();
await toolbar.hover();
await expect(toolbar).toBeVisible();
await image.hover();
await expect(toolbar).toBeVisible();
await expect(toolbar).toHaveAttribute('data-placement', 'inner');
await inlineLink.hover();
await expect(toolbar).toBeVisible();
await expect(toolbar).not.toHaveAttribute('data-placement', 'inner');
});