From 4164e1191e9155d7f0ea00f385ff7b3a76fd874a Mon Sep 17 00:00:00 2001 From: lyzno1 Date: Wed, 15 Oct 2025 16:10:34 +0800 Subject: [PATCH] fix: hide checklist navigation for missing nodes --- .../components/workflow/header/checklist.tsx | 34 +++++++++++------ .../workflow/hooks/use-checklist.ts | 38 ++++++++++++------- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/web/app/components/workflow/header/checklist.tsx b/web/app/components/workflow/header/checklist.tsx index b3c7d966d5..39155c037e 100644 --- a/web/app/components/workflow/header/checklist.tsx +++ b/web/app/components/workflow/header/checklist.tsx @@ -16,6 +16,7 @@ import { useChecklist, useNodesInteractions, } from '../hooks' +import type { ChecklistItem } from '../hooks/use-checklist' import type { CommonEdgeType, CommonNodeType, @@ -45,6 +46,13 @@ const WorkflowChecklist = ({ const needWarningNodes = useChecklist(nodes, edges) const { handleNodeSelect } = useNodesInteractions() + const handleChecklistItemClick = (item: ChecklistItem) => { + if (!item.canNavigate) + return + handleNodeSelect(item.id) + setOpen(false) + } + return ( (
{ - handleNodeSelect(node.id) - setOpen(false) - }} + className={cn( + 'group mb-2 rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xs last-of-type:mb-0', + node.canNavigate ? 'cursor-pointer' : 'cursor-default opacity-80', + )} + onClick={() => handleChecklistItemClick(node)} >
{node.title} -
- - {t('workflow.panel.goTo')} - - -
+ { + node.canNavigate && ( +
+ + {t('workflow.panel.goTo')} + + +
+ ) + }
{ const { t } = useTranslation() const language = useGetLanguage() @@ -74,8 +91,8 @@ export const useChecklist = (nodes: Node[], edges: Edge[]) => { return checkData }, [datasetsDetail]) - const needWarningNodes = useMemo(() => { - const list = [] + const needWarningNodes = useMemo(() => { + const list: ChecklistItem[] = [] const filteredNodes = nodes.filter(node => node.type === CUSTOM_NODE) const { validNodes } = getValidTreeNodes(filteredNodes, edges) @@ -145,18 +162,14 @@ export const useChecklist = (nodes: Node[], edges: Edge[]) => { toolIcon, unConnected: isUnconnected && !isStartNode, errorMessage, + canNavigate: true, }) } } } // Check for start nodes (including triggers) - const startNodesFiltered = nodes.filter(node => - node.data.type === BlockEnum.Start - || node.data.type === BlockEnum.TriggerSchedule - || node.data.type === BlockEnum.TriggerWebhook - || node.data.type === BlockEnum.TriggerPlugin, - ) + const startNodesFiltered = nodes.filter(node => START_NODE_TYPES.includes(node.data.type as BlockEnum)) if (startNodesFiltered.length === 0) { list.push({ @@ -164,6 +177,7 @@ export const useChecklist = (nodes: Node[], edges: Edge[]) => { type: BlockEnum.Start, title: t('workflow.panel.startNode'), errorMessage: t('workflow.common.needStartNode'), + canNavigate: false, }) } @@ -176,6 +190,7 @@ export const useChecklist = (nodes: Node[], edges: Edge[]) => { type, title: t(`workflow.blocks.${type}`), errorMessage: t('workflow.common.needAdd', { node: t(`workflow.blocks.${type}`) }), + canNavigate: false, }) } }) @@ -316,12 +331,7 @@ export const useChecklistBeforePublish = () => { } } - const startNodesFiltered = nodes.filter(node => - node.data.type === BlockEnum.Start - || node.data.type === BlockEnum.TriggerSchedule - || node.data.type === BlockEnum.TriggerWebhook - || node.data.type === BlockEnum.TriggerPlugin, - ) + const startNodesFiltered = nodes.filter(node => START_NODE_TYPES.includes(node.data.type as BlockEnum)) if (startNodesFiltered.length === 0) { notify({ type: 'error', message: t('workflow.common.needStartNode') })