refactor: Enhance Bucket and Breadcrumbs components; improve event handling and add button for bucket name

This commit is contained in:
twwu 2025-07-04 17:55:30 +08:00
parent d44af3ec46
commit e67a19b26b
3 changed files with 53 additions and 8 deletions

View File

@ -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>}
</> </>
) )
} }

View File

@ -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 && (
<> <>

View File

@ -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)
} }