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