diff --git a/package-lock.json b/package-lock.json index a70c087fd..4a4f6a361 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9603,6 +9603,7 @@ "set-blocking": "^2.0.0", "string-width": "^1.0.2", "which-module": "^1.0.0", + "y18n": "^3.2.1", "yargs-parser": "^5.0.0" } } @@ -9828,6 +9829,7 @@ "set-blocking": "^2.0.0", "string-width": "^1.0.2", "which-module": "^1.0.0", + "y18n": "^3.2.1", "yargs-parser": "^5.0.0" } } @@ -20037,6 +20039,11 @@ "resolved": "https://registry.npm.taobao.org/xterm-addon-fit/download/xterm-addon-fit-0.4.0.tgz", "integrity": "sha1-BuDF0KaqrPsAnvVl76HIHpPZAZM=" }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.nlark.com/y18n/download/y18n-3.2.2.tgz", + "integrity": "sha1-hckBvWRwznH8S7cjrSCbcPfyhpY=" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/public/css/edu-purge.css b/public/css/edu-purge.css index 694ef054c..6191978d2 100644 --- a/public/css/edu-purge.css +++ b/public/css/edu-purge.css @@ -3945,6 +3945,10 @@ html>body #ajax-indicator { margin-left: 10px; color: #2FC25B; } +.privateTag.red{ + color: #FF6832; + border:1px solid #FF6832; +} .head-nav { text-align: center; height: 58px; diff --git a/src/App.js b/src/App.js index 0bebf090c..e93332727 100644 --- a/src/App.js +++ b/src/App.js @@ -3,7 +3,6 @@ import './App.css'; import { ConfigProvider } from 'antd' import zhCN from 'antd/lib/locale-provider/zh_CN'; import { - // BrowserRouter as Router, Route, Switch } from 'react-router-dom'; @@ -79,10 +78,7 @@ const OrganizeIndex = Loadable({ loader: () => import('./forge/Team/Index'), loading: Loading, }) -const EducoderLogin = Loadable({ - loader: () => import('./modules/login/EducoderLogin'), - loading: Loading, -}) + const Search = Loadable({ loader: () => import('./modules/search/'), loading: Loading, @@ -283,8 +279,7 @@ class App extends Component { }; render() { - const { mygetHelmetapi, pathType} = this.state; - let personal = mygetHelmetapi && mygetHelmetapi.personal; + const { pathType } = this.state; return ( @@ -437,7 +432,6 @@ class App extends Component { - {/* */} diff --git a/src/forge/AboutUs/AboutUs.jsx b/src/forge/AboutUs/AboutUs.jsx index 142528bd7..c50e556ab 100644 --- a/src/forge/AboutUs/AboutUs.jsx +++ b/src/forge/AboutUs/AboutUs.jsx @@ -82,7 +82,7 @@ function AboutUs(){ {/* 确实开源 一脉传承 */}

确实开源  一脉传承

-
本世纪以来,随着软件创新需求和应用规模的飞速增长,软件开发队伍、开发资源、可信评估呈现出规模化、开放化、持续化的新特点,软件开发活动面临协同难、复用难、评估难的制约,经典的工程化软件开发方法面临严峻挑战,严重影响了软件开发效率和质量的提升。在此背景下,国防科技大学联合国内多所知名高校、科研机构和软件企业,围绕开源创新开展了持续性探索,构建形成了以Trustie(确实)为代表的一系列开源创新服务基础设施。自2006年以来,Trustie经过三个阶段的演化发展,于2021年迎来全面升级:在计算机学会(CCF)的带领指导下,共同推进产学研用深度融合,共筑新一代开源创新服务平台GitLink!
+
本世纪以来,随着软件创新需求和应用规模的飞速增长,软件开发队伍、开发资源、可信评估呈现出规模化、开放化、持续化的新特点,软件开发活动面临协同难、复用难、评估难的制约,经典的工程化软件开发方法面临严峻挑战,严重影响了软件开发效率和质量的提升。在此背景下,国防科技大学联合国内多所知名高校、科研机构和软件企业,围绕开源创新开展了持续性探索,构建形成了以Trustie(确实)为代表的一系列开源创新服务基础设施。自2006年以来,Trustie经过三个阶段的演化发展,于2021年迎来全面升级:在中国计算机学会(CCF)的带领指导下,共同推进产学研用深度融合,共筑新一代开源创新服务平台GitLink!
@@ -102,7 +102,7 @@ function AboutUs(){ }>

Trustie 3.0阶段 (2020年至今)

