Skip to content

Commit 64a324f

Browse files
committed
fix code node bug
1 parent 893699b commit 64a324f

File tree

4 files changed

+34
-8
lines changed

4 files changed

+34
-8
lines changed

frontend/src/scenes/frame/panels/Diagram/CodeNode.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BindLogic, useActions, useValues } from 'kea'
2-
import { NodeProps, Handle, Position, NodeResizer } from 'reactflow'
2+
import { NodeProps, Handle, Position, NodeResizer, useUpdateNodeInternals } from 'reactflow'
33
import { CodeNodeData } from '../../../../types'
44
import clsx from 'clsx'
55
import { diagramLogic } from './diagramLogic'
@@ -12,8 +12,9 @@ import { CodeArg } from './CodeArg'
1212
import { newNodePickerLogic } from './newNodePickerLogic'
1313

1414
export function CodeNode({ id, isConnectable }: NodeProps<CodeNodeData>): JSX.Element {
15+
const updateNodeInternals = useUpdateNodeInternals()
1516
const { frameId, sceneId } = useValues(diagramLogic)
16-
const { updateNodeData, copyAppJSON, deleteApp } = useActions(diagramLogic)
17+
const { updateNodeData, updateEdge, copyAppJSON, deleteApp } = useActions(diagramLogic)
1718
const appNodeLogicProps = { frameId, sceneId, nodeId: id }
1819
const { isSelected, node, nodeEdges } = useValues(appNodeLogic(appNodeLogicProps))
1920
const data: CodeNodeData = (node?.data as CodeNodeData) ?? ({ code: '' } satisfies CodeNodeData)
@@ -93,11 +94,17 @@ export function CodeNode({ id, isConnectable }: NodeProps<CodeNodeData>): JSX.El
9394
<CodeArg
9495
key={`${codeField.type}/${codeField.name}`}
9596
codeArg={codeField}
96-
onChange={(value) =>
97+
onChange={(value) => {
9798
updateNodeData(id, {
9899
codeArgs: data.codeArgs?.map((c, j) => (i === j ? { ...c, ...value } : c)),
99100
})
100-
}
101+
nodeEdges.forEach((edge) => {
102+
if (edge.target === id && edge.targetHandle === `codeField/${codeField.name}`) {
103+
updateEdge({ ...edge, targetHandle: `codeField/${value.name}` })
104+
}
105+
})
106+
updateNodeInternals(id)
107+
}}
101108
onDelete={() => editCodeField(codeField.name, '')}
102109
/>
103110
</div>

frontend/src/scenes/frame/panels/Diagram/diagramLogic.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export const diagramLogic = kea<diagramLogicType>([
7474
fitDiagramView: true,
7575
keywordDropped: (keyword: string, type: string, position: XYPosition) => ({ keyword, type, position }),
7676
updateNodeData: (id: string, data: Record<string, any>) => ({ id, data }),
77+
updateEdge: (edge: Edge) => ({ edge }),
7778
updateNodeConfig: (id: string, field: string, value: any) => ({ id, field, value }),
7879
copyAppJSON: (nodeId: string) => ({ nodeId }),
7980
deleteApp: (id: string) => ({ id }),
@@ -139,6 +140,10 @@ export const diagramLogic = kea<diagramLogicType>([
139140
const newEdges = state.filter((edge) => edge.source !== id && edge.target !== id)
140141
return equal(state, newEdges) ? state : newEdges
141142
},
143+
updateEdge: (state, { edge }) => {
144+
const newEdges = state.map((oldEdge) => (oldEdge.id === edge.id ? { ...oldEdge, ...edge } : oldEdge))
145+
return equal(state, newEdges) ? state : newEdges
146+
},
142147
},
143148
],
144149
fitViewCounter: [0, { fitDiagramView: (state) => state + 1 }],

frontend/src/scenes/frame/panels/Diagram/newNodePickerLogic.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,9 +505,13 @@ export const newNodePickerLogic = kea<newNodePickerLogicType>([
505505
return
506506
}
507507

508+
// Dragged onto the canvas from a "+" codefield arg
508509
if (handleId === 'codeField/+') {
509510
const codeArgs = (values.nodes.find((node) => node.id === nodeId)?.data as CodeNodeData)?.codeArgs ?? []
510-
let newArg = { name: keyword || getNewFieldName(codeArgs), type: type ?? 'string' } satisfies CodeArg
511+
let newArg = {
512+
name: keyword === '+' ? getNewFieldName(codeArgs) : keyword,
513+
type: type ?? 'string',
514+
} satisfies CodeArg
511515
actions.setNodes([
512516
...values.nodes.map((node) =>
513517
node.id === nodeId ? { ...node, data: { ...node.data, codeArgs: [...codeArgs, newArg] } } : node

frontend/src/scenes/frame/panels/Scenes/ExpandedScene.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { TextArea } from '../../../../components/TextArea'
77
import { TextInput } from '../../../../components/TextInput'
88
import { Button } from '../../../../components/Button'
99
import { controlLogic } from './controlLogic'
10+
import { panelsLogic } from '../panelsLogic'
1011

1112
export interface ExpandedSceneProps {
1213
sceneId: string
@@ -17,6 +18,7 @@ export function ExpandedScene({ frameId, sceneId }: ExpandedSceneProps) {
1718
const { stateChanges, hasStateChanges, fields } = useValues(expandedSceneLogic({ frameId, sceneId }))
1819
const { states, sceneId: currentSceneId } = useValues(controlLogic({ frameId }))
1920
const { submitStateChanges, resetStateChanges } = useActions(expandedSceneLogic({ frameId, sceneId }))
21+
const { editScene } = useActions(panelsLogic)
2022
const fieldCount = fields.length ?? 0
2123

2224
const currentState = states[sceneId] ?? {}
@@ -26,9 +28,14 @@ export function ExpandedScene({ frameId, sceneId }: ExpandedSceneProps) {
2628
{fieldCount === 0 ? (
2729
<div className="space-y-2">
2830
<div>This scene does not export publicly controllable state.</div>
29-
<Button onClick={submitStateChanges} color={sceneId !== currentSceneId ? 'primary' : 'secondary'}>
30-
Activate scene
31-
</Button>
31+
<div className="flex items-center gap-2">
32+
<Button onClick={submitStateChanges} color={sceneId !== currentSceneId ? 'primary' : 'secondary'}>
33+
Activate scene
34+
</Button>
35+
<Button onClick={() => editScene(sceneId)} color="secondary">
36+
Edit scene
37+
</Button>
38+
</div>
3239
</div>
3340
) : (
3441
<Form logic={expandedSceneLogic} props={{ frameId, sceneId }} formKey="stateChanges" className="space-y-2">
@@ -100,6 +107,9 @@ export function ExpandedScene({ frameId, sceneId }: ExpandedSceneProps) {
100107
<Button onClick={() => resetStateChanges()} color="secondary">
101108
Reset
102109
</Button>
110+
<Button onClick={() => editScene(sceneId)} color="secondary">
111+
Edit scene
112+
</Button>
103113
</div>
104114
) : null}
105115
</Form>

0 commit comments

Comments
 (0)