forgeplus-react/src/forge/Settings/Setting.js

469 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { Component } from "react";
import { Form, Input, Checkbox, Select , Spin, Button } from "antd";
import Title from '../Component/Title';
import {WhiteBack} from '../Component/layout';
import DivertModal from '../Divert/DivertModal';
import { Link } from 'react-router-dom';
import axios from "axios";
import "./setting.scss";
import { unInstallMarketBot } from "../../softbot/api";
const { TextArea } = Input;
const { Option } = Select;
const menu = [
{name:"主页",index:"home"},
{name:"代码库",index:"code"},
{name:"疑修 (Issue)",index:"issues"},
{name:"合并请求 (PR)",index:"pulls"},
{name:"引擎 (Engine)",index:"devops"},
// {name:"资源库",index:"resources"},
{name:"里程碑",index:"versions"},
{name:"维基 (Wiki)",index:"wiki"},
{name:"服务",index:"services"},
{name:"动态",index:"activity"},
]
class Setting extends Component {
constructor(props) {
super(props);
this.state = {
CategoryList: undefined,
LanguageList: undefined,
private_check: undefined,
prview_check:undefined,
loading:true,
project_units:['home',"activity","code"],
divertVisible:false,
is_transfering:undefined,
projectName:undefined
};
}
componentDidUpdate=(prevPros)=>{
this.updateDocumentTitle();
if(prevPros && this.props && !this.props.checkIfLogin()){
this.props.history.push("/403")
return;
}
}
componentDidMount = () => {
this.updateDocumentTitle();
this.getCategory();
this.getLanguage();
this.getInfo();
};
// 更新网页标题
updateDocumentTitle(){
const {projectDetail} = this.props;
if(projectDetail && document.title.indexOf('基本设置-') === -1){
const { author, name} = projectDetail;
document.title = `基本设置-${author.name}/${name}`;
}
}
getLanguage = () => {
const url = `/project_languages.json`;
axios
.get(url)
.then((result) => {
if (result) {
let LanguageList = this.setOptionsList(result.data.project_languages);
this.setState({
LanguageList,
});
}
})
.catch((error) => {});
};
getInfo = () => {
const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/edit.json`;
axios
.get(url)
.then((result) => {
if (result) {
const { project_units } = this.state;
let units = result.data.project_units;
units.push(...project_units);
this.props.form.setFieldsValue({
...result.data,
project_units:units
});
this.setState({
projectName:result.data.project_name,
private_check: result.data.private,
prview_check:result.data.pr_view_admin,
loading:false,
project_units:units,
transfer:result.data.transfer,
is_transfering:result.data.is_transfering,
});
}
})
.catch((error) => {
console.log(error);
});
};
getCategory = () => {
const url = `/project_categories.json`;
axios
.get(url)
.then((result) => {
if (result) {
let CategoryList = this.setOptionsList(
result.data.project_categories
);
this.setState({
CategoryList,
});
}
})
.catch((error) => {});
};
setOptionsList = (data) => {
let list = undefined;
if (data && data.length > 0) {
list = data.map((item, key) => {
return (
<Option key={item.id} value={item.id}>
{item.name}
</Option>
);
});
}
return list;
};
// 更新仓库设置
resetSetting = () => {
this.props.form.validateFields((err, values) => {
if (!err) {
this.setState({
loading:true
})
this.update(values);
// const { projectsId , owner } = this.props.match.params;
// const navUrl = `/${owner}/${projectsId}/project_units.json`;
// let unit = values.project_units.filter(item => (item !== "home" && item!== "activity" && item!== "code"));
// axios.post(navUrl, {
// unit_types:unit
// }).then((result) => {
// if (result) {
// this.update(values);
// }
// }).catch(error=>{})
}
});
};
update=(values)=>{
const { projectsId , owner } = this.props.match.params;
const { private_check , project_units } = this.state;
const url = `/${owner}/${projectsId}.json`;
axios.put(url, {
name: values.project_name,
description: values.project_description,
private: private_check,
identifier:values.project_identifier,
...values,
}).then((result) => {
if (result) {
this.props.showNotification(`仓库信息修改成功!`);
if(values.project_identifier !== projectsId){
this.props.history.push(`/${owner}/${values.project_identifier}/settings`);
}else{
const { getDetail } = this.props;
getDetail && getDetail();
}
if(project_units!==values.project_units){
window.location.reload();
}
}
this.setState({
loading:false
})
}).catch((error) => {
this.setState({
loading:false
})
});
}
// 删除本仓库
deleteProject = () => {
const { projectsId , owner } = this.props.match.params;
const { projectName } = this.state;
const {current_user:{login, user_id}, projectDetail:{project_id}} = this.props;
this.props.confirm({
content: <span style={{display:"block",textAlign:"left"}}>该操作无法撤销且将会一并删除相关的疑修合并请求工作流里程碑动态等数据<br/>是否确认删除 <span style={{fontWeight:"bold"}}>{owner}/{projectName}({projectsId})</span></span>,
onOk: () => {
const url = `/${owner}/${projectsId}.json`;
axios.delete(url).then((result) => {
// 卸载bot判断bot是否安装后端做了判断
unInstallMarketBot({
login,
user_id,
store_id: project_id,
store_identifier: projectsId
})
window.scrollTo(0,0);
this.props.showNotification("仓库删除成功!");
this.props.history.push(`/${owner}`);
})
.catch((error) => {
console.log(error);
});
},
});
};
changePrivate = (e) => {
this.setState({
private_check: e.target.checked,
});
};
changePrview=(e) => {
this.setState({
prview_check: e.target.checked,
});
};
// 转移仓库
DivertProject=()=>{
this.setState({
divertVisible:true
})
}
// 取消仓库转移
CancelDivertProject=()=>{
this.props.confirm({
content: "是否确认取消将此代码库转移给他人?",
onOk: () => {
const { projectsId , owner } = this.props.match.params;
const url = `/${owner}/${projectsId}/applied_transfer_projects/cancel.json`;
axios.post(url).then(result=>{
if(result && result.data){
this.setState({
is_transfering:false
})
}
}).catch(error=>{})
},
});
}
// 确定转移仓库
onSuccess=(owner)=>{
if(owner){
this.setState({
is_transfering:true,
transfer:owner
})
}
this.setState({
divertVisible:false
})
}
render() {
const { getFieldDecorator } = this.props.form;
const { projectsId , owner } = this.props.match.params;
const { projectDetail } = this.props;
const { CategoryList, LanguageList, private_check , prview_check ,loading , divertVisible , is_transfering, transfer } = this.state;
let mirror = projectDetail && projectDetail.mirror;
let type = projectDetail && projectDetail.type;
const forked_from_project_id = this.props && this.props.projectDetail && this.props.projectDetail.forked_from_project_id;
return (
<div>
<DivertModal
owner={owner}
repo={projectsId}
visible={divertVisible}
onSuccess={this.onSuccess}
onCancel={()=>{this.setState({divertVisible:false})}}
/>
<Spin spinning={loading}>
<WhiteBack>
<Title>基本设置</Title>
<Form className="baseForm" style={{marginLeft: '30px'}}>
<Form.Item label="代码库名称">
{getFieldDecorator("project_name", {
rules: [
{
required: true,
message: "请输入代码库名称",
},
],
})(<Input placeholder="请输入代码库名称" />)}
{
projectDetail && projectDetail.type && projectDetail.type !== 0 ?
<span className="color-grey-9">该代码库导入于 <a className="color-grey-6" target="_blank" href={projectDetail.mirror_url}>{projectDetail.mirror_url}</a></span>
: ""
}
</Form.Item>
<div className="df" style={{ alignItems: "center" }}>
<span className="mr20 mb15 font-16">可见性</span>
<Form.Item label="">
{getFieldDecorator("private", {
rules: [],
})(
<Checkbox
checked={private_check}
onChange={this.changePrivate}
disabled={forked_from_project_id}
>
<span className="color-grey-9">将仓库设为私有</span>
<span className="color-grey-6">
{ forked_from_project_id ?`Fork仓库的可见性实时同步自源仓库不支持直接修改`:`修改仓库的可见性将会影响到该仓库下所有Fork仓库的可见性`}
</span>
</Checkbox>
)}
</Form.Item>
</div>
<Form.Item
label={<span>代码库标识 <span className="color-grey-9">(代码库url标识部分更改代码库标识将导致原仓库地址失效)</span></span>}
>
{getFieldDecorator("project_identifier", {
rules: [
{
required: true,
message: "请输入代码库标识",
},
],
})(
<Input placeholder="代码库标识请使用与代码库相关的英文关键字" maxLength="100" />
)}
</Form.Item>
<Form.Item label="代码库简介">
{getFieldDecorator("project_description", {
rules: [],
})(
<TextArea
placeholder="请输入代码库简介"
style={{ height: "80px" }} maxLength={200}
/>
)}
</Form.Item>
<Form.Item label="代码库类别">
{getFieldDecorator("project_category_id", {
rules: [],
})(
<Select>
<Option key={0} value={""}>未选择代码库类别</Option>
{CategoryList}
</Select>
)}
</Form.Item>
<Form.Item label="代码库语言">
{getFieldDecorator("project_language_id", {
rules: [],
})(
<Select>
<Option key={0} value={""}>未选择代码库语言</Option>
{LanguageList}
</Select>
)}
</Form.Item>
<span className="mb15">访问权限:</span>
<div className="df" style={{ alignItems: "center" }}>
<span className="mr20 mb15 font-16">合并请求(PR)</span>
<Form.Item label="">
{getFieldDecorator("pr_view_admin", {
rules: [],
})(
<Checkbox
checked={prview_check}
onChange={this.changePrview}
disabled={forked_from_project_id}
>
<span className="color-grey-3">仅管理员可见</span>
{/* <span className="color-grey-6">
(合并请求(PR)
</span> */}
</Checkbox>
)}
</Form.Item>
</div>
{/* <Form.Item label="代码库导航">
{getFieldDecorator("project_units", {
rules: [],
})(
<Checkbox.Group>
{
menu.map((item,key)=>{
return(
<Checkbox
key={key}
value={item.index}
disabled={item.index === "home" || item.index === "activity" || item.index === "code" || (mirror && (type && type===2) && item.index === "pulls")}
>{item.name}</Checkbox>
)
})
}
</Checkbox.Group>
)}
</Form.Item> */}
<p className="clearfix">
<a className="submitBtn" onClick={this.resetSetting}>
更新仓库设置
</a>
</p>
</Form>
{/* 镜像设置部分,暂无接口,先不显示 */}
{/* <Mirror /> */}
</WhiteBack>
{
projectDetail && projectDetail.permission && (projectDetail.permission === "Admin" || projectDetail.permission === "Owner")?
<WhiteBack className="dangerousBox mb20">
<div>
<div className="dangerousTitle">危险操作区</div>
<div className="flex-a-center padding15-10" style={{borderBottom:"1px solid #f9edbe"}}>
<div>
<p className="font-bd font-16">转移仓库</p>
<p className="mt10">
{
is_transfering ?
<span>此仓库正在转移给
{transfer && <Link to={transfer.login}>{transfer.name}</Link>}
请联系对方接收此仓库</span>
:
`将此仓库转移给其他用户或组织`
}
</p>
</div>
{
is_transfering ?
<Button onClick={this.CancelDivertProject} className="red_deleteBtn">取消转移</Button>
:
<Button onClick={this.DivertProject} className="red_deleteBtn">转移</Button>
}
</div>
<div className="flex-a-center padding15-10">
<div>
<p className="font-bd font-16">删除本仓库</p>
<p className="mt10">
删除仓库是永久性的,
无法撤消且删除后与仓库关联的代码库/任务/合并请求/版本发布等均会被删除
</p>
</div>
<Button onClick={this.deleteProject} className="red_deleteBtn">
删除本仓库
</Button>
</div>
</div>
</WhiteBack>
:""
}
</Spin>
</div>
);
}
}
const WrappedSettingIndexForm = Form.create({ name: "settingForm" })(Setting);
export default WrappedSettingIndexForm;