feat(editor): enable block meta for code, image, list block (#10905)

This commit is contained in:
Saul-Mirone
2025-03-17 03:29:51 +00:00
parent 8822acf041
commit 8bd4125c96
4 changed files with 33 additions and 15 deletions
@@ -5,12 +5,14 @@ import {
type Text, type Text,
} from '@blocksuite/store'; } from '@blocksuite/store';
interface CodeBlockProps { import type { BlockMeta } from '../../utils/types';
type CodeBlockProps = {
text: Text; text: Text;
language: string | null; language: string | null;
wrap: boolean; wrap: boolean;
caption: string; caption: string;
} } & BlockMeta;
export const CodeBlockSchema = defineBlockSchema({ export const CodeBlockSchema = defineBlockSchema({
flavour: 'affine:code', flavour: 'affine:code',
@@ -20,6 +22,10 @@ export const CodeBlockSchema = defineBlockSchema({
language: null, language: null,
wrap: false, wrap: false,
caption: '', caption: '',
'meta:createdAt': undefined,
'meta:createdBy': undefined,
'meta:updatedAt': undefined,
'meta:updatedBy': undefined,
}) as CodeBlockProps, }) as CodeBlockProps,
metadata: { metadata: {
version: 1, version: 1,
@@ -9,6 +9,7 @@ import {
defineBlockSchema, defineBlockSchema,
} from '@blocksuite/store'; } from '@blocksuite/store';
import type { BlockMeta } from '../../utils/types.js';
import { ImageBlockTransformer } from './image-transformer.js'; import { ImageBlockTransformer } from './image-transformer.js';
export type ImageBlockProps = { export type ImageBlockProps = {
@@ -18,7 +19,8 @@ export type ImageBlockProps = {
height?: number; height?: number;
rotate: number; rotate: number;
size?: number; size?: number;
} & Omit<GfxCommonBlockProps, 'scale'>; } & Omit<GfxCommonBlockProps, 'scale'> &
BlockMeta;
const defaultImageProps: ImageBlockProps = { const defaultImageProps: ImageBlockProps = {
caption: '', caption: '',
@@ -30,6 +32,10 @@ const defaultImageProps: ImageBlockProps = {
lockedBySelf: false, lockedBySelf: false,
rotate: 0, rotate: 0,
size: -1, size: -1,
'meta:createdAt': undefined,
'meta:createdBy': undefined,
'meta:updatedAt': undefined,
'meta:updatedBy': undefined,
}; };
export const ImageBlockSchema = defineBlockSchema({ export const ImageBlockSchema = defineBlockSchema({
@@ -5,16 +5,18 @@ import {
defineBlockSchema, defineBlockSchema,
} from '@blocksuite/store'; } from '@blocksuite/store';
import type { BlockMeta } from '../../utils/types';
// `toggle` type has been deprecated, do not use it // `toggle` type has been deprecated, do not use it
export type ListType = 'bulleted' | 'numbered' | 'todo' | 'toggle'; export type ListType = 'bulleted' | 'numbered' | 'todo' | 'toggle';
export interface ListProps { export type ListProps = {
type: ListType; type: ListType;
text: Text; text: Text;
checked: boolean; checked: boolean;
collapsed: boolean; collapsed: boolean;
order: number | null; order: number | null;
} } & BlockMeta;
export const ListBlockSchema = defineBlockSchema({ export const ListBlockSchema = defineBlockSchema({
flavour: 'affine:list', flavour: 'affine:list',
@@ -27,6 +29,10 @@ export const ListBlockSchema = defineBlockSchema({
// number type only for numbered list // number type only for numbered list
order: null, order: null,
'meta:createdAt': undefined,
'meta:createdBy': undefined,
'meta:updatedAt': undefined,
'meta:updatedBy': undefined,
}) as ListProps, }) as ListProps,
metadata: { metadata: {
version: 1, version: 1,
@@ -325,23 +325,23 @@ function createToolbarMoreMenuConfigV2(baseUrl?: string) {
const createdAt = 'meta:createdAt'; const createdAt = 'meta:createdAt';
const createdBy = 'meta:createdBy'; const createdBy = 'meta:createdBy';
return ( return (
createdAt in block.model && createdAt in block.model.props &&
block.model[createdAt] !== undefined && block.model.props[createdAt] !== undefined &&
createdBy in block.model && createdBy in block.model.props &&
block.model[createdBy] !== undefined && block.model.props[createdBy] !== undefined &&
typeof block.model[createdBy] === 'string' && typeof block.model.props[createdBy] === 'string' &&
typeof block.model[createdAt] === 'number' typeof block.model.props[createdAt] === 'number'
); );
}, },
content: cx => { content: cx => {
const model = cx.getCurrentModelBy(BlockSelection); const model = cx.getCurrentModelBy(BlockSelection);
if (!model) return null; if (!model) return null;
const createdAt = 'meta:createdAt'; const createdAt = 'meta:createdAt';
if (!(createdAt in model)) return null; if (!(createdAt in model.props)) return null;
const createdBy = 'meta:createdBy'; const createdBy = 'meta:createdBy';
if (!(createdBy in model)) return null; if (!(createdBy in model.props)) return null;
const createdByUserId = model[createdBy] as string; const createdByUserId = model.props[createdBy] as string;
const createdAtTimestamp = model[createdAt] as number; const createdAtTimestamp = model.props[createdAt] as number;
const date = new Date(createdAtTimestamp); const date = new Date(createdAtTimestamp);
const userProvider = cx.std.get(UserProvider); const userProvider = cx.std.get(UserProvider);
userProvider.revalidateUserInfo(createdByUserId); userProvider.revalidateUserInfo(createdByUserId);