diff --git a/web/app/components/plugins/marketplace/search-box/index.tsx b/web/app/components/plugins/marketplace/search-box/index.tsx
index 217007846c..5f19afbba6 100644
--- a/web/app/components/plugins/marketplace/search-box/index.tsx
+++ b/web/app/components/plugins/marketplace/search-box/index.tsx
@@ -1,8 +1,9 @@
'use client'
-import { RiCloseLine } from '@remixicon/react'
+import { RiCloseLine, RiSearchLine } from '@remixicon/react'
import TagsFilter from './tags-filter'
import ActionButton from '@/app/components/base/action-button'
import cn from '@/utils/classnames'
+import { RiAddLine } from '@remixicon/react'
type SearchBoxProps = {
search: string
@@ -13,6 +14,9 @@ type SearchBoxProps = {
size?: 'small' | 'large'
placeholder?: string
locale?: string
+ supportAddCustomTool?: boolean
+ onShowAddCustomCollectionModal?: () => void
+ onAddedCustomTool?: () => void
}
const SearchBox = ({
search,
@@ -23,46 +27,62 @@ const SearchBox = ({
size = 'small',
placeholder = '',
locale,
+ supportAddCustomTool,
+ onShowAddCustomCollectionModal,
}: SearchBoxProps) => {
return (
-
-
-
-
-
{
- onSearchChange(e.target.value)
- }}
- placeholder={placeholder}
- />
- {
- search && (
-
-
onSearchChange('')}>
-
-
-
- )
- }
+
+
+
+
+
{
+ onSearchChange(e.target.value)
+ }}
+ placeholder={placeholder}
+ />
+ {
+ search && (
+
+
onSearchChange('')}>
+
+
+
+ )
+ }
+
+
+
+ {supportAddCustomTool && (
+
+ )}
)
}
diff --git a/web/app/components/plugins/marketplace/search-box/tags-filter.tsx b/web/app/components/plugins/marketplace/search-box/tags-filter.tsx
index edf50dc874..bae6491727 100644
--- a/web/app/components/plugins/marketplace/search-box/tags-filter.tsx
+++ b/web/app/components/plugins/marketplace/search-box/tags-filter.tsx
@@ -2,9 +2,7 @@
import { useState } from 'react'
import {
- RiArrowDownSLine,
- RiCloseCircleFill,
- RiFilter3Line,
+ RiPriceTag3Line,
} from '@remixicon/react'
import {
PortalToFollowElem,
@@ -57,47 +55,15 @@ const TagsFilter = ({
onClick={() => setOpen(v => !v)}
>
-
-
+
+
-
- {
- !selectedTagsLength && t('pluginTags.allTags')
- }
- {
- !!selectedTagsLength && tags.map(tag => tagsMap[tag].label).slice(0, 2).join(',')
- }
- {
- selectedTagsLength > 2 && (
-
- +{selectedTagsLength - 2}
-
- )
- }
-
- {
- !!selectedTagsLength && (
-
onTagsChange([])}
- />
- )
- }
- {
- !selectedTagsLength && (
-
- )
- }
diff --git a/web/app/components/plugins/reference-setting-modal/auto-update-setting/tool-picker.tsx b/web/app/components/plugins/reference-setting-modal/auto-update-setting/tool-picker.tsx
index 9f96e4a7aa..5108bb7b96 100644
--- a/web/app/components/plugins/reference-setting-modal/auto-update-setting/tool-picker.tsx
+++ b/web/app/components/plugins/reference-setting-modal/auto-update-setting/tool-picker.tsx
@@ -8,9 +8,12 @@ import {
} from '@/app/components/base/portal-to-follow-elem'
import { useFetchPluginListOrBundleList } from '@/service/use-plugins'
import { PLUGIN_TYPE_SEARCH_MAP } from '../../marketplace/plugin-type-switch'
+import SearchBox from '@/app/components/plugins/marketplace/search-box'
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
type Props = {
- trigger: React.ReactNode
+ trigger: React.ReactNode
value: string[]
onChange: (value: string[]) => void
isShow: boolean
@@ -18,8 +21,6 @@ type Props = {
}
-const allPluginTypes = [PLUGIN_TYPE_SEARCH_MAP.all, PLUGIN_TYPE_SEARCH_MAP.model, PLUGIN_TYPE_SEARCH_MAP.tool, PLUGIN_TYPE_SEARCH_MAP.agent, PLUGIN_TYPE_SEARCH_MAP.extension, PLUGIN_TYPE_SEARCH_MAP.bundle]
-
const ToolPicker: FC = ({
trigger,
value,
@@ -27,24 +28,55 @@ const ToolPicker: FC = ({
isShow,
onShowChange,
}) => {
+ const { t } = useTranslation()
const toggleShowPopup = useCallback(() => {
onShowChange(!isShow)
}, [onShowChange, isShow])
+ const tabs = [
+ {
+ key: PLUGIN_TYPE_SEARCH_MAP.all,
+ name: t('plugin.category.all'),
+ },
+ {
+ key: PLUGIN_TYPE_SEARCH_MAP.model,
+ name: t('plugin.category.models'),
+ },
+ {
+ key: PLUGIN_TYPE_SEARCH_MAP.tool,
+ name: t('plugin.category.tools'),
+ },
+ {
+ key: PLUGIN_TYPE_SEARCH_MAP.agent,
+ name: t('plugin.category.agents'),
+ },
+ {
+ key: PLUGIN_TYPE_SEARCH_MAP.extension,
+ name: t('plugin.category.extensions'),
+ },
+ {
+ key: PLUGIN_TYPE_SEARCH_MAP.bundle,
+ name: t('plugin.category.bundles'),
+ },
+ ]
+
const [pluginType, setPluginType] = useState(PLUGIN_TYPE_SEARCH_MAP.all)
const [query, setQuery] = useState('')
+ const [tags, setTags] = useState([])
const { data } = useFetchPluginListOrBundleList({
query,
+ tags,
category: pluginType,
})
const isBundle = pluginType === PLUGIN_TYPE_SEARCH_MAP.bundle
const list = (isBundle ? data?.data?.bundles : data?.data?.plugins) || []
+
console.log(list)
return (
= ({
{trigger}
- aafdf
+
+
+
+
+
+
+ {
+ tabs.map(tab => (
+
setPluginType(tab.key)}
+ >
+ {tab.name}
+
+ ))
+ }
+
+
+
)