panel.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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 OutputVars, { VarItem } from '../_base/components/output-vars'
  6. import OptionCard from '../_base/components/option-card'
  7. import Split from '../_base/components/split'
  8. import useConfig from './use-config'
  9. import SubVariablePicker from './components/sub-variable-picker'
  10. import { type ListFilterNodeType, OrderBy } from './types'
  11. import LimitConfig from './components/limit-config'
  12. import FilterCondition from './components/filter-condition'
  13. import Field from '@/app/components/workflow/nodes/_base/components/field'
  14. import { type NodePanelProps } from '@/app/components/workflow/types'
  15. import Switch from '@/app/components/base/switch'
  16. const i18nPrefix = 'workflow.nodes.listFilter'
  17. const Panel: FC<NodePanelProps<ListFilterNodeType>> = ({
  18. id,
  19. data,
  20. }) => {
  21. const { t } = useTranslation()
  22. const {
  23. readOnly,
  24. inputs,
  25. itemVarType,
  26. itemVarTypeShowName,
  27. hasSubVariable,
  28. handleVarChanges,
  29. filterVar,
  30. handleFilterEnabledChange,
  31. handleFilterChange,
  32. handleLimitChange,
  33. handleOrderByEnabledChange,
  34. handleOrderByKeyChange,
  35. handleOrderByTypeChange,
  36. } = useConfig(id, data)
  37. return (
  38. <div className='mt-2'>
  39. <div className='px-4 pb-4 space-y-4'>
  40. <Field
  41. title={t(`${i18nPrefix}.inputVar`)}
  42. >
  43. <VarReferencePicker
  44. readonly={readOnly}
  45. nodeId={id}
  46. isShowNodeName
  47. value={inputs.variable || []}
  48. onChange={handleVarChanges}
  49. filterVar={filterVar}
  50. typePlaceHolder='Array'
  51. />
  52. </Field>
  53. <Field
  54. title={t(`${i18nPrefix}.filterCondition`)}
  55. operations={
  56. <Switch
  57. defaultValue={inputs.filter_by?.enabled}
  58. onChange={handleFilterEnabledChange}
  59. size='md'
  60. disabled={readOnly}
  61. />
  62. }
  63. >
  64. {inputs.filter_by?.enabled
  65. ? (
  66. <FilterCondition
  67. condition={inputs.filter_by.conditions[0]}
  68. onChange={handleFilterChange}
  69. varType={itemVarType}
  70. hasSubVariable={hasSubVariable}
  71. readOnly={readOnly}
  72. />
  73. )
  74. : null}
  75. </Field>
  76. <Split />
  77. <Field
  78. title={t(`${i18nPrefix}.orderBy`)}
  79. operations={
  80. <Switch
  81. defaultValue={inputs.order_by?.enabled}
  82. onChange={handleOrderByEnabledChange}
  83. size='md'
  84. disabled={readOnly}
  85. />
  86. }
  87. >
  88. {inputs.order_by?.enabled
  89. ? (
  90. <div className='flex items-center justify-between'>
  91. {hasSubVariable && (
  92. <div className='grow mr-2'>
  93. <SubVariablePicker
  94. value={inputs.order_by.key as string}
  95. onChange={handleOrderByKeyChange}
  96. />
  97. </div>
  98. )}
  99. <div className={!hasSubVariable ? 'w-full grid grid-cols-2 gap-1' : 'shrink-0 flex space-x-1'}>
  100. <OptionCard
  101. title={t(`${i18nPrefix}.asc`)}
  102. onSelect={handleOrderByTypeChange(OrderBy.ASC)}
  103. selected={inputs.order_by.value === OrderBy.ASC}
  104. />
  105. <OptionCard
  106. title={t(`${i18nPrefix}.desc`)}
  107. onSelect={handleOrderByTypeChange(OrderBy.DESC)}
  108. selected={inputs.order_by.value === OrderBy.DESC}
  109. />
  110. </div>
  111. </div>
  112. )
  113. : null}
  114. </Field>
  115. <Split />
  116. <LimitConfig
  117. config={inputs.limit}
  118. onChange={handleLimitChange}
  119. readonly={readOnly}
  120. />
  121. </div>
  122. <Split />
  123. <div className='px-4 pt-4 pb-2'>
  124. <OutputVars>
  125. <>
  126. <VarItem
  127. name='result'
  128. type={`Array[${itemVarTypeShowName}]`}
  129. description={t(`${i18nPrefix}.outputVars.result`)}
  130. />
  131. <VarItem
  132. name='first_record'
  133. type={itemVarTypeShowName}
  134. description={t(`${i18nPrefix}.outputVars.first_record`)}
  135. />
  136. <VarItem
  137. name='last_record'
  138. type={itemVarTypeShowName}
  139. description={t(`${i18nPrefix}.outputVars.last_record`)}
  140. />
  141. </>
  142. </OutputVars>
  143. </div>
  144. </div>
  145. )
  146. }
  147. export default React.memo(Panel)