panel.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import type { FC } from 'react'
  2. import React from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import RemoveEffectVarConfirm from '../_base/components/remove-effect-var-confirm'
  5. import useConfig from './use-config'
  6. import type { CodeNodeType } from './types'
  7. import { CodeLanguage } from './types'
  8. import Dependencies from './dependency'
  9. import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
  10. import OutputVarList from '@/app/components/workflow/nodes/_base/components/variable/output-var-list'
  11. import AddButton from '@/app/components/base/button/add-button'
  12. import Field from '@/app/components/workflow/nodes/_base/components/field'
  13. import Split from '@/app/components/workflow/nodes/_base/components/split'
  14. import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
  15. import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector'
  16. import type { NodePanelProps } from '@/app/components/workflow/types'
  17. import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form'
  18. import ResultPanel from '@/app/components/workflow/run/result-panel'
  19. const i18nPrefix = 'workflow.nodes.code'
  20. const codeLanguages = [
  21. {
  22. label: 'Python3',
  23. value: CodeLanguage.python3,
  24. },
  25. {
  26. label: 'JavaScript',
  27. value: CodeLanguage.javascript,
  28. },
  29. ]
  30. const Panel: FC<NodePanelProps<CodeNodeType>> = ({
  31. id,
  32. data,
  33. }) => {
  34. const { t } = useTranslation()
  35. const {
  36. readOnly,
  37. inputs,
  38. outputKeyOrders,
  39. handleVarListChange,
  40. handleAddVariable,
  41. handleRemoveVariable,
  42. handleCodeChange,
  43. handleCodeLanguageChange,
  44. handleVarsChange,
  45. handleAddOutputVariable,
  46. filterVar,
  47. isShowRemoveVarConfirm,
  48. hideRemoveVarConfirm,
  49. onRemoveVarConfirm,
  50. // single run
  51. isShowSingleRun,
  52. hideSingleRun,
  53. runningStatus,
  54. handleRun,
  55. handleStop,
  56. runResult,
  57. varInputs,
  58. inputVarValues,
  59. setInputVarValues,
  60. allowDependencies,
  61. availableDependencies,
  62. handleAddDependency,
  63. handleRemoveDependency,
  64. handleChangeDependency,
  65. } = useConfig(id, data)
  66. return (
  67. <div className='mt-2'>
  68. <div className='px-4 pb-4 space-y-4'>
  69. <Field
  70. title={t(`${i18nPrefix}.inputVars`)}
  71. operations={
  72. !readOnly ? <AddButton onClick={handleAddVariable} /> : undefined
  73. }
  74. >
  75. <VarList
  76. readonly={readOnly}
  77. nodeId={id}
  78. list={inputs.variables}
  79. onChange={handleVarListChange}
  80. filterVar={filterVar}
  81. />
  82. </Field>
  83. {
  84. allowDependencies
  85. ? (
  86. <div>
  87. <Split />
  88. <div className='pt-4'>
  89. <Field
  90. title={t(`${i18nPrefix}.advancedDependencies`)}
  91. operations={
  92. <AddButton onClick={() => handleAddDependency({ name: '', version: '' })} />
  93. }
  94. tooltip={t(`${i18nPrefix}.advancedDependenciesTip`)!}
  95. >
  96. <Dependencies
  97. available_dependencies={availableDependencies}
  98. dependencies={inputs.dependencies || []}
  99. handleRemove={index => handleRemoveDependency(index)}
  100. handleChange={(index, dependency) => handleChangeDependency(index, dependency)}
  101. />
  102. </Field>
  103. </div>
  104. </div>
  105. )
  106. : null
  107. }
  108. <Split />
  109. <CodeEditor
  110. isInNode
  111. readOnly={readOnly}
  112. title={
  113. <TypeSelector
  114. options={codeLanguages}
  115. value={inputs.code_language}
  116. onChange={handleCodeLanguageChange}
  117. />
  118. }
  119. language={inputs.code_language}
  120. value={inputs.code}
  121. onChange={handleCodeChange}
  122. />
  123. </div>
  124. <Split />
  125. <div className='px-4 pt-4 pb-2'>
  126. <Field
  127. title={t(`${i18nPrefix}.outputVars`)}
  128. operations={
  129. <AddButton onClick={handleAddOutputVariable} />
  130. }
  131. >
  132. <OutputVarList
  133. readonly={readOnly}
  134. outputs={inputs.outputs}
  135. outputKeyOrders={outputKeyOrders}
  136. onChange={handleVarsChange}
  137. onRemove={handleRemoveVariable}
  138. />
  139. </Field>
  140. </div>
  141. {
  142. isShowSingleRun && (
  143. <BeforeRunForm
  144. nodeName={inputs.title}
  145. onHide={hideSingleRun}
  146. forms={[
  147. {
  148. inputs: varInputs,
  149. values: inputVarValues,
  150. onChange: setInputVarValues,
  151. },
  152. ]}
  153. runningStatus={runningStatus}
  154. onRun={handleRun}
  155. onStop={handleStop}
  156. result={<ResultPanel {...runResult} showSteps={false} />}
  157. />
  158. )
  159. }
  160. <RemoveEffectVarConfirm
  161. isShow={isShowRemoveVarConfirm}
  162. onCancel={hideRemoveVarConfirm}
  163. onConfirm={onRemoveVarConfirm}
  164. />
  165. </div >
  166. )
  167. }
  168. export default React.memo(Panel)