fix(cascade-delete): recursively collect edge children (labels)

- Change from cellsToDelete.add(edgeId) to collectDescendants(edgeId)
- Fixes orphaned edge labels causing draw.io to crash/clear canvas
- Edge labels (parent=edgeId) are now deleted with their parent edge
This commit is contained in:
dayuan.jiang
2025-12-30 00:02:37 +09:00
parent 853f30ba89
commit 345381e61a
3 changed files with 13 additions and 3 deletions

View File

@@ -674,13 +674,18 @@ export function applyDiagramOperations(
collectDescendants(op.cell_id) collectDescendants(op.cell_id)
// Find edges referencing any of the cells to be deleted // Find edges referencing any of the cells to be deleted
// Also recursively collect children of those edges (e.g., edge labels)
for (const cellId of cellsToDelete) { for (const cellId of cellsToDelete) {
const referencingEdges = root.querySelectorAll( const referencingEdges = root.querySelectorAll(
`mxCell[source="${cellId}"], mxCell[target="${cellId}"]`, `mxCell[source="${cellId}"], mxCell[target="${cellId}"]`,
) )
referencingEdges.forEach((edge) => { referencingEdges.forEach((edge) => {
const edgeId = edge.getAttribute("id") const edgeId = edge.getAttribute("id")
if (edgeId) cellsToDelete.add(edgeId) // Protect root cells from being added via edge references
if (edgeId && edgeId !== "0" && edgeId !== "1") {
// Recurse to collect edge's children (like labels)
collectDescendants(edgeId)
}
}) })
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@next-ai-drawio/mcp-server", "name": "@next-ai-drawio/mcp-server",
"version": "0.1.9", "version": "0.1.10",
"description": "MCP server for Next AI Draw.io - AI-powered diagram generation with real-time browser preview", "description": "MCP server for Next AI Draw.io - AI-powered diagram generation with real-time browser preview",
"type": "module", "type": "module",
"main": "dist/index.js", "main": "dist/index.js",

View File

@@ -223,13 +223,18 @@ export function applyDiagramOperations(
collectDescendants(op.cell_id) collectDescendants(op.cell_id)
// Find edges referencing any of the cells to be deleted // Find edges referencing any of the cells to be deleted
// Also recursively collect children of those edges (e.g., edge labels)
for (const cellId of cellsToDelete) { for (const cellId of cellsToDelete) {
const referencingEdges = root.querySelectorAll( const referencingEdges = root.querySelectorAll(
`mxCell[source="${cellId}"], mxCell[target="${cellId}"]`, `mxCell[source="${cellId}"], mxCell[target="${cellId}"]`,
) )
referencingEdges.forEach((edge) => { referencingEdges.forEach((edge) => {
const edgeId = edge.getAttribute("id") const edgeId = edge.getAttribute("id")
if (edgeId) cellsToDelete.add(edgeId) // Protect root cells from being added via edge references
if (edgeId && edgeId !== "0" && edgeId !== "1") {
// Recurse to collect edge's children (like labels)
collectDescendants(edgeId)
}
}) })
} }