/** * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates * SPDX-License-Identifier: MIT */ import { FormRenderProps, FlowNodeJSON, Field, FormMeta } from '@flowgram.ai/free-layout-editor'; import { SubCanvasRender } from '@flowgram.ai/free-container-plugin'; import { BatchOutputs, BatchVariableSelector, createBatchOutputsFormPlugin, DisplayOutputs, IFlowRefValue, IJsonSchema, provideBatchInputEffect, } from '@flowgram.ai/form-materials'; import { defaultFormMeta } from '../default-form-meta'; import { useIsSidebar, useNodeRenderContext } from '../../hooks'; import { FormHeader, FormContent, FormItem, Feedback } from '../../form-components'; interface LoopNodeJSON extends FlowNodeJSON { data: { loopFor: IFlowRefValue; }; } export const LoopFormRender = ({ form }: FormRenderProps) => { const isSidebar = useIsSidebar(); const { readonly } = useNodeRenderContext(); const formHeight = 85; const loopFor = ( name={`loopFor`}> {({ field, fieldState }) => ( field.onChange({ type: 'ref', content: val })} readonly={readonly} hasError={Object.keys(fieldState?.errors || {}).length > 0} /> )} ); const loopOutputs = ( | undefined> name={`loopOutputs`}> {({ field, fieldState }) => ( field.onChange(val)} readonly={readonly} hasError={Object.keys(fieldState?.errors || {}).length > 0} /> )} ); if (isSidebar) { return ( <> {loopFor} {loopOutputs} ); } return ( <> {loopFor} ); }; export const formMeta: FormMeta = { ...defaultFormMeta, render: LoopFormRender, effect: { loopFor: provideBatchInputEffect, }, plugins: [createBatchOutputsFormPlugin({ outputKey: 'loopOutputs' })], };