diff --git a/libs/data-mapper-v2/src/components/functionConfigurationMenu/inputTab/InputList.tsx b/libs/data-mapper-v2/src/components/functionConfigurationMenu/inputTab/InputList.tsx index 205a3f83d72..6837ee9b11b 100644 --- a/libs/data-mapper-v2/src/components/functionConfigurationMenu/inputTab/InputList.tsx +++ b/libs/data-mapper-v2/src/components/functionConfigurationMenu/inputTab/InputList.tsx @@ -22,6 +22,7 @@ export type CommonProps = { connections: ConnectionDictionary; schemaType: SchemaType; draggable: boolean; + updateListItems: (index: number, item?: TemplateItemProps) => void; }; export type TemplateItemProps = { input: InputConnection; index: number }; @@ -52,24 +53,26 @@ export const InputList = (props: InputListProps) => { commonProps, dragHandleProps, } = props; - const { functionKey, data, inputsFromManifest, connections, schemaType } = commonProps; + const { functionKey, data, inputsFromManifest, connections, schemaType, updateListItems } = commonProps; const inputName = useMemo(() => getInputName(input, connections), [connections, input]); const inputValue = useMemo(() => getInputValue(input), [input]); const inputType = useMemo(() => getInputTypeFromNode(input), [input]); const removeUnboundedInput = useCallback(() => { const targetNodeReactFlowKey = functionKey; + updateListItems(index); dispatch( deleteConnectionFromFunctionMenu({ targetId: targetNodeReactFlowKey, inputIndex: index, }) ); - }, [dispatch, functionKey, index]); + }, [dispatch, functionKey, index, updateListItems]); const updateInput = useCallback( (newValue: InputConnection) => { const targetNodeReactFlowKey = functionKey; + updateListItems(index, { input: newValue, index }); dispatch( setConnectionInput({ targetNode: data, @@ -79,7 +82,7 @@ export const InputList = (props: InputListProps) => { }) ); }, - [data, dispatch, functionKey, index] + [data, dispatch, functionKey, index, updateListItems] ); const validateAndCreateConnection = useCallback( diff --git a/libs/data-mapper-v2/src/components/functionConfigurationMenu/inputTab/inputTab.tsx b/libs/data-mapper-v2/src/components/functionConfigurationMenu/inputTab/inputTab.tsx index 26ac3ab9144..eb1e1982184 100644 --- a/libs/data-mapper-v2/src/components/functionConfigurationMenu/inputTab/inputTab.tsx +++ b/libs/data-mapper-v2/src/components/functionConfigurationMenu/inputTab/inputTab.tsx @@ -18,6 +18,7 @@ import { isSchemaNodeExtended } from '../../../utils'; import { connectionDoesExist, createCustomInputConnection, + createNewEmptyConnection, isNodeConnection, newConnectionWillHaveCircularLogic, } from '../../../utils/Connection.Utils'; @@ -34,29 +35,6 @@ export const InputTabContents = (props: { functionKey: string; }) => { const intl = useIntl(); - const { func, functionKey } = props; - const containerRef = useRef(null); - const styles = useStyles(); - const dispatch = useDispatch(); - const connectionDictionary = useSelector((state: RootState) => state.dataMap.present.curDataMapOperation.dataMapConnections); - const sourceSchemaDictionary = useSelector((state: RootState) => state.dataMap.present.curDataMapOperation.flattenedSourceSchema); - const functionNodeDictionary = useSelector((state: RootState) => state.dataMap.present.curDataMapOperation.functionNodes); - - const connections = useSelector((state: RootState) => state.dataMap.present.curDataMapOperation.dataMapConnections); - - const inputsFromManifest = useMemo(() => func.inputs, [func.inputs]); - const functionConnection = useMemo(() => connections[functionKey], [connections, functionKey]); - - const [listItems, setListItems] = useState( - Object.entries(functionConnection.inputs).map( - (input, index) => - ({ - input: input[1], - index, - }) as TemplateItemProps - ) - ); - const resources = useMemo( () => ({ ACCEPTED_TYPES: intl.formatMessage({ @@ -83,7 +61,31 @@ export const InputTabContents = (props: { [intl] ); + const { func, functionKey } = props; + const containerRef = useRef(null); + const styles = useStyles(); + const dispatch = useDispatch(); + const connectionDictionary = useSelector((state: RootState) => state.dataMap.present.curDataMapOperation.dataMapConnections); + const sourceSchemaDictionary = useSelector((state: RootState) => state.dataMap.present.curDataMapOperation.flattenedSourceSchema); + const functionNodeDictionary = useSelector((state: RootState) => state.dataMap.present.curDataMapOperation.functionNodes); + + const connections = useSelector((state: RootState) => state.dataMap.present.curDataMapOperation.dataMapConnections); + + const inputsFromManifest = useMemo(() => func.inputs, [func.inputs]); + const functionConnection = useMemo(() => connections[functionKey], [connections, functionKey]); + + const [listItems, setListItems] = useState( + Object.entries(functionConnection.inputs).map( + (input, index) => + ({ + input: input[1], + index, + }) as TemplateItemProps + ) + ); + const addUnboundedInputSlot = useCallback(() => { + setListItems((prev) => [...prev, { input: createNewEmptyConnection(), index: prev.length }]); dispatch(createInputSlotForUnboundedInput(functionKey)); }, [dispatch, functionKey]); @@ -101,6 +103,23 @@ export const InputTabContents = (props: { [dispatch, functionKey] ); + const update = useCallback( + (index: number, item?: TemplateItemProps) => { + if (item) { + if (listItems.length >= index) { + const updatedList = [...listItems]; + updatedList[index] = item; + setListItems(updatedList); + } else { + setListItems([...listItems, { input: item.input, index: listItems.length }]); + } + } else { + setListItems((prev) => prev.filter((item) => item.index !== index)); + } + }, + [listItems, setListItems] + ); + return (
{func.maxNumberOfInputs !== UnboundedInput ? ( @@ -225,6 +244,7 @@ export const InputTabContents = (props: { connections: connections, schemaType: SchemaType.Source, draggable: true, + updateListItems: update, }} onMoveEnd={onDragMoveEnd} itemKey={'index'} diff --git a/libs/data-mapper-v2/src/utils/Function.Utils.ts b/libs/data-mapper-v2/src/utils/Function.Utils.ts index 67fca89b908..bc4ef4c71e0 100644 --- a/libs/data-mapper-v2/src/utils/Function.Utils.ts +++ b/libs/data-mapper-v2/src/utils/Function.Utils.ts @@ -225,7 +225,7 @@ export const functionDropDownItemText = (key: string, node: FunctionData, connec } if (isCustomValueConnection(input)) { - return input; + return input.value; } if (input.node && isFunctionData(input.node)) {