import { BlockService } from '@blockeditor/block-std'; import { assertExists } from '@blockeditor/global/utils'; import type { BlockModel, Page } from '@blockeditor/store'; import { InlineManager } from '../_common/inline/inline-manager.js'; import { type AffineTextAttributes, getAffineInlineSpecsWithReference, } from '../_common/inline/presets/affine-inline-specs.js'; import { affineInlineMarkdownMatches } from '../_common/inline/presets/markdown.js'; import { ReferenceNodeConfig } from '../_common/inline/presets/nodes/reference-node/reference-config.js'; import type { DataViewTypes } from './common/data-view.js'; import { DatabaseSelection } from './common/selection.js'; import type { DatabaseBlockModel } from './database-model.js'; export class DatabaseService< TextAttributes extends AffineTextAttributes = AffineTextAttributes, > extends BlockService { readonly inlineManager = new InlineManager(); readonly referenceNodeConfig = new ReferenceNodeConfig(); override mounted(): void { super.mounted(); this.selectionManager.register(DatabaseSelection); this.referenceNodeConfig.setPage(this.page); const inlineSpecs = getAffineInlineSpecsWithReference( this.referenceNodeConfig ); this.inlineManager.registerSpecs(inlineSpecs); this.inlineManager.registerMarkdownMatches(affineInlineMarkdownMatches); } initDatabaseBlock( page: Page, model: BlockModel, databaseId: string, viewType: DataViewTypes, isAppendNewRow = true ) { const blockModel = page.getBlockById(databaseId) as DatabaseBlockModel; assertExists(blockModel); blockModel.initTemplate(viewType); if (isAppendNewRow) { // Add a paragraph after database const parent = page.getParent(model); assertExists(parent); page.addBlock('affine:paragraph', {}, parent.id); } blockModel.applyColumnUpdate(); } }