diff --git a/src/AppConfig.js b/src/AppConfig.js index 1a241cead..7a8272a7a 100644 --- a/src/AppConfig.js +++ b/src/AppConfig.js @@ -32,7 +32,7 @@ export function initAxiosInterceptors(props) { // 判断网络是否连接 initOnlineOfflineListener(); - var proxy = "https://testforgeplus.trustie.net"; + var proxy = "https://testforgeplus.educoder.net"; //响应前的设置 axios.interceptors.request.use( config => { diff --git a/src/Loading.js b/src/Loading.js index 8175b7df8..fa9b2d155 100644 --- a/src/Loading.js +++ b/src/Loading.js @@ -2,14 +2,9 @@ import React, { Component } from 'react'; import { Spin } from 'antd'; class Loading extends Component { - componentDidUpdate(prevProps, prevState) { - if (!prevProps.error && this.props.error) { - console.log(this.props.error) - } - } render() { - return "" + return
} } diff --git a/src/forge/Component/ProfileModal/Profile.jsx b/src/forge/Component/ProfileModal/Profile.jsx index 2ae769ebe..5df2b39de 100644 --- a/src/forge/Component/ProfileModal/Profile.jsx +++ b/src/forge/Component/ProfileModal/Profile.jsx @@ -14,7 +14,7 @@ function Profile({ function checkProfile() { if(checkIfLogin()){ - if(!current_user.has_gitea_user || (current_user.has_gitea_user && !current_user.is_sync_pwd)){ + if(!current_user.has_gitea_user){ setGiteaVisible(true); }else{ if(!completeProfile){ diff --git a/src/forge/Head/Header.js b/src/forge/Head/Header.js index d09cad7d4..814c7b4b3 100644 --- a/src/forge/Head/Header.js +++ b/src/forge/Head/Header.js @@ -63,7 +63,7 @@ class NewHeader extends Component { } getEducoderSetting=()=>{ - const url = `https://data.educoder.net/api/setting.json`; + const url = `/setting.json`; axios.get(url).then(result=>{ if(result && result.data){ this.setState({ diff --git a/src/forge/Issues/Component/allMenus.jsx b/src/forge/Issues/Component/allMenus.jsx index 90afca543..3a80aebb6 100644 --- a/src/forge/Issues/Component/allMenus.jsx +++ b/src/forge/Issues/Component/allMenus.jsx @@ -27,14 +27,16 @@ function AllMenus({owner,projectsId,chooseFunc,update,defaultNames,defaultIds,op const [ author , setAuthor ] = useState(undefined); const [ tagList , setTagList ] = useState(undefined); const [ tag , setTag ] = useState(undefined); + const [ cases , setCases ] = useState(undefined); const [ millstoneList , setMillstoneList ] = useState(undefined); const [ millstone , setMillstone ] = useState(undefined); const [ chargeList , setChargeList ] = useState(undefined); + const [ caseList , setCaseList ] = useState(undefined); const [ charge , setCharge ] = useState(undefined); const [ statusList , setStatusList ] = useState(undefined); const [ prioritiesList , setPrioritiesList ] = useState(undefined); - const [ ids , setIds ] = useState({author_id:undefined,issue_priorities_id:undefined,issue_tag_ids:undefined,milestone_id:undefined,sort_by:undefined,status_id:undefined,assigner_id:undefined}); - const [ names , setNames ] = useState({author_name:undefined,issue_priorities_name:undefined,issue_tag_name:undefined,milestone_name:undefined,sortby_name:undefined,status_name:undefined,assigner_name:undefined}); + const [ ids , setIds ] = useState({author_id:undefined,issue_priorities_id:undefined,issue_tag_ids:undefined,milestone_id:undefined,sort_by:undefined,status_id:undefined,assigner_id:undefined,test_case:undefined}); + const [ names , setNames ] = useState({author_name:undefined,issue_priorities_name:undefined,issue_tag_name:undefined,milestone_name:undefined,sortby_name:undefined,status_name:undefined,assigner_name:undefined,test_case:undefined}); useEffect(()=>{ if(defaultNames){ @@ -80,6 +82,31 @@ function AllMenus({owner,projectsId,chooseFunc,update,defaultNames,defaultIds,op } }) } + // 获取测试用例 + useEffect(()=>{ + getCase(); + },[cases]) + + function getCase(){ + const url = `/v1/${owner}/${projectsId}/issues/test_cases`; + axios.get(url,{ + params:{ + keyword:cases + } + }).then(result=>{ + if(result && result.data){ + let menu = result.data.data; + if(menu && menu.length>0){ + const l = menu.map(i=>{ + return {name:i.test_case,id:i.test_case} + }) + setCaseList(l); + }else{ + setCaseList([]); + } + } + }) + } // 获取里程碑列表 useEffect(()=>{ getMillstone(); @@ -187,6 +214,15 @@ function AllMenus({owner,projectsId,chooseFunc,update,defaultNames,defaultIds,op lists={millstoneList} searchFunc={(value)=>setMillstone(value)} chooseFunc={(id,name)=>{let copy = {...ids,milestone_id:id && id.length>0 ? id.join(","):undefined};let copyname = { ...names,milestone_name:name};setNames(copyname);setIds(copy);chooseFunc(copy,copyname)}} /> + setCases(value)} + double={false} + chooseFunc={(id,name)=>{let copy = {...ids,test_case:name};let copyname = { ...names,test_case:name};setNames(copyname);setIds(copy);chooseFunc(copy,copyname)}} + /> { + getCaseList(value); + },[]) + + useEffect(()=>{ + setV(value); + },[value]) + + useEffect(()=>{ + changeValue(v); + getCaseList(v); + },[v]) + + async function getCaseList(value){ + setV(value); + const url = `/v1/${owner}/${projectsId}/issues/test_cases`; + await axios.get(url,{ + params:{ + keyword:value + } + }).then(response=>{ + if(response && response.data){ + setFilterUnitList(response.data.data); + } + }).catch(error=>{}) + } + + return( +
  • + {name} + ({ value: item.test_case,label:item.test_case }))} + className={"boxStyles"} + bordered={false} + onBlur={()=>{if(onBlur){onBlur(v)}}} + maxLength={100} + > + { + filterUnitList && filterUnitList.length > 0 && + filterUnitList.map(i=>{ + return( + + ) + }) + } + +
  • + ) +} +export default CaseDrop; \ No newline at end of file diff --git a/src/forge/Issues/Component/datas.jsx b/src/forge/Issues/Component/datas.jsx index dba2ab56e..239a95e3e 100644 --- a/src/forge/Issues/Component/datas.jsx +++ b/src/forge/Issues/Component/datas.jsx @@ -64,6 +64,7 @@ function Datas({checkbox ,item , projectsId,owner}){ {item.milestone_name} } + {item.test_case} diff --git a/src/forge/Issues/Component/delayAuto.jsx b/src/forge/Issues/Component/delayAuto.jsx new file mode 100644 index 000000000..dc411a471 --- /dev/null +++ b/src/forge/Issues/Component/delayAuto.jsx @@ -0,0 +1,54 @@ +import React , { useState , useEffect , useRef,useMemo} from 'react'; +import { Select , Spin } from 'antd'; +import debounce from 'lodash/debounce'; + +function DebounceSelect({ fetchOptions, debounceTimeout = 600, ...props }) { + const [fetching, setFetching] = useState(false); + const [options, setOptions] = useState([]); + const fetchRef = useRef(0); + + useEffect(()=>{ + fetchOptions("").then((newOptions) => { + setOptions(newOptions); + }); + },[]) + + const debounceFetcher = useMemo(() => { + const loadOptions = (value) => { + fetchRef.current += 1; + const fetchId = fetchRef.current; + setOptions([]); + setFetching(true); + fetchOptions(value).then((newOptions) => { + if (fetchId !== fetchRef.current) { + // for fetch callback order + return; + } + setOptions(newOptions); + setFetching(false); + }); + }; + return debounce(loadOptions, debounceTimeout); + }, [fetchOptions, debounceTimeout]); + + return ( + + ); +} +export default DebounceSelect \ No newline at end of file diff --git a/src/forge/Issues/Pages/details.jsx b/src/forge/Issues/Pages/details.jsx index 1bf881440..61f423bd9 100644 --- a/src/forge/Issues/Pages/details.jsx +++ b/src/forge/Issues/Pages/details.jsx @@ -15,6 +15,7 @@ import axios from 'axios'; import CommentList from '../Component/comments/list'; import Claims from '../../claims/claims'; import ChooseMenu from '../Component/chooseMenu'; +import CaseDrop from '../Component/caseDrop'; function Details(props){ const owner = props.match.params.owner; @@ -54,6 +55,7 @@ function Details(props){ const [ branch_choose , setBranch_choose ] = useState([]); const [ rewardAmount , setRewardAmount ] = useState(undefined); const [ rewardFlag , setRewardFlag ] = useState(false); + const [ caseValue, setCaseValue ] = useState(undefined); const pathname = props.history.location.pathname; const permission = props && props.projectDetail && props.projectDetail.permission; @@ -109,6 +111,7 @@ function Details(props){ setMillstone_choose(data.milestone && data.milestone.id ? [data.milestone]:[]); setBranch_choose(data.branch_name ? [{name:data.branch_name}] : []); setRewardAmount(data.blockchain_token_num); + setCaseValue(data.test_case); data.start_date && setStartDate(moment(data.start_date).format('YYYY-MM-DD')); data.due_date && setDueDate(moment(data.due_date).format('YYYY-MM-DD')); @@ -230,7 +233,7 @@ function Details(props){ } // 可单个编辑保存右侧的项(!copy:非复制状态下) - function saveForeach(c,s,p,t,m,b,sDate,eDate,rewardAmount){ + function saveForeach(c,s,p,t,m,b,sDate,eDate,rewardAmount,caseValue){ if(!copy){ const url = `/v1/${owner}/${projectsId}/issues/${index}`; axios.patch(url,{ @@ -242,7 +245,8 @@ function Details(props){ assigner_ids: c?c:undefined, start_date:sDate, due_date:eDate, - blockchain_token_num:rewardAmount + blockchain_token_num:rewardAmount, + test_case:caseValue }).then(result=>{ if(result){ Init(); @@ -509,6 +513,7 @@ function Details(props){ /> } + setCaseValue(v)} onBlur={(v)=>saveForeach(undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,v)}/> {setStartDate(date);saveForeach(undefined,undefined,undefined,undefined,undefined,undefined,date)}} editFlag={editFlag}/> {setDueDate(date);saveForeach(undefined,undefined,undefined,undefined,undefined,undefined,undefined,date)}} editFlag={editFlag}/> diff --git a/src/forge/Issues/Pages/new.jsx b/src/forge/Issues/Pages/new.jsx index ce09cc6be..b40307380 100644 --- a/src/forge/Issues/Pages/new.jsx +++ b/src/forge/Issues/Pages/new.jsx @@ -7,6 +7,7 @@ import AddTagsBox from '../Component/addTagsBox'; import Date from '../Component/date'; import NewPanel from '../Component/newPanel'; import axios from 'axios'; +import CaseDrop from '../Component/caseDrop'; function New(props){ // history search 是否含有意见反馈标识 @@ -34,12 +35,12 @@ function New(props){ const [ tag_choose , setTag_choose ] = useState([]); const [ millstone_choose , setMillstone_choose ] = useState([]); const [ branch_choose , setBranch_choose ] = useState([]); + const [ caseValue, setCaseValue ] = useState(undefined); const [ start_date, setStartDate ] = useState("");//moment().format('YYYY-MM-DD') const [ due_date, setDueDate ] = useState(""); const [ rewardAmount , setRewardAmount ] = useState(undefined); - const [ rewardFlag , setRewardFlag ] = useState(false); const owner = props.match.params.owner; const projectsId = props.match.params.projectsId; @@ -194,7 +195,8 @@ function New(props){ assigner_ids:a, attachment_ids:fileList, start_date,due_date,receivers_login, - blockchain_token_num:rewardAmount + blockchain_token_num:rewardAmount, + test_case:caseValue }).then(result=>{ if(result && result.data && result.data.project_issues_index){ window.scrollTo(0,0); @@ -293,6 +295,7 @@ function New(props){ className="borderNo mt5" disabled={milepostId ? true : false}/> } + {console.log("case:",v);setCaseValue(v)}}/> setStartDate(date)}/> setDueDate(date)}/> diff --git a/src/forge/Issues/index.scss b/src/forge/Issues/index.scss index 1283e3a8e..7a5541822 100644 --- a/src/forge/Issues/index.scss +++ b/src/forge/Issues/index.scss @@ -851,4 +851,20 @@ } } } +} + +.boxStyles{ + margin-top: 10px!important; + width: 100%; + input,input[class~="ant-input"]:focus{ + border:none!important; + padding:0px; + } + div[class~='ant-select-selection__placeholder']{ + margin-left: 0px!important; + margin-right: 0px!important; + } + span[class~='ant-select-arrow']{ + opacity: 0; + } } \ No newline at end of file diff --git a/src/modules/tpm/TPMIndexHOC.js b/src/modules/tpm/TPMIndexHOC.js index 696c7ec67..cf43cff33 100644 --- a/src/modules/tpm/TPMIndexHOC.js +++ b/src/modules/tpm/TPMIndexHOC.js @@ -166,7 +166,6 @@ export function TPMIndexHOC(WrappedComponent) { tpmLoading: false, completeProfile:response.data.profile_completed }) - console.log("11:",response.data); if(response.data && response.data.login){ if(!response.data.has_gitea_user){ this.setState({