diff --git a/web/app/(commonLayout)/datasets/Container.tsx b/web/app/(commonLayout)/datasets/Container.tsx
index 331cfe4a45..9df1f5f524 100644
--- a/web/app/(commonLayout)/datasets/Container.tsx
+++ b/web/app/(commonLayout)/datasets/Container.tsx
@@ -21,6 +21,7 @@ import Input from '@/app/components/base/input'
import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development'
import CheckboxWithLabel from '@/app/components/datasets/create/website/base/checkbox-with-label'
import CreateModal from '@/app/components/datasets/metadata/create-metadata-modal'
+import SelectMetadataModal from '@/app/components/datasets/metadata/select-metadata-modal'
// Services
import { fetchDatasetApiBaseUrl } from '@/service/datasets'
@@ -84,7 +85,8 @@ const Container = () => {
return (
- open} hasBack onSave={(data) => { console.log(data) }} />
+ select} onSave={(data) => { console.log(data) }} />
+ add} hasBack onSave={(data) => { console.log(data) }} />
void
+ trigger: React.ReactNode
+ popupLeft?: number
+} & CreateContentProps
+
+enum Step {
+ select = 'select',
+ create = 'create',
+}
+
+const testMetadataList: MetadataItem[] = [
+ { id: '1', name: 'name1', type: DataType.string },
+ { id: '2', name: 'name2', type: DataType.number },
+ { id: '3', name: 'name3', type: DataType.time },
+]
+
+const SelectMetadataModal: FC = ({
+ trigger,
+ popupLeft = 4,
+ onSave,
+}) => {
+ const [open, setOpen] = useState(true)
+ const [step, setStep] = useState(Step.select)
+ return (
+
+ setOpen(!open)}
+ >
+ {trigger}
+
+
+ {step === Step.select ? (
+ setStep(Step.create)}
+ onManage={() => { }}
+ />
+ ) : (
+ setStep(Step.select)}
+ />
+ )}
+
+
+
+ )
+}
+export default React.memo(SelectMetadataModal)
diff --git a/web/app/components/datasets/metadata/select-metadata.tsx b/web/app/components/datasets/metadata/select-metadata.tsx
new file mode 100644
index 0000000000..7c6a929182
--- /dev/null
+++ b/web/app/components/datasets/metadata/select-metadata.tsx
@@ -0,0 +1,73 @@
+'use client'
+import type { FC } from 'react'
+import React, { useState } from 'react'
+import { DataType } from './types'
+import type { MetadataItem } from './types'
+import SearchInput from '../../base/search-input'
+import { RiAddLine, RiArrowRightUpLine, RiHashtag, RiTextSnippet, RiTimeLine } from '@remixicon/react'
+
+type Props = {
+ list: MetadataItem[]
+ onSelect: (data: any) => void
+ onNew: () => void
+ onManage: () => void
+}
+
+const getIcon = (type: DataType) => {
+ return ({
+ [DataType.string]: RiTextSnippet,
+ [DataType.number]: RiHashtag,
+ [DataType.time]: RiTimeLine,
+ }[type] || RiTextSnippet)
+}
+
+const SelectMetadata: FC = ({
+ list,
+ onSelect,
+ onNew,
+ onManage,
+}) => {
+ const [query, setQuery] = useState('')
+ return (
+
+
+
+ {list.map((item) => {
+ const Icon = getIcon(item.type)
+ return (
+
onSelect(item)}
+ >
+
+
+ {item.type}
+
+
+ )
+ })}
+
+
+
+ )
+}
+export default React.memo(SelectMetadata)
diff --git a/web/app/components/datasets/metadata/types.ts b/web/app/components/datasets/metadata/types.ts
index fe60f237c9..5d58c1995c 100644
--- a/web/app/components/datasets/metadata/types.ts
+++ b/web/app/components/datasets/metadata/types.ts
@@ -3,3 +3,9 @@ export enum DataType {
number = 'number',
time = 'time',
}
+
+export type MetadataItem = {
+ id: string
+ type: DataType
+ name: string
+}