From 8bd4125c96e87f41f7d962e60e8465f56a4b6923 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Mon, 17 Mar 2025 03:29:51 +0000 Subject: [PATCH] feat(editor): enable block meta for code, image, list block (#10905) --- .../model/src/blocks/code/code-model.ts | 10 ++++++++-- .../model/src/blocks/image/image-model.ts | 8 +++++++- .../model/src/blocks/list/list-model.ts | 10 ++++++++-- .../extensions/editor-config/toolbar/index.ts | 20 +++++++++---------- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/blocksuite/affine/model/src/blocks/code/code-model.ts b/blocksuite/affine/model/src/blocks/code/code-model.ts index f755a1a26b..13bfc00f90 100644 --- a/blocksuite/affine/model/src/blocks/code/code-model.ts +++ b/blocksuite/affine/model/src/blocks/code/code-model.ts @@ -5,12 +5,14 @@ import { type Text, } from '@blocksuite/store'; -interface CodeBlockProps { +import type { BlockMeta } from '../../utils/types'; + +type CodeBlockProps = { text: Text; language: string | null; wrap: boolean; caption: string; -} +} & BlockMeta; export const CodeBlockSchema = defineBlockSchema({ flavour: 'affine:code', @@ -20,6 +22,10 @@ export const CodeBlockSchema = defineBlockSchema({ language: null, wrap: false, caption: '', + 'meta:createdAt': undefined, + 'meta:createdBy': undefined, + 'meta:updatedAt': undefined, + 'meta:updatedBy': undefined, }) as CodeBlockProps, metadata: { version: 1, diff --git a/blocksuite/affine/model/src/blocks/image/image-model.ts b/blocksuite/affine/model/src/blocks/image/image-model.ts index 2cf85f6fbf..342801f603 100644 --- a/blocksuite/affine/model/src/blocks/image/image-model.ts +++ b/blocksuite/affine/model/src/blocks/image/image-model.ts @@ -9,6 +9,7 @@ import { defineBlockSchema, } from '@blocksuite/store'; +import type { BlockMeta } from '../../utils/types.js'; import { ImageBlockTransformer } from './image-transformer.js'; export type ImageBlockProps = { @@ -18,7 +19,8 @@ export type ImageBlockProps = { height?: number; rotate: number; size?: number; -} & Omit; +} & Omit & + BlockMeta; const defaultImageProps: ImageBlockProps = { caption: '', @@ -30,6 +32,10 @@ const defaultImageProps: ImageBlockProps = { lockedBySelf: false, rotate: 0, size: -1, + 'meta:createdAt': undefined, + 'meta:createdBy': undefined, + 'meta:updatedAt': undefined, + 'meta:updatedBy': undefined, }; export const ImageBlockSchema = defineBlockSchema({ diff --git a/blocksuite/affine/model/src/blocks/list/list-model.ts b/blocksuite/affine/model/src/blocks/list/list-model.ts index e5c34902de..9f92bd7b6e 100644 --- a/blocksuite/affine/model/src/blocks/list/list-model.ts +++ b/blocksuite/affine/model/src/blocks/list/list-model.ts @@ -5,16 +5,18 @@ import { defineBlockSchema, } from '@blocksuite/store'; +import type { BlockMeta } from '../../utils/types'; + // `toggle` type has been deprecated, do not use it export type ListType = 'bulleted' | 'numbered' | 'todo' | 'toggle'; -export interface ListProps { +export type ListProps = { type: ListType; text: Text; checked: boolean; collapsed: boolean; order: number | null; -} +} & BlockMeta; export const ListBlockSchema = defineBlockSchema({ flavour: 'affine:list', @@ -27,6 +29,10 @@ export const ListBlockSchema = defineBlockSchema({ // number type only for numbered list order: null, + 'meta:createdAt': undefined, + 'meta:createdBy': undefined, + 'meta:updatedAt': undefined, + 'meta:updatedBy': undefined, }) as ListProps, metadata: { version: 1, diff --git a/packages/frontend/core/src/blocksuite/extensions/editor-config/toolbar/index.ts b/packages/frontend/core/src/blocksuite/extensions/editor-config/toolbar/index.ts index 5e4aa7167f..cec14cba20 100644 --- a/packages/frontend/core/src/blocksuite/extensions/editor-config/toolbar/index.ts +++ b/packages/frontend/core/src/blocksuite/extensions/editor-config/toolbar/index.ts @@ -325,23 +325,23 @@ function createToolbarMoreMenuConfigV2(baseUrl?: string) { const createdAt = 'meta:createdAt'; const createdBy = 'meta:createdBy'; return ( - createdAt in block.model && - block.model[createdAt] !== undefined && - createdBy in block.model && - block.model[createdBy] !== undefined && - typeof block.model[createdBy] === 'string' && - typeof block.model[createdAt] === 'number' + createdAt in block.model.props && + block.model.props[createdAt] !== undefined && + createdBy in block.model.props && + block.model.props[createdBy] !== undefined && + typeof block.model.props[createdBy] === 'string' && + typeof block.model.props[createdAt] === 'number' ); }, content: cx => { const model = cx.getCurrentModelBy(BlockSelection); if (!model) return null; const createdAt = 'meta:createdAt'; - if (!(createdAt in model)) return null; + if (!(createdAt in model.props)) return null; const createdBy = 'meta:createdBy'; - if (!(createdBy in model)) return null; - const createdByUserId = model[createdBy] as string; - const createdAtTimestamp = model[createdAt] as number; + if (!(createdBy in model.props)) return null; + const createdByUserId = model.props[createdBy] as string; + const createdAtTimestamp = model.props[createdAt] as number; const date = new Date(createdAtTimestamp); const userProvider = cx.std.get(UserProvider); userProvider.revalidateUserInfo(createdByUserId);