diff --git a/blocksuite/affine/block-database/src/database-dnd-preview-block.ts b/blocksuite/affine/block-database/src/database-dnd-preview-block.ts new file mode 100644 index 0000000000..215929fed6 --- /dev/null +++ b/blocksuite/affine/block-database/src/database-dnd-preview-block.ts @@ -0,0 +1,58 @@ +import type { DatabaseBlockModel } from '@blocksuite/affine-model'; +import { unsafeCSSVarV2 } from '@blocksuite/affine-shared/theme'; +import { BlockComponent } from '@blocksuite/block-std'; +import { DatabaseListViewIcon } from '@blocksuite/icons/lit'; +import { css, html } from 'lit'; + +export class DatabaseDndPreviewBlockComponent extends BlockComponent { + static override styles = css` + .affine-database-preview-container { + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 4px; + box-sizing: border-box; + + border-radius: 8px; + background-color: ${unsafeCSSVarV2( + 'layer/background/overlayPanel', + '#FBFBFC' + )}; + } + + .database-preview-content { + padding: 4px 16px; + display: flex; + gap: 8px; + } + + .database-preview-content > svg { + color: ${unsafeCSSVarV2('icon/primary', '#77757D')}; + } + + .database-preview-content > .text { + color: var(--affine-text-primary-color); + color: ${unsafeCSSVarV2('text/primary', '#121212')}; + font-size: 14px; + line-height: 24px; + } + `; + + override renderBlock() { + return html`
+
+ ${DatabaseListViewIcon({ width: '24px', height: '24px' })} + Database Block +
+
`; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'affine-dnd-preview-database': DatabaseDndPreviewBlockComponent; + } +} diff --git a/blocksuite/affine/block-database/src/effects.ts b/blocksuite/affine/block-database/src/effects.ts index 63821adc8b..f2c8368d47 100644 --- a/blocksuite/affine/block-database/src/effects.ts +++ b/blocksuite/affine/block-database/src/effects.ts @@ -1,6 +1,7 @@ import { CenterPeek } from './components/layout'; import { DatabaseTitle } from './components/title'; import { DatabaseBlockComponent } from './database-block'; +import { DatabaseDndPreviewBlockComponent } from './database-dnd-preview-block'; import { BlockRenderer } from './detail-panel/block-renderer'; import { NoteRenderer } from './detail-panel/note-renderer'; import { LinkCell, LinkCellEditing } from './properties/link/cell-renderer'; @@ -35,4 +36,9 @@ export function effects() { customElements.define('database-datasource-block-renderer', BlockRenderer); customElements.define('affine-database-link-node', LinkNode); customElements.define('affine-database', DatabaseBlockComponent); + + customElements.define( + 'affine-dnd-preview-database', + DatabaseDndPreviewBlockComponent + ); } diff --git a/blocksuite/affine/widget-drag-handle/src/helpers/preview-helper.ts b/blocksuite/affine/widget-drag-handle/src/helpers/preview-helper.ts index 95b6769f18..5c63c28658 100644 --- a/blocksuite/affine/widget-drag-handle/src/helpers/preview-helper.ts +++ b/blocksuite/affine/widget-drag-handle/src/helpers/preview-helper.ts @@ -109,6 +109,14 @@ export class PreviewHelper { const extensions = [ DocModeExtension(docModeService), EditorSettingExtension(settingSignal), + { + setup(di) { + di.override( + BlockViewIdentifier('affine:database'), + () => literal`affine-dnd-preview-database` + ); + }, + } as ExtensionType, { setup(di) { di.override(BlockViewIdentifier('affine:image'), () => { diff --git a/blocksuite/affine/widget-drag-handle/src/watchers/drag-event-watcher.ts b/blocksuite/affine/widget-drag-handle/src/watchers/drag-event-watcher.ts index e84da21d14..f544ca9f28 100644 --- a/blocksuite/affine/widget-drag-handle/src/watchers/drag-event-watcher.ts +++ b/blocksuite/affine/widget-drag-handle/src/watchers/drag-event-watcher.ts @@ -1083,7 +1083,8 @@ export class DragEventWatcher { if ( dndExtApi && this.std.store.workspace.docs.has(sourceDocId) && - this.gfx.surface + this.gfx.surface && + snapshot.pageId !== this.std.store.doc.id ) { const style = 'vertical' as EmbedCardStyle; const linkedDocSnapshot = dndExtApi.fromEntity({