From 0cdd478f258a2bcac4c61f6bb8e86efa4553741e Mon Sep 17 00:00:00 2001 From: yyh <92089059+lyzno1@users.noreply.github.com> Date: Fri, 5 Jun 2026 15:00:03 +0800 Subject: [PATCH] fix(web): stabilize block selector layout (#37089) --- .../plugins/marketplace/search-box/index.tsx | 5 +++-- .../components/workflow/block-selector/main.tsx | 15 +++++++++++---- .../components/workflow/block-selector/tabs.tsx | 4 ++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/web/app/components/plugins/marketplace/search-box/index.tsx b/web/app/components/plugins/marketplace/search-box/index.tsx index 745df2cf0f..08ee30476e 100644 --- a/web/app/components/plugins/marketplace/search-box/index.tsx +++ b/web/app/components/plugins/marketplace/search-box/index.tsx @@ -77,12 +77,12 @@ const SearchBox = ({ { !usedInMarketplace && ( <> -
+
onSearchChange('')} className="shrink-0" > diff --git a/web/app/components/workflow/block-selector/main.tsx b/web/app/components/workflow/block-selector/main.tsx index 335d329690..fde58fb844 100644 --- a/web/app/components/workflow/block-selector/main.tsx +++ b/web/app/components/workflow/block-selector/main.tsx @@ -17,6 +17,7 @@ import { PopoverContent, PopoverTrigger, } from '@langgenius/dify-ui/popover' +import { useDebounce } from 'ahooks' import * as React from 'react' import { memo, @@ -89,6 +90,7 @@ function NodeSelector({ const { t } = useTranslation() const nodes = useNodes() const [searchText, setSearchText] = useState('') + const debouncedSearchText = useDebounce(searchText, { wait: 500 }) const [tags, setTags] = useState([]) const [localOpen, setLocalOpen] = useState(false) // Exclude nodes explicitly ignored (such as the node currently being edited) when checking canvas state. @@ -159,6 +161,9 @@ function NodeSelector({ const handleActiveTabChange = useCallback((newActiveTab: TabsEnum) => { setActiveTab(newActiveTab) }, [setActiveTab]) + const filterSearchText = activeTab === TabsEnum.Start || activeTab === TabsEnum.Tools + ? debouncedSearchText + : searchText const searchPlaceholder = useMemo(() => { if (activeTab === TabsEnum.Start) @@ -223,7 +228,7 @@ function NodeSelector({ alignOffset={alignOffset} popupClassName="border-none bg-transparent shadow-none" > -
+
)} {activeTab === TabsEnum.Blocks && ( @@ -273,13 +279,14 @@ function NodeSelector({ tags={tags} onTagsChange={setTags} placeholder={t('searchTools', { ns: 'plugin' })!} - inputClassName="grow" + wrapperClassName="w-full min-w-0" + inputClassName="min-w-0 grow" /> )}
)} onSelect={handleSelect} - searchText={searchText} + searchText={filterSearchText} tags={tags} availableBlocksTypes={availableBlocksTypes} noBlocks={noBlocks} diff --git a/web/app/components/workflow/block-selector/tabs.tsx b/web/app/components/workflow/block-selector/tabs.tsx index 11e7e5484d..5cdffcd40b 100644 --- a/web/app/components/workflow/block-selector/tabs.tsx +++ b/web/app/components/workflow/block-selector/tabs.tsx @@ -219,10 +219,10 @@ const Tabs: FC = ({ }, [normalizedBuiltInTools, normalizedCustomTools, normalizedMcpTools, normalizedWorkflowTools, workflowStore]) return ( -
e.stopPropagation()}> +
e.stopPropagation()}> { !noBlocks && ( -
+
{ tabs.map(tab => (