Merge branch 'dev_aliyun' of http://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun

dev_hss
cxt 6 years ago
commit 8f8b04dbdb

@ -32,7 +32,7 @@ module.exports = {
// See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.s
// devtool: "cheap-module-eval-source-map",
// 开启调试
// devtool: "source-map", // 开启调试
//devtool: "source-map", // 开启调试
// These are the "entry points" to our application.
// This means they will be the "root" imports that are included in JS bundle.
// The first two entry points enable "hot" CSS and auto-refreshes for JS.

@ -11,11 +11,20 @@ class AppraiseModal extends Component{
fileList:[],
textareaval:undefined,
Inputsval:undefined,
valuetype:1,
valuetype:0,
textareavaltype:false
}
}
componentDidMount() {
this.setState({
valuetype:this.props.work_type===undefined?0:this.props.work_type,
textareaval:this.props.work_comment,
})
}
onChanges=(e)=>{
this.setState({
valuetype:e.target.value
@ -30,7 +39,6 @@ class AppraiseModal extends Component{
Saves=()=>{
let{textareaval,valuetype}=this.state;
let newvaluetype=valuetype===1?false:true;
if(textareaval===undefined||textareaval===null||textareaval===""){
this.setState({
@ -42,11 +50,11 @@ class AppraiseModal extends Component{
let url=`/student_works/${this.props.match.params.homeworkid}/shixun_work_comment.json`
axios.post(url, {
comment:textareaval,
is_hidden:newvaluetype
is_hidden:valuetype
}).then((response) => {
if(response.data.status===0){
this.props.showNotification(response.data.message)
this.props.Cancel()
this.props.showCancel(textareaval,valuetype)
}else{
this.props.showNotification(response.data.message)
}
@ -62,12 +70,13 @@ class AppraiseModal extends Component{
height: '30px',
lineHeight: '30px',
};
return(
<div>
<Modal
keyboard={false}
className={"HomeworkModal"}
title={"评阅"}
title={"编辑评阅"}
visible={this.props.visible}
closable={false}
footer={null}
@ -107,8 +116,8 @@ class AppraiseModal extends Component{
权限
</p>
<Radio.Group onChange={this.onChanges} value={this.state.valuetype}>
<Radio value={1} style={radioStyle} className={"newfont"}>可见 (学生查看老师的评阅内容</Radio>
<Radio value={2} style={radioStyle} className={"newfont"}>不可见 (仅对课堂老师可见</Radio>
<Radio value={0} style={radioStyle} className={"newfont"}>可见 (学生查看老师的评阅内容</Radio>
<Radio value={1} style={radioStyle} className={"newfont"}>不可见 (仅对课堂老师可见</Radio>
</Radio.Group>
<p className={"font mt10 mb20"}>
@ -125,7 +134,7 @@ class AppraiseModal extends Component{
</div>
<div className={textareavaltype===false?"mt20 clearfix edu-txt-center":"clearfix edu-txt-center"}>
<a className="task-btn color-white mr30" onClick={this.props.Cancel()}>{this.props.Cancelname || '取消'}</a>
<a className="task-btn color-white mr30" onClick={()=>this.props.Cancel()}>{this.props.Cancelname || '取消'}</a>
<a className="task-btn task-btn-orange" onClick={this.Saves}>{this.props.Savesname || '确定'}</a>
</div>
</div>

@ -848,7 +848,7 @@ a.white-btn.use_scope-btn:hover{
font-family: MicrosoftYaHei;
font-weight: 400;
color: rgba(51,51,51,1);
cursor: pointer;
/*cursor: pointer;*/
max-width: 825px;
overflow: hidden;
text-overflow: ellipsis;

@ -19,7 +19,7 @@ const CheckboxGroup = Checkbox.Group
const Option = Select.Option;
const maps = {1: "未发布", 2: "提交中", 3: "已截止"}
const confirm = Modal.confirm;
const $ = window.$;
class PollNew extends Component {
// 问卷新建和编辑
//

@ -1077,13 +1077,13 @@ class Listofworksstudentone extends Component {
// debugger
let urll = `/homework_commons/${homeworkid}/works_list.json`;
var datasysl = {
search: "",
order: "",
search: this.state.searchtext,
order: this.state.orders,
b_order: "desc",
page: 1,
limit: 20,
work_status: "",
course_group: "",
page: this.state.page,
limit: this.state.limit,
work_status: this.state.course_groupyslstwo,
course_group: this.state.checkedValuesineinfo,
}
axios.post(urll, datasysl).then((result) => {
console.log("980000000____________________");
@ -2104,7 +2104,8 @@ class Listofworksstudentone extends Component {
this.setState({
userids: e.myid,
})
this.viewtrainingt(e.myid);
// this.viewtrainingt(e.myid);
window.open(`/courses/${this.state.props.match.params.coursesId}/shixun_homeworks/${e.myid}/shixun_work_report`, '_blank');
}
// 关闭调分
cancelModulationModels = () => {
@ -2600,29 +2601,31 @@ class Listofworksstudentone extends Component {
color:rgba(255,104,0,1);
}
.computeTime{
width: 73px;
height: 24px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 13px;
color: #4CACFF;
border: 1px solid #4CACFF;
cursor: pointer;
}
.computeTime {
width: 122px;
height: 31px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 20px;
color: #FE6B21;
border: 1px solid #FE6B21;
cursor: pointer;
border-radius: 4px;
}
.computeTimes{
width: 73px;
height: 24px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 13px;
color: #C5C5C5;
border: 1px solid #EDEDED;
background:#EDEDED;
cursor: pointer;
.computeTimes{
width: 122px;
height: 31px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 20px;
color: #C5C5C5;
border: 1px solid #EDEDED;
background:#EDEDED;
cursor: pointer;
border-radius: 4px;
}
.shixunSpin{
color:#FF6801;
@ -2643,12 +2646,12 @@ class Listofworksstudentone extends Component {
<span className="fl mr10 color-grey-6 ">计算成绩时间{teacherdata&&teacherdata.calculation_time==null?"--": moment(teacherdata&&teacherdata.calculation_time).format('YYYY-MM-DD HH:mm')}</span>
{course_is_end===true?"":<span>
{teacherdata&&teacherdata.publish_immediately===false&&computeTimetype===true?
(this.props.isNotMember()===false?<div className={"computeTime font-13"} onClick={this.setComputeTimet}>
计算成绩
(this.props.isNotMember()===false?<div className={"computeTime font-16"} onClick={this.setComputeTimet}>
查看最新成绩
</div>:""):
teacherdata&&teacherdata.homework_status!==undefined&&teacherdata.homework_status[0]=== "未发布"? "":
(this.props.isNotMember()===false?<div className={"computeTimes font-13"}>
计算成绩
(this.props.isNotMember()===false?<div className={"computeTimes font-16"}>
查看最新成绩
</div>:"")
}
</span>}
@ -2842,30 +2845,32 @@ class Listofworksstudentone extends Component {
font-weight:400;
color:rgba(255,104,0,1);
}
.computeTime{
width: 73px;
height: 24px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 13px;
color: #4CACFF;
border: 1px solid #4CACFF;
cursor: pointer;
}
.computeTime {
width: 122px;
height: 31px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 20px;
color: #FE6B21;
border: 1px solid #FE6B21;
cursor: pointer;
border-radius: 4px;
}
.computeTimes{
width: 73px;
height: 24px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 13px;
color: #C5C5C5;
border: 1px solid #EDEDED;
background:#EDEDED;
cursor: pointer;
}
.computeTimes{
width: 122px;
height: 31px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 20px;
color: #C5C5C5;
border: 1px solid #EDEDED;
background:#EDEDED;
cursor: pointer;
border-radius: 4px;
}
`}
</style>
{visibles === true ?
@ -2949,15 +2954,15 @@ class Listofworksstudentone extends Component {
{ course_is_end===true?"":teacherdata&&teacherdata.task_operation[0]==="开启挑战"?"":<span>
{computeTimetype===true?
(this.props.isNotMember()===false?
<div className={"computeTime font-13"} onClick={this.setComputeTime}>
计算成绩
<div className={"computeTime font-16"} onClick={this.setComputeTime}>
查看最新成绩
</div>
:"")
:
(teacherdata&&teacherdata.homework_status!==undefined&&teacherdata.homework_status[0]=== "未发布"? "":
this.props.isNotMember()===false?
<div className={"computeTimes font-13"}>
计算成绩
<div className={"computeTimes font-16"}>
查看最新成绩
</div>
:"")
}
@ -3127,29 +3132,31 @@ class Listofworksstudentone extends Component {
font-weight:400;
color:rgba(255,104,0,1);
}
.computeTime{
width: 73px;
height: 24px;
.computeTime {
width: 122px;
height: 31px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 13px;
color: #4CACFF;
border: 1px solid #4CACFF;
line-height: 20px;
color: #FE6B21;
border: 1px solid #FE6B21;
cursor: pointer;
}
border-radius: 4px;
}
.computeTimes{
width: 73px;
height: 24px;
width: 122px;
height: 31px;
display: inline-block;
padding: 5px;
text-align: center;
line-height: 13px;
line-height: 20px;
color: #C5C5C5;
border: 1px solid #EDEDED;
background:#EDEDED;
cursor: pointer;
border-radius: 4px;
}
`}
</style>
@ -3158,15 +3165,26 @@ class Listofworksstudentone extends Component {
<span className="fl mr10 color-grey-6 ">计算成绩时间{teacherdata&&teacherdata.calculation_time==null?"--": moment(teacherdata&&teacherdata.calculation_time).format('YYYY-MM-DD HH:mm')}</span>
{ course_is_end===true?"":teacherdata&&teacherdata.task_operation&&teacherdata.task_operation[0]==="开启挑战"?"":<span>
{computeTimetype===true?
(this.props.isNotMember()===false?<div className={"computeTime font-13"} onClick={this.setComputeTime}>
计算成绩
(this.props.isNotMember()===false?<div className={"computeTime font-16"} onClick={this.setComputeTime}>
查看最新成绩
</div>:""):
teacherdata&&teacherdata.homework_status!==undefined&&teacherdata.homework_status[0]=== "未发布"? "":
(this.props.isNotMember()===false?<div className={"computeTimes font-13"}>
计算成绩
(this.props.isNotMember()===false?<div className={"computeTimes font-16"}>
查看最新成绩
</div>:"")
}
</span>}
{/* {teacherdata&&teacherdata.task_operation&&teacherdata.task_operation[0]==="开启挑战"?"":<span>*/}
{/*{computeTimetype===true?*/}
{/* (this.props.isNotMember()===false?<div className={"computeTime font-16"} onClick={this.setComputeTime}>*/}
{/* 查看最新成绩*/}
{/* </div>:""):*/}
{/* teacherdata&&teacherdata.homework_status!==undefined&&teacherdata.homework_status[0]=== "未发布"? "":*/}
{/* (this.props.isNotMember()===false?<div className="computeTimes font-16">*/}
{/* 查看最新成绩*/}
{/* </div>:"")*/}
{/*}*/}
{/*</span>}*/}
</div>
{/*因为计算按钮占了和这个位置,和设计沟通学生视角取消这个按钮*/}

@ -32,7 +32,9 @@ class ShixunWorkReport extends Component {
DownloadMessageval:undefined,
isspinning:false,
showAppraiseModaltype:false,
work_comment_hidden:false
work_comment_hidden:false,
showAppraiseModalsshow:true,
work_comment:null
}
}
@ -104,6 +106,7 @@ class ShixunWorkReport extends Component {
this.setState({
data:result.data,
work_comment_hidden:result.data.work_comment_hidden,
work_comment:result.data.work_comment,
spinning:false
})
}
@ -150,26 +153,50 @@ class ShixunWorkReport extends Component {
})
}
showAppraiseModal=()=>{
this.setState({
showAppraiseModaltype:true
})
showAppraiseModal=(sum)=>{
if(sum===undefined){
this.setState({
showAppraiseModaltype:true
})
}else{
this.setState({
showAppraiseModaltype:true,
work_comment:undefined,
work_type:0,
})
}
}
hideAppraiseModal=()=>{
let{data}=this.state;
let{data,work_comment}=this.state;
this.setState({
showAppraiseModaltype:false,
work_comment_hidden:data&&data.work_comment_hidden===true?true:data&&data.work_description!=null?true:false,
work_comment_hidden:data&&data.work_comment_hidden===true?true:work_comment!=null?true:false,
})
}
showAppraiseModals=(list,type)=>{
let{data,work_comment}=this.state;
this.setState({
showAppraiseModaltype:false,
work_comment_hidden:data&&data.work_comment_hidden===true?true:work_comment!=null?true:false,
work_comment:list,
work_type:type,
showAppraiseModals:true,
showAppraiseModalsshow:true
})
}
isdeleteModal=()=>{
let url =`/student_works/${this.props.match.params.homeworkid}/destroy_work_comment.json`
axios.delete(url).then((response) => {
// const { status } = response.data;
if(response.data.status===0){
this.props.showNotification(response.data.message)
this.setState({
showAppraiseModalsshow:false,
work_comment_hidden:false
})
}else{
this.props.showNotification(response.data.message)
}
@ -179,15 +206,15 @@ class ShixunWorkReport extends Component {
});
}
render() {
let{data,showAppraiseModaltype,work_comment_hidden} =this.state;
let{data,showAppraiseModaltype,work_comment_hidden,showAppraiseModalsshow,work_comment} =this.state;
let category_id=data===undefined?"":data.category===null?"":data.category.category_id;
let homework_common_id=data===undefined?"":data.homework_common_id;
let homeworkid=this.props.match.params.homeworkid;
const antIcon = <Icon type="loading" style={{ fontSize: 24 }} spin />;
let showAppraiseModals=this.props&&this.props.isAdminOrTeacher()===true?work_comment_hidden===true?true:false:data&&data.work_description===null?false:true;
let showAppraiseModals=this.props&&this.props.isAdminOrTeacher()===true?work_comment===null||work_comment===undefined?false:true:work_comment===null||work_comment===undefined?false:true;
console.log(showAppraiseModals)
return (
data===undefined?"":<Spin indicator={antIcon} spinning={this.state.spinning}>
@ -197,6 +224,9 @@ class ShixunWorkReport extends Component {
{...this.state}
visible={showAppraiseModaltype}
Cancel={()=>this.hideAppraiseModal()}
showCancel={(list,type)=>this.showAppraiseModals(list,type)}
work_comment={this.state.work_comment}
work_type={this.state.work_type}
/>:""}
<div className="newMain clearfix ">
<div className={"educontent mb20" }>
@ -229,10 +259,14 @@ class ShixunWorkReport extends Component {
className=" color-blue font-14 fr ml20 mt15"
onClick={()=>this.confirmysl(`/student_works/${homeworkid}/export_shixun_work_report.pdf`)}
> <Spin size="small" spinning={this.state.isspinning}>导出实训报告数据</Spin></a> : ""}
{this.props.isAdmin() ?work_comment_hidden===true? "":<a
{/*{this.props.isAdmin() ?work_comment_hidden===true? "":<a*/}
{/*className=" color-blue font-14 fr ml20 mt15"*/}
{/*onClick={()=>this.showAppraiseModal(1)}*/}
{/*>评阅</a> : ""}*/}
{this.props.isAdmin() ?<a
className=" color-blue font-14 fr ml20 mt15"
onClick={()=>this.showAppraiseModal()}
>评阅</a> : ""}
onClick={()=>this.showAppraiseModal(1)}
>评阅</a>:""}
</div>
<style>{
`
@ -261,22 +295,22 @@ class ShixunWorkReport extends Component {
margin-bottom: 19px;
}
.passfont{
display: inline-block;
// display: inline-block;
margin-right: 72px;
}
.passfontmid{
display: inline-block;
// display: inline-block;
margin-right: 36px;
}
.passfontbom{
display: inline-block;
// display: inline-block;
margin-right: 58px;
}
.passfontbommid{
display: inline-block;
// display: inline-block;
margin-right: 93px;
}
@ -292,6 +326,10 @@ class ShixunWorkReport extends Component {
.mt19{
margin-top:19px;
}
.passbox{
display: inline-block;
height: 50px;
}
`
}</style>
<div className="stud-class-set">
@ -303,23 +341,28 @@ class ShixunWorkReport extends Component {
<div className="fl edu-back-white ml10 ">
<img alt="头像" className="radius" height="91" id="nh_user_logo" name="avatar_image"
src={"https://pre-newweb.educoder.net/images/avatars/User/8686"}
src={data&&data.image_url}
width="91"/>
</div>
<div className={"fl edu-back-white ml39 "}>
<p className={"back_font"}>陈晓</p>
<p className={"back_font"}>{data&&data.username}</p>
<p className={"mb16"}>
<span className={"passfont"}><span className={"color999"}>通过</span> <span className={"colorCF3B3B"}>{data&&data.complete_count}/{data&&data.challenges_count}</span></span>
<span className={"passfontmid"}><span className={"color999"}>课堂最高完成效率</span> <span className={data&&data.max_efficiency===null?"color999":"color333"}>{data&&data.max_efficiency===null?'--':data&&data.max_efficiency}</span></span>
<span><span className={"color999"}>通关时间</span> <span className={data&&data.passed_time===null?"color999":"color333"}>{data&&data.passed_time===null?'--':data&&data.passed_time}</span></span>
</p>
<p>
<span className={"passfontbom"}><span className={"color999"}>经验值</span> <span className={"color333"}>{data&&data.myself_experience}/{data&&data.total_experience}</span></span>
<span className={"passfontbommid"}><span className={"color999"}>完成效率</span> <span className={data&&data.efficiency===null?"color999":"color333"}>{data&&data.efficiency===null?'--':data&&data.efficiency}</span></span>
<span><span className={"color999"}>实战耗时</span> <span className={data&&data.efficiency===null?"color999":"color333"}>{data&&data.time_consuming===null?'--':data&&data.time_consuming}</span></span>
<span className={"passbox"}>
<div className={"passfont"}><span className={"color999"}>通过</span> <span className={"colorCF3B3B"}>{data&&data.complete_count}/{data&&data.challenges_count}</span></div>
<div className={"passfontbom"}><span className={"color999"}>经验值</span> <span className={"color333"}>{data&&data.myself_experience}/{data&&data.total_experience}</span></div>
</span>
<span className={"passbox"}>
<div className={"passfontmid"}><span className={"color999"}>课堂最高完成效率</span> <span className={data&&data.max_efficiency===null?"color999":"color333"}>{data&&data.max_efficiency===null?'--':data&&data.max_efficiency}</span></div>
<div className={"passfontbommid"}><span className={"color999"}>完成效率</span> <span className={data&&data.efficiency===null?"color999":"color333"}>{data&&data.efficiency===null?'--':data&&data.efficiency}</span></div>
</span>
<span className={"passbox"}>
<div><span className={"color999"}>通关时间</span> <span className={data&&data.passed_time===null?"color999":"color333"}>{data&&data.passed_time===null?'--':data&&data.passed_time}</span></div>
<div><span className={"color999"}>实战耗时</span> <span className={data&&data.efficiency===null?"color999":"color333"}>{data&&data.time_consuming===null?'--':data&&data.time_consuming}</span></div>
</span>
</p>
</div>
@ -395,7 +438,7 @@ class ShixunWorkReport extends Component {
</div>
{showAppraiseModals===true?<div className="stud-class-set mt17">
{showAppraiseModals===true&&showAppraiseModalsshow===true?<div className="stud-class-set mt17">
<div className="clearfix edu-back-white poll_list">
<div className="font-16 color-dark-21 shixunreporttitleboxtop pd20 color333">
@ -415,7 +458,7 @@ class ShixunWorkReport extends Component {
<div style={{minHeight:'50px'}}>
<div className={"personalsummary"}>
<div className={"markdown-body"}
dangerouslySetInnerHTML={{__html: markdownToHTML(data&&data.work_description).replace(/▁/g, "▁▁▁")}}></div>
dangerouslySetInnerHTML={{__html: markdownToHTML(work_comment).replace(/▁/g, "▁▁▁")}}></div>
</div>
</div>
</div>

@ -14,7 +14,7 @@ render() {
onInput={(e)=>this.props.onInput(e)}
maxlength={this.props.maxlength}
/>
<div className="WordNumberTextarea-count"><span>{this.props.value===undefined?0:this.props.value.length}</span>/{this.props.maxlength}</div>
<div className="WordNumberTextarea-count"><span>{this.props.value===undefined||this.props.value===null?0:this.props.value.length}</span>/{this.props.maxlength}</div>
</div>
)
}

@ -219,6 +219,7 @@ class Index extends Component {
praisePlus={context.praisePlus}
git_url={context.git_url}
mirror_name={context.mirror_name}
challenge={context.challenge}
myshixun={context.myshixun}

@ -13,7 +13,7 @@ import ChooseEvaluateView from './main/ChooseEvaluateView'
import { CircularProgress } from 'material-ui/Progress';
import Button from 'material-ui/Button';
import VNCDisplay from './VNCDisplay'
import VNCContainer from './VNCContainer'
import './tpiPage.css';
import './tpiPageForMobile.css';
@ -94,9 +94,13 @@ class MainContent extends Component {
<div className="fl pr tip-right-con" id="update_game_tip"></div>
</div>*/}
{ showIframeContent && vnc_url ? <VNCDisplay
vnc_url={vnc_url}
></VNCDisplay>
{ showIframeContent && vnc_url ?
<CodeRepositoryViewContainer { ...this.props } isOnlyContainer={true}>
<VNCContainer
vnc_url={vnc_url}
{...this.props}
></VNCContainer>
</CodeRepositoryViewContainer>
:
<React.Fragment>

@ -0,0 +1,17 @@
.float_button {
background-image: url(./images/float_switch.jpg);
height: 112px;
width: 38px;
position: absolute;
left: -38px;
top: 32%;
cursor: pointer;
}
.float_button .text {
position: relative;
writing-mode: vertical-rl;
top: 36px;
color: #fff;
left: 13px;
user-select: none;
}

@ -0,0 +1,184 @@
import React, { Component } from 'react';
import axios from 'axios'
import { Spin } from 'antd'
import ClipboardJS from 'clipboard'
import VNCDisplay from './VNCDisplay'
import FloatButton from './component/FloatButton'
import SecondDrawer from './component/SecondDrawer'
import RepoTree from './component/repo/RepoTree'
import TPIMonaco from './component/monaco/TPIMonaco'
import notEditablePathImg from '../../images/tpi/notEditablePath.png'
import './VNC.css'
const $ = window.$;
const firstDrawerWidth = 260;
class VNCContainer extends Component {
constructor(props) {
super(props)
this.state = {
fileTreeSelectedKeys: [],
repositoryCode: ''
}
}
componentDidMount() {
if (!this.clipboard) {
const clipboard = new ClipboardJS('.copybtn');
clipboard.on('success', (e) => {
this.props.showSnackbar('复制成功')
});
this.clipboard = clipboard
}
}
getSecondDrawerWidth = () => {
return $('#game_right_contents').width() - firstDrawerWidth
}
renderSecondDrawerChildren = () => {
const { readingCodeLoading, repositoryCode } = this.state;
const height = $(window).height() - 130
const isEditablePath = false;
return (
<Spin tip="加载中..." spinning={readingCodeLoading}>
<div style={{ height: `${height}px` }}>
<div className="codemirrorBackground"
style={{ backgroundImage: `url('${notEditablePathImg}')`, display: (isEditablePath ? 'none' : 'block') }}></div>
<TPIMonaco
{...this.state}
codeLoading={readingCodeLoading}
repositoryCode={repositoryCode}
isEditablePath={false}
></TPIMonaco>
</div>
</Spin>);
}
fetchReadRepositoryCode = (path) => {
const status = 1
const fetchRepoCodeUrl = `/tasks/${this.props.game.identifier}/rep_content.json?path=${path}&status=${status}`
this.setState({ readingCodeLoading: true });
axios.get(fetchRepoCodeUrl, {
}).then((fetchReadRepositoryCodeResponse) => {
if (fetchReadRepositoryCodeResponse.data.content || fetchReadRepositoryCodeResponse.data.content == "") {
this.setState({
repositoryCode: fetchReadRepositoryCodeResponse.data.content,
readingCodeLoading: false
})
} else {
this.setState({ readingCodeLoading: false });
}
// this.setState({ isEditablePath, currentPath: path });
}).catch(error =>{
console.log(error)
this.setState({ readingCodeLoading: false });
this.props.showSnackbar(`服务端异常,请联系管理员!`);
})
}
onTreeSelect = (selectedKeys, info) => {
const isLeaf = info.node.props.isLeaf;
if (isLeaf) { // 叶子节点
selectedKeys.length && this.setState({
fileTreeSelectedKeys: selectedKeys
})
this.refs["secondDrawer"].showSecondDrawer()
console.log('leaf clicked')
const nodePath = info.node.props.eventKey;
if (nodePath) {
const filetype = nodePath.split('.').pop().toLowerCase();
if (filetype == 'jpg' || filetype == 'png' || filetype == 'gif' || filetype == 'jpeg'
|| filetype == 'jar'
|| filetype == 'doc' || filetype == 'pdf' || filetype == 'xsl' || filetype == 'ppt') {
this.props.showSnackbar(`不支持加载${filetype}类型的文件。`)
return;
}
this.fetchReadRepositoryCode(nodePath);
} else {
console.error('no eventKey:', info.node)
}
}
}
/*
selectedKeys={fileTreeSelectedKeys}
onSelect={onTreeSelect}
*/
render() {
const { challenge, vnc_url, git_url } = this.props
const secondDrawerChildren = this.renderSecondDrawerChildren();
return (
<React.Fragment>
<SecondDrawer
ref="secondDrawer"
floatText={'版本库'}
maskClosable={false}
secondDrawerChildren={secondDrawerChildren}
firstDrawerWidth={firstDrawerWidth}
getSecondDrawerWidth={this.getSecondDrawerWidth}
firstDrawerClassName="repoFilesDrawer vncDrawer"
secondDrawerClassName="codeInDrawer"
>
<style>{`
.vncDrawer .ant-drawer-body {
padding: 0px;
}
.vncDrawer .rc-tree {
padding: 16px;
max-width: 220px;
}
.vncDrawer .ant-drawer-wrapper-body {
background: #242324;
}
.codeInDrawer .ant-drawer-wrapper-body {
background: #1D1C1D;
}
.vncDrawer .ant-drawer-header, .codeInDrawer .ant-drawer-header {
border-bottom: 0;
}
.vncDrawer > div:nth-child(2) {
top: 0px !important;
height: 100% !important;
min-width: unset;
}
.codeInDrawer .ant-spin-nested-loading > div > .ant-spin .ant-spin-text {
text-shadow: none;
}
`}</style>
<div style={{ 'padding': '16px', 'border-bottom': '1px solid #3A383A' }}>
<div style={{ color: '#888888' }}>网址克隆</div>
<div>
<input value={git_url} readonly={true} style={{ color: '#BABABA', width: '190px', background: 'transparent', border: 'none' }}></input>
<i class="iconfont icon-fuzhi font-14 ml10 copybtn"
style={{color: '#4CACFF', cursor: 'pointer', verticalAlign: 'baseline'}} data-clipboard-text={git_url} ></i>
</div>
</div>
<RepoTree
{...this.props}
fileTreeSelectedKeys={this.state.fileTreeSelectedKeys}
onTreeSelect={this.onTreeSelect}
></RepoTree>
</SecondDrawer>
<FloatButton></FloatButton>
<VNCDisplay
{...this.props}
></VNCDisplay>
</React.Fragment>
);
}
}
export default VNCContainer;

@ -0,0 +1,24 @@
import React, { Component } from 'react';
const $ = window.$;
class FloatButton extends Component {
componentDidMount() {
}
render() {
const { challenge, vnc_url, children } = this.props
return (
<div className="float_button" onClick={this.props.onClick}>
<style>{`
`}</style>
<span class="text">{children || '版本库'}</span>
</div>
);
}
}
export default FloatButton;

@ -0,0 +1,100 @@
import React from "react";
import ReactDOM from "react-dom";
import { Drawer } from "antd";
import FloatButton from './FloatButton'
import PropTypes from 'prop-types';
class SecondDrawer extends React.Component {
state = { visible: false, childrenDrawer: false };
showDrawer = () => {
this.setState({
visible: true
});
};
onClose = () => {
this.setState({
visible: false
});
};
showSecondDrawer = () => {
this.setState({
childrenDrawer: true
});
};
onChildrenDrawerClose = () => {
this.setState({
childrenDrawer: false
});
};
swtichFirstDrawer = () => {
this.setState({
visible: !this.state.visible,
childrenDrawer: false
});
};
componentDidMount() {
this.setState({ visible: true }, () => {
this.setState({ visible: false });
});
}
render() {
const { floatText, maskClosable, children, secondDrawerChildren, firstDrawerWidth, getSecondDrawerWidth
,firstDrawerClassName, secondDrawerClassName
} = this.props
const secondDrawerWidth = getSecondDrawerWidth();
// 180 不知道为什么会偏移 180px
return (
<Drawer
// mask={!this.state.visible}
title=" "
width={this.state.childrenDrawer ? secondDrawerWidth + firstDrawerWidth - 180 : firstDrawerWidth}
closable={false}
onClose={this.onClose}
visible={this.state.visible}
maskClosable={maskClosable}
className={firstDrawerClassName}
>
{/* <button type="primary" onClick={this.showSecondDrawer}>
Two-level drawer
</button> */}
<FloatButton onClick={this.swtichFirstDrawer}>{floatText}</FloatButton>
{ children }
<Drawer
mask={false}
title=" "
width={secondDrawerWidth}
closable={false}
onClose={this.onChildrenDrawerClose}
visible={this.state.childrenDrawer}
className={secondDrawerClassName}
>
{ secondDrawerChildren }
{/* <button
style={{
marginRight: 8
}}
onClick={this.onChildrenDrawerClose}
>
Cancel
</button> */}
</Drawer>
</Drawer>
);
}
}
SecondDrawer.propTypes = {
floatText: PropTypes.string,
maskClosable: PropTypes.bool,
secondDrawerChildren: PropTypes.element,
};
// firstDrawerWidth={firstDrawerWidth}
// getSecondDrawerWidth={this.getSecondDrawerWidth}
export default SecondDrawer

@ -271,6 +271,7 @@ class TPIMonaco extends Component {
const lang = getLanguageByMirrorName(this.props.mirror_name);
const editor = window.monaco.editor.create(document.getElementById('extend-challenge-file-edit'), {
value: value,
readOnly: !this.props.isEditablePath,
// 属性说明
// http://testeduplus2.educoder.net/react/build/static/node_modules/_monaco-editor@0.15.6@monaco-editor/esm/vs/editor/common/config/commonEditorConfig.js
// https://github.com/Microsoft/monaco-editor/issues/29
@ -303,7 +304,7 @@ class TPIMonaco extends Component {
notCallCodeMirrorOnChangeFlag = false
return;
}
this.props.onRepositoryCodeUpdate(editor.getValue())
this.props.onRepositoryCodeUpdate && this.props.onRepositoryCodeUpdate(editor.getValue())
})
this.props.codemirrorDidMount && this.props.codemirrorDidMount()

@ -0,0 +1,54 @@
import React, { useState, useEffect, useContext, useRef, memo } from 'react';
// import { Tree } from 'antd';
// const { TreeNode } = Tree;
import Tree, { TreeNode } from 'rc-tree';
import 'rc-tree/assets/index.css';
const $ = window.$;
export default function RepoTree(props) {
const { fileTreeData, onLoadData, onTreeSelect, fileTreeSelectedKeys, loadRepoFiles } = props;
const [expandedKeys, setExpandedKeys] = useState([])
useEffect(() => {
loadRepoFiles()
}, [])
if (!fileTreeData || fileTreeData.length === 0) {
return ""
}
const onExpand = (expandedKeys) => {
// console.log('onExpand', arguments);
// if not set autoExpandParent to false, if children expanded, parent can not collapse.
// or, you can remove all expanded children keys.
setExpandedKeys(expandedKeys)
}
const loop = (data) => {
return data.map((item) => {
if (item.children) {
return <TreeNode title={item.name} key={item.key}>{loop(item.children)}</TreeNode>;
}
return (
<TreeNode title={item.name} key={item.key} isLeaf={item.isLeaf} />
);
});
};
const treeNodes = loop(fileTreeData);
// selectable={false}
return (
<Tree
onExpand={onExpand}
expandedKeys={expandedKeys}
// autoExpandParent={this.state.autoExpandParent}
loadData={onLoadData}
selectedKeys={fileTreeSelectedKeys}
onSelect={onTreeSelect}
>
{treeNodes}
</Tree>
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -101,6 +101,11 @@ class CodeRepositoryViewContainer extends Component {
drawerOpen: open,
})
}
loadRepoFiles = () => {
if (!this.state.fileTreeData) {
this.fetchRepoFiles();
}
}
componentWillReceiveProps(newProps, oldProps) {
@ -269,18 +274,34 @@ class CodeRepositoryViewContainer extends Component {
}
// /shixuns/mnf6b7z3/shixun_discuss?challenge_id=88
render() {
return (
<CodeRepositoryView {...this.props}
{...this.state}
showFilesDrawer={this.showFilesDrawer}
onLoadData={this.onLoadData}
onTreeSelect={ this.onTreeSelect }
onRepositoryViewExpand={this.onRepositoryViewExpand}
tabIndexChange={this.tabIndexChange}
showSettingDrawer={this.showSettingDrawer}
<React.Fragment>
{this.props.isOnlyContainer == true ?
React.Children.map(this.props.children, child => {
if(!child) {
return ''
}
return React.cloneElement(child, Object.assign({...this.state}, {
loadRepoFiles: this.loadRepoFiles,
onTreeSelect: this.onTreeSelect,
onLoadData: this.onLoadData,
}))
})
></CodeRepositoryView>
:
<CodeRepositoryView {...this.props}
{...this.state}
showFilesDrawer={this.showFilesDrawer}
loadRepoFiles={this.loadRepoFiles}
onLoadData={this.onLoadData}
onTreeSelect={ this.onTreeSelect }
onRepositoryViewExpand={this.onRepositoryViewExpand}
tabIndexChange={this.tabIndexChange}
showSettingDrawer={this.showSettingDrawer}
></CodeRepositoryView> }
</React.Fragment>
);
}
}

Loading…
Cancel
Save