Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
e3eb8d0
feat: update @code0-tech/triangulum dependency to version 0.14.0 and …
nicosammito Apr 28, 2026
3f0d73c
feat: update @code0-tech/triangulum dependency to version 0.14.1
nicosammito Apr 29, 2026
00240d0
feat: refactor DataTypeInputComponent to use NodeSchema and simplify …
nicosammito Apr 29, 2026
e95d3f1
feat: update NEXT_PUBLIC_PICTOR_VERSION to 0.6.4
nicosammito Apr 29, 2026
cadfd4a
feat: made schema optional
nicosammito Apr 29, 2026
1f32135
feat: schema generation for complete flow and parse into node
nicosammito Apr 29, 2026
81bc39e
feat: imports
nicosammito Apr 29, 2026
8868044
feat: reimplement function suggestions
nicosammito Apr 29, 2026
c78b6fd
feat: reimplement function suggestions
nicosammito Apr 29, 2026
ec66c5a
feat: removing hard coded input type, because it will be changed to a…
nicosammito Apr 29, 2026
7258901
feat: adding node schema to react flow node props
nicosammito Apr 29, 2026
85d6a04
feat: adding schema to input
nicosammito Apr 29, 2026
980ae82
feat: remove type
nicosammito Apr 29, 2026
a48c953
feat: get suggestions from schema
nicosammito Apr 29, 2026
d519c87
feat: adding schema to dep
nicosammito Apr 29, 2026
3c889bc
feat: adding trigger schema
nicosammito Apr 29, 2026
da29568
feat: getting node and schema
nicosammito Apr 29, 2026
d6dd469
feat: update schema action to support array of NodeSchema
nicosammito Apr 29, 2026
3ee23fc
feat: update FunctionNodeComponent to support array of NodeSchema
nicosammito Apr 29, 2026
03c7867
feat: update useFlowSchema to support namespace and project IDs
nicosammito Apr 29, 2026
023198b
feat: update DataTypeTextInputComponent and Flow.nodes.hook to enhanc…
nicosammito Apr 29, 2026
1885c84
feat: adding suggestions
nicosammito Apr 30, 2026
1b04138
feat: removing old suggestion logic
nicosammito Apr 30, 2026
8df40ae
feat: removing old suggestion logic
nicosammito Apr 30, 2026
e1a1894
feat: parsing in correct schema to node
nicosammito Apr 30, 2026
ab6d173
feat: using flow node to get schema
nicosammito Apr 30, 2026
1963c75
feat: increase schema generation performance
nicosammito Apr 30, 2026
d147893
feat: profile ux selectable improvement
nicosammito Apr 30, 2026
6a98810
feat: performance
nicosammito Apr 30, 2026
e7e0c19
feat: update dependency in edges hook for improved reactivity
nicosammito May 1, 2026
6a717cf
feat: enhance flow node handling with state management and effect hooks
nicosammito May 1, 2026
fb16169
feat: update schema hook dependencies for improved reactivity
nicosammito May 1, 2026
959b097
feat: add boolean input component with suggestion and validation support
nicosammito May 3, 2026
adf8eb1
feat: add boolean input component support in data type input
nicosammito May 3, 2026
b162f38
feat: refactor DataTypeJSONInputComponent to simplify state managemen…
nicosammito May 3, 2026
f68e474
feat: simplify DataTypeTextInputComponent by removing unused props
nicosammito May 3, 2026
10863fe
feat: enhance flow node hook to improve reactivity and prevent unnece…
nicosammito May 3, 2026
3375af0
feat: update flow node hook dependencies to include flow edit timesta…
nicosammito May 3, 2026
18bce4e
feat: update schema type in DataTypeInputComponent for improved type …
nicosammito May 3, 2026
1a59fcc
feat: enhance type safety in FunctionFileTriggerComponent by refining…
nicosammito May 3, 2026
0dec478
feat: refine suggestions type in FunctionSuggestionMenuComponent for …
nicosammito May 3, 2026
e02260d
feat: update @code0-tech/triangulum dependency to version 0.14.2
nicosammito May 3, 2026
399127a
feat: implement DataTypeSelectInputComponent and integrate into DataT…
nicosammito May 4, 2026
1921400
feat: update @code0-tech/pictor to version 0.7.1 and @code0-tech/tria…
nicosammito May 4, 2026
16e30fa
feat: add debounced change handler and default value logic in DataTyp…
nicosammito May 4, 2026
8468524
feat: enhance DataTypeSelectInputComponent with debounced onChange ha…
nicosammito May 4, 2026
0109cab
feat: implement debounced change handler in DataTypeTextInputComponent
nicosammito May 4, 2026
df704ac
feat: update DataTypeInputComponent to use InputWrapperProps and add …
nicosammito May 4, 2026
8af407d
feat: simplify ButtonGroup in DataTypeBooleanInputComponent by removi…
nicosammito May 4, 2026
c5e8f1c
feat: update ButtonGroup in DataTypeTextInputComponent to remove redu…
nicosammito May 4, 2026
0c296ad
feat: optimize FlowBuilderComponent by improving node measurement and…
nicosammito May 5, 2026
4ee6924
feat: refactor FunctionFilesComponent to streamline active tab handli…
nicosammito May 5, 2026
5b23ca2
feat: update PICTOR_VERSION to 0.7.0 in .env.local
nicosammito May 5, 2026
4417ae4
feat: enhance DataTypeBooleanInputComponent to improve value handling…
nicosammito May 5, 2026
488c6c1
feat: update DataTypeInputComponentProps to enhance type safety with …
nicosammito May 5, 2026
8bca055
feat: enhance DataTypeSelectInputComponent to improve onChange handli…
nicosammito May 5, 2026
c672789
feat: enhance DataTypeTextInputComponent to improve value handling an…
nicosammito May 5, 2026
d11175f
feat: enhance FunctionFileDefaultComponent to improve value handling …
nicosammito May 5, 2026
bbdc467
feat: enhance FunctionFileTriggerComponent to improve value handling …
nicosammito May 5, 2026
b8711df
feat: update DataTypeInputComponent to enhance suggestions type and s…
nicosammito May 5, 2026
08efff8
feat: enhance DataTypeSelectInputComponent to improve value selection…
nicosammito May 5, 2026
b871baa
feat: add lodash and its type definitions to enhance utility functions
nicosammito May 5, 2026
302accb
feat: enhance DataTypeBooleanInputComponent to improve value change h…
nicosammito May 5, 2026
bc17702
feat: update DataTypeInputComponent to enhance props and simplify inp…
nicosammito May 5, 2026
1204711
feat: enhance DataTypeSelectInputComponent to support onChange prop a…
nicosammito May 5, 2026
09dafad
feat: enhance DataTypeTextInputComponent to support onChange prop and…
nicosammito May 5, 2026
2d2bca6
feat: refactor useFlowValidation to optimize validation result handli…
nicosammito May 5, 2026
f304338
feat: improve flowTypeId input handling by adding optional chaining f…
nicosammito May 5, 2026
7d82d58
feat: update FunctionFileDefaultComponent to improve validation handl…
nicosammito May 5, 2026
510c47f
feat: enhance FunctionFileDefaultComponent to track input changes and…
nicosammito May 5, 2026
597ea81
feat: enhance input components to support optional chaining and impro…
nicosammito May 5, 2026
dd52935
feat: enhance DataTypeBooleanInputComponent and DataTypeTextInputComp…
nicosammito May 6, 2026
994d256
feat: add DataTypeInputControlsComponent to support suggestion menus …
nicosammito May 6, 2026
59185cb
feat: enhance DataTypeBooleanInputComponent to support additional val…
nicosammito May 6, 2026
52a2009
feat: enhance DataTypeTextInputComponent to support additional value …
nicosammito May 6, 2026
80dcc9e
feat: refactor DataTypeBooleanInputComponent to use DataTypeInputValu…
nicosammito May 7, 2026
808c074
feat: update DataTypeInputComponent to support new value types in onC…
nicosammito May 7, 2026
f3124cc
feat: add DataTypeInputValueComponent for enhanced value handling and…
nicosammito May 7, 2026
57ead97
feat: integrate DataTypeInputValueComponent into DataTypeTextInputCom…
nicosammito May 7, 2026
857d6f8
feat: add DataTypeNumberInputComponent to DataTypeInputComponent for …
nicosammito May 7, 2026
f413880
feat: add DataTypeNumberInputComponent for handling number inputs wit…
nicosammito May 7, 2026
449c1f1
feat: convert defaultValue to string in DataTypeTextInputComponent fo…
nicosammito May 7, 2026
feb0a69
feat: update node measurement logic in FlowBuilderComponent for accur…
nicosammito May 7, 2026
1b9cd19
feat: enhance suggestion handling in DataTypeInputControlsComponent w…
nicosammito May 7, 2026
a6dcc14
feat: update @code0-tech/pictor dependency to version 0.7.2
nicosammito May 7, 2026
1ad603e
feat: update DataTypeTypeEditorInputProps to extend EditorProps for i…
nicosammito May 7, 2026
94d7190
feat: add optional chaining to formValidation.setValue calls for safe…
nicosammito May 7, 2026
f3c6833
feat: add optional chaining to formValidation.setValue calls for safe…
nicosammito May 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.local
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ NEXT_PUBLIC_EDITION=ce
SAGITTARIUS_GRAPHQL_URL=http://localhost:3010/graphql

