forgeplus-react/src/forge/Merge/Files.jsx

144 lines
6.8 KiB
React
Raw Normal View History

2021-10-11 11:28:41 +08:00
import React ,{useEffect,useState } from 'react';
2020-11-10 16:42:32 +08:00
import { truncateCommitId } from '../common/util';
2020-11-05 11:31:26 +08:00
import { AlignCenter , FlexAJ } from '../Component/layout';
2021-10-11 11:28:41 +08:00
import { Tooltip,Progress } from 'antd';
2020-11-10 16:42:32 +08:00
import './merge.css';
2021-09-24 11:27:32 +08:00
import './Index.scss';
2020-11-10 16:42:32 +08:00
2021-10-08 14:14:39 +08:00
function Files({ data,history,owner,projectsId , parentsSha }){
2020-11-10 16:42:32 +08:00
const [ files , setFiles ] = useState(data && data.files);
2021-09-24 11:27:32 +08:00
const [ copyfileTipTitle, setCopyfileTipTitle] = useState("复制文件路径");
const [ isOpen, setIsOpen] = useState(false);
2021-10-08 14:41:02 +08:00
2020-11-05 11:31:26 +08:00
useEffect(()=>{
2020-11-06 16:30:01 +08:00
if(data){
setFiles(data.files);
2020-11-05 11:31:26 +08:00
}
},[data]);
2020-11-05 11:31:26 +08:00
2021-10-11 11:28:41 +08:00
useEffect(()=>{
document.addEventListener('click',()=>{setIsOpen(false)})
})
2020-11-10 16:42:32 +08:00
function showDown(flag,index,isBin){
if(!isBin){
var lists = files.concat();
lists[index].flag = !flag ? true : false;
lists.splice();
setFiles(lists);
}
}
2021-09-24 11:27:32 +08:00
function copyFileName(fileName){
var copyCont = document.createElement('input');
copyCont.defaultValue = fileName;
document.body.appendChild(copyCont);
copyCont.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
copyCont.className = 'copyCont';
copyCont.style.display='none';
setCopyfileTipTitle("复制成功");
}
const folderOpen = (
2021-09-27 10:08:52 +08:00
<div className="folders">
<div className="folderList">
{files && files.map((item, key) => {
2021-09-24 14:29:57 +08:00
return (
2021-09-27 10:08:52 +08:00
<a href={`#value${key}`}>
<FlexAJ className="filesInfo" key={key} onClick={() => {item.flag && showDown(item.flag, key, item.isBin);setIsOpen(false);}}>
2021-09-24 14:29:57 +08:00
<AlignCenter>
<i className="iconfont icon-wenjianicon mr4"></i>
<span className="cursor-pointer" data-clipboard-text={item.name}>{item.name}</span>
</AlignCenter>
<div className="see-file">
2021-10-08 14:41:02 +08:00
<Tooltip placement="top" title={`${item.addition+item.deletion}处更改${item.addition + item.deletion > 0 && ""}${item.addition>0?item.addition+"处添加":""}${item.addition>0 && item.deletion>0 ?"和":""}${item.deletion>0?item.deletion+"处删除":""}`}>
2021-09-24 14:29:57 +08:00
<Progress showInfo = {false} strokeColor = "#2DB44D" size="small" percent={item.addition/(item.addition+item.deletion)*100} />
{item.addition >0 && <span className="color-green ml10">+{item.addition}</span>}
{item.deletion >0 && <span className="color-red ml10">-{item.deletion}</span>}
</Tooltip>
</div>
2021-09-27 10:08:52 +08:00
</FlexAJ>
</a>
2021-09-24 14:29:57 +08:00
)
})}
</div>
2021-09-27 10:08:52 +08:00
</div>
2021-09-24 11:27:32 +08:00
)
2020-11-05 11:31:26 +08:00
return(
2021-10-11 11:28:41 +08:00
<div onClick={(e)=>{e.nativeEvent.stopImmediatePropagation()}}>
2021-09-27 10:08:52 +08:00
<AlignCenter className="color-grey-9" style={{position:'relative'}}>
<div onClick={()=>{setIsOpen(!isOpen)}}>
<i className={`iconfont mr5 ${isOpen? "font-18 icon-sanjiaoxing-down":"font-16 icon-triangle"}`}></i>
<span className="color-grey-6 update-file-count">
2021-09-24 14:29:57 +08:00
共有<span className="color-grey-3"> {data && data.files_count} 个文件 </span>被更改包括
2020-11-12 14:43:33 +08:00
{ data && data.total_addition ? <span className="color-green"> {data && data.total_addition} 次插入</span>:"" }
{ data && data.total_addition && data.total_deletion ? " 和 ":""}
{ data && data.total_deletion ? <span className="color-red"> {data && data.total_deletion} 次删除</span>:""}
2021-09-24 14:29:57 +08:00
</span>
2021-09-27 10:08:52 +08:00
</div>
{isOpen && folderOpen}
2020-11-05 11:31:26 +08:00
</AlignCenter>
{
files && files.length>0 &&
2021-09-24 11:27:32 +08:00
<div className="fileList">
2020-11-05 11:31:26 +08:00
{
files.map((item,key)=>{
return(
2021-09-27 10:08:52 +08:00
<div className="files" key={key}>
<a id= {`value${key}`} className="anchorPoint"></a>
2021-09-24 11:27:32 +08:00
<FlexAJ className="filesInfo">
2020-11-05 11:31:26 +08:00
<AlignCenter>
2021-09-28 08:56:16 +08:00
{!item.isBin ? <i className={!item.flag?"iconfont icon-sanjiaoxing-down color-grey-9 mt4":"iconfont icon-triangle font-15 color-grey-9"} onClick={()=>showDown(item.flag,key,item.isBin)}></i>:""}
2021-09-24 11:27:32 +08:00
<span className="cursor-pointer" data-clipboard-text={item.name} onClick={()=>showDown(item.flag,key,item.isBin)}>{item.name}</span>
<Tooltip
title={copyfileTipTitle}
onVisibleChange={()=>setCopyfileTipTitle("复制文件路径")}
>
<i className="iconfont icon-fuzhiicon ml6" onClick={()=>copyFileName(item.name)}></i>
</Tooltip>
2020-11-05 11:31:26 +08:00
</AlignCenter>
2021-09-24 11:27:32 +08:00
<div className="see-file">
2021-10-08 14:41:02 +08:00
<Tooltip placement="top" title={`${item.addition + item.deletion}处更改${item.addition + item.deletion > 0 && ""} ${item.addition > 0 ? item.addition + "处添加" : ""}${item.addition > 0 && item.deletion > 0 ? "和" : ""}${item.deletion > 0 ? item.deletion + "处删除" : ""}`}>
2021-09-24 11:27:32 +08:00
<Progress showInfo = {false} strokeColor = "#2DB44D" size="small" percent={item.addition/(item.addition+item.deletion)*100} />
2021-09-24 14:29:57 +08:00
<span className="ml10">{item.addition+item.deletion}</span>
2021-09-24 11:27:32 +08:00
</Tooltip>
2021-10-09 17:33:10 +08:00
{
!item.isSubmodule &&
<span className="see-file-btn" onClick={()=>{history.push(`/${owner}/${projectsId}${item.isDeleted ? `/commits/${truncateCommitId(parentsSha)}`:`/tree/${truncateCommitId(item.sha)}/${item.name}`}`)}}>查看文件</span>
}
2021-09-24 11:27:32 +08:00
</div>
2020-11-05 11:31:26 +08:00
</FlexAJ>
2020-11-06 16:30:01 +08:00
{
item.sections && item.sections.length >= 1 && !item.flag &&
<div className="filesContent">
{
item.sections.map((i,k)=>{
return(
i.lines && i.lines.length>0 && i.lines.map((item,key)=>{
return(
2020-11-11 16:09:57 +08:00
<div key={k+key} className={(item.type === 2) ? "linesContent add" : item.type === 3 ? "linesContent reduce": item.type===4?"linesContent translate":"linesContent"}>
2020-11-06 16:30:01 +08:00
<span className="lines">
<span>{item.leftIdx && item.leftIdx !=="0" ? item.leftIdx :"" }</span>
<span>{item.rightIdx && item.rightIdx !=="0" ? item.rightIdx :"" }</span>
</span>
<p>{item.content}</p>
</div>
)
})
)
})
}
</div>
}
2020-11-05 11:31:26 +08:00
</div>
)
})
}
</div>
}
</div>
)
}
export default Files;