mirror of
https://github.com/langgenius/dify.git
synced 2026-07-21 10:38:32 +08:00
99 lines
3.6 KiB
TypeScript
99 lines
3.6 KiB
TypeScript
import type { SelectorParam } from 'i18next'
|
|
import type { ReactElement } from 'react'
|
|
import type { IterationNodeType } from '@/app/components/workflow/nodes/iteration/types'
|
|
import type { NodeProps } from '@/app/components/workflow/types'
|
|
import { Tooltip, TooltipContent, TooltipTrigger } from '@langgenius/dify-ui/tooltip'
|
|
import { BlockEnum, NodeRunningStatus } from '@/app/components/workflow/types'
|
|
|
|
type HeaderMetaProps = {
|
|
data: NodeProps['data']
|
|
hasVarValue: boolean
|
|
isLoading: boolean
|
|
loopIndex: ReactElement | null
|
|
t: WorkflowTranslator
|
|
}
|
|
|
|
export type WorkflowTranslator = (
|
|
selector: SelectorParam<'workflow'>,
|
|
options: { ns: 'workflow' } & Record<string, unknown>,
|
|
) => string
|
|
|
|
export const NodeHeaderMeta = ({ data, hasVarValue, isLoading, loopIndex, t }: HeaderMetaProps) => {
|
|
return (
|
|
<>
|
|
{data.type === BlockEnum.Iteration && (data as IterationNodeType).is_parallel && (
|
|
<Tooltip>
|
|
<TooltipTrigger>
|
|
<div className="ml-1 flex items-center justify-center rounded-[5px] border border-text-warning px-[5px] py-[3px] system-2xs-medium-uppercase text-text-warning">
|
|
{t(($) => $['nodes.iteration.parallelModeUpper'], { ns: 'workflow' })}
|
|
</div>
|
|
</TooltipTrigger>
|
|
<TooltipContent className="w-[180px]">
|
|
<div className="font-extrabold">
|
|
{t(($) => $['nodes.iteration.parallelModeEnableTitle'], { ns: 'workflow' })}
|
|
</div>
|
|
{t(($) => $['nodes.iteration.parallelModeEnableDesc'], { ns: 'workflow' })}
|
|
</TooltipContent>
|
|
</Tooltip>
|
|
)}
|
|
{!!(
|
|
data._iterationLength &&
|
|
data._iterationIndex &&
|
|
data._runningStatus === NodeRunningStatus.Running
|
|
) && (
|
|
<div className="mr-1.5 text-xs font-medium text-text-accent">
|
|
{data._iterationIndex > data._iterationLength
|
|
? data._iterationLength
|
|
: data._iterationIndex}
|
|
/{data._iterationLength}
|
|
</div>
|
|
)}
|
|
{!!(data.type === BlockEnum.Loop && data._loopIndex) && loopIndex}
|
|
{isLoading && <span className="i-ri-loader-2-line size-3.5 animate-spin text-text-accent" />}
|
|
{!isLoading && data._runningStatus === NodeRunningStatus.Failed && (
|
|
<span className="i-ri-error-warning-fill size-3.5 text-text-destructive" />
|
|
)}
|
|
{!isLoading && data._runningStatus === NodeRunningStatus.Exception && (
|
|
<span className="i-ri-alert-fill size-3.5 text-text-warning-secondary" />
|
|
)}
|
|
{!isLoading &&
|
|
(data._runningStatus === NodeRunningStatus.Succeeded ||
|
|
(!data._runningStatus && hasVarValue)) && (
|
|
<span className="i-ri-checkbox-circle-fill size-3.5 text-text-success" />
|
|
)}
|
|
{!isLoading && data._runningStatus === NodeRunningStatus.Paused && (
|
|
<span className="i-ri-pause-circle-fill size-3.5 text-text-warning-secondary" />
|
|
)}
|
|
</>
|
|
)
|
|
}
|
|
|
|
type NodeBodyProps = {
|
|
data: NodeProps['data']
|
|
child: ReactElement
|
|
}
|
|
|
|
export const NodeBody = ({ data, child }: NodeBodyProps) => {
|
|
if (data.type === BlockEnum.Iteration || data.type === BlockEnum.Loop) {
|
|
return <div className="grow px-1 pb-1">{child}</div>
|
|
}
|
|
|
|
return child
|
|
}
|
|
|
|
export const NodeDescription = ({ data }: { data: NodeProps['data'] }) => {
|
|
if (
|
|
!data.desc ||
|
|
data.type === BlockEnum.Iteration ||
|
|
data.type === BlockEnum.Loop ||
|
|
data.type === BlockEnum.StartPlaceholder
|
|
)
|
|
return null
|
|
|
|
return (
|
|
<div className="px-3 pt-1 pb-2 system-xs-regular wrap-break-word whitespace-pre-line text-text-tertiary">
|
|
{data.desc}
|
|
</div>
|
|
)
|
|
}
|