您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

group.tsx 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import { useState } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import {
  4. RiArrowRightSLine,
  5. RiDeleteBinLine,
  6. RiFileList3Line,
  7. RiLoader2Line,
  8. // RiErrorWarningFill,
  9. } from '@remixicon/react'
  10. // import Button from '@/app/components/base/button'
  11. import ActionButton from '@/app/components/base/action-button'
  12. import Tooltip from '@/app/components/base/tooltip'
  13. import BlockIcon from '@/app/components/workflow/block-icon'
  14. import {
  15. BubbleX,
  16. Env,
  17. } from '@/app/components/base/icons/src/vender/line/others'
  18. import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
  19. import type { currentVarType } from './panel'
  20. import { VarInInspectType } from '@/types/workflow'
  21. import type { NodeWithVar, VarInInspect } from '@/types/workflow'
  22. import cn from '@/utils/classnames'
  23. import { useToolIcon } from '../hooks'
  24. type Props = {
  25. nodeData?: NodeWithVar
  26. currentVar?: currentVarType
  27. varType: VarInInspectType
  28. varList: VarInInspect[]
  29. handleSelect: (state: any) => void
  30. handleView?: () => void
  31. handleClear?: () => void
  32. }
  33. const Group = ({
  34. nodeData,
  35. currentVar,
  36. varType,
  37. varList,
  38. handleSelect,
  39. handleView,
  40. handleClear,
  41. }: Props) => {
  42. const { t } = useTranslation()
  43. const [isCollapsed, setIsCollapsed] = useState(false)
  44. const toolIcon = useToolIcon(nodeData?.nodePayload as any)
  45. const isEnv = varType === VarInInspectType.environment
  46. const isChatVar = varType === VarInInspectType.conversation
  47. const isSystem = varType === VarInInspectType.system
  48. const visibleVarList = isEnv ? varList : varList.filter(v => v.visible)
  49. const handleSelectVar = (varItem: any, type?: string) => {
  50. if (type === VarInInspectType.environment) {
  51. handleSelect({
  52. nodeId: VarInInspectType.environment,
  53. title: VarInInspectType.environment,
  54. nodeType: VarInInspectType.environment,
  55. var: {
  56. ...varItem,
  57. type: VarInInspectType.environment,
  58. ...(varItem.value_type === 'secret' ? { value: '******************' } : {}),
  59. },
  60. })
  61. return
  62. }
  63. if (type === VarInInspectType.conversation) {
  64. handleSelect({
  65. nodeId: VarInInspectType.conversation,
  66. nodeType: VarInInspectType.conversation,
  67. title: VarInInspectType.conversation,
  68. var: {
  69. ...varItem,
  70. type: VarInInspectType.conversation,
  71. },
  72. })
  73. return
  74. }
  75. if (type === VarInInspectType.system) {
  76. handleSelect({
  77. nodeId: VarInInspectType.system,
  78. nodeType: VarInInspectType.system,
  79. title: VarInInspectType.system,
  80. var: {
  81. ...varItem,
  82. type: VarInInspectType.system,
  83. },
  84. })
  85. return
  86. }
  87. if (!nodeData) return
  88. handleSelect({
  89. nodeId: nodeData.nodeId,
  90. nodeType: nodeData.nodeType,
  91. title: nodeData.title,
  92. var: varItem,
  93. })
  94. }
  95. return (
  96. <div className='p-0.5'>
  97. {/* node item */}
  98. <div className='group flex h-6 items-center gap-0.5'>
  99. <div className='h-3 w-3 shrink-0'>
  100. {nodeData?.isSingRunRunning && (
  101. <RiLoader2Line className='h-3 w-3 animate-spin text-text-accent' />
  102. )}
  103. {(!nodeData || !nodeData.isSingRunRunning) && visibleVarList.length > 0 && (
  104. <RiArrowRightSLine className={cn('h-3 w-3 text-text-tertiary', !isCollapsed && 'rotate-90')} onClick={() => setIsCollapsed(!isCollapsed)} />
  105. )}
  106. </div>
  107. <div className='flex grow cursor-pointer items-center gap-1' onClick={() => setIsCollapsed(!isCollapsed)}>
  108. {nodeData && (
  109. <>
  110. <BlockIcon
  111. className='shrink-0'
  112. type={nodeData.nodeType}
  113. toolIcon={toolIcon || ''}
  114. size='xs'
  115. />
  116. <div className='system-xs-medium-uppercase truncate text-text-tertiary'>{nodeData.title}</div>
  117. </>
  118. )}
  119. {!nodeData && (
  120. <div className='system-xs-medium-uppercase truncate text-text-tertiary'>
  121. {isEnv && t('workflow.debug.variableInspect.envNode')}
  122. {isChatVar && t('workflow.debug.variableInspect.chatNode')}
  123. {isSystem && t('workflow.debug.variableInspect.systemNode')}
  124. </div>
  125. )}
  126. </div>
  127. {nodeData && !nodeData.isSingRunRunning && (
  128. <div className='hidden shrink-0 items-center group-hover:flex'>
  129. <Tooltip popupContent={t('workflow.debug.variableInspect.view')}>
  130. <ActionButton onClick={handleView}>
  131. <RiFileList3Line className='h-4 w-4' />
  132. </ActionButton>
  133. </Tooltip>
  134. <Tooltip popupContent={t('workflow.debug.variableInspect.clearNode')}>
  135. <ActionButton onClick={handleClear}>
  136. <RiDeleteBinLine className='h-4 w-4' />
  137. </ActionButton>
  138. </Tooltip>
  139. </div>
  140. )}
  141. </div>
  142. {/* var item list */}
  143. {!isCollapsed && !nodeData?.isSingRunRunning && (
  144. <div className='px-0.5'>
  145. {visibleVarList.length > 0 && visibleVarList.map(varItem => (
  146. <div
  147. key={varItem.id}
  148. className={cn(
  149. 'relative flex cursor-pointer items-center gap-1 rounded-md px-3 py-1 hover:bg-state-base-hover',
  150. varItem.id === currentVar?.var?.id && 'bg-state-base-hover-alt hover:bg-state-base-hover-alt',
  151. )}
  152. onClick={() => handleSelectVar(varItem, varType)}
  153. >
  154. {isEnv && <Env className='h-4 w-4 shrink-0 text-util-colors-violet-violet-600' />}
  155. {isChatVar && <BubbleX className='h-4 w-4 shrink-0 text-util-colors-teal-teal-700' />}
  156. {(isSystem || nodeData) && <Variable02 className={cn('h-4 w-4 shrink-0 text-text-accent', ['error_type', 'error_message'].includes(varItem.name) && 'text-text-warning')} />}
  157. <div className='system-sm-medium grow truncate text-text-secondary'>{varItem.name}</div>
  158. <div className='system-xs-regular shrink-0 text-text-tertiary'>{varItem.value_type}</div>
  159. </div>
  160. ))}
  161. </div>
  162. )}
  163. </div>
  164. )
  165. }
  166. export default Group