Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
dify
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ai-tech
dify
Commits
91a2e71f
Commit
91a2e71f
authored
Feb 27, 2024
by
Joel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: if comparasion
parent
0fb47fed
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
81 additions
and
12 deletions
+81
-12
selector.tsx
...p/components/workflow/nodes/_base/components/selector.tsx
+1
-1
condition-item.tsx
...ents/workflow/nodes/if-else/components/condition-item.tsx
+68
-2
node.tsx
web/app/components/workflow/nodes/if-else/node.tsx
+2
-9
utils.ts
web/app/components/workflow/nodes/if-else/utils.ts
+10
-0
No files found.
web/app/components/workflow/nodes/_base/components/selector.tsx
View file @
91a2e71f
...
...
@@ -37,7 +37,7 @@ const TypeSelector: FC<Props> = ({
setHide
()
},
ref
)
return
(
<
div
className=
'relative left-[-8px]'
ref=
{
ref
}
>
<
div
className=
{
cn
(
!
trigger
&&
'left-[-8px]'
,
'relative'
)
}
ref=
{
ref
}
>
{
trigger
?
(
<
div
...
...
web/app/components/workflow/nodes/if-else/components/condition-item.tsx
View file @
91a2e71f
...
...
@@ -4,11 +4,13 @@ import React, { useCallback } from 'react'
import
{
useTranslation
}
from
'react-i18next'
import
cn
from
'classnames'
import
VarReferencePicker
from
'../../_base/components/variable/var-reference-picker'
import
{
isComparisonOperatorNeedTranslate
}
from
'../utils'
import
type
{
Condition
}
from
'@/app/components/workflow/nodes/if-else/types'
import
{
LogicalOperator
}
from
'@/app/components/workflow/nodes/if-else/types'
import
{
ComparisonOperator
,
LogicalOperator
}
from
'@/app/components/workflow/nodes/if-else/types'
import
type
{
ValueSelector
}
from
'@/app/components/workflow/types'
import
{
Trash03
}
from
'@/app/components/base/icons/src/vender/line/general'
import
{
RefreshCw05
}
from
'@/app/components/base/icons/src/vender/line/arrows'
import
Selector
from
'@/app/components/workflow/nodes/_base/components/selector'
const
i18nPrefix
=
'workflow.nodes.ifElse'
const
Line
=
(
...
...
@@ -23,6 +25,44 @@ const Line = (
</
svg
>
)
const
getOperators
=
(
type
:
string
)
=>
{
switch
(
type
)
{
case
'string'
:
return
[
ComparisonOperator
.
contains
,
ComparisonOperator
.
notContains
,
ComparisonOperator
.
startWith
,
ComparisonOperator
.
endWith
,
ComparisonOperator
.
is
,
ComparisonOperator
.
isNot
,
ComparisonOperator
.
empty
,
ComparisonOperator
.
notEmpty
,
]
case
'number'
:
return
[
ComparisonOperator
.
equal
,
ComparisonOperator
.
notEqual
,
ComparisonOperator
.
largerThan
,
ComparisonOperator
.
lessThan
,
ComparisonOperator
.
largerThanOrEqual
,
ComparisonOperator
.
lessThanOrEqual
,
ComparisonOperator
.
is
,
ComparisonOperator
.
isNot
,
ComparisonOperator
.
empty
,
ComparisonOperator
.
notEmpty
,
]
case
'array'
:
return
[
ComparisonOperator
.
is
,
ComparisonOperator
.
isNot
,
ComparisonOperator
.
empty
,
ComparisonOperator
.
notEmpty
,
]
default
:
return
[]
}
}
type
ItemProps
=
{
readonly
:
boolean
payload
:
Condition
...
...
@@ -51,6 +91,7 @@ const Item: FC<ItemProps> = ({
...
payload
,
variable_selector
:
value
,
})
// TODO: handle value type change will effect the comparisonOperators
},
[
onChange
,
payload
])
const
handleValueChange
=
useCallback
((
e
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
...
...
@@ -60,6 +101,13 @@ const Item: FC<ItemProps> = ({
})
},
[
onChange
,
payload
])
const
handleComparisonOperatorChange
=
useCallback
((
v
:
ComparisonOperator
)
=>
{
onChange
({
...
payload
,
comparison_operator
:
v
,
})
},
[
onChange
,
payload
])
return
(
<
div
className=
'space-y-2'
>
{
isShowLogicalOperator
&&
(
...
...
@@ -90,12 +138,30 @@ const Item: FC<ItemProps> = ({
onChange=
{
handleVarReferenceChange
}
/>
<
Selector
popupClassName=
'top-[34px]'
trigger=
{
<
div
className=
'shrink-0 whitespace-nowrap flex items-center h-8 justify-between px-2.5 rounded-lg bg-gray-100 capitalize'
>
<
div
className=
'text-[13px] font-normal text-gray-900'
>
{
isComparisonOperatorNeedTranslate
(
payload
.
comparison_operator
)
?
t
(
`${i18nPrefix}.comparisonOperator.${payload.comparison_operator}`
)
:
payload
.
comparison_operator
}
</
div
>
</
div
>
}
readonly=
{
readonly
}
value=
{
payload
.
comparison_operator
}
options=
{
getOperators
(
'string'
).
map
((
o
)
=>
{
return
{
label
:
isComparisonOperatorNeedTranslate
(
o
)
?
t
(
`${i18nPrefix}.comparisonOperator.${o}`
)
:
o
,
value
:
o
,
}
})
}
onChange=
{
handleComparisonOperatorChange
}
/>
<
input
readOnly=
{
readonly
}
value=
{
payload
.
value
}
onChange=
{
handleValueChange
}
placeholder=
{
t
(
`${i18nPrefix}.enterValue`
)
!
}
className=
'w-[144px] h-8 leading-8 px-2.5 rounded-lg border-0 bg-gray-100 text-gray-900 text-[13px] placeholder:text-gray-400 focus:outline-none focus:ring-1 focus:ring-inset focus:ring-gray-200'
className=
'
max-
w-[144px] h-8 leading-8 px-2.5 rounded-lg border-0 bg-gray-100 text-gray-900 text-[13px] placeholder:text-gray-400 focus:outline-none focus:ring-1 focus:ring-inset focus:ring-gray-200'
type=
'text'
/>
...
...
web/app/components/workflow/nodes/if-else/node.tsx
View file @
91a2e71f
...
...
@@ -3,17 +3,10 @@ import { useTranslation } from 'react-i18next'
import
type
{
NodeProps
}
from
'reactflow'
import
{
NodeSourceHandle
}
from
'../_base/components/node-handle'
import
{
mockData
}
from
'./mock'
import
{
ComparisonOperator
}
from
'./types'
import
{
isEmptyRelatedOperator
}
from
'./utils'
import
{
isComparisonOperatorNeedTranslate
,
isEmptyRelatedOperator
}
from
'./utils'
import
{
Variable02
}
from
'@/app/components/base/icons/src/vender/solid/development'
const
i18nPrefix
=
'workflow.nodes.ifElse'
const
notTranslateKey
=
[
ComparisonOperator
.
equal
,
ComparisonOperator
.
notEqual
,
ComparisonOperator
.
largerThan
,
ComparisonOperator
.
largerThanOrEqual
,
ComparisonOperator
.
lessThan
,
ComparisonOperator
.
lessThanOrEqual
,
]
const
IfElseNode
:
FC
<
Pick
<
NodeProps
,
'id'
|
'data'
>>
=
(
props
)
=>
{
const
{
t
}
=
useTranslation
()
const
{
conditions
,
logical_operator
}
=
mockData
...
...
@@ -35,7 +28,7 @@ const IfElseNode: FC<Pick<NodeProps, 'id' | 'data'>> = (props) => {
<
div
className=
'flex items-center h-6 bg-gray-100 rounded-md px-1 space-x-1 text-xs font-normal text-gray-700'
>
<
Variable02
className=
'w-3.5 h-3.5 text-primary-500'
/>
<
span
>
{
condition
.
variable_selector
.
slice
(
-
1
)[
0
]
}
</
span
>
<
span
className=
'text-gray-500'
>
{
notTranslateKey
.
includes
(
condition
.
comparison_operator
)
?
condition
.
comparison_operator
:
t
(
`${i18nPrefix}.comparisonOperator.${condition.comparison_operator}`
)
}
</
span
>
<
span
className=
'text-gray-500'
>
{
isComparisonOperatorNeedTranslate
(
condition
.
comparison_operator
)
?
condition
.
comparison_operator
:
t
(
`${i18nPrefix}.comparisonOperator.${condition.comparison_operator}`
)
}
</
span
>
{
!
isEmptyRelatedOperator
(
condition
.
comparison_operator
)
&&
<
span
>
{
condition
.
value
}
</
span
>
}
</
div
>
{
i
!==
conditions
.
length
-
1
&&
(
...
...
web/app/components/workflow/nodes/if-else/utils.ts
View file @
91a2e71f
...
...
@@ -8,3 +8,13 @@ export const isEmptyRelatedOperator = (operator: ComparisonOperator) => {
export
const
checkNodeValid
=
(
payload
:
IfElseNodeType
)
=>
{
return
true
}
const
notTranslateKey
=
[
ComparisonOperator
.
equal
,
ComparisonOperator
.
notEqual
,
ComparisonOperator
.
largerThan
,
ComparisonOperator
.
largerThanOrEqual
,
ComparisonOperator
.
lessThan
,
ComparisonOperator
.
lessThanOrEqual
,
]
export
const
isComparisonOperatorNeedTranslate
=
(
operator
:
ComparisonOperator
)
=>
{
return
!
notTranslateKey
.
includes
(
operator
)
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment