diff --git a/web/app/components/datasets/create/empty-dataset-creation-modal/index.tsx b/web/app/components/datasets/create/empty-dataset-creation-modal/index.tsx
index e9247c49df..f04634e638 100644
--- a/web/app/components/datasets/create/empty-dataset-creation-modal/index.tsx
+++ b/web/app/components/datasets/create/empty-dataset-creation-modal/index.tsx
@@ -58,7 +58,7 @@ const EmptyDatasetCreationModal = ({
{t('datasetCreation.stepOne.modal.tip')}
diff --git a/web/app/components/datasets/documents/detail/completed/index.tsx b/web/app/components/datasets/documents/detail/completed/index.tsx
index f2addac2e2..6c5ca64d27 100644
--- a/web/app/components/datasets/documents/detail/completed/index.tsx
+++ b/web/app/components/datasets/documents/detail/completed/index.tsx
@@ -1,10 +1,11 @@
'use client'
import type { FC } from 'react'
import React, { memo, useEffect, useMemo, useState } from 'react'
+import { useDebounceFn } from 'ahooks'
import { HashtagIcon } from '@heroicons/react/24/solid'
import { useTranslation } from 'react-i18next'
import { useContext } from 'use-context-selector'
-import { debounce, isNil, omitBy } from 'lodash-es'
+import { isNil, omitBy } from 'lodash-es'
import {
RiCloseLine,
RiEditLine,
@@ -241,7 +242,8 @@ const Completed: FC = ({
// the current segment id and whether to show the modal
const [currSegment, setCurrSegment] = useState<{ segInfo?: SegmentDetailModel; showModal: boolean }>({ showModal: false })
- const [searchValue, setSearchValue] = useState() // the search value
+ const [inputValue, setInputValue] = useState('') // the input value
+ const [searchValue, setSearchValue] = useState('') // the search value
const [selectedStatus, setSelectedStatus] = useState('all') // the selected status, enabled/disabled/undefined
const [lastSegmentsRes, setLastSegmentsRes] = useState(undefined)
@@ -250,6 +252,15 @@ const Completed: FC = ({
const [total, setTotal] = useState()
const { eventEmitter } = useEventEmitterContextContext()
+ const { run: handleSearch } = useDebounceFn(() => {
+ setSearchValue(inputValue)
+ }, { wait: 500 })
+
+ const handleInputChange = (value: string) => {
+ setInputValue(value)
+ handleSearch()
+ }
+
const onChangeStatus = ({ value }: Item) => {
setSelectedStatus(value === 'all' ? 'all' : !!value)
}
@@ -391,7 +402,14 @@ const Completed: FC = ({
defaultValue={'all'}
className={s.select}
wrapperClassName='h-fit w-[120px] mr-2' />
-
+ handleInputChange(e.target.value)}
+ onClear={() => handleInputChange('')}
+ />
= ({
placeholder={`${t('datasetDocuments.metadata.placeholder.add')}${label}`}
/>
: onUpdate?.(e.target.value)}
value={value}
defaultValue={defaultValue}
placeholder={`${t('datasetDocuments.metadata.placeholder.add')}${label}`}
diff --git a/web/app/components/datasets/documents/index.tsx b/web/app/components/datasets/documents/index.tsx
index ce81e44792..23de4f8499 100644
--- a/web/app/components/datasets/documents/index.tsx
+++ b/web/app/components/datasets/documents/index.tsx
@@ -4,7 +4,8 @@ import React, { useMemo, useState } from 'react'
import useSWR from 'swr'
import { useTranslation } from 'react-i18next'
import { useRouter } from 'next/navigation'
-import { debounce, groupBy, omit } from 'lodash-es'
+import { useDebounceFn } from 'ahooks'
+import { groupBy, omit } from 'lodash-es'
import { PlusIcon } from '@heroicons/react/24/solid'
import List from './list'
import s from './style.module.css'
@@ -76,6 +77,7 @@ export const fetcher = (url: string) => get(url, {}, {})
const Documents: FC = ({ datasetId }) => {
const { t } = useTranslation()
+ const [inputValue, setInputValue] = useState('') // the input value
const [searchValue, setSearchValue] = useState('')
const [currPage, setCurrPage] = React.useState(0)
const router = useRouter()
@@ -192,6 +194,15 @@ const Documents: FC = ({ datasetId }) => {
const documentsList = isDataSourceNotion ? documentsWithProgress?.data : documentsRes?.data
+ const { run: handleSearch } = useDebounceFn(() => {
+ setSearchValue(inputValue)
+ }, { wait: 500 })
+
+ const handleInputChange = (value: string) => {
+ setInputValue(value)
+ handleSearch()
+ }
+
return (
@@ -201,11 +212,12 @@ const Documents: FC
= ({ datasetId }) => {
handleInputChange(e.target.value)}
+ onClear={() => handleInputChange('')}
/>
diff --git a/web/app/components/datasets/settings/permission-selector/index.tsx b/web/app/components/datasets/settings/permission-selector/index.tsx
index 910dfc5347..f70e41d46f 100644
--- a/web/app/components/datasets/settings/permission-selector/index.tsx
+++ b/web/app/components/datasets/settings/permission-selector/index.tsx
@@ -9,7 +9,7 @@ import {
PortalToFollowElemTrigger,
} from '@/app/components/base/portal-to-follow-elem'
import Avatar from '@/app/components/base/avatar'
-import SearchInput from '@/app/components/base/search-input'
+import Input from '@/app/components/base/input'
import { Check } from '@/app/components/base/icons/src/vender/line/general'
import { Users01, UsersPlus } from '@/app/components/base/icons/src/vender/solid/users'
import type { DatasetPermission } from '@/models/datasets'
@@ -99,7 +99,7 @@ const PermissionSelector = ({ disabled, permission, value, memberList, onChange,
)}
-
+
{
onChange('only_me')
@@ -139,7 +139,13 @@ const PermissionSelector = ({ disabled, permission, value, memberList, onChange,
{permission === 'partial_members' && (
-
+ handleKeywordsChange(e.target.value)}
+ onClear={() => handleKeywordsChange('')}
+ />
{showMe && (
diff --git a/web/app/components/explore/app-list/index.tsx b/web/app/components/explore/app-list/index.tsx
index 4f2926677d..3a4233019c 100644
--- a/web/app/components/explore/app-list/index.tsx
+++ b/web/app/components/explore/app-list/index.tsx
@@ -23,7 +23,7 @@ import Loading from '@/app/components/base/loading'
import { NEED_REFRESH_APP_LIST_KEY } from '@/config'
import { useAppContext } from '@/context/app-context'
import { getRedirection } from '@/utils/app-redirection'
-import SearchInput from '@/app/components/base/search-input'
+import Input from '@/app/components/base/input'
type AppsProps = {
pageType?: PageType
@@ -185,7 +185,14 @@ const Apps = ({
allCategoriesEn={allCategoriesEn}
/>
>
-
+ handleKeywordsChange(e.target.value)}
+ onClear={() => handleKeywordsChange('')}
+ />
diff --git a/web/app/components/tools/add-tool-modal/index.tsx b/web/app/components/tools/add-tool-modal/index.tsx
index 473753f40f..e285b1a099 100644
--- a/web/app/components/tools/add-tool-modal/index.tsx
+++ b/web/app/components/tools/add-tool-modal/index.tsx
@@ -19,7 +19,7 @@ import { getLanguage } from '@/i18n/language'
import Drawer from '@/app/components/base/drawer'
import Button from '@/app/components/base/button'
import Loading from '@/app/components/base/loading'
-import SearchInput from '@/app/components/base/search-input'
+import Input from '@/app/components/base/input'
import EditCustomToolModal from '@/app/components/tools/edit-custom-collection-modal'
import ConfigCredential from '@/app/components/tools/setting/build-in/config-credentials'
import {
@@ -193,7 +193,13 @@ const AddToolModal: FC
= ({
-
+ handleKeywordsChange(e.target.value)}
+ onClear={() => handleKeywordsChange('')}
+ />
diff --git a/web/app/components/tools/labels/filter.tsx b/web/app/components/tools/labels/filter.tsx
index 1223f91846..20db687e79 100644
--- a/web/app/components/tools/labels/filter.tsx
+++ b/web/app/components/tools/labels/filter.tsx
@@ -11,7 +11,7 @@ import {
PortalToFollowElemContent,
PortalToFollowElemTrigger,
} from '@/app/components/base/portal-to-follow-elem'
-import SearchInput from '@/app/components/base/search-input'
+import Input from '@/app/components/base/input'
import { Tag01, Tag03 } from '@/app/components/base/icons/src/vender/line/financeAndECommerce'
import { Check } from '@/app/components/base/icons/src/vender/line/general'
import { XCircle } from '@/app/components/base/icons/src/vender/solid/general'
@@ -113,7 +113,13 @@ const LabelFilter: FC
= ({
-
+ handleKeywordsChange(e.target.value)}
+ onClear={() => handleKeywordsChange('')}
+ />
{filteredLabelList.map(label => (
diff --git a/web/app/components/tools/labels/selector.tsx b/web/app/components/tools/labels/selector.tsx
index 2cc430d956..6260127c60 100644
--- a/web/app/components/tools/labels/selector.tsx
+++ b/web/app/components/tools/labels/selector.tsx
@@ -11,7 +11,7 @@ import {
PortalToFollowElemContent,
PortalToFollowElemTrigger,
} from '@/app/components/base/portal-to-follow-elem'
-import SearchInput from '@/app/components/base/search-input'
+import Input from '@/app/components/base/input'
import { Tag03 } from '@/app/components/base/icons/src/vender/line/financeAndECommerce'
import Checkbox from '@/app/components/base/checkbox'
import type { Label } from '@/app/components/tools/labels/constant'
@@ -94,7 +94,13 @@ const LabelSelector: FC
= ({
-
+ handleKeywordsChange(e.target.value)}
+ onClear={() => handleKeywordsChange('')}
+ />
= ({
-
-
e.stopPropagation()}
- >
-
-
setSearchText(e.target.value)}
- autoFocus
- />
- {
- searchText && (
-
setSearchText('')}
- >
-
-
- )
- }
-
+
e.stopPropagation()}>
+ setSearchText(e.target.value)}
+ onClear={() => setSearchText('')}
+ />
= ({
hasSubVariable,
}) => {
+ const [input, setInput] = React.useState('')
return (
)