From e6b98d35c9aa17afcb01ad86077e84eecf3826d2 Mon Sep 17 00:00:00 2001 From: liu2592603532 <2592603532@qq.com> Date: Fri, 19 Apr 2024 09:27:04 +0800 Subject: [PATCH 1/4] merge --- react-ui/config/proxy.ts | 4 +- react-ui/src/pages/Dataset/index.less | 40 ++++++++++++------ react-ui/src/pages/Dataset/personalData.jsx | 5 ++- .../src/pages/Pipeline/editPipeline/index.jsx | 42 ++++++++++++------- .../src/pages/Pipeline/editPipeline/props.jsx | 20 +++++++++ 5 files changed, 78 insertions(+), 33 deletions(-) diff --git a/react-ui/config/proxy.ts b/react-ui/config/proxy.ts index 2b02d8f0..527bff75 100644 --- a/react-ui/config/proxy.ts +++ b/react-ui/config/proxy.ts @@ -16,8 +16,8 @@ export default { '/api/': { // 要代理的地址 // target: 'http://172.20.32.181:31205', - // target: 'http://172.20.32.98:8082', - target: 'http://172.20.32.150:8082', + target: 'http://172.20.32.98:8082', + // target: 'http://172.20.32.150:8082', // 配置了这个可以从 http 代理到 https // 依赖 origin 的功能可能需要这个,比如 cookie changeOrigin: true, diff --git a/react-ui/src/pages/Dataset/index.less b/react-ui/src/pages/Dataset/index.less index 8be59a9d..9ab21750 100644 --- a/react-ui/src/pages/Dataset/index.less +++ b/react-ui/src/pages/Dataset/index.less @@ -223,36 +223,50 @@ flex: 1; flex-wrap: wrap; align-content: flex-start; - width: 100%; + width: 103%; .dataItem { position: relative; - width: 32%; - height: 66px; - margin: 0 15px 18px 0; - background: rgba(128, 128, 128, 0.05); - border-radius: 8px; - box-shadow: 0px 0px 12px rgba(75, 84, 137, 0.05); + width: 23%; + height:164px; + background:#ffffff; + border:1px solid; + border-color:#eaeaea; + border-radius:4px; + margin: 0 20px 25px 0; cursor: pointer; .itemText { position: absolute; - top: 10px; + top: 20px; left: 20px; color: #1d1d20; - font-size: 15px; + font-size: 16px; + } + .itemDescripition{ + position: absolute; + top: 57px; + left: 20px; + padding-right: 28px; + color:#575757; + font-size:14px; + word-break: break-all; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; } .itemTime { position: absolute; - bottom: 10px; + bottom: 22px; left: 20px; color: #808080; - font-size: 14px; + font-size: 13px; } .itemIcon { position: absolute; right: 20px; - bottom: 10px; + bottom: 22px; color: #808080; - font-size: 14px; + font-size: 13px; } } } diff --git a/react-ui/src/pages/Dataset/personalData.jsx b/react-ui/src/pages/Dataset/personalData.jsx index cbebbd0a..f5632d0d 100644 --- a/react-ui/src/pages/Dataset/personalData.jsx +++ b/react-ui/src/pages/Dataset/personalData.jsx @@ -269,8 +269,9 @@ const PublicData = (React.FC = () => { return (
routeToIntro(e, item)}>
{item.name}
+
{item.description}
- 最近更新: {moment(item.update_time).format('YYYY-MM-DD')} + {item.create_by}
{ src={`/assets/images/upload-icon.png`} alt="" /> - 1582 + 最近更新: {moment(item.update_time).format('YYYY-MM-DD')}
); diff --git a/react-ui/src/pages/Pipeline/editPipeline/index.jsx b/react-ui/src/pages/Pipeline/editPipeline/index.jsx index 5d31298a..94989ae5 100644 --- a/react-ui/src/pages/Pipeline/editPipeline/index.jsx +++ b/react-ui/src/pages/Pipeline/editPipeline/index.jsx @@ -101,22 +101,32 @@ const EditPipeline = () => { openParamsDrawer(); return; } - const data = graph.save(); - console.log(data); - const params = { - ...locationParams, - dag: JSON.stringify(data), - global_param: JSON.stringify(res.global_param), - }; - saveWorkflow(params).then((ret) => { - message.success('保存成功'); - closeParamsDrawer(); - setTimeout(() => { - if (val) { - navgite({ pathname: `/pipeline` }); - } - }, 500); - }); + const [propsRes, propsError] = await to(propsRef.current.getFieldsValue()); + console.log(await to(propsRef.current.getFieldsValue())); + if (propsError) { + message.error('基本信息必填项需配置'); + // handlerClick(); + return; + } + propsRef.current.propClose(); + setTimeout(() => { + const data = graph.save(); + console.log(data); + const params = { + ...locationParams, + dag: JSON.stringify(data), + global_param: JSON.stringify(res.global_param), + }; + saveWorkflow(params).then((ret) => { + message.success('保存成功'); + closeParamsDrawer(); + setTimeout(() => { + if (val) { + navgite({ pathname: `/pipeline` }); + } + }, 500); + }); + }, 500); }; const handlerClick = (e) => { e.stopPropagation(); diff --git a/react-ui/src/pages/Pipeline/editPipeline/props.jsx b/react-ui/src/pages/Pipeline/editPipeline/props.jsx index 5ed82de9..2db770f5 100644 --- a/react-ui/src/pages/Pipeline/editPipeline/props.jsx +++ b/react-ui/src/pages/Pipeline/editPipeline/props.jsx @@ -1,5 +1,6 @@ import { pick } from '@/utils/index'; import { openAntdModal } from '@/utils/modal'; +import { to } from '@/utils/promise'; import { Icon } from '@umijs/max'; import { Button, Drawer, Form, Input } from 'antd'; import { forwardRef, useImperativeHandle, useState } from 'react'; @@ -8,6 +9,7 @@ import Styles from './editPipeline.less'; const { TextArea } = Input; const Props = forwardRef(({ onParentChange }, ref) => { const [form] = Form.useForm(); + const [stagingItem, setStagingItem] = useState({}); const [open, setOpen] = useState(false); const [selectedModel, setSelectedModel] = useState(undefined); @@ -59,6 +61,15 @@ const Props = forwardRef(({ onParentChange }, ref) => { console.log('Failed:', errorInfo); }; useImperativeHandle(ref, () => ({ + getFieldsValue: async () => { + const [propsRes, propsError] = await to(form.validateFields()); + if (propsRes && !propsError) { + const values = form.getFieldsValue(); + return values; + } else { + return Promise.reject(propsError); + } + }, showDrawer(e) { if (e.item && e.item.getModel()) { // console.log(e.item.getModel().in_parameters); @@ -83,6 +94,15 @@ const Props = forwardRef(({ onParentChange }, ref) => { setOpen(true); } }, + propClose: async () => { + setOpen(false); + const [openRes, propsError] = await to(setOpen(false)); + console.log(setOpen(false)); + }, + // propClose() { + + // setOpen(false); + // }, })); // 选择数据集、模型 From 5ada6383d304e36c8af71f65afba0586bf7424a7 Mon Sep 17 00:00:00 2001 From: liu2592603532 <2592603532@qq.com> Date: Fri, 19 Apr 2024 17:08:00 +0800 Subject: [PATCH 2/4] merge --- react-ui/src/assets/img/clock.png | Bin 0 -> 7984 bytes react-ui/src/assets/img/creatBy.png | Bin 0 -> 1566 bytes react-ui/src/global.less | 115 +++++++++++--------- react-ui/src/pages/Dataset/index.less | 27 ++++- react-ui/src/pages/Dataset/personalData.jsx | 31 ++++-- react-ui/src/pages/Dataset/publicData.jsx | 32 ++++-- react-ui/src/pages/Model/index.less | 56 +++++++--- react-ui/src/pages/Model/personalData.jsx | 32 ++++-- react-ui/src/pages/Model/publicData.jsx | 32 ++++-- 9 files changed, 229 insertions(+), 96 deletions(-) create mode 100644 react-ui/src/assets/img/clock.png create mode 100644 react-ui/src/assets/img/creatBy.png diff --git a/react-ui/src/assets/img/clock.png b/react-ui/src/assets/img/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..a206836434fe4555c76f840326dd7be92e68cabc GIT binary patch literal 7984 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 O4rr#1jL%qCTbv&fbl^} zF9JrYhDH-prShPpUJ41pl$KU~u!Y1LeGn2cme?jFcuUk+6Qj}+b+=dw#+K6V`2A;l z*4B(J2Rt@4B4SGmdwKjXspw~N~N)ke+!|oY+QXGpIy`n z7ZvaupLd0>qZ6%aIOy=yXD2yjdU=Y%R;93sO4ie;3}2cwh6$)sYn;~CapKau>Y}gy z~`_X9(Ab*d}RM$|$S$mG1GW`r< z+Lj=$az)>a5J>-Vb=9Pw5rDj%dbLWyhirU@iPFGrG=8|I@X%nB`o&9^CxF~?U7P}Z zz?sSNQkLZ3`9#J~he4nW@tlVZ#c7cyGE6(*jshsdsS( zj+%`$%dHf4hmNVY-9~W*K;w%TP@nV1d9!Sqk$TpY>&$u^-Q4L0067)9FiqntrpSCF z?Q_*gBRs0G_OB+@7dvDe0A`y-%rY1N2@Brj=gtb$AR# zu@yWHz>*5RpF_MHWSDJ5z`lop6?r#m>FNQhTLJ^A3pFXR(~(I4G`@ho*24$cwg3*7 z0Rmtqk=5ApI`Dn3-6&jz%cH5dd7x1Z#sSDL*9}aU)plxust17s+st|kh~ii5SArl8 zhMUz3lK^D)nKFO%O~}UW%~}AQe~nAG&Ej$N8Pw-~h<4(5LuilOF?O+nV^kn{J7PZU(lEFkVlGn^cLC)Jb07AA}lr z)Br`R{F@O309}40l!{D6zO$VG-uFNJR1dcmkenZz_wQm&kXVV8Kme$S!Cb16mHQK8 zprA6|*qTS8^*5$dtnU~_T zRO6>WZF`VWofUXTF@S}%Z3w0+TEG%l;X;4Zjn=J>*DkYv&+~x%4I&KWPFaB;xdI78 z*r}C5CIxLK5u-QP+gIXP-CThlS%J$z=tH8hLgEf=kGf5wNb#!w$i4z6>f;IwCLO@U zAi_k&b)-6fcYz;rpP+2i9YB&?NCLTpvo9=EjCZ3I0^$lQ@F%3!wq(xDg#rh$q{zx* ze_TicT(XpHB^DsjAg<7Di~&O)8NY}!>r#cKNZE=II*AP%A%J$tLe@0emO>;NYYT!| z=#Vv)uwkIn&9X4ld&%zo)`f`1V=Cuyot2h>uwODK{NF8A+PH%Bk*X}!*;q*C^nB!6 z(P_ytpOG3QQ@VfRt0oJasZ7#o>EQQ;ril5yW1s0zX6<~x;KaVr);PJfG6}#5<^`Z9qQFE= zBEL83GhG{*{RirdsYZzB2e(a}AH?s>Rp@89mHw8gF~U4c*Vw&I${50pgkIFP85@rX z@N9pRYM8JwesA=CotA$q&d|Tsn}V3jcJ%!(!arjpx1C4b0q|*Nna*FBiu3%sVlIvI z8jHsF4yR)6)kZ}YH6^aw>!cTJn2*l=SGLz_?hw!Bio(YfLp@&p7Y7_Vf^FgB>V(@W zc^)w_s1N(48D8#S{JYQvg+1KBYM!o-=OJItPJLgR!p8*R@{(w5itmP`3cp9ju;o&V zIyX~iPXN;SrgFWKXH6ZOa@C+=BpvmGN7aC*)m~}TM1gbJ zBL$B-mpwE$#%wNo0B4=c9;0ZVv&$Z?;M}g;M6cQuI_-JYhD+Ty8`o|A1%A#9 tr > th { background-color: #fff; @@ -56,27 +51,34 @@ a { } .ant-menu-light .ant-menu-item-selected { background: rgba(197, 232, 255, 0.8) !important; + +} +.ant-menu-light .ant-menu-item-selected .ant-pro-base-menu-inline-item-text{ + color:#1664ff; } .ant-pro-layout .ant-pro-sider .ant-layout-sider-children { background: #f2f5f7; } -.ant-pro-base-menu-inline-item-title .ant-pro-base-menu-inline-item-text { - color: #1d1d20; - font-size: 16px; +.ant-pro-base-menu-inline-item-title .ant-pro-base-menu-inline-item-text{ + color:#1d1d20; +font-size:16px; } -.ant-pro-layout .ant-pro-sider-menu { +// .ant-menu-light .ant-menu-item-selected{ +// color:#1664ff; +// } +.ant-pro-layout .ant-pro-sider-menu{ padding-top: 40px; } -.ant-pro-global-header-logo-mix { - width: 257px; +.ant-pro-global-header-logo-mix{ height: 75px; - margin-left: -16px; - padding-left: 28px; - background: #f2f5f7; border-bottom: 1px solid rgba(233, 237, 240, 1); + margin-left: -16px; + width: 257px; + background:#f2f5f7; border-top-right-radius: 20px; + padding-left: 28px; } -.ant-pro-layout .ant-pro-sider .ant-layout-sider-children { +.ant-pro-layout .ant-pro-sider .ant-layout-sider-children{ border-right: unset; border-bottom-right-radius: 20px; } @@ -85,16 +87,21 @@ a { background: #f2f5f7; border-radius: 0px 20px 20px 0px; } - -.ant-drawer .ant-drawer-body { +.ant-pro-layout .ant-pro-layout-content { + background-color: transparent; +} +.ant-drawer .ant-drawer-body{ padding: 0; } -.ant-drawer .ant-drawer-body .ant-row { +.ant-drawer .ant-drawer-body .ant-row{ padding: 0 24px; } -.ant-drawer .ant-drawer-body .ant-form-item { +.ant-drawer .ant-drawer-body .ant-form-item{ margin-bottom: 20px; } +.ant-menu .ant-menu-submenu-title .anticon { + font-size: 16px; +} .ant-table-wrapper .ant-table-pagination.ant-pagination { margin: 0; padding: 21px 16px; @@ -110,10 +117,9 @@ a { height: 94vh; } .ant-pro-layout .ant-pro-layout-container { - height: 100vh; - overflow-y: hidden; + height: 98vh; } -.ant-modal-confirm .ant-modal-confirm-paragraph { +.ant-modal-confirm .ant-modal-confirm-paragraph{ margin: 54px 0 auto; text-align: center; } @@ -124,35 +130,36 @@ a { margin-top: 30px; text-align: center; } -.ant-modal-confirm-btns .ant-btn-default { - width: 110px; - height: 40px; - margin-right: 10px; - color: #1d1d20; - font-size: 18px; - background: rgba(22, 100, 255, 0.06); - border-color: transparent; - border-radius: 10px; +.ant-modal-confirm-btns .ant-btn-default{ + width:110px; +height:40px; +background:rgba(22, 100, 255, 0.06); +border-radius:10px; +color:#1d1d20; +font-size:18px; +margin-right: 10px; +border-color: transparent; } .ant-modal-confirm-btns .ant-btn-default:hover { background: rgba(22, 100, 255, 0.06); border-color: transparent; } -.ant-modal-confirm-btns .ant-btn-primary { - width: 110px; - height: 40px; +.ant-modal-confirm-btns .ant-btn-primary{ + width:110px; + height:40px; + background:#1664ff; + border-radius:10px; font-size: 18px; - background: #1664ff; - border-radius: 10px; } -.ant-modal .ant-input-affix-wrapper { +.ant-modal .ant-input-affix-wrapper{ height: 46px; padding: 1px 11px; } -.ant-modal .ant-select-single { +.ant-modal .ant-select-single{ height: 46px; + } -.ant-modal .ant-select-single .ant-select-selector .ant-select-selection-placeholder { +.ant-modal .ant-select-single .ant-select-selector .ant-select-selection-placeholder{ line-height: 46px; } .ant-modal .ant-modal-close-x { @@ -169,14 +176,13 @@ a { .ant-modal .ant-modal-content { padding: 0; } -.ant-modal-confirm-body-wrapper { - height: 303px; - background-image: url(/assets/images/modal-back.png); - background-repeat: no-repeat; - background-position: top center; - background-size: 100%; - border-radius: 21px; - border-radius: 0; +.ant-modal-confirm-body-wrapper{ +height:303px; +background-image: url(/assets/images/modal-back.png); +background-repeat:no-repeat; +background-size:100%; +background-position: top center; +border-radius: 0; } .ant-modal .ant-modal-content { border-radius: 20px; @@ -204,6 +210,17 @@ a { border-radius: 6px; } +.ant-tabs { + .ant-tabs-nav::before, + div > .ant-tabs-nav::before { + border: none; + } + + .ant-tabs-nav { + margin-bottom: 0; + } +} + // ::-webkit-scrollbar-button { // background: #97a1bd; // } diff --git a/react-ui/src/pages/Dataset/index.less b/react-ui/src/pages/Dataset/index.less index 9ab21750..d22c8dbe 100644 --- a/react-ui/src/pages/Dataset/index.less +++ b/react-ui/src/pages/Dataset/index.less @@ -7,6 +7,7 @@ padding-right: 30px; background-image: url(/assets/images/pipeline-back.png); background-size: 100% 100%; + font-family: 'Alibaba'; } .datasetIntroTopBox { display: flex; @@ -38,6 +39,7 @@ background: #ffffff; border-radius: 10px; box-shadow: 0px 2px 12px rgba(180, 182, 191, 0.09); + font-family: alibaba; .dataButtonList { display: flex; align-items: center; @@ -68,6 +70,7 @@ .datasetBox { font-family: 'Alibaba'; background: #f9fafb; + :global { .ant-tabs-top > .ant-tabs-nav { margin: 0; @@ -117,6 +120,7 @@ margin-right: 10px; padding-top: 15px; background: #ffffff; + font-family: 'Alibaba'; box-shadow: 0px 3px 6px rgba(146, 146, 146, 0.09); .custTab { display: flex; @@ -136,6 +140,7 @@ padding: 15px 20px; overflow-x: hidden; overflow-y: auto; + font-family: 'Alibaba'; .itemTitle { margin-bottom: 15px; color: #1d1d20; @@ -205,6 +210,7 @@ display: flex; flex: 1; flex-direction: column; + font-family: 'Alibaba'; height: 100%; padding: 22px 30px 26px 30px; background: #ffffff; @@ -223,6 +229,7 @@ flex: 1; flex-wrap: wrap; align-content: flex-start; + font-family: 'Alibaba'; width: 103%; .dataItem { position: relative; @@ -238,8 +245,12 @@ position: absolute; top: 20px; left: 20px; - color: #1d1d20; - font-size: 16px; + background: linear-gradient(to right ,rgba(22, 100, 255,0.6) 0,rgba(22, 100, 255,0) 100%); + height: 6px; + line-height: 0px; + color:#1d1d20; + font-size:16px; + } .itemDescripition{ position: absolute; @@ -256,6 +267,8 @@ } .itemTime { position: absolute; + display: flex; + align-items: center; bottom: 22px; left: 20px; color: #808080; @@ -263,12 +276,22 @@ } .itemIcon { position: absolute; + display: flex; + align-items: center; right: 20px; bottom: 22px; color: #808080; font-size: 13px; } } + .dataItem:hover{ + border-color: #1664FF; + box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.2) + + } + .dataItem:hover .itemText{ + color: #1664FF; + } } } } diff --git a/react-ui/src/pages/Dataset/personalData.jsx b/react-ui/src/pages/Dataset/personalData.jsx index f5632d0d..3d183016 100644 --- a/react-ui/src/pages/Dataset/personalData.jsx +++ b/react-ui/src/pages/Dataset/personalData.jsx @@ -1,4 +1,6 @@ import { getAccessToken } from '@/access'; +import clock from '@/assets/img/clock.png'; +import creatByImg from '@/assets/img/creatBy.png'; import { addDatesetAndVesion, getAssetIcon, getDatasetList } from '@/services/dataset/index.js'; import { getDictSelectOption } from '@/services/system/dict'; import { PlusCircleOutlined, UploadOutlined } from '@ant-design/icons'; @@ -40,7 +42,7 @@ const PublicData = (React.FC = () => { }; const [queryFlow, setQueryFlow] = useState({ page: 0, - size: 10, + size: 20, name: null, available_range: 0, }); @@ -149,6 +151,11 @@ const PublicData = (React.FC = () => { const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); }; + const onPageChange = (pageNum, pageSize) => { + console.log(pageNum, pageSize); + setQueryFlow({ ...queryFlow, page: pageNum - 1, size: pageSize }); + getDatasetlist({ ...queryFlow, page: pageNum - 1, size: pageSize }); + }; useEffect(() => { getDictSelectOption('available_cluster').then((data) => { setClusterOptions(data); @@ -268,17 +275,18 @@ const PublicData = (React.FC = () => { ? datasetList.map((item) => { return (
routeToIntro(e, item)}> -
{item.name}
+ {item.name}
{item.description}
- {item.create_by} -
-
+ {item.create_by} +
+
+ 最近更新: {moment(item.update_time).format('YYYY-MM-DD')}
@@ -287,7 +295,14 @@ const PublicData = (React.FC = () => { : ''} {/* Demo */} - + { const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); }; + const onPageChange = (pageNum, pageSize) => { + console.log(pageNum, pageSize); + setQueryFlow({ ...queryFlow, page: pageNum - 1, size: pageSize }); + getDatasetlist({ ...queryFlow, page: pageNum - 1, size: pageSize }); + }; useEffect(() => { getAssetIconList(iconParams); getDatasetlist(queryFlow); @@ -217,17 +224,19 @@ const PublicData = (React.FC = () => { ? datasetList.map((item) => { return (
routeToIntro(e, item)}> -
{item.name}
+ {item.name} +
{item.description}
- 最近更新: {moment(item.update_time).format('YYYY-MM-DD')} -
-
- 1582 + {item.create_by} +
+
+ + 最近更新: {moment(item.update_time).format('YYYY-MM-DD')}
); @@ -235,7 +244,14 @@ const PublicData = (React.FC = () => { : ''} {/* Demo */} - + diff --git a/react-ui/src/pages/Model/index.less b/react-ui/src/pages/Model/index.less index 81a18b11..5bf1cc1b 100644 --- a/react-ui/src/pages/Model/index.less +++ b/react-ui/src/pages/Model/index.less @@ -222,35 +222,65 @@ width: 100%; .dataItem { position: relative; - width: 32%; - height: 66px; - margin: 0 15px 18px 0; - background: rgba(128, 128, 128, 0.05); - border-radius: 8px; - box-shadow: 0px 0px 12px rgba(75, 84, 137, 0.05); + width: 23%; + height:164px; + background:#ffffff; + border:1px solid; + border-color:#eaeaea; + border-radius:4px; + margin: 0 20px 25px 0; cursor: pointer; .itemText { position: absolute; - top: 10px; + top: 20px; left: 20px; - color: #1d1d20; - font-size: 15px; + background: linear-gradient(to right ,rgba(22, 100, 255,0.6) 0,rgba(22, 100, 255,0) 100%); + height: 6px; + line-height: 0px; + color:#1d1d20; + font-size:16px; + + } + .itemDescripition{ + position: absolute; + top: 57px; + left: 20px; + padding-right: 28px; + color:#575757; + font-size:14px; + word-break: break-all; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; } .itemTime { position: absolute; - bottom: 10px; + display: flex; + align-items: center; + bottom: 22px; left: 20px; color: #808080; - font-size: 14px; + font-size: 13px; } .itemIcon { position: absolute; + display: flex; + align-items: center; right: 20px; - bottom: 10px; + bottom: 22px; color: #808080; - font-size: 14px; + font-size: 13px; } } + .dataItem:hover{ + border-color: #1664FF; + box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.2) + + } + .dataItem:hover .itemText{ + color: #1664FF; + } } } } diff --git a/react-ui/src/pages/Model/personalData.jsx b/react-ui/src/pages/Model/personalData.jsx index a52420c8..152b3450 100644 --- a/react-ui/src/pages/Model/personalData.jsx +++ b/react-ui/src/pages/Model/personalData.jsx @@ -1,4 +1,6 @@ import { getAccessToken } from '@/access'; +import clock from '@/assets/img/clock.png'; +import creatByImg from '@/assets/img/creatBy.png'; import { addModel, getAssetIcon, getModelList } from '@/services/dataset/index.js'; import { PlusCircleOutlined, UploadOutlined } from '@ant-design/icons'; import { Button, Form, Input, Modal, Pagination, Radio, Select, Upload } from 'antd'; @@ -148,6 +150,11 @@ const PublicData = () => { const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); }; + const onPageChange = (pageNum, pageSize) => { + console.log(pageNum, pageSize); + setQueryFlow({ ...queryFlow, page: pageNum - 1, size: pageSize }); + getModelLists({ ...queryFlow, page: pageNum - 1, size: pageSize }); + }; useEffect(() => { getAssetIconList(iconParams); getModelLists(queryFlow); @@ -271,17 +278,19 @@ const PublicData = () => { ? datasetList.map((item) => { return (
routeToIntro(e, item)}> -
{item.name}
+ {item.name} +
{item.description}
- 最近更新: {moment(item.update_time).format('YYYY-MM-DD')} -
-
- 1582 + {item.create_by} +
+
+ + 最近更新: {moment(item.update_time).format('YYYY-MM-DD')}
); @@ -289,7 +298,14 @@ const PublicData = () => { : ''} {/* Demo */} - + { const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); }; + const onPageChange = (pageNum, pageSize) => { + console.log(pageNum, pageSize); + setQueryFlow({ ...queryFlow, page: pageNum - 1, size: pageSize }); + getModelLists({ ...queryFlow, page: pageNum - 1, size: pageSize }); + }; useEffect(() => { getAssetIconList(iconParams); getModelLists(queryFlow); @@ -218,17 +225,19 @@ const PublicData = () => { ? datasetList.map((item) => { return (
routeToIntro(e, item)}> -
{item.name}
+ {item.name} +
{item.description}
- 最近更新: {moment(item.update_time).format('YYYY-MM-DD')} -
-
- 1582 + {item.create_by} +
+
+ + 最近更新: {moment(item.update_time).format('YYYY-MM-DD')}
); @@ -236,7 +245,14 @@ const PublicData = () => { : ''} {/* Demo */} - + Date: Mon, 22 Apr 2024 09:15:28 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=E7=BB=9F=E4=B8=80icon=E7=9A=84?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react-ui/config/config.ts | 13 +- react-ui/config/proxy.ts | 9 +- react-ui/jsconfig.json | 11 -- .../images/backup/component-icon-7-Failed.png | Bin 0 -> 3217 bytes .../backup/component-icon-7-Omitted.png | Bin 0 -> 3115 bytes .../backup/component-icon-7-Pending.png | Bin 0 -> 3239 bytes .../backup/component-icon-7-Running.png | Bin 0 -> 3084 bytes .../backup/component-icon-7-Skipped.png | Bin 0 -> 3115 bytes .../backup/component-icon-7-Succeeded.png | Bin 0 -> 3322 bytes .../assets/images/backup/component-icon-7.png | Bin 0 -> 1435 bytes .../assets/images/component-icon-7-Failed.png | Bin 3217 -> 6512 bytes .../images/component-icon-7-Omitted.png | Bin 3115 -> 6488 bytes .../images/component-icon-7-Pending.png | Bin 3239 -> 6663 bytes .../images/component-icon-7-Running.png | Bin 3084 -> 6422 bytes .../images/component-icon-7-Skipped.png | Bin 3115 -> 6488 bytes .../images/component-icon-7-Succeeded.png | Bin 3322 -> 6817 bytes .../public/assets/images/component-icon-7.png | Bin 1435 -> 3772 bytes .../assets/images/component-icon-8-Failed.png | Bin 0 -> 3322 bytes .../images/component-icon-8-Omitted.png | Bin 0 -> 3266 bytes .../images/component-icon-8-Pending.png | Bin 0 -> 3496 bytes .../images/component-icon-8-Running.png | Bin 0 -> 3257 bytes .../images/component-icon-8-Skipped.png | Bin 0 -> 3266 bytes .../images/component-icon-8-Succeeded.png | Bin 0 -> 3600 bytes .../public/assets/images/component-icon-8.png | Bin 0 -> 1314 bytes react-ui/src/app.tsx | 38 ++++- .../src/assets/img/modal-select-mirror.png | Bin 0 -> 1372 bytes react-ui/src/assets/svg/modal-close.svg | 1 - react-ui/src/assets/svg/parameter.svg | 1 - react-ui/src/assets/svg/save--return.svg | 1 - react-ui/src/assets/svg/view-param.svg | 1 - react-ui/src/components/KFRadio/index.less | 8 +- react-ui/src/components/ModalTitle/index.less | 2 +- react-ui/src/enums/index.ts | 7 + react-ui/src/global.less | 20 +-- react-ui/src/hooks/index.ts | 60 ++++--- react-ui/src/iconfont/iconfont.js | 2 +- react-ui/src/icons/add.svg | 1 - react-ui/src/icons/doc-not-inventory.svg | 1 - react-ui/src/icons/modal-close.svg | 1 - react-ui/src/icons/parameter.svg | 1 - react-ui/src/icons/private-mirror-tab.svg | 1 - react-ui/src/icons/public-mirror-tab.svg | 1 - react-ui/src/icons/refresh.svg | 1 - react-ui/src/icons/remove.svg | 1 - react-ui/src/icons/view-detail.svg | 1 - react-ui/src/icons/view-param.svg | 1 - react-ui/src/icons/下载.svg | 1 - react-ui/src/icons/查看详情.svg | 1 - react-ui/src/overrides.less | 10 ++ .../pages/Experiment/experimentText/index.jsx | 7 +- react-ui/src/pages/Experiment/index.jsx | 153 ++++++++---------- react-ui/src/pages/Experiment/status.ts | 5 +- .../components/MirrorStatusCell/index.less | 13 ++ .../components/MirrorStatusCell/index.tsx | 40 +++++ react-ui/src/pages/Mirror/create.tsx | 5 +- react-ui/src/pages/Mirror/info.less | 2 +- react-ui/src/pages/Mirror/info.tsx | 76 +++++---- react-ui/src/pages/Mirror/list.less | 2 - react-ui/src/pages/Mirror/list.tsx | 72 +++++---- .../ResourceSelectorModal/index.less | 10 +- .../ResourceSelectorModal/index.tsx | 148 ++++++++++++----- .../editPipeline/globalParamsDrawer.tsx | 33 ++-- .../src/pages/Pipeline/editPipeline/index.jsx | 10 +- .../src/pages/Pipeline/editPipeline/props.jsx | 108 +++++++++---- react-ui/src/pages/Pipeline/index.jsx | 99 ++++++------ react-ui/src/services/pipeline/index.js | 13 ++ react-ui/src/styles/theme.less | 27 +++- react-ui/src/utils/modal.tsx | 33 +++- react-ui/src/utils/ui.tsx | 28 ++++ 69 files changed, 676 insertions(+), 404 deletions(-) delete mode 100644 react-ui/jsconfig.json create mode 100644 react-ui/public/assets/images/backup/component-icon-7-Failed.png create mode 100644 react-ui/public/assets/images/backup/component-icon-7-Omitted.png create mode 100644 react-ui/public/assets/images/backup/component-icon-7-Pending.png create mode 100644 react-ui/public/assets/images/backup/component-icon-7-Running.png create mode 100644 react-ui/public/assets/images/backup/component-icon-7-Skipped.png create mode 100644 react-ui/public/assets/images/backup/component-icon-7-Succeeded.png create mode 100644 react-ui/public/assets/images/backup/component-icon-7.png create mode 100644 react-ui/public/assets/images/component-icon-8-Failed.png create mode 100644 react-ui/public/assets/images/component-icon-8-Omitted.png create mode 100644 react-ui/public/assets/images/component-icon-8-Pending.png create mode 100644 react-ui/public/assets/images/component-icon-8-Running.png create mode 100644 react-ui/public/assets/images/component-icon-8-Skipped.png create mode 100644 react-ui/public/assets/images/component-icon-8-Succeeded.png create mode 100644 react-ui/public/assets/images/component-icon-8.png create mode 100644 react-ui/src/assets/img/modal-select-mirror.png delete mode 100644 react-ui/src/assets/svg/modal-close.svg delete mode 100644 react-ui/src/assets/svg/parameter.svg delete mode 100644 react-ui/src/assets/svg/save--return.svg delete mode 100644 react-ui/src/assets/svg/view-param.svg delete mode 100644 react-ui/src/icons/add.svg delete mode 100644 react-ui/src/icons/doc-not-inventory.svg delete mode 100644 react-ui/src/icons/modal-close.svg delete mode 100644 react-ui/src/icons/parameter.svg delete mode 100644 react-ui/src/icons/private-mirror-tab.svg delete mode 100644 react-ui/src/icons/public-mirror-tab.svg delete mode 100644 react-ui/src/icons/refresh.svg delete mode 100644 react-ui/src/icons/remove.svg delete mode 100644 react-ui/src/icons/view-detail.svg delete mode 100644 react-ui/src/icons/view-param.svg delete mode 100644 react-ui/src/icons/下载.svg delete mode 100644 react-ui/src/icons/查看详情.svg create mode 100644 react-ui/src/pages/Mirror/components/MirrorStatusCell/index.less create mode 100644 react-ui/src/pages/Mirror/components/MirrorStatusCell/index.tsx create mode 100644 react-ui/src/utils/ui.tsx diff --git a/react-ui/config/config.ts b/react-ui/config/config.ts index 4ecf3ebd..d0830923 100644 --- a/react-ui/config/config.ts +++ b/react-ui/config/config.ts @@ -1,12 +1,14 @@ // https://umijs.org/config/ import { defineConfig } from '@umijs/max'; -import { join } from 'path'; +import { join, resolve } from 'path'; import defaultSettings from './defaultSettings'; import proxy from './proxy'; import routes from './routes'; const { REACT_APP_ENV = 'dev' } = process.env; +console.log('zzz', resolve(__dirname, '../src/styles/theme.less')); + export default defineConfig({ /** * @name 开启 hash 模式 @@ -39,7 +41,8 @@ export default defineConfig({ theme: { // 如果不想要 configProvide 动态设置主题需要把这个设置为 default // 只有设置为 variable, 才能使用 configProvide 动态设置主色调 - 'root-entry-name': 'variable', + // 'root-entry-name': 'variable', + 'kf-success-color': '#ff0000', }, /** * @name moment 的国际化配置 @@ -157,4 +160,10 @@ export default defineConfig({ }, requestRecord: {}, icons: {}, + lessLoader: { + modifyVars: { + hack: 'true; @import "@/styles/theme.less";', + }, + javascriptEnabled: true, + }, }); diff --git a/react-ui/config/proxy.ts b/react-ui/config/proxy.ts index 2b02d8f0..0fdf89e3 100644 --- a/react-ui/config/proxy.ts +++ b/react-ui/config/proxy.ts @@ -1,3 +1,8 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-17 08:48:09 + * @Description: + */ /** * @name 代理的配置 * @see 在生产环境 代理是无法生效的,所以这里没有生产环境的配置 @@ -16,8 +21,8 @@ export default { '/api/': { // 要代理的地址 // target: 'http://172.20.32.181:31205', - // target: 'http://172.20.32.98:8082', - target: 'http://172.20.32.150:8082', + target: 'http://172.20.32.98:8082', + // target: 'http://172.20.32.150:8082', // 配置了这个可以从 http 代理到 https // 依赖 origin 的功能可能需要这个,比如 cookie changeOrigin: true, diff --git a/react-ui/jsconfig.json b/react-ui/jsconfig.json deleted file mode 100644 index 197bee5d..00000000 --- a/react-ui/jsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "jsx": "react-jsx", - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "baseUrl": ".", - "paths": { - "@/*": ["./src/*"] - } - } -} diff --git a/react-ui/public/assets/images/backup/component-icon-7-Failed.png b/react-ui/public/assets/images/backup/component-icon-7-Failed.png new file mode 100644 index 0000000000000000000000000000000000000000..2427996b7f47222d2e3408932666352306e6a857 GIT binary patch literal 3217 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 DGP4ez literal 0 HcmV?d00001 diff --git a/react-ui/public/assets/images/backup/component-icon-7-Omitted.png b/react-ui/public/assets/images/backup/component-icon-7-Omitted.png new file mode 100644 index 0000000000000000000000000000000000000000..33a4445eb39e6cc0c934948254aa8b2662edb227 GIT binary patch literal 3115 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 literal 0 HcmV?d00001 diff --git a/react-ui/public/assets/images/component-icon-7-Failed.png b/react-ui/public/assets/images/component-icon-7-Failed.png index 2427996b7f47222d2e3408932666352306e6a857..9854dc3865757a74d104bb4f2ae82741dbcbe4cc 100644 GIT binary patch literal 6512 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

-(@B9*TV2{IOy0m*E}p6+t>tg z{FMy@NT+==9L1%Bct#n%50xMAVcG^hd0lrc{#j%6g?T^4QY%qepWJxP4n>BRm_N<> z*bv!#8=t#euAodppeNMDB?6Z|iASJUXB)Tm!|u+yaF48}b7b`FIpK3yfYK3o&XEC> zhU$(7tC4=s_S#U+u1P?}y{@iYbA#-$2Vfw_L*Xj-ZzB zLv_>1flc(&jJ}fq|B1ce`jXc1n-_ItoRl6>Ip*wuIIYy0H9a7gH@(z2^5JVwgYl)9 zdi{D#o6`jG&N)C-r)bpc;3DEfN8=&tTN_>Q(T2lMr__jlA7@|{UtyH*YM(2n!bs%aR? zbrXWYVy}u8bM`NOFj3RZL{h!$)ieq!dKGu^6HwSrWn!Wx>nv!R)rXI~lX@8xH^<8Q z9h!kbDltnrInc25Ds+q=oPa$HYMo7GUevNjKHEl)QMN7Gjcc^%QOb3qD?$52(3yWV zqjN_J1P0({-&DMlo@{m%=vG?C(-~Rd#=Kb3=dYT?PMQP&drd6~v+gm64cP@JDCTda zh8Me`vv$JuUdV=SL0;=0C}nO-Un&53Zy#E`>z@!D*?_aRQiuML(!7M+BS)Ur zdL5lZcEZre+cZv9jMZR(=(O5~BOq2V8vvZSPpk9n)tv2nnZf2&xuV4c`b3SkIP8HP z@pdq1rqL_T_Hsv_emMV(y_$*HX=ExIQlNjmmwj$EMc9R4m7|XAl~BL{?Z{J3OSb); z#EE9mNxnq#|2MdTA2OJieGGxABDGe+J?@=w`c|6hOcNkuB+3=6ixBF7Cvaq}eZG>R zfPue*6EU2*qi0lM8!$ts8~5#1`}OQQHXU7vgPh0^>y!B@C+-&+xe|e$$g!|?aH9`W@mzzUN zB#7r`RJ*=-tTjaqkLcZ3@`nxN#7juE;7tVa+%+BonaABCsU2R4Z7x# z>$bF_q20okw67hI*ZJr=Cgs#6K22KDQI&FQR|w)^<~mte1eu8?TrpP}Z1Y%RdHlni z!b(E{KT}xIhvbB$%oz2f5jTw-WFB&{E=u*G4U5bWd%fLgVbp8Nc_1xw6N_3^0#Amz za-Ir42AWm2uECZA_2zvp36I@S(Q=G)Gy`JCskaUqL09CV=O?lHah)XeTRL_bgU^mD zRF#NXfMS)IkW%cBb`s3`Wq-!t%=HxSG9J8CfrdZuKfEI*@<*}I1!XRlV2IE6->EB}b^8K2R(7O#}GOBt? z8so6|v}Id-Q@5c}KpRnR4opQ4>kxVh%Bo!WZFF6yenJ^|RT4wRc6iSMuO@bQB4P{r z%J+}_EJ6f9PZCdVu;NY#t|Ps#4HZ4{QYl3w4f=q(dZ%~I=?tv@#3q~*hJL_`&uYr* zaYeSVB0T7skK;F$oyK@ze7acOT?kS`wi4QN_VMCqUWDW|!WzBXLokSf#>r6{a&dh7 zTBts!i|RW^%pF1PO}D37UKOMhXHf6RsUNqSMj`^SS;SL(ZY{5c|LWx*zABd#v~$CD zDpped9TA$x?(Zy1q*tCKSgQwv`8d74v^(Rtp$v8s6g$Xf3oORYH#1K~alQ|i%m-}+ zv@G0D)j;1Cimbte6iop>D@Ew8Z{DVqD;jB|XQvPvVLr*^YfoSEdM$GK@pT6zvA$P6;n^8BMQUS zOZ?MjLlUyn>kLnA(;QlU#d={ZFYONH2XlYokDF*UU>r^{U?F*jGVKDMCf?U=qvv`* zA)iY7qjI*UFYTmIiCbwT_v58%8OXY)ucpH)q`*j8Ss?1%(L&}1up)N%VqOp}<5HUz zJ~uF`_VY*<8EO%4u&J;A8g0!jHQEp~kcX^a<`wZ;ks)N6Xe8~e7oz%p{v)}HUj>M$ zi@W%W0sAlvuO%!_E!u$w<5GP8jMboPaY+{>^B-qGVfcUIhBD~-Kdf@P0kk@rQ_KGl O3P4?1Td7U~9QA)dX*4JR delta 3197 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 diff --git a/react-ui/public/assets/images/component-icon-7-Omitted.png b/react-ui/public/assets/images/component-icon-7-Omitted.png index 33a4445eb39e6cc0c934948254aa8b2662edb227..59b8102698bcf400cde8cf502dbcb8d58309b492 100644 GIT binary patch literal 6488 zcmb7}1y>Xdw}odI7`kgnNdf5&=^9#;?g5mP?vkNFh7ReJZs`;mLb@C2kP?Qj7eDV$ zxM!_>_Al7yti7HXZ7nE14mAz{0KivOQGEB$KmMPv!2foFjluXoL-&wZ)y4WZfmrXO z0RSpORYf^nU-MHl> zxZphm#k^Hz+7=D-{Mrd5pCT5HhNJ*>DOi~tK(841H%Sh2%?~U6eV#oYySMec^cDl^ z%+nTZf1Op;9#wYc1Uv^!NZqb^oawNqC4UB~y?dL@l>QFRy3C*gOh@Ay7E64;Tgt+P zVVLa3F#JNx89y*iRZ2m!f>3GsY1J@g# z@>^f}oGdZ6d|WR2{q8+Bw}MT2kK4{*%oZ|A@D0^<3@WkZj1~rno!*<`^I?TUmPOf!HrbrrjykCstqms+wZ=Gm-I0lUugR zwKC3y5Vpr8m|fn>%)WYBB*#M;2XJGfP)*Ni|_Q=2U-@tetI^&6B{JfT| zXa8MouC$Hatb8ui!sokqey!LJdRCj`B9HO+Pu)6C$E|r)wH==en8XvTlW*dH`eH`A z3Tik~&eRyC76`3eFqkr=ASoHQyFQVGIl^>Yk8kG7FSY*U>+M+Hm*`yGNfkO}I4ab) zR@I~)#)y;ph1(N*D{X&pF5%&Ql6oOA`*`fEBpWuV@g^aBv9;&sEpe)BCXe zzI8?`*l(FAQ#f{U*F9ICUcK85R9)~c=TzT5e!FxOFm>on6WXzRUumF3%{l#iu(7x3 zPp=twF-b|tY<%g#lyTbRb-ZABN9JLK45UbLXc`@greklHqlF$Cijimz<#={2=Q-$5 zfM&r&H=tcDL(=?)Bp_(p>}jL8e0S#o77`f$#zLFA!rU<2$Vdq71CDkS&AlHgE3PH# zJ5XU~?w!kUGHa~0xozetG`JE~n(e$jaLt)0V2-(>Mu7Ixlr>EVpZUK}d_IOvp93@{ zA4tyfxBp}4^)tCE@w#nTk%Pt)c}-_}rqTm6L`XDzZ!rG|ahm!0`OVa~dI179r0HNSXX&K-XR7)l95--v&tCn* z1mU8@4tnklJ+=R@gOY(fXNSsQbIZ-`tfx=GX4cj_na$13Zy$da=Rv>c8TRSd7_ZLqt)ztC>V(~`(tR-SuUHwe@j*aR*&0b!Q@gjyu*MYjd}c}Mnz2P@{f)Z99@ zjqv@Y{~ib9Xbyk*Y{VJIzU@O~`h|?+I*l}$y3#@NYX>ZxKG;`+TAWO=r} zJ^U}r5J`TQ`>aHKcOZ4}lti%}mhjS_>seOr=8;E&i(lS)T7bd0#xwDTuog>X zWCkKB98I6kBquz#U7{Rm+D!`hX#0lJY~`VP=419K0fi?H-^-W-!MsI80qWLdM}K9vPtEoq6*@k_SR284sDSd)uC0Be6#{}FFp0Gt z^)P(qa&zc_K0KgdZEMDv_f>-PvD;l2kA)(g;L)!5}JQ5MkhGGt4s#b}Dec_9h| zZ}(BRqrKhOPr!JH6xBH&(MX;p-_2y2z9a98Z3%7)=gmO^2Ne}YdQL88$xla9f9XSr z>bfc`=_~8%WJ0J8J*}+6HG{3K=A*Hy%Qb)4a;T}Pc_W1fXxh?Km|wkhA@^9Ow;=pA z^G)6lDZolVIhFf8mV#SA_@YMSg#&`i=o?EVQcOlBe}60!sVNmNyfj(eGJH>mp^?(W ztetS%ciezu^Qq5z((C2#RZi47=8@BRm-i10N|oEiLWQWJi@!9><}qJM;^rJoI9>zS zlIcae=TNB^UUTdHjG(#g?C2x9%iWYW9b;p>ZVZgttYNrsxz zvN-Vqo^bcu46?{p0Nt8r9uAXM*YLa`*m^Ip47_u`K-gx*!lq-ncV2Gc-D?d^t zo*S#>@Mb$LPs?mPiU{7F=MQ7U*!Jr4$ODB~YG{@so`gm;M!#0a5zbsA-xNSesjjPL zZO)(Gpcw|HbCvE!tIYvtIXH3{wXVKSbHi3Oy5bvWREVgnm1DdM0x^&7@d`T5*Gy|Ad?J?Fg;g`WAhAn@4{=O!Koq&o>pr)qI_rG8MT zQQS9Vhxs!v?`;Ph;%J6$xG|YihJ>`I(;)hc=wO1^Je9vOxYv^@+^^X8H{UYjj$H{x zf7k*jpwFF`K1jILRVlKv+iI?RN>?Cj0ze3K|typC*4lK?mA`^stSOhcwJ z`4Rf8%48^NCgAKeF+`%lIPrmr8rMG9*qE9I(kdP#GDZ>H$DL!zBKfOcH`6l7r+e8p z`h+PB$C8^qKV9zN$5+@36P{kllmkYB%XqR&- zr-)k&;%TpEnwU9L4V*$KjLS8Aad6m&QWT7&2|x4}{nRxRBHP3Zk=RR#<5>#j`JxsE z>|@AadL&NuM?a%w#lytB2dL$~DfCZJgIXGUw?3Aq=x;7rsLaGqezSPv|H4r3f_CVP zR)gAKJ_We_^VJROH&R2wrNg7b*2bAbX|{N>>mdawUyQhEbMu#Kl*xm9?fg@ zGa+}){78rk>3Ct&za$Kflr#}btxl`H@vM1QbSBjwqaLwm6+Q&|lBu>M`-Wd45DhQM zN(9<$hOsPw$W_)WR9@QFf_%G_Qk zWXr3AdU zz02G5czGtUhx|DUDl_tL9>!`Z*gWtF|6P+n-wJ^ZE-BPc+t9g9o8o&C{)YT8acdr3 zoPZO|Y^%tYsSi+I$SeSREy`=LWxu3Jt;1dOYe?F*QF%RfQi~5@?4W!<-_9CzbU=6h zUq%&m0oCUWEeK;-C{^+KeN(h&qX_X8iTn&(CIbhL5iO=hSu%6Do9al7-KIaEb$wc- zXB1CH7epO>4Kx+p7kDlC^@^>qT}X8$!q1LhJGiP{zam!Oz^(nxV3+F9dp0;U9`_Ni z&3wvRgth>8r~95dUY|2Cb+1^}(2g1OYG9MA=i*1?5Ivp?^3zguddY|k6F)Vq251IU75Fol0en=IxLU|=Jx1%%-hR=QBix zp(%%NzLVcnPJ}$b(JV-KGJk(xy0NQobF*cs0Ec#ZSLe0egi_VyX0t*pM;*7h^c4!oWkjejwu8KKZl{ zm??yuh%BX-atlY%N5l!8uI%UoaLHL^MG4a6*1g}y-}}|!QF0)hsVl@p+b4lNsoOXuH_#3#mL3L0;5d2nU1hH*oB~EH)2t4&Y@-?gEYw zQFC$q)UEo7Zj|v1H45irm~q#x7qzVvP{Q6N2|PY@r{I}oRhi$0RL^3h7c%I^&cc;) z@lrs#;~&2}y?Xh|pD__)bml3ep>}63T4Bcyusq#KN^0=$sB86meg@R)l_xr1j&eIq z@hO<-lXLL8AClng3+x@8#3OiY>$`u~RT^iQak1tS0M6SX>Ft=Kc1HV*!&A%GOF2$L z?o1f354q`wRD*fV46~GPi%$dM;KKTxt@2*atYkv-P+S^^wAV;gycUm^Li(F?N77ex zC#czFo5fJ?uT#XmzA|_Q$3YPaxH@kwS++3#PvVPW&}pQl>N6kIsiv-M^g1Fa z7_K^H6Z=K>?|ih~pFUVuXS=cyZ7n|B1f%|w1K?zqUe2IjFmcGO_bML6U6R;#Y>Kux zLPFbRH|$^?cv7x2wY1I}>Y6rD>Jz#qAKLQ5duQVDRljMJD&Ul)>At(vbM2D@mQpkr zVh|D3K$UohG&Fb?Pkt}k*Akj%ZNk-t(>kht(9E5%@hef^&(2QZN!C85FfD~dQt4Pd#_>CnmyR0$APau7f01wv=H@sH>7MPouOEv zB;lBl!IUY!Ol|yvM>bd}ZOH<9F9$NpBx!O4g0+}uzF)EV1>R!r55{f|B(~~C`j7H| zrwzTlnRzh&V4(}95fB4HHiq&umFr~pZls6Nut9b-3zkEFikjt9hr7~&ql$bs@v+YY z@?K2Ld4#bVVduNL+LonJIKYt)3|3_33czjIbXh7$m~9!%B>3eG60M9P_SJydx#!b* zFT=AKjYg%&vPI@Nb}v{znzK;AqBrLib7NCtk5Y!tS-pJheAfaHc{sA>>4&D6_rXTq za>RVmxJuHc8CCGq#g+~{6PNrg9U{p6sq)9EtK8c**QY#8>rJm+4iR_@0X(jCriBz< z82P;;*Sp%cU?%@ZD04TJlu&6$R8TcUWQIZDD`!P2Osaltcc>qbwkJRCLZP z8U85!um36tmoPuA{MLxTex80SV>YW_75K5m?e)DF9)1``0upOw<&Ku_o?o}PqF8Hy zd|TQsItr~vQ7#y;>62XurEh!l#e}mA{eroNIG=5BRcG>a84ZDJl`4gJOVOms`vSRD zmVe#q&5umA^Mi3e6MGo-VvpVP!$hn={CCOgSmY?U0$?g%dkCfdA=g(kWaw|2-RZ?y z;>6zwwH^_bK8$Wei**OzfW|66P?@wJzWvS^G*v4k5;@V@M__b(J6nue5#Y_^i1#T` z6`dbutVB_%;5-Tym-ZQ1;jws01V+^LuDTp01p$slA=_e|fhP~9RP^vfsh%F z_1u=&Q*?}lBI-?KWqR}R|4ISPv%~R6A%9~x|fBM}2<|zM?AAULKNU+}8 z`?D2B+cj4_11vKYg`g(oq%{A`il;q$wq@0Z3?A6p4(4nMnj(74Ua%OIldrrN+#j#+ z8OxxF)0P{95Bs|jLQ${|T*pHTYG`0|W$It6hT-&GsG)85zQ=6(0&h9-Dsv03Po#_s z+X|jPS$9kHFR;tA^?B%$`3w2V5$&NmhGA=kd$#Vs*XQmm4DZI4S_I+t!WTOCl43gu zwR6I780O<)9G7r@tb#@9u;bye*VYeR=IpEH@PbgOb6ti|v>TyQ6?2s(a%u zXa)9boQp9*mY295sP|K2GZI(@7&36BDsr!&nO{njtu;;iuJJ3FDOB5N8SCB@)$Krg zA<{~Bfeg>u`9TIZljGIHs3l1uuZOQ!$_-c^dmrKa3?KhCyMn>w>WN`LW1)UKu#N&! zB#^FX=DyIg&T;}r;862ox#8o#J6N^#bXY{xa9&KL%!i5pNoHnxMYKLM)tSU;?7PEDNr(^MW>aniUk|OqNpvR+1rxN8@rDbU0;=m z4<>|Sy%6my)|z;I(e!QOT^ZYsn~`6%oGx+gW}i8&+;;U%)9vQEx5~QlSSc@%W zsA&aX&?{>+OxQFgL5<%h2O|c8>pB7Uh%Bm?bZ41Q&;R7OS0JAs$+$d_sT&!>k8zzK zo7)u>26c0^&BkX|qL%ah#=YSWU&Oq7GA+wrKPuOIwy#x)8NMC|Qmn|VU8Lt~-iz4; zNPe{f|3NqZ)wK3Q=dmrkdP(!CYk~xZ^by_fh4*4Cx=TA^mYX!#IffqW?D#564d5KN uV%8f5T+ngk{{sndt^X%aP*wi(7vx`F4f6l-VDt}_092K<6l>*Sq5lJQQ%OYt delta 3095 zcmbW3=_3=4T=}T+~n+&W-6v7lDSF3EQT26 z_{@>}$dTNnx%&3|7k=-juV?Sqlh>$P86;aB2cEMwGe(7btmWGVh<1x6A#NHP(eRei zFJSbUSydCDTquUaq3UcJpa)YK9`GTP-_!i6$grkOk(o)43Pq6ZlfA5`GZ7XG6T)P% z_kh@~F|wTO((3l~b{=AKf=t5>$-ZHTx^C&z8a3Wv^P~Eni;EMf62UBWEV%=BxQKHS z>UUteG0_e*hhL{)7+!RbY2~8K|VG|!^MvXBB=2cQ5tR9Z{SxxQh6GncbOSk zSvZuN+d*KY^U)gkXwCL$O|!zlZs_1CrV>9^#Aj9idkJy3e#VX7kd&NkIZcheezHD! zC1QIa^-1K`TnF6ei{x{y;3;1(oR?RlE8X@;FMidLCXoUz0C9FdFVx-iCvY6kd}8~E z`(vOVb42u@-WFK*8z7sb934%|oXg426kXiJn>HCwv}vOHDzqQ8JxA`a+59VE%RSE& z>EA?TtA_)pn)8M$+!->TxOb2wjWsS5{h(x2IGt?q9iT9eE3qTT`INJL zkc2D6>l#=}UAfyL7(JzU6A7AE60~TSgYcJCdbHSR1x=)w5Qcittugu7qoXY~ zH8nC81Lk5FSLT8gqf?d@6U{sU+;3#Vsi`5))e7Tc`$Ks_?Ho0YTr92Y<3N)|6qm| zJ8{I?Nmk424U2o2(E*|egEp4e)->el>UpEwes?^*wB&~;a7v{p5t_WbJXIPBJ@7^# z5XQ|L74A*Da<+t{+M=R`>kf6-Zb@ZUf9-+)K6o=h$`{l zpFgLh2k7s7Gsuka6|XGic{3)^ON{(0J(H7*E0Mh|Pcvx3N;p3l{W)~0zyY3@Bl}Q?SenAhl zY9Z5k>o5@ypn05(XfYf1!ts=q1luxrLsYAf6I7DnGYc#Go z<~U+m?0J%<8cm@l!rYZde-QqTdvcq|%MDI{(E;u3hZN{1y8m3L5#n&(!|IoLr9+b9 z>~KgxZK11T_pjXVTj^c(g<`kKw0GmX_V9xFGxAR>hNe{r<~23Y4wp^FWE~|$ohfY? zqgQopZ7pRGa;r~2d=qmYOBAk>M9%Lxy4@6M%Ovv=_gr%xSPa|jz8m+e5Tiq?T~jZs ztTvfVYgG+A5yJ2b(w&eEIdA(X(of~Fa0Pw(Om0k@42#0q2`Kc^mEgYA3ma-n1oLY- zQ&ror(Bv+boPV4E+JUb~ZCv6BC%<~^9+`0fnMcorg$NsDnWl_Xb)ARGBz@N7pU=%) z`jbsmRyC)clj+(9x+!*(ow5B}X{-E4%s1SSE*SyO(gl5K2JhJ|(BflJMGqX7*=P~U zd^F6a-qc}#^fP79jgNP#*xf-|po~h7jjlpW=L}@HpG|!u_YA&Y*;;6dIN1wvMSR`x zffr-<*C&P1fid7dH-$3y)UZ^iz=O+CXPXzEgn#?PMkclEDBTgE4;YP0t_xzMzz&w4 zP-pH6$_{#Aa`O~2EG+Cc11C#1@!7#`Otrjhk*NahtC({H4Cs+xw4PI7TC9Y%uKnwA z|5V~rQdX`*&Dc-&w)*J={tu)~z4<{<|LLr`#(E92mgJBK{q5ib2I&u^skquZ zaGH87rFoLEZ7-h3^eWl6QABSuZ@cto%j&8WUIM@_#QXHbw4NZ2s+<)C7$F*ka<_W#A_mB=<(LJ-oU)Y`-u*VH=9UDjcr2v-VrwU{K=n%kd5M&0 zDE!VBFD`)T<6f-@!P470jw^gh>P*!n#T{Hr@7bf`M;-%mvks$m^-y2!{R4VzOUM9k z`poJ>Ta+#?BGawlxYO{60dO*r`Yl*P_ChQU`2l8hy*`O@sL*E{us{B!CS1$X)BoPW zMbr@c_S<^&?meR>eNFoe<&X5t(+a#83eWd9yH+Bj3HE*MC6ieeZ|^X_vJWccazfni zB|%BiiyJ$NyqHTRJulr5%#8x(Vo^PWffi%5@}A_-vw{ z$KilkhDezLHn1WmA|IaF1xJ_e1@$@5*kg4#wv0X~-wKES4#8Hm1v6(Ua_2`q9~VDD zm*RMd0F{O_(uVV9g}(PeMk*{)!LY%@2oIoe_Pf`iE4vpLuTd@1Z*F<-YiAo4H-^;m z60^+mi`gecJ=al+x?$V#iy{%3K1vuR?ZDa=(BgT!3k<>G8(MXWt6V0#R6qTb3)7xv zQX5OTukb7@rnM0=-QCz2h5_PVmGL$ca7)hl%bAiKyJJLyc7Da+$DNAEvq z2@6WI2$xE3X*>Kv9msjqojj<5Wc2kc?V4w0N}N!EV>Qj&?WKBstFt0EUc-A4?JqfW z))@bQzxq+=$y+feHxR&`Cvas(jxYRsf{h_p`6WHeE;WMROu;+;J130y#{sm2?zSGELP>N45uTl!FufuC-wIQp)|NO*?yvPKNT&LaF@1gR1q5T3t2c+NF3N zzyp5O{?gNv!+#LYVlYNQ$7Su$jJ?FE4(;EM9&7SaP_~+Vs*!g-ngz9_#fvQoBbDLh z=FUUu*&LG61Q|M3m#{iP>G#7ySJZ~hfw0ze6mVxEG;LkA1ex~P?|$*?TrA{DeuBar zTGK#U>QxAI(n8Y8r=J7m`nD9*sqDj31&W*hx9_d@?*T-2#ppMKf|3#kzaJ=;k6rb z0QV+%Cs1bhFItWrM89!dZ^zI^b32gh^+7(6(?WG9wp#Y!&XKU~F&25U=$=8feb>*e zLywX@5#BmiU~h$Lap~0Ua?-ttSEqQnuk0!~Qt9a{>WTiZ?`18Lt z>B~z@wu$g_%gOY~!+9A0bwuETPapfMoiW?7;N>H@G}Y&#>wxO{!BOed?dy%9ahi(o zfZ{}%x|k?mcWy}FR>TzAOiq`x^%e(p8ynMP8vnjyqmc%cZ}J(dJgXjUm`VFjd+MT! zN>KXH$7_-qSINC5d62^ve;CH&#oUpCQqdtYn3A$HX#&L6LcKYw;4{-9;jFl08JZ4{ z5NO#HW|T{sJ#~RSujV{Z-tkqBgguBCt<91k#kGr9ypsF_~C-&vd6n^l-#;{FHX8{_c+ diff --git a/react-ui/public/assets/images/component-icon-7-Pending.png b/react-ui/public/assets/images/component-icon-7-Pending.png index 12a5aa4e6adfdb1a1ead10c001b7e6254beb7516..bf06cf26ca4d5af893f62d619e96824eec2f4a77 100644 GIT binary patch literal 6663 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 RIJp1-002ovPDHLkV1l#bXy5<< delta 3220 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 diff --git a/react-ui/public/assets/images/component-icon-7-Running.png b/react-ui/public/assets/images/component-icon-7-Running.png index 0328188f35ac3ab68a8c14714abea91940a2569e..6dcc20d665ca42af3fa37e7588bc045a505d3a8f 100644 GIT binary patch literal 6422 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 diff --git a/react-ui/public/assets/images/component-icon-7-Skipped.png b/react-ui/public/assets/images/component-icon-7-Skipped.png index 33a4445eb39e6cc0c934948254aa8b2662edb227..59b8102698bcf400cde8cf502dbcb8d58309b492 100644 GIT binary patch literal 6488 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 delta 3095 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 diff --git a/react-ui/public/assets/images/component-icon-7-Succeeded.png b/react-ui/public/assets/images/component-icon-7-Succeeded.png index 306769347a87486bc7583d4d1bb25b81d5b484d7..f12a5a82461a317c9dbffb0c888874fe9b2636d9 100644 GIT binary patch literal 6817 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 diff --git a/react-ui/public/assets/images/component-icon-7.png b/react-ui/public/assets/images/component-icon-7.png index c0c1087ca90522bf01fdd9113379e20649ff2c79..d550d28c5f945b1974d21e934481165c3cec416f 100644 GIT binary patch literal 3772 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 diff --git a/react-ui/public/assets/images/component-icon-8-Failed.png b/react-ui/public/assets/images/component-icon-8-Failed.png new file mode 100644 index 0000000000000000000000000000000000000000..a5d20128f700f84d58b692203bacd021a87c7909 GIT binary patch literal 3322 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 Eg4skswg3PC literal 0 HcmV?d00001 diff --git a/react-ui/public/assets/images/component-icon-8-Omitted.png b/react-ui/public/assets/images/component-icon-8-Omitted.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0015cc9488ffa985e898cbb8bc4719b8cd327c GIT binary patch literal 3266 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 ALI3~& literal 0 HcmV?d00001 diff --git a/react-ui/public/assets/images/component-icon-8-Pending.png b/react-ui/public/assets/images/component-icon-8-Pending.png new file mode 100644 index 0000000000000000000000000000000000000000..3dfc540e41738bc984d6f304d7449bda12157aa0 GIT binary patch literal 3496 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 literal 0 HcmV?d00001 diff --git a/react-ui/public/assets/images/component-icon-8-Skipped.png b/react-ui/public/assets/images/component-icon-8-Skipped.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0015cc9488ffa985e898cbb8bc4719b8cd327c GIT binary patch literal 3266 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 ALI3~& literal 0 HcmV?d00001 diff --git a/react-ui/public/assets/images/component-icon-8-Succeeded.png b/react-ui/public/assets/images/component-icon-8-Succeeded.png new file mode 100644 index 0000000000000000000000000000000000000000..c890e8a1f653944b6be80e9ef018d30dfbe66d60 GIT binary patch literal 3600 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 Wjz`u2txuT%0000O3IP)wq0voW z+*JK6^Zu2AtsTfs-24bXn^Mw^5Y+o~M<W=c(vcZN1XK zTtF!ZNh3+r8J~&sssQH(1JEigbZoN_NxFuWIwWWV-#2Z5_eAaAXJSw`U|}!@dc90d zOuU6juf`^(fX1IiU;kfOw1cs`DHkOg!h+pjr(#$ZU@({q2$Q?T4SU!_ovaB)fXmd! zxDPf!Shqd?B(CNK3<9g~OLiw-^_Yb;5LB<{t9nW`J61qR{mDIbaj#KPKrb)=?P4JB zm38w$MSzkMWxyIhaPM~(6=lG-?_zn!u`D3I0ru889@?2_Rn3XiKgtF?ffp|ZSTqJ& zEvDS$7+-E!Ra8Ro zLWoxkoPlvpCnSBhDAgqg(=w&lR}eHH#vfU(>AKW+1_o=jYDC9L^W*Qqyb9$Dk{qXk z|5k=@U5-!1X4buDU~dm3#~$0tMAu>y_u=~|WyF{~P-pO07sHFf!C1!m`jme&UK)q$sKJYWoq$5Y%#`n6X#inzt2mcb!fqS8rrK0gPH!D z6=SA88mUwd`|vz8kgDL^#KLV`MC%s!<^avv%!t1?w@WEt`k`<3<#tU(5}eNS0uGa| zu;R*QDg)Di(Mlu6;O{M)tFh47l+=~U=p)YLfd*NYuN*A4*_WcEICT_JZaTnu>l}-) zVv}q&COWg3N1UvE`DkDUAfL_bnL@@ad5?q!{znHh0hgg%$ktm{C7lkuc!1ax$z+}k z%rs6inPm$hgf!;KHUA4RhO8gRp`oD8+|DQ7y?|krthr)d@bg*SDlBFu>YR>|?NFx53qf-J5H%Bf<~1gq9W0=J;hIcV97BnK)1q{TGlVQ-?7gHN?vT#FxKOhs z=xb~R0EoEJ$2p3-{iD$5W`f0!GoiP2j>jRkjYBLqHU52EE16ZGDP%G92~fO=xls|i zWVH-){DC6UCMU#rZn)bT-A@7DnU7s4Q`&=`Z#cWENR|)3Tj?~n69m&^2 zLdKN}mQ+$$gx|A@&QDw}ldw>c(sl@t9$OjMOi8D2nBL^=p(2xaT~j$&*%S7?-?Ih# Y3;gTFWQ#ru?EnA(07*qoM6N<$g80F0B>(^b literal 0 HcmV?d00001 diff --git a/react-ui/src/app.tsx b/react-ui/src/app.tsx index 5c255b73..cd88f984 100644 --- a/react-ui/src/app.tsx +++ b/react-ui/src/app.tsx @@ -156,7 +156,7 @@ export const layout: RunTimeLayoutConfig = ({ initialState }) => { export async function onRouteChange({ clientRoutes, location }: any) { const menus = getRemoteMenu(); - console.log('onRouteChange', clientRoutes, location, menus); + // console.log('onRouteChange', clientRoutes, location, menus); if (menus === null && location.pathname !== PageEnum.LOGIN) { console.log('refresh'); history.go(0); @@ -164,16 +164,16 @@ export async function onRouteChange({ clientRoutes, location }: any) { } export function patchRoutes({ routes, routeComponents }: any) { - console.log('patchRoutes', routes, routeComponents); + //console.log('patchRoutes', routes, routeComponents); } export async function patchClientRoutes({ routes }: any) { - console.log('patchClientRoutes', routes); + // console.log('patchClientRoutes', routes); patchRouteWithRemoteMenus(routes); } export function render(oldRender: () => void) { - console.log('render get routers', oldRender); + // console.log('render get routers', oldRender); const token = getAccessToken(); if (!token || token?.length === 0) { oldRender(); @@ -190,10 +190,38 @@ export const antd: RuntimeAntdConfig = (memo) => { memo.theme ??= {}; memo.theme.token = { colorPrimary: themes['primaryColor'], + colorSuccess: themes['successColor'], + colorError: themes['errorColor'], + colorWarning: themes['warningColor'], + // fontSize: themes['fontSize'], }; memo.theme.components ??= {}; memo.theme.components.Tabs = {}; - // memo.theme.cssVar = true; + memo.theme.components.Button = { + defaultBg: 'rgba(22, 100, 255, 0.06)', + defaultBorderColor: 'rgba(22, 100, 255, 0.11)', + defaultColor: themes['textColor'], + defaultHoverBg: 'rgba(22, 100, 255, 0.06)', + defaultHoverBorderColor: 'rgba(22, 100, 255, 0.5)', + defaultHoverColor: '#3F7FFF ', + defaultActiveBg: 'rgba(22, 100, 255, 0.12)', + defaultActiveBorderColor: 'rgba(22, 100, 255, 0.75)', + defaultActiveColor: themes['primaryColor'], + contentFontSize: themes['fontSize'], + paddingBlock: 4, + paddingInline: 15, + controlHeight: 34, + }; + memo.theme.components.Input = { + inputFontSize: themes['fontSize'], + paddingBlock: 4, + paddingInline: 15, + }; + memo.theme.components.Table = { + headerBg: 'rgba(242, 244, 247, 0.36)', + headerBorderRadius: 4, + }; + memo.theme.cssVar = true; // memo.theme.hashed = false; // memo.appConfig = { diff --git a/react-ui/src/assets/img/modal-select-mirror.png b/react-ui/src/assets/img/modal-select-mirror.png new file mode 100644 index 0000000000000000000000000000000000000000..93e127602c365217daa550320c28f3202705a295 GIT binary patch literal 1372 zcmV-i1*7_jP)bd>>PiAPe6dQ@-K+orKFJrup=9xQy8*zyv>{At-L(m$DVj6GsGT55a8|Z z%)EUwvphWt!gck&tUH1p2%t6&x?V(y5_M3~XzYeRg z#cM7#!{1g&zMc(q>bi373xty~k5eoHcrK?fQjgEAdF-d(v1yT7~#VYq&& z_2QsR8wh;q(gJNF=ms|Uc6@CqX+RFGi{%}8fB|1-84m{&d4VAB^`6)-!_g{1xVj@Z z9Z7Y8;PZUNMn4tTb|kLRP`v#KKt9Ig%W0DXNq=DAum1+Ld*X`U^Ngh3FB=4AH2m5I zyXs8$G`ooL4d3H9!=@q(lcqsPLHv!ByJG5`@OT?F4%i=70tvf$8$ z2w@`i%kveG3hAZ*+=%<_)cbJF-3f^&VJJiW+If&eC{K$rB;x^Nnuf$$#40mis^^^SfLsnxz{cL?bo(04GyxxSQ1cXT%tJU7k$xk1p4 z4v{7f(H20s69+*b7q(kL-y}I>S`$9mk+)Ige$LACh{Zi@l=u3P@bcwJ$jc+IIV3j!dtAj}j9-5a-rAAGI2z32q4 zXuas`T-R&DT&9CbV$VGY$Ce4jTjX4(L(y}B1z}V`>^Z@LFw0DM>Cj91QM^rRcmJzn zv;K?`!K6M^i3h5GgPaQxv>-|=K6y+qd9rk2ho!0v<$*9$C&mv2g2~h7s(hRH7Fm^{ zJSNQ4VabAkC*~Fe3qn|*EfXvVqeg9+U_to6Ot2?L69h1(s`foICr0}P3cGBN%@%}F zL6~bML^_2{{2#ul)FrGKJK7Ut5*rf`P{0OCWd<=uAM11=66+NaWF*z#$_itamb=X0o{S6H=7fINb&%Phc$bKjb?0EsUU=63}^>oAyrJpEWoQC7gv~o5NQ)x zY#M3~Gqp=c622KqLW=xYK3uN`R>JJ7i>*y$J2C6e)Q zy7aS#o(lv`Bg~qlOwlCEY9O_9^Tbpp|B%%K34L%v?P8`#jOXNOvI~J=tPw6jOjRVe zBQ`c7#d=&MHntQ}#*J&Tb3uRt)MJe>8!!+}ddSC4k$hAh7G**jNKsv4`F=gEc7$`e zyKrm}nX>Fp7nQNB_pA+tV&@FCXynM5M!3lC#mAb~gd#SU@5u(_$1D|`>?rBQ>p4G9 zNNz*gB!Htd!mJ%M7ENXaPz4Ce9;ZvK24;-doGLO^n<~PBQ=|R_m5}G$i?cMsMRw^T zn2_X8q>1Kq;U9jCwOa0Ar#`KQ0?VlSw=s}^Gtf8H2u}rqfm~;r^^@j?KXV$X<5xLO ewC^^z)Bgae){tl14U3`x0000 \ No newline at end of file diff --git a/react-ui/src/assets/svg/parameter.svg b/react-ui/src/assets/svg/parameter.svg deleted file mode 100644 index 58803521..00000000 --- a/react-ui/src/assets/svg/parameter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/assets/svg/save--return.svg b/react-ui/src/assets/svg/save--return.svg deleted file mode 100644 index 73fd196d..00000000 --- a/react-ui/src/assets/svg/save--return.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/assets/svg/view-param.svg b/react-ui/src/assets/svg/view-param.svg deleted file mode 100644 index 3eb2efce..00000000 --- a/react-ui/src/assets/svg/view-param.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/components/KFRadio/index.less b/react-ui/src/components/KFRadio/index.less index f9a277b1..7a941188 100644 --- a/react-ui/src/components/KFRadio/index.less +++ b/react-ui/src/components/KFRadio/index.less @@ -1,4 +1,4 @@ -@import '@/styles/theme.less'; +// @import '@/styles/theme.less'; .kf-radio { display: flex; @@ -8,7 +8,7 @@ display: flex; align-items: center; padding: 12px 20px; - color: @text-color-second; + color: @text-color-secondary; border: 1px solid #e0e0e0; border-radius: 8px; @@ -18,8 +18,8 @@ } &--active { - color: @kf-primary-color; - border: 1px solid @kf-primary-color; + color: @primary-color; + border: 1px solid @primary-color; } & + & { diff --git a/react-ui/src/components/ModalTitle/index.less b/react-ui/src/components/ModalTitle/index.less index 1ff70e81..24e10386 100644 --- a/react-ui/src/components/ModalTitle/index.less +++ b/react-ui/src/components/ModalTitle/index.less @@ -2,7 +2,7 @@ .modal_title { display: flex; align-items: center; - color: @kf-primary-color; + color: @primary-color; font-weight: 400; font-size: 20px; diff --git a/react-ui/src/enums/index.ts b/react-ui/src/enums/index.ts index c610ecf3..0c0c7b81 100644 --- a/react-ui/src/enums/index.ts +++ b/react-ui/src/enums/index.ts @@ -3,3 +3,10 @@ export enum CommonTabKeys { Private = 'Private', // 私有 Public = 'Public', // 公开 } + +// 镜像状态 +export enum MirrorVersionStatus { + Available = 'available', // 可用 + Building = 'building', // 构建中 + Failed = 'failed', // 构建中 +} diff --git a/react-ui/src/global.less b/react-ui/src/global.less index 05925b9f..d5eb8e2c 100644 --- a/react-ui/src/global.less +++ b/react-ui/src/global.less @@ -34,12 +34,6 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } -a { - color: #1664ff; -} -.ant-btn-link { - color: #1664ff; -} .ant-pro-layout .ant-pro-layout-content { padding: 0 10px 10px; overflow-y: hidden; @@ -48,12 +42,7 @@ a { .ant-pro-layout .ant-pro-layout-bg-list { background: @background-color; } -.ant-table-wrapper .ant-table-thead > tr > th { - background-color: #fff; -} -.ant-table-wrapper .ant-table-thead > tr > td { - background-color: #fff; -} + .ant-menu-light .ant-menu-item-selected { background: rgba(197, 232, 255, 0.8) !important; } @@ -142,7 +131,6 @@ a { width: 110px; height: 40px; font-size: 18px; - background: #1664ff; border-radius: 10px; } .ant-modal .ant-input-affix-wrapper { @@ -189,8 +177,6 @@ a { } .ant-pagination .ant-pagination-item-active a { color: #fff; - background: #1664ff; - border-color: #1664ff; border-radius: 6px; } .ant-pagination .ant-pagination-item-active:hover { @@ -242,7 +228,3 @@ ol { } } } - -.umi-local-svg { - vertical-align: -1px; -} diff --git a/react-ui/src/hooks/index.ts b/react-ui/src/hooks/index.ts index 32f162ad..24a80d81 100644 --- a/react-ui/src/hooks/index.ts +++ b/react-ui/src/hooks/index.ts @@ -3,14 +3,14 @@ * @Date: 2024-04-15 10:01:29 * @Description: */ +import { FormInstance } from 'antd'; import { debounce } from 'lodash'; import { useCallback, useEffect, useRef, useState } from 'react'; - /** - * Generates a state reference with the initial value. + * 生成具有初始值的状态引用 * - * @param initialValue - The initial value for the state - * @return An array containing the state value, state setter function, and a mutable reference object + * @param initialValue - 状态的初始值 + * @return 包含状态值、状态设置函数和可变引用对象的数组 */ export function useStateRef(initialValue: T) { const [value, setValue] = useState(initialValue); @@ -25,10 +25,10 @@ export function useStateRef(initialValue: T) { } /** - * Generates a custom hook for managing the visibility state of a modal. + * 生成一个自定义钩子,用于管理模态框的可见性状态。 * - * @param initialValue - The initial visibility state of the modal. - * @return An array containing the visibility state and functions to open and close the modal. + * @param initialValue - 模态框的初始可见性状态。 + * @return 一个数组,包含可见性状态和打开和关闭模态框的函数。 */ export function useVisible(initialValue: boolean) { const [visible, setVisible] = useState(initialValue); @@ -47,34 +47,34 @@ export function useVisible(initialValue: boolean) { type Callback = (state: T) => void; /** - * Generates a stateful value and a function to update it that triggers callbacks. + * 生成一个具有回调机制的可变状态值和更新它的函数。 * - * @param initialValue - The initial value of the state. - * @return A tuple containing the current state value and a function to update the state. + * @param initialValue - 初始状态值。 + * @return 一个元组,包含当前状态值和用于更新状态的函数。 */ export function useCallbackState(initialValue: T) { - const [state, _setState] = useState(initialValue); + const [state, _setState] = useState(initialValue); const callbackQueue = useRef[]>([]); useEffect(() => { callbackQueue.current.forEach((cb) => cb(state)); callbackQueue.current = []; }, [state]); - const setState = (newValue: T, callback: Callback) => { + const setState = (newValue: T | ((prevState: T) => T), callback?: Callback) => { _setState(newValue); if (callback && typeof callback === 'function') { callbackQueue.current.push(callback); } }; - return [state, setState]; + return [state, setState] as const; } /** - * A hook that tracks the size of a DOM element. + * 用于追踪 DOM 元素尺寸的 hook。 * - * @param initialWidth - The initial width of the element. - * @param initialHeight - The initial height of the element. - * @param deps - dependency list. - * @return - A tuple containing the ref to the DOM element, the current width, and the current height. + * @param initialWidth - 初始宽度。 + * @param initialHeight - 初始高度。 + * @param deps - 依赖列表。 + * @return 一个元组,包含 DOM 元素的 ref、当前宽度和当前高度。 */ export function useDomSize( initialWidth: number, @@ -86,8 +86,6 @@ export function useDomSize( const [height, setHeight] = useState(initialHeight); useEffect(() => { - console.log('dddddd'); - const setDomHeight = () => { if (domRef.current) { setHeight(domRef.current.offsetHeight); @@ -106,3 +104,25 @@ export function useDomSize( return [domRef, { width, height }] as const; } + +/** + * 用于在 modal 关闭时重置 Form 表单的 hook。 + * + * @param form - Ant Design Form 表单实例 + * @param open - modal 是否打开 + */ +export const useResetFormOnCloseModal = (form: FormInstance, open: boolean) => { + const prevOpenRef = useRef(); + + useEffect(() => { + prevOpenRef.current = open; + }, [open]); + + const prevOpen = prevOpenRef.current; + + useEffect(() => { + if (!open && prevOpen) { + form.resetFields(); + } + }, [form, prevOpen, open]); +}; diff --git a/react-ui/src/iconfont/iconfont.js b/react-ui/src/iconfont/iconfont.js index 3695c17e..a7ee3e08 100644 --- a/react-ui/src/iconfont/iconfont.js +++ b/react-ui/src/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4511447='',function(l){var a=(a=document.getElementsByTagName("script"))[a.length-1],t=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var h,i,e,o,d,z=function(a,t){t.parentNode.insertBefore(a,t)};if(t&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}h=function(){var a,t=document.createElement("div");t.innerHTML=l._iconfont_svg_string_4511447,(t=t.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",t=t,(a=document.body).firstChild?z(t,a.firstChild):a.appendChild(t))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),h()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(e=h,o=l.document,d=!1,n(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,p())})}function p(){d||(d=!0,e())}function n(){try{o.documentElement.doScroll("left")}catch(a){return void setTimeout(n,50)}p()}}(window); \ No newline at end of file +window._iconfont_svg_string_4511447='',function(t){var a=(a=document.getElementsByTagName("script"))[a.length-1],h=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var v,i,o,l,z,m=function(a,h){h.parentNode.insertBefore(a,h)};if(h&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}v=function(){var a,h=document.createElement("div");h.innerHTML=t._iconfont_svg_string_4511447,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(a=document.body).firstChild?m(h,a.firstChild):a.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(v,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),v()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(o=v,l=t.document,z=!1,d(),l.onreadystatechange=function(){"complete"==l.readyState&&(l.onreadystatechange=null,n())})}function n(){z||(z=!0,o())}function d(){try{l.documentElement.doScroll("left")}catch(a){return void setTimeout(d,50)}n()}}(window); \ No newline at end of file diff --git a/react-ui/src/icons/add.svg b/react-ui/src/icons/add.svg deleted file mode 100644 index 272dd5ac..00000000 --- a/react-ui/src/icons/add.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/doc-not-inventory.svg b/react-ui/src/icons/doc-not-inventory.svg deleted file mode 100644 index bfd7d4b4..00000000 --- a/react-ui/src/icons/doc-not-inventory.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/modal-close.svg b/react-ui/src/icons/modal-close.svg deleted file mode 100644 index 1345011e..00000000 --- a/react-ui/src/icons/modal-close.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/parameter.svg b/react-ui/src/icons/parameter.svg deleted file mode 100644 index 58803521..00000000 --- a/react-ui/src/icons/parameter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/private-mirror-tab.svg b/react-ui/src/icons/private-mirror-tab.svg deleted file mode 100644 index 0898ad86..00000000 --- a/react-ui/src/icons/private-mirror-tab.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/public-mirror-tab.svg b/react-ui/src/icons/public-mirror-tab.svg deleted file mode 100644 index 0019be13..00000000 --- a/react-ui/src/icons/public-mirror-tab.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/refresh.svg b/react-ui/src/icons/refresh.svg deleted file mode 100644 index 00f51915..00000000 --- a/react-ui/src/icons/refresh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/remove.svg b/react-ui/src/icons/remove.svg deleted file mode 100644 index b3519764..00000000 --- a/react-ui/src/icons/remove.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/view-detail.svg b/react-ui/src/icons/view-detail.svg deleted file mode 100644 index c74fe45a..00000000 --- a/react-ui/src/icons/view-detail.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/view-param.svg b/react-ui/src/icons/view-param.svg deleted file mode 100644 index 3eb2efce..00000000 --- a/react-ui/src/icons/view-param.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/下载.svg b/react-ui/src/icons/下载.svg deleted file mode 100644 index bf00e67e..00000000 --- a/react-ui/src/icons/下载.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/icons/查看详情.svg b/react-ui/src/icons/查看详情.svg deleted file mode 100644 index ebdfa4b0..00000000 --- a/react-ui/src/icons/查看详情.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/react-ui/src/overrides.less b/react-ui/src/overrides.less index 00735646..1b766517 100644 --- a/react-ui/src/overrides.less +++ b/react-ui/src/overrides.less @@ -36,3 +36,13 @@ margin-bottom: 0; } } + +// 表格样式 +.ant-table-header { + border: 1px solid rgba(167, 178, 194, 0.17); + border-bottom: none; +} + +.ant-table-wrapper .ant-table-thead > tr > td { + background-color: #fff; +} diff --git a/react-ui/src/pages/Experiment/experimentText/index.jsx b/react-ui/src/pages/Experiment/experimentText/index.jsx index 7911ec53..baa5bd04 100644 --- a/react-ui/src/pages/Experiment/experimentText/index.jsx +++ b/react-ui/src/pages/Experiment/experimentText/index.jsx @@ -1,4 +1,3 @@ -import { ReactComponent as ViewParam } from '@/assets/svg/view-param.svg'; import { useVisible } from '@/hooks'; import { getExperimentIns } from '@/services/experiment/index.js'; import { getWorkflowById } from '@/services/pipeline/index.js'; @@ -425,11 +424,7 @@ function ExperimentText() { {experimentStatusInfo[message.status]?.label} - diff --git a/react-ui/src/pages/Experiment/index.jsx b/react-ui/src/pages/Experiment/index.jsx index b79821f3..2eead78c 100644 --- a/react-ui/src/pages/Experiment/index.jsx +++ b/react-ui/src/pages/Experiment/index.jsx @@ -1,3 +1,4 @@ +import KFIcon from '@/components/KFIcon'; import { deleteExperimentById, deleteQueryByExperimentInsId, @@ -12,16 +13,11 @@ import { runTensorBoardReq, } from '@/services/experiment/index.js'; import { getWorkflow } from '@/services/pipeline/index.js'; +import themes from '@/styles/theme.less'; import { elapsedTime } from '@/utils/date'; import { to } from '@/utils/promise'; -import { - DeleteOutlined, - EditOutlined, - FieldTimeOutlined, - PlayCircleOutlined, - PlusCircleOutlined, -} from '@ant-design/icons'; -import { Button, Modal, Space, Table, message } from 'antd'; +import { modalConfirm } from '@/utils/ui'; +import { Button, ConfigProvider, Space, Table, message } from 'antd'; import momnet from 'moment'; import { useEffect, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; @@ -323,7 +319,7 @@ function Experiment() { type="link" size="small" key="run" - icon={} + icon={} onClick={() => { runExperiment(record.id); }} @@ -334,61 +330,45 @@ function Experiment() { type="link" size="small" key="edit" - icon={} + icon={} onClick={() => { editExperiment(record.id); }} > 编辑 - + + ), }, @@ -405,7 +385,7 @@ function Experiment() { type="primary" className={Styles.plusButton} onClick={createExperiment} - icon={} + icon={} > 新建实验 @@ -485,7 +465,7 @@ function Experiment() { item.status === 'Failed' || item.status === 'Terminated' } - icon={} + icon={} onClick={async () => { putQueryByExperimentInsId(item.id).then((ret) => { if (ret.code === 200) { @@ -499,35 +479,38 @@ function Experiment() { > 终止 - + + )) diff --git a/react-ui/src/pages/Experiment/status.ts b/react-ui/src/pages/Experiment/status.ts index 0a7b6652..2a075951 100644 --- a/react-ui/src/pages/Experiment/status.ts +++ b/react-ui/src/pages/Experiment/status.ts @@ -15,7 +15,10 @@ export enum ExperimentStatus { Omitted = 'Omitted', } -export const experimentStatusInfo: Record = { +type ExperimentStatusKeys = keyof typeof ExperimentStatus; +type ExperimentStatusValues = (typeof ExperimentStatus)[ExperimentStatusKeys]; + +export const experimentStatusInfo: Record = { Running: { label: '运行中', color: '#165bff', diff --git a/react-ui/src/pages/Mirror/components/MirrorStatusCell/index.less b/react-ui/src/pages/Mirror/components/MirrorStatusCell/index.less new file mode 100644 index 00000000..23c518c7 --- /dev/null +++ b/react-ui/src/pages/Mirror/components/MirrorStatusCell/index.less @@ -0,0 +1,13 @@ +//@import '@/styles/theme.less'; + +.mirror-status-cell { + color: @text-color; + + &--success { + color: @success-color; + } + + &--error { + color: @error-color; + } +} diff --git a/react-ui/src/pages/Mirror/components/MirrorStatusCell/index.tsx b/react-ui/src/pages/Mirror/components/MirrorStatusCell/index.tsx new file mode 100644 index 00000000..bf0522ed --- /dev/null +++ b/react-ui/src/pages/Mirror/components/MirrorStatusCell/index.tsx @@ -0,0 +1,40 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-18 18:35:41 + * @Description: + */ +import { MirrorVersionStatus } from '@/enums'; +import styles from './index.less'; + +type MirrorStatusCellProps = { + status: MirrorVersionStatus; +}; + +type MirrorVersionStatusKeys = keyof typeof MirrorVersionStatus; +type MirrorVersionStatusValues = (typeof MirrorVersionStatus)[MirrorVersionStatusKeys]; + +export type MirrorVersionStatusInfo = { + text: string; + classname: string; +}; + +const statusInfo: Record = { + [MirrorVersionStatus.Building]: { + text: '构建中', + classname: styles['mirror-status-cell'], + }, + [MirrorVersionStatus.Available]: { + classname: styles['mirror-status-cell--success'], + text: '可用', + }, + [MirrorVersionStatus.Failed]: { + classname: styles['mirror-status-cell--error'], + text: '构建失败', + }, +}; + +function MirrorStatusCell({ status }: MirrorStatusCellProps) { + return {statusInfo[status].text}; +} + +export default MirrorStatusCell; diff --git a/react-ui/src/pages/Mirror/create.tsx b/react-ui/src/pages/Mirror/create.tsx index e61cd665..4a87edbb 100644 --- a/react-ui/src/pages/Mirror/create.tsx +++ b/react-ui/src/pages/Mirror/create.tsx @@ -1,8 +1,9 @@ /* * @Author: 赵伟 * @Date: 2024-04-16 13:58:08 - * @Description: 镜像详情 + * @Description: 创建镜像 */ +import KFIcon from '@/components/KFIcon'; import KFRadio, { type KFRadioItem } from '@/components/KFRadio'; import PageTitle from '@/components/PageTitle'; import SubAreaTitle from '@/components/SubAreaTitle'; @@ -25,10 +26,12 @@ const mirrorRadioItems: KFRadioItem[] = [ { key: CommonTabKeys.Public, title: '基于公网镜像', + icon: , }, { key: CommonTabKeys.Private, title: '本地上传', + icon: , }, ]; diff --git a/react-ui/src/pages/Mirror/info.less b/react-ui/src/pages/Mirror/info.less index b96c0d7a..61d034d8 100644 --- a/react-ui/src/pages/Mirror/info.less +++ b/react-ui/src/pages/Mirror/info.less @@ -12,7 +12,7 @@ .label { width: 80px; - color: @text-color-second; + color: @text-color-secondary; } .value { diff --git a/react-ui/src/pages/Mirror/info.tsx b/react-ui/src/pages/Mirror/info.tsx index 5841fe26..8785f586 100644 --- a/react-ui/src/pages/Mirror/info.tsx +++ b/react-ui/src/pages/Mirror/info.tsx @@ -3,16 +3,20 @@ * @Date: 2024-04-16 13:58:08 * @Description: 镜像详情 */ +import KFIcon from '@/components/KFIcon'; import PageTitle from '@/components/PageTitle'; import SubAreaTitle from '@/components/SubAreaTitle'; +import { MirrorVersionStatus } from '@/enums'; import { useDomSize } from '@/hooks'; import { getMirrorInfoReq, getMirrorVersionListReq } from '@/services/mirror'; +import themes from '@/styles/theme.less'; import { to } from '@/utils/promise'; import { useParams, useSearchParams } from '@umijs/max'; -import { Button, Col, Row, Table, TablePaginationConfig, TableProps } from 'antd'; +import { Button, Col, ConfigProvider, Row, Table, TablePaginationConfig, TableProps } from 'antd'; import classNames from 'classnames'; import dayjs from 'dayjs'; import { useEffect, useState } from 'react'; +import MirrorStatusCell from './components/MirrorStatusCell'; import styles from './info.less'; type MirrorInfoData = { @@ -36,18 +40,20 @@ function MirrorInfo() { const [mirrorInfo, setMirrorInfo] = useState({}); const [tableData, setTableData] = useState([]); const [topRef, { height: topHeight }] = useDomSize(0, 0, [mirrorInfo]); + const [total, setTotal] = useState(0); const [pagination, setPagination] = useState({ showSizeChanger: true, showQuickJumper: true, current: 1, pageSize: 10, - total: 0, }); const isPublic = seachParams.get('isPublic') === 'true'; useEffect(() => { getMirrorInfo(); - getMirrorVersionList(); }, []); + useEffect(() => { + getMirrorVersionList(); + }, [pagination]); // 获取镜像详情 const getMirrorInfo = async () => { @@ -77,10 +83,7 @@ function MirrorInfo() { if (res && res.data) { const { content = [], totalElements = 0 } = res.data; setTableData(content); - setPagination((prev) => ({ - ...prev, - total: totalElements, - })); + setTotal(totalElements); } }; @@ -88,9 +91,7 @@ function MirrorInfo() { const handleTableChange: TableProps['onChange'] = (pagination, filters, sorter, { action }) => { if (action === 'paginate') { setPagination(pagination); - getMirrorVersionList(); } - console.log(pagination, filters, sorter, action); }; const downloadVersion = (record: MirrorVersionData) => {}; @@ -99,64 +100,61 @@ function MirrorInfo() { const columns: TableProps['columns'] = [ { title: '镜像版本', - dataIndex: 'version', - key: 'version', - width: '20%', + dataIndex: 'tag_name', + key: 'tag_name', + width: '25%', }, { title: '镜像地址', dataIndex: 'url', key: 'url', - width: '26%', }, { title: '状态', dataIndex: 'status', key: 'status', - width: '7%', + width: 150, + render: (text: string) => , }, { title: '镜像大小', dataIndex: 'file_size', key: 'file_size', - width: '7%', + width: 150, }, { title: '创建时间', dataIndex: 'create_time', key: 'create_time', - width: '20%', + width: 200, render: (text: string) => {dayjs(text).format('YYYY-MM-DD HH:mm:ss')}, }, { title: '操作', dataIndex: 'operation', - width: '20%', + width: 150, key: 'operation', + hidden: isPublic, render: (_: any, record: any) => (

- {!isPublic && ( - + + )}
), @@ -184,7 +182,7 @@ function MirrorInfo() {
版本数:
-
{mirrorInfo.version_count}
+
{mirrorInfo.version_count || '--'}
@@ -218,7 +216,7 @@ function MirrorInfo() { dataSource={tableData} columns={columns} scroll={{ y: 'calc(100% - 55px)' }} - pagination={pagination} + pagination={{ ...pagination, total }} onChange={handleTableChange} rowKey="id" /> diff --git a/react-ui/src/pages/Mirror/list.less b/react-ui/src/pages/Mirror/list.less index edd9183d..4f838b76 100644 --- a/react-ui/src/pages/Mirror/list.less +++ b/react-ui/src/pages/Mirror/list.less @@ -1,5 +1,3 @@ -@import '@/styles/theme.less'; - .mirror-list { height: 100%; &__tabs-container { diff --git a/react-ui/src/pages/Mirror/list.tsx b/react-ui/src/pages/Mirror/list.tsx index 53136147..c6881779 100644 --- a/react-ui/src/pages/Mirror/list.tsx +++ b/react-ui/src/pages/Mirror/list.tsx @@ -6,9 +6,18 @@ import KFIcon from '@/components/KFIcon'; import { CommonTabKeys } from '@/enums'; import { getMirrorListReq } from '@/services/mirror'; +import themes from '@/styles/theme.less'; import { to } from '@/utils/promise'; -import { Icon, useNavigate } from '@umijs/max'; -import { Button, Input, Table, TablePaginationConfig, TableProps, Tabs } from 'antd'; +import { useNavigate } from '@umijs/max'; +import { + Button, + ConfigProvider, + Input, + Table, + TablePaginationConfig, + TableProps, + Tabs, +} from 'antd'; import classNames from 'classnames'; import dayjs from 'dayjs'; import { useEffect, useState } from 'react'; @@ -18,12 +27,12 @@ const mirrorTabItems = [ { key: CommonTabKeys.Public, label: '公共镜像', - icon: , + icon: , }, { key: CommonTabKeys.Private, label: '个人镜像', - icon: , + icon: , }, ]; @@ -39,16 +48,16 @@ function MirrorList() { const [activeTab, setActiveTab] = useState('Public'); const [searchText, setSearchText] = useState(''); const [tableData, setTableData] = useState([]); + const [total, setTotal] = useState(0); const [pagination, setPagination] = useState({ showSizeChanger: true, showQuickJumper: true, current: 1, pageSize: 10, - total: 0, }); useEffect(() => { getMirrorList(); - }, [activeTab]); + }, [activeTab, pagination]); // 获取镜像列表 const getMirrorList = async () => { @@ -62,10 +71,7 @@ function MirrorList() { if (res && res.data) { const { content = [], totalElements = 0 } = res.data; setTableData(content); - setPagination((prev) => ({ - ...prev, - total: totalElements, - })); + setTotal(totalElements); } }; @@ -82,6 +88,9 @@ function MirrorList() { }); }; + // 删除镜像 + const deleteMirror = (record: MirrorData) => {}; + // 创建镜像 const createMirror = () => { navgite({ pathname: `/dataset/mirror/create?isPublic=${activeTab === CommonTabKeys.Public}` }); @@ -91,7 +100,6 @@ function MirrorList() { const handleTableChange: TableProps['onChange'] = (pagination, filters, sorter, { action }) => { if (action === 'paginate') { setPagination(pagination); - getMirrorList(); } console.log(pagination, filters, sorter, action); }; @@ -101,32 +109,31 @@ function MirrorList() { title: '镜像名称', dataIndex: 'name', key: 'name', - width: '10%', + width: '30%', }, { title: '版本数据', dataIndex: 'version_count', key: 'version_count', - width: '10%', + width: 100, }, { title: '镜像描述', dataIndex: 'description', key: 'description', - width: '50%', //ellipsis: true, }, { title: '创建时间', dataIndex: 'create_time', key: 'create_time', - width: '20%', + width: 200, render: (text: string) => {dayjs(text).format('YYYY-MM-DD HH:mm:ss')}, }, { title: '操作', dataIndex: 'operation', - width: '15%', + width: activeTab === CommonTabKeys.Private ? 200 : 150, key: 'operation', render: (_: any, record: any) => (
@@ -134,24 +141,29 @@ function MirrorList() { type="link" size="small" key="info" - // icon={} icon={} onClick={() => toDetail(record)} > 查看详情 {activeTab === CommonTabKeys.Private && ( - + + )}
), @@ -183,7 +195,7 @@ function MirrorList() { style={{ marginLeft: '20px' }} type="default" onClick={createMirror} - icon={} + icon={} > 制作镜像 @@ -192,7 +204,7 @@ function MirrorList() { style={{ marginRight: 0, marginLeft: 'auto' }} type="default" onClick={getMirrorList} - icon={} + icon={} > 刷新 @@ -202,7 +214,7 @@ function MirrorList() { dataSource={tableData} columns={columns} scroll={{ y: 'calc(100% - 55px)' }} - pagination={pagination} + pagination={{ ...pagination, total: total }} onChange={handleTableChange} rowKey="id" /> diff --git a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less index 69e8c445..947a2bcf 100644 --- a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less +++ b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.less @@ -58,15 +58,11 @@ overflow-y: auto; &__file { - height: 24px; margin-bottom: 10px; - padding-left: 10px; - overflow: hidden; - color: #575757; + padding: 3px 10px; + color: @text-color-secondary; font-size: 13px; - line-height: 24px; - white-space: nowrap; - text-overflow: ellipsis; + word-break: break-all; background: @background-color-gray; border-radius: 4px; } diff --git a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx index 6ebe4621..e073a449 100644 --- a/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx +++ b/react-ui/src/pages/Pipeline/components/ResourceSelectorModal/index.tsx @@ -5,9 +5,10 @@ */ import datasetImg from '@/assets/img/modal-select-dataset.png'; +import mirrorImg from '@/assets/img/modal-select-mirror.png'; import modelImg from '@/assets/img/modal-select-model.png'; import KFModal from '@/components/KFModal'; -import { CommonTabKeys } from '@/enums'; +import { CommonTabKeys, MirrorVersionStatus } from '@/enums'; import { getDatasetList, getDatasetVersionIdList, @@ -16,6 +17,7 @@ import { getModelVersionIdList, getModelVersionsById, } from '@/services/dataset/index.js'; +import { getMirrorListReq, getMirrorVersionListReq } from '@/services/mirror'; import { to } from '@/utils/promise'; import { Icon } from '@umijs/max'; import type { GetRef, ModalProps, TabsProps, TreeDataNode, TreeProps } from 'antd'; @@ -26,42 +28,51 @@ import styles from './index.less'; export enum ResourceSelectorType { Model = 'Model', // 模型 Dataset = 'Dataset', // 数据集 + Mirror = 'Mirror', //镜像 } type ResourceSelectorTypeKeys = keyof typeof ResourceSelectorType; type ResourceSelectorTypeValues = (typeof ResourceSelectorType)[ResourceSelectorTypeKeys]; -type GetModelFilesReqParam = { - models_id: number; - version: string; -}; - -type GetDatasetFilesReqParam = { - dataset_id: number; - version: string; -}; - -type GetFilesReqParam = GetModelFilesReqParam | GetDatasetFilesReqParam; - export type SelectorTypeInfo = { - getList: (params: { page: number; size: number; available_range: string }) => Promise; - getVersions: (params: number) => Promise; - getFiles: (params: GetFilesReqParam) => Promise; + getList: (params: any) => Promise; + getVersions: (params: any) => Promise; + getFiles: (params: any) => Promise; + handleVersionResponse: (res: any) => any[]; modalIcon: string; buttonIcon: string; name: string; + litReqParamKey: 'available_range' | 'image_type'; fileReqParamKey: 'models_id' | 'dataset_id'; tabItems: TabsProps['items']; }; +// 获取镜像列表,为了兼容之前的结构 +const getMirrorFilesReq = ({ id, version }: { id: number; version: string }): Promise => { + const index = version.indexOf('-'); + const url = version.slice(index + 1); + return Promise.resolve({ + data: { + content: [ + { + id: `${id}-${version}`, + file_name: `${url}`, + }, + ], + }, + }); +}; + export const selectorTypeData: Record = { - Model: { + [ResourceSelectorType.Model]: { getList: getModelList, getVersions: getModelVersionsById, getFiles: getModelVersionIdList, + handleVersionResponse: (res) => res.data || [], name: '模型', modalIcon: modelImg, buttonIcon: 'local:model-select-button', + litReqParamKey: 'available_range', fileReqParamKey: 'models_id', tabItems: [ { @@ -74,13 +85,15 @@ export const selectorTypeData: Record res.data || [], name: '数据集', modalIcon: datasetImg, buttonIcon: 'local:dataset-select-button', + litReqParamKey: 'available_range', fileReqParamKey: 'dataset_id', tabItems: [ { @@ -93,6 +106,29 @@ export const selectorTypeData: Record getMirrorVersionListReq({ image_id: id, page: 0, size: 200 }), + getFiles: getMirrorFilesReq, + handleVersionResponse: (res) => + res.data?.content?.filter((v: MirrorVersion) => v.status === MirrorVersionStatus.Available) || + [], + name: '镜像', + modalIcon: mirrorImg, + buttonIcon: 'local:mirror-select-button', + litReqParamKey: 'image_type', + fileReqParamKey: 'dataset_id', + tabItems: [ + { + key: CommonTabKeys.Private, + label: '我的镜像', + }, + { + key: CommonTabKeys.Public, + label: '公开镜像', + }, + ], + }, }; type ResourceSelectorResponse = { @@ -108,7 +144,7 @@ interface ResourceSelectorModalProps extends Omit { defaultExpandedKeys: React.Key[]; defaultCheckedKeys: React.Key[]; defaultActiveTab: CommonTabKeys; - onOk?: (params: ResourceSelectorResponse | null) => void; + onOk?: (params: ResourceSelectorResponse | string | null) => void; } type ResourceGroup = { @@ -116,6 +152,13 @@ type ResourceGroup = { name: string; // 数据集或者模型 id }; +type MirrorVersion = { + id: number; // 镜像版本id + status: MirrorVersionStatus; // 镜像版本状态 + tag_name: string; // 镜像版本 + url: string; // 镜像版本路径 +}; + type ResourceFile = { id: number; // 文件 id file_name: string; // 文件 name @@ -133,6 +176,27 @@ const convertToTreeData = (list: ResourceGroup[]): TreeDataNode[] => { })); }; +// 版本转成 treeData +const convertVersionToTreeData = (parentId: number) => { + return (item: string | MirrorVersion): TreeDataNode => { + if (typeof item === 'string') { + return { + title: item, + key: `${parentId}-${item}`, + isLeaf: true, + checkable: true, + }; + } else { + return { + title: item.tag_name, + key: `${parentId}-${item.id}-${item.url}`, + isLeaf: true, + checkable: true, + }; + } + }; +}; + // 更新树形结构的 children const updateChildren = (parentId: number, children: TreeDataNode[]) => { return (node: TreeDataNode) => { @@ -197,11 +261,11 @@ function ResourceSelectorModal({ // 获取数据集或模型列表 const getTreeData = async () => { - const available_range = activeTab === CommonTabKeys.Private ? '0' : '1'; + const available_range = activeTab === CommonTabKeys.Private ? 0 : 1; const params = { page: 0, size: 200, - available_range: available_range, + [selectorTypeData[type].litReqParamKey]: available_range, }; const getListReq = selectorTypeData[type].getList; const [res] = await to(getListReq(params)); @@ -222,13 +286,8 @@ function ResourceSelectorModal({ const getVersionsReq = selectorTypeData[type].getVersions; const [res, error] = await to(getVersionsReq(parentId)); if (res) { - const list = res.data || []; - const children = list.map((v: string) => ({ - title: v, - key: `${parentId}-${v}`, - isLeaf: true, - checkable: true, - })); + const list = selectorTypeData[type].handleVersionResponse(res); + const children = list.map(convertVersionToTreeData(parentId)); // 更新 treeData children setOriginTreeData((prev) => prev.map(updateChildren(parentId, children))); // 缓存 loadedKeys @@ -248,7 +307,7 @@ function ResourceSelectorModal({ const getFiles = async (id: number, version: string) => { const getFilesReq = selectorTypeData[type].getFiles; const paramsKey = selectorTypeData[type].fileReqParamKey; - const params = { version: version, [paramsKey]: id } as GetFilesReqParam; + const params = { version: version, [paramsKey]: id }; const [res] = await to(getFilesReq(params)); if (res) { setVersionPath(res.data?.path || ''); @@ -329,17 +388,21 @@ function ResourceSelectorModal({ // 提交 const handleOk = () => { if (checkedKeys.length > 0) { - const last = checkedKeys[0] as string; - 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 as CommonTabKeys, - }; - onOk?.(res); + if (type === ResourceSelectorType.Mirror) { + onOk?.(files[0].file_name); + } else { + const last = checkedKeys[0] as string; + 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 as CommonTabKeys, + }; + onOk?.(res); + } } else { onOk?.(null); } @@ -347,7 +410,10 @@ function ResourceSelectorModal({ const title = `选择${selectorTypeData[type].name}`; const palceholder = `请输入${selectorTypeData[type].name}名称`; - const fileTitle = `已选${selectorTypeData[type].name}文件(${files.length})`; + const fileTitle = + type === ResourceSelectorType.Mirror + ? '已选镜像' + : `已选${selectorTypeData[type].name}文件(${files.length})`; const tabItems = selectorTypeData[type].tabItems; const titleImg = selectorTypeData[type].modalIcon; diff --git a/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx b/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx index fad63da3..82532a06 100644 --- a/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx +++ b/react-ui/src/pages/Pipeline/editPipeline/globalParamsDrawer.tsx @@ -4,8 +4,9 @@ import { } from '@/pages/Experiment/experimentText/addExperimentModal'; import { type PipelineGlobalParam } from '@/types'; import { to } from '@/utils/promise'; +import { modalConfirm } from '@/utils/ui'; import { DeleteOutlined, PlusOutlined } from '@ant-design/icons'; -import { Button, Drawer, Form, Input, Radio } from 'antd'; +import { Button, Drawer, Form, Input, Radio, Tooltip } from 'antd'; import { NamePath } from 'antd/es/form/interface'; import { forwardRef, useImperativeHandle } from 'react'; import styles from './globalParamsDrawer.less'; @@ -22,9 +23,8 @@ const GlobalParamsDrawer = forwardRef( useImperativeHandle(ref, () => ({ getFieldsValue: async () => { - const [res, error] = await to(form.validateFields()); - if (res && !error) { - const values = form.getFieldsValue(); + const [values, error] = await to(form.validateFields()); + if (!error && values) { return values; } else { return Promise.reject(error); @@ -32,10 +32,20 @@ const GlobalParamsDrawer = forwardRef( }, })); + // 处理参数类型变化 const handleTypeChange = (name: NamePath) => { form.setFieldValue(name, null); }; + const removeParameter = (name: number, remove: (param: number) => void) => { + modalConfirm({ + title: '确认删除该参数吗?', + onOk: () => { + remove(name); + }, + }); + }; + return ( 否 - + + + ))} @@ -150,6 +162,7 @@ const GlobalParamsDrawer = forwardRef( )} + {/* //{contextHolder} */} ); }, diff --git a/react-ui/src/pages/Pipeline/editPipeline/index.jsx b/react-ui/src/pages/Pipeline/editPipeline/index.jsx index 5d31298a..e21fc01d 100644 --- a/react-ui/src/pages/Pipeline/editPipeline/index.jsx +++ b/react-ui/src/pages/Pipeline/editPipeline/index.jsx @@ -1,9 +1,7 @@ -import { ReactComponent as ParameterIcon } from '@/assets/svg/parameter.svg'; -import { ReactComponent as SaveAndReturn } from '@/assets/svg/save--return.svg'; +import KFIcon from '@/components/KFIcon'; import { useVisible } from '@/hooks'; import { getWorkflowById, saveWorkflow } from '@/services/pipeline/index.js'; import { to } from '@/utils/promise'; -import { SaveOutlined } from '@ant-design/icons'; import { useEmotionCss } from '@ant-design/use-emotion-css'; import G6 from '@antv/g6'; import { Button, message } from 'antd'; @@ -706,7 +704,7 @@ const EditPipeline = () => {
- - + +
+ + + + + + +
@@ -242,11 +287,20 @@ const Props = forwardRef(({ onParentChange }, ref) => { rules={[ { required: true, - message: '请输入资源规格', + message: '请选择资源规格', }, ]} > - + diff --git a/react-ui/src/pages/Pipeline/index.jsx b/react-ui/src/pages/Pipeline/index.jsx index 7378bbc3..50206ace 100644 --- a/react-ui/src/pages/Pipeline/index.jsx +++ b/react-ui/src/pages/Pipeline/index.jsx @@ -1,3 +1,4 @@ +import KFIcon from '@/components/KFIcon'; import { addWorkflow, cloneWorkflow, @@ -6,8 +7,9 @@ import { getWorkflowById, removeWorkflow, } from '@/services/pipeline/index.js'; -import { CopyOutlined, DeleteOutlined, EditOutlined, PlusCircleOutlined } from '@ant-design/icons'; -import { Button, Form, Input, Modal, Space, Table, message } from 'antd'; +import themes from '@/styles/theme.less'; +import { modalConfirm } from '@/utils/ui'; +import { Button, ConfigProvider, Form, Input, Modal, Space, Table, message } from 'antd'; import momnet from 'moment'; import { useEffect, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; @@ -26,7 +28,7 @@ const Pipeline = () => { const editTable = (e, record) => { e.stopPropagation(); getWorkflowById(record.id).then((ret) => { - if (ret.code == 200) { + if (ret.code === 200) { form.resetFields(); form.setFieldsValue({ ...ret.data }); setFormId(ret.data.id); @@ -152,7 +154,7 @@ const Pipeline = () => { type="link" size="small" key="edit" - icon={} + icon={} onClick={(e) => { editTable(e, record); }} @@ -163,7 +165,7 @@ const Pipeline = () => { type="link" size="small" key="clone" - icon={} + icon={} onClick={async () => { Modal.confirm({ title: '复制', @@ -173,7 +175,7 @@ const Pipeline = () => { onOk: () => { console.log(record); cloneWorkflow(record.id).then((ret) => { - if (ret.code == 200) { + if (ret.code === 200) { message.success('复制成功'); getList(); } else { @@ -192,54 +194,45 @@ const Pipeline = () => { > 复制 - + + ), }, @@ -251,7 +244,7 @@ const Pipeline = () => { type="primary" className={Styles.plusButton} onClick={showModal} - icon={} + icon={} > 新建流水线 diff --git a/react-ui/src/services/pipeline/index.js b/react-ui/src/services/pipeline/index.js index d722398b..7262d6b1 100644 --- a/react-ui/src/services/pipeline/index.js +++ b/react-ui/src/services/pipeline/index.js @@ -1,3 +1,8 @@ +/* + * @Author: 赵伟 + * @Date: 2024-03-25 13:52:54 + * @Description: + */ import { request } from '@umijs/max'; // 查询流水线列表 export function getWorkflow(params) { @@ -63,3 +68,11 @@ export function getWorkflowById(id) { method: 'GET', }); } + +// 获取资源规格 +export function getComputingResourceReq(params) { + return request(`/api/mmp/computingResource`, { + method: 'GET', + params + }); +} diff --git a/react-ui/src/styles/theme.less b/react-ui/src/styles/theme.less index 9f6aaace..64b78619 100644 --- a/react-ui/src/styles/theme.less +++ b/react-ui/src/styles/theme.less @@ -1,17 +1,32 @@ // 全局颜色变量 -// FIXME: 不能设置 @primary-color 不起作用,感觉是哪里被重置了 -@kf-primary-color: #1664ff; // 主色调 -@primary-color-hover: #4086ff; +@primary-color: #1664ff; // 主色调 +@primary-color-hover: #69b1ff; @background-color: #f9fafb; // 页面背景颜色 @text-color: #1d1d20; -@text-color-second: #575757; -@font-size: 15px; +@text-color-secondary: #575757; +@success-color: #1ace62; +@error-color: #c73131; +@warning-color: #f98e1b; + @border-color: rgba(22, 100, 255, 0.3); @border-color-second: rgba(22, 100, 255, 0.1); @background-color-primay: rgba(22, 100, 255, 0.03); @background-color-gray: rgba(4, 3, 3, 0.06); +@heading-color: rgba(0, 0, 0, 0.85); +@input-icon-hover-color: rgba(0, 0, 0, 0.85); +@border-color-base: #d9d9d9; +@link-hover-color: #69b1ff; + +// 字体大小 +@font-size: 15px; + // 导出变量 :export { - primaryColor: @kf-primary-color; + primaryColor: @primary-color; + successColor: @success-color; + errorColor: @error-color; + warningColor: @warning-color; + textColor: @text-color; + fontSize: @font-size; } diff --git a/react-ui/src/utils/modal.tsx b/react-ui/src/utils/modal.tsx index d55d8378..4a3b765f 100644 --- a/react-ui/src/utils/modal.tsx +++ b/react-ui/src/utils/modal.tsx @@ -3,7 +3,8 @@ * @Date: 2024-04-13 10:08:35 * @Description: */ -import { type ModalProps } from 'antd'; +import { ConfigProvider, type ModalProps } from 'antd'; +import { globalConfig } from 'antd/es/config-provider'; import React, { useState } from 'react'; import { createRoot } from 'react-dom/client'; @@ -19,19 +20,20 @@ export const openAntdModal = ( modalProps: T, ) => { const CustomModel = modal; - const element = document.createElement('div'); - element.id = 'modal-container'; - document.body.appendChild(element); - const root = createRoot(element); + const container = document.createDocumentFragment(); + const root = createRoot(container); const { afterClose, onCancel } = modalProps; + const global = globalConfig(); + let timeoutId: ReturnType; function destroy() { root.unmount(); - document.body.removeChild(element); } function handleAfterClose() { afterClose?.(); + // Warning: Attempted to synchronously unmount a root while React was already rendering. + // React cannot finish unmounting the root until the current render has completed, which may lead to a race condition. setTimeout(() => { destroy(); }, 0); @@ -46,11 +48,26 @@ export const openAntdModal = ( } function render(props: T) { - root.render(); + clearTimeout(timeoutId); + + timeoutId = setTimeout(() => { + const rootPrefixCls = global.getPrefixCls(); + const iconPrefixCls = global.getIconPrefixCls(); + const theme = global.getTheme(); + const dom = ( + + ); + + root.render( + + {global.holderRender ? global.holderRender(dom) : dom} + , + ); + }); } function close() { - render({ ...modalProps, open: false, afterClose: handleAfterClose }); + render({ ...modalProps, open: false }); } render({ ...modalProps, open: true }); diff --git a/react-ui/src/utils/ui.tsx b/react-ui/src/utils/ui.tsx new file mode 100644 index 00000000..79a4c1f8 --- /dev/null +++ b/react-ui/src/utils/ui.tsx @@ -0,0 +1,28 @@ +/* + * @Author: 赵伟 + * @Date: 2024-04-19 14:42:51 + * @Description: UI 公共方法 + */ +import themes from '@/styles/theme.less'; +import { Modal, type ModalFuncProps } from 'antd'; + +// 自定义 Confirm 弹框 +export function modalConfirm({ title, content, onOk, ...rest }: ModalFuncProps) { + Modal.confirm({ + ...rest, + title: ( +
+ +
{title}
+
+ ), + content: content &&
{content}
, + okText: '确认', + cancelText: '取消', + onOk: onOk, + }); +} From 250f401b177748b79995d79c5098ed0f905b3afe Mon Sep 17 00:00:00 2001 From: liu2592603532 <2592603532@qq.com> Date: Mon, 22 Apr 2024 09:59:40 +0800 Subject: [PATCH 4/4] merge --- react-ui/src/components/RightContent/index.tsx | 2 +- react-ui/src/pages/Dataset/index.less | 11 +++++------ react-ui/src/pages/Model/index.less | 8 ++++---- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/react-ui/src/components/RightContent/index.tsx b/react-ui/src/components/RightContent/index.tsx index 52a49bbd..c2a4a7bf 100644 --- a/react-ui/src/components/RightContent/index.tsx +++ b/react-ui/src/components/RightContent/index.tsx @@ -50,7 +50,7 @@ const GlobalHeaderRight: React.FC = () => { - + {/* */} ); }; diff --git a/react-ui/src/pages/Dataset/index.less b/react-ui/src/pages/Dataset/index.less index d22c8dbe..2ff0b580 100644 --- a/react-ui/src/pages/Dataset/index.less +++ b/react-ui/src/pages/Dataset/index.less @@ -210,7 +210,6 @@ display: flex; flex: 1; flex-direction: column; - font-family: 'Alibaba'; height: 100%; padding: 22px 30px 26px 30px; background: #ffffff; @@ -229,11 +228,11 @@ flex: 1; flex-wrap: wrap; align-content: flex-start; - font-family: 'Alibaba'; - width: 103%; + + width: 102%; .dataItem { position: relative; - width: 23%; + width: 23.5%; height:164px; background:#ffffff; border:1px solid; @@ -250,7 +249,7 @@ line-height: 0px; color:#1d1d20; font-size:16px; - + font-family: 'Alibaba'; } .itemDescripition{ position: absolute; @@ -286,7 +285,7 @@ } .dataItem:hover{ border-color: #1664FF; - box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.2) + box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.1) } .dataItem:hover .itemText{ diff --git a/react-ui/src/pages/Model/index.less b/react-ui/src/pages/Model/index.less index 5bf1cc1b..7bee2701 100644 --- a/react-ui/src/pages/Model/index.less +++ b/react-ui/src/pages/Model/index.less @@ -219,10 +219,10 @@ flex: 1; flex-wrap: wrap; align-content: flex-start; - width: 100%; + width: 102%; .dataItem { position: relative; - width: 23%; + width: 23.5%; height:164px; background:#ffffff; border:1px solid; @@ -239,7 +239,7 @@ line-height: 0px; color:#1d1d20; font-size:16px; - + font-family: 'Alibaba'; } .itemDescripition{ position: absolute; @@ -275,7 +275,7 @@ } .dataItem:hover{ border-color: #1664FF; - box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.2) + box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.1) } .dataItem:hover .itemText{