| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | import type { FC } from 'react'import React from 'react'import { useTranslation } from 'react-i18next'import {  RiQuestionLine,} from '@remixicon/react'import { CodeLanguage } from '../code/types'import useConfig from './use-config'import type { TemplateTransformNodeType } from './types'import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'import AddButton from '@/app/components/base/button/add-button'import Field from '@/app/components/workflow/nodes/_base/components/field'import Split from '@/app/components/workflow/nodes/_base/components/split'import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars'import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'import type { NodePanelProps } from '@/app/components/workflow/types'import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'import ResultPanel from '@/app/components/workflow/run/result-panel'const i18nPrefix = 'workflow.nodes.templateTransform'const Panel: FC<NodePanelProps<TemplateTransformNodeType>> = ({  id,  data,}) => {  const { t } = useTranslation()  const {    readOnly,    inputs,    availableVars,    handleVarListChange,    handleVarNameChange,    handleAddVariable,    handleAddEmptyVariable,    handleCodeChange,    filterVar,    // single run    isShowSingleRun,    hideSingleRun,    runningStatus,    handleRun,    handleStop,    varInputs,    inputVarValues,    setInputVarValues,    runResult,  } = useConfig(id, data)  return (    <div className='mt-2'>      <div className='px-4 pb-4 space-y-4'>        <Field          title={t(`${i18nPrefix}.inputVars`)}          operations={            !readOnly ? <AddButton onClick={handleAddEmptyVariable} /> : undefined          }        >          <VarList            nodeId={id}            readonly={readOnly}            list={inputs.variables}            onChange={handleVarListChange}            onVarNameChange={handleVarNameChange}            filterVar={filterVar}          />        </Field>        <Split />        <CodeEditor          availableVars={availableVars}          varList={inputs.variables}          onAddVar={handleAddVariable}          isInNode          readOnly={readOnly}          language={CodeLanguage.python3}          title={            <div className='uppercase'>{t(`${i18nPrefix}.code`)}</div>          }          headerRight={            <div className='flex items-center'>              <a                className='flex items-center space-x-0.5 h-[18px] text-xs font-normal text-gray-500'                href="https://jinja.palletsprojects.com/en/3.1.x/templates/"                target='_blank'>                <span>{t(`${i18nPrefix}.codeSupportTip`)}</span>                <RiQuestionLine className='w-3 h-3' />              </a>              <div className='mx-1.5 w-px h-3 bg-gray-200'></div>            </div>          }          value={inputs.template}          onChange={handleCodeChange}        />      </div>      <Split />      <div className='px-4 pt-4 pb-2'>        <OutputVars>          <>            <VarItem              name='output'              type='string'              description={t(`${i18nPrefix}.outputVars.output`)}            />          </>        </OutputVars>      </div>      {isShowSingleRun && (        <BeforeRunForm          nodeName={inputs.title}          onHide={hideSingleRun}          forms={[            {              inputs: varInputs,              values: inputVarValues,              onChange: setInputVarValues,            },          ]}          runningStatus={runningStatus}          onRun={handleRun}          onStop={handleStop}          result={<ResultPanel {...runResult} showSteps={false} />}        />      )}    </div>  )}export default React.memo(Panel)
 |