| 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, |
| |
| 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) |
|
|