-
-
{block.metaData.title}
-
- {block.metaData.description}
-
+
+
+ {block.metaData.title}
+
+ {block.metaData.description}
-
+
)
}
diff --git a/web/app/components/workflow/block-selector/constants.tsx b/web/app/components/workflow/block-selector/constants.tsx
index a036cc270cb..3c60b33ef07 100644
--- a/web/app/components/workflow/block-selector/constants.tsx
+++ b/web/app/components/workflow/block-selector/constants.tsx
@@ -1,13 +1,13 @@
import type { Block } from '../types'
import { BlockEnum } from '../types'
-import { BlockClassificationEnum } from './types'
+import { BlockClassification } from './types'
export const BLOCK_CLASSIFICATIONS = [
- BlockClassificationEnum.Default,
- BlockClassificationEnum.QuestionUnderstand,
- BlockClassificationEnum.Logic,
- BlockClassificationEnum.Transform,
- BlockClassificationEnum.Utilities,
+ BlockClassification.Default,
+ BlockClassification.QuestionUnderstand,
+ BlockClassification.Logic,
+ BlockClassification.Transform,
+ BlockClassification.Utilities,
] as const
export const DEFAULT_FILE_EXTENSIONS_IN_LOCAL_FILE_DATA_SOURCE = [
@@ -34,19 +34,19 @@ export const DEFAULT_FILE_EXTENSIONS_IN_LOCAL_FILE_DATA_SOURCE = [
export const START_BLOCKS = [
{
- classification: BlockClassificationEnum.Default,
+ classification: BlockClassification.Default,
type: BlockEnum.Start,
title: 'User Input',
description: 'Traditional start node for user input',
},
{
- classification: BlockClassificationEnum.Default,
+ classification: BlockClassification.Default,
type: BlockEnum.TriggerSchedule,
title: 'Schedule Trigger',
description: 'Time-based workflow trigger',
},
{
- classification: BlockClassificationEnum.Default,
+ classification: BlockClassification.Default,
type: BlockEnum.TriggerWebhook,
title: 'Webhook Trigger',
description: 'HTTP callback trigger',
@@ -62,98 +62,98 @@ export const ENTRY_NODE_TYPES = [
export const BLOCKS = [
{
- classification: BlockClassificationEnum.Default,
+ classification: BlockClassification.Default,
type: BlockEnum.Agent,
title: 'Agent',
},
{
- classification: BlockClassificationEnum.Default,
+ classification: BlockClassification.Default,
type: BlockEnum.AgentV2,
title: 'Agent',
},
{
- classification: BlockClassificationEnum.Default,
+ classification: BlockClassification.Default,
type: BlockEnum.LLM,
title: 'LLM',
},
{
- classification: BlockClassificationEnum.Default,
+ classification: BlockClassification.Default,
type: BlockEnum.KnowledgeRetrieval,
title: 'Knowledge Retrieval',
},
{
- classification: BlockClassificationEnum.Default,
+ classification: BlockClassification.Default,
type: BlockEnum.End,
title: 'End',
},
{
- classification: BlockClassificationEnum.Default,
+ classification: BlockClassification.Default,
type: BlockEnum.Answer,
title: 'Direct Answer',
},
{
- classification: BlockClassificationEnum.QuestionUnderstand,
+ classification: BlockClassification.QuestionUnderstand,
type: BlockEnum.QuestionClassifier,
title: 'Question Classifier',
},
{
- classification: BlockClassificationEnum.Logic,
+ classification: BlockClassification.Logic,
type: BlockEnum.IfElse,
title: 'IF/ELSE',
},
{
- classification: BlockClassificationEnum.Logic,
+ classification: BlockClassification.Logic,
type: BlockEnum.LoopEnd,
title: 'Exit Loop',
description: '',
},
{
- classification: BlockClassificationEnum.Logic,
+ classification: BlockClassification.Logic,
type: BlockEnum.Iteration,
title: 'Iteration',
},
{
- classification: BlockClassificationEnum.Logic,
+ classification: BlockClassification.Logic,
type: BlockEnum.Loop,
title: 'Loop',
},
{
- classification: BlockClassificationEnum.Transform,
+ classification: BlockClassification.Transform,
type: BlockEnum.Code,
title: 'Code',
},
{
- classification: BlockClassificationEnum.Transform,
+ classification: BlockClassification.Transform,
type: BlockEnum.TemplateTransform,
title: 'Templating Transform',
},
{
- classification: BlockClassificationEnum.Transform,
+ classification: BlockClassification.Transform,
type: BlockEnum.VariableAggregator,
title: 'Variable Aggregator',
},
{
- classification: BlockClassificationEnum.Transform,
+ classification: BlockClassification.Transform,
type: BlockEnum.DocExtractor,
title: 'Doc Extractor',
},
{
- classification: BlockClassificationEnum.Transform,
+ classification: BlockClassification.Transform,
type: BlockEnum.Assigner,
title: 'Variable Assigner',
},
{
- classification: BlockClassificationEnum.Transform,
+ classification: BlockClassification.Transform,
type: BlockEnum.ParameterExtractor,
title: 'Parameter Extractor',
},
{
- classification: BlockClassificationEnum.Utilities,
+ classification: BlockClassification.Utilities,
type: BlockEnum.HttpRequest,
title: 'HTTP Request',
},
{
- classification: BlockClassificationEnum.Utilities,
+ classification: BlockClassification.Utilities,
type: BlockEnum.ListFilter,
title: 'List Filter',
},
diff --git a/web/app/components/workflow/block-selector/featured-tools.tsx b/web/app/components/workflow/block-selector/featured-tools.tsx
index e8c3c588f7d..ee08898aef1 100644
--- a/web/app/components/workflow/block-selector/featured-tools.tsx
+++ b/web/app/components/workflow/block-selector/featured-tools.tsx
@@ -5,10 +5,10 @@ import type { ToolDefaultValue, ToolValue } from './types'
import type { Plugin } from '@/app/components/plugins/types'
import type { Locale } from '@/i18n-config'
import { cn } from '@langgenius/dify-ui/cn'
+import { Collapsible, CollapsiblePanel, CollapsibleTrigger } from '@langgenius/dify-ui/collapsible'
import {
createPreviewCardHandle,
PreviewCard,
- PreviewCardContent,
PreviewCardTrigger,
} from '@langgenius/dify-ui/preview-card'
import { useEffect, useMemo, useState } from 'react'
@@ -23,11 +23,14 @@ import { useFeaturedToolsCollapsed } from '@/app/components/workflow/block-selec
import { useGetLanguage } from '@/context/i18n'
import Link from '@/next/link'
import { formatNumber } from '@/utils/format'
+import { getMarketplaceUrl } from '@/utils/var'
import { PluginCategoryEnum } from '../../plugins/types'
import BlockIcon from '../block-icon'
import { BlockEnum } from '../types'
+import { BlockSelectorRow } from './block-selector-row'
+import { BlockSelectorPreviewCardContent } from './preview-card'
import Tools from './tools'
-import { ToolTypeEnum } from './types'
+import { ToolType } from './types'
import { ViewType } from './view-type-select'
const MAX_RECOMMENDED_COUNT = 15
@@ -117,113 +120,118 @@ const FeaturedTools = ({
const showEmptyState = !isLoading && totalVisible === 0
return (
-
-
+
- {!isCollapsed && (
- <>
- {isLoading && (
-
-
-
- )}
+
+ {isLoading && (
+
+
+
+ )}
- {showEmptyState && (
-
-
- {t(($) => $['tabs.noFeaturedPlugins'], { ns: 'workflow' })}
-
-
- )}
+ {showEmptyState && (
+
+
+ {t(($) => $['tabs.noFeaturedPlugins'], { ns: 'workflow' })}
+
+
+ )}
- {!showEmptyState && !isLoading && (
- <>
- {visibleInstalledProviders.length > 0 && (
-
+ {visibleInstalledProviders.length > 0 && (
+
+ )}
+
+ {visibleUninstalledPlugins.length > 0 && (
+
+ {visibleUninstalledPlugins.map((plugin) => (
+ {
+ await onInstallSuccess?.()
+ }}
+ t={t}
+ />
+ ))}
+
+ )}
+ >
+ )}
+
+ {!isLoading && totalVisible > 0 && canToggleVisibility && (
+