You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

use-single-run-form-params.ts 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. import type { NodeTracing } from '@/types/workflow'
  2. import { useCallback, useMemo } from 'react'
  3. import formatTracing from '@/app/components/workflow/run/utils/format-log'
  4. import { useTranslation } from 'react-i18next'
  5. import { useIsNodeInLoop, useWorkflow } from '../../hooks'
  6. import { getNodeInfoById, getNodeUsedVarPassToServerKey, getNodeUsedVars, isSystemVar } from '../_base/components/variable/utils'
  7. import type { InputVar, ValueSelector, Variable } from '../../types'
  8. import type { CaseItem, Condition, LoopNodeType } from './types'
  9. import { ValueType } from '@/app/components/workflow/types'
  10. import { VALUE_SELECTOR_DELIMITER as DELIMITER } from '@/config'
  11. type Params = {
  12. id: string
  13. payload: LoopNodeType
  14. runInputData: Record<string, any>
  15. runResult: NodeTracing
  16. loopRunResult: NodeTracing[]
  17. setRunInputData: (data: Record<string, any>) => void
  18. toVarInputs: (variables: Variable[]) => InputVar[]
  19. varSelectorsToVarInputs: (variables: ValueSelector[]) => InputVar[]
  20. }
  21. const useSingleRunFormParams = ({
  22. id,
  23. payload,
  24. runInputData,
  25. runResult,
  26. loopRunResult,
  27. setRunInputData,
  28. toVarInputs,
  29. varSelectorsToVarInputs,
  30. }: Params) => {
  31. const { t } = useTranslation()
  32. const { isNodeInLoop } = useIsNodeInLoop(id)
  33. const { getLoopNodeChildren, getBeforeNodesInSameBranch } = useWorkflow()
  34. const loopChildrenNodes = getLoopNodeChildren(id)
  35. const beforeNodes = getBeforeNodesInSameBranch(id)
  36. const canChooseVarNodes = [...beforeNodes, ...loopChildrenNodes]
  37. const { usedOutVars, allVarObject } = (() => {
  38. const vars: ValueSelector[] = []
  39. const varObjs: Record<string, boolean> = {}
  40. const allVarObject: Record<string, {
  41. inSingleRunPassedKey: string
  42. }> = {}
  43. loopChildrenNodes.forEach((node) => {
  44. const nodeVars = getNodeUsedVars(node).filter(item => item && item.length > 0)
  45. nodeVars.forEach((varSelector) => {
  46. if (varSelector[0] === id) { // skip loop node itself variable: item, index
  47. return
  48. }
  49. const isInLoop = isNodeInLoop(varSelector[0])
  50. if (isInLoop) // not pass loop inner variable
  51. return
  52. const varSectorStr = varSelector.join('.')
  53. if (!varObjs[varSectorStr]) {
  54. varObjs[varSectorStr] = true
  55. vars.push(varSelector)
  56. }
  57. let passToServerKeys = getNodeUsedVarPassToServerKey(node, varSelector)
  58. if (typeof passToServerKeys === 'string')
  59. passToServerKeys = [passToServerKeys]
  60. passToServerKeys.forEach((key: string, index: number) => {
  61. allVarObject[[varSectorStr, node.id, index].join(DELIMITER)] = {
  62. inSingleRunPassedKey: key,
  63. }
  64. })
  65. })
  66. })
  67. const res = toVarInputs(vars.map((item) => {
  68. const varInfo = getNodeInfoById(canChooseVarNodes, item[0])
  69. return {
  70. label: {
  71. nodeType: varInfo?.data.type,
  72. nodeName: varInfo?.data.title || canChooseVarNodes[0]?.data.title, // default start node title
  73. variable: isSystemVar(item) ? item.join('.') : item[item.length - 1],
  74. },
  75. variable: `${item.join('.')}`,
  76. value_selector: item,
  77. }
  78. }))
  79. return {
  80. usedOutVars: res,
  81. allVarObject,
  82. }
  83. })()
  84. const nodeInfo = useMemo(() => {
  85. const formattedNodeInfo = formatTracing(loopRunResult, t)[0]
  86. if (runResult && formattedNodeInfo) {
  87. return {
  88. ...formattedNodeInfo,
  89. execution_metadata: {
  90. ...runResult.execution_metadata,
  91. ...formattedNodeInfo.execution_metadata,
  92. },
  93. }
  94. }
  95. return formattedNodeInfo
  96. }, [runResult, loopRunResult, t])
  97. const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
  98. setRunInputData(newPayload)
  99. }, [setRunInputData])
  100. const inputVarValues = (() => {
  101. const vars: Record<string, any> = {}
  102. Object.keys(runInputData)
  103. .forEach((key) => {
  104. vars[key] = runInputData[key]
  105. })
  106. return vars
  107. })()
  108. const getVarSelectorsFromCase = (caseItem: CaseItem): ValueSelector[] => {
  109. const vars: ValueSelector[] = []
  110. if (caseItem.conditions && caseItem.conditions.length) {
  111. caseItem.conditions.forEach((condition) => {
  112. // eslint-disable-next-line ts/no-use-before-define
  113. const conditionVars = getVarSelectorsFromCondition(condition)
  114. vars.push(...conditionVars)
  115. })
  116. }
  117. return vars
  118. }
  119. const getVarSelectorsFromCondition = (condition: Condition) => {
  120. const vars: ValueSelector[] = []
  121. if (condition.variable_selector)
  122. vars.push(condition.variable_selector)
  123. if (condition.sub_variable_condition && condition.sub_variable_condition.conditions?.length)
  124. vars.push(...getVarSelectorsFromCase(condition.sub_variable_condition))
  125. return vars
  126. }
  127. const forms = (() => {
  128. const allInputs: ValueSelector[] = []
  129. payload.break_conditions?.forEach((condition) => {
  130. const vars = getVarSelectorsFromCondition(condition)
  131. allInputs.push(...vars)
  132. })
  133. payload.loop_variables?.forEach((loopVariable) => {
  134. if(loopVariable.value_type === ValueType.variable)
  135. allInputs.push(loopVariable.value)
  136. })
  137. const inputVarsFromValue: InputVar[] = []
  138. const varInputs = [...varSelectorsToVarInputs(allInputs), ...inputVarsFromValue]
  139. const existVarsKey: Record<string, boolean> = {}
  140. const uniqueVarInputs: InputVar[] = []
  141. varInputs.forEach((input) => {
  142. if(!input)
  143. return
  144. if (!existVarsKey[input.variable]) {
  145. existVarsKey[input.variable] = true
  146. uniqueVarInputs.push(input)
  147. }
  148. })
  149. return [
  150. {
  151. inputs: [...usedOutVars, ...uniqueVarInputs],
  152. values: inputVarValues,
  153. onChange: setInputVarValues,
  154. },
  155. ]
  156. })()
  157. const getVarFromCaseItem = (caseItem: CaseItem): ValueSelector[] => {
  158. const vars: ValueSelector[] = []
  159. if (caseItem.conditions && caseItem.conditions.length) {
  160. caseItem.conditions.forEach((condition) => {
  161. // eslint-disable-next-line ts/no-use-before-define
  162. const conditionVars = getVarFromCondition(condition)
  163. vars.push(...conditionVars)
  164. })
  165. }
  166. return vars
  167. }
  168. const getVarFromCondition = (condition: Condition): ValueSelector[] => {
  169. const vars: ValueSelector[] = []
  170. if (condition.variable_selector)
  171. vars.push(condition.variable_selector)
  172. if(condition.sub_variable_condition && condition.sub_variable_condition.conditions?.length)
  173. vars.push(...getVarFromCaseItem(condition.sub_variable_condition))
  174. return vars
  175. }
  176. const getDependentVars = () => {
  177. const vars: ValueSelector[] = usedOutVars.map(item => item.variable.split('.'))
  178. payload.break_conditions?.forEach((condition) => {
  179. const conditionVars = getVarFromCondition(condition)
  180. vars.push(...conditionVars)
  181. })
  182. payload.loop_variables?.forEach((loopVariable) => {
  183. if(loopVariable.value_type === ValueType.variable)
  184. vars.push(loopVariable.value)
  185. })
  186. const hasFilterLoopVars = vars.filter(item => item[0] !== id)
  187. return hasFilterLoopVars
  188. }
  189. return {
  190. forms,
  191. nodeInfo,
  192. allVarObject,
  193. getDependentVars,
  194. }
  195. }
  196. export default useSingleRunFormParams