Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import type { FC } from 'react'
  2. import React from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import VarReferencePicker from '../_base/components/variable/var-reference-picker'
  5. import Split from '../_base/components/split'
  6. import { MIN_ITERATION_PARALLEL_NUM } from '../../constants'
  7. import type { IterationNodeType } from './types'
  8. import useConfig from './use-config'
  9. import { ErrorHandleMode, type NodePanelProps } from '@/app/components/workflow/types'
  10. import Field from '@/app/components/workflow/nodes/_base/components/field'
  11. import Switch from '@/app/components/base/switch'
  12. import Select from '@/app/components/base/select'
  13. import Slider from '@/app/components/base/slider'
  14. import Input from '@/app/components/base/input'
  15. import { MAX_PARALLEL_LIMIT } from '@/config'
  16. const i18nPrefix = 'workflow.nodes.iteration'
  17. const Panel: FC<NodePanelProps<IterationNodeType>> = ({
  18. id,
  19. data,
  20. }) => {
  21. const { t } = useTranslation()
  22. const responseMethod = [
  23. {
  24. value: ErrorHandleMode.Terminated,
  25. name: t(`${i18nPrefix}.ErrorMethod.operationTerminated`),
  26. },
  27. {
  28. value: ErrorHandleMode.ContinueOnError,
  29. name: t(`${i18nPrefix}.ErrorMethod.continueOnError`),
  30. },
  31. {
  32. value: ErrorHandleMode.RemoveAbnormalOutput,
  33. name: t(`${i18nPrefix}.ErrorMethod.removeAbnormalOutput`),
  34. },
  35. ]
  36. const {
  37. readOnly,
  38. inputs,
  39. filterInputVar,
  40. handleInputChange,
  41. childrenNodeVars,
  42. iterationChildrenNodes,
  43. handleOutputVarChange,
  44. changeParallel,
  45. changeErrorResponseMode,
  46. changeParallelNums,
  47. } = useConfig(id, data)
  48. return (
  49. <div className='pb-2 pt-2'>
  50. <div className='space-y-4 px-4 pb-4'>
  51. <Field
  52. title={t(`${i18nPrefix}.input`)}
  53. required
  54. operations={(
  55. <div className='system-2xs-medium-uppercase flex h-[18px] items-center rounded-[5px] border border-divider-deep px-1 capitalize text-text-tertiary'>Array</div>
  56. )}
  57. >
  58. <VarReferencePicker
  59. readonly={readOnly}
  60. nodeId={id}
  61. isShowNodeName
  62. value={inputs.iterator_selector || []}
  63. onChange={handleInputChange}
  64. filterVar={filterInputVar}
  65. />
  66. </Field>
  67. </div>
  68. <Split />
  69. <div className='mt-2 space-y-4 px-4 pb-4'>
  70. <Field
  71. title={t(`${i18nPrefix}.output`)}
  72. required
  73. operations={(
  74. <div className='system-2xs-medium-uppercase flex h-[18px] items-center rounded-[5px] border border-divider-deep px-1 capitalize text-text-tertiary'>Array</div>
  75. )}
  76. >
  77. <VarReferencePicker
  78. readonly={readOnly}
  79. nodeId={id}
  80. isShowNodeName
  81. value={inputs.output_selector || []}
  82. onChange={handleOutputVarChange}
  83. availableNodes={iterationChildrenNodes}
  84. availableVars={childrenNodeVars}
  85. />
  86. </Field>
  87. </div>
  88. <div className='px-4 pb-2'>
  89. <Field title={t(`${i18nPrefix}.parallelMode`)} tooltip={<div className='w-[230px]'>{t(`${i18nPrefix}.parallelPanelDesc`)}</div>} inline>
  90. <Switch defaultValue={inputs.is_parallel} onChange={changeParallel} />
  91. </Field>
  92. </div>
  93. {
  94. inputs.is_parallel && (<div className='px-4 pb-2'>
  95. <Field title={t(`${i18nPrefix}.MaxParallelismTitle`)} isSubTitle tooltip={<div className='w-[230px]'>{t(`${i18nPrefix}.MaxParallelismDesc`)}</div>}>
  96. <div className='row flex'>
  97. <Input type='number' wrapperClassName='w-18 mr-4 ' max={MAX_PARALLEL_LIMIT} min={MIN_ITERATION_PARALLEL_NUM} value={inputs.parallel_nums} onChange={(e) => { changeParallelNums(Number(e.target.value)) }} />
  98. <Slider
  99. value={inputs.parallel_nums}
  100. onChange={changeParallelNums}
  101. max={MAX_PARALLEL_LIMIT}
  102. min={MIN_ITERATION_PARALLEL_NUM}
  103. className=' mt-4 flex-1 shrink-0'
  104. />
  105. </div>
  106. </Field>
  107. </div>)
  108. }
  109. <Split />
  110. <div className='px-4 py-2'>
  111. <Field title={t(`${i18nPrefix}.errorResponseMethod`)} >
  112. <Select items={responseMethod} defaultValue={inputs.error_handle_mode} onSelect={changeErrorResponseMode} allowSearch={false} />
  113. </Field>
  114. </div>
  115. </div>
  116. )
  117. }
  118. export default React.memo(Panel)