-
Trustie在已有的技术积累基础上,进一步联合国内高等院校、科研机构、产业企业和开源组织等,在计算机学会(CCF)的带领指导下,共同推进产学研用深度融合,致力于联接互联网海量群智资源,探索开源创新成果开放与共享、开源生态协作与共建的新模式和新方法,升级形成了新一代开源创新服务平台GitLink,力图破解软件开发群智范式背后的本质机理,建立面向“大外围”开放创新的群智激发与汇聚关键机制,实现面向大规模软件涉众的稳态群智激发与汇聚。
+
Trustie在已有的技术积累基础上,进一步联合国内高等院校、科研机构、产业企业和开源组织等,在中国计算机学会(CCF)的带领指导下,共同推进产学研用深度融合,致力于联接互联网海量群智资源,探索开源创新成果开放与共享、开源生态协作与共建的新模式和新方法,升级形成了新一代开源创新服务平台GitLink,力图破解软件开发群智范式背后的本质机理,建立面向“大外围”开放创新的群智激发与汇聚关键机制,实现面向大规模软件涉众的稳态群智激发与汇聚。
diff --git a/src/forge/Activity/ActivityItem.js b/src/forge/Activity/ActivityItem.js index 48a72e797..19ce15366 100644 --- a/src/forge/Activity/ActivityItem.js +++ b/src/forge/Activity/ActivityItem.js @@ -14,20 +14,20 @@ class ActivityItem extends Component { {/* 如果是版本发布 */} {item.trend_type === "VersionRelease" ?

- {item.name} + {item.name} {item.trend_type}

: // 如果是任务 item.trend_type === "Issue" ?

- {item.name} + {item.name} {item.trend_type}

: // 如果是合并请求

- {item.name} + {item.name} {item.trend_type}

} diff --git a/src/forge/Branch/CloneAddress.js b/src/forge/Branch/CloneAddress.js index c2e6dd746..b3e31cccb 100644 --- a/src/forge/Branch/CloneAddress.js +++ b/src/forge/Branch/CloneAddress.js @@ -7,10 +7,10 @@ function CloneAddress({http_url , ssh_url , zip_url , tar_url}) { const [ key , setKey ] = useState("HTTP"); return (
-
+
{setKey(e.key)}}>HTTP - {setKey(e.key)}}>SSH + {ssh_url && {setKey(e.key)}}>SSH}
@@ -18,8 +18,8 @@ function CloneAddress({http_url , ssh_url , zip_url , tar_url}) {
- 下载 ZIP - 下载 TAR.GZ + {zip_url && 下载 ZIP} + {tar_url && 下载 TAR.GZ}
) diff --git a/src/forge/Component/Contributors.jsx b/src/forge/Component/Contributors.jsx index e88acc056..f6dade6a4 100644 --- a/src/forge/Component/Contributors.jsx +++ b/src/forge/Component/Contributors.jsx @@ -7,7 +7,7 @@ import './Component.scss'; import { getUser } from '../GetData/getData'; import axios from 'axios'; -function Contributors({contributors,owner,projectsId,currentLogin}){ +function Contributors({owner,projectsId,currentLogin}){ const [ menuList ,setMenuList ]= useState([]); const [ list , setList ]= useState(undefined); const [ total , setTotal ]= useState(0); @@ -16,11 +16,18 @@ function Contributors({contributors,owner,projectsId,currentLogin}){ const [ isSpin , setIsSpin ] = useState(false); useEffect(()=>{ - if(contributors && contributors.total_count>0){ - setTotal(contributors.total_count); - setList(contributors.list); - } - },[contributors]) + getData(); + },[]) + + function getData(){ + const url = `/${owner}/${projectsId}/contributors.json`; + axios.get(url).then(result=>{ + if(result){ + setTotal(result.data.total_count); + setList(result.data.list); + } + }).catch(error=>{}) + } useEffect(()=>{ if(login){ @@ -148,15 +155,15 @@ function Contributors({contributors,owner,projectsId,currentLogin}){ } return( + total > 0 ?
贡献者 - { contributors && contributors.total_count > 0 && {contributors.total_count}} + { total > 0 && {total}}
setVisibleFunc(false)}> { - total > 0 ? - list.map((item,key)=>{ + list && list.length>0 && list.map((item,key)=>{ return( @@ -165,10 +172,9 @@ function Contributors({contributors,owner,projectsId,currentLogin}){ ) }) - :"" }
-
+
:"" ) } export default Contributors; \ No newline at end of file diff --git a/src/forge/Component/LanguagePower.jsx b/src/forge/Component/LanguagePower.jsx index 8d3e361b5..b2fb174b1 100644 --- a/src/forge/Component/LanguagePower.jsx +++ b/src/forge/Component/LanguagePower.jsx @@ -1,18 +1,41 @@ import React, { useEffect, useState } from 'react'; import { FlexAJ } from '../Component/layout'; +import { Divider } from 'antd'; +import axios from 'axios'; -function LanguagePower({languages}){ +function LanguagePower({owner,projectsId}){ const [ array , setArray ] = useState(undefined); + useEffect(()=>{ - if(languages){ - let arr = []; - Object.keys(languages).map((item,key)=>{ - arr.push({name:item,percent:languages[item],color:getColor()}); - }) - setArray(arr); - } - },[languages]) + getData(); + },[]) + + function getData(){ + const url = `/${owner}/${projectsId}/languages.json`; + axios.get(url).then(result=>{ + if(result){ + let languages = result.data; + if(languages){ + let arr = []; + Object.keys(languages).map((item,key)=>{ + arr.push({name:item,percent:languages[item],color:getColor()}); + }) + setArray(arr); + } + } + }).catch(error=>{}) + } + + // useEffect(()=>{ + // if(languages){ + // let arr = []; + // Object.keys(languages).map((item,key)=>{ + // arr.push({name:item,percent:languages[item],color:getColor()}); + // }) + // setArray(arr); + // } + // },[languages])  function getColor(){ let str = "#"; @@ -24,7 +47,9 @@ function LanguagePower({languages}){ return str; } return( + (array && array.length > 0) ?
+

开发语言

{ @@ -47,8 +72,7 @@ function LanguagePower({languages}){ } } - -
+
:"" ) } export default LanguagePower; \ No newline at end of file diff --git a/src/forge/Head/Header.js b/src/forge/Head/Header.js index 34554f0ff..acdf2dea1 100644 --- a/src/forge/Head/Header.js +++ b/src/forge/Head/Header.js @@ -17,7 +17,6 @@ import './header.scss'; import NoticeContent from './NoticeContent'; import MainLogo from './img/logo.png'; // TODO 这部分脚本从公共脚本中直接调用 -let old_url; window._header_componentHandler = null; // 非trustie链接则新开页跳转 @@ -197,12 +196,19 @@ class NewHeader extends Component { matchpaths = (url) => { const { match } = this.props; - if(url){ - if (match.path.indexOf(url) > -1) { - return true - }else { - return false - } + const isDev = window.location.port == 3007; + const isdev2= isDev ?'https://testforgeplus.trustie.net':`https://${window.location.hostname}`; + let str = ""; + if(url.indexOf("http")>-1){ + str = isdev2+match.path; + }else{ + str = match.path; + } + + if (url && str === url) { + return true + }else { + return false } } @@ -272,82 +278,6 @@ class NewHeader extends Component { settings, visible, } = this.state; - /*用户名称 用户头像url*/ - // let activeIndex = false; - // let activeForums = false; - // let activeShixuns = false; - // let activePaths = false; - // let coursestype = false; - // let activePackages = false; - // let activeMoopCases = false; - // let activeCompetitions = false; - - // if (match.path === '/forums') { - // activeForums = true; - // } else if (match.path.startsWith('/shixuns')) { - // activeShixuns = true; - // } else if (match.path.startsWith('/paths')) { - // activePaths = true; - // } else if (match.path.startsWith('/courses')) { - // coursestype = true; - // } else if (match.path.startsWith('/crowdsourcing')) { - // activePackages = true; - // } else if (match.path.startsWith('/moop_cases')) { - // activeMoopCases = true; - // } else if (match.path.startsWith('/competitions')) { - // activeCompetitions = true; - // } else { - // activeIndex = true; - // } - - // let headtypes = '/'; - // if (settings) { - // if (settings.navbar) { - // if (settings.navbar.length > 0) { - // if (match.path === '/') { - // if (headtypesonClickbool === false) { - // headtypes = undefined; - // } else { - // headtypes = headtypess; - // } - // } else { - // for (var i = 0; i < settings.navbar.length; i++) { - // if (match.path === settings.navbar[i].link) { - // headtypes = settings.navbar[i].link; - // break; - // } - // } - // } - // } - // } - // } - // let shixuntype = false; - // let pathstype = false; - // let coursestypes = false; - // if (this.props && this.props.mygetHelmetapi != null) { - // let shixun = "/shixuns"; - // let paths = "/paths"; - // let courses = "/courses"; - // this.props.mygetHelmetapi && this.props.mygetHelmetapi.navbar && this.props.mygetHelmetapi.navbar.map((item, key) => { - // var reg = RegExp(item.link); - // if (shixun.match(reg)) { - // if (item.hidden === true) { - // shixuntype = true - // } - // } - // if (paths.match(reg)) { - // if (item.hidden === true) { - // pathstype = true - // } - // } - // if (courses.match(reg)) { - // if (item.hidden === true) { - // coursestypes = true - // } - // } - // }) - // } - let search_url = settings && settings.common && settings.common.search; return (
@@ -405,7 +335,7 @@ class NewHeader extends Component { var waiLian = (new_link && str.filter(item=>new_link.indexOf(item)>-1) ); var wl = waiLian && waiLian.length>0; return ( -
  • this.headtypesonClick(item.link, true)} className={`${this.matchpaths(item.link) === true ? 'pr active' : 'pr'}`} style={!is_hidden ? { display: 'flex' } : { display: 'none' }}> +
  • this.headtypesonClick(item.link, true)} className={`${this.matchpaths(new_link) === true ? 'pr active' : 'pr'}`} style={!is_hidden ? { display: 'flex' } : { display: 'none' }}> {item.name}
  • ) @@ -436,7 +366,6 @@ class NewHeader extends Component { > {current_user && - {/* */} } diff --git a/src/forge/Main/CoderDepot.jsx b/src/forge/Main/CoderDepot.jsx index 11521dc01..6090c69ef 100644 --- a/src/forge/Main/CoderDepot.jsx +++ b/src/forge/Main/CoderDepot.jsx @@ -23,6 +23,7 @@ import Nodata from '../Nodata'; import Invite from './sub/Invite'; import CheckProfile from '../Component/ProfileModal/Profile'; import RenderHtml from '../../components/render-html'; +import { Base64 } from 'js-base64'; /** * projectDetail.type:0是托管项目,1是镜像项目,2是同步镜像项目(为2时不支持在线创建、在线上传、在线修改、在线删除、创建合并请求等功能) */ @@ -279,6 +280,7 @@ function CoderDepot(props){ // 子目录路径返回链接 function returnUlr(url){ let enBranch = turnbar(branchName); + setType('dir'); props.history.push(`/${owner}/${projectsId}/tree${enBranch?`/${enBranch}`:""}/${url}`); } // 点击跳转到子目录 @@ -319,9 +321,9 @@ function CoderDepot(props){ const downloadMenu = ( ) // 确认修改简介、website、实践课程链接 @@ -351,7 +353,7 @@ function CoderDepot(props){ const { current_user } = props; const baseOper = current_user && current_user.login && issuesFlag; - const baseOperate = projectDetail && projectDetail.permission && projectDetail.permission !=="Reporter" && projectDetail.type !== 2 && pullsFlag; + const baseOperate = projectDetail && projectDetail.permission && projectDetail.permission !=="Reporter" && projectDetail.type !== 2 && pullsFlag && props.platform; const fileOperate = type === "dir" && projectDetail && projectDetail.type !== 2 && ((projectDetail.permission && projectDetail.permission !=="Reporter") || (current_user && current_user.admin)); return( @@ -401,7 +403,7 @@ function CoderDepot(props){ 分支:{branchName || defaultBranch} }
    - { + { treeValuePath && treeValuePath.length > 0 ? - - - 分支 - {projectDetail && projectDetail.branches_count} - + { + props.platform ? + + + 分支 + {projectDetail && projectDetail.branches_count} + + : + + + 分支 + {projectDetail && projectDetail.branches_count} + + } + { + props.platform ? - - 标签 - {projectDetail && projectDetail.tags_count} - + + 标签 + {projectDetail && projectDetail.tags_count} + : + + + 标签 + {projectDetail && projectDetail.tags_count} + + } } @@ -463,12 +482,18 @@ function CoderDepot(props){ (dirInfo && dirInfo.length>0) || fileInfo ?
    { - lastCommit && + ((lastCommit && lastCommit.message) || lastCommitAuthor) &&
    - -
    -
    -
    + { + lastCommitAuthor && + + } + { + lastCommit.message && +
    +
    +
    + } { hideBtn && changeHide(hide)}> } {lastCommit.time_from_now} @@ -490,6 +515,7 @@ function CoderDepot(props){ item={item} projectsId={projectsId} goToSubRoot={goToSubRoot} + platform={props.platform} /> ) }) @@ -569,7 +595,7 @@ function CoderDepot(props){ } {/* 发布 */} { - releaseVersions && + releaseVersions && props.platform && } {/* 贡献者 */} - { - projectDetail && projectDetail.contributors && projectDetail.contributors.total_count >0 && - - } + {/* 语言 */} - { projectDetail && projectDetail.languages && - - - - - } + } diff --git a/src/forge/Main/CoderDepotCatalogue.jsx b/src/forge/Main/CoderDepotCatalogue.jsx index 4f5d86c1a..f36448a80 100644 --- a/src/forge/Main/CoderDepotCatalogue.jsx +++ b/src/forge/Main/CoderDepotCatalogue.jsx @@ -8,13 +8,18 @@ const typeIco = { "dir":"icon-wenjianjia4 font-15 color-blue_4C" } -function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId }){ +function CoderDepotCatalogue({item , goToSubRoot , owner , projectsId , platform }){ return(
  • - goToSubRoot(item.path,item.type,item.name)} className={item.type === "submodule" && "submoduleStyle"}> - {item.name} - + { + (!platform && item.image_type) ? + {item.name} + : + goToSubRoot(item.path,item.type,item.name)} className={item.type === "submodule" && "submoduleStyle"}> + {item.name} + + } diff --git a/src/forge/Main/CoderRootCommit.js b/src/forge/Main/CoderRootCommit.js index b542c3905..99637c91e 100644 --- a/src/forge/Main/CoderRootCommit.js +++ b/src/forge/Main/CoderRootCommit.js @@ -133,7 +133,7 @@ class CoderRootCommit extends Component{ render(){ const { commitDatas , dataCount , limit , page , isSpining , branchList } = this.state; - const { projectDetail, commit_class , defaultBranch } = this.props; + const { projectDetail, commit_class , defaultBranch , platform } = this.props; const { projectsId , owner , branchName } = this.props.match.params; let branch = returnbar(branchName || defaultBranch); return( @@ -159,7 +159,16 @@ class CoderRootCommit extends Component{
    -
    +
    + { + platform ? + + + + : + + } +

    sha - {truncateCommitId(`${item.sha}`)} + { + platform ? + {truncateCommitId(`${item.sha}`)} + : + {truncateCommitId(`${item.sha}`)} + } diff --git a/src/forge/Main/Detail.js b/src/forge/Main/Detail.js index 6fa8a0d43..222bfad5a 100644 --- a/src/forge/Main/Detail.js +++ b/src/forge/Main/Detail.js @@ -507,6 +507,7 @@ class Detail extends Component { {projectDetail && projectDetail.name}

    {projectDetail && projectDetail.private && 私有} + { !platform && 只读 }
    { diff --git a/src/forge/Main/Index.scss b/src/forge/Main/Index.scss index 5f3692929..dbdf4b1c1 100644 --- a/src/forge/Main/Index.scss +++ b/src/forge/Main/Index.scss @@ -246,11 +246,14 @@ display: flex; justify-content: space-between; align-items: flex-start; - border-bottom: 1px solid #d9d9d9; padding:12px 20px 11px; border-radius: 4px 4px 0px 0px; border: 1px solid rgba(42, 97, 255, 0.23); + border-bottom: none; background-color: #FAFCFF; + &+.listtablebody{ + border-top-color: rgba(42, 97, 255, 0.23); + } .ellipsistxt{ &:hover .markdown-body{ color: #466AFF; @@ -331,7 +334,6 @@ .listtablebody{ border-radius:0px 0px 4px 4px ; border: 1px solid #D0D0D0; - border-top: none; li.listtablepath{ a{color: #40a9ff;} p{ diff --git a/src/forge/Main/projecthome/Index.jsx b/src/forge/Main/projecthome/Index.jsx index 9045a2743..3b56b455a 100644 --- a/src/forge/Main/projecthome/Index.jsx +++ b/src/forge/Main/projecthome/Index.jsx @@ -4,18 +4,21 @@ import SubBanner from './SubBanner'; import SubUnitBanner from './SubUnitBanner'; import Icon from '../img/index/icon.png'; import { Link } from 'react-router-dom'; -import { Spin } from 'antd'; +import { Spin , Input } from 'antd'; import SubList from './SubList'; import more from '../img/index/more.png'; import axios from 'axios'; import { getImageUrl } from 'educoder'; import Nodata from '../../Nodata'; +const { Search } = Input; + const LIMIT = 20; function Index() { const [ cateList , setCateList ] = useState(undefined); const [ projectsList , setProjectsList ] = useState(undefined); + const [ search , setSearch ] = useState(undefined); const [ cateID, setCateID ] = useState(undefined); const [ isSpin, setIsSpin ] = useState(true); @@ -37,13 +40,14 @@ function Index() { }).catch(error=>{}) } - function getProject() { + function getProject(searchValue) { const url = `/projects.json`; axios.get(url,{ params:{ pinned:"d", category_id:cateID, - limit:LIMIT + limit:LIMIT, + search:searchValue } }).then(result=>{ if(result && result.data){ @@ -52,6 +56,15 @@ function Index() { } }).catch(error=>{}) } + + function changeSearchValue(e){ + setSearch(e.target.value); + } + + function searchFun(value){ + setIsSpin(true); + getProject(value); + } return(
    @@ -74,6 +87,18 @@ function Index() {
    开源项目 + + 更多
    @@ -85,7 +110,14 @@ function Index() { projectsList.map((i,k)=>{ return(
  • - + { + i.platform === "educoder" ? + + + + : + + }
    {i.author && i.author.name}/{i.name} diff --git a/src/forge/Main/projecthome/Index.scss b/src/forge/Main/projecthome/Index.scss index 80742234d..fd4b604e0 100644 --- a/src/forge/Main/projecthome/Index.scss +++ b/src/forge/Main/projecthome/Index.scss @@ -350,7 +350,15 @@ justify-content: space-between; border-bottom: 1px solid rgba(153, 153, 153, 0.16); padding:0px 20px; - span{ + .ant-btn-primary{ + background-color: #466AFF; + border-color: #466AFF; + &:hover,&:active{ + background-color: rgba(70,106,255,0.8); + border-color: rgba(70,106,255,0.8); + } + } + &>span{ font-size: 18px; font-weight: 500; color: #000000; diff --git a/src/forge/Main/projecthome/SubUnitBanner.jsx b/src/forge/Main/projecthome/SubUnitBanner.jsx index f3ba16a57..1069452dd 100644 --- a/src/forge/Main/projecthome/SubUnitBanner.jsx +++ b/src/forge/Main/projecthome/SubUnitBanner.jsx @@ -23,27 +23,41 @@ const settings = { autoplay:true, arrows:false }; -const group_size = 6; +// const group_size = 6; +const list =[ + [ + {url:"/Huawei_Technology",avatar_url:huawei,name:"华为技术有限公司"}, + {url:"/openatom_foundation",avatar_url:jijinhui,name:"开放原子开源基金会"}, + {url:"/Inspur",avatar_url:langchao,name:"浪潮信息"}, + {url:"/mulan-community",avatar_url:mulan,name:"木兰开源社区"}, + ], + [ + {url:"/CrowdOS_WeSense",avatar_url:xigongye,name:"西北工业大学"}, + {url:"/pkecosystem",avatar_url:feiteng,name:"PK开源生态项目组"}, + {url:"/xuos",avatar_url:xiuos,name:"泛在操作系统实验室"}, + {url:"/hustos",avatar_url:huake,name:"华中科技大学操作系统团队"}, + ] +] function SubUnitBanner() { - const [ list , setlist ] = useState(undefined); + // const [ list , setlist ] = useState(undefined); - useEffect(()=>{ - getRecommandOrz(); - },[]) + // useEffect(()=>{ + // getRecommandOrz(); + // },[]) - function getRecommandOrz(params) { - const url = `/organizations/recommend.json`; - axios.get(url,{ - params:{ - group_size - } - }).then(result=>{ - if(result){ - setlist(result.data.organizations) - } - }).catch(error=>{}) - } + // function getRecommandOrz(params) { + // const url = `/organizations/recommend.json`; + // axios.get(url,{ + // params:{ + // group_size + // } + // }).then(result=>{ + // if(result){ + // setlist(result.data.organizations) + // } + // }).catch(error=>{}) + // } return( list && list.length > 0 ?
    @@ -60,7 +74,7 @@ function SubUnitBanner() { { i.map((j,k1)=>{ return( - + {j.name} ) }) } @@ -68,12 +82,6 @@ function SubUnitBanner() { ) }) } - {/*
    - - - - -
    */}
    diff --git a/src/forge/Main/sub/DetailBanner.jsx b/src/forge/Main/sub/DetailBanner.jsx index bb298aa17..5f16b9e26 100644 --- a/src/forge/Main/sub/DetailBanner.jsx +++ b/src/forge/Main/sub/DetailBanner.jsx @@ -67,16 +67,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
  • :"" } { - item.menu_name === "wiki" && -
  • - - - 维基(Wiki) - -
  • - } - { - item.menu_name === "devops" && platform ? + item.menu_name === "devops" ?
  • {/* */} @@ -99,13 +90,22 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa { item.menu_name === "versions" &&
  • - + 里程碑 {projectDetail && projectDetail.versions_count ? {numFormat(projectDetail.versions_count)} :""}
  • } + { + item.menu_name === "wiki" && +
  • + + + 维基(Wiki) + +
  • + } { item.menu_name === "activity" &&
  • @@ -116,7 +116,7 @@ function DetailBanner({ history,list , owner , projectsId , isManager , url , pa
  • } { - item.menu_name === "settings" && + item.menu_name === "settings" && platform &&
  • 0 ? "iconfont icon-cangkushezhiicon color-grey-3 mr5 font-14":"iconfont icon-cangkushezhiicon color-grey-6 font-14 mr5"}> diff --git a/src/forge/Main/sub/ReadmeCatelogue.jsx b/src/forge/Main/sub/ReadmeCatelogue.jsx index 754f3cc22..a913b152f 100644 --- a/src/forge/Main/sub/ReadmeCatelogue.jsx +++ b/src/forge/Main/sub/ReadmeCatelogue.jsx @@ -1,7 +1,6 @@ import React , { useState } from 'react'; import { Anchor , Input } from 'antd'; import './sub.scss'; -import { useEffect } from 'react'; const { Link } = Anchor; @@ -40,7 +39,7 @@ function ReadmeCatelogue({ menuList , hash }) { { menu.map((item,key)=>{ return( -
    +
    ) diff --git a/src/forge/Main/sub/sub.scss b/src/forge/Main/sub/sub.scss index 7716f0c50..f284edbb3 100644 --- a/src/forge/Main/sub/sub.scss +++ b/src/forge/Main/sub/sub.scss @@ -34,10 +34,17 @@ padding:15px; border-bottom: 1px solid #eee; } + .ant-anchor{ + padding-left: 0px!important; + .ant-anchor-ink::before{ + width: 0px; + } + } .ant-anchor-wrapper{ margin-left: 0px; - padding:5px 15px; + padding:5px 0px; max-height: 255px!important; + padding-left: 0px!important; .items{ border-radius: 4px; margin-bottom: 5px; diff --git a/src/forge/Main/tree/Index.jsx b/src/forge/Main/tree/Index.jsx index 714bf3533..d2dde0894 100644 --- a/src/forge/Main/tree/Index.jsx +++ b/src/forge/Main/tree/Index.jsx @@ -5,11 +5,21 @@ import { Link } from 'react-router-dom'; import { getImageUrl } from 'educoder'; import { Dropdown , Menu , Spin } from 'antd'; import './Index.scss'; +import { Base64 } from 'js-base64'; import Tree from '../img/tree.png'; import Axios from 'axios'; function turnbar(str){ + // const s = '!!@/::"“”<《》>||??%$¥'; + // for(var i=0;i -1){ + // return Base64.encode(str); + // }else{ + // continue; + // } + // } if(str && str.length>0 && str.indexOf("/")>-1){ return str.replaceAll('/','%2F'); } @@ -91,7 +101,7 @@ function Index(props) {
    { (isManager || isDeveloper) && (projectDetail && projectDetail.type!==2) && - + 合并请求 + + 合并请求 } 下载 diff --git a/src/forge/Order/Detail.js b/src/forge/Order/Detail.js index 9736086c8..b0c82acd5 100644 --- a/src/forge/Order/Detail.js +++ b/src/forge/Order/Detail.js @@ -7,6 +7,7 @@ import { Form, Popconfirm, Tag, Spin } from "antd"; import Attachments from "../Upload/attachment"; import RenderHtml from "../../components/render-html"; import Comments from "../comments/comments"; +import Claims from "../claims/claims" import "./order.css"; class Detail extends Component { @@ -310,6 +311,10 @@ class Detail extends Component { />
    +
    + +
    +

    负责人: diff --git a/src/forge/Order/order_form.js b/src/forge/Order/order_form.js index 2eb5e4299..8aa94cbc6 100644 --- a/src/forge/Order/order_form.js +++ b/src/forge/Order/order_form.js @@ -130,7 +130,7 @@ class order_form extends Component { let data ={ //指定指派成员,类型:缺陷,优先度:正常,issue状态:新增 tracker_id: "1", - assigned_to_id: window.location.host === "gitlink.org.cn" ? "86107":"36480", + assigned_to_id: window.location.host === "www.gitlink.org.cn" ? "86107":"36480", priority_id: "2", status_id: "1", description:"####问题描述\n\n\n####重现问题步骤\n\n\n####截图\n\n\n####建议解决办法\n", diff --git a/src/forge/SecuritySetting/notice/myNotice/Index.jsx b/src/forge/SecuritySetting/notice/myNotice/Index.jsx index 3d4957226..1a8ddf9db 100644 --- a/src/forge/SecuritySetting/notice/myNotice/Index.jsx +++ b/src/forge/SecuritySetting/notice/myNotice/Index.jsx @@ -1,12 +1,13 @@ import React, { useState, useEffect } from 'react'; -import { Link } from 'react-router-dom'; import axios from 'axios'; -import { Badge, Button, Checkbox, Menu, Pagination } from 'antd'; +import { Badge, Checkbox, Menu, Pagination } from 'antd'; import DelModal from '../../../Component/ModalFun'; import NoneData from '../../../Nodata.js'; import { noticeSourceType } from '../../../common/static'; import './Index.scss'; -import '../manager/Index.scss' +import '../manager/Index.scss'; +import { getImageUrl } from 'educoder'; + function MyNotice(props) { let { current_user, resetUserInfo, location, mygetHelmetapi, history}= props; @@ -227,7 +228,7 @@ function MyNotice(props) {

    - {item.sender && {window.open(`/${item.sender && item.sender.login}`);}}/>} + {item.sender && {window.open(`/${item.sender && item.sender.login}`);}}/>}
    {turnToMess(item)}}> {item.status === 1 ? : } {item.sender && } diff --git a/src/forge/Settings/Index.js b/src/forge/Settings/Index.js index fe546cdf4..a22f55abc 100644 --- a/src/forge/Settings/Index.js +++ b/src/forge/Settings/Index.js @@ -81,7 +81,7 @@ class Index extends Component {

    - Webhooks + 网络钩子

  • diff --git a/src/forge/Settings/Setting.js b/src/forge/Settings/Setting.js index e7fc4d96d..68dc4d0f8 100644 --- a/src/forge/Settings/Setting.js +++ b/src/forge/Settings/Setting.js @@ -14,10 +14,10 @@ const menu = [ {name:"代码库",index:"code"}, {name:"易修 (Issue)",index:"issues"}, {name:"合并请求 (PR)",index:"pulls"}, - {name:"维基 (Wiki)",index:"wiki"}, {name:"引擎 (Engine)",index:"devops"}, // {name:"资源库",index:"resources"}, {name:"里程碑",index:"versions"}, + {name:"维基 (Wiki)",index:"wiki"}, {name:"动态",index:"activity"}, ] class Setting extends Component { diff --git a/src/forge/Settings/Webhooks/Index.jsx b/src/forge/Settings/Webhooks/Index.jsx index 57df13b47..3af71ee1e 100644 --- a/src/forge/Settings/Webhooks/Index.jsx +++ b/src/forge/Settings/Webhooks/Index.jsx @@ -77,7 +77,7 @@ function Index(props) { /> - Webhooks + Webhooks(网络钩子) diff --git a/src/forge/claims/claim.scss b/src/forge/claims/claim.scss new file mode 100644 index 000000000..092fa19bd --- /dev/null +++ b/src/forge/claims/claim.scss @@ -0,0 +1,73 @@ +.infoCount{ + display: inline-block; + width: 24px; + text-align: center; + height: 24px; + line-height: 24px; + background-color:rgba(153, 153, 153, 0.13);; + color:#666; + border-radius: 12px; + margin-left: 6px; + font-size: 12px; + } + + .menuPanels{ + width: 295px; + .leftline{ + position: relative; + color: #666; + height: 16px; + margin-left: 14px; + font-size: 12px; + &::before{ + position: absolute; + left: -7px; + top:3px; + height: 12px; + width: 1px; + background-color: #999; + content: ""; + } + } + } + + .downMenu{ + width: 329px; + background-color: #fff; + box-shadow: 0px 1px 8px 1px rgba(212, 212, 212, 0.5); + padding-bottom: 14px; + .ant-menu-item{ + height: 50px; + line-height: 50px; + } + } + + .claimNote_input{ + // up, right, botton, left + margin: 5px 10px 5px 10px; + padding-top: 10px; + padding-bottom: 10px; + } + + .claimNote{ + // up, right, botton, left + margin: 5px 14px 0px 14px; + padding-bottom: 5px; + } + .attrPerson{ + padding-top: 12px; + display: flex; + flex-wrap: wrap; + padding-bottom: 2px; + a{ + margin: 0px 17px 10px 0px; + img{ + border-radius: 50%; + width: 40px; + height: 40px; + } + &:nth-child(5n){ + margin-right: 0px; + } + } + } \ No newline at end of file diff --git a/src/forge/claims/claims.js b/src/forge/claims/claims.js new file mode 100644 index 000000000..329bddb6f --- /dev/null +++ b/src/forge/claims/claims.js @@ -0,0 +1,277 @@ +import React, { Component } from "react"; +import axios from "axios"; +import { AlignCenter , FlexAJ } from '../Component/layout'; +import { Popover, List, Button, Dropdown, Input} from "antd"; +import { Link } from "react-router-dom"; +import { getImageUrl } from "educoder"; +import "./claim.scss" +const { TextArea } = Input; + +class claims extends React.Component { + constructor(props) { + super(props); + this.state = { + claimerdata: new Array(), + currentUserClaimed:0, + issue_id:this.props.issue_id, + claimNoteBody:'', + claimNoteBodyChanged:false, + claimNotePop:false + }; + + }; + + getClaimers = ()=>{ + const {issue_id} = this.state; + axios.get(`/issues/${issue_id}/claims.json`) + .then((result) => { + if(result){ + console.log(result.data), + this.setState({ + claimerdata: result.data.claimers, + currentUserClaimed: result.data.currentUserclaimed, + }); + } + }).catch(function (error) { + console.log(error); + }); + }; + + delClaim = () => { + if (this.props.checkIfLogin() === false) { + this.props.showLoginDialog(); + return; + } else { + const {issue_id} = this.state; + axios({ + method: 'delete', + url: `/issues/${issue_id}/claims.json` + }).then(result => { + this.setState({ + claimerdata: result.data.claimers, + currentUserClaimed: result.data.currentUserclaimed, + claimNotePop:false, + claimNoteBody:'', + }); + }) + .catch(error => { + console.log(error); + }); + } + }; + + changeClaimNote = (e)=>{ + this.setState({ + claimNoteBody: e.target.value, + claimNoteBodyChanged: true, + }); + }; + + yesClaim = ()=>{ + const {issue_id,claimNoteBody} = this.state; + + axios.post(`/issues/${issue_id}/claims.json`, { + claim_note: claimNoteBody + }) + .then(result => { + this.setState({ + claimerdata: result.data.claimers, + currentUserClaimed: result.data.currentUserclaimed, + claimNotePop:false, + }); + }) + .catch(error => { + console.log(error); + }); + }; + + addClaim = ()=> { + if (this.props.checkIfLogin() === false) { + this.props.showLoginDialog(); + return; + }else{ + this.setState({ + claimNotePop: true, + }); + } + + }; + + updateClaim = (claimId,key)=>{ + const {issue_id,claimNoteBody,claimNoteBodyChanged} = this.state; + if(claimNoteBodyChanged){ + axios.put(`/issues/${issue_id}/claims.json`, { + claim_note: claimNoteBody, + claim_id: claimId + }) + .then(result => { + this.setState({ + claimerdata: result.data.claimers, + currentUserClaimed: result.data.currentUserclaimed, + }); + }) + .catch(error => { + console.log(error); + }); + } + this.setVisibleFunc(false,key) + }; + + + + cancleClaim = ()=>{ + this.setState({ + claimNotePop: false, + }) + }; + + componentDidMount = () => { + this.getClaimers(); + }; + + + setVisibleFunc = (flag,index) => { + const {claimerdata} = this.state + var lx = claimerdata.concat(); + lx.map(i=>i.visible =false); + if(flag){ + lx[index].visible = flag; + } + lx.splice(); + this.setState({ + claimerdata:lx + }) + } + + render() { + const { + claimerdata, + currentUserClaimed, + issue_id + } = this.state; + + const rednerlist = (item)=>{ + return ( +
    + + + + + {item && item.user_name} + + 声明于 {item.created_at} +
    + ); + }; + + const renderClaim = ()=>{ + return( +
    + 声明留言:
    +