-
{item.journals_count}
+
{item.journals_count}
{
user_admin_or_member ?
-
+
-
+
+
+
-
document.getElementById("hoverBox")} title={'您确定要删除当前易修吗?'} okText="是" cancelText="否" onConfirm={() => this.deletedetail(item.id)}>
+ this.deletedetail(item.id)}
+ >
diff --git a/src/forge/Order/Tags.js b/src/forge/Order/Tags.js
index 174891aa..eeff8db2 100644
--- a/src/forge/Order/Tags.js
+++ b/src/forge/Order/Tags.js
@@ -324,11 +324,11 @@ class Tags extends Component {
data && data.issue_tags && data.issue_tags.length > 0 ?
-
共{data && data.issue_tags_count}个标签
+
共{data && data.issue_tags_count}个标记
diff --git a/src/forge/Order/UpdateDetail.js b/src/forge/Order/UpdateDetail.js
index 9cbb3cd6..0bf4f0f1 100644
--- a/src/forge/Order/UpdateDetail.js
+++ b/src/forge/Order/UpdateDetail.js
@@ -1,11 +1,11 @@
-import React, { Component } from "react";
+import React from "react";
import OrderForm from './order_form'
-class UpdateDetail extends Component {
- render() {
- return (
-
- )
- }
+
+function CopyDetail(props){
+ const operateName = props.match.params.operateName;
+ return(
+
+ )
}
-export default UpdateDetail;
+export default CopyDetail;
diff --git a/src/forge/Order/UpdateMilepost.js b/src/forge/Order/UpdateMilepost.js
index 88a73033..c4f38657 100644
--- a/src/forge/Order/UpdateMilepost.js
+++ b/src/forge/Order/UpdateMilepost.js
@@ -79,7 +79,7 @@ class UpdateMilepost extends Component {
}).then(result => {
if (result) {
this.setState({ isSpin: false })
- this.props.history.push(`/projects/${owner}/${projectsId}/milestones`);
+ this.props.history.push(`/${owner}/${projectsId}/milestones`);
}
diff --git a/src/forge/Order/newMilepost.js b/src/forge/Order/newMilepost.js
index b9513212..b7d1102d 100644
--- a/src/forge/Order/newMilepost.js
+++ b/src/forge/Order/newMilepost.js
@@ -63,7 +63,7 @@ class NewMilepost extends Component {
}).then(result => {
if (result) {
this.setState({ isSpin: false })
- this.props.history.push(`/projects/${owner}/${projectsId}/milestones`);
+ this.props.history.push(`/${owner}/${projectsId}/milestones`);
const { getDetail } = this.props;
getDetail && getDetail();
}
diff --git a/src/forge/Order/order.css b/src/forge/Order/order.css
index 6a0f029e..0abd116f 100644
--- a/src/forge/Order/order.css
+++ b/src/forge/Order/order.css
@@ -20,6 +20,9 @@
.overlayBox{
width: 230px;
}
+.hideOverlay{
+ display: none;
+}
.topmilepost {
box-sizing: border-box;
display: flex;
diff --git a/src/forge/Order/order.js b/src/forge/Order/order.js
index 1202f41f..7275c759 100644
--- a/src/forge/Order/order.js
+++ b/src/forge/Order/order.js
@@ -1,12 +1,12 @@
import React, { Component } from "react";
import { Input, Dropdown, Menu, Icon, Pagination, Spin, DatePicker, Checkbox } from "antd";
-import { Link } from 'react-router-dom';
import "./order.css";
import './index.scss';
import moment from 'moment';
import NoneData from "../Nodata";
import OrderItem from "./OrderItem";
+import CheckProfile from '../Component/ProfileModal/Profile';
import axios from "axios";
@@ -39,7 +39,7 @@ class order extends Component {
search_count: undefined,
issue_type: undefined,
status_type: "1", // 默认显示开启中的
- issue_tag_ids: "标签",
+ issue_tag_ids: "标记",
tracker_ids: "类型",
author_ids: "发布人",
assigned_to_ids: "负责人",
@@ -58,7 +58,7 @@ class order extends Component {
select_params: {
assigned_to_id: undefined, // 负责人
author_id: undefined, // 发布人
- issue_tag_id: undefined, // 标签
+ issue_tag_id: undefined, // 标记
tracker_id: undefined, //类型
done_ratio: undefined, // 完成度
status_id: undefined, // 优先级
@@ -257,7 +257,7 @@ class order extends Component {
author_id: undefined,
assigned_to_id: undefined,
status_type: type,
- issue_tag_ids: "标签",
+ issue_tag_ids: "标记",
tracker_ids: "类型",
author_ids: "发布人",
assigned_to_ids: "负责人",
@@ -351,9 +351,9 @@ class order extends Component {
if(data && data.user_admin_or_member){
const { projectsId , owner } = this.props.match.params;
return(
-
+
{window.open(`/${owner}/${projectsId}/issues/new`,'_blank')}}>
+ 创建易修
-
+
)
}
}
@@ -677,7 +677,7 @@ class order extends Component {
className="topWrapperSelect"
overlay={this.renderMenu(
issue_chosen && issue_chosen.issue_tag,
- "标签",
+ "标记",
"issue_tag_id"
)}
trigger={["click"]}
diff --git a/src/forge/Order/order_form.js b/src/forge/Order/order_form.js
index b6f065b2..0858ac52 100644
--- a/src/forge/Order/order_form.js
+++ b/src/forge/Order/order_form.js
@@ -153,7 +153,7 @@ class order_form extends Component {
values.issue_tag_ids = [values.issue_tag_ids];
}
const { description, start_date, due_date, issue_type } = this.state;
- if (form_type === "new") {
+ if (form_type !== "edit") {
const url = `/${owner}/${projectsId}/issues.json`;
axios.post(url, {
...values,
@@ -165,7 +165,7 @@ class order_form extends Component {
}).then((result) => {
if (result && result.data.id) {
this.props.showNotification("任务创建成功!");
- this.props.history.push(`/projects/${owner}/${projectsId}/issues/${result.data.id}/detail`);
+ this.props.history.push(`/${owner}/${projectsId}/issues/${result.data.id}`);
this.setState({
description: "",
isSpin: false,
@@ -178,7 +178,6 @@ class order_form extends Component {
this.setState({
isSpin: false,
});
- console.log(error);
});
} else {
const url = `/${owner}/${projectsId}/issues/${orderId}.json`;
@@ -191,7 +190,7 @@ class order_form extends Component {
...values,
}).then((result) => {
if (result) {
- this.props.history.push(`/projects/${owner}/${projectsId}/issues/${orderId}/detail`);
+ this.props.history.push(`/${owner}/${projectsId}/issues/${orderId}`);
this.props.showNotification("任务更新成功!");
const { getDetail } = this.props;
getDetail && getDetail();
@@ -371,7 +370,7 @@ class order_form extends Component {
type="default"
className="ml30"
onClick={()=>
- this.props.history.push(form_type === "new" ? `/projects/${owner}/${projectsId || orderId}/issues` : `/projects/${owner}/${projectsId}/issues/${orderId}/detail`)}
+ this.props.history.push(form_type === "new" ? `/${owner}/${projectsId || orderId}/issues` : `/${owner}/${projectsId}/issues/${orderId}`)}
>
取消
@@ -442,13 +441,13 @@ class order_form extends Component {
)}
-
+
{getFieldDecorator("issue_tag_ids", {rules: []})(
diff --git a/src/forge/SecuritySetting/Index.jsx b/src/forge/SecuritySetting/Index.jsx
index e314c66a..8419fd31 100644
--- a/src/forge/SecuritySetting/Index.jsx
+++ b/src/forge/SecuritySetting/Index.jsx
@@ -14,14 +14,34 @@ import { Link } from 'react-router-dom';
import './Index.scss';
+const MyNoticeIndex = Loadable({
+ loader: () => import("./notice/myNotice/Index"),
+ loading: Loading,
+});
+
+const NoticeManager = Loadable({
+ loader: () => import("./notice/manager/Index"),
+ loading: Loading,
+});
+
const SSHNew = Loadable({
loader: () => import("./sub/New"),
loading: Loading,
});
+const Profile = Loadable({
+ loader: () => import("../users/Material/Index"),
+ loading: Loading,
+});
const SSHIndex = Loadable({
loader: () => import("./sub/SSH"),
loading: Loading,
});
+
+const PrivateLetter = Loadable({
+ loader: () => import("./notice/privateLetter/Index"),
+ loading: Loading,
+});
+
function Index(props){
const { current_user } = props;
const { pathname } = props.location;
@@ -35,32 +55,64 @@ function Index(props){
{current_user && current_user.username}
+
+ - 个人信息
+ - -1 ?"active":""}>基本资料
+
+
+ - 消息通知
+ - -1 && pathname.indexOf("/settings/notice/config") == -1) || pathname.indexOf("/settings/notice/privateLetter")>-1 ?"active":""}>我的通知
+ {/* - -1 ?"active":""}>通知管理
*/}
+
- 安全设置
- - -1 ?"active":""}>SSH密钥
+ - -1 ?"active":""}>SSH密钥
+ (
+
+ )}
+ >
+ (
+
+ )}
+ >
(
)}
>
+ (
+
+ )}
+ >
(
)}
>
+ (
+
+ )}
+ >
-
)
}
diff --git a/src/forge/SecuritySetting/Index.scss b/src/forge/SecuritySetting/Index.scss
index 664ed7ab..ede91c86 100644
--- a/src/forge/SecuritySetting/Index.scss
+++ b/src/forge/SecuritySetting/Index.scss
@@ -8,40 +8,44 @@
width: 198px;
border: 1px solid rgba(153, 153, 153, 0.22);
border-radius: 4px;
- min-height: 400px;
+ // min-height: 400px;
margin-bottom: 30px;
.userDetail{
background: rgba(153, 153, 153, 0.05);
border-radius: 4px 4px 0px 0px;
padding:20px 25px;
- display: flex;
- align-items: center;
- justify-content: flex-start;
+ text-align: center;
+ height: 105px;
img{
height: 48px;
width: 48px;
border-radius: 50%;
- margin-right: 12px;
}
span{
font-size: 16px;
color: #333;
- max-width: 90px;
display: block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
+ font-weight: 500;
}
}
.securityUl{
- padding:20px 16px;
+ padding-left: 17px;
color: #333;
+ margin-bottom: 0px;
+ padding-bottom: 12px;
+ padding-top: 5px;
li{
+ font-size: 14px;
+ margin-top: 10px;
margin-bottom: 10px;
height: 27px;
line-height: 27px;
position: relative;
- cursor: pointer;
+ cursor: default;
+
a{
color: #666;
&:hover{
@@ -50,32 +54,57 @@
}
&.active a{
color: #333;
- }
- &:first-child{
- font-size: 16px;
+ .text-shodow-bold{
+ font-weight: 400;
+ text-shadow: 0.5px 0 #333;
+ }
}
&.active::before{
position: absolute;
- left: -16px;
- top:0px;
- height: 100%;
- width: 2px;
+ left: -18px;
+ top:6px;
+ height: 15px;
+ width: 3px;
+ border-radius: 2px;
content: "";
- background-color: #2A61FF;
+ background-color: #466AFF;
+ }
+
+ i{
+ font-size: 14px !important;
+ margin-right: 8px;
}
}
}
+ .ul-border-buttom{
+ border-bottom: 1px solid rgba(153, 153, 153, 0.22);
+ padding-bottom: 5px;
+ }
}
.sshHead{
display: flex;
align-items: center;
- padding:15px 20px;
+ padding:6px 0px;
+ margin-bottom: 15px;
justify-content: space-between;
border-bottom: 1px solid #EEEEEE;
- &>span{
+ &>.text-shadow07{
font-size: 18px;
+ font-weight: 400;
+ color: #333333;
+ text-shadow: 0.5px 0 #333;
+ }
+ &>.add-SSH-title{
+ font-size: 16px;
+ font-weight: 400;
+ color: #333333;
+ text-shadow: 0.5px 0 #333;
+ }
+ & .but25{
+ padding:0 12px;
}
}
+
.ant-list-item{
padding:20px;
border-bottom: 1px solid #eee!important;
@@ -107,7 +136,7 @@
.questionLink{
padding:15px 20px;
a{
- color: #4B7AFF;
+ color: #466AFF;
&:hover{
text-decoration: underline;
}
@@ -122,50 +151,6 @@
}
}
}
-.deleteBox{
- .ant-modal-header{
- background-color: rgba(223, 0, 2, 0.06);
- border-bottom: none;
- .ant-modal-title{
- text-align: left;
- font-size: 20px;
- }
- }
- .ant-modal-body{
- padding:30px 50px;
- p{
- font-size: 16px;
- line-height: 26px;
- color:#666
- }
- .desc{
- .descMain{
- align-items: center;
- justify-content: center;
- font-size: 20px;
- margin-bottom: 10px;
- i{
- font-size: 38px!important;
- color:#DF0002
- }
- }
- }
- }
- .ant-modal-footer{
- border-top: none;
- text-align: center;
- padding-bottom: 40px;
- button{
- width: 120px;
- margin:0px 20px;
- &.ant-btn-danger{
- background-color: #fff;
- color: #DF0002;
- border-color: #D0D0D0;
- }
- }
- }
-}
.descModal{
.ant-modal-title{
text-align: left;
@@ -189,4 +174,23 @@
flex:1;
}
}
+}
+.but25{
+ margin-bottom: 5px;
+ background-color: #466AFF;
+ color: #fff;
+ border-color: #466AFF;
+ &:hover{
+ opacity: 0.8;
+ background-color: #466AFF;
+ border-color: #466AFF;
+ }
+ &:active{
+ opacity: 1;
+ background-color: #466AFF;
+ border-color: #466AFF;
+ }
+}
+.blue-Purple{
+ color: #466AFF !important;
}
\ No newline at end of file
diff --git a/src/forge/SecuritySetting/img/miyao_middle_icon.png b/src/forge/SecuritySetting/img/miyao_middle_icon.png
index 03584cfe..f69cba0e 100644
Binary files a/src/forge/SecuritySetting/img/miyao_middle_icon.png and b/src/forge/SecuritySetting/img/miyao_middle_icon.png differ
diff --git a/src/forge/SecuritySetting/notice/api.js b/src/forge/SecuritySetting/notice/api.js
new file mode 100644
index 00000000..07fc1838
--- /dev/null
+++ b/src/forge/SecuritySetting/notice/api.js
@@ -0,0 +1,46 @@
+import fetch from './fetch';
+
+// 获取消息列表
+export function noticePages(params) {
+ return fetch({
+ url: '/api/notice/noticePages',
+ method: 'get',
+ params
+ });
+}
+
+// 获取单个notice
+export function getNotice(params) {
+ return fetch({
+ url: '/api/notice/getNotice',
+ method: 'get',
+ params
+ });
+}
+
+//新增notice
+export function addNotice(data) {
+ return fetch({
+ url: '/api/notice/createNotice',
+ method: 'post',
+ data: data
+ });
+}
+
+//更新notice
+export function updateNotice(data) {
+ return fetch({
+ url: '/api/notice/updateNotice',
+ method: 'PUT',
+ data: data
+ });
+}
+
+//删除notice
+export function deleteNotice(data) {
+ return fetch({
+ url: '/api/notice/deleteNotice',
+ method: 'DELETE',
+ data,
+ });
+}
diff --git a/src/forge/SecuritySetting/notice/fetch.js b/src/forge/SecuritySetting/notice/fetch.js
new file mode 100644
index 00000000..dba00b14
--- /dev/null
+++ b/src/forge/SecuritySetting/notice/fetch.js
@@ -0,0 +1,10 @@
+
+import javaFetch from '../../javaFetch';
+
+const developUrl = "https://test-search.trustie.net";
+const testUrl = "https://test-search.trustie.net";
+const productUrl = "https://wiki-api.trustie.net";
+
+const { service, actionUrl } = javaFetch(productUrl, testUrl, developUrl);
+export const httpUrl = actionUrl;
+export default service;
\ No newline at end of file
diff --git a/src/forge/SecuritySetting/notice/manager/Index.jsx b/src/forge/SecuritySetting/notice/manager/Index.jsx
new file mode 100644
index 00000000..ebe84bea
--- /dev/null
+++ b/src/forge/SecuritySetting/notice/manager/Index.jsx
@@ -0,0 +1,100 @@
+import { Button, Checkbox } from "antd";
+import React from "react";
+
+import './Index.scss';
+
+function NoticeManager(props){
+
+ return(
+
+
+ 通知管理
+
+
+
您可以通过通知管理来选择接受通知的方式
+
+ 我创建或负责的
+
+
+
+
易修截止日期到达最后一天
+
站内信
+
邮件
+
+
+
+
+
+
+ 我管理的仓库
+
+
+
+
+
+
+
+ 我关注的仓库
+
+
+
+
+
+
+
+
+ )
+}
+export default NoticeManager;
\ No newline at end of file
diff --git a/src/forge/SecuritySetting/notice/manager/Index.scss b/src/forge/SecuritySetting/notice/manager/Index.scss
new file mode 100644
index 00000000..87a77a75
--- /dev/null
+++ b/src/forge/SecuritySetting/notice/manager/Index.scss
@@ -0,0 +1,87 @@
+.notice-manager-tip{
+ font-size:16px;
+ font-weight:400;
+}
+.manager-cont-top{
+ font-size: 14px;
+ font-weight: 600;
+ height: 44px;
+ padding-left: 20px;
+ background: #FAFCFF;
+ border: 1px solid #89a4f7;
+ line-height: 44px;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+ margin-top: 25px;
+}
+
+.manager-cont{
+ padding: 8px 20px 6px;
+ display: flex;
+ align-items: center;
+ font-size: 14px;
+
+ .manager-cont-title{
+ width: 320px;
+ }
+}
+
+.notice01{
+ .ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner::after {
+ border-color: white;
+ }
+ .ant-checkbox-disabled .ant-checkbox-inner {
+ background-color: #999999 !important;
+ border-color: #999999 !important;
+ }
+
+ .ant-checkbox-checked .ant-checkbox-inner {
+ background-color: #466AFF;
+ border: #466AFF;
+ }
+
+ .ant-checkbox-checked::after{
+ border: 1px solid #466AFF;
+ }
+ .ant-checkbox-wrapper:hover .ant-checkbox-inner, .ant-checkbox:hover .ant-checkbox-inner, .ant-checkbox-input:focus + .ant-checkbox-inner,.ant-radio-checked .ant-radio-inner,.ant-radio-wrapper:hover .ant-radio, .ant-radio:hover .ant-radio-inner, .ant-radio-input:focus + .ant-radio-inner {
+ border-color: #466AFF;
+ }
+
+ .ant-checkbox + span,.manager-cont-title {
+ color: #000000;
+ }
+
+ .ant-radio-inner::after{
+ background-color:#466AFF;
+ }
+
+ .but25{
+ background-color: #466AFF;
+ color: #fff;
+ border-color: #466AFF;
+ &:hover{
+ opacity: 0.8;
+ background-color: #466AFF;
+ border-color: #466AFF;
+ }
+ &:active{
+ opacity: 1;
+ background-color: #466AFF;
+ border-color: #466AFF;
+ }
+ }
+
+ ::-webkit-scrollbar {
+ width: 5px; /*对垂直流动条有效*/
+ }
+ /*定义滑块颜色、内阴影及圆角*/
+ ::-webkit-scrollbar-thumb {
+ border-radius: 6px;
+ box-shadow: inset 0 0 6px #FFF;
+ background-color: #D4D4D4;
+ }
+ ::-webkit-scrollbar-track {
+ box-shadow: inset 0 0 6px #fff;
+ background-color: #FFF;
+ }
+}
\ No newline at end of file
diff --git a/src/forge/SecuritySetting/notice/myNotice/Index.jsx b/src/forge/SecuritySetting/notice/myNotice/Index.jsx
new file mode 100644
index 00000000..2de2b8c3
--- /dev/null
+++ b/src/forge/SecuritySetting/notice/myNotice/Index.jsx
@@ -0,0 +1,263 @@
+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 DelModal from '../../../Component/ModalFun';
+import NoneData from '../../../Nodata.js';
+import { noticeSourceType } from '../../../common/static';
+import './Index.scss';
+import '../manager/Index.scss'
+
+function MyNotice(props) {
+ let current_user = props.current_user;
+ let resetUserInfo = props.resetUserInfo;
+ //消息悬停框选择tab
+ let popover = props.location.query && props.location.query.noticeType;
+ let pageSize = 15;
+ const [noticeType, setNoticeType] = useState(popover==="atme"?"2":"0");//消息类别tab栏选择
+ const [selectedNum, setSelectedNum] = useState(0);//@我批量删除选择消息条数
+ const [isBatchDelete, setIsBatchDelete] = useState(false);//@我是否批量删除
+ const [batchDeleteCheckedAll, setBatchDeleteCheckAll] = useState(false);//@我批量删除--全选
+
+ const [noticeUnreadCount, setNoticeUnreadCount] = useState();//未读系统通知数量
+ // const [letterUnreadCount, setLetterUnreadCount] = useState(0);//未读私信数量
+ const [atUnreadCount, setAtUnreadCount] = useState();//未读@我数量
+ const [messageList, setMessageList] = useState([]);
+ const [messTotalCount, setMessTotalCount] = useState();//消息总数
+ const [currentPage, setCurrentPage] = useState(1);//当前页数
+ const [onlyUnread, setOnlyUnread] = useState();
+
+ useEffect(()=>{
+ popover==="atme" ? setNoticeType("2"):setNoticeType("0");
+ },[popover])
+
+ useEffect(()=>{
+ resetUserInfo();
+ },[noticeUnreadCount,atUnreadCount])
+
+ useEffect(() => {
+ getMessageList();
+ }, [noticeType, onlyUnread, currentPage, current_user])
+
+ function getMessageList() {
+ const params = {
+ type: noticeType === "0" ? "notification" : noticeType === "2" ? "atme" : "",
+ status: onlyUnread ? onlyUnread : "",
+ limit: pageSize,
+ page: currentPage,
+ };
+ axios.get(`/users/${current_user.login}/messages.json`, {
+ params: params,
+ }).then((response) => {
+ if(response && response.data){
+ setNoticeUnreadCount(response.data.unread_notification);
+ setAtUnreadCount(response.data.unread_atme);
+ setMessageList(response.data.messages);
+ setMessTotalCount(response.data.total_count);
+ }
+ });
+ }
+
+ function readNotice(id){
+ if(id){
+ const params = {
+ type: noticeType === "0" ? "notification" : noticeType === "2" ? "atme" : "",
+ ids:id,
+ };
+ axios.post(`/users/${current_user.login}/messages/read.json`,params).then((response)=>{
+ if(response.status === 200){
+ getMessageList();
+ //已读当前页码最后一条数据时跳转到前一页
+ let totlaPage = Math.ceil((messTotalCount-1)/pageSize);
+ setCurrentPage(currentPage>=totlaPage? totlaPage : currentPage);
+ }
+ });
+ }
+ }
+
+ function handleClick(e) {
+ setNoticeType(e.key);
+ setCurrentPage(1);
+ setOnlyUnread();
+ if (e.key != "2") {
+ setIsBatchDelete(false);
+ }
+ }
+
+ function onChange(e) {
+ var checkboxNum = 0;
+ let messageListNew=messageList.slice();
+ messageListNew.map((item)=>{
+ if(item.id===e.target.value){
+ item.checkedBatch = e.target.checked;
+ }
+ item.checkedBatch?checkboxNum++:"";
+ });
+ setMessageList(messageListNew);
+ setSelectedNum(checkboxNum);
+ setBatchDeleteCheckAll(checkboxNum === messageList.length);
+ }
+
+
+ function onChangeAll(e) {
+ setBatchDeleteCheckAll(e.target.checked);
+ setSelectedNum(e.target.checked?messageList.length:0);
+ let messageListNew=messageList.slice();
+ messageListNew.map((item)=>{
+ item.checkedBatch = e.target.checked;
+ });
+ setMessageList(messageListNew);
+ }
+
+ function deleteNotice(id) {
+ const ids = [];
+ if(!id){
+ messageList.map(item=>{
+ item.checkedBatch && ids.push(item.id);
+ });
+ }
+ DelModal({
+ title: noticeType === "1" ? '删除私信用户' : id ? '删除消息' : '批量删除',
+ contentTitle: noticeType === "1" ? '您确定要删除与 xxx 的聊天吗?' : id ? '您确定要删除这条@我消息吗?' : '您确定要删除选中的' + selectedNum + '条消息吗?',
+ content: noticeType === "1" ? '此操作将删除与xxx的聊天框和xxx的所有聊天记录,请进行确认以防数据的丢失' : id ? '此操作将删除这条消息,请进行确认以防数据的丢失' : '此操作将删除选中的' + selectedNum + '条消息,请进行确认以防数据的丢失',
+ onOk: () => {
+ const params = {
+ type: noticeType === "0" ? "notification" : noticeType === "2" ? "atme" : "",
+ ids:id?id:ids,
+ };
+ axios.delete(`/users/${current_user.login}/messages.json`,{
+ data:params,
+ }).then((response)=>{
+ if(response.status === 200){
+ getMessageList();
+ //删除当前页码最后一条数据时跳转到前一页
+ let totlaPage = Math.ceil((messTotalCount-1)/pageSize);
+ setCurrentPage(currentPage>=totlaPage? totlaPage : currentPage);
+ setSelectedNum(0);
+ setBatchDeleteCheckAll(false);
+ }
+ });
+ }
+ });
+ }
+
+ function cancelBatchDelete(){
+ setIsBatchDelete(false);
+ setSelectedNum(0);
+ //取消选中效果
+ let messageListNew=messageList.slice();
+ messageListNew.map((item)=>{
+ item.checkedBatch = false;
+ });
+ setMessageList(messageListNew);
+ setBatchDeleteCheckAll(false);
+ }
+
+ //跳转到消息详情页面
+ function turnToMess(item){
+ if(item.notification_url){
+ window.open(`${item.notification_url}`);
+ readNotice([item.id]);
+ }
+ }
+
+ return (
+
+
+
+ {(noticeType==="0" && noticeUnreadCount>0) || (noticeType==="2"&& atUnreadCount>0) ? :""}
+
+
+
+
+ {onlyUnread===1 || messageList && messageList.length>0 ? e.target.checked ? setOnlyUnread(1) : setOnlyUnread()}>仅看未读{noticeType === "1" ? `私信(12)` : noticeType === "0" ? `消息(${noticeUnreadCount})` : `消息(${atUnreadCount})`}:""}
+
+ {noticeType === "2" && messageList && messageList.length > 0 ?
: ""}
+
+
+ {messageList && messageList.length===0 ?
:""}
+
+ {messageList && messageList.length>0 &&
+
+ 全选
+ 已选择 {selectedNum} 项
+
+
+
+
+
+
}
+
+ {messageList && messageList.map(item => {
+ // 系统消息
+ if (noticeType === "0") {
+ // 消息类别
+ return (
+
+
+ {item.status === 1 ? : }
+
+ {turnToMess(item)}} dangerouslySetInnerHTML={{__html: item.content}}>
+
+
+ {item.time_ago}
+ {item.status === 1 && readNotice([item.id])}>标记为已读}
+
+
+ )
+ } else if (noticeType === "2") {
+ //@我
+ return (
+
+
+
+ {item.sender &&

{window.open(`/${item.sender && item.sender.login}`);}}/>}
+
{turnToMess(item)}}>
+ {item.status === 1 ? : }
+ {item.sender && " + item.sender.name+ " "+ item.content +" 中@我"}}>}
+
+
+
+ {item.time_ago}
+ {!isBatchDelete && item.status === 1 && readNotice([item.id])}>标记为已读}
+ {!isBatchDelete && deleteNotice([item.id])}>删除}
+
+
+ )
+ } else{
+ //私信
+ {/*
+

+
+
+
props.history.push('/settings/notice/privateLetter')}>
+ 最好的OpenStack控制台,对标OpenStack社区Horizon项目,最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
+
+
*/}
+ }
+ })}
+
+ {/* 分页 */}
+ {!isBatchDelete &&
+
{setCurrentPage(page)}}
+ total = {messTotalCount}
+ hideOnSinglePage
+ >
+
}
+
+ )
+}
+export default MyNotice;
\ No newline at end of file
diff --git a/src/forge/SecuritySetting/notice/myNotice/Index.scss b/src/forge/SecuritySetting/notice/myNotice/Index.scss
new file mode 100644
index 00000000..8eab84c0
--- /dev/null
+++ b/src/forge/SecuritySetting/notice/myNotice/Index.scss
@@ -0,0 +1,259 @@
+.whiteBack .boies .sshHead{
+ padding:0 10px 0px 0px;
+}
+.sshHead{
+ .ant-badge{
+ font-size: 16px;
+ color: #333333;
+ }
+ .ant-menu-item{
+ padding:0px;
+ margin-right:34px!important;
+ height: 34px;
+ width: 64px;
+ text-align: center;
+ line-height: 0px;
+ position: relative;
+ }
+
+ li.ant-menu-item, .ant-menu-horizontal > .ant-menu-item {
+ border-bottom: 0px;
+ }
+
+ & .ant-menu-item-selected{
+ color: #333333;
+ font-weight: 400;
+ text-shadow: 0.5px 0 #333;
+ border-bottom: 2px solid #2A61FF !important;
+ }
+
+ .ant-badge-count, .ant-badge-dot, .ant-badge .ant-scroll-number-custom-component {
+ right: -6px;
+ -webkit-box-shadow: 0 0 0 0;
+ box-shadow: 0 0 0 0;
+ }
+ .ant-badge-multiple-words {
+ padding: 0 0px;
+ }
+
+ .ant-menu-horizontal {
+ border-bottom: 0px solid #e8e8e8;
+ }
+
+ button{
+ padding:0 5px;
+ }
+}
+
+button {
+ color: #333333;
+ background: #FAFBFC;
+ border: 1px solid #D0D0D0;
+ border-radius: 4px;
+ height: 32px;
+}
+button:hover {
+ background: #F3F4F6;
+}
+button:active {
+ background: #EBECF0;
+}
+
+.deleteBut{
+ color: #DF0002;
+}
+
+.deleteBut:hover{
+ background: #DF0002;
+ border: 1px solid #DF0002;
+ color:#FFFFFF;
+}
+
+.deleteBut:active{
+ background: #CE0002;
+ border: 1px solid #CE0002;
+ color:#FFFFFF;
+}
+
+.mynotice-content {
+ justify-content: space-between;
+ padding: 15px 0 15px 10px;
+ border-bottom: 1px solid #EEEEEE;
+ color: #333333;
+ &:hover{
+ background: #F3F4F6;
+ }
+
+ & img{
+ cursor: pointer;
+ }
+
+ & b{
+ font-weight: 400;
+ text-shadow: 0.5px 0 #333;
+ }
+
+ & .invisable-read{
+ display: none;
+ }
+
+ &:hover .invisable-read{
+ display: block;
+ color: #466AFF;
+ opacity: 0.6;
+ cursor: pointer;
+
+ &:hover{
+ opacity: 1;
+ }
+ }
+
+ &:hover .timeSpan{
+ display: none;
+ }
+
+ i{
+ font-size: 16px !important;
+ margin-right: 5px;
+ }
+
+ .boldSpan{
+ font-weight: 400;
+ text-shadow: 0.5px 0 0 #333;
+ margin: 0 8px;
+ }
+ & .currentImg{
+ width: 40px;
+ height: 40px;
+ margin-left: 0px;
+ }
+
+ & .private-letter-img + .ant-badge-count{
+ top: 2px;
+ right: 5px;
+ height: 18px;
+ min-width: 18px;
+ line-height: 18px;
+ padding: 0 0;
+ }
+
+ & .highlightSpan:hover{
+ color: #466AFF;
+ cursor: pointer;
+ }
+
+ .mynotice-cont{
+ padding:0;
+ cursor: default;
+ & .visible-checkbox{
+ margin-right: 10px;
+ }
+ & .invisible-checkbox{
+ display: none;
+ }
+ .atme-notice-text{
+ margin-left: 6px;
+
+ & .atme-notice-name{
+ margin: 0 0 ;
+ }
+
+ & .atme-length{
+ max-width: 48rem;
+ word-break: break-all;
+ }
+ }
+ }
+
+ & .ant-badge-count, .ant-badge-dot, .ant-badge .ant-scroll-number-custom-component {
+ -webkit-box-shadow: 0 0 0 0;
+ box-shadow: 0 0 0 0;
+ top: 3px;
+ right: 4px;
+ min-width: 8px;
+ height: 8px;
+ }
+
+ & .system-notice-blank{
+ margin-right: 14px;
+ }
+}
+
+.batchDel{
+ & .currentImg, & .atme-notice-text{
+ pointer-events: none;
+ }
+}
+
+.baselineDiv{
+ align-items: baseline;
+}
+
+.invisible {
+ display: none;
+}
+
+.visible {
+ display: flex;
+ justify-content: space-between;
+ height: 30px;
+ padding: 0 10px;
+ color: #333333;
+ margin-bottom: 5px;
+ button{
+ padding:0px 12px;
+ }
+ .batchDeleteBut{
+ border:1px solid #466AFF;
+ color: #466AFF;
+ }
+}
+
+.private-letter-right {
+ flex: auto;
+ margin: 0px 10px 0 16px;
+ & div{
+ display: flex;
+ justify-content: space-between;
+ }
+}
+
+.letter-length-limit{
+ max-width: 50rem;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.sysNotice-length{
+ max-width: 52rem;
+ word-break: break-all;
+}
+
+
+.numberSpan{
+ color: #466AFF;
+}
+
+.vertical-center-style{
+ display: flex;
+ align-items: center;
+}
+
+.stretch-style{
+ display: flex;
+ align-items: baseline;
+}
+
+.float-left-little{
+ margin-right: 10px;
+}
+
+.float-right-little{
+ margin-left: 12px;
+}
+
+.paging{
+ text-align: center;
+ margin: 12px;
+}
\ No newline at end of file
diff --git a/src/forge/SecuritySetting/notice/privateLetter/Index.jsx b/src/forge/SecuritySetting/notice/privateLetter/Index.jsx
new file mode 100644
index 00000000..51758377
--- /dev/null
+++ b/src/forge/SecuritySetting/notice/privateLetter/Index.jsx
@@ -0,0 +1,200 @@
+import React, { useState, useEffect } from 'react';
+import './Index.scss'
+import '../manager/Index.scss'
+import { Button, Input, Icon, Badge } from 'antd';
+import { Link } from 'react-router-dom';
+
+function PrivateLetter(props){
+
+ const { TextArea,Search } = Input;
+
+ function deleteNotice(){
+ alert("删除消息");
+ }
+
+ return(
+
+
+
+
+ 蒋宇航
+
+
+
+

+
+
+ 嗨在吗?哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
+
删除
+
+
2021-08-29 11:59
+
+
+
+

+
+
+ 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
+
删除
+
+
2021-08-29 11:59
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+ }
+ onSearch={value => console.log(value)}
+ style={{ width: 265 }}
+ />
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+

+
+
+ 蒋宇航
+ 4分钟前
+
+
+
最好的OpenStack控制台,对标OpenStack社区Horizon项目,在易用性、页面性能等方面进行深度优化,提供简单控制台。
+
删除
+
+
+
+
+
+
+ )
+}
+export default PrivateLetter;
\ No newline at end of file
diff --git a/src/forge/SecuritySetting/notice/privateLetter/Index.scss b/src/forge/SecuritySetting/notice/privateLetter/Index.scss
new file mode 100644
index 00000000..6276b7a2
--- /dev/null
+++ b/src/forge/SecuritySetting/notice/privateLetter/Index.scss
@@ -0,0 +1,192 @@
+.private-letter{
+ border-radius: 4px 4px 0px 0px;
+ border: 1px solid rgba(151, 151, 151, 0.24);
+ display: flex;
+
+ .currentImg{
+ width: 40px;
+ height: 40px;
+ margin-left: 0px;
+ }
+ & .private-letter-img + .ant-badge-count{
+ top: 2px;
+ right: 5px;
+ }
+}
+
+.pl-content{
+ flex: auto;
+ .pl-name{
+ height: 3rem;
+ border-bottom: 1px solid #EEEEEE;
+
+ &>a{
+ position: relative;
+ left: 26px;
+ color:#999999;
+ }
+ span{
+ font-size: 16px;
+ font-weight: 600;
+ color: #333333;
+ flex: auto;
+ text-align: center;
+ }
+ }
+ .plcontent-list{
+ height: 24rem;
+ padding:20px;
+ overflow-y: scroll;
+
+ .plclo{
+ margin-bottom: 30px;
+ }
+
+ .notice-my{
+ flex-direction: row-reverse;
+
+ & .pld01{
+ left: 0;
+ }
+ }
+
+ & .notice-content{
+ padding:8px 10px;
+ background: #F4F4F4;
+ border-radius:5px;
+ position: relative;
+ max-width: 20rem;
+
+ .pld01{
+ display: none;
+
+ }
+ &:hover .pld01{
+ display: block;
+ position: absolute;
+ right: 0;
+ bottom: -2em;
+ color: #999999;
+ font-size: 12px;
+ &:hover{
+ color: #666666;
+ }
+ }
+ }
+
+ & .message-bubble{
+ position:relative;
+ width:0;
+ height:0;
+ font-size:0;
+ border:solid 8px;
+ border-color:#FFFFFF #FFFFFF #FFFFFF #F4F4F4;
+ }
+
+ & .mb-other{
+ border-color:#FFFFFF #F4F4F4 #FFFFFF #FFFFFF;
+ }
+
+ & span{
+ margin: 0 10px;
+ font-size: 12px;
+ color: #999999;
+ line-height: 17px;
+ }
+ }
+ .private-letter-present{
+ padding:20px 20px;
+ & div{
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ flex: auto;
+ }
+ .private-letter-cont-mt25{
+ margin-top: 8px;
+ padding:0 22px;
+ }
+
+ .private-letter-cont, .private-letter-cont .ant-input-suffix{
+ background-color: #fafafa !important;
+ margin-left: 17px;
+ }
+
+ .private-letter-cont{
+ resize:none;
+ &:hover,&:focus{
+ background-color: #fafafa !important;
+ }
+ }
+ }
+}
+
+.pl-list{
+ width: 30%;
+ border-left: 1px solid #EEEEEE;
+ .list-sort{
+ justify-content: center;
+ height: 3rem;
+ border-bottom: 1px solid #EEEEEE;
+ & .ant-btn-primary{
+ width: 2.3rem;
+ color: #466AFF;
+ background: #eff2ff;
+ border: 1px solid rgba(151, 151, 151, 0.24);
+ }
+
+ & .ant-btn{
+ padding: 0;
+ }
+
+ // & .ant-input:hover{
+ // border: 1px solid red !important;
+ // }
+ }
+
+ .list-scroll{
+ height: 32.4rem;
+ overflow-y: scroll;
+ }
+
+ .list-scroll-content{
+ padding: 10px 10px 15px 15px;
+ border-bottom: 1px solid #EEEEEE;
+ // &:last-child{
+ // border-bottom: 0px;
+ // }
+ &:hover{
+ background: #F3F4F6;
+ }
+ & a{
+ display: none;
+ }
+ &:hover a{
+ display: block;
+ color: #466AFF;
+ }
+ }
+
+ .ls-cont{
+ width: 13rem;
+ // flex: auto;
+ margin-left: 15px;
+ justify-content: space-between;
+ & .ls-content-span{
+ max-width: 11rem;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ }
+}
+
+.vertical-center-style{
+ display: flex;
+ align-items: center;
+}
+
+img{
+ width: 45x;
+ height: 45px;
+}
diff --git a/src/forge/SecuritySetting/sub/DeleteBox.jsx b/src/forge/SecuritySetting/sub/DeleteBox.jsx
index af8b6418..02d816b3 100644
--- a/src/forge/SecuritySetting/sub/DeleteBox.jsx
+++ b/src/forge/SecuritySetting/sub/DeleteBox.jsx
@@ -1,17 +1,16 @@
import React from 'react';
import { AlignCenter } from '../../Component/layout';
-import { Modal , Button } from 'antd';
+import Modals from '../../Component/PublicModal/Index';
+import { Button } from 'antd';
function DeleteBox({ visible , onCancel ,onSuccess }) {
return(
-
@@ -19,10 +18,11 @@ function DeleteBox({ visible , onCancel ,onSuccess }) {
}
>
-
您确定要删除此 SSH 密钥吗?
-
此操作将永久删除该SSH密钥,且不可恢复。如果您想再次使用该密钥,则需要您重新上传。
+
+ 您确定要删除此 SSH 密钥吗?
+
此操作将永久删除该SSH密钥,且不可恢复。如果您想再次使用该密钥,则需要您重新上传。
-
+
)
}
export default DeleteBox;
\ No newline at end of file
diff --git a/src/forge/SecuritySetting/sub/New.jsx b/src/forge/SecuritySetting/sub/New.jsx
index 68a65db3..409098e0 100644
--- a/src/forge/SecuritySetting/sub/New.jsx
+++ b/src/forge/SecuritySetting/sub/New.jsx
@@ -34,7 +34,7 @@ function New({ form , showNotification , history }) {
return(
- SSH密钥添加SSH密钥
+ SSH密钥添加SSH密钥
@@ -51,7 +51,7 @@ function New({ form , showNotification , history }) {
)}
-
+
)
diff --git a/src/forge/SecuritySetting/sub/SSH.jsx b/src/forge/SecuritySetting/sub/SSH.jsx
index bc004e11..2ca890ea 100644
--- a/src/forge/SecuritySetting/sub/SSH.jsx
+++ b/src/forge/SecuritySetting/sub/SSH.jsx
@@ -55,8 +55,8 @@ function SSH(props) {
setVisible(false)} onSuccess={onSuccess}/>
setVisibleDesc(false)} desc={content}/>
- SSH密钥
-
+ SSH密钥
+
{
list && list.length > 0 &&
@@ -64,7 +64,7 @@ function SSH(props) {
{
list.map((i,k)=>{
return(
-
+
{setContent(i);setVisibleDesc(true)}}>{i.name}
diff --git a/src/forge/Settings/Branch.js b/src/forge/Settings/Branch.js
index d345f0fc..3e19f37e 100644
--- a/src/forge/Settings/Branch.js
+++ b/src/forge/Settings/Branch.js
@@ -88,7 +88,7 @@ export default ((props)=>{
// 跳转
function settingRule(protectBranch){
- props.history.push(`/projects/${owner}/${projectsId}/setting/branch/${protectBranch}`);
+ props.history.push(`/${owner}/${projectsId}/settings/branches/${protectBranch}`);
}
// 翻页
diff --git a/src/forge/Settings/BranchRule.jsx b/src/forge/Settings/BranchRule.jsx
index d15ecd00..85b9bf20 100644
--- a/src/forge/Settings/BranchRule.jsx
+++ b/src/forge/Settings/BranchRule.jsx
@@ -290,7 +290,7 @@ export default Form.create()(
{
- history.push(`/projects/${owner}/${projectsId}/setting/branch`);
+ history.push(`/${owner}/${projectsId}/settings/branches`);
}}
>
取消
diff --git a/src/forge/Settings/Collaborator.js b/src/forge/Settings/Collaborator.js
index 0b94eee5..0a50cae1 100644
--- a/src/forge/Settings/Collaborator.js
+++ b/src/forge/Settings/Collaborator.js
@@ -1,4 +1,4 @@
-import React, { useState } from "react";
+import React, { useState , useRef } from "react";
import {WhiteBack} from '../Component/layout';
import AddMember from '../Component/AddMember';
import AddGroup from '../Component/AddGroup';
@@ -8,9 +8,11 @@ import Group from './CollaboratorGroup';
function Collaborator(props){
const [ nav , setNav] = useState("1");
const [ newId , setNewId] = useState(undefined);
+ const [ addOperation , setAddOperation] = useState(true);
const [ newGroupId , setNewGroupId] = useState(undefined);
const {projectsId ,owner} = props.match.params;
+
const author = props && props.projectDetail && props.projectDetail.author;
function getID(id){
@@ -19,6 +21,7 @@ function Collaborator(props){
function getGroupID(id){
setNewGroupId(id);
}
+
return (
@@ -27,15 +30,17 @@ function Collaborator(props){
author && author.type === "Organization" ?
{setNav("1");setNewId(undefined)}}>协作者管理
- {setNav("2");setNewId(undefined)}}>团队管理
+ {setNav("2");setNewId(undefined);setNewGroupId(undefined)}}>团队管理
:
协作者管理
}
{
- nav === "1" ?
+ nav === "1" &&
- :
+ }
+ {
+ (nav !== "1" && addOperation) &&
}
@@ -44,7 +49,7 @@ function Collaborator(props){
nav === "1" ?
:
-
+
}
diff --git a/src/forge/Settings/CollaboratorGroup.jsx b/src/forge/Settings/CollaboratorGroup.jsx
index c6ab6ffb..5c38b1aa 100644
--- a/src/forge/Settings/CollaboratorGroup.jsx
+++ b/src/forge/Settings/CollaboratorGroup.jsx
@@ -10,7 +10,7 @@ const roles = {
read: "报告者",
};
const limit = 15;
-function CollaboratorGroup({ newGroupId, owner, projectsId }) {
+function CollaboratorGroup({ newGroupId, owner, projectsId , setAddOperation }) {
const [list, setList] = useState(undefined);
const [isSpin, setIsSpin] = useState(true);
const [page, setPage] = useState(1);
@@ -34,6 +34,7 @@ function CollaboratorGroup({ newGroupId, owner, projectsId }) {
setList(result.data.teams);
setTotal(result.data.total_count);
setIsSpin(false);
+ setAddOperation(result.data.can_add);
}
})
.catch((error) => {});
@@ -47,16 +48,15 @@ function CollaboratorGroup({ newGroupId, owner, projectsId }) {
// 添加团队
function addGroup(id) {
const url = `/${owner}/${projectsId}/teams.json`;
- axios
- .post(url, {
- team_id: id,
- })
- .then((result) => {
- if (result && result.data) {
- getData();
- }
- })
- .catch((error) => {});
+ axios.post(url, {
+ team_id: id,
+ })
+ .then((result) => {
+ if (result && result.data) {
+ getData();
+ }
+ })
+ .catch((error) => {});
}
// 删除团队
@@ -77,7 +77,11 @@ function CollaboratorGroup({ newGroupId, owner, projectsId }) {
title: "团队名",
dataIndex: "name",
render: (value, item) => {
- return