11import React from "react" ;
2- import { Alert , Spacing , Text , useForm , useService , useStore } from "@code0-tech/pictor" ;
2+ import { Alert , Button , Flex , Spacing , Text , useForm , useService , useStore } from "@code0-tech/pictor" ;
33import {
44 Flow ,
55 LiteralValue ,
@@ -20,6 +20,8 @@ import {
2020} from "@core/util/fallback-translations" ;
2121import { useNodes } from "@xyflow/react" ;
2222import { NodeSchema } from "@code0-tech/triangulum" ;
23+ import * as Collapsible from "@radix-ui/react-collapsible" ;
24+ import { IconChevronDown } from "@tabler/icons-react" ;
2325
2426export interface FunctionFileDefaultComponentProps {
2527 nodeId : NodeFunction [ 'id' ]
@@ -120,30 +122,55 @@ export const FunctionFileDefaultComponent: React.FC<FunctionFileDefaultComponent
120122 < Spacing spacing = { "xl" } />
121123 < Text size = { "md" } > Parameters</ Text >
122124 < Spacing spacing = { "xs" } />
123- { definition ?. parameterDefinitions ?. nodes ?. map ( ( parameterDefinition , index ) => {
124-
125- if ( ! parameterDefinition ) return null
126-
127- const title = parameterDefinition ?. names ?. [ 0 ] ?. content ?? FALLBACK_FUNCTION_PARAMETER_NAME
128- const description = parameterDefinition ?. descriptions ?. [ 0 ] ?. content ?? FALLBACK_FUNCTION_PARAMETER_DESCRIPTION
129-
130- const schema = ( flowNode ?. data ?. schema as NodeSchema [ ] ) ?. [ index ]
131-
132- return < div >
133- < DataTypeInputComponent data-qa-selector = { "flow-builder-parameter" }
134- title = { title }
135- schema = { schema }
136- description = { description }
137- clearable
138- key = { parameterDefinition . id }
139- onChange = { ( ) => {
140- changedParameter . current . add ( parameterDefinition . id ! )
141- validate ( )
142- } }
143- { ...inputs . getInputProps ( parameterDefinition . id ! ) }
144- />
145- < Spacing spacing = { "xl" } />
146- </ div >
147- } ) }
125+ { ( ( ) => {
126+ const indexedParameters = definition ?. parameterDefinitions ?. nodes
127+ ?. map ( ( parameterDefinition , index ) => ( { parameterDefinition, index} ) )
128+ ?. filter ( ( { parameterDefinition} ) => parameterDefinition && ! parameterDefinition . hidden ) ?? [ ]
129+
130+ const requiredParameters = indexedParameters . filter ( ( { parameterDefinition} ) => ! parameterDefinition ! . optional )
131+ const optionalParameters = indexedParameters . filter ( ( { parameterDefinition} ) => parameterDefinition ! . optional )
132+
133+ const renderParameter = ( parameterDefinition : NonNullable < typeof indexedParameters [ number ] [ 'parameterDefinition' ] > , index : number ) => {
134+ const title = parameterDefinition ?. names ?. [ 0 ] ?. content ?? FALLBACK_FUNCTION_PARAMETER_NAME
135+ const description = parameterDefinition ?. descriptions ?. [ 0 ] ?. content ?? FALLBACK_FUNCTION_PARAMETER_DESCRIPTION
136+
137+ const schema = ( flowNode ?. data ?. schema as NodeSchema [ ] ) ?. [ index ]
138+
139+ return < div key = { parameterDefinition . id } >
140+ < DataTypeInputComponent data-qa-selector = { "flow-builder-parameter" }
141+ title = { title }
142+ schema = { schema }
143+ description = { description }
144+ clearable
145+ onChange = { ( ) => {
146+ changedParameter . current . add ( parameterDefinition . id ! )
147+ validate ( )
148+ } }
149+ { ...inputs . getInputProps ( parameterDefinition . id ! ) }
150+ />
151+ < Spacing spacing = { "xl" } />
152+ </ div >
153+ }
154+
155+ return < >
156+ { requiredParameters . map ( ( { parameterDefinition, index} ) => renderParameter ( parameterDefinition ! , index ) ) }
157+ { optionalParameters . length > 0 && (
158+ < Collapsible . Root >
159+ < Collapsible . Trigger asChild >
160+ < Flex justify = { "space-between" } align = { "center" } style = { { gap : "0.7rem" } } >
161+ < Text size = { "md" } > Optional parameters</ Text >
162+ < Button variant = { "none" } color = { "primary" } paddingSize = { "xxs" } >
163+ < IconChevronDown size = { 16 } />
164+ </ Button >
165+ </ Flex >
166+ </ Collapsible . Trigger >
167+ < Spacing spacing = { "md" } />
168+ < Collapsible . Content >
169+ { optionalParameters . map ( ( { parameterDefinition, index} ) => renderParameter ( parameterDefinition ! , index ) ) }
170+ </ Collapsible . Content >
171+ </ Collapsible . Root >
172+ ) }
173+ </ >
174+ } ) ( ) }
148175 </ >
149176}
0 commit comments