feat(editor): support file column and member column for database block (#10932)

close: BS-2630, BS-2631, BS-2629, BS-2632, BS-2635
This commit is contained in:
zzj3720
2025-03-18 14:51:45 +00:00
parent 321e3449ec
commit 3939cc1c52
34 changed files with 1796 additions and 77 deletions

View File

@@ -1,5 +1,5 @@
import {
type Column,
type ColumnDataType,
DatabaseBlockSchema,
type SerializedCells,
} from '@blocksuite/affine-model';
@@ -20,7 +20,7 @@ export const databaseBlockHtmlAdapterMatcher: BlockHtmlAdapterMatcher = {
fromBlockSnapshot: {
enter: (o, context) => {
const { walkerContext } = context;
const columns = o.node.props.columns as Array<Column>;
const columns = o.node.props.columns as Array<ColumnDataType>;
const children = o.node.children;
const cells = o.node.props.cells as SerializedCells;
const table = processTable(columns, children, cells);

View File

@@ -1,5 +1,5 @@
import {
type Column,
type ColumnDataType,
DatabaseBlockSchema,
type SerializedCells,
} from '@blocksuite/affine-model';
@@ -27,7 +27,7 @@ export const databaseBlockMarkdownAdapterMatcher: BlockMarkdownAdapterMatcher =
enter: (o, context) => {
const { walkerContext, deltaConverter } = context;
const rows: TableRow[] = [];
const columns = o.node.props.columns as Array<Column>;
const columns = o.node.props.columns as Array<ColumnDataType>;
const children = o.node.children;
const cells = o.node.props.cells as SerializedCells;
const table = processTable(columns, children, cells);

View File

@@ -1,5 +1,5 @@
import {
type Column,
type ColumnDataType,
DatabaseBlockSchema,
type SerializedCells,
} from '@blocksuite/affine-model';
@@ -20,7 +20,7 @@ export const databaseBlockPlainTextAdapterMatcher: BlockPlainTextAdapterMatcher
enter: (o, context) => {
const { walkerContext, deltaConverter } = context;
const rows: string[][] = [];
const columns = o.node.props.columns as Array<Column>;
const columns = o.node.props.columns as Array<ColumnDataType>;
const children = o.node.children;
const cells = o.node.props.cells as SerializedCells;
const table = processTable(columns, children, cells);

View File

@@ -1,4 +1,4 @@
import type { Column, SerializedCells } from '@blocksuite/affine-model';
import type { ColumnDataType, SerializedCells } from '@blocksuite/affine-model';
import type { DeltaInsert } from '@blocksuite/inline';
import type { BlockSnapshot } from '@blocksuite/store';
@@ -45,7 +45,7 @@ export const isDelta = (value: unknown): value is { delta: DeltaInsert[] } => {
return false;
};
type Table = {
headers: Column[];
headers: ColumnDataType[];
rows: Row[];
};
type Row = {
@@ -55,7 +55,7 @@ type Cell = {
value: string | { delta: DeltaInsert[] };
};
export const processTable = (
columns: Column[],
columns: ColumnDataType[],
children: BlockSnapshot[],
cells: SerializedCells
): Table => {

View File

@@ -0,0 +1 @@
export * from './host-context';

View File

@@ -1,5 +1,5 @@
import type {
Column,
ColumnDataType,
ColumnUpdater,
DatabaseBlockModel,
} from '@blocksuite/affine-model';
@@ -24,12 +24,11 @@ import { propertyPresets } from '@blocksuite/data-view/property-presets';
import { IS_MOBILE } from '@blocksuite/global/env';
import { BlockSuiteError, ErrorCode } from '@blocksuite/global/exceptions';
import { type BlockModel } from '@blocksuite/store';
import { computed, type ReadonlySignal } from '@preact/signals-core';
import { computed, type ReadonlySignal, signal } from '@preact/signals-core';
import { getIcon } from './block-icons.js';
import {
databaseBlockAllPropertyMap,
databaseBlockPropertyList,
databaseBlockProperties,
databasePropertyConverts,
} from './properties/index.js';
import {
@@ -53,6 +52,19 @@ import {
} from './views/index.js';
export class DatabaseBlockDataSource extends DataSourceBase {
static externalProperties = signal<PropertyMetaConfig[]>([]);
static propertiesList = computed(() => {
return [
...Object.values(databaseBlockProperties),
...this.externalProperties.value,
];
});
static propertiesMap = computed(() => {
return Object.fromEntries(
this.propertiesList.value.map(v => [v.type, v as PropertyMetaConfig])
);
});
private _batch = 0;
private readonly _model: DatabaseBlockModel;
@@ -108,7 +120,7 @@ export class DatabaseBlockDataSource extends DataSourceBase {
}
allPropertyMetas$ = computed<PropertyMetaConfig<any, any, any, any>[]>(() => {
return databaseBlockPropertyList;
return DatabaseBlockDataSource.propertiesList.value;
});
propertyMetas$ = computed<PropertyMetaConfig[]>(() => {
@@ -153,6 +165,9 @@ export class DatabaseBlockDataSource extends DataSourceBase {
this._runCapture();
const type = this.propertyTypeGet(propertyId);
if (type == null) {
return;
}
const update = this.propertyMetaGet(type)?.config.rawValue.setValue;
const old = this.cellValueGet(rowId, propertyId);
const updateFn =
@@ -185,6 +200,9 @@ export class DatabaseBlockDataSource extends DataSourceBase {
return getIcon(model);
}
const type = this.propertyTypeGet(propertyId);
if (!type) {
return;
}
if (type === 'title') {
const model = this.getModelById(rowId);
return model?.text;
@@ -225,7 +243,7 @@ export class DatabaseBlockDataSource extends DataSourceBase {
protected override getNormalPropertyAndIndex(propertyId: string):
| {
column: Column<Record<string, unknown>>;
column: ColumnDataType<Record<string, unknown>>;
index: number;
}
| undefined {
@@ -247,7 +265,7 @@ export class DatabaseBlockDataSource extends DataSourceBase {
private getPropertyAndIndex(propertyId: string):
| {
column: Column<Record<string, unknown>>;
column: ColumnDataType<Record<string, unknown>>;
index: number;
}
| undefined {
@@ -368,7 +386,7 @@ export class DatabaseBlockDataSource extends DataSourceBase {
}
propertyMetaGet(type: string): PropertyMetaConfig | undefined {
return databaseBlockAllPropertyMap[type];
return DatabaseBlockDataSource.propertiesMap.value[type];
}
propertyNameGet(propertyId: string): string {
@@ -392,13 +410,13 @@ export class DatabaseBlockDataSource extends DataSourceBase {
return false;
}
propertyTypeGet(propertyId: string): string {
propertyTypeGet(propertyId: string): string | undefined {
if (propertyId === 'type') {
return 'image';
}
const result = this.getPropertyAndIndex(propertyId);
if (!result) {
return '';
return;
}
return result.column.type;
}

View File

@@ -1,6 +1,7 @@
export * from './adapters';
export * from './commands';
export * from './config';
export * from './context';
export * from './data-source';
export * from './database-block';
export * from './database-spec';
@@ -9,4 +10,6 @@ export * from './detail-panel/note-renderer';
export * from './properties';
export * from './properties/rich-text/cell-renderer';
export * from './selection.js';
export * from './service';
export * from './utils/block-utils';
export * from '@blocksuite/data-view';

View File

@@ -1,4 +1,3 @@
import type { PropertyMetaConfig } from '@blocksuite/data-view';
import { propertyPresets } from '@blocksuite/data-view/property-presets';
import { linkColumnConfig } from './link/cell-renderer.js';
@@ -14,7 +13,7 @@ const {
progressPropertyConfig,
selectPropertyConfig,
} = propertyPresets;
export const databaseBlockColumns = {
export const databaseBlockProperties = {
checkboxColumnConfig: checkboxPropertyConfig,
dateColumnConfig: datePropertyConfig,
multiSelectColumnConfig: multiSelectPropertyConfig,
@@ -26,7 +25,3 @@ export const databaseBlockColumns = {
richTextColumnConfig,
titleColumnConfig,
};
export const databaseBlockPropertyList = Object.values(databaseBlockColumns);
export const databaseBlockAllPropertyMap = Object.fromEntries(
databaseBlockPropertyList.map(v => [v.type, v as PropertyMetaConfig])
);

View File

@@ -0,0 +1,11 @@
import type { PropertyMetaConfig } from '@blocksuite/data-view';
import { createIdentifier } from '@blocksuite/global/di';
export interface DatabaseBlockConfigService {
propertiesPresets: PropertyMetaConfig[];
}
export const DatabaseBlockConfigService =
createIdentifier<DatabaseBlockConfigService>(
'AffineDatabaseBlockConfigService'
);

View File

@@ -1,6 +1,6 @@
import type {
Cell,
Column,
CellDataType,
ColumnDataType,
ColumnUpdater,
DatabaseBlockModel,
ViewBasicDataType,
@@ -15,7 +15,7 @@ import type { BlockModel } from '@blocksuite/store';
export function addProperty(
model: DatabaseBlockModel,
position: InsertToPosition,
column: Omit<Column, 'id'> & {
column: Omit<ColumnDataType, 'id'> & {
id?: string;
}
): string {
@@ -24,7 +24,7 @@ export function addProperty(
return id;
}
model.doc.transact(() => {
const col: Column = {
const col: ColumnDataType = {
...column,
id,
};
@@ -39,8 +39,8 @@ export function addProperty(
export function copyCellsByProperty(
model: DatabaseBlockModel,
fromId: Column['id'],
toId: Column['id']
fromId: ColumnDataType['id'],
toId: ColumnDataType['id']
) {
model.doc.transact(() => {
Object.keys(model.props.cells).forEach(rowId => {
@@ -57,7 +57,7 @@ export function copyCellsByProperty(
export function deleteColumn(
model: DatabaseBlockModel,
columnId: Column['id']
columnId: ColumnDataType['id']
) {
const index = model.props.columns.findIndex(v => v.id === columnId);
if (index < 0) return;
@@ -101,8 +101,8 @@ export function duplicateView(model: DatabaseBlockModel, id: string): string {
export function getCell(
model: DatabaseBlockModel,
rowId: BlockModel['id'],
columnId: Column['id']
): Cell | null {
columnId: ColumnDataType['id']
): CellDataType | null {
if (columnId === 'title') {
return {
columnId: 'title',
@@ -121,8 +121,8 @@ export function getCell(
export function getProperty(
model: DatabaseBlockModel,
id: Column['id']
): Column | undefined {
id: ColumnDataType['id']
): ColumnDataType | undefined {
return model.props.columns.find(v => v.id === id);
}
@@ -143,7 +143,7 @@ export function moveViewTo(
export function updateCell(
model: DatabaseBlockModel,
rowId: string,
cell: Cell
cell: CellDataType
) {
model.doc.transact(() => {
const columnId = cell.columnId;