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:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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');
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user