NEXT_PUBLIC_SCULPTOR_VERSION=0.0.0
NEXT_PUBLIC_PICTOR_VERSION=0.6.0
NEXT_PUBLIC_PICTOR_VERSION=0.7.0
NEXT_PUBLIC_ALLOWED_REDIRECT_DOMAINS=*.code0.tech,*.codezero.build

NEXT_PUBLIC_OTEL_SERVICE_NAME=#"sculptor-client"
Expand Down
196 changes: 109 additions & 87 deletions package-lock.json

Large diffs are not rendered by default.

6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
},
"dependencies": {
"@apollo/client": "^4.0.9",
"@code0-tech/pictor": "^0.6.4",
"@code0-tech/triangulum": "^0.13.3",
"@code0-tech/pictor": "^0.7.2",
"@code0-tech/triangulum": "^0.14.3",
"@codemirror/lang-javascript": "^6.2.5",
"@codemirror/lint": "^6.9.5",
"@opentelemetry/api": "^1.9.1",
Expand All @@ -32,6 +32,7 @@
"graphql": "^16.12.0",
"graphql-tag": "^2.12.6",
"ldrs": "^1.1.9",
"lodash": "^4.18.1",
"next": "16.2.3",
"prettier": "^3.8.1",
"react": "19.2.5",
Expand All @@ -42,6 +43,7 @@
"use-debounce": "^10.1.1"
},
"devDependencies": {
"@types/lodash": "^4.17.24",
"@types/node": "^24.0.0",
"@types/react": "^19",
"@types/react-dom": "^19",
Expand Down
4 changes: 4 additions & 0 deletions src/app/global.scss
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,8 @@ a {
&:hover {
text-decoration: underline;
}
}

.scroll-area__viewport > div {
display: block !important;
}
Original file line number Diff line number Diff line change
@@ -1,71 +1,47 @@
import {Flow, NodeFunction} from "@code0-tech/sagittarius-graphql-types";
import React from "react";
import {DataTypeTextInputComponent} from "./text/DataTypeTextInputComponent";
import {InputProps, useService, useStore} from "@code0-tech/pictor";
import {FlowService} from "@edition/flow/services/Flow.service";
import {DatatypeService} from "@edition/datatype/services/Datatype.service";
import {FunctionService} from "@edition/function/services/Function.service";
import {DataTypeVariant, getTypesFromFunction, getTypeVariant} from "@code0-tech/triangulum";
import {DataTypeJSONInputComponent} from "@edition/datatype/components/inputs/json/DataTypeJSONInputComponent";

export interface DataTypeInputComponentProps extends Omit<InputProps<any | null>, "wrapperComponent" | "type"> {
flowId: Flow['id']
nodeId?: NodeFunction['id'] //TODO if undefined we need to get infos from trigger
parameterIndex: number
import {NodeSchema} from "@code0-tech/triangulum";
import {LiteralValue, NodeFunction, NodeParameterValue, ReferenceValue} from "@code0-tech/sagittarius-graphql-types";
import {DataTypeBooleanInputComponent} from "@edition/datatype/components/inputs/boolean/DataTypeBooleanInputComponent";
import {DataTypeSelectInputComponent} from "@edition/datatype/components/inputs/select/DataTypeSelectInputComponent";
import {InputWrapperProps} from "@code0-tech/pictor/dist/components/form/InputWrapper";
import {DataTypeNumberInputComponent} from "@edition/datatype/components/inputs/number/DataTypeNumberInputComponent";

export interface DataTypeInputComponentProps extends Omit<InputWrapperProps<NodeParameterValue | NodeFunction>, "wrapperComponent" | "onChange"> {
schema: NodeSchema
clearable?: boolean
onChange?: (value: ReferenceValue | LiteralValue | NodeFunction | undefined) => void
suggestions?: (NodeFunction | ReferenceValue | LiteralValue)[]
onClear?: (event: React.MouseEvent<HTMLButtonElement>) => void
}

export const DataTypeInputComponent: React.FC<DataTypeInputComponentProps> = (props) => {

const {flowId, nodeId, parameterIndex, ...rest} = props

const flowService = useService(FlowService)
const flowStore = useStore(FlowService)
const dataTypeStore = useStore(DatatypeService)
const dataTypeService = useService(DatatypeService)
const functionStore = useStore(FunctionService)
const functionService = useService(FunctionService)

const flow = React.useMemo(
() => flowId ? flowService.getById(flowId) : undefined,
[flowStore, flowId]
)

const node = React.useMemo(
() => nodeId && flowId ? flowService.getNodeById(flowId, nodeId) : undefined,
[flowStore, flowId, nodeId]
)

const functionDefinition = React.useMemo(
() => node ? functionService.getById(node?.functionDefinition?.id) : undefined,
[functionStore, node]
)

const types = React.useMemo(
() => nodeId ? getTypesFromFunction(functionDefinition!) : undefined,
[functionDefinition, nodeId]
)
const {schema, ...rest} = props

const dataTypeVariant = React.useMemo(
() => types ? getTypeVariant(types.parameters[parameterIndex], dataTypeService.values())[0].variant : undefined,
[dataTypeStore, types]
)
const suggestions = schema?.schema?.suggestions as (NodeFunction | ReferenceValue | LiteralValue)[]

switch (dataTypeVariant) {
case DataTypeVariant.ARRAY:
case DataTypeVariant.OBJECT:
return <DataTypeJSONInputComponent
flowId={flowId}
nodeId={nodeId}
parameterIndex={parameterIndex}
switch (schema?.schema?.input) {
case "boolean":
return <DataTypeBooleanInputComponent
schema={schema}
suggestions={suggestions}
{...rest}
/>
case "select":
return <DataTypeSelectInputComponent
schema={schema}
suggestions={suggestions}
{...rest}/>
case "number":
return <DataTypeNumberInputComponent
schema={schema}
suggestions={suggestions}
{...rest}/>
default:
return <DataTypeTextInputComponent
flowId={flowId}
nodeId={nodeId}
parameterIndex={parameterIndex}
suggestions={suggestions}
schema={schema}
{...rest}
/>
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import {LiteralValue, NodeFunction, ReferenceValue} from "@code0-tech/sagittarius-graphql-types";
import React from "react";
import {IconVariable, IconX} from "@tabler/icons-react";
import {ReferenceBadgeComponent} from "@edition/datatype/components/badges/ReferenceBadgeComponent";
import {
Button,
ButtonGroup,
Flex,
Menu,
MenuContent,
MenuItem,
MenuPortal,
MenuTrigger,
Text,
Tooltip,
TooltipContent,
TooltipPortal,
TooltipTrigger
} from "@code0-tech/pictor"

export interface DataTypeInputControlsComponentProps {
suggestions?: (NodeFunction | ReferenceValue | LiteralValue)[]
onSelect?: (value: NodeFunction | ReferenceValue | LiteralValue | undefined) => void
}

export const DataTypeInputControlsComponent: React.FC<DataTypeInputControlsComponentProps> = (props) => {

const {suggestions, onSelect} = props

const filteredSuggestions = React.useMemo(() => {
if (!suggestions) return []
return suggestions.filter(suggest => suggest.__typename === "LiteralValue" || suggest.__typename === "ReferenceValue")
}, [suggestions])

return <ButtonGroup color={"primary"}>
<Menu>
<Tooltip>
<TooltipTrigger asChild>
<MenuTrigger asChild disabled={filteredSuggestions.length <= 0}>
<Button paddingSize={"xxs"}>
<IconVariable size={13}/>
</Button>
</MenuTrigger>
</TooltipTrigger>
<TooltipPortal>
<TooltipContent side={"top"} sideOffset={8}>
{filteredSuggestions.length <= 0 ? <Text>
No suggestion available
</Text> : <Text>
Suggestions for this parameter
</Text>}
</TooltipContent>
</TooltipPortal>
</Tooltip>
<MenuPortal>
<MenuContent>
{filteredSuggestions?.map((suggest, index) => {
if (suggest.__typename === "LiteralValue") {
return <MenuItem onSelect={() => onSelect?.(suggest)}>
<Flex style={{gap: "0.35rem"}} align={"center"}>
{(suggest)?.value.toString()}
</Flex>
</MenuItem>
}

if (suggest.__typename === "ReferenceValue") {
return <MenuItem onSelect={() => onSelect?.(suggest)}>
<ReferenceBadgeComponent value={suggest}/>
</MenuItem>
}
})}
</MenuContent>
</MenuPortal>
</Menu>
<Button paddingSize={"xxs"} onClick={() => {
onSelect?.(undefined)
}}>
<IconX size={13}/>
</Button>
</ButtonGroup>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import React from "react";
import {InputWrapper} from "@code0-tech/pictor/dist/components/form/InputWrapper";
import {DataTypeInputComponentProps} from "@edition/datatype/components/inputs/DataTypeInputComponent";
import {DataTypeInputControlsComponent} from "@edition/datatype/components/inputs/DataTypeInputControlsComponent";
import {NodeBadgeComponent} from "@edition/datatype/components/badges/NodeBadgeComponent";
import {ReferenceBadgeComponent} from "@edition/datatype/components/badges/ReferenceBadgeComponent";

export interface DataTypeInputValueComponentProps extends Omit<DataTypeInputComponentProps, 'schema'> {
children?: React.ReactNode
inside?: boolean
}

export const DataTypeInputValueComponent: React.FC<DataTypeInputValueComponentProps> = (props) => {

const {children, inside = false, initialValue, suggestions, onChange, formValidation} = props

return inside || initialValue?.__typename === "NodeFunction" || initialValue?.__typename === "NodeFunctionIdWrapper" || initialValue?.__typename === "ReferenceValue" ?
<InputWrapper formValidation={{...formValidation, setValue: undefined}} right={
<DataTypeInputControlsComponent suggestions={suggestions} onSelect={onChange}/>
} rightType={"action"}>
<div style={{alignSelf: "center", flex: "1 1 auto"}}>
{
initialValue?.__typename === "NodeFunction" || initialValue?.__typename === "NodeFunctionIdWrapper" ? (
<NodeBadgeComponent value={initialValue}/>
) : initialValue?.__typename === "ReferenceValue" ? (
<ReferenceBadgeComponent value={initialValue}/>
) : inside ? children : null
}
</div>
</InputWrapper> : children

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import React from "react";
import {DataTypeInputComponentProps} from "@edition/datatype/components/inputs/DataTypeInputComponent";
import {InputDescription, InputLabel, SegmentedControl, SegmentedControlItem} from "@code0-tech/pictor";
import {useDebouncedCallback} from "use-debounce";
import {LiteralValue, NodeFunction, ReferenceValue} from "@code0-tech/sagittarius-graphql-types";
import {DataTypeInputValueComponent} from "@edition/datatype/components/inputs/DataTypeInputValueComponent";

export type DataTypeBooleanInputComponentProps = DataTypeInputComponentProps

export const DataTypeBooleanInputComponent: React.FC<DataTypeBooleanInputComponentProps> = (props) => {

const {suggestions, initialValue, title, description, formValidation, onChange} = props

const onChangeDebounced = useDebouncedCallback((value: string | LiteralValue | NodeFunction | ReferenceValue | undefined) => {

if (typeof value === "string") {
const boolValue: LiteralValue | undefined = value && ["true", "false"].includes(value) ? {
__typename: "LiteralValue",
value: value === "true"
} : undefined

formValidation?.setValue?.(boolValue)
onChange?.(boolValue)
} else {
formValidation?.setValue?.(value)
onChange?.(value)
}

}, 200)

return React.useMemo(() => <>
<InputLabel>{title}</InputLabel>
<InputDescription>{description}</InputDescription>
<DataTypeInputValueComponent inside initialValue={initialValue} onChange={onChangeDebounced}
suggestions={suggestions} formValidation={formValidation}>
<SegmentedControl type={"single"}
h={"100%"}
ml={-0.35}
bg={"transparent"}
style={{boxShadow: "none"}}
value={(initialValue as LiteralValue)?.value?.toString() ?? ""}
onValueChange={onChangeDebounced}>
<SegmentedControlItem w={"100%"} value={"true"}>
True
</SegmentedControlItem>
<SegmentedControlItem w={"100%"} value={"false"}>
False
</SegmentedControlItem>
</SegmentedControl>
</DataTypeInputValueComponent>
</>, [formValidation, initialValue])

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import React, {useCallback, useMemo} from "react";
import {tags as t} from "@lezer/highlight";
import {Badge, hashToColor, useService, useStore} from "@code0-tech/pictor";
import {Editor, EditorInputProps, EditorTokenHighlights} from "@code0-tech/pictor/dist/components/editor/Editor";
import {Editor, EditorProps, EditorTokenHighlights} from "@code0-tech/pictor/dist/components/editor/Editor";
import {StreamLanguage} from "@codemirror/language";
import {CompletionContext, CompletionResult} from "@codemirror/autocomplete";
import {DatatypeService} from "@edition/datatype/services/Datatype.service";

export interface DataTypeTypeEditorInputProps extends EditorInputProps {
export interface DataTypeTypeEditorInputProps extends EditorProps {
value: string | null
isTechnicalType?: boolean
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export const DataTypeTypeInputComponent: React.FC<DataTypeJSONInputComponentProp
)

React.useEffect(() => {
formValidation?.setValue(type)
formValidation?.setValue?.(type)
const timeout = setTimeout(() => {
// @ts-ignore
onChange?.()
Expand Down
Loading