diff --git a/src/pages/WorkSpace/TestJob/components/SuiteSelectDrawer/ServerObjectSelect.tsx b/src/pages/WorkSpace/TestJob/components/SuiteSelectDrawer/ServerObjectSelect.tsx index 536d953be2825567c6f506df0d03b6b449dacc7b..766d718a54a10013448766e4b592de8a7c964a6a 100644 --- a/src/pages/WorkSpace/TestJob/components/SuiteSelectDrawer/ServerObjectSelect.tsx +++ b/src/pages/WorkSpace/TestJob/components/SuiteSelectDrawer/ServerObjectSelect.tsx @@ -2,6 +2,7 @@ import { Select, Badge, Typography, Form } from 'antd' import React, { useContext, useEffect, useMemo, useState } from 'react' import { standloneServerList, queryClusterServer, queryClusterStandaloneServer, queryClusterGroupServer } from './services'; +import debounce from 'lodash/debounce'; import { DrawerProvider } from './Provider' import { useParams, useIntl } from 'umi' import DropdownRender from '../DropdownRender'; @@ -30,28 +31,33 @@ const ServerObjectSelect = (props: any) => { const [fetching, setFetching] = useState(true) const [pageNum, setPageNum] = useState(1) const [pageVisibleState, setPageVisibleState] = React.useState(false) - //内网单机 + const [searchValue, setSearchValue] = useState(undefined) + //内网单机 const standaloneServerRequest = async (page_num = 1) => { - const { data, code } = await standloneServerList({ ws_id, state: ['Available', 'Occupied', 'Reserved'], page_num, page_size: PAGE_SIZE }) //, page_size : 2 + const search = searchValue ? { ip: searchValue }: {} + const { data, code } = await standloneServerList({ ws_id, state: ['Available', 'Occupied', 'Reserved'], page_num, page_size: PAGE_SIZE, ...search }) //, page_size : 2 if (code === 200 && data) setServerList((p: any) => filterRepeat(p, data)) } //内网集群 const clusterServerRequest = async (page_num = 1) => { - const { data, code } = await queryClusterServer({ cluster_type: 'aligroup', ws_id, page_num, page_size: PAGE_SIZE }) + const search = searchValue ? { ip: searchValue }: {} + const { data, code } = await queryClusterServer({ cluster_type: 'aligroup', ws_id, page_num, page_size: PAGE_SIZE, ...search }) if (code === 200 && data) setServerList((p: any) => filterRepeat(p, data)) } //云上单机 const clusterStandaloneRequest = async () => { - const { data, code } = await queryClusterStandaloneServer({ ws_id, no_page: true, is_instance: serverObjectType === 'instance', state: ['Available', 'Occupied', 'Reserved'] }) + const search = searchValue ? { ip: searchValue }: {} + const { data, code } = await queryClusterStandaloneServer({ ws_id, no_page: true, is_instance: serverObjectType === 'instance', state: ['Available', 'Occupied', 'Reserved'], ...search }) if (code === 200 && data) setServerList((p: any) => filterRepeat(p, data)) } //云上集群 const clusterGroupRequest = async () => { - const { data, code } = await queryClusterGroupServer({ cluster_type: 'aliyun', ws_id, no_page: true }) + const search = searchValue ? { ip: searchValue }: {} + const { data, code } = await queryClusterGroupServer({ cluster_type: 'aliyun', ws_id, no_page: true, ...search }) if (code === 200 && data) setServerList((p: any) => filterRepeat(p, data)) } @@ -81,7 +87,7 @@ const ServerObjectSelect = (props: any) => { return () => { setPageVisibleState(false) } - }, [serverObjectType]) + }, [serverObjectType, searchValue]) const state = useDocumentVisibility() @@ -104,6 +110,16 @@ const ServerObjectSelect = (props: any) => { } } + // 搜索 + const onSearch = (word: any)=> { + // console.log('word:', word) + if (word) { + setSearchValue(word) + } else { + setSearchValue(undefined) + } + } + const switchServerMessage = useMemo( () => { switch (serverObjectType) { @@ -180,6 +196,7 @@ const ServerObjectSelect = (props: any) => { placeholder={switchServerMessage} dropdownMatchSelectWidth={340} showSearch + onSearch={debounce(onSearch, 300)} loading={fetching} onPopupScroll={handleServerPopupScroll} popupClassName="job_select_drop_cls" diff --git a/src/pages/WorkSpace/TestJob/index.tsx b/src/pages/WorkSpace/TestJob/index.tsx index 8e74249152524ae0310a4d993162115b7fed0a39..98888c750c3b7d7958cafdfa7774131bb1f4ebdd 100644 --- a/src/pages/WorkSpace/TestJob/index.tsx +++ b/src/pages/WorkSpace/TestJob/index.tsx @@ -260,7 +260,9 @@ const TestJob: React.FC = (props) => { build_config, build_machine, scripts, ...rest } - const kernel_info = { hotfix_install, scripts, kernel_packages } + const kernel_info = { hotfix_install, scripts, + kernel_packages: kernel_packages?.map((item: any)=> item?.trim()), // 去除输入内容两端空格 + } let scriptInfo = script_info let rpmInfo = rpm_info @@ -740,8 +742,8 @@ const TestJob: React.FC = (props) => { const handleCancelTemplate = (key: any) => { notification.close(key) - setFetching(false) - history.push({ pathname: `/ws/${ws_id}/job/templates`, state: state || {} }) + // setFetching(false) + // history.push({ pathname: `/ws/${ws_id}/job/templates`, state: state || {} }) } const handleSaveTemplateModify = async () => { diff --git a/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/components/PipLine/PipLineItemStep/index.tsx b/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/components/PipLine/PipLineItemStep/index.tsx index a7939da6ad2fb755980daa1fb51a47f018150b92..5358bd18bdc190cbb3bad4659df017ba0379fab3 100644 --- a/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/components/PipLine/PipLineItemStep/index.tsx +++ b/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/components/PipLine/PipLineItemStep/index.tsx @@ -1,5 +1,7 @@ import { useState } from 'react' import { history } from 'umi'; +import { Popover } from 'antd' +import { QuestionCircleOutlined } from '@ant-design/icons'; import { getColorByState, getStepColorByState } from '@/utils/utils' import { IconByState, ArrowSolid, TemplateItem } from '../modules' import { @@ -79,6 +81,16 @@ const PipLineItemGrey = (props: any) => { {fail || '-'} + {item.error_info && + + + + } diff --git a/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/components/PipLine/index.tsx b/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/components/PipLine/index.tsx index 84924b8b2e72e5e677d4ea0c750a710b5085f2a2..f1c61d44faf1c448af8944fa4bd21a4d0f18af01 100644 --- a/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/components/PipLine/index.tsx +++ b/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/components/PipLine/index.tsx @@ -37,7 +37,7 @@ const PipLine = (props: any) => { {/** 测试阶段, .... */} {test_result?.map((item: any, index: any): any => { - return + return })} {/** 结束 */} diff --git a/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/index.tsx b/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/index.tsx index a0c4bc4e402458466047df0b0fff0e627ac43991..46a53d700cbfbcb4425a1c69d479deee8418f06e 100644 --- a/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/index.tsx +++ b/src/pages/WorkSpace/TestPlan/PlanView/ViewDetail/index.tsx @@ -1,6 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { useState, useEffect, useCallback, useRef } from 'react' -import { Breadcrumb, Typography, Row, Tag, Button, Spin } from 'antd' +import { Breadcrumb, Typography, Row, Tag, Button, Spin, Popover } from 'antd' +import { QuestionCircleOutlined } from '@ant-design/icons'; import styled from 'styled-components' import { FormattedMessage, history } from 'umi' import { useClientSize, writeDocumentTitle } from '@/utils/hooks' @@ -88,7 +89,7 @@ const ViewDetail = (props: any) => { }, [plan_id]) const TagInfo = ({ data }: any) => { - const { state, start_time, end_time } = data + const { state, start_time, end_time, error_info } = data const rowStyle = { display: 'flex', alignItems: 'center' } const normalStyle = { background: '#F2F4F6', border: '1px solid #F2F4F6' } return ( @@ -100,7 +101,16 @@ const ViewDetail = (props: any) => { Running )} {state === 'fail' && ( - Fail +
+ Fail + + + +
)} {state === 'success' && ( Complete diff --git a/src/pages/WorkSpace/TestReport/NewReport/components/Catalog.tsx b/src/pages/WorkSpace/TestReport/NewReport/components/Catalog.tsx index 9622638935d025d17784f09ddc13189e088d7399..71ebb7b5ab1c435880ce295220ecbd2d113e687e 100644 --- a/src/pages/WorkSpace/TestReport/NewReport/components/Catalog.tsx +++ b/src/pages/WorkSpace/TestReport/NewReport/components/Catalog.tsx @@ -230,8 +230,8 @@ const TemplateCatalog = () => { } leftTitle?.classList.add('toc-selected'); const parentNode = leftTitle?.id.substring(5, 14) - const parentTop = (document.querySelector(`#left_${parentNode}`) as any).offsetTop - const parentTreeTop = (document.querySelector(`#left_tree_${parentNode}`) as any).offsetTop + const parentTop = (document.querySelector(`#left_${parentNode}`) as any)?.offsetTop || 0 + const parentTreeTop = (document.querySelector(`#left_tree_${parentNode}`) as any)?.offsetTop || 0 if (leftTitle.attributes['class'].nodeValue == 'toc-selected') { if (leftTitle?.id === 'left_perf_item' || leftTitle?.id === 'left_func_item') { setRoundHeight(parentTop) diff --git a/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/ChartTypeChild.tsx b/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/ChartTypeChild.tsx index a3b56851b342d9ba59eb6e4238aa2fdb240d2aa7..98747a69d4c42263576c43e15ca495e2f97e5269 100644 --- a/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/ChartTypeChild.tsx +++ b/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/ChartTypeChild.tsx @@ -1,15 +1,16 @@ -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import { Typography, Space, Select, } from 'antd'; import { FormattedMessage } from 'umi'; const ChartTypeChild = (props: any) => { - const { btn, isReport, obj, suiteId, setPerData } = props; - const [chartType, setChartType] = useState('1') - const hanldeChangeChartType = (val: string) => { + const { btn, isReport, obj, suiteId, setPerData, chartType, setChartType } = props; + // const [chartType, setChartType] = useState('1') + const onChange = (val: string) => { setChartType(val) if (isReport) { setPerData({ - ...obj, list: obj.list.map((item: any) => { + ...obj, + list: obj.list.map((item: any) => { if (suiteId === item.suite_id) { return { ...item, @@ -36,7 +37,7 @@ const ChartTypeChild = (props: any) => { {!btn && - diff --git a/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/PrefReview.tsx b/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/PrefReview.tsx index 8562eede230ae8183da8ecd9fc51d1b36165443f..3d83a4e8038b1e90731480c8a885b4dd0de6f70f 100644 --- a/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/PrefReview.tsx +++ b/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/PrefReview.tsx @@ -76,6 +76,7 @@ const Performance = (props: any) => { const isEditPage = !!~pathname?.indexOf('/edit') const [filterName, setFilterName] = useState('all') + const [chartType, setChartType] = useState('1') const [perData, setPerData] = useState({}) const [sortKeys, setSortKeys] = React.useState([]) const baseIndex = useMemo(() => { @@ -89,7 +90,7 @@ const Performance = (props: any) => { ...child, list: child.list?.map((item: any) => { return { ...item, - chartType: '1' + chartType, } }) }) @@ -259,7 +260,8 @@ const Performance = (props: any) => { } - + {!domainResult.is_default && diff --git a/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/TypeChart.tsx b/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/TypeChart.tsx index 7fa56d705f97b3a5bd9e6d053231a14789750cc9..cf5a6bb7134c580e0571e9e5891de0735d7acd30 100644 --- a/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/TypeChart.tsx +++ b/src/pages/WorkSpace/TestReport/NewReport/components/TestDataChild/TypeChart.tsx @@ -129,7 +129,7 @@ const TypeChart = (props: any) => { } } return obj; - }, [data]) + }, [data, chartType]) useEffect(() => { const { series, subText, xAxisData, legData, dataZoom_end } = ChartList @@ -284,12 +284,16 @@ const TypeChart = (props: any) => { } const timer = setTimeout(() => { // 渲染数据展示 - const chartObj = echarts.init(chart.current, undefined, { - renderer: 'svg', - }); - chartObj.setOption(option as any) - callBackColor(chartObj.getOption().color) - chartDom.current = chartObj + let chartObj: any = null + try { + chartObj = echarts?.init(chart.current, undefined, { renderer: 'svg' }) + } catch { + } + if (chartObj) { + chartObj.setOption(option as any) + callBackColor(chartObj.getOption().color) + chartDom.current = chartObj + } }, duration) return () => { diff --git a/src/pages/WorkSpace/TestResult/Details/components/TagsEditer.tsx b/src/pages/WorkSpace/TestResult/Details/components/TagsEditer.tsx index f8ca164dddc942c983417630c2a9a29d9e51d313..a8402566e4c858d67def0d5688095975f0403637 100644 --- a/src/pages/WorkSpace/TestResult/Details/components/TagsEditer.tsx +++ b/src/pages/WorkSpace/TestResult/Details/components/TagsEditer.tsx @@ -153,7 +153,8 @@ const TagsEditer: React.FC = ({ tags = [], onOk, creator_id, width }) => { { access.WsMemberOperateSelf() &&
- + +
diff --git a/src/pages/WorkSpace/TestResult/JobList/ListTable.tsx b/src/pages/WorkSpace/TestResult/JobList/ListTable.tsx index 4f234cc9c281679059e1794806adca93da923e78..509ca489bba15b328437439dd07c6b54a2e01be0 100644 --- a/src/pages/WorkSpace/TestResult/JobList/ListTable.tsx +++ b/src/pages/WorkSpace/TestResult/JobList/ListTable.tsx @@ -208,8 +208,13 @@ const ListTable: React.FC = (props) => { ), dataIndex: 'test_result', width: 140, - render: (_: any) => { - const result = JSON.parse(_) + render: (_: any, record: any) => { + let result = {} + try { + result = JSON.parse(_) + } catch { + console.log('JSON格式不对') + } if (lodash.isNull(result)) { return ( @@ -221,9 +226,9 @@ const ListTable: React.FC = (props) => { } else { return ( - {result.total} - {result.pass} - {result.fail} + {result.total || '-'} + {result.pass || '-'} + {result.fail || '-'} ) }