mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-03 20:33:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			141 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import type { FC } from 'react'
 | 
						|
import React from 'react'
 | 
						|
import { useTranslation } from 'react-i18next'
 | 
						|
import {
 | 
						|
  RiArrowRightSLine,
 | 
						|
} from '@remixicon/react'
 | 
						|
import VarReferencePicker from '../_base/components/variable/var-reference-picker'
 | 
						|
import Split from '../_base/components/split'
 | 
						|
import ResultPanel from '../../run/result-panel'
 | 
						|
import IterationResultPanel from '../../run/iteration-result-panel'
 | 
						|
import type { IterationNodeType } from './types'
 | 
						|
import useConfig from './use-config'
 | 
						|
import { InputVarType, type NodePanelProps } from '@/app/components/workflow/types'
 | 
						|
import Field from '@/app/components/workflow/nodes/_base/components/field'
 | 
						|
import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
 | 
						|
 | 
						|
const i18nPrefix = 'workflow.nodes.iteration'
 | 
						|
 | 
						|
const Panel: FC<NodePanelProps<IterationNodeType>> = ({
 | 
						|
  id,
 | 
						|
  data,
 | 
						|
}) => {
 | 
						|
  const { t } = useTranslation()
 | 
						|
 | 
						|
  const {
 | 
						|
    readOnly,
 | 
						|
    inputs,
 | 
						|
    filterInputVar,
 | 
						|
    handleInputChange,
 | 
						|
    childrenNodeVars,
 | 
						|
    iterationChildrenNodes,
 | 
						|
    handleOutputVarChange,
 | 
						|
    isShowSingleRun,
 | 
						|
    hideSingleRun,
 | 
						|
    isShowIterationDetail,
 | 
						|
    backToSingleRun,
 | 
						|
    showIterationDetail,
 | 
						|
    hideIterationDetail,
 | 
						|
    runningStatus,
 | 
						|
    handleRun,
 | 
						|
    handleStop,
 | 
						|
    runResult,
 | 
						|
    inputVarValues,
 | 
						|
    setInputVarValues,
 | 
						|
    usedOutVars,
 | 
						|
    iterator,
 | 
						|
    setIterator,
 | 
						|
    iteratorInputKey,
 | 
						|
    iterationRunResult,
 | 
						|
  } = useConfig(id, data)
 | 
						|
 | 
						|
  return (
 | 
						|
    <div className='mt-2'>
 | 
						|
      <div className='px-4 pb-4 space-y-4'>
 | 
						|
        <Field
 | 
						|
          title={t(`${i18nPrefix}.input`)}
 | 
						|
          operations={(
 | 
						|
            <div className='flex items-center h-[18px] px-1 border border-black/8 rounded-[5px] text-xs font-medium text-gray-500 capitalize'>Array</div>
 | 
						|
          )}
 | 
						|
        >
 | 
						|
          <VarReferencePicker
 | 
						|
            readonly={readOnly}
 | 
						|
            nodeId={id}
 | 
						|
            isShowNodeName
 | 
						|
            value={inputs.iterator_selector || []}
 | 
						|
            onChange={handleInputChange}
 | 
						|
            filterVar={filterInputVar}
 | 
						|
          />
 | 
						|
        </Field>
 | 
						|
      </div>
 | 
						|
      <Split />
 | 
						|
      <div className='mt-2 px-4 pb-4 space-y-4'>
 | 
						|
        <Field
 | 
						|
          title={t(`${i18nPrefix}.output`)}
 | 
						|
          operations={(
 | 
						|
            <div className='flex items-center h-[18px] px-1 border border-black/8 rounded-[5px] text-xs font-medium text-gray-500 capitalize'>Array</div>
 | 
						|
          )}
 | 
						|
        >
 | 
						|
          <VarReferencePicker
 | 
						|
            readonly={readOnly}
 | 
						|
            nodeId={id}
 | 
						|
            isShowNodeName
 | 
						|
            value={inputs.output_selector || []}
 | 
						|
            onChange={handleOutputVarChange}
 | 
						|
            availableNodes={iterationChildrenNodes}
 | 
						|
            availableVars={childrenNodeVars}
 | 
						|
          />
 | 
						|
        </Field>
 | 
						|
      </div>
 | 
						|
      {isShowSingleRun && (
 | 
						|
        <BeforeRunForm
 | 
						|
          nodeName={inputs.title}
 | 
						|
          onHide={hideSingleRun}
 | 
						|
          forms={[
 | 
						|
            {
 | 
						|
              inputs: [...usedOutVars],
 | 
						|
              values: inputVarValues,
 | 
						|
              onChange: setInputVarValues,
 | 
						|
            },
 | 
						|
            {
 | 
						|
              label: t(`${i18nPrefix}.input`)!,
 | 
						|
              inputs: [{
 | 
						|
                label: '',
 | 
						|
                variable: iteratorInputKey,
 | 
						|
                type: InputVarType.iterator,
 | 
						|
                required: false,
 | 
						|
              }],
 | 
						|
              values: { [iteratorInputKey]: iterator },
 | 
						|
              onChange: keyValue => setIterator((keyValue as any)[iteratorInputKey]),
 | 
						|
            },
 | 
						|
          ]}
 | 
						|
          runningStatus={runningStatus}
 | 
						|
          onRun={handleRun}
 | 
						|
          onStop={handleStop}
 | 
						|
          result={
 | 
						|
            <div className='mt-3'>
 | 
						|
              <div className='px-4'>
 | 
						|
                <div className='flex items-center h-[34px] justify-between px-3 bg-gray-100 border-[0.5px] border-gray-200 rounded-lg cursor-pointer' onClick={showIterationDetail}>
 | 
						|
                  <div className='leading-[18px] text-[13px] font-medium text-gray-700'>{t(`${i18nPrefix}.iteration`, { count: iterationRunResult.length })}</div>
 | 
						|
                  <RiArrowRightSLine className='w-3.5 h-3.5 text-gray-500' />
 | 
						|
                </div>
 | 
						|
                <Split className='mt-3' />
 | 
						|
              </div>
 | 
						|
              <ResultPanel {...runResult} showSteps={false} />
 | 
						|
            </div>
 | 
						|
          }
 | 
						|
        />
 | 
						|
      )}
 | 
						|
      {isShowIterationDetail && (
 | 
						|
        <IterationResultPanel
 | 
						|
          onBack={backToSingleRun}
 | 
						|
          onHide={hideIterationDetail}
 | 
						|
          list={iterationRunResult}
 | 
						|
        />
 | 
						|
      )}
 | 
						|
    </div>
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
export default React.memo(Panel)
 |