Skip to content

Commit f5178d7

Browse files
committed
wip supporting section connections
Signed-off-by: Teo Koon Peng <[email protected]>
1 parent 5ab12f1 commit f5178d7

24 files changed

+284
-212
lines changed

diagram-editor/frontend/diagram-editor.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import {
3737
EditorModeProvider,
3838
} from './editor-mode';
3939
import ExportDiagramDialog from './export-diagram-dialog';
40-
import { defaultEdgeData, EditEdgeForm, EditNodeForm } from './forms';
40+
import { defaultEdgeOutputData, EditEdgeForm, EditNodeForm } from './forms';
4141
import EditScopeForm from './forms/edit-scope-form';
4242
import { NodeManager } from './node-manager';
4343
import {
@@ -562,7 +562,7 @@ function DiagramEditor() {
562562
const newEdge = {
563563
...createBaseEdge(conn.source, conn.target),
564564
type: validEdges[0],
565-
data: defaultEdgeData(validEdges[0]),
565+
data: defaultEdgeOutputData(validEdges[0]),
566566
} as DiagramEditorEdge;
567567

568568
const validationResult = validateEdgeSimple(
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { type EdgeProps, StepEdge } from '@xyflow/react';
2+
import type { Edge } from '../types/react-flow';
3+
import type { EdgeData } from '.';
4+
5+
export type BufferKeySlotData = {
6+
type: 'bufferKey';
7+
key: string;
8+
};
9+
10+
export type BufferSeqSlotData = {
11+
type: 'bufferSeq';
12+
seq: number;
13+
};
14+
15+
export type BufferOutputData = { [k: string]: unknown };
16+
// TODO: support section buffer
17+
export type BufferEdge = Edge<EdgeData<BufferOutputData>, 'buffer'>;
18+
19+
export type BufferEdgeProps = Exclude<EdgeProps<BufferEdge>, 'label'>;
20+
21+
const BufferEdgeComp = StepEdge;
22+
23+
export default BufferEdgeComp;

diagram-editor/frontend/edges/buffer-key-edge.tsx

Lines changed: 0 additions & 16 deletions
This file was deleted.

diagram-editor/frontend/edges/buffer-seq-edge.tsx

Lines changed: 0 additions & 16 deletions
This file was deleted.

diagram-editor/frontend/edges/create-edge.ts

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { MarkerType } from '@xyflow/react';
22
import { v4 as uuidv4 } from 'uuid';
3-
import type { DiagramEditorEdge, EdgeData } from '.';
3+
import type { DiagramEditorEdge, EdgeOutputData } from '.';
4+
import type { BufferKeySlotData, BufferSeqSlotData } from './buffer-edge';
45

56
export function createBaseEdge(
67
source: string,
@@ -25,19 +26,21 @@ export function createDefaultEdge(
2526
return {
2627
...createBaseEdge(source, target),
2728
type: 'default',
28-
data: {},
29+
data: { output: {} },
2930
};
3031
}
3132

3233
export function createUnzipEdge(
3334
source: string,
3435
target: string,
35-
data: EdgeData<'unzip'>,
36+
data: EdgeOutputData<'unzip'>,
3637
): DiagramEditorEdge<'unzip'> {
3738
return {
3839
...createBaseEdge(source, target),
3940
type: 'unzip',
40-
data,
41+
data: {
42+
output: data,
43+
},
4144
};
4245
}
4346

@@ -66,24 +69,24 @@ export function createForkResultErrEdge(
6669
export function createSplitKeyEdge(
6770
source: string,
6871
target: string,
69-
data: EdgeData<'splitKey'>,
72+
data: EdgeOutputData<'splitKey'>,
7073
): DiagramEditorEdge<'splitKey'> {
7174
return {
7275
...createBaseEdge(source, target),
7376
type: 'splitKey',
74-
data,
77+
data: { output: data },
7578
};
7679
}
7780

7881
export function createSplitSeqEdge(
7982
source: string,
8083
target: string,
81-
data: EdgeData<'splitSeq'>,
84+
data: EdgeOutputData<'splitSeq'>,
8285
): DiagramEditorEdge<'splitSeq'> {
8386
return {
8487
...createBaseEdge(source, target),
8588
type: 'splitSeq',
86-
data,
89+
data: { output: data },
8790
};
8891
}
8992

@@ -98,38 +101,38 @@ export function createSplitRemainingEdge(
98101
};
99102
}
100103

101-
export function createBufferKeyEdge(
102-
source: string,
103-
target: string,
104-
data: EdgeData<'bufferKey'>,
105-
): DiagramEditorEdge<'bufferKey'> {
106-
return {
107-
...createBaseEdge(source, target),
108-
type: 'bufferKey',
109-
data,
110-
};
111-
}
112-
113-
export function createBufferSeqEdge(
104+
export function createBufferEdge(
114105
source: string,
115106
target: string,
116-
data: EdgeData<'bufferSeq'>,
117-
): DiagramEditorEdge<'bufferSeq'> {
107+
data: BufferKeySlotData | BufferSeqSlotData,
108+
): DiagramEditorEdge<'buffer'> {
118109
return {
119110
...createBaseEdge(source, target),
120-
type: 'bufferSeq',
121-
data,
111+
type: 'buffer',
112+
data: { output: {}, input: data },
122113
};
123114
}
124115

125116
export function createStreamOutEdge(
126117
source: string,
127118
target: string,
128-
data: EdgeData<'streamOut'>,
119+
data: EdgeOutputData<'streamOut'>,
129120
): DiagramEditorEdge<'streamOut'> {
130121
return {
131122
...createBaseEdge(source, target),
132123
type: 'streamOut',
133-
data,
124+
data: { output: data },
134125
};
135126
}
127+
128+
// export function createSectionEdge(
129+
// source: string,
130+
// target: string,
131+
// data: EdgeOutputData<'section'>,
132+
// ): DiagramEditorEdge<'section'> {
133+
// return {
134+
// ...createBaseEdge(source, target),
135+
// type: 'section',
136+
// data: { output: data },
137+
// };
138+
// }

diagram-editor/frontend/edges/fork-result-err-edge.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { type EdgeProps, StepEdge } from '@xyflow/react';
22
import { memo } from 'react';
33
import type { Edge } from '../types/react-flow';
44

5-
export type ForkResultErrEdgeData = Record<string, never>;
6-
export type ForkResultErrEdge = Edge<ForkResultErrEdgeData, 'forkResultErr'>;
5+
export type ForkResultErrOutputData = Record<string, never>;
6+
export type ForkResultErrEdge = Edge<ForkResultErrOutputData, 'forkResultErr'>;
77

88
export type ForkResultErrEdgeProps = Exclude<
99
EdgeProps<ForkResultErrEdge>,

diagram-editor/frontend/edges/fork-result-ok-edge.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { type EdgeProps, StepEdge } from '@xyflow/react';
22
import { memo } from 'react';
33
import type { Edge } from '../types/react-flow';
44

5-
export type ForkResultOkEdgeData = Record<string, never>;
6-
export type ForkResultOkEdge = Edge<ForkResultOkEdgeData, 'forkResultOk'>;
5+
export type ForkResultOkOutputData = Record<string, never>;
6+
export type ForkResultOkEdge = Edge<ForkResultOkOutputData, 'forkResultOk'>;
77

88
export type ForkResultOkEdgeProps = Exclude<
99
EdgeProps<ForkResultOkEdge>,
Lines changed: 35 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,57 @@
11
import { StepEdge } from '@xyflow/react';
22
import type { Edge } from '../types/react-flow';
3-
import BufferKeyEdgeComp, {
4-
type BufferKeyEdge,
5-
type BufferKeyEdgeData,
6-
} from './buffer-key-edge';
7-
import BufferSeqEdgeComp, {
8-
type BufferSeqEdge,
9-
type BufferSeqEdgeData,
10-
} from './buffer-seq-edge';
3+
import BufferEdgeComp, {
4+
type BufferEdge,
5+
type BufferKeySlotData,
6+
type BufferSeqSlotData,
7+
} from './buffer-edge';
118
import ForkResultErrEdgeComp, {
129
type ForkResultErrEdge,
13-
type ForkResultErrEdgeData,
1410
} from './fork-result-err-edge';
1511
import ForkResultOkEdgeComp, {
1612
type ForkResultOkEdge,
17-
type ForkResultOkEdgeData,
1813
} from './fork-result-ok-edge';
19-
import SplitKeyEdgeComp, {
20-
type SplitKeyEdge,
21-
type SplitKeyEdgeData,
22-
} from './split-key-edge';
14+
import SplitKeyEdgeComp, { type SplitKeyEdge } from './split-key-edge';
2315
import SplitRemainingEdgeComp, {
2416
type SplitRemainingEdge,
25-
type SplitRemainingEdgeData,
2617
} from './split-remaining-edge';
27-
import SplitSeqEdgeComp, {
28-
type SplitSeqEdge,
29-
type SplitSeqEdgeData,
30-
} from './split-seq-edge';
31-
import StreamOutEdgeComp, {
32-
type StreamOutEdge,
33-
type StreamOutEdgeData,
34-
} from './stream-out-edge';
35-
import UnzipEdgeComp, {
36-
type UnzipEdge,
37-
type UnzipEdgeData,
38-
} from './unzip-edge';
18+
import SplitSeqEdgeComp, { type SplitSeqEdge } from './split-seq-edge';
19+
import StreamOutEdgeComp, { type StreamOutEdge } from './stream-out-edge';
20+
import UnzipEdgeComp, { type UnzipEdge } from './unzip-edge';
3921

40-
export type { BufferKeyEdge } from './buffer-key-edge';
41-
export type { BufferSeqEdge } from './buffer-seq-edge';
22+
export type { BufferEdge } from './buffer-edge';
4223
export * from './create-edge';
4324
export type { SplitKeyEdge } from './split-key-edge';
4425
export type { SplitRemainingEdge } from './split-remaining-edge';
4526
export type { SplitSeqEdge } from './split-seq-edge';
4627
export type { StreamOutEdge } from './stream-out-edge';
4728
export type { UnzipEdge } from './unzip-edge';
48-
export type DefaultEdgeData = Record<string, never>;
49-
export type DefaultEdge = Edge<DefaultEdgeData, 'default'>;
5029

51-
type EdgeMapping = {
52-
default: { edge: DefaultEdge; data: DefaultEdgeData };
53-
unzip: { edge: UnzipEdge; data: UnzipEdgeData };
54-
forkResultOk: { edge: ForkResultOkEdge; data: ForkResultOkEdgeData };
55-
forkResultErr: { edge: ForkResultErrEdge; data: ForkResultErrEdgeData };
56-
splitKey: { edge: SplitKeyEdge; data: SplitKeyEdgeData };
57-
splitSeq: { edge: SplitSeqEdge; data: SplitSeqEdgeData };
58-
splitRemaining: { edge: SplitRemainingEdge; data: SplitRemainingEdgeData };
59-
bufferKey: { edge: BufferKeyEdge; data: BufferKeyEdgeData };
60-
bufferSeq: { edge: BufferSeqEdge; data: BufferSeqEdgeData };
61-
streamOut: { edge: StreamOutEdge; data: StreamOutEdgeData };
30+
export type EdgeData<O extends Record<string, unknown>> = {
31+
output: O;
32+
input?: BufferKeySlotData | BufferSeqSlotData;
6233
};
6334

64-
export type EdgeTypes = keyof EdgeMapping;
35+
export type DefaultOutputData = { [k: string]: unknown };
36+
export type DefaultEdge = Edge<EdgeData<DefaultOutputData>, 'default'>;
6537

66-
export type DiagramEditorEdge<T extends EdgeTypes = EdgeTypes> =
67-
EdgeMapping[T]['edge'];
38+
export type EdgeMapping = {
39+
default: DefaultEdge;
40+
unzip: UnzipEdge;
41+
forkResultOk: ForkResultOkEdge;
42+
forkResultErr: ForkResultErrEdge;
43+
splitKey: SplitKeyEdge;
44+
splitSeq: SplitSeqEdge;
45+
splitRemaining: SplitRemainingEdge;
46+
buffer: BufferEdge;
47+
streamOut: StreamOutEdge;
48+
// section: SectionEdge;
49+
};
6850

69-
export type EdgeData<T extends EdgeTypes = EdgeTypes> = EdgeMapping[T]['data'];
51+
export type EdgeTypes = keyof EdgeMapping;
52+
53+
export type EdgeOutputData<K extends keyof EdgeMapping = keyof EdgeMapping> =
54+
EdgeMapping[K]['data']['output'];
7055

7156
export const EDGE_TYPES = {
7257
default: StepEdge,
@@ -76,7 +61,9 @@ export const EDGE_TYPES = {
7661
splitKey: SplitKeyEdgeComp,
7762
splitSeq: SplitSeqEdgeComp,
7863
splitRemaining: SplitRemainingEdgeComp,
79-
bufferKey: BufferKeyEdgeComp,
80-
bufferSeq: BufferSeqEdgeComp,
64+
buffer: BufferEdgeComp,
8165
streamOut: StreamOutEdgeComp,
66+
// section: SectionOutputEdgeComp,
8267
} satisfies Record<EdgeTypes, unknown>;
68+
69+
export type DiagramEditorEdge<T extends EdgeTypes = EdgeTypes> = EdgeMapping[T];
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { type EdgeProps, StepEdge } from '@xyflow/react';
2+
import { memo } from 'react';
3+
import type { Edge } from '../types/react-flow';
4+
import type { EdgeData } from '.';
5+
6+
export type SectionOutputData = {
7+
output: string;
8+
};
9+
10+
export type SectionEdge = Edge<EdgeData<SectionOutputData>, 'section'>;
11+
12+
export type SectionOutputEdgeProps = Exclude<EdgeProps<SectionEdge>, 'label'>;
13+
14+
export const SectionOutputEdgeComp = memo((props: SectionOutputEdgeProps) => {
15+
return <StepEdge {...props} label={props.data.output.toString()} />;
16+
});
17+
18+
export type SectionInputSlotData = {
19+
type: 'sectionInput';
20+
input: string;
21+
};
22+
23+
export type SectionBufferSlotData = {
24+
type: 'sectionBuffer';
25+
input: string;
26+
};
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import { type EdgeProps, StepEdge } from '@xyflow/react';
22
import { memo } from 'react';
33
import type { Edge } from '../types/react-flow';
4+
import type { EdgeData } from '.';
45

5-
export type SplitKeyEdgeData = {
6+
export type SplitKeyOutputData = {
67
key: string;
78
};
8-
export type SplitKeyEdge = Edge<SplitKeyEdgeData, 'splitKey'>;
9+
export type SplitKeyEdge = Edge<EdgeData<SplitKeyOutputData>, 'splitKey'>;
910

1011
export type SplitKeyEdgeProps = Exclude<EdgeProps<SplitKeyEdge>, 'label'>;
1112

1213
function SplitKeyEdgeComp(props: SplitKeyEdgeProps) {
13-
return <StepEdge {...props} label={props.data.key.toString()} />;
14+
return <StepEdge {...props} label={props.data.output.key.toString()} />;
1415
}
1516

1617
export default memo(SplitKeyEdgeComp);

0 commit comments

Comments
 (0)