feat(node-modal): sanitize parent_id on type change and exclude descendants
- App.tsx: filter descendants of edited node from parentCandidates to prevent picking a child as parent (would create a cycle). - NodeModal.tsx: clear parent_id when switching to a type with no valid parents, and revalidate parent_id on submit against the type's allowlist. - Tests: cover getValidParentTypes for lxc/vm/docker_container and types that disallow parents. ha-relevant: yes
This commit is contained in:
+18
-1
@@ -561,7 +561,24 @@ export default function App() {
|
||||
onSubmit={handleUpdateNode}
|
||||
initial={editNode?.data}
|
||||
title="Edit Node"
|
||||
parentCandidates={nodes.map((n) => ({ id: n.id, label: n.data.label ?? n.id, type: n.data.type }))}
|
||||
parentCandidates={(() => {
|
||||
const descendants = new Set<string>()
|
||||
if (editNodeId) {
|
||||
const queue = [editNodeId]
|
||||
while (queue.length) {
|
||||
const id = queue.shift()!
|
||||
for (const n of nodes) {
|
||||
if (n.data.parent_id === id && !descendants.has(n.id)) {
|
||||
descendants.add(n.id)
|
||||
queue.push(n.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nodes
|
||||
.filter((n) => !descendants.has(n.id))
|
||||
.map((n) => ({ id: n.id, label: n.data.label ?? n.id, type: n.data.type }))
|
||||
})()}
|
||||
currentNodeId={editNodeId ?? undefined}
|
||||
/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user