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

357 lines
12 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 } from "antd";
import Title from '../Component/Title';
import { WhiteBack } from '../Component/layout';
import axios from "axios";
import "./setting.scss";
const { TextArea } = Input;
const { Option } = Select;
const menu = [
{ name: "主页", index: "home" },
{ name: "代码库", index: "code" },
{ name: "易修 (Issue)", index: "issues" },
{ name: "合并请求", index: "pulls" },
{ name: "工作流(beta版)", index: "devops" },
// {name:"资源库",index:"resources"},
{ name: "里程碑", index: "versions" },
{ name: "动态", index: "activity" },
]
class Setting extends Component {
constructor(props) {
super(props);
this.state = {
CategoryList: undefined,
LanguageList: undefined,
private_check: undefined,
loading: true,
project_units: ['home', "activity", "code"],
divertVisible: false,
is_transfering: undefined,
projectName: undefined,
join_project_need_verify: false,
project_id: undefined,
audit_statu: undefined,
};
}
componentDidUpdate = (prevPros) => {
if (prevPros && this.props && !this.props.checkIfLogin()) {
this.props.history.push("/403")
return;
}
}
componentDidMount = () => {
this.getCategory();
this.getLanguage();
this.getInfo();
};
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,
join_project_need_verify: result.data.join_project_need_verify,
loading: false,
project_units: units,
project_id: result.data.project_id,
audit_statu: result.data.audit_statu
});
}
})
.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
})
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, join_project_need_verify } = this.state;
const url = `/${owner}/${projectsId}.json`;
axios.put(url, {
name: values.project_name,
description: values.project_description,
private: private_check,
join_project_need_verify: join_project_need_verify,
...values,
}).then((result) => {
if (result) {
this.props.showNotification(`仓库信息修改成功!`);
const { getDetail } = this.props;
getDetail && getDetail();
this.setState({
loading: false
})
}
}).catch((error) => {
console.log(error);
this.setState({
loading: false
})
});
}
// 删除本仓库
deleteProject = () => {
const { projectsId, owner } = this.props.match.params;
const { projectName } = this.state;
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) => {
this.props.showNotification("仓库删除成功!");
this.props.history.push("/projects");
})
.catch((error) => {
console.log(error);
});
},
});
};
changePrivate = (e) => {
this.setState({
private_check: e.target.checked,
});
};
render() {
const { getFieldDecorator } = this.props.form;
const { projectDetail } = this.props;
const { CategoryList, LanguageList, private_check, loading, join_project_need_verify, project_id, audit_statu } = 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>
<Spin spinning={loading}>
<WhiteBack>
<Title>基本设置</Title>
<Form className="baseForm">
<Form.Item label="项目名称">
{getFieldDecorator("project_name", {
rules: [
{
required: true,
message: "请输入项目名称",
},
],
})(<Input placeholder="请输入项目名称" />)}
</Form.Item>
<div className="df gap-20px">
<span className="mr20 mb15 font-14" style={{ marginTop: '8px' }}>可见性</span>
{audit_statu == 2 ? <Form.Item label="">
{getFieldDecorator("private", {
rules: [],
})(
<Checkbox
checked={private_check}
onChange={this.changePrivate}
disabled={forked_from_project_id}
>
<span className="color-grey-6">将仓库设为私有</span>
<span className="color-grey-9">
{forked_from_project_id ? `Fork仓库的可见性实时同步自源仓库不支持直接修改` : `修改仓库的可见性将会影响到该仓库下所有Fork仓库的可见性`}
</span>
</Checkbox>
)}
</Form.Item> : <div className="flex item-center gap-20px">
{audit_statu == 1 ? <div className='rounded-14px px-10px py-2px' style={{ color: "#EA7C1F", border: "1px solid #EA7C1F", background: "rgba(255,146,54,0.14)" }}>审核中</div> :
<div className='rounded-14px px-10px py-2px cursor-pointer'
style={{ color: "#1CAC70", border: "1px solid #1CAC70", background: "rgba(60,218,152,0.14)" }}
onClick={() => {
axios.post(`/projects/${project_id}/create_project_review.json`, {}).then((result) => {
if (result.status == 0) {
this.getInfo();
}
}).catch(error => { })
}}>申请公开</div>}
<div className="color-grey-9">项目需管理员审核通过才可公开展示未通过或待审核期间默认保持私有状态</div>
</div>}
</div>
<Form.Item label="项目简介">
{getFieldDecorator("project_description", {
rules: [],
})(
<TextArea
placeholder="请输入项目简介"
style={{ height: "80px" }} maxLength={200}
/>
)}
</Form.Item>
<Form.Item label="项目类别">
{getFieldDecorator("project_category_id", {
rules: [
{
required: true,
message: "请选择大类别",
},
],
})(<Select>{CategoryList}</Select>)}
</Form.Item>
<Form.Item label="项目语言">
{getFieldDecorator("project_language_id", {
rules: [
{
required: true,
message: "请选择项目语言",
},
],
})(<Select>{LanguageList}</Select>)}
</Form.Item>
<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>
<div className="df">
<span className="mr20 mb15 font-14" style={{ marginTop: '8px' }}>加入项目设置</span>
<Form.Item label="">
{getFieldDecorator("join_project_need_verify", {
rules: [],
})(
<Checkbox
checked={join_project_need_verify}
onChange={(e) => this.setState({ join_project_need_verify: e.target.checked })}
>
<span className="color-grey-6">用户加入项目时需要审核</span>
<span className="color-grey-9">
使用邀请码加入也需要审核由项目所有人或管理员审核
</span>
</Checkbox>
)}
</Form.Item>
</div>
<p className="clearfix">
<a className="submitBtn" onClick={this.resetSetting}>
更新仓库设置
</a>
</p>
</Form>
{/* 镜像设置部分,暂无接口,先不显示 */}
{/* <Mirror /> */}
</WhiteBack>
<WhiteBack className="dangerousBox mb20">
<div>
<div className="dangerousTitle">危险操作区</div>
<div className="flex-a-center padding15-10">
<div>
<p className="font-bd font-16">删除本仓库</p>
<p className="mt10">
删除仓库是永久性的,
无法撤消且删除后与仓库关联的项目/任务/合并请求/版本发布等均会被删除
</p>
</div>
<a onClick={this.deleteProject} className="red_deleteBtn">
删除本仓库
</a>
</div>
</div>
</WhiteBack>
</Spin>
</div>
);
}
}
const WrappedSettingIndexForm = Form.create({ name: "settingForm" })(Setting);
export default WrappedSettingIndexForm;