Skip to content

Commit a6d4b51

Browse files
committed
feat: enhance dataset management features with improved tag handling, download functionality, and UI updates
1 parent add6998 commit a6d4b51

File tree

10 files changed

+88
-55
lines changed

10 files changed

+88
-55
lines changed

frontend/src/components/AddTagPopover.tsx

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Button, Input, Popover, theme, Tag } from "antd";
1+
import { Button, Input, Popover, theme, Tag, Empty } from "antd";
22
import { PlusOutlined } from "@ant-design/icons";
33
import { useEffect, useMemo, useState } from "react";
44

@@ -70,24 +70,28 @@ export default function AddTagPopover({
7070
添加标签
7171
</h4>
7272
{/* Available Tags */}
73-
<div className="space-y-2">
74-
<h5 className="text-sm">选择现有标签</h5>
75-
<div className="max-h-32 overflow-y-auto space-y-1">
76-
{availableTags.map((tag) => (
77-
<span
78-
key={tag.id}
79-
className="h-7 w-full justify-start text-xs cursor-pointer flex items-center px-2 rounded hover:bg-gray-100"
80-
onClick={() => {
81-
onAddTag?.(tag.name);
82-
setShowPopover(false);
83-
}}
84-
>
85-
<PlusOutlined className="w-3 h-3 mr-1" />
86-
{tag.name}
87-
</span>
88-
))}
73+
{availableTags?.length ? (
74+
<div className="space-y-2">
75+
<h5 className="text-sm">选择现有标签</h5>
76+
<div className="max-h-32 overflow-y-auto space-y-1">
77+
{availableTags.map((tag) => (
78+
<span
79+
key={tag.id}
80+
className="h-7 w-full justify-start text-xs cursor-pointer flex items-center px-2 rounded hover:bg-gray-100"
81+
onClick={() => {
82+
onAddTag?.(tag.name);
83+
setShowPopover(false);
84+
}}
85+
>
86+
<PlusOutlined className="w-3 h-3 mr-1" />
87+
{tag.name}
88+
</span>
89+
))}
90+
</div>
8991
</div>
90-
</div>
92+
) : (
93+
<Empty description="没有可用标签,请先创建标签。" />
94+
)}
9195

9296
{/* Create New Tag */}
9397
<div className="space-y-2 border-t border-gray-100 pt-3">

frontend/src/components/DetailHeader.tsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ function DetailHeader<T>({
103103
<Dropdown
104104
key={op.key}
105105
menu={{
106-
items: op.items as ItemType[],
107-
onClick: op.onMenuClick,
106+
items: op?.items as ItemType[],
107+
onClick: op?.onMenuClick,
108108
}}
109109
>
110110
<Tooltip title={op.label}>
@@ -115,16 +115,7 @@ function DetailHeader<T>({
115115
}
116116
return (
117117
<Tooltip key={op.key} title={op.label}>
118-
<Button
119-
key={op.key}
120-
onClick={op.onClick}
121-
className={
122-
op.danger
123-
? "text-red-600 border-red-200 bg-transparent"
124-
: ""
125-
}
126-
icon={op.icon}
127-
/>
118+
<Button {...op} />
128119
</Tooltip>
129120
);
130121
})}

frontend/src/pages/DataCleansing/Home/components/TaskList.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export default function TaskList() {
6565
fetchData();
6666
};
6767

68-
const taskOperations = (record) => {
68+
const taskOperations = (record: CleansingTask) => {
6969
const isRunning = record.status?.value === TaskStatus.RUNNING;
7070
const showStart = [
7171
TaskStatus.PENDING,
@@ -91,7 +91,8 @@ export default function TaskList() {
9191
{
9292
key: "delete",
9393
label: "删除",
94-
icon: <DeleteOutlined style={{ color: "#f5222d" }} />,
94+
danger: true,
95+
icon: <DeleteOutlined />,
9596
onClick: deleteTask, // implement delete logic
9697
},
9798
];
@@ -106,6 +107,13 @@ export default function TaskList() {
106107
width: 150,
107108
ellipsis: true,
108109
},
110+
{
111+
title: "任务ID",
112+
dataIndex: "id",
113+
key: "id",
114+
width: 150,
115+
ellipsis: true,
116+
},
109117
{
110118
title: "源数据集",
111119
dataIndex: "srcDatasetId",
@@ -231,6 +239,7 @@ export default function TaskList() {
231239
<Button
232240
type="text"
233241
icon={op.icon}
242+
danger={op?.danger}
234243
onClick={() => op.onClick(record)}
235244
/>
236245
</Tooltip>

frontend/src/pages/DataCleansing/Home/components/TemplateList.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ export default function TemplateList() {
3131
{
3232
key: "delete",
3333
label: "删除模板",
34-
icon: <DeleteOutlined style={{ color: "#f5222d" }} />,
34+
danger: true,
35+
icon: <DeleteOutlined />,
3536
onClick: (template: CleansingTemplate) => deleteTemplate(template), // 可实现删除逻辑
3637
},
3738
];

frontend/src/pages/DataManagement/Create/CreateDataset.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ export default function DatasetCreate() {
2727
files: undefined,
2828
};
2929
try {
30-
await createDatasetUsingPost(params);
30+
const { data } = await createDatasetUsingPost(params);
3131
message.success(`数据集创建成功`);
32-
navigate("/data/management");
32+
navigate("/data/management/detail/" + data.id);
3333
} catch (error) {
3434
console.error(error);
3535
message.error("数据集创建失败,请重试");

frontend/src/pages/DataManagement/Create/EditDataset.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from "../dataset.api";
66
import { useEffect, useState } from "react";
77
import { Dataset, DatasetType } from "../dataset.model";
8-
import { App, Button, Drawer, Form, Modal } from "antd";
8+
import { App, Button, Form, Modal } from "antd";
99

1010
export default function EditDataset({
1111
open,
@@ -16,7 +16,7 @@ export default function EditDataset({
1616
open: boolean;
1717
data: Dataset | null;
1818
onClose: () => void;
19-
onRefresh?: () => void;
19+
onRefresh?: (showMessage?: boolean) => void;
2020
}) {
2121
const [form] = Form.useForm();
2222
const { message } = App.useApp();
@@ -60,7 +60,7 @@ export default function EditDataset({
6060
await updateDatasetByIdUsingPut(data?.id, params);
6161
onClose();
6262
message.success("数据集更新成功");
63-
onRefresh?.();
63+
onRefresh?.(false);
6464
} catch (error) {
6565
console.error(error);
6666
message.error("数据集更新失败,请重试");

frontend/src/pages/DataManagement/Detail/DatasetDetail.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
DownloadOutlined,
66
UploadOutlined,
77
EditOutlined,
8+
DeleteOutlined,
89
} from "@ant-design/icons";
910
import DetailHeader from "@/components/DetailHeader";
1011
import { mapDataset, datasetTypeMap } from "../dataset.const";
@@ -77,8 +78,8 @@ export default function DatasetDetail() {
7778
if (showMessage) message.success({ content: "数据刷新成功" });
7879
};
7980

80-
const handleExportFormat = async ({ type }) => {
81-
await downloadFile(dataset.id, type, `${dataset.name}-${type}.zip`);
81+
const handleDownload = async () => {
82+
await downloadFile(dataset.id);
8283
message.success("文件下载成功");
8384
};
8485

@@ -153,14 +154,23 @@ export default function DatasetDetail() {
153154
// { key: "csv", label: "CSV 格式", icon: <FileTextOutlined /> },
154155
// { key: "coco", label: "COCO 格式", icon: <FileImageOutlined /> },
155156
// ],
156-
onMenuClick: handleExportFormat,
157+
onClick: () => handleDownload(),
157158
},
158159
{
159160
key: "refresh",
160161
label: "刷新",
161162
icon: <ReloadOutlined />,
162163
onClick: handleRefresh,
163164
},
165+
{
166+
key: "delete",
167+
label: "删除",
168+
danger: true,
169+
icon: <DeleteOutlined />,
170+
onClick: () => {
171+
console.log("delete dataset");
172+
},
173+
}
164174
];
165175

166176
return (

frontend/src/pages/DataManagement/Home/DataManagement.tsx

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
EditOutlined,
55
DeleteOutlined,
66
PlusOutlined,
7+
UploadOutlined,
78
} from "@ant-design/icons";
89
import TagManager from "@/components/TagManagement";
910
import { Link, useNavigate } from "react-router";
@@ -25,14 +26,15 @@ import {
2526
} from "../dataset.api";
2627
import { formatBytes } from "@/utils/unit";
2728
import EditDataset from "../Create/EditDataset";
29+
import ImportConfiguration from "../Detail/components/ImportConfiguration";
2830

2931
export default function DatasetManagementPage() {
3032
const navigate = useNavigate();
3133
const { message } = App.useApp();
3234
const [viewMode, setViewMode] = useState<"card" | "list">("card");
3335
const [editDatasetOpen, setEditDatasetOpen] = useState(false);
3436
const [currentDataset, setCurrentDataset] = useState<Dataset | null>(null);
35-
37+
const [showUploadDialog, setShowUploadDialog] = useState(false);
3638
const [statisticsData, setStatisticsData] = useState<any>({
3739
count: {},
3840
size: {},
@@ -131,6 +133,11 @@ export default function DatasetManagementPage() {
131133
message.success("数据删除成功");
132134
};
133135

136+
const handleImportData = (dataset: Dataset) => {
137+
setCurrentDataset(dataset);
138+
setShowUploadDialog(true);
139+
};
140+
134141
useEffect(() => {
135142
fetchStatistics();
136143
}, []);
@@ -141,11 +148,18 @@ export default function DatasetManagementPage() {
141148
label: "编辑",
142149
icon: <EditOutlined />,
143150
onClick: (item: Dataset) => {
144-
console.log(item);
145151
setCurrentDataset(item);
146152
setEditDatasetOpen(true);
147153
},
148154
},
155+
{
156+
key: "import",
157+
label: "导入",
158+
icon: <UploadOutlined />,
159+
onClick: (item: Dataset) => {
160+
handleImportData(item);
161+
},
162+
},
149163
{
150164
key: "download",
151165
label: "下载",
@@ -343,7 +357,19 @@ export default function DatasetManagementPage() {
343357
<EditDataset
344358
open={editDatasetOpen}
345359
data={currentDataset}
346-
onClose={() => setEditDatasetOpen(false)}
360+
onClose={() => {
361+
setCurrentDataset(null);
362+
setEditDatasetOpen(false);
363+
}}
364+
onRefresh={fetchData}
365+
/>
366+
<ImportConfiguration
367+
data={currentDataset}
368+
open={showUploadDialog}
369+
onClose={() => {
370+
setCurrentDataset(null);
371+
setShowUploadDialog(false);
372+
}}
347373
onRefresh={fetchData}
348374
/>
349375
</div>

frontend/src/pages/DataManagement/dataset.api.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,8 @@ export function uploadDatasetFileUsingPost(id: string | number, data: any) {
6161
return post(`/api/data-management/datasets/${id}/files`, data);
6262
}
6363

64-
export function downloadFile(
65-
id: string | number,
66-
fileId: string | number,
67-
filename?: string
68-
) {
69-
return download(
70-
`/api/data-management/datasets/${id}/files/download`,
71-
null,
72-
filename
73-
);
64+
export function downloadFile(id: string | number) {
65+
return download(`/api/data-management/datasets/${id}/files/download`);
7466
}
7567

7668
// 删除数据集文件

frontend/src/pages/DataManagement/dataset.const.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ export const datasetStatusMap = {
186186

187187
export const dataSourceMap: Record<string, { label: string; value: string }> = {
188188
[DataSource.UPLOAD]: { label: "本地上传", value: DataSource.UPLOAD },
189-
[DataSource.COLLECTION]: { label: "本地归集 ", value: DataSource.COLLECTION },
189+
// [DataSource.COLLECTION]: { label: "本地归集 ", value: DataSource.COLLECTION },
190190
// [DataSource.DATABASE]: { label: "数据库导入", value: DataSource.DATABASE },
191191
// [DataSource.NAS]: { label: "NAS导入", value: DataSource.NAS },
192192
// [DataSource.OBS]: { label: "OBS导入", value: DataSource.OBS },

0 commit comments

Comments
 (0)