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.name}
+
+
+ {item.type} +
+
+ ) + })} +
+
+
+ +
New Metadata
+
+
+
+
Manage
+ +
+
+
+ ) +} +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 +}