修复前端部分bug

This commit is contained in:
data-infra 2024-02-04 13:55:08 +08:00
parent 354d58806b
commit bcaf169c8e
9 changed files with 678 additions and 9 deletions

View File

@ -106,8 +106,8 @@ cd myapp/vision && yarn && yarn build
##### 环境准备
- https://nodejs.org/en/download/ 进入nodejs官网选择下载LTS长期支持版本
- 然后在官网下载安装好LTS版本之后输入`npm install -g n`安装node版本管理器 https://www.npmjs.com/package/n ),最后输入`n 14.15.0`将node版本切换至14.x
- https://github.com/nodejs/Release 这里可以找到14.x等往期版本
- 然后在官网下载安装好LTS版本之后输入`npm install -g n`安装node版本管理器 https://www.npmjs.com/package/n ),最后输入`n 16.15.0`将node版本切换至16.x
- https://github.com/nodejs/Release 这里可以找到16.x等往期版本
以主要前端项目`myapp/frontend`为例,到这里前端开发环境已经准备好了

View File

@ -355,6 +355,7 @@ const AppWrapper = (props: IProps) => {
</div>
</div>
<div className="d-f ac plr16 h100">
{
headerConfig.map(config => {
if (config.icon) {

View File

@ -8,6 +8,7 @@ import InputSearch from '../InputSearch/InputSearch';
import 'moment/locale/zh-cn';
import locale from 'antd/es/date-picker/locale/zh_CN';
import { useTranslation } from 'react-i18next';
import FileUploadPlus from '../FileUploadPlus/FileUploadPlus';
interface IProps {
primaryKey?: string
@ -51,7 +52,7 @@ export interface IDynamicFormConfigItem {
data: Record<string, any>
}
export type TDynamicFormType = 'input' | 'textArea' | 'select' | 'datePicker' | 'rangePicker' | 'radio' | 'checkout' | 'match-input' | 'input-select'
export type TDynamicFormType = 'input' | 'textArea' | 'select' | 'datePicker' | 'rangePicker' | 'radio' | 'checkout' | 'match-input' | 'input-select' | 'fileUpload'
export function calculateId(strList: string[]): number {
const str2Num = (str: string) => {
@ -167,6 +168,20 @@ export default function DynamicForm(props: IProps) {
setCurrent(current - 1);
};
const renderFileUpload = (config: IDynamicFormConfigItem, itemProps: Record<string, any>) => {
return <Form.Item
key={`dynamicForm_${config.name}`}
label={config.label}
name={config.name}
rules={config.rules}
initialValue={config.defaultValue}
extra={config.description ? <span dangerouslySetInnerHTML={{ __html: config.description }}></span> : null}
{...itemProps}
>
<FileUploadPlus />
</Form.Item>
}
const renderInput = (config: IDynamicFormConfigItem, itemProps: Record<string, any>) => {
// const rules: Rule[] = [
// { required: config.required, message: `请输入${config.label}` },
@ -424,6 +439,8 @@ export default function DynamicForm(props: IProps) {
return renderRangePicker(item, itemProps)
case 'radio':
return renderRadio(item, itemProps)
case 'fileUpload':
return renderFileUpload(item, itemProps)
default:
return null
}
@ -550,10 +567,10 @@ export default function DynamicForm(props: IProps) {
</div>
</div>
</> : <div style={{ width: 680 }}>
{
renderFormItem(currentConfig || [])
}
</div>
{
renderFormItem(currentConfig || [])
}
</div>
}
</>
)

View File

@ -0,0 +1,19 @@
.image-card{
position: relative;
width: 103px;
height: 103px;
border: 1px dashed #cdcdcd;
.image-close{
position: absolute;
padding: 0 4px;
right: 0;
top: 0;
background-color: rgba(0, 0, 0, 0.5);
cursor: pointer;
}
}
.file-uploader{
width: auto;
}

View File

@ -0,0 +1,192 @@
import { AudioOutlined, CloseOutlined, DeleteColumnOutlined, DeleteFilled, DeleteOutlined, InboxOutlined, LoadingOutlined, PlusOutlined, VideoCameraAddOutlined } from '@ant-design/icons';
import { message } from 'antd';
import Upload, { RcFile, UploadChangeParam } from 'antd/lib/upload';
import { UploadFile } from 'antd/lib/upload/interface';
import React, { useEffect, useState } from 'react'
import './FileUploadPlus.less';
interface Iprops {
type?: TFileType
onChange?: (value: any) => void
value?: string[]
maxCount?: number
maxSize?: number
format?: string[]
}
type TFileType = 'file' | 'video' | 'audio'
export default function FileUploadPlus(props: Iprops) {
const [visableChangePhone, setVisableChangePhone] = useState(false);
const [fileLoading, setFileLoading] = useState(false);
const [imgUrl, setImgUrl] = useState('');
const [imageList, setImageList] = useState<string[]>([])
const [loading, setLoading] = useState(true);
const [fileList, setFileList] = useState<UploadFile[]>([])
// useEffect(() => {
// setFileList(props.value || [])
// }, [props.value])
function getBase64(img: any, callback: any) {
const reader = new FileReader();
reader.addEventListener('load', () => callback(reader.result));
reader.readAsDataURL(img);
}
function beforeUpload(file: RcFile) {
console.log('file', file);
const maxCount = props.maxCount || 1
if (fileList.length >= maxCount) {
message.error('超出文件数量限制');
return false
}
// 'image/jpeg' || 'video/mp4' || 'audio/mpeg'
const isFormatOk = props.format?.includes(file.type);
if (!isFormatOk) {
message.error('文件格式错误');
}
const isLt2M = file.size < (props.maxSize || 2 * 1024 * 1024);
if (!isLt2M) {
message.error('文件大小限制');
}
return isFormatOk && isLt2M;
}
const handleChange = (info: UploadChangeParam) => {
console.log(info);
if (info.file.status === 'uploading') {
setFileLoading(true);
return;
}
if (info.file.status === 'done') {
setFileLoading(false);
setFileList(info.fileList)
props.onChange && props.onChange(info.fileList)
}
if (info.file.status === "removed") {
setFileList(info.fileList)
props.onChange && props.onChange(info.fileList)
return;
}
};
const file2Bin = (file?: RcFile) => {
console.log('file2Bin', file);
return new Promise((resolve, reject) => {
if (file) {
let name = file.name.replace(/.+\./, '');
let filename = file.name;
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
resolve(reader.result)
}
} else {
reject(undefined)
}
})
}
//建立一个可存取到该file的url
function getObjectURL(file: any) {
var url = null;
if ((window as any).createObjectURL != undefined) { // basic
url = (window as any).createObjectURL(file);
} else if (window.URL != undefined) { // mozilla(firefox)
url = window.URL.createObjectURL(file);
} else if (window.webkitURL != undefined) { // webkit or chrome
url = window.webkitURL.createObjectURL(file);
}
return url;
}
const createMediaPreview = (file: UploadFile<any>, fileIndex: number, type: TFileType) => {
const url = getObjectURL(file)
const key = Math.random().toString(36).substring(2);
if (type === 'video') {
return <div className="p-r" key={key}>
<span
onClick={() => {
const currentFileList = [...fileList]
currentFileList.splice(fileIndex, 1)
setFileList(currentFileList)
props.onChange && props.onChange(currentFileList)
}}
className="d-il p-a plr8 ptb2 bg-fail"
style={{ top: 0, right: 0, borderBottomLeftRadius: 6, zIndex: 9 }}>
<DeleteOutlined style={{ color: '#fff' }} />
</span>
<video className="w100 mb8" src={url} controls></video>
</div>
} else if (type === 'audio') {
return <div className="d-f ac mb8" key={key}>
<audio className="w100 flex1" src={url} controls></audio>
<span
onClick={() => {
const currentFileList = [...fileList]
currentFileList.splice(fileIndex, 1)
setFileList(currentFileList)
props.onChange && props.onChange(currentFileList)
}}
className="d-il plr8 ptb2 bg-fail"
style={{ borderRadius: 6 }}>
<DeleteOutlined style={{ color: '#fff' }} />
</span>
</div>
}
return file
}
return (
<>
<div>
{
fileList.map((file, fileIndex) => {
return createMediaPreview(file, fileIndex, props.type || 'file')
})
}
</div>
<Upload.Dragger
// name="file"
fileList={fileList}
showUploadList={false}
customRequest={(options) => {
console.log(options.file);
const tarList = [...fileList, options.file as RcFile]
setFileList(tarList)
Promise.all(tarList.map((item: any) => file2Bin(item))).then(res => {
console.log(res)
props.onChange && props.onChange(res)
})
// getBase64(options.file, (imageUrl: string) => {
// // setImgUrl(imageUrl);
// const tarList = [...imageList, imageUrl]
// setImageList(tarList)
// setFileLoading(false);
// props.onChange && props.onChange(tarList)
// });
}}
beforeUpload={beforeUpload}
onChange={handleChange}
>
<p className="ant-upload-drag-icon">
{
(props.type === 'file' || !props.type) ? <InboxOutlined /> : null
}
{
props.type === 'video' ? <VideoCameraAddOutlined /> : null
}
{
props.type === 'audio' ? <AudioOutlined /> : null
}
</p>
<p className="ant-upload-text"></p>
</Upload.Dragger>
</>
)
}

View File

@ -0,0 +1,219 @@
const translation = {
"节点标签": "node tag",
"请选择key": "please select key",
"请填写key": "please fill in key",
"请填写value": "please fill in value",
"请选择": "select ",
"收起": "collapse",
"展开": "expand",
"查询": "query",
"添加": "add ",
"批量操作": "batch action",
"操作": "action",
"更多": "more",
"详情": "detail",
"修改": "edit",
"删除": "delete",
"批量": "batch ",
"共": "total ",
"条": " rows",
"条/页": " rows/page",
"批量导入数据": "import data",
"批量导出": "export data",
"注意csv逗号分隔": "Note: csv comma-separated",
"第一行为列的英文名": "the first line is the columns English name",
"下载导入模板": "download template",
"暂无数据": "no data",
"新查询": "new query",
"运行": "run",
"复制": "copy",
"结果": "result",
"子任务": "subtask",
"重试": "retry",
"准备开始": "begin",
"解析": "analysis",
"执行": "run",
"输出结果": "output",
"开始时间": "begin time",
"运行时长": "runtime duration",
"状态": "status",
"下载": "download",
"任务详情": "task detail",
"子任务内容": "sub task sql",
"任务信息": "task info",
"关闭": "close",
"下载结果": "download",
"选择分隔符": "select delimiter",
"正常模式": "normal",
"智能模式": "AI",
"AI智能生成": "AI Generation",
"帮助链接": "help",
"展开/关闭菜单": "collapse/expand",
"保存": "save",
"已保存": "saved",
"未保存": "unsaved",
"取消": "cancel",
"确定": "confirm",
"别名": "label",
"节点别名": "node label",
"描述": "describe",
"创建人": "creator",
"上次修改时间": "Last modified time",
"调度实例": "workflow",
"日志": "log",
"容器": "pod",
"定时记录": "cronjob",
"删除节点": "delete",
"监控": "monitor",
"任务模板": "template",
"模板描述": "describe",
"名称": "name",
"标签": "label",
"内存申请": "memory req",
"内存的资源使用限制示例1G10G 最大100G如需更多联系管理员": "Memory resource usage limit, example 1G, 10G, maximum 100G, contact administrator for more.",
"CPU申请": "CPU req",
"CPU的资源使用限制(单位核),示例 0.410最大50核如需更多联系管理员": "CPU resource usage limit (in units of cores), example 0.4, 10, maximum 50 cores, contact administrator for more.",
"GPU申请": "GPU req",
"gpu的资源使用限制(单位卡),示例:12训练任务每个容器独占整卡。申请具体的卡型号可以类似 1(V100),目前支持T4/V100/A100/VGPU": "GPU resource usage limit (in units of cards), example: 1, 2, training tasks occupy the entire card per container. To apply for specific card models, you can use something like 1(V100). Currently supports T4/V100/A100/VGPU.",
"RDMA申请": "RDMA req",
"RDMA的资源使用限制示例 0110填写方式咨询管理员": "RDMA resource usage limit, example 0, 1, 10, consult administrator for filling method.",
"超时中断": "timeout",
"task运行时长限制为0表示不限制(单位s)": "Task runtime limit, 0 means no limit (in seconds)",
"重试次数": "retry",
"task重试次数": "Task retry max count",
"是否跳过": "skip",
"是": "yes",
"否": "no",
"参数": "args ",
"用户中心": "user info",
"退出登录": "logout",
"安全设置": "security",
"用户列表": "user list",
"角色列表": "role list",
"用户统计": "user statistics",
"权限列表": "permissions list",
"视图列表": "view list",
"权限视图关系": "permissionsOnView",
"日志列表": "log list",
"数据查询": "sqllab",
"通用关系图": "pipeline",
"数据展示": "showdata",
"外链": "link",
"登录": "login",
"平台主要功能": "Main functions",
"新建流水线": "create pipeline",
"新手视频": "Beginners video",
"新人制作一个pipeline": "Create a pipeline for new users.",
"流水线": "pipeline",
"我的": "mine",
"协作": "collaboration",
"任务流": "pipeline",
"修改时间": "modified",
"项目组": "project",
"选择页数": "select page",
"上一页": "previous",
"下一页": "next",
"创建会话场景": "create chat",
"创建会话": "create chat",
"对话模型": "chat model",
"知识库": "knowledge",
"确认创建": "confirm",
"点击或者拖动文件到该区域上传数据集创建私有知识库": "click or drag the files to the area to upload the dataset to create a private knowledge base.",
"支持 txt/markdown/pdf/csv 格式文件,请不要上传敏感数据": "supporting txt/markdown/pdf/csv formats, please do not upload sensitive data.",
"清空当前会话场景": "clear the current conversation scene",
"设置当前场景,如模型,知识库等": "set the current scene, such as a model or knowledge base.",
"输入 / 调出提示Shift + Enter = 换行)": "input / Prompt (Shift + Enter = New line)",
"发送": "send",
"登录超时,需要重新登录": "login timeout, need to log in again",
"请输入": "please enter",
"请按正确的规则输入": "please enter according to the correct rules",
"请输入正确的长度": "please enter the correct length",
"点击前往": "click to go",
"请勿外传": "do not spread",
"秒": "second",
"分钟": "minute",
"小时": "hour",
"收藏": "favorite",
"确定收藏?": "confirm favorite?",
"确认收藏": "confirm favorite",
"取消收藏": "cancel favorite",
"确定取消收藏?": "confirm cancel favorite?",
"确认取消收藏": "confirm cancel favorite",
"操作成功": "operation successful",
"操作失败": "operation failed",
"用户没有修改权限": "user does not have modification permission",
"确定删除": "confirm deletion",
"确认删除": "confirm deletion",
"确认": "confirm",
"删除成功": "delete successful",
"删除失败": "delete failed",
"字段切换错误": "field switching error",
"filter解析异常": "filter parsing exception",
"请先选择": "please select first",
"导入成功": "import successful",
"导入失败": "import failed",
"成功": "success",
"失败": "failure",
"更新": "update",
"返回": "return",
"确认导出数据": "confirm export data",
"导出成功": "export successful",
"等等": "etc.",
"终止任务": "terminate task",
"终止成功": "termination successful",
"终止失败": "termination failed",
"结果查看": "view results",
"输入关键字(表名)搜索": "enter keyword (table name) to search",
"已成功复制到粘贴板": "successfully copied to clipboard",
"修改生命周期": "modify lifecycle",
"聚合节点": "aggregation node",
"剩余": "remaining",
"个节点(双击展开) + ": "nodes (double-click to expand) +",
"查询结果失败,尝试重新运行": "query result failed, try to run again",
"标签数目达到限制": "tag limit reached",
"点击确定完成提交": "click OK to complete the submission",
"增加一项": "add an item",
"上一步": "previous step",
"下一步": "next step",
"删除该项": "delete this item",
"请选择时间范围": "please select a time range",
"请选择时间": "please select a time",
"刷新列表": "refresh list",
"选择需要导出的列": "select the columns to export",
"全选": "select all",
"反选": "invert selection",
"获取列表失败": "failed to get list",
"获取流水线信息失败": "failed to get pipeline information",
"格式错误": "format error",
"流水线设置": "pipeline settings",
"英文名(字母、数字、- 组成)最长50个字符": "english name (letters, numbers, -), up to 50 characters",
"每个用户使用英文逗号分隔": "each user separated by an English comma",
"报警人": "alarm person",
"监控状态": "monitoring status",
"周期任务的时间设定 * * * * * 表示为 minute hour day month week": "crontab task * * * * * represents minute hour day month week",
"调度周期": "scheduling cycle",
"调度类型": "scheduling type",
"新建": "new",
"任务": "task",
"补录起点": "make up the starting point",
"过往依赖": "past dependencies",
"当前pipeline可同时运行的任务流实例数目": "the number of task flow instances that the current pipeline can run simultaneously",
"最大激活运行数": "maximum active run count",
"任务并行数": "task parallelism",
"pipeline中可同时运行的task数目": "number of tasks that can run simultaneously in the pipeline",
"流向图": "flow chart",
"全局环境变量": "global environment variables",
"为每个task都添加的公共参数": "common parameters added to each task",
"折叠": "collapse",
"暂无匹配": "No matches for now",
"搜索模板名称或描述": "search template name or description",
"配置文档": "configuration document",
"镜像":"images",
"版本": "version",
"项目设置": "setting",
"智能推荐下游节点":"Intelligent recommendation of downstream nodes",
"请先选择推荐节点":"Please select the recommended node first.",
"导出数据": "Export data"
}
export default translation

View File

@ -0,0 +1,219 @@
const translation = {
"节点标签": "节点标签",
"请选择key": "请选择key",
"请填写key": "请填写key",
"请填写value": "请填写value",
"请选择": "请选择",
"收起": "收起",
"展开": "展开",
"查询": "查询",
"添加": "添加",
"批量操作": "批量操作",
"操作": "操作",
"更多": "更多",
"详情": "详情",
"修改": "修改",
"删除": "删除",
"批量": "批量",
"共": "共",
"条": "条",
"条/页": "条/页",
"批量导入数据": "批量导入数据",
"批量导出": "批量导出",
"注意csv逗号分隔": "注意csv逗号分隔",
"第一行为列的英文名": "第一行为列的英文名",
"下载导入模板": "下载导入模板",
"暂无数据": "暂无数据",
"新查询": "新查询",
"运行": "运行",
"复制": "复制",
"结果": "结果",
"子任务": "子任务",
"重试": "重试",
"准备开始": "准备开始",
"解析": "解析",
"执行": "执行",
"输出结果": "输出结果",
"开始时间": "开始时间",
"运行时长": "运行时长",
"状态": "状态",
"下载": "下载",
"任务详情": "任务详情",
"子任务内容": "子任务内容",
"任务信息": "任务信息",
"关闭": "关闭",
"下载结果": "下载结果",
"选择分隔符": "选择分隔符",
"正常模式": "正常模式",
"智能模式": "智能模式",
"AI智能生成": "AI智能生成",
"帮助链接": "帮助链接",
"展开/关闭菜单": "展开/关闭菜单",
"保存": "保存",
"已保存": "已保存",
"未保存": "未保存",
"取消": "取消",
"确定": "确定",
"别名": "别名",
"节点别名": "节点别名",
"描述": "描述",
"创建人": "创建人",
"上次修改时间": "上次修改时间",
"调度实例": "调度实例",
"日志": "日志",
"容器": "容器",
"定时记录": "定时记录",
"删除节点": "删除节点",
"监控": "监控",
"任务模板": "任务模板",
"模板描述": "模板描述",
"名称": "名称",
"标签": "标签",
"内存申请": "内存申请",
"内存的资源使用限制示例1G10G 最大100G如需更多联系管理员": "内存的资源使用限制示例1G10G 最大100G如需更多联系管理员",
"CPU申请": "CPU申请",
"CPU的资源使用限制(单位核),示例 0.410最大50核如需更多联系管理员": "CPU的资源使用限制(单位核),示例 0.410最大50核如需更多联系管理员",
"GPU申请": "GPU申请",
"gpu的资源使用限制(单位卡),示例:12训练任务每个容器独占整卡。申请具体的卡型号可以类似 1(V100),目前支持T4/V100/A100/VGPU": "gpu的资源使用限制(单位卡),示例:12训练任务每个容器独占整卡。申请具体的卡型号可以类似 1(V100),目前支持T4/V100/A100/VGPU",
"RDMA申请": "RDMA申请",
"RDMA的资源使用限制示例 0110填写方式咨询管理员": "RDMA的资源使用限制示例 0110填写方式咨询管理员",
"超时中断": "超时中断",
"task运行时长限制为0表示不限制(单位s)": "task运行时长限制为0表示不限制(单位s)",
"重试次数": "重试次数",
"task重试次数": "task重试次数",
"是否跳过": "是否跳过",
"是": "是",
"否": "否",
"参数": "参数",
"用户中心": "用户中心",
"退出登录": "退出登录",
"安全设置": "安全设置",
"用户列表": "用户列表",
"角色列表": "角色列表",
"用户统计": "用户统计",
"权限列表": "权限列表",
"视图列表": "视图列表",
"权限视图关系": "权限视图关系",
"日志列表": "日志列表",
"数据查询": "数据查询",
"通用关系图": "通用关系图",
"数据展示": "数据展示",
"外链": "外链",
"登录": "登录",
"平台主要功能": "平台主要功能",
"新建流水线": "新建流水线",
"新手视频": "新手视频",
"新人制作一个pipeline": "新人制作一个pipeline",
"流水线": "流水线",
"我的": "我的",
"协作": "协作",
"任务流": "任务流",
"修改时间": "修改时间",
"项目组": "项目组",
"选择页数": "选择页数",
"上一页": "上一页",
"下一页": "下一页",
"创建会话场景": "创建会话场景",
"创建会话": "创建会话",
"对话模型": "对话模型",
"知识库": "知识库",
"确认创建": "确认创建",
"点击或者拖动文件到该区域上传数据集创建私有知识库": "点击或者拖动文件到该区域上传数据集创建私有知识库",
"支持 txt/markdown/pdf/csv 格式文件,请不要上传敏感数据": "支持 txt/markdown/pdf/csv 格式文件,请不要上传敏感数据",
"清空当前会话场景": "清空当前会话场景",
"设置当前场景,如模型,知识库等": "设置当前场景,如模型,知识库等",
"输入 / 调出提示Shift + Enter = 换行)": "输入 / 调出提示Shift + Enter = 换行)",
"发送": "发送",
"登录超时,需要重新登录": "登录超时,需要重新登录",
"请输入": "请输入",
"请按正确的规则输入": "请按正确的规则输入",
"请输入正确的长度": "请输入正确的长度",
"点击前往": "点击前往",
"请勿外传": "请勿外传",
"秒": "秒",
"分钟": "分钟",
"小时": "小时",
"收藏": "收藏",
"确定收藏?": "确定收藏?",
"确认收藏": "确认收藏",
"取消收藏": "取消收藏",
"确定取消收藏?": "确定取消收藏?",
"确认取消收藏": "确认取消收藏",
"操作成功": "操作成功",
"操作失败": "操作失败",
"用户没有修改权限": "用户没有修改权限",
"确定删除": "确定删除",
"确认删除": "确认删除",
"确认": "确认",
"删除成功": "删除成功",
"删除失败": "删除失败",
"字段切换错误": "字段切换错误",
"filter解析异常": "filter解析异常",
"请先选择": "请先选择",
"导入成功": "导入成功",
"导入失败": "导入失败",
"成功": "成功",
"失败": "失败",
"更新": "更新",
"返回": "返回",
"确认导出数据": "确认导出数据",
"导出成功": "导出成功",
"等等": "等等",
"终止任务": "终止任务",
"终止成功": "终止成功",
"终止失败": "终止失败",
"结果查看": "结果查看",
"输入关键字(表名)搜索": "输入关键字(表名)搜索",
"已成功复制到粘贴板": "已成功复制到粘贴板",
"修改生命周期": "修改生命周期",
"聚合节点": "聚合节点",
"剩余": "剩余",
"个节点(双击展开) + ": "个节点(双击展开) + ",
"查询结果失败,尝试重新运行": "查询结果失败,尝试重新运行",
"标签数目达到限制": "标签数目达到限制",
"点击确定完成提交": "点击确定完成提交",
"增加一项": "增加一项",
"上一步": "上一步",
"下一步": "下一步",
"删除该项": "删除该项",
"请选择时间范围": "请选择时间范围",
"请选择时间": "请选择时间",
"刷新列表": "刷新列表",
"选择需要导出的列": "选择需要导出的列",
"全选": "全选",
"反选": "反选",
"获取列表失败": "获取列表失败",
"获取流水线信息失败": "获取流水线信息失败",
"格式错误": "格式错误",
"流水线设置": "流水线设置",
"英文名(字母、数字、- 组成)最长50个字符": "英文名(字母、数字、- 组成)最长50个字符",
"每个用户使用英文逗号分隔": "每个用户使用英文逗号分隔",
"报警人": "报警人",
"监控状态": "监控状态",
"周期任务的时间设定 * * * * * 表示为 minute hour day month week": "周期任务的时间设定 * * * * * 表示为 minute hour day month week",
"调度周期": "调度周期",
"调度类型": "调度类型",
"新建": "新建",
"任务": "任务",
"补录起点": "补录起点",
"过往依赖": "过往依赖",
"当前pipeline可同时运行的任务流实例数目": "当前pipeline可同时运行的任务流实例数目",
"最大激活运行数": "最大激活运行数",
"任务并行数": "任务并行数",
"pipeline中可同时运行的task数目": "pipeline中可同时运行的task数目",
"流向图": "流向图",
"全局环境变量": "全局环境变量",
"为每个task都添加的公共参数": "为每个task都添加的公共参数",
"折叠": "折叠",
"暂无匹配": "暂无匹配",
"搜索模板名称或描述": "搜索模板名称或描述",
"配置文档": "配置文档",
"镜像":"镜像",
"版本": "版本",
"项目设置": "项目设置",
"智能推荐下游节点":"智能推荐下游节点",
"请先选择推荐节点":"请先选择推荐节点",
"导出数据": "导出数据"
}
export default translation

View File

@ -158,6 +158,9 @@ export default function TaskListManager(props?: IAppMenuItem) {
if (type === 'select2') {
type = 'select'
}
if (type === 'file') {
type = 'fileUpload'
}
const label = item.label || label_columns[item.name]
// 校验规则
@ -1142,7 +1145,7 @@ export default function TaskListManager(props?: IAppMenuItem) {
},
onCancel() { },
});
}}> <ExportOutlined /></Button> : null
}}>{t('批量导出')} <ExportOutlined /></Button> : null
}
</div>}

View File

@ -37,7 +37,6 @@ export interface ILayoutConfig {
"run-rtx": string,
"save-time": string,
"schedule_type": string,
"upload-rtx": string,
"workflow-name": string,
"workflows.argoproj.io/completed": string,
"workflows.argoproj.io/phase": string,