From ff761eaa2882fe2d2652db75cf362bb644f744eb Mon Sep 17 00:00:00 2001 From: cp3hnu Date: Tue, 16 Apr 2024 17:36:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=92=8C=E6=95=B0=E6=8D=AE=E9=9B=86=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/config/routes.ts | 11 ++ react-ui/src/assets/img/mirror-tabs-bg.png | Bin 0 -> 72997 bytes react-ui/src/components/KFModal/index.tsx | 25 ++- react-ui/src/components/KFTabs/index.less | 0 react-ui/src/components/KFTabs/index.tsx | 32 ++++ react-ui/src/global.less | 2 +- react-ui/src/icons/magnifying-glass.svg | 3 + .../experimentText/addExperimentModal.tsx | 2 +- .../experimentText/paramsModal.less | 1 + .../Experiment/experimentText/paramsModal.tsx | 8 +- react-ui/src/pages/Mirror/list.less | 42 +++++ react-ui/src/pages/Mirror/list.tsx | 155 ++++++++++++++++++ .../ResourceSelectorModal/index.less | 26 +-- .../ResourceSelectorModal/index.tsx | 92 ++++++----- .../src/pages/Pipeline/editPipeline/props.jsx | 108 +++++------- react-ui/src/services/mirror/index.ts | 22 +++ react-ui/src/utils/index.js | 12 -- react-ui/src/utils/index.ts | 50 ++++++ react-ui/src/utils/modal.tsx | 2 +- 19 files changed, 454 insertions(+), 139 deletions(-) create mode 100644 react-ui/src/assets/img/mirror-tabs-bg.png create mode 100644 react-ui/src/components/KFTabs/index.less create mode 100644 react-ui/src/components/KFTabs/index.tsx create mode 100644 react-ui/src/icons/magnifying-glass.svg create mode 100644 react-ui/src/pages/Mirror/list.less create mode 100644 react-ui/src/pages/Mirror/list.tsx create mode 100644 react-ui/src/services/mirror/index.ts delete mode 100644 react-ui/src/utils/index.js create mode 100644 react-ui/src/utils/index.ts diff --git a/react-ui/config/routes.ts b/react-ui/config/routes.ts index 9c30003d..959bf0aa 100644 --- a/react-ui/config/routes.ts +++ b/react-ui/config/routes.ts @@ -135,6 +135,17 @@ export default [ path: '/dataset/datasetIntro/:id', component: './Dataset/datasetIntro', }, + { + name: '镜像', + path: 'mirror', + routes: [ + { + name: '镜像列表', + path: '', + component: './Mirror/list', + }, + ], + }, { name: '模型管理', path: '/dataset/modelIndex', diff --git a/react-ui/src/assets/img/mirror-tabs-bg.png b/react-ui/src/assets/img/mirror-tabs-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9e01b8f344b08ace12d7a62d437cd0ad43c036cb GIT binary patch literal 72997 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 ThrZCQ00000NkvXXu0mjfK?V1~ literal 0 HcmV?d00001 diff --git a/react-ui/src/components/KFModal/index.tsx b/react-ui/src/components/KFModal/index.tsx index ba3233c6..3491ca6b 100644 --- a/react-ui/src/components/KFModal/index.tsx +++ b/react-ui/src/components/KFModal/index.tsx @@ -5,22 +5,31 @@ */ import ModalTitle from '@/components/ModalTitle'; -import { Modal, type ModalProps } from 'antd'; +import { ConfigProvider, Modal, theme, type ModalProps } from 'antd'; import classNames from 'classnames'; +import { useAntdConfig } from 'umi'; import './index.less'; +const { useToken } = theme; + export interface KFModalProps extends ModalProps { image: string; } function KFModal({ title, image, children, className = '', ...rest }: KFModalProps) { + const { token } = useToken(); + console.log('token', token); + const antdConfig = useAntdConfig(); + console.log('antdConfig', antdConfig); return ( - } - > - {children} - + + } + > + {children} + + ); } diff --git a/react-ui/src/components/KFTabs/index.less b/react-ui/src/components/KFTabs/index.less new file mode 100644 index 00000000..e69de29b diff --git a/react-ui/src/components/KFTabs/index.tsx b/react-ui/src/components/KFTabs/index.tsx new file mode 100644 index 00000000..a9a9f2f1 --- /dev/null +++ b/react-ui/src/components/KFTabs/index.tsx @@ -0,0 +1,32 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-16 14:55:40 + * @Description: + */ +// import { useEffect, useState } from 'react'; +// import styles from './index.less'; +// import { Tabs } from "antd" + +// function KFTabs() { +// const [iframeUrl, setIframeUrl] = useState(''); +// useEffect(() => { + +// }, []); + +// return ( +//
+//
+// +// +// +// +// +// +// +// +//
+//
+// ); +// } + +// export default KFTabs; diff --git a/react-ui/src/global.less b/react-ui/src/global.less index 2316c464..986af482 100644 --- a/react-ui/src/global.less +++ b/react-ui/src/global.less @@ -194,6 +194,6 @@ ol { } } -.local-svg { +.umi-local-svg { vertical-align: -1px; } diff --git a/react-ui/src/icons/magnifying-glass.svg b/react-ui/src/icons/magnifying-glass.svg new file mode 100644 index 00000000..69bf383b --- /dev/null +++ b/react-ui/src/icons/magnifying-glass.svg @@ -0,0 +1,3 @@ + + + diff --git a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx index 53ebc7ca..3e58ee26 100644 --- a/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx +++ b/react-ui/src/pages/Experiment/experimentText/addExperimentModal.tsx @@ -62,7 +62,7 @@ export const getParamRules = (paramType: number, required: boolean = false): For }; // 根据参数设置 label -const getParamType = (param: PipelineGlobalParam): string => { +export const getParamType = (param: PipelineGlobalParam): string => { const paramTypes: Readonly> = { 1: '字符串', 2: '整型', diff --git a/react-ui/src/pages/Experiment/experimentText/paramsModal.less b/react-ui/src/pages/Experiment/experimentText/paramsModal.less index 88287c9d..54e164bf 100644 --- a/react-ui/src/pages/Experiment/experimentText/paramsModal.less +++ b/react-ui/src/pages/Experiment/experimentText/paramsModal.less @@ -1,6 +1,7 @@ .params_container { max-height: 230px; padding: 15px 15px 0; + overflow-y: auto; border: 1px solid #e6e6e6; border-radius: 8px; diff --git a/react-ui/src/pages/Experiment/experimentText/paramsModal.tsx b/react-ui/src/pages/Experiment/experimentText/paramsModal.tsx index 1a1cf41f..9a75c2e8 100644 --- a/react-ui/src/pages/Experiment/experimentText/paramsModal.tsx +++ b/react-ui/src/pages/Experiment/experimentText/paramsModal.tsx @@ -1,6 +1,12 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-09 15:59:14 + * @Description: 查看实验使用的参数 + */ import parameterImg from '@/assets/img/modal-parameter.png'; import KFModal from '@/components/KFModal'; import { type PipelineGlobalParam } from '@/types'; +import { getParamType } from './addExperimentModal'; import styles from './paramsModal.less'; type ParamsModalProps = { @@ -22,7 +28,7 @@ function ParamsModal({ open, onCancel, globalParam = [] }: ParamsModalProps) {
{globalParam.map((item) => (
- {item.param_name} + {getParamType(item)} {item.param_value}
))} diff --git a/react-ui/src/pages/Mirror/list.less b/react-ui/src/pages/Mirror/list.less new file mode 100644 index 00000000..ee9fbbd6 --- /dev/null +++ b/react-ui/src/pages/Mirror/list.less @@ -0,0 +1,42 @@ +.mirror-list { + height: 100%; + background-color: #f9fafb; + &__tabs-container { + height: 59px; + background-image: url('../../assets/img/mirror-tabs-bg.png'); + } + + &__content { + height: calc(100% - 69px); + margin-top: 10px; + padding: 20px 30px 0; + background-color: white; + border-radius: 10px; + + &__filter { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 10px; + } + + &__table { + height: calc(100% - 44px); + margin-top: 12px; + :global { + .ant-table-wrapper { + height: 100%; + .ant-spin-nested-loading { + height: 100%; + } + .ant-spin-container { + height: 100%; + } + .ant-table { + height: calc(100% - 74px); + } + } + } + } + } +} diff --git a/react-ui/src/pages/Mirror/list.tsx b/react-ui/src/pages/Mirror/list.tsx new file mode 100644 index 00000000..972b0595 --- /dev/null +++ b/react-ui/src/pages/Mirror/list.tsx @@ -0,0 +1,155 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-16 13:58:08 + * @Description: 镜像列表 + */ +import { getMirrorListReq } from '@/services/mirror'; +import { to } from '@/utils/promise'; +import { Button, Input, Table } from 'antd'; +import dayjs from 'dayjs'; +import { useEffect, useRef, useState } from 'react'; +import styles from './list.less'; + +const tabItems = [ + { + key: 'Public', + label: '公共镜像', + }, + { + key: 'Private', + label: '个人镜像', + }, +]; + +function MirrorList() { + const [activeTab, setActiveTab] = useState('Public'); + const [tableData, setTableData] = useState([]); + const contentRef = useRef(null); + const [tableHeight, setTableHeight] = useState(0); + const [pagination, setPagination] = useState({ + showSizeChanger: true, + showQuickJumper: true, + current: 1, + pageSize: 10, + total: 0, + }); + useEffect(() => { + getMirrorList(''); + }, []); + + useEffect(() => { + const setTableScollHeight = () => { + if (contentRef.current) { + setTableHeight(contentRef.current.offsetHeight - 74 - 55); + } + }; + setTableScollHeight(); + window.addEventListener('resize', setTableScollHeight); + + return () => { + window.removeEventListener('resize', setTableScollHeight); + }; + }, [contentRef]); + + const columns = [ + { + title: '镜像名称', + dataIndex: 'name', + key: 'name', + width: '10%', + }, + { + title: '版本数据', + dataIndex: 'version_count', + key: 'version_count', + width: '10%', + }, + { + title: '镜像描述', + dataIndex: 'description', + key: 'description', + width: '50%', + }, + { + title: '创建时间', + dataIndex: 'create_time', + key: 'create_time', + width: '20%', + render: (text: string) => {dayjs(text).format('YYYY-MM-DD HH:mm:ss')}, + }, + { + title: '操作', + dataIndex: 'operation', + width: '100px', + key: 'operation', + render: (_: any, record: any) => [ + , + ], + }, + ]; + + const getMirrorList = async (name: string) => { + const params = { + page: pagination.current - 1, + size: pagination.pageSize, + name, + image_type: 1, + }; + const [res] = await to(getMirrorListReq(params)); + if (res && res.data) { + const { content = [], totalElements = 0 } = res.data; + console.log(res); + setTableData(content); + setPagination((prev) => ({ + ...prev, + total: totalElements, + })); + } + }; + + const onSearch = (value: string) => { + getMirrorList(value); + }; + + return ( +
+
+ {/* */} +
+
+
+ + +
+
+ + + + + ); +} + +export default MirrorList; diff --git a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less index 6126cf3f..d77d5519 100644 --- a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less +++ b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less @@ -1,13 +1,18 @@ @import '@/styles/theme.less'; .model-tabs { + margin-left: 8px; :global { .ant-tabs-tab { - padding-top: 0 !important; + padding-top: 0; } .ant-tabs-nav::before, div > .ant-tabs-nav::before { - border: none !important; + border: none; + } + + .ant-tabs-nav { + margin-bottom: 0; } } } @@ -16,6 +21,12 @@ display: flex; align-items: flex-start; + :global { + .ant-input-affix-wrapper .ant-input-prefix { + margin-inline-end: 12px; + } + } + &__left { width: 488px; height: 398px; @@ -27,20 +38,11 @@ &__search { margin-bottom: 14px; + padding-left: 0; background-color: transparent; border-width: 0; border-bottom: 1px solid @border-color-second; border-radius: 0; - - // &:hover { - // background-color: transparent; - // } - // &:active { - // background-color: transparent; - // } - // &:focus { - // background-color: transparent; - // } } } diff --git a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx index 1532af3f..213f9453 100644 --- a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx +++ b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx @@ -16,9 +16,10 @@ import { getModelVersionsById, } from '@/services/dataset/index.js'; import { to } from '@/utils/promise'; +import { Icon } from '@umijs/max'; import type { GetRef, ModalProps, TabsProps, TreeDataNode, TreeProps } from 'antd'; import { Input, Tabs, Tree } from 'antd'; -import React, { useEffect, useRef, useState } from 'react'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; import styles from './index.less'; export enum ResourceSelectorType { @@ -30,7 +31,7 @@ type ResourceSelectorTypeKeys = keyof typeof ResourceSelectorType; type ResourceSelectorTypeValues = (typeof ResourceSelectorType)[ResourceSelectorTypeKeys]; type GetModelFilesReqParam = { - model_id: number; + models_id: number; version: string; }; @@ -52,6 +53,11 @@ export type SelectorTypeInfo = { tabItems: TabsProps['items']; }; +enum TabItemKeys { + Private = 'Private', // 我的 + Public = 'Public', // 公开 +} + export const selectorTypeData: Record = { Model: { getList: getModelList, @@ -63,11 +69,11 @@ export const selectorTypeData: Record { type: ResourceSelectorType; // 模型 | 数据集 defaultExpandedKeys: React.Key[]; defaultCheckedKeys: React.Key[]; - defaultActiveTab: string; + defaultActiveTab: TabItemKeys; onOk?: (params: ResourceSelectorResponse | null) => void; } type ResourceGroup = { - id: number; - name: string; + id: number; // 数据集或者模型 id + name: string; // 数据集或者模型 id }; type ResourceFile = { - id: number; - file_name: string; + id: number; // 文件 id + file_name: string; // 文件 name }; +type TreeRef = GetRef>; + // list 转成 treeData const convertToTreeData = (list: ResourceGroup[]): TreeDataNode[] => { return list.map((v) => ({ @@ -129,6 +137,7 @@ const convertToTreeData = (list: ResourceGroup[]): TreeDataNode[] => { })); }; +// 更新树形结构的 children const updateChildren = (parentId: number, children: TreeDataNode[]) => { return (node: TreeDataNode) => { if (node.key === parentId) { @@ -141,22 +150,30 @@ const updateChildren = (parentId: number, children: TreeDataNode[]) => { }; }; -type TreeRef = GetRef>; +// 得到数据集或者模型 id 和下属版本号 +const getIdAndVersion = (versionKey: string) => { + const index = versionKey.indexOf('-'); + const id = Number(versionKey.slice(0, index)); + const version = versionKey.slice(index + 1); + return { + id, + version, + }; +}; function ResourceSelectorModal({ type, defaultExpandedKeys = [], defaultCheckedKeys = [], - defaultActiveTab = '0', + defaultActiveTab = TabItemKeys.Private, onOk, ...rest }: ResourceSelectorModalProps) { - const [activeTab, setActiveTab] = useState(defaultActiveTab); + const [activeTab, setActiveTab] = useState(defaultActiveTab); const [expandedKeys, setExpandedKeys] = useState([]); const [checkedKeys, setCheckedKeys] = useState([]); const [loadedKeys, setLoadedKeys] = useState([]); const [originTreeData, setOriginTreeData] = useState([]); - const [treeData, setTreeData] = useState([]); const [files, setFiles] = useState([]); const [versionPath, setVersionPath] = useState(''); const [searchText, setSearchText] = useState(''); @@ -174,19 +191,21 @@ function ResourceSelectorModal({ getTreeData(); }, [activeTab, type]); - useEffect(() => { - const treeData = originTreeData.filter((v) => - (v.title as string).toLowerCase()?.includes(searchText.toLowerCase()), - ); - setTreeData(treeData); - }, [originTreeData, searchText]); + const treeData = useMemo( + () => + originTreeData.filter((v) => + (v.title as string).toLowerCase()?.includes(searchText.toLowerCase()), + ), + [originTreeData, searchText], + ); // 获取数据集或模型列表 const getTreeData = async () => { + const available_range = activeTab === TabItemKeys.Private ? '0' : '1'; const params = { page: 0, size: 200, - available_range: activeTab, + available_range: available_range, }; const getListReq = selectorTypeData[type].getList; const [res] = await to(getListReq(params)); @@ -255,7 +274,7 @@ function ResourceSelectorModal({ // 扩展 const onExpand: TreeProps['onExpand'] = (expandedKeysValue) => { - const lastKeys = (expandedKeysValue as React.Key[]).slice(-1); + const lastKeys = expandedKeysValue.slice(-1); setExpandedKeys(lastKeys); }; @@ -265,9 +284,7 @@ function ResourceSelectorModal({ setCheckedKeys(lastKeys); if (lastKeys.length) { const last = lastKeys[0] as string; - const index = last.indexOf('-'); - const id = Number(last.slice(0, index)); - const version = last.slice(index + 1); + const { id, version } = getIdAndVersion(last); getFiles(id, version); } else { setFiles([]); @@ -295,9 +312,7 @@ function ResourceSelectorModal({ const restoreLastCheck = (parentId: number) => { if (!fisrtLoadVersions && defaultCheckedKeys.length > 0) { const last = defaultCheckedKeys[0] as string; - const index = last.indexOf('-'); - const id = Number(last.slice(0, index)); - const version = last.slice(index + 1); + const { id, version } = getIdAndVersion(last); // 判断正在打开的 id 和 defaultCheckedKeys 的 id 是否一致 if (id === parentId) { setTimeout(() => { @@ -319,16 +334,14 @@ function ResourceSelectorModal({ const handleOk = () => { if (checkedKeys.length > 0) { const last = checkedKeys[0] as string; - const index = last.indexOf('-'); - const id = Number(last.slice(0, index)); - const version = last.slice(index + 1); + const { id, version } = getIdAndVersion(last); const name = (treeData.find((v) => Number(v.key) === id)?.title ?? '') as string; const res = { id, name, path: versionPath, version, - activeTab, + activeTab: activeTab as TabItemKeys, }; onOk?.(res); } else { @@ -344,7 +357,7 @@ function ResourceSelectorModal({ return ( -
+
setSearchText(e.target.value)} + prefix={} /> { const [form] = Form.useForm(); const [stagingItem, setStagingItem] = useState({}); const [open, setOpen] = useState(false); - // const [modelSelectorOpen, openModelSelector, closeModelSelector] = useVisible(false); - // const [selectorType, setSelectorType] = useState(SelectorType.Model); - // const [formItemName, setFormItemName] = useState(''); const [selectedModel, setSelectedModel] = useState(undefined); const [selectedDataset, setSelectedDataset] = useState(undefined); const afterOpenChange = () => { if (!open) { - console.log(111, open); - console.log(stagingItem, form.getFieldsValue()); + // 禁止校验 guard-for-in + /* eslint-disable */ for (let i in form.getFieldsValue()) { for (let j in stagingItem.in_parameters) { if (i == j) { @@ -38,6 +36,7 @@ const Props = forwardRef(({ onParentChange }, ref) => { } } } + /* eslint-enable */ // setStagingItem({...stagingItem,}) console.log(stagingItem.control_strategy); onParentChange({ @@ -86,14 +85,12 @@ const Props = forwardRef(({ onParentChange }, ref) => { }, })); + // 选择数据集、模型 const selectResource = (name, item) => { - // setFormItemName(name); - // setSelectorType(item.item_type === 'dataset' ? SelectorType.Dataset : SelectorType.Model); - // openModelSelector(); const type = item.item_type === 'dataset' ? ResourceSelectorType.Dataset : ResourceSelectorType.Model; const resource = type === ResourceSelectorType.Dataset ? selectedDataset : selectedModel; - const { destroy } = openAntdModal( + const { close } = openAntdModal( ResourceSelectorModal, { type, @@ -102,7 +99,8 @@ const Props = forwardRef(({ onParentChange }, ref) => { defaultActiveTab: resource?.activeTab, onOk: (res) => { if (res) { - const value = JSON.stringify(res); + const jsonObj = pick(res, ['id', 'version', 'path']); + const value = JSON.stringify(jsonObj); form.setFieldValue(name, value); if (type === ResourceSelectorType.Dataset) { setSelectedDataset(res); @@ -117,35 +115,32 @@ const Props = forwardRef(({ onParentChange }, ref) => { } form.setFieldValue(name, ''); } - destroy(); + close(); }, }, true, ); }; - const handleModelSelect = (obj) => { - if (obj) { - const value = JSON.stringify(obj); - setSelectedModel(obj); - form.setFieldValue(formItemName, value); - } else { - form.setFieldValue(formItemName, ''); - } - closeModelSelector(); - }; - + // 获取选择数据集、模型后面按钮 icon const getSelectBtnIcon = (item) => { const type = item.item_type; if (type === 'dataset') { - return ; + return ; } else if (type === 'model') { - return ; + return ; } else { - return ; + return ; } }; + // 控制策略 + const controlStrategy = stagingItem.control_strategy; + // 输入参数 + const inParameters = stagingItem.in_parameters; + // 输出参数 + const outParameters = stagingItem.out_parameters; + return ( <> {