From 6b666bd4ca551047d631b7cb96de332cc773f677 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Thu, 24 Aug 2023 10:46:46 -0700 Subject: [PATCH] Revert "feat: Insertion marker json deserialization 7316 (#7364)" (#7430) This reverts commit 84215386fb4f71c6facb2d5e8a7336820fb9a9d9. (cherry picked from commit 51651dffe82980d3188f2e8ca5ba47104d40cbc7) --- core/insertion_marker_manager.ts | 56 ++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/core/insertion_marker_manager.ts b/core/insertion_marker_manager.ts index 35e46dc01..48be15c14 100644 --- a/core/insertion_marker_manager.ts +++ b/core/insertion_marker_manager.ts @@ -18,11 +18,11 @@ import type {BlockSvg} from './block_svg.js'; import * as common from './common.js'; import {ComponentManager} from './component_manager.js'; import {config} from './config.js'; +import * as constants from './constants.js'; import * as eventUtils from './events/utils.js'; import type {IDeleteArea} from './interfaces/i_delete_area.js'; import type {IDragTarget} from './interfaces/i_drag_target.js'; import type {RenderedConnection} from './rendered_connection.js'; -import * as blocks from './serialization/blocks.js'; import type {Coordinate} from './utils/coordinate.js'; import type {WorkspaceSvg} from './workspace_svg.js'; import * as renderManagement from './render_management.js'; @@ -43,6 +43,16 @@ interface CandidateConnection { radius: number; } +/** + * An error message to throw if the block created by createMarkerBlock_ is + * missing any components. + */ +const DUPLICATE_BLOCK_ERROR = + 'The insertion marker ' + + 'manager tried to create a marker but the result is missing %1. If ' + + 'you are using a mutator, make sure your domToMutation method is ' + + 'properly defined.'; + /** * Class that controls updates to connections during drags. It is primarily * responsible for finding the closest eligible connection and highlighting or @@ -222,16 +232,48 @@ export class InsertionMarkerManager { * @returns The insertion marker that represents the given block. */ private createMarkerBlock(sourceBlock: BlockSvg): BlockSvg { + const imType = sourceBlock.type; + eventUtils.disable(); let result: BlockSvg; try { - const blockJson = blocks.save(sourceBlock); - if (!blockJson) { - throw new Error('Failed to serialize source block.'); - } - result = blocks.append(blockJson, this.workspace) as BlockSvg; - + result = this.workspace.newBlock(imType); result.setInsertionMarker(true); + if (sourceBlock.saveExtraState) { + const state = sourceBlock.saveExtraState(); + if (state && result.loadExtraState) { + result.loadExtraState(state); + } + } else if (sourceBlock.mutationToDom) { + const oldMutationDom = sourceBlock.mutationToDom(); + if (oldMutationDom && result.domToMutation) { + result.domToMutation(oldMutationDom); + } + } + // Copy field values from the other block. These values may impact the + // rendered size of the insertion marker. Note that we do not care about + // child blocks here. + for (let i = 0; i < sourceBlock.inputList.length; i++) { + const sourceInput = sourceBlock.inputList[i]; + if (sourceInput.name === constants.COLLAPSED_INPUT_NAME) { + continue; // Ignore the collapsed input. + } + const resultInput = result.inputList[i]; + if (!resultInput) { + throw new Error(DUPLICATE_BLOCK_ERROR.replace('%1', 'an input')); + } + for (let j = 0; j < sourceInput.fieldRow.length; j++) { + const sourceField = sourceInput.fieldRow[j]; + const resultField = resultInput.fieldRow[j]; + if (!resultField) { + throw new Error(DUPLICATE_BLOCK_ERROR.replace('%1', 'a field')); + } + resultField.setValue(sourceField.getValue()); + } + } + + result.setCollapsed(sourceBlock.isCollapsed()); + result.setInputsInline(sourceBlock.getInputsInline()); result.initSvg(); result.getSvgRoot().setAttribute('visibility', 'hidden');