From 26285f7dcbada2e57211b48e5702edc6100683c7 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Sun, 16 Mar 2025 05:48:34 +0000 Subject: [PATCH] feat(editor): unify block props api (#10888) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: [BS-2707](https://linear.app/affine-design/issue/BS-2707/统一使用props获取和更新block-prop) --- .../block-attachment/src/attachment-block.ts | 6 +- .../src/attachment-edgeless-block.ts | 2 +- .../src/components/rename-model.ts | 2 +- .../block-attachment/src/configs/toolbar.ts | 2 +- .../blocks/block-attachment/src/embed.ts | 24 ++-- .../blocks/block-attachment/src/utils.ts | 9 +- .../block-bookmark/src/bookmark-block.ts | 4 +- .../src/bookmark-edgeless-block.ts | 4 +- .../src/components/bookmark-card.ts | 3 +- .../block-bookmark/src/configs/toolbar.ts | 12 +- .../affine/blocks/block-bookmark/src/utils.ts | 2 +- .../blocks/block-callout/src/callout-block.ts | 4 +- .../blocks/block-code/src/code-block.ts | 20 ++-- .../code-toolbar/components/lang-button.ts | 4 +- .../block-code/src/code-toolbar/config.ts | 2 +- .../block-code/src/code-toolbar/utils.ts | 6 +- .../block-data-view/src/block-meta/todo.ts | 2 +- .../blocks/block-data-view/src/data-source.ts | 28 ++--- .../block-data-view/src/data-view-block.ts | 6 +- .../block-data-view/src/data-view-model.ts | 16 +-- .../blocks/block-database/src/data-source.ts | 30 ++--- .../block-database/src/database-block.ts | 10 +- .../src/detail-panel/note-renderer.ts | 2 +- .../block-database/src/utils/block-utils.ts | 60 +++++----- .../src/commands/insert-edgeless-text.ts | 2 +- .../src/edgeless-text-block.ts | 16 +-- .../src/common/render-linked-doc.ts | 16 +-- .../blocks/block-embed/src/configs/toolbar.ts | 25 +++-- .../embed-figma-block/embed-figma-block.ts | 8 +- .../embed-github-block/embed-github-block.ts | 16 ++- .../src/embed-github-block/utils.ts | 4 +- .../components/fullscreen-toolbar.ts | 2 +- .../src/embed-html-block/configs/toolbar.ts | 2 +- .../src/embed-html-block/embed-html-block.ts | 6 +- .../embed-iframe-link-edit-popup.ts | 2 +- .../src/embed-iframe-block/configs/toolbar.ts | 6 +- .../embed-edgeless-iframe-block.ts | 4 +- .../embed-iframe-block/embed-iframe-block.ts | 12 +- .../embed-linked-doc-block/configs/toolbar.ts | 10 +- .../embed-edgeless-linked-doc-block.ts | 3 +- .../embed-linked-doc-block.ts | 31 +++--- .../src/embed-loom-block/embed-loom-block.ts | 12 +- .../block-embed/src/embed-loom-block/utils.ts | 2 +- .../embed-synced-doc-block/configs/toolbar.ts | 2 +- .../embed-edgeless-synced-doc-block.ts | 9 +- .../embed-synced-doc-block.ts | 24 ++-- .../embed-youtube-block.ts | 12 +- .../src/embed-youtube-block/utils.ts | 2 +- .../blocks/block-frame/src/frame-block.ts | 2 +- .../blocks/block-frame/src/frame-manager.ts | 54 +++++---- .../src/components/image-block-fallback.ts | 4 +- .../src/components/page-image-block.ts | 2 +- .../block-image/src/image-edgeless-block.ts | 2 +- .../affine/blocks/block-image/src/utils.ts | 16 ++- .../blocks/block-latex/src/latex-block.ts | 4 +- .../block-list/src/commands/indent-list.ts | 2 +- .../block-list/src/commands/split-list.ts | 32 +++--- .../blocks/block-list/src/commands/utils.ts | 20 ++-- .../blocks/block-list/src/list-block.ts | 24 ++-- .../block-list/src/utils/forward-delete.ts | 8 +- .../block-list/src/utils/get-list-icon.ts | 8 +- .../src/commands/change-note-display-mode.ts | 6 +- .../block-note/src/commands/dedent-block.ts | 4 +- .../block-note/src/commands/dedent-blocks.ts | 4 +- .../block-note/src/commands/indent-block.ts | 6 +- .../block-note/src/commands/indent-blocks.ts | 8 +- .../components/edgeless-note-background.ts | 4 +- .../src/components/edgeless-note-mask.ts | 6 +- .../block-note/src/note-edgeless-block.ts | 22 ++-- .../src/commands/dedent-paragraph.ts | 4 +- .../src/commands/indent-paragraph.ts | 10 +- .../src/commands/split-paragraph.ts | 10 +- .../block-paragraph/src/heading-icon.ts | 2 +- .../block-paragraph/src/paragraph-block.ts | 32 +++--- .../block-paragraph/src/paragraph-keymap.ts | 18 +-- .../block-paragraph/src/paragraph-service.ts | 4 +- .../src/utils/forward-delete.ts | 6 +- .../src/utils/merge-with-prev.ts | 6 +- .../blocks/block-root/src/configs/toolbar.ts | 2 +- .../components/auto-complete/utils.ts | 8 +- .../edgeless/components/note-slicer/index.ts | 6 +- .../rects/edgeless-selected-rect.ts | 20 ++-- .../text/edgeless-frame-title-editor.ts | 2 +- .../toolbar/present/frame-order-menu.ts | 9 +- .../toolbar/presentation-toolbar.ts | 2 +- .../src/edgeless/edgeless-keyboard.ts | 2 +- .../src/edgeless/edgeless-root-block.ts | 4 +- .../src/edgeless/utils/clipboard-utils.ts | 4 +- .../src/keyboard/keyboard-manager.ts | 4 +- .../block-root/src/page/page-root-block.ts | 9 +- .../src/preview/preview-root-block.ts | 3 +- .../change-attachment-button.ts | 4 +- .../change-embed-card-button.ts | 48 ++++---- .../element-toolbar/change-frame-button.ts | 6 +- .../element-toolbar/change-group-button.ts | 2 +- .../element-toolbar/change-note-button.ts | 38 +++---- .../element-toolbar/more-menu/config.ts | 2 +- .../more-menu/render-linked-doc.ts | 2 +- .../src/widgets/keyboard-toolbar/config.ts | 2 +- .../src/configs/slash-menu.ts | 2 +- .../block-surface-ref/src/portal/note.ts | 7 +- .../src/surface-ref-block.ts | 36 +++--- .../block-surface/src/commands/auto-align.ts | 6 +- .../export-manager/export-manager.ts | 8 +- .../block-surface/src/surface-transformer.ts | 2 +- .../block-surface/src/utils/add-note.ts | 4 +- .../block-surface/src/utils/update-xywh.ts | 6 +- .../components/src/caption/block-caption.ts | 4 +- .../embed-card-caption-edit-modal.ts | 2 +- .../embed-card-modal/embed-card-edit-modal.ts | 8 +- .../fragment-doc-title/src/doc-title.ts | 14 +-- .../src/body/frame-panel-body.ts | 8 +- .../src/card/frame-card-title-editor.ts | 2 +- .../src/card/frame-card-title.ts | 4 +- .../fragment-outline/src/card/outline-card.ts | 12 +- .../src/card/outline-preview.ts | 38 ++++--- .../fragments/fragment-outline/src/config.ts | 7 +- .../src/mobile-outline-panel.ts | 8 +- .../fragment-outline/src/utils/query.ts | 4 +- .../attachment/attachment-transformer.ts | 2 +- .../model/src/blocks/callout/callout-model.ts | 4 +- .../model/src/blocks/code/code-model.ts | 4 +- .../edgeless-text/edgeless-text-model.ts | 11 +- .../model/src/blocks/frame/frame-model.ts | 20 +++- .../src/blocks/image/image-transformer.ts | 2 +- .../model/src/blocks/list/list-model.ts | 4 +- .../model/src/blocks/note/note-model.ts | 4 +- .../src/blocks/paragraph/paragraph-model.ts | 4 +- .../model/src/blocks/root/root-block-model.ts | 7 +- .../rich-text/src/format/delete-text.ts | 2 +- .../affine/rich-text/src/markdown/divider.ts | 2 +- .../rich-text/src/markdown/markdown-input.ts | 4 +- .../rich-text/src/markdown/paragraph.ts | 2 +- .../affine/rich-text/src/markdown/to-code.ts | 5 +- .../shared/src/adapters/middlewares/copy.ts | 2 +- .../shared/src/adapters/middlewares/paste.ts | 2 +- .../src/adapters/middlewares/replace-id.ts | 24 ++-- .../shared/src/services/block-meta-service.ts | 20 ---- .../shared/src/utils/collapsed/paragraph.ts | 8 +- .../affine/shared/src/utils/model/getter.ts | 4 +- .../affine/shared/src/utils/model/list.ts | 13 ++- .../src/middleware/new-id-cross-doc.ts | 4 +- .../src/middleware/reorder-list.ts | 5 +- .../widgets/widget-drag-handle/src/utils.ts | 6 +- .../src/watchers/drag-event-watcher.ts | 4 +- .../src/watchers/pointer-event-watcher.ts | 2 +- .../widget-edgeless-auto-connect/src/index.ts | 14 ++- .../widget-frame-title/src/frame-title.ts | 10 +- .../widgets/widget-slash-menu/src/config.ts | 20 ++-- .../src/__tests__/editor-host.unit.spec.ts | 2 +- .../block-std/src/__tests__/test-spec.ts | 2 +- .../src/gfx/model/gfx-block-model.ts | 36 ++++++ .../src/gfx/model/surface/surface-model.ts | 4 + .../store/src/__tests__/block.unit.spec.ts | 104 +++++++++--------- .../store/src/__tests__/doc.unit.spec.ts | 40 +++---- .../store/src/model/block/block-model.ts | 32 ++---- .../framework/store/src/model/block/draft.ts | 11 +- .../store/src/model/block/sync-controller.ts | 32 +++--- .../framework/store/src/model/store/query.ts | 2 +- .../framework/store/src/model/store/utils.ts | 2 +- .../framework/store/src/transformer/base.ts | 2 +- .../store/src/transformer/transformer.ts | 6 +- .../src/__tests__/edgeless/last-props.spec.ts | 26 +++-- .../src/__tests__/edgeless/layer.spec.ts | 4 +- .../components/attachment-viewer-panel.ts | 6 +- .../playground/apps/starter/data/database.ts | 4 +- blocksuite/tests-legacy/e2e/utils/asserts.ts | 8 +- .../core/src/blocksuite/ai/_common/config.ts | 2 +- .../blocksuite/ai/actions/edgeless-handler.ts | 12 +- .../ai/blocks/ai-chat-block/ai-chat-block.ts | 2 +- .../ai-chat-block/ai-chat-edgeless-block.ts | 4 +- .../blocksuite/ai/extensions/ai-paragraph.ts | 4 +- .../ai/peek-view/chat-block-peek-view.ts | 8 +- .../core/src/blocksuite/ai/utils/extract.ts | 4 +- .../blocksuite/ai/utils/selection-utils.ts | 6 +- .../extensions/attachment-embed-view.tsx | 5 +- .../extensions/editor-config/toolbar/index.ts | 14 +-- .../extensions/entry/enable-mobile.ts | 2 +- .../note-config/edgeless-note-header.tsx | 20 ++-- .../components/attachment-viewer/error.tsx | 2 +- .../components/attachment-viewer/index.tsx | 2 +- .../pdf-viewer-embedded-inner.tsx | 4 +- .../src/components/attachment-viewer/utils.ts | 10 +- .../pages/workspace/attachment/index.tsx | 6 +- .../services/doc-database-backlinks.ts | 2 +- .../core/src/modules/doc/entities/doc.ts | 4 +- .../modules/docs-search/worker/in-worker.ts | 18 +-- .../core/src/modules/pdf/renderer/utils.ts | 2 +- .../modules/peek-view/entities/peek-view.ts | 4 +- .../peek-view/view/image-preview/index.tsx | 8 +- .../blocksuite/clipboard/clipboard.spec.ts | 4 +- .../e2e/blocksuite/edgeless/note.spec.ts | 2 +- .../e2e/blocksuite/paragraph.spec.ts | 42 ++++--- 193 files changed, 1019 insertions(+), 891 deletions(-) diff --git a/blocksuite/affine/blocks/block-attachment/src/attachment-block.ts b/blocksuite/affine/blocks/block-attachment/src/attachment-block.ts index 220a7376f1..dc319c5b75 100644 --- a/blocksuite/affine/blocks/block-attachment/src/attachment-block.ts +++ b/blocksuite/affine/blocks/block-attachment/src/attachment-block.ts @@ -28,7 +28,7 @@ import { checkAttachmentBlob, downloadAttachmentBlob } from './utils'; @Peekable({ enableOn: ({ model }: AttachmentBlockComponent) => { - return model.type.endsWith('pdf'); + return model.props.type.endsWith('pdf'); }, }) export class AttachmentBlockComponent extends CaptionedBlockComponent { @@ -104,7 +104,7 @@ export class AttachmentBlockComponent extends CaptionedBlockComponent { this.doc.updateBlock(this.model, { style: AttachmentBlockStyles[1], @@ -170,7 +170,7 @@ export class AttachmentBlockComponent extends CaptionedBlockComponent(); // Fix auto focus setTimeout(() => inputRef.value?.focus()); - const originalName = model.name; + const originalName = model.props.name; const nameWithoutExtension = originalName.slice( 0, originalName.lastIndexOf('.') diff --git a/blocksuite/affine/blocks/block-attachment/src/configs/toolbar.ts b/blocksuite/affine/blocks/block-attachment/src/configs/toolbar.ts index 53cfe9d88b..2db47aaa06 100644 --- a/blocksuite/affine/blocks/block-attachment/src/configs/toolbar.ts +++ b/blocksuite/affine/blocks/block-attachment/src/configs/toolbar.ts @@ -100,7 +100,7 @@ const createAttachmentViewDropdownMenuWith = ( const actions = this.actions.map(action => ({ ...action })); const viewType$ = computed(() => { const [cardAction, embedAction] = actions; - const embed = model.embed$.value ?? false; + const embed = model.props.embed$.value ?? false; cardAction.disabled = !embed; embedAction.disabled = embed && embedProvider.embedded(model); diff --git a/blocksuite/affine/blocks/block-attachment/src/embed.ts b/blocksuite/affine/blocks/block-attachment/src/embed.ts index 14b59c5af0..671ef34ca7 100644 --- a/blocksuite/affine/blocks/block-attachment/src/embed.ts +++ b/blocksuite/affine/blocks/block-attachment/src/embed.ts @@ -113,11 +113,11 @@ export class AttachmentEmbedService extends Extension { blobUrl?: string, maxFileSize = this._maxFileSize ) { - if (!model.embed || !blobUrl) return; + if (!model.props.embed || !blobUrl) return; const config = this.values.find(config => config.check(model, maxFileSize)); if (!config || !config.template) { - console.error('No embed view template found!', model, model.type); + console.error('No embed view template found!', model, model.props.type); return; } @@ -130,7 +130,7 @@ const embedConfig: AttachmentEmbedConfig[] = [ name: 'image', check: model => model.doc.schema.flavourSchemaMap.has('affine:image') && - model.type.startsWith('image/'), + model.props.type.startsWith('image/'), async action(model, std) { const component = std.view.getBlock(model.id); if (!component) return; @@ -141,7 +141,7 @@ const embedConfig: AttachmentEmbedConfig[] = [ { name: 'pdf', check: (model, maxFileSize) => - model.type === 'application/pdf' && model.size <= maxFileSize, + model.props.type === 'application/pdf' && model.props.size <= maxFileSize, template: (_, blobUrl) => { // More options: https://tinytip.co/tips/html-pdf-params/ // https://chromium.googlesource.com/chromium/src/+/refs/tags/121.0.6153.1/chrome/browser/resources/pdf/open_pdf_params_parser.ts @@ -162,7 +162,7 @@ const embedConfig: AttachmentEmbedConfig[] = [ { name: 'video', check: (model, maxFileSize) => - model.type.startsWith('video/') && model.size <= maxFileSize, + model.props.type.startsWith('video/') && model.props.size <= maxFileSize, template: (_, blobUrl) => html`