forgeplus-react/src/forge/Version/New.jsx

279 lines
9.1 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, { useState, useEffect, useCallback, forwardRef } from "react";
import styled from "styled-components";
import { AutoComplete, Select, Input, Checkbox, Button, Form } from "antd";
import Editor from "../../modules/tpm/challengesnew/tpm-md-editor";
import Upload from "../Upload/Index";
import Attachments from "../Upload/attachment";
import axios from "axios";
import "./version.css";
import UploadImg from "../Images/upload.png";
import { getBranch } from '../GetData/getData';
const { Option } = AutoComplete;
export default Form.create()(
forwardRef(
(
{ form, projectDetail , match, showNotification, history },
ref
) => {
const { getFieldDecorator, validateFields, setFieldsValue } = form;
const [tagList, setTagList] = useState(undefined);
const [branchList, setBranchList] = useState(undefined);
const [desc, setDesc] = useState(null);
const [fileList, setFileList] = useState(undefined);
const [attachment, setAttachment] = useState(undefined);
const [options , setOptions] = useState(undefined);
useEffect(()=>{
getBranchs(projectsId);
},[projectsId])
async function getBranchs(id){
let result = await getBranch(id);
setBranchList(result);
}
const Span = styled.span`
margin: 0px 15px;
color: #bbb;
line-height: 35px;
`;
const repo_id = projectDetail && projectDetail.repo_id;
const { projectsId, versionId } = match.params;
useEffect(() => {
if (versionId) {
const url = `/projects/${projectsId}/version_releases/${versionId}/edit.json`;
axios.get(url).then(result => {
if (result) {
setFieldsValue(result.data);
setDesc(result.data.body);
setAttachment(result.data.attachments);
}
});
}
}, [versionId]);
useEffect(() => {
if (repo_id) {
const url = `/repositories/${repo_id}/tags.json`;
axios
.get(url,{params:{
limit:1000
}})
.then(result => {
if (result) {
setTagList(result.data);
setOptions(renderTagList(result.data));
}
})
.catch(error => {
console.log(error);
});
}
}, [repo_id]);
function renderTagList(list) {
if (list) {
let array = list.map((item, key) => {
return (
<Option key={key} value={item.name}>
{item.name}
</Option>
);
});
return array || undefined;
}
}
function submit() {
validateFields((err, value) => {
if(err)return;
if (versionId) {
let url = `/projects/${projectsId}/version_releases/${versionId}.json`;
axios
.put(url, {
...value,
body: desc,
attachment_ids: fileList
})
.then(result => {
if (result) {
showNotification("版本修改成功!");
history.push(`/projects/${projectsId}/coders/version`);
}
});
} else {
let url = `/projects/${projectsId}/version_releases.json`;
axios.post(url, {
...value,
body: desc,
attachment_ids: fileList
})
.then(result => {
if (result) {
showNotification("版本发布成功!");
history.push(`/projects/${projectsId}/coders/version`);
}
});
}
});
}
const helper = useCallback(
(label, name, rules, widget, isRequired = true) => (
<React.Fragment>
<span required={isRequired}>{label}</span>
<Form.Item>
{getFieldDecorator(name, { rules, validateFirst: true })(widget)}
</Form.Item>
</React.Fragment>
),
[]
);
// 输入标签名
function changeAuto(value){
let l = tagList.filter(item=>item.name.indexOf(value) > -1);
setOptions(renderTagList(l));
}
return (
<div className="main df">
<Form className="versionForm">
<div>
<p className="font-16 color-grey-3 mb15">创建发行版</p>
<div>
<div className="itemInline">
{helper(
"",
"tag_name",
[{ required: true, message: "请输入获取或选择一个标签" }],
<AutoComplete
placeholder="标记一个版本"
onChange={changeAuto}
style={{ width: "200px" }}
>
{options}
</AutoComplete>
)}
<Span>@</Span>
{helper(
"",
"target_commitish",
[{ required: true, message: "请选择一个分支" }],
<Select
placeholder="请选择一个分支"
style={{ width: "200px" }}
showArrow={false}
>
{renderTagList(branchList)}
</Select>
)}
</div>
<p className="font-13 color-grey-8">
选择一个已经存在的标签或者在发布时新建一个标签
</p>
</div>
<div className="pt20">
{helper(
"",
"name",
[{ required: true, message: "请输入发行版的标题" }],
<Input placeholder="发行版的标题" />
)}
</div>
<div>
<Editor
placeholder={"描述此发行版"}
height={200}
mdID={`version-comments-description`}
initValue={desc}
onChange={setDesc}
/>
</div>
<div className="set-ant-row">
{helper(
"",
"prerelease",
[],
<Checkbox>这是一个预览版本</Checkbox>
)}
</div>
<div>
<Upload
className="versionStyle"
isComplete={true}
load={setFileList}
icon={
<img
src={UploadImg}
width="58"
alt=""
style={{ marginBottom: 15 }}
/>
}
size={100}
showNotification={showNotification}
/>
{versionId && attachment && attachment.length > 0 ? (
<Attachments
attachments={attachment}
showNotification={showNotification}
canDelete={true}
/>
) : (
""
)}
</div>
<p className="pt20">
<Button onClick={submit} type="primary" className="mr30">
{versionId ? "保存" : "创建"}发行版
</Button>
<Button
onClick={() =>
history.push(`/projects/${projectsId}/coders/version`)
}
style={{
backgroundColor: "rgba(187,187,187,1)",
color: "#fff"
}}
>
取消
</Button>
</p>
</div>
</Form>
<div className="versionTips">
<div className="infosTip">
<p className="font-16 mb15">标签命名建议</p>
<p className="mb15">
通常的做法是在版本名称前加上字母 v 前缀 v1.0 或者 v2.3.4
</p>
<p>
如果标签不适合在生产环境下使用请在版本名称后添加预发行版本例如v0.2-alpha
或者 v5.9-beta.3
</p>
</div>
<div className="infosTip">
<p className="font-16 mb15">语义化版本</p>
<p className="mb15">
如果你是第一次发布版本我们强烈建议你阅读语义化版本
</p>
</div>
<div className="infosTip">
<p className="font-16 mb15">附件大小说明</p>
<p className="mb15">
单个附件不能超过 100MGVP 项目200M每个仓库总附件不可超过
1G推荐项目不可超过 5GGVP 项目不可超过
20G附件总容量统计包括仓库附件和发行版附件
</p>
</div>
</div>
</div>
);
}
)
);