From a430284aa21e3ae1f0d5654e55b2ad2852519cc2 Mon Sep 17 00:00:00 2001 From: wwf <yearningwang@iqtogether.com> Date: 星期三, 04 六月 2025 15:17:49 +0800 Subject: [PATCH] 初始化 --- app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx | 124 +++++++++++++--------------------------- 1 files changed, 41 insertions(+), 83 deletions(-) diff --git a/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx b/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx index 789da34..cdcea64 100644 --- a/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx +++ b/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx @@ -6,14 +6,13 @@ RiArrowDownSLine, RiCloseLine, RiErrorWarningFill, - RiMoreLine, } from '@remixicon/react' import produce from 'immer' import { useStoreApi } from 'reactflow' import RemoveButton from '../remove-button' import useAvailableVarList from '../../hooks/use-available-var-list' import VarReferencePopup from './var-reference-popup' -import { getNodeInfoById, isConversationVar, isENV, isSystemVar, varTypeToStructType } from './utils' +import { getNodeInfoById, isConversationVar, isENV, isSystemVar } from './utils' import ConstantField from './constant-field' import cn from '@/utils/classnames' import type { Node, NodeOutPutVar, ValueSelector, Var } from '@/app/components/workflow/types' @@ -38,8 +37,6 @@ import Badge from '@/app/components/base/badge' import Tooltip from '@/app/components/base/tooltip' import { isExceptionVariable } from '@/app/components/workflow/utils' -import VarFullPathPanel from './var-full-path-panel' -import { noop } from 'lodash-es' const TRIGGER_DEFAULT_WIDTH = 227 @@ -67,18 +64,15 @@ placeholder?: string minWidth?: number popupFor?: 'assigned' | 'toAssigned' - zIndex?: number } - -const DEFAULT_VALUE_SELECTOR: Props['value'] = [] const VarReferencePicker: FC<Props> = ({ nodeId, readonly, className, isShowNodeName = true, - value = DEFAULT_VALUE_SELECTOR, - onOpen = noop, + value = [], + onOpen = () => { }, onChange, isSupportConstantValue, defaultVarKindType = VarKindType.constant, @@ -96,7 +90,6 @@ placeholder, minWidth, popupFor, - zIndex, }) => { const { t } = useTranslation() const store = useStoreApi() @@ -106,7 +99,7 @@ const isChatMode = useIsChatMode() const { getCurrentVariableType } = useWorkflowVariables() - const { availableVars, availableNodesWithParent: availableNodes } = useAvailableVarList(nodeId, { + const { availableNodes, availableVars } = useAvailableVarList(nodeId, { onlyLeafNodeVar, passedInAvailableNodes, filterVar, @@ -118,9 +111,6 @@ const node = getNodes().find(n => n.id === nodeId) const isInIteration = !!node?.data.isInIteration const iterationNode = isInIteration ? getNodes().find(n => n.id === node.parentId) : null - - const isInLoop = !!node?.data.isInLoop - const loopNode = isInLoop ? getNodes().find(n => n.id === node.parentId) : null const triggerRef = useRef<HTMLDivElement>(null) const [triggerWidth, setTriggerWidth] = useState(TRIGGER_DEFAULT_WIDTH) @@ -150,14 +140,6 @@ return false }, [isInIteration, value, node]) - const isLoopVar = useMemo(() => { - if (!isInLoop) - return false - if (value[0] === node?.parentId && ['item', 'index'].includes(value[1])) - return true - return false - }, [isInLoop, value, node]) - const outputVarNodeId = hasValue ? value[0] : '' const outputVarNode = useMemo(() => { if (!hasValue || isConstant) @@ -166,24 +148,22 @@ if (isIterationVar) return iterationNode?.data - if (isLoopVar) - return loopNode?.data - if (isSystemVar(value as ValueSelector)) return startNode?.data return getNodeInfoById(availableNodes, outputVarNodeId)?.data - }, [value, hasValue, isConstant, isIterationVar, iterationNode, availableNodes, outputVarNodeId, startNode, isLoopVar, loopNode]) - - const isShowAPart = (value as ValueSelector).length > 2 + }, [value, hasValue, isConstant, isIterationVar, iterationNode, availableNodes, outputVarNodeId, startNode]) const varName = useMemo(() => { - if (!hasValue) - return '' + if (hasValue) { + const isSystem = isSystemVar(value as ValueSelector) + let varName = '' + if (Array.isArray(value)) + varName = value.length >= 3 ? (value as ValueSelector).slice(-2).join('.') : value[value.length - 1] - const isSystem = isSystemVar(value as ValueSelector) - const varName = Array.isArray(value) ? value[(value as ValueSelector).length - 1] : '' - return `${isSystem ? 'sys.' : ''}${varName}` + return `${isSystem ? 'sys.' : ''}${varName}` + } + return '' }, [hasValue, value]) const varKindTypes = [ @@ -238,7 +218,7 @@ }, [onChange, varKindType]) const type = getCurrentVariableType({ - parentNode: isInIteration ? iterationNode : loopNode, + parentNode: iterationNode, valueSelector: value as ValueSelector, availableNodes, isChatMode, @@ -271,22 +251,6 @@ const WrapElem = isSupportConstantValue ? 'div' : PortalToFollowElemTrigger const VarPickerWrap = !isSupportConstantValue ? 'div' : PortalToFollowElemTrigger - - const tooltipPopup = useMemo(() => { - if (isValidVar && isShowAPart) { - return ( - <VarFullPathPanel - nodeName={outputVarNode?.title} - path={(value as ValueSelector).slice(1)} - varType={varTypeToStructType(type)} - nodeType={outputVarNode?.type} - />) - } - if (!isValidVar && hasValue) - return t('workflow.errorMsg.invalidVariable') - - return null - }, [isValidVar, isShowAPart, hasValue, t, outputVarNode?.title, outputVarNode?.type, value, type]) return ( <div className={cn(className, !readonly && 'cursor-pointer')}> <PortalToFollowElem @@ -298,27 +262,27 @@ if (readonly) return !isConstant ? setOpen(!open) : setControlFocus(Date.now()) - }} className='group/picker-trigger-wrap relative !flex'> + }} className='!flex group/picker-trigger-wrap relative'> <> {isAddBtnTrigger ? ( <div> - <AddButton onClick={noop}></AddButton> + <AddButton onClick={() => { }}></AddButton> </div> ) - : (<div ref={!isSupportConstantValue ? triggerRef : null} className={cn((open || isFocus) ? 'border-gray-300' : 'border-gray-100', 'group/wrap relative flex h-8 w-full items-center', !isSupportConstantValue && 'rounded-lg bg-components-input-bg-normal p-1', isInTable && 'border-none bg-transparent', readonly && 'bg-components-input-bg-disabled')}> + : (<div ref={!isSupportConstantValue ? triggerRef : null} className={cn((open || isFocus) ? 'border-gray-300' : 'border-gray-100', 'relative group/wrap flex items-center w-full h-8', !isSupportConstantValue && 'p-1 rounded-lg bg-components-input-bg-normal', isInTable && 'bg-transparent border-none', readonly && 'bg-components-input-bg-disabled')}> {isSupportConstantValue ? <div onClick={(e) => { e.stopPropagation() setOpen(false) setControlFocus(Date.now()) - }} className='mr-1 flex h-full items-center space-x-1'> + }} className='h-full mr-1 flex items-center space-x-1'> <TypeSelector noLeft trigger={ - <div className='radius-md flex h-8 items-center bg-components-input-bg-normal px-2'> - <div className='system-sm-regular mr-1 text-components-input-text-filled'>{varKindTypes.find(item => item.value === varKindType)?.label}</div> - <RiArrowDownSLine className='h-4 w-4 text-text-quaternary' /> + <div className='flex items-center h-8 px-2 radius-md bg-components-input-bg-normal'> + <div className='mr-1 system-sm-regular text-components-input-text-filled'>{varKindTypes.find(item => item.value === varKindType)?.label}</div> + <RiArrowDownSLine className='w-4 h-4 text-text-quaternary' /> </div> } popupClassName='top-8' @@ -330,7 +294,7 @@ /> </div> : (!hasValue && <div className='ml-1.5 mr-1'> - <Variable02 className={`h-4 w-4 ${readonly ? 'text-components-input-text-disabled' : 'text-components-input-text-placeholder'}`} /> + <Variable02 className={`w-4 h-4 ${readonly ? 'text-components-input-text-disabled' : 'text-components-input-text-placeholder'}`} /> </div>)} {isConstant ? ( @@ -348,49 +312,43 @@ return !isConstant ? setOpen(!open) : setControlFocus(Date.now()) }} - className='h-full grow' + className='grow h-full' > - <div ref={isSupportConstantValue ? triggerRef : null} className={cn('h-full', isSupportConstantValue && 'flex items-center rounded-lg bg-components-panel-bg py-1 pl-1')}> - <Tooltip noDecoration={isShowAPart} popupContent={tooltipPopup}> - <div className={cn('h-full items-center rounded-[5px] px-1.5', hasValue ? 'inline-flex bg-components-badge-white-to-dark' : 'flex')}> + <div ref={isSupportConstantValue ? triggerRef : null} className={cn('h-full', isSupportConstantValue && 'flex items-center pl-1 py-1 rounded-lg bg-gray-100')}> + <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')}> {hasValue ? ( <> {isShowNodeName && !isEnv && !isChatVar && ( <div className='flex items-center'> - <div className='h-3 px-[1px]'> + <div className='px-[1px] h-3'> {outputVarNode?.type && <VarBlockIcon - className='!text-text-primary' + className='!text-gray-900' type={outputVarNode.type} />} </div> - <div className='mx-0.5 truncate text-xs font-medium text-text-secondary' title={outputVarNode?.title} style={{ + <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> )} - {isShowAPart && ( - <div className='flex items-center'> - <RiMoreLine className='h-3 w-3 text-text-secondary' /> - <Line3 className='mr-0.5 text-divider-deep'></Line3> - </div> - )} - <div className='flex items-center text-text-accent'> - {!hasValue && <Variable02 className='h-3.5 w-3.5' />} - {isEnv && <Env className='h-3.5 w-3.5 text-util-colors-violet-violet-600' />} - {isChatVar && <BubbleX className='h-3.5 w-3.5 text-util-colors-teal-teal-700' />} - <div className={cn('ml-0.5 truncate text-xs font-medium', isEnv && '!text-text-secondary', isChatVar && 'text-util-colors-teal-teal-700', isException && 'text-text-warning')} title={varName} style={{ + <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 && '!text-text-secondary', isChatVar && 'text-util-colors-teal-teal-700', isException && 'text-text-warning')} title={varName} style={{ maxWidth: maxVarNameWidth, }}>{varName}</div> </div> - <div className='system-xs-regular ml-0.5 truncate text-center capitalize text-text-tertiary' title={type} style={{ + <div className='ml-0.5 capitalize truncate text-text-tertiary text-center system-xs-regular' title={type} style={{ maxWidth: maxTypeWidth, }}>{type}</div> - {!isValidVar && <RiErrorWarningFill className='ml-0.5 h-3 w-3 text-text-destructive' />} + {!isValidVar && <RiErrorWarningFill className='ml-0.5 w-3 h-3 text-[#D92D20]' />} </> ) - : <div className={`overflow-hidden ${readonly ? 'text-components-input-text-disabled' : 'text-components-input-text-placeholder'} system-sm-regular text-ellipsis`}>{placeholder ?? t('workflow.common.setVarValuePlaceholder')}</div>} + : <div className={`overflow-hidden ${readonly ? 'text-components-input-text-disabled' : 'text-components-input-text-placeholder'} text-ellipsis system-sm-regular`}>{placeholder ?? t('workflow.common.setVarValuePlaceholder')}</div>} </div> </Tooltip> </div> @@ -398,10 +356,10 @@ </VarPickerWrap> )} {(hasValue && !readonly && !isInTable) && (<div - className='group invisible absolute right-1 top-[50%] h-5 translate-y-[-50%] cursor-pointer rounded-md p-1 hover:bg-state-base-hover group-hover/wrap:visible' + className='invisible group-hover/wrap:visible absolute h-5 right-1 top-[50%] translate-y-[-50%] group p-1 rounded-md hover:bg-black/5 cursor-pointer' onClick={handleClearVar} > - <RiCloseLine className='h-3.5 w-3.5 text-text-tertiary group-hover:text-text-secondary' /> + <RiCloseLine className='w-3.5 h-3.5 text-gray-500 group-hover:text-gray-800' /> </div>)} {!hasValue && valueTypePlaceHolder && ( <Badge @@ -413,7 +371,7 @@ </div>)} {!readonly && isInTable && ( <RemoveButton - className='absolute right-1 top-0.5 hidden group-hover/picker-trigger-wrap:block' + className='group-hover/picker-trigger-wrap:block hidden absolute right-1 top-0.5' onClick={() => onRemove?.()} /> )} @@ -428,7 +386,7 @@ </> </WrapElem> <PortalToFollowElemContent style={{ - zIndex: zIndex || 100, + zIndex: 100, }} className='mt-1'> {!isConstant && ( <VarReferencePopup -- Gitblit v1.8.0