mirror of
https://github.com/langgenius/dify.git
synced 2025-09-26 17:46:00 +00:00
refactor: Enhance Bucket and Breadcrumbs components; improve event handling and add button for bucket name
This commit is contained in:
parent
d44af3ec46
commit
e67a19b26b
@ -1,16 +1,31 @@
|
|||||||
import React from 'react'
|
import React, { useCallback } from 'react'
|
||||||
import { BucketsGray } from '@/app/components/base/icons/src/public/knowledge/online-drive'
|
import { BucketsGray } from '@/app/components/base/icons/src/public/knowledge/online-drive'
|
||||||
import Tooltip from '@/app/components/base/tooltip'
|
import Tooltip from '@/app/components/base/tooltip'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
|
import cn from '@/utils/classnames'
|
||||||
|
|
||||||
type BucketProps = {
|
type BucketProps = {
|
||||||
|
bucketName: string
|
||||||
|
isActive?: boolean
|
||||||
|
disabled?: boolean
|
||||||
|
showSeparator?: boolean
|
||||||
handleBackToBucketList: () => void
|
handleBackToBucketList: () => void
|
||||||
|
handleClickBucketName: () => void
|
||||||
}
|
}
|
||||||
|
|
||||||
const Bucket = ({
|
const Bucket = ({
|
||||||
|
bucketName,
|
||||||
handleBackToBucketList,
|
handleBackToBucketList,
|
||||||
|
handleClickBucketName,
|
||||||
|
disabled = false,
|
||||||
|
isActive = false,
|
||||||
|
showSeparator = true,
|
||||||
}: BucketProps) => {
|
}: BucketProps) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
|
const handleClickItem = useCallback(() => {
|
||||||
|
if (!disabled)
|
||||||
|
handleClickBucketName()
|
||||||
|
}, [disabled, handleClickBucketName])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -26,6 +41,19 @@ const Bucket = ({
|
|||||||
</button>
|
</button>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<span className='system-xs-regular text-divider-deep'>/</span>
|
<span className='system-xs-regular text-divider-deep'>/</span>
|
||||||
|
<button
|
||||||
|
type='button'
|
||||||
|
className={cn(
|
||||||
|
'rounded-md px-[5px] py-1',
|
||||||
|
isActive ? 'system-sm-medium text-text-secondary' : 'system-sm-regular text-text-tertiary',
|
||||||
|
!disabled && 'hover:bg-state-base-hover',
|
||||||
|
)}
|
||||||
|
disabled={disabled}
|
||||||
|
onClick={handleClickItem}
|
||||||
|
>
|
||||||
|
{bucketName}
|
||||||
|
</button>
|
||||||
|
{showSeparator && <span className='system-xs-regular text-divider-deep'>/</span>}
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,12 @@ const Breadcrumbs = ({
|
|||||||
const showSearchResult = !!keywords && searchResultsLength > 0
|
const showSearchResult = !!keywords && searchResultsLength > 0
|
||||||
const isRoot = prefix.length === 0 && bucket === ''
|
const isRoot = prefix.length === 0 && bucket === ''
|
||||||
|
|
||||||
|
const displayBreadcrumbNum = useMemo(() => {
|
||||||
|
const num = isInPipeline ? 2 : 3
|
||||||
|
return bucket ? num - 1 : num
|
||||||
|
}, [isInPipeline, bucket])
|
||||||
|
|
||||||
const breadcrumbs = useMemo(() => {
|
const breadcrumbs = useMemo(() => {
|
||||||
const displayBreadcrumbNum = isInPipeline ? 2 : 3
|
|
||||||
const prefixToDisplay = prefix.slice(0, displayBreadcrumbNum - 1)
|
const prefixToDisplay = prefix.slice(0, displayBreadcrumbNum - 1)
|
||||||
const collapsedBreadcrumbs = prefix.slice(displayBreadcrumbNum - 1, prefix.length - 1)
|
const collapsedBreadcrumbs = prefix.slice(displayBreadcrumbNum - 1, prefix.length - 1)
|
||||||
return {
|
return {
|
||||||
@ -35,7 +39,7 @@ const Breadcrumbs = ({
|
|||||||
collapsedBreadcrumbs,
|
collapsedBreadcrumbs,
|
||||||
lastBreadcrumb: prefix[prefix.length - 1],
|
lastBreadcrumb: prefix[prefix.length - 1],
|
||||||
}
|
}
|
||||||
}, [isInPipeline, prefix])
|
}, [displayBreadcrumbNum, prefix])
|
||||||
|
|
||||||
const handleBackToBucketList = useCallback(() => {
|
const handleBackToBucketList = useCallback(() => {
|
||||||
setFileList([])
|
setFileList([])
|
||||||
@ -44,6 +48,12 @@ const Breadcrumbs = ({
|
|||||||
setPrefix([])
|
setPrefix([])
|
||||||
}, [setBucket, setFileList, setPrefix, setSelectedFileList])
|
}, [setBucket, setFileList, setPrefix, setSelectedFileList])
|
||||||
|
|
||||||
|
const handleClickBucketName = useCallback(() => {
|
||||||
|
setFileList([])
|
||||||
|
setSelectedFileList([])
|
||||||
|
setPrefix([])
|
||||||
|
}, [setFileList, setPrefix, setSelectedFileList])
|
||||||
|
|
||||||
const handleClickBreadcrumb = useCallback((index: number) => {
|
const handleClickBreadcrumb = useCallback((index: number) => {
|
||||||
const newPrefix = breadcrumbs.prefixBreadcrumbs.slice(0, index - 1)
|
const newPrefix = breadcrumbs.prefixBreadcrumbs.slice(0, index - 1)
|
||||||
setFileList([])
|
setFileList([])
|
||||||
@ -69,7 +79,14 @@ const Breadcrumbs = ({
|
|||||||
{!showSearchResult && !isRoot && (
|
{!showSearchResult && !isRoot && (
|
||||||
<div className='flex items-center gap-x-0.5'>
|
<div className='flex items-center gap-x-0.5'>
|
||||||
{bucket && (
|
{bucket && (
|
||||||
<Bucket handleBackToBucketList={handleBackToBucketList} />
|
<Bucket
|
||||||
|
bucketName={bucket}
|
||||||
|
handleBackToBucketList={handleBackToBucketList}
|
||||||
|
handleClickBucketName={handleClickBucketName}
|
||||||
|
isActive={prefix.length === 0}
|
||||||
|
disabled={prefix.length === 0}
|
||||||
|
showSeparator={prefix.length > 0}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
{!breadcrumbs.needCollapsed && (
|
{!breadcrumbs.needCollapsed && (
|
||||||
<>
|
<>
|
||||||
|
@ -102,11 +102,12 @@ const OnlineDrive = ({
|
|||||||
draft.splice(index, 1)
|
draft.splice(index, 1)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
if (isInPipeline && draft.length >= 1) return
|
||||||
draft.push(file.key)
|
draft.push(file.key)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
setSelectedFileList(newSelectedFileList)
|
setSelectedFileList(newSelectedFileList)
|
||||||
}, [selectedFileList, setSelectedFileList])
|
}, [isInPipeline, selectedFileList, setSelectedFileList])
|
||||||
|
|
||||||
const handleOpenFolder = useCallback((file: OnlineDriveFile) => {
|
const handleOpenFolder = useCallback((file: OnlineDriveFile) => {
|
||||||
if (file.type === OnlineDriveFileType.file) return
|
if (file.type === OnlineDriveFileType.file) return
|
||||||
@ -115,10 +116,9 @@ const OnlineDrive = ({
|
|||||||
setBucket(file.displayName)
|
setBucket(file.displayName)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const key = file.displayName.endsWith('/') ? file.displayName.slice(0, -1) : file.displayName
|
const displayName = file.displayName.endsWith('/') ? file.displayName.slice(0, -1) : file.displayName
|
||||||
const newPrefix = produce(prefix, (draft) => {
|
const newPrefix = produce(prefix, (draft) => {
|
||||||
const newList = key.split('/')
|
draft.push(displayName)
|
||||||
draft.push(...newList)
|
|
||||||
})
|
})
|
||||||
setPrefix(newPrefix)
|
setPrefix(newPrefix)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user