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

panel.tsx 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import type { FC } from 'react'
  2. import React from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import { RiAddLine } from '@remixicon/react'
  5. import Split from '../_base/components/split'
  6. import InputNumberWithSlider from '../_base/components/input-number-with-slider'
  7. import type { LoopNodeType } from './types'
  8. import useConfig from './use-config'
  9. import ConditionWrap from './components/condition-wrap'
  10. import LoopVariable from './components/loop-variables'
  11. import type { NodePanelProps } from '@/app/components/workflow/types'
  12. import Field from '@/app/components/workflow/nodes/_base/components/field'
  13. import { LOOP_NODE_MAX_COUNT } from '@/config'
  14. const i18nPrefix = 'workflow.nodes.loop'
  15. const Panel: FC<NodePanelProps<LoopNodeType>> = ({
  16. id,
  17. data,
  18. }) => {
  19. const { t } = useTranslation()
  20. const {
  21. readOnly,
  22. inputs,
  23. childrenNodeVars,
  24. loopChildrenNodes,
  25. handleAddCondition,
  26. handleUpdateCondition,
  27. handleRemoveCondition,
  28. handleToggleConditionLogicalOperator,
  29. handleAddSubVariableCondition,
  30. handleRemoveSubVariableCondition,
  31. handleUpdateSubVariableCondition,
  32. handleToggleSubVariableConditionLogicalOperator,
  33. handleUpdateLoopCount,
  34. handleAddLoopVariable,
  35. handleRemoveLoopVariable,
  36. handleUpdateLoopVariable,
  37. } = useConfig(id, data)
  38. return (
  39. <div className='mt-2'>
  40. <div>
  41. <Field
  42. title={<div className='pl-3'>{t('workflow.nodes.loop.loopVariables')}</div>}
  43. operations={
  44. <div
  45. className='mr-4 flex h-5 w-5 cursor-pointer items-center justify-center'
  46. onClick={handleAddLoopVariable}
  47. >
  48. <RiAddLine className='h-4 w-4 text-text-tertiary' />
  49. </div>
  50. }
  51. >
  52. <div className='px-4'>
  53. <LoopVariable
  54. variables={inputs.loop_variables}
  55. nodeId={id}
  56. handleRemoveLoopVariable={handleRemoveLoopVariable}
  57. handleUpdateLoopVariable={handleUpdateLoopVariable}
  58. />
  59. </div>
  60. </Field>
  61. <Split className='my-2' />
  62. <Field
  63. title={<div className='pl-3'>{t(`${i18nPrefix}.breakCondition`)}</div>}
  64. tooltip={t(`${i18nPrefix}.breakConditionTip`)}
  65. >
  66. <ConditionWrap
  67. nodeId={id}
  68. readOnly={readOnly}
  69. handleAddCondition={handleAddCondition}
  70. handleRemoveCondition={handleRemoveCondition}
  71. handleUpdateCondition={handleUpdateCondition}
  72. handleToggleConditionLogicalOperator={handleToggleConditionLogicalOperator}
  73. handleAddSubVariableCondition={handleAddSubVariableCondition}
  74. handleRemoveSubVariableCondition={handleRemoveSubVariableCondition}
  75. handleUpdateSubVariableCondition={handleUpdateSubVariableCondition}
  76. handleToggleSubVariableConditionLogicalOperator={handleToggleSubVariableConditionLogicalOperator}
  77. availableNodes={loopChildrenNodes}
  78. availableVars={childrenNodeVars}
  79. conditions={inputs.break_conditions || []}
  80. logicalOperator={inputs.logical_operator!}
  81. />
  82. </Field>
  83. <Split className='mt-2' />
  84. <div className='mt-2'>
  85. <Field
  86. title={<div className='pl-3'>{t(`${i18nPrefix}.loopMaxCount`)}</div>}
  87. >
  88. <div className='px-3 py-2'>
  89. <InputNumberWithSlider
  90. min={1}
  91. max={LOOP_NODE_MAX_COUNT}
  92. value={inputs.loop_count}
  93. onChange={(val) => {
  94. const roundedVal = Math.round(val)
  95. handleUpdateLoopCount(Number.isNaN(roundedVal) ? 1 : roundedVal)
  96. }}
  97. />
  98. </div>
  99. </Field>
  100. </div>
  101. </div>
  102. {/* Error handling for the Loop node is currently not considered. */}
  103. {/* <div className='px-4 py-2'>
  104. <Field title={t(`${i18nPrefix}.errorResponseMethod`)} >
  105. <Select items={responseMethod} defaultValue={inputs.error_handle_mode} onSelect={changeErrorResponseMode} allowSearch={false}>
  106. </Select>
  107. </Field>
  108. </div> */}
  109. </div>
  110. )
  111. }
  112. export default React.memo(Panel)