diff --git a/web/app/components/app/app-publisher/index.tsx b/web/app/components/app/app-publisher/index.tsx index 0a026a680b..39cbb56d4c 100644 --- a/web/app/components/app/app-publisher/index.tsx +++ b/web/app/components/app/app-publisher/index.tsx @@ -114,6 +114,7 @@ export type AppPublisherProps = { missingStartNode?: boolean hasTriggerNode?: boolean // Whether workflow currently contains any trigger nodes (used to hide missing-start CTA when triggers exist). startNodeLimitExceeded?: boolean + hasHumanInputNode?: boolean } const PUBLISH_SHORTCUT = ['ctrl', '⇧', 'P'] @@ -137,13 +138,14 @@ const AppPublisher = ({ missingStartNode = false, hasTriggerNode = false, startNodeLimitExceeded = false, + hasHumanInputNode = false, }: AppPublisherProps) => { const { t } = useTranslation() const [published, setPublished] = useState(false) const [open, setOpen] = useState(false) const [showAppAccessControl, setShowAppAccessControl] = useState(false) - const [isAppAccessSet, setIsAppAccessSet] = useState(true) + const [embeddingModalOpen, setEmbeddingModalOpen] = useState(false) const appDetail = useAppStore(state => state.appDetail) @@ -160,6 +162,13 @@ const AppPublisher = ({ const { data: appAccessSubjects, isLoading: isGettingAppWhiteListSubjects } = useAppWhiteListSubjects(appDetail?.id, open && systemFeatures.webapp_auth.enabled && appDetail?.access_mode === AccessMode.SPECIFIC_GROUPS_MEMBERS) const openAsyncWindow = useAsyncWindowOpen() + const isAppAccessSet = useMemo(() => { + if (appDetail && appAccessSubjects) { + return !(appDetail.access_mode === AccessMode.SPECIFIC_GROUPS_MEMBERS && appAccessSubjects.groups?.length === 0 && appAccessSubjects.members?.length === 0) + } + return true + }, [appAccessSubjects, appDetail]) + const noAccessPermission = useMemo(() => systemFeatures.webapp_auth.enabled && appDetail && appDetail.access_mode !== AccessMode.EXTERNAL_MEMBERS && !userCanAccessApp?.result, [systemFeatures, appDetail, userCanAccessApp]) const disabledFunctionButton = useMemo(() => (!publishedAt || missingStartNode || noAccessPermission), [publishedAt, missingStartNode, noAccessPermission]) @@ -170,25 +179,13 @@ const AppPublisher = ({ return t('noUserInputNode', { ns: 'app' }) if (noAccessPermission) return t('noAccessPermission', { ns: 'app' }) - }, [missingStartNode, noAccessPermission, publishedAt]) + }, [missingStartNode, noAccessPermission, publishedAt, t]) useEffect(() => { if (systemFeatures.webapp_auth.enabled && open && appDetail) refetch() }, [open, appDetail, refetch, systemFeatures]) - useEffect(() => { - if (appDetail && appAccessSubjects) { - if (appDetail.access_mode === AccessMode.SPECIFIC_GROUPS_MEMBERS && appAccessSubjects.groups?.length === 0 && appAccessSubjects.members?.length === 0) - setIsAppAccessSet(false) - else - setIsAppAccessSet(true) - } - else { - setIsAppAccessSet(true) - } - }, [appAccessSubjects, appDetail]) - const handlePublish = useCallback(async (params?: ModelAndParameter | PublishWorkflowParams) => { try { await onPublish?.(params) @@ -466,7 +463,7 @@ const AppPublisher = ({ {t('common.accessAPIReference', { ns: 'workflow' })} - {appDetail?.mode === AppModeEnum.WORKFLOW && ( + {appDetail?.mode === AppModeEnum.WORKFLOW && !hasHumanInputNode && ( { return isFetchedPlan && plan.type === Plan.sandbox && entryCount > 2 }, [nodes, plan.type, isFetchedPlan]) + const hasHumanInputNode = useMemo(() => { + return nodes.some(node => node.data.type === BlockEnum.HumanInput) + }, [nodes]) + const resetWorkflowVersionHistory = useResetWorkflowVersionHistory() const invalidateAppTriggers = useInvalidateAppTriggers() @@ -171,7 +175,7 @@ const FeaturesTrigger = () => { else { throw new Error('Checklist failed') } - }, [needWarningNodes, handleCheckBeforePublish, publishWorkflow, notify, appID, t, updatePublishedWorkflow, updateAppDetail, workflowStore, resetWorkflowVersionHistory, invalidateAppTriggers]) + }, [needWarningNodes, handleCheckBeforePublish, publishWorkflow, notify, appID, t, updatePublishedWorkflow, updateAppDetail, workflowStore, resetWorkflowVersionHistory, invalidateAppTriggers, hasUserInputNode]) const onPublisherToggle = useCallback((state: boolean) => { if (state) @@ -214,6 +218,7 @@ const FeaturesTrigger = () => { hasTriggerNode, startNodeLimitExceeded, publishDisabled: !hasWorkflowNodes || startNodeLimitExceeded, + hasHumanInputNode, }} /> diff --git a/web/eslint-suppressions.json b/web/eslint-suppressions.json index 125e94ece9..3f32aba169 100644 --- a/web/eslint-suppressions.json +++ b/web/eslint-suppressions.json @@ -245,9 +245,6 @@ } }, "app/components/app/app-publisher/index.tsx": { - "react-hooks-extra/no-direct-set-state-in-use-effect": { - "count": 3 - }, "ts/no-explicit-any": { "count": 6 } @@ -2569,6 +2566,11 @@ "count": 1 } }, + "app/components/rag-pipeline/hooks/use-configs-map.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, "app/components/rag-pipeline/hooks/use-input-fields.ts": { "ts/no-explicit-any": { "count": 2