|
import type { FC } from 'react' |
|
import React from 'react' |
|
import { useTranslation } from 'react-i18next' |
|
import Split from '../_base/components/split' |
|
import type { ToolNodeType } from './types' |
|
import useConfig from './use-config' |
|
import InputVarList from './components/input-var-list' |
|
import Button from '@/app/components/base/button' |
|
import Field from '@/app/components/workflow/nodes/_base/components/field' |
|
import type { NodePanelProps } from '@/app/components/workflow/types' |
|
import Form from '@/app/components/header/account-setting/model-provider-page/model-modal/Form' |
|
import ConfigCredential from '@/app/components/tools/setting/build-in/config-credentials' |
|
import Loading from '@/app/components/base/loading' |
|
import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form' |
|
import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' |
|
import ResultPanel from '@/app/components/workflow/run/result-panel' |
|
|
|
const i18nPrefix = 'workflow.nodes.tool' |
|
|
|
const Panel: FC<NodePanelProps<ToolNodeType>> = ({ |
|
id, |
|
data, |
|
}) => { |
|
const { t } = useTranslation() |
|
|
|
const { |
|
readOnly, |
|
inputs, |
|
toolInputVarSchema, |
|
setInputVar, |
|
handleOnVarOpen, |
|
filterVar, |
|
toolSettingSchema, |
|
toolSettingValue, |
|
setToolSettingValue, |
|
currCollection, |
|
isShowAuthBtn, |
|
showSetAuth, |
|
showSetAuthModal, |
|
hideSetAuthModal, |
|
handleSaveAuth, |
|
isLoading, |
|
isShowSingleRun, |
|
hideSingleRun, |
|
singleRunForms, |
|
runningStatus, |
|
handleRun, |
|
handleStop, |
|
runResult, |
|
} = useConfig(id, data) |
|
|
|
if (isLoading) { |
|
return <div className='flex h-[200px] items-center justify-center'> |
|
<Loading /> |
|
</div> |
|
} |
|
|
|
return ( |
|
<div className='mt-2'> |
|
{!readOnly && isShowAuthBtn && ( |
|
<> |
|
<div className='px-4 pb-3'> |
|
<Button |
|
variant='primary' |
|
className='w-full' |
|
onClick={showSetAuthModal} |
|
> |
|
{t(`${i18nPrefix}.toAuthorize`)} |
|
</Button> |
|
</div> |
|
</> |
|
)} |
|
{!isShowAuthBtn && <> |
|
<div className='px-4 pb-4 space-y-4'> |
|
{toolInputVarSchema.length > 0 && ( |
|
<Field |
|
title={t(`${i18nPrefix}.inputVars`)} |
|
> |
|
<InputVarList |
|
readOnly={readOnly} |
|
nodeId={id} |
|
schema={toolInputVarSchema as any} |
|
value={inputs.tool_parameters} |
|
onChange={setInputVar} |
|
filterVar={filterVar} |
|
isSupportConstantValue |
|
onOpen={handleOnVarOpen} |
|
/> |
|
</Field> |
|
)} |
|
|
|
{toolInputVarSchema.length > 0 && toolSettingSchema.length > 0 && ( |
|
<Split /> |
|
)} |
|
|
|
<Form |
|
className='space-y-4' |
|
itemClassName='!py-0' |
|
fieldLabelClassName='!text-[13px] !font-semibold !text-gray-700 uppercase' |
|
value={toolSettingValue} |
|
onChange={setToolSettingValue} |
|
formSchemas={toolSettingSchema as any} |
|
isEditMode={false} |
|
showOnVariableMap={{}} |
|
validating={false} |
|
inputClassName='!bg-gray-50' |
|
readonly={readOnly} |
|
/> |
|
</div> |
|
</>} |
|
|
|
{showSetAuth && ( |
|
<ConfigCredential |
|
collection={currCollection!} |
|
onCancel={hideSetAuthModal} |
|
onSaved={handleSaveAuth} |
|
isHideRemoveBtn |
|
/> |
|
)} |
|
|
|
<div className='px-4 pt-4 pb-2'> |
|
<OutputVars> |
|
<> |
|
<VarItem |
|
name='text' |
|
type='String' |
|
description={t(`${i18nPrefix}.outputVars.text`)} |
|
/> |
|
<VarItem |
|
name='files' |
|
type='Array[File]' |
|
description={t(`${i18nPrefix}.outputVars.files.title`)} |
|
/> |
|
<VarItem |
|
name='json' |
|
type='Array[Object]' |
|
description={t(`${i18nPrefix}.outputVars.json`)} |
|
/> |
|
</> |
|
</OutputVars> |
|
</div> |
|
|
|
{isShowSingleRun && ( |
|
<BeforeRunForm |
|
nodeName={inputs.title} |
|
onHide={hideSingleRun} |
|
forms={singleRunForms} |
|
runningStatus={runningStatus} |
|
onRun={handleRun} |
|
onStop={handleStop} |
|
result={<ResultPanel {...runResult} showSteps={false} />} |
|
/> |
|
)} |
|
</div> |
|
) |
|
} |
|
|
|
export default React.memo(Panel) |
|
|