From 5572331088ae3413cf2807e5e32813369f757420 Mon Sep 17 00:00:00 2001 From: "kelin.zrh" Date: Fri, 2 Feb 2024 15:53:04 +0800 Subject: [PATCH] fix: issue 2602 --- src/components/block/index.ts | 11 +++++++++++ src/components/modules/blockManager.ts | 27 +++++++++++++++----------- types/tools/block-tool.d.ts | 5 +++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/components/block/index.ts b/src/components/block/index.ts index 493f9657c..0dd324965 100644 --- a/src/components/block/index.ts +++ b/src/components/block/index.ts @@ -728,6 +728,17 @@ export default class Block extends EventsDispatcher { return convertBlockDataToString(blockData, this.tool.conversionConfig); } + public supportUpdate(): boolean { + return !!this.toolInstance.update; + } + + public update(newData: Partial): void { + if (!this.toolInstance.update) { + return; + } + this.toolInstance.update(newData); + } + /** * Make default Block wrappers and put Tool`s content there * diff --git a/src/components/modules/blockManager.ts b/src/components/modules/blockManager.ts index ae8e4818c..c90700baf 100644 --- a/src/components/modules/blockManager.ts +++ b/src/components/modules/blockManager.ts @@ -344,23 +344,28 @@ export default class BlockManager extends Module { */ public async update(block: Block, data: Partial): Promise { const existingData = await block.data; - - const newBlock = this.composeBlock({ - id: block.id, - tool: block.name, - data: Object.assign({}, existingData, data), - tunes: block.tunes, - }); - const blockIndex = this.getBlockIndex(block); + let updatedBlock = null; - this._blocks.replace(blockIndex, newBlock); + if (block.supportUpdate()) { + block.update(Object.assign({}, existingData, data)); + updatedBlock = block; + } else { + updatedBlock = this.composeBlock({ + id: block.id, + tool: block.name, + data: Object.assign({}, existingData, data), + tunes: block.tunes, + }); + + this._blocks.replace(blockIndex, updatedBlock); + } - this.blockDidMutated(BlockChangedMutationType, newBlock, { + this.blockDidMutated(BlockChangedMutationType, updatedBlock, { index: blockIndex, }); - return newBlock; + return updatedBlock; } /** diff --git a/types/tools/block-tool.d.ts b/types/tools/block-tool.d.ts index 8c9bb858a..bfc7b4df4 100644 --- a/types/tools/block-tool.d.ts +++ b/types/tools/block-tool.d.ts @@ -64,6 +64,11 @@ export interface BlockTool extends BaseTool { */ rendered?(): void; + /** + * Call to update block content + */ + update?(data: Partial): void; + /** * Called each time block content is updated */