| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | 
							- import type { FC } from 'react'
 
- import {
 
-   memo,
 
-   useState,
 
- } from 'react'
 
- import { useTranslation } from 'react-i18next'
 
- import { ReactSortable } from 'react-sortablejs'
 
- import {
 
-   RiAddLine,
 
-   RiDeleteBinLine,
 
-   RiDraggable,
 
- } from '@remixicon/react'
 
- import useConfig from './use-config'
 
- import ConditionAdd from './components/condition-add'
 
- import ConditionList from './components/condition-list'
 
- import type { IfElseNodeType } from './types'
 
- import Button from '@/app/components/base/button'
 
- import type { NodePanelProps } from '@/app/components/workflow/types'
 
- import Field from '@/app/components/workflow/nodes/_base/components/field'
 
- import { useGetAvailableVars } from '@/app/components/workflow/nodes/variable-assigner/hooks'
 
- import cn from '@/utils/classnames'
 
- const i18nPrefix = 'workflow.nodes.ifElse'
 
- const Panel: FC<NodePanelProps<IfElseNodeType>> = ({
 
-   id,
 
-   data,
 
- }) => {
 
-   const { t } = useTranslation()
 
-   const getAvailableVars = useGetAvailableVars()
 
-   const {
 
-     readOnly,
 
-     inputs,
 
-     filterVar,
 
-     filterNumberVar,
 
-     handleAddCase,
 
-     handleRemoveCase,
 
-     handleSortCase,
 
-     handleAddCondition,
 
-     handleUpdateCondition,
 
-     handleRemoveCondition,
 
-     handleUpdateConditionLogicalOperator,
 
-     nodesOutputVars,
 
-     availableNodes,
 
-   } = useConfig(id, data)
 
-   const [willDeleteCaseId, setWillDeleteCaseId] = useState('')
 
-   const cases = inputs.cases || []
 
-   const casesLength = cases.length
 
-   return (
 
-     <div className='p-1'>
 
-       <ReactSortable
 
-         list={cases.map(caseItem => ({ ...caseItem, id: caseItem.case_id }))}
 
-         setList={handleSortCase}
 
-         handle='.handle'
 
-         ghostClass='bg-components-panel-bg'
 
-         animation={150}
 
-       >
 
-         {
 
-           cases.map((item, index) => (
 
-             <div key={item.case_id}>
 
-               <div
 
-                 className={cn(
 
-                   'group relative py-1 px-3 min-h-[40px] rounded-[10px] bg-components-panel-bg',
 
-                   willDeleteCaseId === item.case_id && 'bg-state-destructive-hover',
 
-                 )}
 
-               >
 
-                 <RiDraggable className={cn(
 
-                   'hidden handle absolute top-2 left-1 w-3 h-3 text-text-quaternary cursor-pointer',
 
-                   casesLength > 1 && 'group-hover:block',
 
-                 )} />
 
-                 <div className={cn(
 
-                   'absolute left-4 leading-4 text-[13px] font-semibold text-text-secondary',
 
-                   casesLength === 1 ? 'top-2.5' : 'top-1',
 
-                 )}>
 
-                   {
 
-                     index === 0 ? 'IF' : 'ELIF'
 
-                   }
 
-                   {
 
-                     casesLength > 1 && (
 
-                       <div className='text-[10px] text-text-tertiary font-medium'>CASE {index + 1}</div>
 
-                     )
 
-                   }
 
-                 </div>
 
-                 {
 
-                   !!item.conditions.length && (
 
-                     <div className='mb-2'>
 
-                       <ConditionList
 
-                         disabled={readOnly}
 
-                         caseItem={item}
 
-                         onUpdateCondition={handleUpdateCondition}
 
-                         onRemoveCondition={handleRemoveCondition}
 
-                         onUpdateConditionLogicalOperator={handleUpdateConditionLogicalOperator}
 
-                         nodesOutputVars={nodesOutputVars}
 
-                         availableNodes={availableNodes}
 
-                         numberVariables={getAvailableVars(id, '', filterNumberVar)}
 
-                       />
 
-                     </div>
 
-                   )
 
-                 }
 
-                 <div className={cn(
 
-                   'flex items-center justify-between pl-[60px] pr-[30px]',
 
-                   !item.conditions.length && 'mt-1',
 
-                 )}>
 
-                   <ConditionAdd
 
-                     disabled={readOnly}
 
-                     caseId={item.case_id}
 
-                     variables={getAvailableVars(id, '', filterVar)}
 
-                     onSelectVariable={handleAddCondition}
 
-                   />
 
-                   {
 
-                     ((index === 0 && casesLength > 1) || (index > 0)) && (
 
-                       <Button
 
-                         className='hover:text-components-button-destructive-ghost-text hover:bg-components-button-destructive-ghost-bg-hover'
 
-                         size='small'
 
-                         variant='ghost'
 
-                         disabled={readOnly}
 
-                         onClick={() => handleRemoveCase(item.case_id)}
 
-                         onMouseEnter={() => setWillDeleteCaseId(item.case_id)}
 
-                         onMouseLeave={() => setWillDeleteCaseId('')}
 
-                       >
 
-                         <RiDeleteBinLine className='mr-1 w-3.5 h-3.5' />
 
-                         {t('common.operation.remove')}
 
-                       </Button>
 
-                     )
 
-                   }
 
-                 </div>
 
-               </div>
 
-               <div className='my-2 mx-3 h-[1px] bg-divider-subtle'></div>
 
-             </div>
 
-           ))
 
-         }
 
-       </ReactSortable>
 
-       <div className='px-4 py-2'>
 
-         <Button
 
-           className='w-full'
 
-           variant='tertiary'
 
-           onClick={() => handleAddCase()}
 
-           disabled={readOnly}
 
-         >
 
-           <RiAddLine className='mr-1 w-4 h-4' />
 
-           ELIF
 
-         </Button>
 
-       </div>
 
-       <div className='my-2 mx-3 h-[1px] bg-divider-subtle'></div>
 
-       <Field
 
-         title={t(`${i18nPrefix}.else`)}
 
-         className='px-4 py-2'
 
-       >
 
-         <div className='leading-[18px] text-xs font-normal text-text-tertiary'>{t(`${i18nPrefix}.elseDescription`)}</div>
 
-       </Field>
 
-     </div>
 
-   )
 
- }
 
- export default memo(Panel)
 
 
  |