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,