diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/index.tsx new file mode 100644 index 0000000000..8467281637 --- /dev/null +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/index.tsx @@ -0,0 +1,61 @@ +import React, { useCallback, useState } from 'react' +import { + PortalToFollowElem, + PortalToFollowElemContent, + PortalToFollowElemTrigger, +} from '@/app/components/base/portal-to-follow-elem' +import { RiMoreFill } from '@remixicon/react' +import cn from '@/utils/classnames' +import Menu from './menu' + +type DropdownProps = { + startIndex: number + breadcrumbs: string[] + onBreadcrumbClick: (index: number) => void +} + +const Dropdown = ({ + startIndex, + breadcrumbs, + onBreadcrumbClick, +}: DropdownProps) => { + const [open, setOpen] = useState(false) + + const handleTrigger = useCallback(() => { + setOpen(prev => !prev) + }, []) + + return ( + + + + + + + + / + + ) +} + +export default React.memo(Dropdown) diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/item.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/item.tsx new file mode 100644 index 0000000000..ead587b726 --- /dev/null +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/item.tsx @@ -0,0 +1,28 @@ +import React, { useCallback } from 'react' + +type ItemProps = { + name: string + index: number + onBreadcrumbClick: (index: number) => void +} + +const Item = ({ + name, + index, + onBreadcrumbClick, +}: ItemProps) => { + const handleClick = useCallback(() => { + onBreadcrumbClick(index) + }, [index, onBreadcrumbClick]) + + return ( +
+ {name} +
+ ) +} + +export default React.memo(Item) diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/menu.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/menu.tsx new file mode 100644 index 0000000000..faf8e09c12 --- /dev/null +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/dropdown/menu.tsx @@ -0,0 +1,30 @@ +import React from 'react' +import Item from './item' + +type MenuProps = { + breadcrumbs: string[] + startIndex: number + onBreadcrumbClick: (index: number) => void +} + +const Menu = ({ + breadcrumbs, + startIndex, + onBreadcrumbClick, +}: MenuProps) => { + return ( +
+ {breadcrumbs.map((breadcrumb, index) => { + return ( + + ) + })} +
+ ) +} + +export default React.memo(Menu) diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/index.tsx index 8078faffa9..ffe443b8ab 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/index.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/header/breadcrumbs/index.tsx @@ -3,6 +3,7 @@ import { useTranslation } from 'react-i18next' import { useDataSourceStore } from '../../../../store' import Bucket from './bucket' import BreadcrumbItem from './item' +import Dropdown from './dropdown' type BreadcrumbsProps = { prefix: string[] @@ -55,11 +56,11 @@ const Breadcrumbs = ({ }, [setFileList, setPrefix, setSelectedFileList]) const handleClickBreadcrumb = useCallback((index: number) => { - const newPrefix = breadcrumbs.prefixBreadcrumbs.slice(0, index - 1) + const newPrefix = prefix.slice(0, index - 1) setFileList([]) setSelectedFileList([]) setPrefix(newPrefix) - }, [breadcrumbs.prefixBreadcrumbs, setFileList, setPrefix, setSelectedFileList]) + }, [prefix, setFileList, setPrefix, setSelectedFileList]) return (
@@ -106,6 +107,33 @@ const Breadcrumbs = ({ })} )} + {breadcrumbs.needCollapsed && ( + <> + {breadcrumbs.prefixBreadcrumbs.map((breadcrumb, index) => { + return ( + + ) + })} + + + + )}
)} diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx index 75067215f5..3674031f42 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx @@ -60,7 +60,7 @@ const OnlineDrive = ({ }, { onDataSourceNodeCompleted: (documentsData: DataSourceNodeCompletedResponse) => { - const newFileList = convertOnlineDriveDataToFileList(documentsData.data) + const newFileList = convertOnlineDriveDataToFileList(documentsData.data, prefix) setFileList([...fileList, ...newFileList]) setIsLoading(false) }, diff --git a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/utils.ts b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/utils.ts index 47286850f7..24c28618bd 100644 --- a/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/utils.ts +++ b/web/app/components/datasets/documents/create-from-pipeline/data-source/online-drive/utils.ts @@ -7,14 +7,18 @@ export const isFile = (path: string): boolean => { return filePathRegex.test(path) } -export const hasBuckets = (data: OnlineDriveData[]): boolean => { +export const isBucketListInitiation = (data: OnlineDriveData[], prefix: string[]): boolean => { + if (prefix.length > 0) return false return data.length > 1 || (data.length === 1 && data[0].files.length === 0) } -export const convertOnlineDriveDataToFileList = (data: OnlineDriveData[]): OnlineDriveFile[] => { +export const convertOnlineDriveDataToFileList = (data: OnlineDriveData[], prefix: string[]): OnlineDriveFile[] => { const fileList: OnlineDriveFile[] = [] - if (hasBuckets(data)) { + if (data.length === 0) + return fileList + + if (isBucketListInitiation(data, prefix)) { data.forEach((item) => { fileList.push({ key: item.bucket,