Fix initial code step functionInput (#18002)

At code step creation

## before
<img width="623" height="816" alt="image"
src="https://github.com/user-attachments/assets/0aed5ed8-8d56-4988-9d31-fe80942191bb"
/>

## after
<img width="627" height="528" alt="image"
src="https://github.com/user-attachments/assets/9e2a5cb9-7480-4734-8e41-25b45edcec07"
/>
This commit is contained in:
martmull
2026-02-17 16:45:00 +01:00
committed by GitHub
parent b4e924b671
commit e3fcff00b0
42 changed files with 105 additions and 98 deletions
@@ -37,7 +37,7 @@ import { CODE_ACTION } from '@/workflow/workflow-steps/workflow-actions/constant
import { type Monaco } from '@monaco-editor/react';
import { type editor } from 'monaco-editor';
import { AutoTypings } from 'monaco-editor-auto-typings';
import { useEffect, useState } from 'react';
import { useState } from 'react';
import { useRecoilState } from 'recoil';
import { Key } from 'ts-key-enum';
import { isDefined } from 'twenty-shared/utils';
@@ -49,7 +49,7 @@ import { IconCode, IconPlayerPlay } from 'twenty-ui/display';
import { CodeEditor } from 'twenty-ui/input';
import { useIsMobile } from 'twenty-ui/utilities';
import { useDebouncedCallback } from 'use-debounce';
import { getFunctionInputFromInputSchema } from '@/workflow/workflow-steps/workflow-actions/code-action/utils/getFunctionInputFromInputSchema';
import { getFunctionInputFromInputSchema } from 'twenty-shared/workflow';
const CODE_EDITOR_MIN_HEIGHT = 343;
@@ -290,10 +290,6 @@ export const WorkflowEditActionCode = ({
},
];
useEffect(() => {
setFunctionInput(action.settings.input.logicFunctionInput);
}, [action]);
useHotkeysOnFocusedElement({
keys: [Key.Escape],
callback: () => {
@@ -2,7 +2,7 @@ import { FormNestedFieldInputContainer } from '@/object-record/record-field/ui/f
import { FormTextFieldInput } from '@/object-record/record-field/ui/form-types/components/FormTextFieldInput';
import { type VariablePickerComponent } from '@/object-record/record-field/ui/form-types/types/VariablePickerComponent';
import { InputLabel } from '@/ui/input/components/InputLabel';
import { type FunctionInput } from '@/workflow/workflow-steps/workflow-actions/code-action/types/FunctionInput';
import { type FunctionInput } from 'twenty-shared/workflow';
import styled from '@emotion/styled';
import { t } from '@lingui/core/macro';
import { isObject } from '@sniptt/guards';
@@ -1,5 +0,0 @@
export type FunctionInput =
| {
[name: string]: FunctionInput;
}
| any;
@@ -1,44 +0,0 @@
import { type InputSchema } from '@/workflow/types/InputSchema';
import { getFunctionInputFromInputSchema } from '@/workflow/workflow-steps/workflow-actions/code-action/utils/getFunctionInputFromInputSchema';
describe('getDefaultFunctionInputFromInputSchema', () => {
it('should init function input properly', () => {
const inputSchema = [
{
type: 'object',
properties: {
a: {
type: 'string',
},
b: {
type: 'number',
},
c: {
type: 'array',
items: { type: 'string' },
},
d: {
type: 'object',
properties: {
da: { type: 'string', enum: ['my', 'enum'] },
db: { type: 'number' },
},
},
e: { type: 'object' },
},
},
] as InputSchema;
const expectedResult = [
{
a: null,
b: null,
c: [],
d: { da: 'my', db: null },
e: {},
},
];
expect(getFunctionInputFromInputSchema(inputSchema)).toEqual(
expectedResult,
);
});
});
@@ -1,28 +0,0 @@
import { type InputSchema } from '@/workflow/types/InputSchema';
import { type FunctionInput } from '@/workflow/workflow-steps/workflow-actions/code-action/types/FunctionInput';
import { isDefined } from 'twenty-shared/utils';
import type { InputJsonSchema } from 'twenty-shared/logic-function';
export const getFunctionInputFromInputSchema = (
inputSchema: InputSchema | InputJsonSchema[],
): FunctionInput => {
return inputSchema.map((param) => {
if (
isDefined(param.type) &&
['string', 'number', 'boolean'].includes(param.type)
) {
return param.enum && param.enum.length > 0 ? param.enum[0] : null;
} else if (param.type === 'object') {
const result: FunctionInput = {};
if (isDefined(param.properties)) {
Object.entries(param.properties).forEach(([key, val]) => {
result[key] = getFunctionInputFromInputSchema([val])[0];
});
}
return result;
} else if (param.type === 'array' && isDefined(param.items)) {
return [];
}
return null;
});
};
@@ -1,4 +1,4 @@
import { type FunctionInput } from '@/workflow/workflow-steps/workflow-actions/code-action/types/FunctionInput';
import { type FunctionInput } from 'twenty-shared/workflow';
import { isObject } from '@sniptt/guards';
export const mergeDefaultFunctionInputAndFunctionInput = ({
@@ -1,5 +1,7 @@
import { type InputSchemaPropertyType } from '@/workflow/types/InputSchema';
import { type BaseOutputSchemaV2 } from 'twenty-shared/workflow';
import {
type InputSchemaPropertyType,
type BaseOutputSchemaV2,
} from 'twenty-shared/workflow';
const getValueType = (value: unknown): InputSchemaPropertyType => {
if (value === null || value === undefined) {
@@ -1,4 +1,4 @@
import { getFunctionInputFromInputSchema } from '@/workflow/workflow-steps/workflow-actions/code-action/utils/getFunctionInputFromInputSchema';
import { getFunctionInputFromInputSchema } from 'twenty-shared/workflow';
import { mergeDefaultFunctionInputAndFunctionInput } from '@/workflow/workflow-steps/workflow-actions/code-action/utils/mergeDefaultFunctionInputAndFunctionInput';
import { useGetOneLogicFunction } from '@/logic-functions/hooks/useGetOneLogicFunction';
import { type WorkflowLogicFunctionAction } from '@/workflow/types/Workflow';