diff --git a/web/app/components/workflow-app/components/workflow-header/app-publisher-trigger.tsx b/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx similarity index 62% rename from web/app/components/workflow-app/components/workflow-header/app-publisher-trigger.tsx rename to web/app/components/workflow-app/components/workflow-header/features-trigger.tsx index 324d1141ae..e59354c18a 100644 --- a/web/app/components/workflow-app/components/workflow-header/app-publisher-trigger.tsx +++ b/web/app/components/workflow-app/components/workflow-header/features-trigger.tsx @@ -3,20 +3,27 @@ import { useCallback, useMemo, } from 'react' -import { useStore as useReactflowStore } from 'reactflow' +import { useEdges, useNodes, useStore as useReactflowStore } from 'reactflow' +import { RiApps2AddLine } from '@remixicon/react' import { useTranslation } from 'react-i18next' import { useStore, useWorkflowStore, } from '@/app/components/workflow/store' import { + useChecklist, useChecklistBeforePublish, useNodesReadOnly, useNodesSyncDraft, - useWorkflowRunValidation, + // useWorkflowRunValidation, } from '@/app/components/workflow/hooks' +import Button from '@/app/components/base/button' import AppPublisher from '@/app/components/app/app-publisher' import { useFeatures } from '@/app/components/base/features/hooks' +import type { + CommonEdgeType, + CommonNodeType, +} from '@/app/components/workflow/types' import { BlockEnum, InputVarType, @@ -27,14 +34,17 @@ import { useInvalidateAppTriggers } from '@/service/use-tools' import type { PublishWorkflowParams } from '@/types/workflow' import { fetchAppDetail } from '@/service/apps' import { useStore as useAppStore } from '@/app/components/app/store' +import useTheme from '@/hooks/use-theme' +import cn from '@/utils/classnames' -const AppPublisherTrigger = () => { +const FeaturesTrigger = () => { const { t } = useTranslation() + const { theme } = useTheme() const workflowStore = useWorkflowStore() const appDetail = useAppStore(s => s.appDetail) const appID = appDetail?.id const setAppDetail = useAppStore(s => s.setAppDetail) - const { nodesReadOnly } = useNodesReadOnly() + const { nodesReadOnly, getNodesReadOnly } = useNodesReadOnly() const publishedAt = useStore(s => s.publishedAt) const draftUpdatedAt = useStore(s => s.draftUpdatedAt) const toolPublished = useStore(s => s.toolPublished) @@ -66,6 +76,17 @@ const AppPublisherTrigger = () => { const resetWorkflowVersionHistory = useResetWorkflowVersionHistory() const invalidateAppTriggers = useInvalidateAppTriggers() + const handleShowFeatures = useCallback(() => { + const { + showFeaturesPanel, + isRestoring, + setShowFeaturesPanel, + } = workflowStore.getState() + if (getNodesReadOnly() && !isRestoring) + return + setShowFeaturesPanel(!showFeaturesPanel) + }, [workflowStore, getNodesReadOnly]) + const updateAppDetail = useCallback(async () => { try { const res = await fetchAppDetail({ url: '/apps', id: appID! }) @@ -77,13 +98,21 @@ const AppPublisherTrigger = () => { }, [appID, setAppDetail]) const { mutateAsync: publishWorkflow } = usePublishWorkflow() - const { validateBeforeRun } = useWorkflowRunValidation() + // const { validateBeforeRun } = useWorkflowRunValidation() + const nodes = useNodes() + const edges = useEdges() + const needWarningNodes = useChecklist(nodes, edges) const updatePublishedWorkflow = useInvalidateAppWorkflow() const onPublish = useCallback(async (params?: PublishWorkflowParams) => { // First check if there are any items in the checklist - if (!validateBeforeRun()) + // if (!validateBeforeRun()) + // throw new Error('Checklist has unresolved items') + + if (needWarningNodes.length > 0) { + notify({ type: 'error', message: t('workflow.panel.checklistTip') }) throw new Error('Checklist has unresolved items') + } // Then perform the detailed validation if (await handleCheckBeforePublish()) { @@ -105,7 +134,7 @@ const AppPublisherTrigger = () => { else { throw new Error('Checklist failed') } - }, [validateBeforeRun, handleCheckBeforePublish, publishWorkflow, updatePublishedWorkflow, appID, updateAppDetail, invalidateAppTriggers, workflowStore, resetWorkflowVersionHistory]) + }, [needWarningNodes, handleCheckBeforePublish, publishWorkflow, notify, appID, t, updatePublishedWorkflow, updateAppDetail, workflowStore, resetWorkflowVersionHistory, invalidateAppTriggers]) const onPublisherToggle = useCallback((state: boolean) => { if (state) @@ -117,20 +146,32 @@ const AppPublisherTrigger = () => { }, [workflowStore]) return ( - + <> + + + ) } -export default memo(AppPublisherTrigger) +export default memo(FeaturesTrigger) diff --git a/web/app/components/workflow-app/components/workflow-header/index.tsx b/web/app/components/workflow-app/components/workflow-header/index.tsx index ca5f4f4834..53a050146e 100644 --- a/web/app/components/workflow-app/components/workflow-header/index.tsx +++ b/web/app/components/workflow-app/components/workflow-header/index.tsx @@ -11,7 +11,7 @@ import { fetchWorkflowRunHistory, } from '@/service/workflow' import ChatVariableTrigger from './chat-variable-trigger' -import AppPublisherTrigger from './app-publisher-trigger' +import FeaturesTrigger from './features-trigger' import { useResetWorkflowVersionHistory } from '@/service/use-workflow' import { useIsChatMode } from '../../hooks' @@ -42,7 +42,7 @@ const WorkflowHeader = () => { normal: { components: { left: , - middle: , + middle: , }, runAndHistoryProps: { showRunButton: !isChatMode,