From 9380c0172c5b1a30a57c38770b9bd8d6bfcd6c33 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Tue, 2 Feb 2021 18:26:55 +0800 Subject: [PATCH] meg --- src/forge/Nodata.js | 4 +- src/forge/Team/Group/GroupDetailMember.jsx | 80 ++++------------- src/forge/Team/Group/GroupDetailProject.jsx | 64 ++++--------- src/forge/Team/Group/GroupDetails.jsx | 77 ++++++++++++++-- src/forge/Team/Group/GroupForm.jsx | 10 +-- src/forge/Team/Group/GroupNew.jsx | 4 +- src/forge/Team/Index.jsx | 23 +++-- src/forge/Team/Index.scss | 2 + src/forge/Team/RightBox.jsx | 50 +++++------ src/forge/Team/Setting/TeamSettingGroup.jsx | 2 +- src/forge/Team/Sub/Detail.jsx | 36 +++++++- src/forge/Team/Sub/SubDetail.jsx | 28 +----- src/forge/Team/TeamGroup.jsx | 99 ++++++++++++++++----- src/forge/css/index.scss | 12 ++- 14 files changed, 281 insertions(+), 210 deletions(-) diff --git a/src/forge/Nodata.js b/src/forge/Nodata.js index 54f34c41..3147e560 100644 --- a/src/forge/Nodata.js +++ b/src/forge/Nodata.js @@ -4,9 +4,9 @@ import nodata from './Images/nodata.png'; class Nodata extends Component{ render(){ - const { _html } = this.props; + const { _html , small } = this.props; return( -
+
{_html}
diff --git a/src/forge/Team/Group/GroupDetailMember.jsx b/src/forge/Team/Group/GroupDetailMember.jsx index 22be1e61..e926753a 100644 --- a/src/forge/Team/Group/GroupDetailMember.jsx +++ b/src/forge/Team/Group/GroupDetailMember.jsx @@ -1,69 +1,25 @@ -import React, { useState, useEffect } from 'react'; +import React from 'react'; import Cards from '../../Component/MemberCards'; -import { getImageUrl } from 'educoder'; -import axios from 'axios'; -import { Spin, Empty,Pagination } from 'antd'; -export default ((props) => { - const [page, setPage] = useState(1); - const [limit, setLimit] = useState(15); - const [total, setTotal] = useState(0); - const [data, setMembers] = useState(undefined); - const [isSpin, setIsSpin] = useState(false); - const { OIdentifier, groupId } = props.match.params; - const { current_user } = props; - - useEffect(() => { - if(groupId && OIdentifier){ - getMember(); - } - }, [OIdentifier,groupId,page]) - - function getMember() { - setIsSpin(true) - const url = `/organizations/${OIdentifier}/teams/${groupId}/team_users.json`; - axios.get(url, { - params: { - page, - limit - }, - }) - .then((result) => { - if (result && result.data) { - setMembers(result.data.team_users) - setTotal(result.data.total_count) - } - }).catch((error) => { }); - setIsSpin(false) - }; +import Nodata from '../../Nodata'; +export default (({ data , current_user }) => { return ( - - { data && data.length > 0 ? -
- { - data.map((item, key) => { - return ( - - ) - }) - } -
:"" - } + data && data.length > 0 ? +
{ - total > limit ? -
- -
- : "" + data.map((item, key) => { + return ( + + ) + }) } - - +
: ) }) \ No newline at end of file diff --git a/src/forge/Team/Group/GroupDetailProject.jsx b/src/forge/Team/Group/GroupDetailProject.jsx index c62062c9..f8c3d2db 100644 --- a/src/forge/Team/Group/GroupDetailProject.jsx +++ b/src/forge/Team/Group/GroupDetailProject.jsx @@ -1,11 +1,12 @@ -import React, { useState, useEffect } from 'react'; -import axios from 'axios'; -import { Spin, Empty, Pagination } from 'antd'; +import React from 'react'; import styled from 'styled-components'; import { Link } from 'react-router-dom'; import { getImageUrl } from 'educoder'; +import Nodata from '../../Nodata'; + const Box = styled.div`{ padding:0px 38px; + min-height:400px; }` const Div = styled.div`{ display:flex; @@ -22,51 +23,20 @@ const Imgs = styled.img`{ margin-right:12px; border-radius:50%; }` -const limit = 15; -export default ((props) => { - const [isSpin, setIsSpin] = useState(false); - const [projects, setProjects] = useState(undefined); - const [page, setPage] = useState(1); - const [total, setTotal] = useState(0); - const { OIdentifier, groupId } = props.match.params; - - useEffect(() => { - get_project() - }, [page]) - - function get_project() { - setIsSpin(true) - const url = `/organizations/${OIdentifier}/teams/${groupId}/team_projects.json`; - axios.get(url, { - params: { - page, - limit - }, - }).then((result) => { - if (result && result.data && result.data.team_projects.length > 0) { - setProjects(result.data.team_projects) - setTotal(result.data.total_count) - } - }).catch((error) => { }); - setIsSpin(false) - } - - +export default (({projects}) => { return ( + projects && projects.length > 0 ? - - { - projects && projects.length > 0 ? projects.map((item, key) => { - return ( -
- - {item.project.name} -
- ) - }): - } -
- -
+ { + projects.map((item, key) => { + return ( +
+ + {item.project.name} +
+ ) + }) + } + : ) }) \ No newline at end of file diff --git a/src/forge/Team/Group/GroupDetails.jsx b/src/forge/Team/Group/GroupDetails.jsx index c9709b6b..b50ebecc 100644 --- a/src/forge/Team/Group/GroupDetails.jsx +++ b/src/forge/Team/Group/GroupDetails.jsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { Button, Spin, Popconfirm, Empty } from 'antd'; +import { Button , Popconfirm, Empty , Pagination } from 'antd'; import styled from 'styled-components'; import { Box, Short, Long, Gap, WhiteBack, AlignCenterBetween } from '../../Component/layout'; import Tabs from '../../Component/Tabs'; @@ -15,11 +15,72 @@ const Leave = styled.a`{ padding:0px 14px; height:30px; line-height:30px; -}` +}`; +const limit = 15; export default ((props) => { const [nav, setNav] = useState('0'); + const [ page , setPage ] = useState(1); + const [ total , setTotal ] = useState(0); + const [ projects , setProjects ] = useState(undefined); + const [ members , setMembers ] = useState(undefined); + const [ group , setGroup ] = useState(undefined); const { OIdentifier, groupId } = props.match.params; - const { current_user , group } = props; + const { current_user } = props; + + useEffect(()=>{ + if(groupId){ + getInit(); + } + },[groupId]); + + function getInit(){ + const url = `/organizations/${OIdentifier}/teams/${groupId}.json`; + axios.get(url).then(result=>{ + if(result && result.data){ + setGroup(result.data); + } + }).catch(error=>{}) + } + + useEffect(()=>{ + if(nav === "0"){ + getMember(OIdentifier, groupId,page); + }else{ + get_project(OIdentifier, groupId,page); + } + },[nav,page]) + + // 获取团队成员 + function getMember( OIdentifier, groupId, page ) { + const url = `/organizations/${OIdentifier}/teams/${groupId}/team_users.json`; + axios.get(url, { + params: { + page, + limit + }, + }) + .then((result) => { + if (result && result.data) { + setMembers(result.data.team_users); + setTotal(result.data.total_count); + } + }).catch((error) => { }); + }; + + // 获取团队项目 + function get_project(OIdentifier,groupId,page) { + const url = `/organizations/${OIdentifier}/teams/${groupId}/team_projects.json`; + axios.get(url, { + params: { + page,limit + }, + }).then((result) => { + if (result && result.data && result.data.team_projects.length > 0) { + setProjects(result.data.team_projects); + setTotal(result.data.total_count); + } + }).catch((error) => { }); + } // 移除成员 function removeUser(username) { @@ -41,7 +102,7 @@ export default ((props) => {
{group.name} - {group.is_member ? + {group.is_member && !group.is_admin ? removeUser(current_user.login)} @@ -69,9 +130,15 @@ export default ((props) => { { - nav === "0" ? : + nav === "0" ? : } + { + total > limit && +
+ setPage(page)}/> +
+ }
diff --git a/src/forge/Team/Group/GroupForm.jsx b/src/forge/Team/Group/GroupForm.jsx index 15c3a46d..12a08c94 100644 --- a/src/forge/Team/Group/GroupForm.jsx +++ b/src/forge/Team/Group/GroupForm.jsx @@ -18,7 +18,7 @@ const addStyle = { } export default Form.create()( - forwardRef(({ form,props, match, showNotification, history, GroupDetail }) => { + forwardRef(({ form , match, showNotification, history, GroupDetail }) => { const [isSpin, setIsSpin] = useState(false); const [check_box, setGroupDetail] = useState(false); @@ -72,7 +72,7 @@ export default Form.create()( }).then(result => { if (result && result.data) { showNotification("基本设置更新成功!"); - history.push(`/organizations/${OIdentifier}/teams/${groupId}`); + history.push(`/organize/${OIdentifier}/group/${groupId}`); } }).catch(error => { }) } else { @@ -82,7 +82,7 @@ export default Form.create()( }).then(result => { if (result && result.data) { showNotification("团队创建成功!"); - history.push(`/organizations/${OIdentifier}/teams/${result.data.id}`); + history.push(`/organize/${OIdentifier}/group/${result.data.id}`); } }).catch(error => { }) } @@ -130,9 +130,9 @@ export default Form.create()( function cancelEdit(){ if(groupId){ - history.push(`/organizations/${OIdentifier}/teams/${groupId}`); + history.push(`/organize/${OIdentifier}/group/${groupId}`); }else{ - history.push(`/organizations/${OIdentifier}/teams`); + history.push(`/organize/${OIdentifier}`); } } return ( diff --git a/src/forge/Team/Group/GroupNew.jsx b/src/forge/Team/Group/GroupNew.jsx index 3056d106..ad6ff2a1 100644 --- a/src/forge/Team/Group/GroupNew.jsx +++ b/src/forge/Team/Group/GroupNew.jsx @@ -3,7 +3,9 @@ import GroupFrom from './GroupForm' function GropNew(props){ return( - +
+ +
) } export default GropNew; \ No newline at end of file diff --git a/src/forge/Team/Index.jsx b/src/forge/Team/Index.jsx index 727c472a..fd4afedf 100644 --- a/src/forge/Team/Index.jsx +++ b/src/forge/Team/Index.jsx @@ -7,11 +7,13 @@ import { withRouter } from "react-router"; import { SnackbarHOC } from "educoder"; import { CNotificationHOC } from "../../modules/courses/common/CNotificationHOC"; import { TPMIndexHOC } from "../../modules/tpm/TPMIndexHOC"; - - import '../css/index.scss'; -import Detail from './Sub/Detail'; +import './Index.scss'; +const GroupNew = Loadable({ + loader: () => import("./Group/GroupNew"), + loading: Loading, +}); const New = Loadable({ loader: () => import("./New"), loading: Loading, @@ -20,7 +22,7 @@ const DetailIndex = Loadable({ loader: () => import("./Sub/Detail"), loading: Loading, }); -const SubDetail = Loadable({ +const SubDetailIndex = Loadable({ loader: () => import("./Sub/SubDetail"), loading: Loading, }); @@ -29,11 +31,18 @@ export default withRouter(CNotificationHOC()(SnackbarHOC()(TPMIndexHOC( return (
- {/* 组织团队-子级(不包含组织团队列表) */} + {/* 组织团队-设置 */} { - return + return + }} + > + {/* 组织团队-新建 */} + { + return }} > {/* 组织团队-子级(包含组织团队列表) */} diff --git a/src/forge/Team/Index.scss b/src/forge/Team/Index.scss index 3f6be659..21a406b1 100644 --- a/src/forge/Team/Index.scss +++ b/src/forge/Team/Index.scss @@ -66,6 +66,7 @@ } .team{ padding:0px 32px; + min-height: 450px; .team_project{ padding:22px 0px; border-bottom: 1px solid #eee; @@ -202,6 +203,7 @@ } .g-body{ padding:15px 25px; + min-height: 84px; } } &>div:nth-child(2n){ diff --git a/src/forge/Team/RightBox.jsx b/src/forge/Team/RightBox.jsx index 12445136..311de4a9 100644 --- a/src/forge/Team/RightBox.jsx +++ b/src/forge/Team/RightBox.jsx @@ -5,6 +5,7 @@ import Box from './Box'; import axios from 'axios'; import { getImageUrl } from 'educoder'; import { Link } from 'react-router-dom'; +import Nodata from '../Nodata'; const Span = styled.span`{ color:#888; @@ -83,32 +84,31 @@ function RightBox({ OIdentifier , history }) { :"" } - { - groupData && groupData.teams && groupData.teams.length>0? - history.push(`/organize/${OIdentifier}/group/new`)}>新建团队} - url={`/organize/${OIdentifier}/group`} - > - { - groupData.teams.map((item,key)=>{ - return( -
-
- {item.name} - - {item.num_users}名成员 - {item.num_projects}个仓库 - -
+ history.push(`/organize/${OIdentifier}/group/new`)}>新建团队} + url={`/organize/${OIdentifier}/group`} + > + { + groupData && groupData.teams && groupData.teams.length>0? + + {groupData.teams.map((item,key)=>{ + return( +
+
+ {item.name} + + {item.num_users}名成员 + {item.num_projects}个仓库 +
- ) - }) - } - - :"" - } +
+ ) + })} +
: + } +
) } diff --git a/src/forge/Team/Setting/TeamSettingGroup.jsx b/src/forge/Team/Setting/TeamSettingGroup.jsx index 4fd31a50..cd5ea338 100644 --- a/src/forge/Team/Setting/TeamSettingGroup.jsx +++ b/src/forge/Team/Setting/TeamSettingGroup.jsx @@ -83,7 +83,7 @@ function TeamSettingGroup({organizeDetail,history}){

{item.name} - { item.is_member && !item.is_admin && + { item.is_member && removeMember(item.id)}>离开团队 } { item.is_admin && toGroupSetting(item.id)}>团队设置 } diff --git a/src/forge/Team/Sub/Detail.jsx b/src/forge/Team/Sub/Detail.jsx index cae64e76..920df767 100644 --- a/src/forge/Team/Sub/Detail.jsx +++ b/src/forge/Team/Sub/Detail.jsx @@ -7,6 +7,10 @@ import Cards from '../../Component/Cards'; import axios from 'axios'; import '../Index.scss'; +const GroupDetails = Loadable({ + loader: () => import("../Group/GroupDetails"), + loading: Loading, +}); const Group = Loadable({ loader: () => import("../TeamGroup"), loading: Loading, @@ -29,15 +33,21 @@ function Detail(props){ const [ detail , setDetail ] = useState(undefined); const [ flag , setFlag ] = useState(true); + const [ buttonflag , setButtonflagFlag ] = useState(false); // 设置页面:顶部不需要设置按钮了 useEffect(()=>{ if(pathname){ - if(pathname.indexOf("/setting")>-1 && pathname.indexOf("/organize")>-1){ + if(pathname.indexOf(`/organize/${OIdentifier}/setting`)>-1){ setFlag(false); }else{ setFlag(true); } + if(pathname.indexOf(`/organize/${OIdentifier}/group`)>-1 || pathname.indexOf(`/organize/${OIdentifier}/member`)>-1){ + setButtonflagFlag(true); + }else{ + setButtonflagFlag(false); + } } },[pathname]) @@ -71,11 +81,31 @@ function Detail(props){ title={detail.name} desc={detail.description} img={detail.avatar_url} - rightBtn={flag && 设置} + rightBtn={ + + {flag && !buttonflag && + 设置 + + } + {buttonflag && + + 组织成员{detail.num_users && {detail.num_users}} + 组织团队{detail.num_teams &&{detail.num_teams}} + + } + + } /> } + {/* 组织团队-详情 */} + { + return + }} + > {/* 组织成员 */} { - return + return }} > import("../Group/GroupNew"), - loading: Loading, -}); -const GroupDetails = Loadable({ - loader: () => import("../Group/GroupDetails"), - loading: Loading, -}); const GroupSetting = Loadable({ loader: () => import("../Group/GroupDetailSetting"), loading: Loading, @@ -24,11 +16,9 @@ export default ((props)=>{ const OIdentifier = props.match.params.OIdentifier; const groupId = props.match.params.groupId; const pathname = props.location.pathname; - const [ detail , setDetail ] = useState(undefined); const [ flag , setFlag ] = useState(false); - // 设置页面:顶部不需要设置按钮了 useEffect(()=>{ if(pathname){ @@ -59,8 +49,8 @@ export default ((props)=>{

{OIdentifier} - - {detail && detail.name} + + {detail ? detail.name : "新建团队"}
{ detail && @@ -84,20 +74,6 @@ export default ((props)=>{ return }} > - {/* 组织团队-新建 */} - { - return - }} - > - {/* 组织团队-详情 */} - { - return - }} - >
) diff --git a/src/forge/Team/TeamGroup.jsx b/src/forge/Team/TeamGroup.jsx index 8815fe57..de2b3a0a 100644 --- a/src/forge/Team/TeamGroup.jsx +++ b/src/forge/Team/TeamGroup.jsx @@ -1,11 +1,12 @@ -import React from 'react'; +import React , { useEffect , useState } from 'react'; import { Banner } from '../Component/layout'; import styled from 'styled-components'; +import axios from 'axios'; +import { getImageUrl } from 'educoder'; +import Nodata from '../Nodata'; +import { Pagination } from 'antd'; +import { Link } from 'react-router-dom'; -const SpanName = styled.span`{ - font-size:16px; - color:#333; -}` const SpanFoot = styled.span`{ margin-right:5px; color:#333 @@ -24,26 +25,78 @@ const ImgContent = styled.img`{ border-radius:50%; margin:5px 20px 5px 0px; }` -export default (()=>{ +const limit = 14; +function TeamGroup({organizeDetail,current_user}){ + const [ page , setPage ] = useState(1); + const [ total , setTotal ] = useState(0); + const [ list , setList ] = useState(undefined); + + useEffect(()=>{ + if(organizeDetail){ + getData(); + } + },[organizeDetail]); + + function getData(){ + const url = `/organizations/${organizeDetail.id}/teams.json`; + axios.get(url,{ + params:{ page ,limit} + }).then(result=>{ + if(result && result.data){ + setList(result.data.teams); + setTotal(result.data.total_count); + } + }) + } + // 离开团队 + function outTeam(id){ + const url = `/organizations/${organizeDetail.id}/teams/${id}/team_users/quit.json`; + axios.delete(url).then(result =>{ + if(result && result.data){ + getData(); + } + }).catch(error=>{}) + } return( -
+
组织团队 -
-
-

- oweners - 离开团队 -

-
- - -
-

- 2 名成员 - 1 个项目 -

+ { + list && list.length > 0 ? +
+ { + list.map((item,key)=>{ + return( +
+

+ {item.name} + {item.is_member && outTeam(item.id)}>离开团队} +

+
+ { + item.users && item.users.map((i,k)=>{ + return( + + ) + }) + } +
+

+ {item.num_users} 名成员 + {item.num_projects} 个项目 +

+
+ ) + }) + } +
: + } + { + total > limit && +
+ setPage(page)}/>
-
+ }
) -}) \ No newline at end of file +} +export default TeamGroup; \ No newline at end of file diff --git a/src/forge/css/index.scss b/src/forge/css/index.scss index 85df3324..e0a11ed7 100644 --- a/src/forge/css/index.scss +++ b/src/forge/css/index.scss @@ -89,9 +89,15 @@ ul,ol,dl{ display: flex; justify-content: center; align-items: center; -} -.none_panels img{ - margin-bottom: 15px; + &.small{ + height: 120px; + img{ + width:50px; + } + } + img{ + margin-bottom: 15px; + } } .none_p_title{ font-size: 16px;