forgeplus-react/src/forge/Main/CoderRootFileDetail.js

286 lines
7.8 KiB
JavaScript
Raw Normal View History

2020-05-27 17:07:36 +08:00
import React, { Component } from "react";
2020-06-24 14:30:02 +08:00
import { Popconfirm, Select } from "antd";
2020-05-27 17:07:36 +08:00
import "./list.css";
import axios from "axios";
import Meditor from "../Newfile/m_editor";
2020-07-02 16:41:06 +08:00
import MDEditor from "../../modules/tpm/challengesnew/tpm-md-editor";
import RenderHtml from "../../components/render-html";
2020-03-27 18:29:00 +08:00
2020-03-16 14:12:11 +08:00
function bytesToSize(bytes) {
2020-05-27 17:07:36 +08:00
if (bytes === 0) return "0 B";
2020-03-16 14:12:11 +08:00
let k = 1024,
2020-05-27 17:07:36 +08:00
sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"],
i = Math.floor(Math.log(bytes) / Math.log(k));
return (bytes / Math.pow(k, i)).toFixed(2) + " " + sizes[i];
2020-03-16 14:12:11 +08:00
}
2020-05-27 17:07:36 +08:00
class CoderRootFileDetail extends Component {
constructor(props) {
2020-03-16 14:12:11 +08:00
super(props);
2020-05-27 17:07:36 +08:00
this.state = {
value: undefined,
2020-06-24 14:30:02 +08:00
language: undefined,
2020-06-24 15:25:19 +08:00
languages: undefined,
2020-07-02 16:41:06 +08:00
description:props.detail.content
2020-05-27 17:07:36 +08:00
};
2020-03-16 14:12:11 +08:00
}
2020-05-27 17:07:36 +08:00
componentDidMount = () => {
2020-06-11 18:00:32 +08:00
const { detail } = this.props;
2020-03-16 14:12:11 +08:00
this.setState({
2020-04-13 17:45:36 +08:00
value: detail.content,
2020-05-27 17:07:36 +08:00
});
2020-06-24 14:30:02 +08:00
this.languages_total();
};
languages_total = () => {
const { detail } = this.props;
2020-06-24 15:25:19 +08:00
const file_name = detail.path.split("/").pop().split(".").pop();
2020-06-24 14:30:02 +08:00
let languages = [];
let default_language = "javascript";
let all_languages = {
apex: ["apex", "apxc"],
azcli: ["azcli"],
bat: ["bat"],
clojure: ["clj"],
coffee: ["coffee"],
cpp: ["cpp"],
csharp: ["cs"],
csp: ["csp"],
css: ["css"],
dockerfile: ["dockerfile", "docker", "yml"],
fsharp: ["fs"],
go: ["go"],
html: ["html", "htm", "erb"],
ini: ["ini"],
java: ["java", "class"],
javascript: ["js"],
json: ["json"],
less: ["less"],
lua: ["lua"],
markdown: ["markdown", "md", "rmd"],
msdax: ["dax"],
mysql: ["sql"],
objective: ["m", "mm", "o", "out"],
perl: ["perl"],
pgsql: ["sql"],
php: ["php"],
postiats: ["postiats"],
powerquery: [""],
powershell: ["ps1"],
pug: ["pug"],
python: ["py"],
r: ["r"],
razor: ["cshtml"],
redis: ["rdb"],
ruby: ["rb"],
rust: ["rs"],
sb: ["sb"],
scheme: ["scm", "ss"],
scss: ["scss"],
shell: ["sh"],
solidity: ["sol"],
sql: ["sql"],
st: ["st"],
swift: ["swift"],
typescript: ["ts"],
vb: ["vbp", "frm", "frx", "bas", "cls"],
xml: ["xml"],
yaml: ["yml"],
};
2020-06-24 15:25:19 +08:00
for (var item in all_languages) {
languages.push(item);
let item_values = all_languages[item];
if (item_values.indexOf(file_name) !== -1) {
default_language = item;
2020-06-24 14:30:02 +08:00
}
}
this.state.languages = languages;
2020-06-24 15:25:19 +08:00
this.state.language = default_language;
2020-05-27 17:07:36 +08:00
};
2020-06-24 14:30:02 +08:00
2020-05-27 17:07:36 +08:00
select_language = (e) => {
2020-03-16 14:12:11 +08:00
this.setState({
2020-05-27 17:07:36 +08:00
language: e,
});
};
2020-06-11 18:00:32 +08:00
EditFile = (flag) => {
const { onEdit } = this.props;
onEdit && onEdit(flag);
2020-05-27 17:07:36 +08:00
};
2020-03-16 14:12:11 +08:00
2020-09-29 14:25:16 +08:00
DownLoadFile =(url) => {
let download_url = "/attachments/entries/get_file?download_url=" + url
window.open(download_url)
}
2020-03-16 14:12:11 +08:00
// 编辑文件
2020-03-29 18:16:58 +08:00
2020-05-27 17:07:36 +08:00
changeMmirror = (e, e1, value) => {
2020-03-16 14:12:11 +08:00
this.setState({
2020-05-27 17:07:36 +08:00
value,
});
};
2020-03-16 14:12:11 +08:00
2020-05-27 17:07:36 +08:00
deleteFile = () => {
const { branch, detail } = this.props;
2020-08-13 18:10:08 +08:00
const { projectsId , owner } = this.props.match.params;
2020-03-16 14:12:11 +08:00
2020-08-13 18:10:08 +08:00
const url = `/${owner}/${projectsId}/delete_file.json`;
2020-05-27 17:07:36 +08:00
axios
.delete(url, {
params: {
filepath: detail.path,
branch,
sha: detail.sha,
},
})
.then((result) => {
if (result) {
this.props.showNotification("删除成功!");
2020-08-18 17:21:11 +08:00
this.props.history.push(`/projects/${owner}/${projectsId}`);
2020-05-27 17:07:36 +08:00
}
})
.catch((error) => {
console.log(error);
});
};
2020-03-16 14:12:11 +08:00
2020-05-27 17:07:36 +08:00
updateCode = (value) => {
this.setState({
value,
});
};
2020-03-16 14:12:11 +08:00
2020-07-02 16:41:06 +08:00
onContentChange = (value) => {
this.setState({
description: value,
});
};
2020-05-27 17:07:36 +08:00
render() {
2020-06-24 14:30:02 +08:00
const {
readOnly,
detail,
current_user,
isManager,
isDeveloper,
2020-07-02 16:41:06 +08:00
md
2020-06-24 14:30:02 +08:00
} = this.props;
2020-07-02 16:41:06 +08:00
const { language, languages , description } = this.state;
2020-03-30 15:06:30 +08:00
let flag = current_user && current_user.login && (isManager || isDeveloper);
2020-05-27 17:07:36 +08:00
const Option = Select.Option;
2020-06-24 14:30:02 +08:00
2020-05-27 17:07:36 +08:00
return (
<div className="mb20">
2020-05-27 17:07:36 +08:00
<div className="grid-item branchTitle">
<div className="grid-item">
2020-06-24 14:30:02 +08:00
<span className="ml20 color-grey-6 font-16">
{bytesToSize(detail && detail.size)}
</span>
2020-05-27 17:07:36 +08:00
</div>
<p className="text-right">
{flag && (
<div>
{readOnly ? (
2020-09-29 14:25:16 +08:00
<span>
2020-09-29 14:47:45 +08:00
{
detail.direct_download ?
""
:
<span>
<a onClick={() => this.DownLoadFile(detail.download_url)} className="ml20">
<i className="iconfont icon-xiazai1 font-15 color-grey-6"></i>
</a>
<a onClick={() => this.EditFile(false)} className="ml20">
<i className="iconfont icon-bianji1 font-15 color-grey-6"></i>
</a>
</span>
}
2020-09-29 14:25:16 +08:00
</span>
2020-05-27 17:07:36 +08:00
) : (
<React.Fragment>
<Select
showSearch={true}
placeholder={"请选择文本语言"}
style={{ width: 200 }}
value={language}
onChange={this.select_language}
>
<Option value={undefined}>请选择文本语言</Option>
2020-06-24 15:25:19 +08:00
{languages &&
languages.map((item, key) => {
return (
<Option value={item} key={key}>
{item}
</Option>
);
})}
2020-05-27 17:07:36 +08:00
</Select>
<button
type="button"
className="ant-btn ant-btn-sm ml20"
2020-06-24 14:30:02 +08:00
onClick={() => this.EditFile(true)}
2020-05-27 17:07:36 +08:00
>
<span> </span>
</button>
</React.Fragment>
)}
2020-03-25 15:14:20 +08:00
2020-05-27 17:07:36 +08:00
<Popconfirm
title="确认删除这个文件?"
className="ml20"
okText="确定"
cancelText="取消"
onConfirm={this.deleteFile}
>
<a>
<i className="iconfont icon-shanchu font-15 color-grey-6"></i>
</a>
2020-03-25 15:14:20 +08:00
</Popconfirm>
2020-05-27 17:07:36 +08:00
</div>
)}
2020-03-16 14:12:11 +08:00
</p>
</div>
<div>
2020-06-24 14:59:19 +08:00
{detail.image_type ? (
2020-06-05 11:46:56 +08:00
<div className="edu-txt-center pt20 pb20">
2020-06-24 14:30:02 +08:00
<img
alt=""
src={detail.download_url}
style={{ maxWidth: "80%" }}
/>
2020-05-27 17:07:36 +08:00
</div>
2020-06-24 15:25:19 +08:00
) : detail.direct_download ? (
2020-06-24 15:29:31 +08:00
<div className="mt20 text-center">
2020-06-24 15:25:19 +08:00
<a href={detail.download_url} className="color-blue font-15">
下载原始文件
</a>
</div>
2020-05-27 17:07:36 +08:00
) : (
2020-07-02 16:41:06 +08:00
md && readOnly ?
<div className="files-md">
2020-08-18 09:55:20 +08:00
<RenderHtml className="file-md imageLayerParent" value={description} />
2020-07-02 16:41:06 +08:00
</div>
:
2020-05-27 17:07:36 +08:00
<Meditor
{...this.props}
{...this.state}
language={language ? language : "javascript"}
filepath={`/${detail.path}`}
content={detail.content}
readOnly={readOnly}
editorType="update"
></Meditor>
)}
2020-03-16 14:12:11 +08:00
</div>
</div>
2020-05-27 17:07:36 +08:00
);
2020-03-16 14:12:11 +08:00
}
}
2020-03-29 18:16:58 +08:00
export default CoderRootFileDetail;