fix: flyout id is different than first placed block (#7618)

* add saveIds param and logic to save correctly

* remove whitespace

* add saveIds to recursive calls

* run format

* change name from addIds to saveIds

* add saveIds test

* change blockId on false saveIds to undefined
This commit is contained in:
Trey Pisano
2023-11-01 11:52:27 -04:00
committed by GitHub
parent 666a393ac5
commit 73841995ec
3 changed files with 28 additions and 6 deletions

View File

@@ -1213,7 +1213,7 @@ export abstract class Flyout extends DeleteArea implements IFlyout {
// Clone the block.
// TODO(#7432): Add a saveIds parameter to `save`.
const json = blocks.save(oldBlock) as blocks.State;
const json = blocks.save(oldBlock, {saveIds: false}) as blocks.State;
// Normallly this resizes leading to weird jumps. Save it for terminateDrag.
targetWorkspace.setResizesEnabled(false);
const block = blocks.append(json, targetWorkspace) as BlockSvg;

View File

@@ -86,20 +86,21 @@ export function save(
addInputBlocks = true,
addNextBlocks = true,
doFullSerialization = true,
saveIds = true,
}: {
addCoordinates?: boolean;
addInputBlocks?: boolean;
addNextBlocks?: boolean;
doFullSerialization?: boolean;
saveIds?: boolean;
} = {},
): State | null {
if (block.isInsertionMarker()) {
return null;
}
const state = {
'type': block.type,
'id': block.id,
'id': saveIds ? block.id : undefined,
};
if (addCoordinates) {
@@ -122,12 +123,22 @@ export function save(
if (addInputBlocks) {
// AnyDuringMigration because: Argument of type '{ type: string; id:
// string; }' is not assignable to parameter of type 'State'.
saveInputBlocks(block, state as AnyDuringMigration, doFullSerialization);
saveInputBlocks(
block,
state as AnyDuringMigration,
doFullSerialization,
saveIds,
);
}
if (addNextBlocks) {
// AnyDuringMigration because: Argument of type '{ type: string; id:
// string; }' is not assignable to parameter of type 'State'.
saveNextBlocks(block, state as AnyDuringMigration, doFullSerialization);
saveNextBlocks(
block,
state as AnyDuringMigration,
doFullSerialization,
saveIds,
);
}
// AnyDuringMigration because: Type '{ type: string; id: string; }' is not
@@ -270,6 +281,7 @@ function saveInputBlocks(
block: Block,
state: State,
doFullSerialization: boolean,
saveIds: boolean,
) {
const inputs = Object.create(null);
for (let i = 0; i < block.inputList.length; i++) {
@@ -278,6 +290,7 @@ function saveInputBlocks(
const connectionState = saveConnection(
input.connection as Connection,
doFullSerialization,
saveIds,
);
if (connectionState) {
inputs[input.name] = connectionState;
@@ -301,6 +314,7 @@ function saveNextBlocks(
block: Block,
state: State,
doFullSerialization: boolean,
saveIds: boolean,
) {
if (!block.nextConnection) {
return;
@@ -308,6 +322,7 @@ function saveNextBlocks(
const connectionState = saveConnection(
block.nextConnection,
doFullSerialization,
saveIds,
);
if (connectionState) {
state['next'] = connectionState;
@@ -326,6 +341,7 @@ function saveNextBlocks(
function saveConnection(
connection: Connection,
doFullSerialization: boolean,
saveIds: boolean,
): ConnectionState | null {
const shadow = connection.getShadowState(true);
const child = connection.targetBlock();
@@ -337,7 +353,7 @@ function saveConnection(
state['shadow'] = shadow;
}
if (child && !child.isShadow()) {
state['block'] = save(child, {doFullSerialization});
state['block'] = save(child, {doFullSerialization, saveIds});
}
return state;
}