Skip to content

Commit d563d65

Browse files
committed
fix(workflows): preserve version-specific container labels
1 parent 8f96452 commit d563d65

2 files changed

Lines changed: 69 additions & 11 deletions

File tree

‎apps/sim/app/workspace/[workspaceId]/w/components/workflow-diff/utils.test.ts‎

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
/**
22
* @vitest-environment node
33
*/
4+
import {
5+
generateLoopBlocks,
6+
generateParallelBlocks,
7+
} from '@sim/workflow-persistence/subflow-helpers'
48
import { beforeEach, describe, expect, it, vi } from 'vitest'
5-
import type { WorkflowDiffSummary } from '@/lib/workflows/comparison'
9+
import { generateWorkflowDiffSummary, type WorkflowDiffSummary } from '@/lib/workflows/comparison'
610
import {
711
classifyChange,
812
listBlockChanges,
@@ -238,6 +242,61 @@ describe('listOneSidedFields', () => {
238242
})
239243

240244
describe('listBlockChanges', () => {
245+
it("uses each version's names for moved members and added or removed containers", () => {
246+
const baseBlocks = {
247+
source: block('source', { type: 'loop', name: 'Original source' }),
248+
destination: block('destination', { type: 'parallel', name: 'Original destination' }),
249+
mover: block('mover', { name: 'Original member', data: { parentId: 'source' } }),
250+
removedWrapper: block('removedWrapper', { type: 'loop', name: 'Removed wrapper' }),
251+
survivor: block('survivor', {
252+
name: 'Original survivor',
253+
data: { parentId: 'removedWrapper' },
254+
}),
255+
}
256+
const targetBlocks = {
257+
source: block('source', { type: 'loop', name: 'Renamed source' }),
258+
destination: block('destination', { type: 'parallel', name: 'Renamed destination' }),
259+
mover: block('mover', { name: 'Renamed member', data: { parentId: 'destination' } }),
260+
addedWrapper: block('addedWrapper', { type: 'parallel', name: 'Added wrapper' }),
261+
survivor: block('survivor', { name: 'Renamed survivor', data: { parentId: 'addedWrapper' } }),
262+
}
263+
const base: WorkflowState = {
264+
blocks: baseBlocks,
265+
edges: [],
266+
loops: generateLoopBlocks(baseBlocks),
267+
parallels: generateParallelBlocks(baseBlocks),
268+
}
269+
const target: WorkflowState = {
270+
blocks: targetBlocks,
271+
edges: [],
272+
loops: generateLoopBlocks(targetBlocks),
273+
parallels: generateParallelBlocks(targetBlocks),
274+
}
275+
const entries = listBlockChanges(
276+
generateWorkflowDiffSummary(target, base),
277+
baseBlocks,
278+
targetBlocks,
279+
{ base, target }
280+
)
281+
const byId = new Map(entries.map((entry) => [entry.id, entry]))
282+
expect(byId.get('mover')?.moved).toEqual({
283+
outOf: 'Original source',
284+
into: 'Renamed destination',
285+
})
286+
expect(byId.get('source')?.membership?.removed).toEqual([
287+
{ name: 'Original member', moved: true },
288+
])
289+
expect(byId.get('destination')?.membership?.added).toEqual([
290+
{ name: 'Renamed member', moved: true },
291+
])
292+
expect(byId.get('removedWrapper')?.membership?.removed).toEqual([
293+
{ name: 'Original survivor', moved: true },
294+
])
295+
expect(byId.get('addedWrapper')?.membership?.added).toEqual([
296+
{ name: 'Renamed survivor', moved: true },
297+
])
298+
})
299+
241300
it('orders modified, added, removed and nests children under an added or removed container', () => {
242301
const baseBlocks = {
243302
keep: block('keep', { subBlocks: { code: { id: 'code', type: 'code', value: 'a' } } }),

‎apps/sim/app/workspace/[workspaceId]/w/components/workflow-diff/utils.ts‎

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,6 @@ export function listBlockChanges(
375375
target: Pick<WorkflowState, 'loops' | 'parallels'>
376376
}
377377
): BlockChangeEntry[] {
378-
const blocks = { ...baseBlocks, ...targetBlocks }
379378
const modified = new Map<string, BlockChangeEntry>()
380379
for (const block of summary.modifiedBlocks) {
381380
modified.set(block.id, {
@@ -395,8 +394,8 @@ export function listBlockChanges(
395394
if (!entry) {
396395
entry = {
397396
id,
398-
type: blocks[id]?.type ?? 'unknown',
399-
name: blockName(blocks, id),
397+
type: targetBlocks[id]?.type ?? 'unknown',
398+
name: blockName(targetBlocks, id),
400399
status: 'modified',
401400
changes: [],
402401
children: [],
@@ -414,8 +413,8 @@ export function listBlockChanges(
414413
if (before === after) continue
415414
const entry = ensureModified(id)
416415
entry.moved = {
417-
...(after ? { into: blockName(blocks, after) } : {}),
418-
...(before ? { outOf: blockName(blocks, before) } : {}),
416+
...(after ? { into: blockName(targetBlocks, after) } : {}),
417+
...(before ? { outOf: blockName(baseBlocks, before) } : {}),
419418
}
420419
}
421420

@@ -430,13 +429,13 @@ export function listBlockChanges(
430429
.map((change) => ({ ...change, scope: 'container' as const })),
431430
]
432431
if (container.nodesAdded.length || container.nodesRemoved.length) {
433-
const row = (id: string): MembershipRow => ({
434-
name: blockName(blocks, id),
432+
const row = (id: string, side: Record<string, BlockState>): MembershipRow => ({
433+
name: blockName(side, id),
435434
moved: Boolean(baseBlocks[id] && targetBlocks[id]),
436435
})
437436
entry.membership = {
438-
added: container.nodesAdded.map(row),
439-
removed: container.nodesRemoved.map(row),
437+
added: container.nodesAdded.map((id) => row(id, targetBlocks)),
438+
removed: container.nodesRemoved.map((id) => row(id, baseBlocks)),
440439
}
441440
}
442441
}
@@ -486,7 +485,7 @@ export function listBlockChanges(
486485
if (isContainerType(entry.type)) {
487486
const survivors = (children.get(entry.id) ?? []).filter((id) => !sameStatus.has(id))
488487
if (survivors.length) {
489-
const rows = survivors.map((id) => ({ name: blockName(blocks, id), moved: true }))
488+
const rows = survivors.map((id) => ({ name: blockName(side, id), moved: true }))
490489
entry.membership = {
491490
added: status === 'added' ? rows : [],
492491
removed: status === 'removed' ? rows : [],

0 commit comments

Comments
 (0)