|
@@ -5,9 +5,10 @@ import { useTranslation } from 'react-i18next'
|
|
|
import {
|
|
|
RiArrowDownSLine,
|
|
|
RiCloseLine,
|
|
|
+ RiErrorWarningFill,
|
|
|
} from '@remixicon/react'
|
|
|
import produce from 'immer'
|
|
|
-import { useStoreApi } from 'reactflow'
|
|
|
+import { useEdges, useStoreApi } from 'reactflow'
|
|
|
import useAvailableVarList from '../../hooks/use-available-var-list'
|
|
|
import VarReferencePopup from './var-reference-popup'
|
|
|
import { getNodeInfoById, isConversationVar, isENV, isSystemVar } from './utils'
|
|
@@ -33,6 +34,8 @@ import { VarType as VarKindType } from '@/app/components/workflow/nodes/tool/typ
|
|
|
import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector'
|
|
|
import AddButton from '@/app/components/base/button/add-button'
|
|
|
import Badge from '@/app/components/base/badge'
|
|
|
+import Tooltip from '@/app/components/base/tooltip'
|
|
|
+
|
|
|
const TRIGGER_DEFAULT_WIDTH = 227
|
|
|
|
|
|
type Props = {
|
|
@@ -77,6 +80,7 @@ const VarReferencePicker: FC<Props> = ({
|
|
|
const {
|
|
|
getNodes,
|
|
|
} = store.getState()
|
|
|
+ const edges = useEdges()
|
|
|
const isChatMode = useIsChatMode()
|
|
|
|
|
|
const { getCurrentVariableType } = useWorkflowVariables()
|
|
@@ -206,8 +210,16 @@ const VarReferencePicker: FC<Props> = ({
|
|
|
isConstant: !!isConstant,
|
|
|
})
|
|
|
|
|
|
- const isEnv = isENV(value as ValueSelector)
|
|
|
- const isChatVar = isConversationVar(value as ValueSelector)
|
|
|
+ const { isEnv, isChatVar, isValidVar } = useMemo(() => {
|
|
|
+ const isEnv = isENV(value as ValueSelector)
|
|
|
+ const isChatVar = isConversationVar(value as ValueSelector)
|
|
|
+ const isValidVar = Boolean(outputVarNode) || isEnv || isChatVar
|
|
|
+ return {
|
|
|
+ isEnv,
|
|
|
+ isChatVar,
|
|
|
+ isValidVar,
|
|
|
+ }
|
|
|
+ }, [value, edges, outputVarNode])
|
|
|
|
|
|
// 8(left/right-padding) + 14(icon) + 4 + 14 + 2 = 42 + 17 buff
|
|
|
const availableWidth = triggerWidth - 56
|
|
@@ -285,39 +297,44 @@ const VarReferencePicker: FC<Props> = ({
|
|
|
className='grow h-full'
|
|
|
>
|
|
|
<div ref={isSupportConstantValue ? triggerRef : null} className={cn('h-full', isSupportConstantValue && 'flex items-center pl-1 py-1 rounded-lg bg-gray-100')}>
|
|
|
- <div className={cn('h-full items-center px-1.5 rounded-[5px]', hasValue ? 'bg-white inline-flex' : 'flex')}>
|
|
|
- {hasValue
|
|
|
- ? (
|
|
|
- <>
|
|
|
- {isShowNodeName && !isEnv && !isChatVar && (
|
|
|
- <div className='flex items-center'>
|
|
|
- <div className='p-[1px]'>
|
|
|
- <VarBlockIcon
|
|
|
- className='!text-gray-900'
|
|
|
- type={outputVarNode?.type || BlockEnum.Start}
|
|
|
- />
|
|
|
+ <Tooltip popupContent={!isValidVar && hasValue && t('workflow.errorMsg.invalidVariable')}>
|
|
|
+ <div className={cn('h-full items-center px-1.5 rounded-[5px] ', hasValue ? 'bg-white inline-flex' : 'flex',
|
|
|
+ !isValidVar && hasValue && 'border border-red-400 !bg-[#FEF3F2]',
|
|
|
+ )}>
|
|
|
+ {hasValue
|
|
|
+ ? (
|
|
|
+ <>
|
|
|
+ {isShowNodeName && !isEnv && !isChatVar && (
|
|
|
+ <div className='flex items-center'>
|
|
|
+ <div className='px-[1px] h-3'>
|
|
|
+ {outputVarNode?.type && <VarBlockIcon
|
|
|
+ className='!text-gray-900'
|
|
|
+ type={outputVarNode.type}
|
|
|
+ />}
|
|
|
+ </div>
|
|
|
+ <div className='mx-0.5 text-xs font-medium text-gray-700 truncate' title={outputVarNode?.title} style={{
|
|
|
+ maxWidth: maxNodeNameWidth,
|
|
|
+ }}>{outputVarNode?.title}</div>
|
|
|
+ <Line3 className='mr-0.5'></Line3>
|
|
|
</div>
|
|
|
- <div className='mx-0.5 text-xs font-medium text-gray-700 truncate' title={outputVarNode?.title} style={{
|
|
|
- maxWidth: maxNodeNameWidth,
|
|
|
- }}>{outputVarNode?.title}</div>
|
|
|
- <Line3 className='mr-0.5'></Line3>
|
|
|
+ )}
|
|
|
+ <div className='flex items-center text-primary-600'>
|
|
|
+ {!hasValue && <Variable02 className='w-3.5 h-3.5' />}
|
|
|
+ {isEnv && <Env className='w-3.5 h-3.5 text-util-colors-violet-violet-600' />}
|
|
|
+ {isChatVar && <BubbleX className='w-3.5 h-3.5 text-util-colors-teal-teal-700' />}
|
|
|
+ <div className={cn('ml-0.5 text-xs font-medium truncate', (isEnv || isChatVar) && '!text-text-secondary')} title={varName} style={{
|
|
|
+ maxWidth: maxVarNameWidth,
|
|
|
+ }}>{varName}</div>
|
|
|
</div>
|
|
|
- )}
|
|
|
- <div className='flex items-center text-primary-600'>
|
|
|
- {!hasValue && <Variable02 className='w-3.5 h-3.5' />}
|
|
|
- {isEnv && <Env className='w-3.5 h-3.5 text-util-colors-violet-violet-600' />}
|
|
|
- {isChatVar && <BubbleX className='w-3.5 h-3.5 text-util-colors-teal-teal-700' />}
|
|
|
- <div className={cn('ml-0.5 text-xs font-medium truncate', (isEnv || isChatVar) && '!text-text-secondary')} title={varName} style={{
|
|
|
- maxWidth: maxVarNameWidth,
|
|
|
- }}>{varName}</div>
|
|
|
- </div>
|
|
|
- <div className='ml-0.5 text-xs font-normal text-gray-500 capitalize truncate' title={type} style={{
|
|
|
- maxWidth: maxTypeWidth,
|
|
|
- }}>{type}</div>
|
|
|
- </>
|
|
|
- )
|
|
|
- : <div className='text-[13px] font-normal text-gray-400'>{t('workflow.common.setVarValuePlaceholder')}</div>}
|
|
|
- </div>
|
|
|
+ <div className='ml-0.5 text-xs font-normal text-gray-500 capitalize truncate' title={type} style={{
|
|
|
+ maxWidth: maxTypeWidth,
|
|
|
+ }}>{type}</div>
|
|
|
+ {!isValidVar && <RiErrorWarningFill className='ml-0.5 w-3 h-3 text-[#D92D20]' /> }
|
|
|
+ </>
|
|
|
+ )
|
|
|
+ : <div className='text-[13px] font-normal text-gray-400'>{t('workflow.common.setVarValuePlaceholder')}</div>}
|
|
|
+ </div>
|
|
|
+ </Tooltip>
|
|
|
</div>
|
|
|
|
|
|
</VarPickerWrap>
|