Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions frontend/src/i18n/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
"createdAt": "Created At",
"updatedAt": "Updated At"
},
"columnSettings": "Column Settings",
"messages": {
"refreshFailed": "Refresh failed"
}
Expand Down
1 change: 1 addition & 0 deletions frontend/src/i18n/locales/zh/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
"createdAt": "创建时间",
"updatedAt": "更新时间"
},
"columnSettings": "列设置",
"messages": {
"refreshFailed": "刷新失败"
}
Expand Down
247 changes: 159 additions & 88 deletions frontend/src/pages/DataCollection/Home/TemplateManagement.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { App, Card, Table, Tag } from "antd";
import { App, Card, Table, Tag, Dropdown, Button } from "antd";
import type { ColumnsType } from "antd/es/table";
import type { MenuProps } from "antd";
import { SearchControls } from "@/components/SearchControls";
import useFetchData from "@/hooks/useFetchData";
import { queryDataXTemplatesUsingGet } from "../collection.apis";
import { formatDateTime } from "@/utils/unit";
import { useTranslation } from "react-i18next";
import { SettingOutlined } from "@ant-design/icons";
import { useState, useMemo } from "react";

type CollectionTemplate = {
id: string;
Expand All @@ -19,9 +22,24 @@ type CollectionTemplate = {
updatedAt?: string;
};

// 所有可用的列配置
const ALL_COLUMNS = {
name: 'dataCollection.templateManagement.columns.templateName',
builtIn: 'dataCollection.templateManagement.columns.templateType',
source: 'dataCollection.templateManagement.columns.source',
target: 'dataCollection.templateManagement.columns.target',
description: 'dataCollection.templateManagement.columns.description',
createdAt: 'dataCollection.templateManagement.columns.createdAt',
updatedAt: 'dataCollection.templateManagement.columns.updatedAt',
} as const;

// 默认隐藏的列
const DEFAULT_HIDDEN_COLUMNS = ['createdAt', 'updatedAt'];

export default function TemplateManagement() {
const { message } = App.useApp();
const { t } = useTranslation();
const [hiddenColumns, setHiddenColumns] = useState<Set<string>>(new Set(DEFAULT_HIDDEN_COLUMNS));

const filters = [
{
Expand Down Expand Up @@ -62,96 +80,149 @@ export default function TemplateManagement() {
0
);

const columns: ColumnsType<CollectionTemplate> = [
{
title: t("dataCollection.templateManagement.columns.templateName"),
dataIndex: "name",
key: "name",
fixed: "left",
width: 200,
ellipsis: true,
},
{
title: t("dataCollection.templateManagement.columns.templateType"),
dataIndex: "builtIn",
key: "builtIn",
width: 120,
render: (v?: boolean) => (
<Tag color={v ? "blue" : "default"}>
{v
? t("dataCollection.templateManagement.filters.builtIn")
: t("dataCollection.templateManagement.filters.custom")}
</Tag>
),
},
{
title: t("dataCollection.templateManagement.columns.source"),
key: "source",
width: 220,
ellipsis: true,
render: (_: any, record: CollectionTemplate) => (
<span>{`${record.sourceType} / ${record.sourceName}`}</span>
),
},
{
title: t("dataCollection.templateManagement.columns.target"),
key: "target",
width: 220,
ellipsis: true,
render: (_: any, record: CollectionTemplate) => (
<span>{`${record.targetType} / ${record.targetName}`}</span>
),
},
{
title: t("dataCollection.templateManagement.columns.description"),
dataIndex: "description",
key: "description",
width: 260,
ellipsis: true,
render: (v?: string) => v || t("common.placeholders.empty"),
},
{
title: t("dataCollection.templateManagement.columns.createdAt"),
dataIndex: "createdAt",
key: "createdAt",
width: 160,
},
{
title: t("dataCollection.templateManagement.columns.updatedAt"),
dataIndex: "updatedAt",
key: "updatedAt",
width: 160,
},
];
// 根据隐藏列的状态动态生成 columns
const columns: ColumnsType<CollectionTemplate> = useMemo(() => {
const allColumns: ColumnsType<CollectionTemplate> = [
{
title: t("dataCollection.templateManagement.columns.templateName"),
dataIndex: "name",
key: "name",
fixed: "left",
width: 200,
ellipsis: true,
},
{
title: t("dataCollection.templateManagement.columns.templateType"),
dataIndex: "builtIn",
key: "builtIn",
width: 120,
render: (v?: boolean) => (
<Tag color={v ? "blue" : "default"}>
{v
? t("dataCollection.templateManagement.filters.builtIn")
: t("dataCollection.templateManagement.filters.custom")}
</Tag>
),
},
{
title: t("dataCollection.templateManagement.columns.source"),
key: "source",
width: 220,
ellipsis: true,
render: (_: any, record: CollectionTemplate) => {
// 如果 sourceType 和 sourceName 相同,只显示一个
if (record.sourceType === record.sourceName) {
return <span>{record.sourceType}</span>;
}
return <span>{`${record.sourceType} / ${record.sourceName}`}</span>;
},
},
{
title: t("dataCollection.templateManagement.columns.target"),
key: "target",
width: 220,
ellipsis: true,
render: (_: any, record: CollectionTemplate) => {
// 如果 targetType 和 targetName 相同,只显示一个
if (record.targetType === record.targetName) {
return <span>{record.targetType}</span>;
}
return <span>{`${record.targetType} / ${record.targetName}`}</span>;
},
},
{
title: t("dataCollection.templateManagement.columns.description"),
dataIndex: "description",
key: "description",
width: 260,
ellipsis: true,
render: (v?: string) => v || t("common.placeholders.empty"),
},
{
title: t("dataCollection.templateManagement.columns.createdAt"),
dataIndex: "createdAt",
key: "createdAt",
width: 160,
},
{
title: t("dataCollection.templateManagement.columns.updatedAt"),
dataIndex: "updatedAt",
key: "updatedAt",
width: 160,
},
];

// 过滤掉隐藏的列
return allColumns.filter(col => !hiddenColumns.has(col.key as string));
}, [t, hiddenColumns]);

// 列显示切换处理
const handleColumnToggle = (columnKey: string) => {
setHiddenColumns(prev => {
const newHidden = new Set(prev);
if (newHidden.has(columnKey)) {
newHidden.delete(columnKey);
} else {
newHidden.add(columnKey);
}
return newHidden;
});
};

// 列选择菜单
const columnMenuItems: MenuProps['items'] = Object.entries(ALL_COLUMNS).map(([key, label]) => ({
key,
label: t(label),
}));

// 获取显示的列(非隐藏列)
const visibleColumns = Object.keys(ALL_COLUMNS).filter(key => !hiddenColumns.has(key));

return (
<div className="space-y-4">
<SearchControls
searchTerm={searchParams.keyword}
onSearchChange={(newSearchTerm) =>
setSearchParams((prev) => ({
...prev,
keyword: newSearchTerm,
current: 1,
}))
}
searchPlaceholder={t("dataCollection.templateManagement.filters.searchPlaceholder")}
filters={filters}
selectedFilters={searchParams.filter}
onFiltersChange={handleFiltersChange}
showViewToggle={false}
onClearFilters={() =>
setSearchParams((prev) => ({
...prev,
filter: { ...prev.filter, builtIn: [] },
current: 1,
keyword: "",
}))
}
onReload={() => {
fetchData().catch(() => message.error(t("dataCollection.templateManagement.messages.refreshFailed")));
}}
/>
<div className="flex items-center justify-between">
<SearchControls
searchTerm={searchParams.keyword}
onSearchChange={(newSearchTerm) =>
setSearchParams((prev) => ({
...prev,
keyword: newSearchTerm,
current: 1,
}))
}
searchPlaceholder={t("dataCollection.templateManagement.filters.searchPlaceholder")}
filters={filters}
selectedFilters={searchParams.filter}
onFiltersChange={handleFiltersChange}
showViewToggle={false}
showReload={true}
onClearFilters={() =>
setSearchParams((prev) => ({
...prev,
filter: { ...prev.filter, builtIn: [] },
current: 1,
keyword: "",
}))
}
onReload={() => {
fetchData().catch(() => message.error(t("dataCollection.templateManagement.messages.refreshFailed")));
}}
className="flex-1"
/>
<Dropdown
menu={{
items: columnMenuItems,
selectable: true,
multiple: true,
selectedKeys: visibleColumns,
onClick: ({ key }) => handleColumnToggle(key as string),
}}
>
<Button icon={<SettingOutlined />}>
{t("dataCollection.templateManagement.columnSettings")}
</Button>
</Dropdown>
</div>

<Card>
<Table
Expand Down
13 changes: 0 additions & 13 deletions scripts/db/data-collection-init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -184,19 +184,6 @@ INSERT INTO t_dc_collection_templates (
'system',
'system'
),
(
'3',
'MYSQL归集模板',
'将MYSQL数据库中的数据以csv文件的形式归集到DataMate平台上。',
'mysqlreader',
'mysqlreader',
'txtfilewriter',
'txtfilewriter',
'{"parameter": {}, "reader": {"username": {"name": "用户名","description": "数据库的用户名。","type": "input", "required": true, "index": 2}, "password": {"name": "密码","description": "数据库的密码。","type": "password", "required": true, "index": 3}, "connection": {"name": "数据库连接信息", "description": "数据库连接信息。", "type": "multipleList", "size": 1, "index": 1, "properties": {"jdbcUrl": {"type": "inputList", "name": "数据库连接", "description": "数据库连接url。", "required": true, "index": 1}, "querySql": {"type": "inputList", "name": "查询sql", "description": "输入符合语法的sql查询语句。", "required": true, "index": 2}}}}, "writer": {"header": {"name": "列名","description": "查询结果的列名,最终会体现为csv文件的表头。","type": "selectTag", "required": false}}}',
TRUE,
'system',
'system'
),
(
'4',
'StarRocks归集模板',
Expand Down
Loading