杨树林 6 years ago
commit 40209aca8c

@ -211,20 +211,35 @@ $(function(){
var FF = !(window.mozInnerScreenX == null); var FF = !(window.mozInnerScreenX == null);
var websshLineHeight = FF ? 19 : 18 var websshLineHeight = FF ? 19 : 18
function throttle(method, delay, duration){
var timer = null, begin = new Date();
return function(){
var context = this, args = arguments, current = new Date();
clearTimeout(timer);
if(current-begin >= duration){
method.apply(context, args);
begin = current;
} else {
timer = setTimeout(function(){
method.apply(context, args);
}, delay);
}
}
}
doc.live('mousemove touchmove',function(e){ doc.live('mousemove touchmove',function(e){
$(".-brother").show();// 代码行的遮罩显示 $(".-brother").show();// 代码行的遮罩显示
if(dragging) { if(dragging) {
clickX = e.pageX || e.originalEvent.touches[0].pageX;; clickX = e.pageX || e.originalEvent.touches[0].pageX;;
if(clickX > leftOffset+0&&clickX<leftOffset+1600) { if(clickX > leftOffset+0&&clickX<leftOffset+1600) {
console.log('resize')
//console.log(1); //console.log(1);
lab.css('left', clickX - 7 - leftOffset + 'px'); lab.css('left', clickX - 7 - leftOffset + 'px');
$("#game_left_contents").width( clickX-leftOffset + 'px'); $("#game_left_contents").width( clickX-leftOffset + 'px');
nextW2 = clickX-leftOffset; nextW2 = clickX-leftOffset;
$("#game_right_contents").width( wrapWidth - nextW2 + 'px'); $("#game_right_contents").width( wrapWidth - nextW2 + 'px');
//console.log(lab.next().width()); //console.log(lab.next().width());
refresh_editor_monaco() throttle(refresh_editor_monaco, 100, 200)()
} else { } else {
lab.css('left', '0px'); lab.css('left', '0px');
} }
@ -246,7 +261,8 @@ $(function(){
var w = $("#games_repository_contents").width(); var w = $("#games_repository_contents").width();
$(".game_webssh").css("min-height", m); $(".game_webssh").css("min-height", m);
$(".game_webssh").css("max-height", m); $(".game_webssh").css("max-height", m);
refresh_editor_monaco(m) throttle(refresh_editor_monaco, 100, 200)(m)
// refresh_editor_monaco(m)
// 火狐下行高为19 // 火狐下行高为19
// CodeRepositoryView.js有同样的计算逻辑用来初始化ssh // CodeRepositoryView.js有同样的计算逻辑用来初始化ssh
var rows = Math.round(m / websshLineHeight); var rows = Math.round(m / websshLineHeight);
@ -1187,6 +1203,8 @@ $(function(){ // 这里重新加一次事件监听,不在原有事件的基
dragging = true; dragging = true;
dragDom = lab; dragDom = lab;
$('#htmlIframe').css('pointer-events', 'none') $('#htmlIframe').css('pointer-events', 'none')
$('#can-drag').show()
lab.hide()
return false; return false;
} }
); );
@ -1206,8 +1224,11 @@ $(function(){ // 这里重新加一次事件监听,不在原有事件的基
}) })
doc.live("mouseup", function(e) { doc.live("mouseup", function(e) {
lab.show()
// 在大窗口将下边测试集滚动条拖上去后,将窗口缩小,再拖下来就有这种情况 https://www.trustie.net/issues/16326 // 在大窗口将下边测试集滚动条拖上去后,将窗口缩小,再拖下来就有这种情况 https://www.trustie.net/issues/16326
if (dragging === true) { if (dragging === true) {
$('#can-drag').hide()
window.editor_CodeMirror && window.editor_CodeMirror.refresh() window.editor_CodeMirror && window.editor_CodeMirror.refresh()
// 使得iframe可以继续捕获事件 // 使得iframe可以继续捕获事件

@ -1,83 +1,83 @@
import React,{ Component } from "react"; import React,{ Component } from "react";
import TPMMDEditor from '../../../modules/tpm/challengesnew/TPMMDEditor' import TPMMDEditor from '../../../modules/tpm/challengesnew/TPMMDEditor'
import {markdownToHTML} from 'educoder' import {markdownToHTML} from 'educoder'
import './DMDEditor.css' import './DMDEditor.css'
// 需要父组件通过toShowMode、toMDMode 来控制一次只能打开一个DMDEditor // 需要父组件通过toShowMode、toMDMode 来控制一次只能打开一个DMDEditor
class DMDEditor extends Component{ class DMDEditor extends Component{
constructor(props){ constructor(props){
super(props); super(props);
this.mdRef = React.createRef() this.mdRef = React.createRef()
this.state={ this.state={
mdMode: false, mdMode: false,
// value: this.props.initValue // value: this.props.initValue
} }
} }
componentDidUpdate(prevProps, prevState) { componentDidUpdate(prevProps, prevState) {
} }
componentDidMount() { componentDidMount() {
// if(this.props.initValue != this.mdRef.current.getValue()) { // if(this.props.initValue != this.mdRef.current.getValue()) {
// this.mdRef.current.setValue(this.props.initValue) // this.mdRef.current.setValue(this.props.initValue)
// } // }
} }
toMDMode = () => { toMDMode = () => {
this.setState({mdMode: true}, () => { this.setState({mdMode: true}, () => {
this.mdRef.current.resize() this.mdRef.current.resize()
this.mdRef.current.setValue(this.props.initValue) this.mdRef.current.setValue(this.props.initValue)
}) })
this.props.toMDMode(this) this.props.toMDMode(this)
} }
toShowMode = () => { toShowMode = () => {
this.setState({mdMode: false}) this.setState({mdMode: false})
this.props.toShowMode && this.props.toShowMode(this) this.props.toShowMode && this.props.toShowMode(this)
} }
onCMBlur = () => { onCMBlur = () => {
this.toShowMode() this.toShowMode()
} }
onChange = (val) => { onChange = (val) => {
// this.setState({ value: val }) // this.setState({ value: val })
this.props.onChange(val) this.props.onChange(val)
if (this.state.showError == true) { if (this.state.showError == true) {
this.setState({showError: false}) this.setState({showError: false})
} }
} }
showError = () => { showError = () => {
this.mdRef.current.showError() this.mdRef.current.showError()
this.setState({showError: true}) this.setState({showError: true})
} }
render(){ render(){
const { mdMode, showError } = this.state; const { mdMode, showError } = this.state;
const { initValue } = this.props; const { initValue } = this.props;
let _style = {} let _style = {}
if (showError) { if (showError) {
_style.border = '1px solid red' _style.border = '1px solid red'
} }
_style = Object.assign(_style, {display: mdMode == true ? 'none' : '', color: initValue? '': '#999', alignItems: 'center', wordBreak: 'break-all'}) _style = Object.assign(_style, {display: mdMode == true ? 'none' : '', color: initValue? '': '#999', alignItems: 'center', wordBreak: 'break-all'})
return( return(
<React.Fragment> <React.Fragment>
<style>{` <style>{`
`}</style> `}</style>
<div id="content_editorMd_show" className="new_li content_editorMd_show" <div id="content_editorMd_show" className="new_li content_editorMd_show markdown-body"
style={_style} style={_style}
dangerouslySetInnerHTML={{__html: initValue ? markdownToHTML(initValue):this.props.placeholder}} dangerouslySetInnerHTML={{__html: initValue ? markdownToHTML(initValue):this.props.placeholder}}
onClick={this.toMDMode} onClick={this.toMDMode}
> >
</div> </div>
{/* {/*
onCMBlur={this.onCMBlur} */} onCMBlur={this.onCMBlur} */}
<TPMMDEditor <TPMMDEditor
ref={this.mdRef} ref={this.mdRef}
{...this.props} {...this.props}
initValue={initValue} initValue={initValue}
className={`${this.props.className} ${mdMode == true ? '' : 'hideMd'}`} className={`${this.props.className} ${mdMode == true ? '' : 'hideMd'}`}
onChange={this.onChange} onChange={this.onChange}
></TPMMDEditor> ></TPMMDEditor>
</React.Fragment> </React.Fragment>
) )
} }
} }
export default DMDEditor; export default DMDEditor;

@ -186,7 +186,7 @@ class Exercisestatisticalresult extends Component {
<span className="CACFF">{item.ques_position+"."}{item.ques_type===0?"单选":item.ques_type===1?"多选":item.ques_type===2?"判断":item.ques_type===3?"填空":item.ques_type===4?"主观":item.ques_type===5?"实训":""}</span> <span className="CACFF">{item.ques_position+"."}{item.ques_type===0?"单选":item.ques_type===1?"多选":item.ques_type===2?"判断":item.ques_type===3?"填空":item.ques_type===4?"主观":item.ques_type===5?"实训":""}</span>
<div> <div>
{/*Q{item.ques_position}*/} {/*Q{item.ques_position}*/}
<div dangerouslySetInnerHTML={{__html: markdownToHTML(item.ques_title).replace(/▁/g,"▁▁▁")}}></div> <div className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML(item.ques_title).replace(/▁/g,"▁▁▁")}}></div>
{/*<span className="markdown-body" dangerouslySetInnerHTML={createMarkup(item.ques_title)}></span>*/} {/*<span className="markdown-body" dangerouslySetInnerHTML={createMarkup(item.ques_title)}></span>*/}
</div> </div>

@ -293,7 +293,20 @@ class GraduationTasksSubmitedit extends Component{
funtaskstatus=(checkedValues)=>{ funtaskstatus=(checkedValues)=>{
let{memberslist,selectobjct}=this.state;
let{memberslist,selectobjct,workslist}=this.state;
if(selectobjct.length>workslist.max_num){
this.setState({
minvalue:workslist.max_num,
setvalue:"大于",
minmaxtype:true
})
return
}else{
this.setState({
minmaxtype:false
})
}
let newlist =memberslist; let newlist =memberslist;
let newcheckedValues=checkedValues; let newcheckedValues=checkedValues;
let selects=[]; let selects=[];
@ -309,6 +322,7 @@ class GraduationTasksSubmitedit extends Component{
} }
} }
this.setState({ this.setState({
task_status:checkedValues, task_status:checkedValues,
selectmemberslist:selects selectmemberslist:selects
@ -347,12 +361,7 @@ class GraduationTasksSubmitedit extends Component{
handleSubmit=(e) => { handleSubmit=(e) => {
let {fileList,selectmemberslist,workslist}=this.state; let {fileList,selectmemberslist,workslist}=this.state;
if(fileList.length===0){
this.setState({
shixunsreplace:true,
})
return
}
this.Commoninterface(fileList,selectmemberslist,workslist); this.Commoninterface(fileList,selectmemberslist,workslist);
// setTimeout(function () { // setTimeout(function () {
@ -361,6 +370,7 @@ class GraduationTasksSubmitedit extends Component{
} }
Commoninterface =(fileList,selectmemberslist,workslist)=>{ Commoninterface =(fileList,selectmemberslist,workslist)=>{
let userids=[]; let userids=[];
for(var list of selectmemberslist){ for(var list of selectmemberslist){
@ -386,17 +396,16 @@ class GraduationTasksSubmitedit extends Component{
return return
} }
if(workslist.task_type===2){ if(workslist.task_type===2){
if(userids.length<2){ if(userids.length<workslist.min_num){
this.setState({ this.setState({
minvalue:2, minvalue:workslist.min_num,
setvalue:"小于", setvalue:"小于",
minmaxtype:true minmaxtype:true
}) })
return return
}else if(userids.length>5){ }else if(userids.length>workslist.max_num){
this.setState({ this.setState({
minvalue:5, minvalue:workslist.max_num,
setvalue:"大于", setvalue:"大于",
minmaxtype:true minmaxtype:true
}) })
@ -409,6 +418,13 @@ class GraduationTasksSubmitedit extends Component{
}) })
let workId=this.props.match.params.work_Id; let workId=this.props.match.params.work_Id;
if(fileList.length===0){
this.setState({
shixunsreplace:true,
})
return
}
let url="/graduation_works/"+workId+".json"; let url="/graduation_works/"+workId+".json";
axios.put(url, { axios.put(url, {
description:values.description, description:values.description,
@ -474,7 +490,7 @@ class GraduationTasksSubmitedit extends Component{
multiple: true, multiple: true,
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUrl()}/api/attachments.json`,
onChange: this.handleChange, onChange: this.handleChange,
onRemove: this.onAttachmentRemove, onRemove: this.onAttachmentRemove,
@ -628,37 +644,37 @@ class GraduationTasksSubmitedit extends Component{
) )
})} })}
<style> {/*<style>*/}
{ {/*{*/}
` {/*`*/}
.maxwidth500{ {/*.maxwidth500{*/}
max-width:500px; {/*max-width:500px;*/}
overflow: hidden; {/*overflow: hidden;*/}
text-overflow: ellipsis; {/*text-overflow: ellipsis;*/}
white-space: nowrap; {/*white-space: nowrap;*/}
color: #05101a; {/*color: #05101a;*/}
} {/*}*/}
` {/*`*/}
} {/*}*/}
</style> {/*</style>*/}
{this.state.fileList.length===0?"":this.state.fileList.map((item,key)=>{ {/*{this.state.fileList.length===0?"":this.state.fileList.map((item,key)=>{*/}
return( {/*return(*/}
<p className="color-grey mt10" key={key} > {/*<p className="color-grey mt10" key={key} >*/}
<a className="color-grey fl"> {/*<a className="color-grey fl">*/}
<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i> {/*<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i>*/}
</a> {/*</a>*/}
<span className="mr12 color9B9B maxwidth500 fl" length="58"> {/*<span className="mr12 color9B9B maxwidth500 fl" length="58">*/}
{item.name} {/*{item.name}*/}
</span> {/*</span>*/}
<span className="color656565 mt2 color-grey-6 font-12 mr8"> {/*<span className="color656565 mt2 color-grey-6 font-12 mr8">*/}
{item.response===undefined?"":bytesToSize(item.size)} {/*{item.response===undefined?"":bytesToSize(item.size)}*/}
</span> {/*</span>*/}
<i className="font-14 iconfont icon-guanbi " {/*<i className="font-14 iconfont icon-guanbi "*/}
id={item.response===undefined?"":item.response.id} {/*id={item.response===undefined?"":item.response.id}*/}
aria-hidden="true" onClick={()=>this.onAttachmentRemove(item.response===undefined?"":item.response.id&&item.response.id)}></i> {/*aria-hidden="true" onClick={()=>this.onAttachmentRemove(item.response===undefined?"":item.response.id&&item.response.id)}></i>*/}
</p> {/*</p>*/}
) {/*)*/}
})} {/*})}*/}
@ -675,7 +691,7 @@ class GraduationTasksSubmitedit extends Component{
> >
<div> <div>
<div className={"fl ml20"}>成员要求25</div> <div className={"fl ml20"}>成员要求{workslist&&workslist.min_num}{workslist&&workslist.max_num}</div>
<Search <Search
className={"fl mt5 ml20"} className={"fl mt5 ml20"}
style={{width:"270px"}} style={{width:"270px"}}
@ -724,7 +740,7 @@ class GraduationTasksSubmitedit extends Component{
</div>:memberslist&&memberslist.map((item,key)=>{ </div>:memberslist&&memberslist.map((item,key)=>{
return( return(
<div key={key} style={{ <div key={key} style={{
width: '375px', width: '400px',
height: '30px' height: '30px'
}}> }}>
<Checkbox value={item.user_id} <Checkbox value={item.user_id}
@ -735,8 +751,8 @@ class GraduationTasksSubmitedit extends Component{
} }
disabled={item.commit_status===true?true:false} className="fl "></Checkbox> disabled={item.commit_status===true?true:false} className="fl "></Checkbox>
<div className={"fl ml5 fonthidden width100"} style={{width: '70px'}} title={item.user_name}>{item.user_name}</div> <div className={"fl ml5 fonthidden width100"} style={{width: '70px'}} title={item.user_name}>{item.user_name}</div>
<div className={"fl ml5 fonthidden width100 color-grey-9"} style={{width: '70px'}}>{item.group_name}</div> <div className={"fl ml5 fonthidden width100 color-grey-9"}>{item.group_name}</div>
<div className={"fl ml5 color-grey-9 fonthidden width100"} style={{width: '70px'}}>{item.student_id}</div> <div className={"fl ml5 color-grey-9 fonthidden width100"}>{item.student_id}</div>
<div className={"fl ml20"}>{item.commit_status===false?<span className={"color-orange"}>已提交</span> :""}</div> <div className={"fl ml20"}>{item.commit_status===false?<span className={"color-orange"}>已提交</span> :""}</div>
</div> </div>
) )
@ -760,7 +776,7 @@ class GraduationTasksSubmitedit extends Component{
height: '30px', height: '30px',
display: item.user_name === undefined ? "none" : "" display: item.user_name === undefined ? "none" : ""
}}> }}>
<div className={"fl ml5 fonthidden width100"} style={{width: '50px'}} <div className={"fl ml5 fonthidden width100"}
title={item.user_name}>{item.user_name}</div> title={item.user_name}>{item.user_name}</div>
<div className={"fl ml5 fonthidden width100 color-grey-9"}>{item.group_name}</div> <div className={"fl ml5 fonthidden width100 color-grey-9"}>{item.group_name}</div>
<div className={"fl ml5 color-grey-9 fonthidden width100"}>{item.student_id}</div> <div className={"fl ml5 color-grey-9 fonthidden width100"}>{item.student_id}</div>
@ -769,6 +785,7 @@ class GraduationTasksSubmitedit extends Component{
style={{marginTop: '-4px'}} style={{marginTop: '-4px'}}
onClick={() => this.delecttask_status(item.user_id)}></i> onClick={() => this.delecttask_status(item.user_id)}></i>
</div> : ""} </div> : ""}
<div className={"both"}></div>
</div> </div>
) )
} }

@ -85,15 +85,9 @@ class GraduationTasksSubmitnew extends Component{
} }
handleSubmit=(e) => { handleSubmit=(e) => {
console.log("86");
let {fileList,selectmemberslist,workslist}=this.state; let {fileList,selectmemberslist,workslist}=this.state;
if(fileList.length === 0){
this.setState({
shixunsreplace:true,
})
return
}
this.Commoninterface(fileList,selectmemberslist,workslist); this.Commoninterface(fileList,selectmemberslist,workslist);
} }
@ -280,7 +274,19 @@ class GraduationTasksSubmitnew extends Component{
funtaskstatus=(checkedValues)=>{ funtaskstatus=(checkedValues)=>{
let{memberslist,selectobjct}=this.state; let{memberslist,selectobjct,workslist}=this.state;
if(selectobjct.length>workslist.max_num){
this.setState({
minvalue:workslist.max_num,
setvalue:"大于",
minmaxtype:true
})
return
}else{
this.setState({
minmaxtype:false
})
}
let newlist =memberslist; let newlist =memberslist;
let newcheckedValues=checkedValues; let newcheckedValues=checkedValues;
let selects=[]; let selects=[];
@ -382,17 +388,17 @@ class GraduationTasksSubmitnew extends Component{
} }
if(workslist&&workslist.task_type===2){ if(workslist&&workslist.task_type===2){
if(userids!=undefined){ if(userids!=undefined){
if(userids.length<2){ if(userids.length<workslist.min_num){
this.setState({ this.setState({
minvalue:2, minvalue:workslist.min_num,
setvalue:"小于", setvalue:"小于",
minmaxtype:true minmaxtype:true
}) })
return return
}else if(userids.length>5){ }else if(userids.length>workslist.max_num){
this.setState({ this.setState({
minvalue:5, minvalue:workslist.max_num,
setvalue:"大于", setvalue:"大于",
minmaxtype:true minmaxtype:true
}) })
@ -405,7 +411,15 @@ class GraduationTasksSubmitnew extends Component{
spinnings:true spinnings:true
}) })
let id=this.props.match.params.task_Id; let id=this.props.match.params.task_Id;
if(fileList.length === 0){
this.setState({
shixunsreplace:true,
})
return
}
let url="/graduation_tasks/"+id+"/graduation_works.json"; let url="/graduation_tasks/"+id+"/graduation_works.json";
axios.post(url, { axios.post(url, {
@ -471,7 +485,7 @@ render(){
multiple: true, multiple: true,
// https://github.com/ant-design/ant-design/issues/15505 // https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
showUploadList: false, // showUploadList: false,
action: `${getUrl()}/api/attachments.json`, action: `${getUrl()}/api/attachments.json`,
onChange: this.handleChange, onChange: this.handleChange,
onRemove: this.onAttachmentRemove, onRemove: this.onAttachmentRemove,
@ -593,37 +607,37 @@ render(){
</Button> </Button>
<span className={"color-grey-9"}>(单个文件150M以内)</span> <span className={"color-grey-9"}>(单个文件150M以内)</span>
</Upload> </Upload>
<style> {/*<style>*/}
{ {/*{*/}
` {/*`*/}
.maxwidth500{ {/*.maxwidth500{*/}
max-width:500px; {/*max-width:500px;*/}
overflow: hidden; {/*overflow: hidden;*/}
text-overflow: ellipsis; {/*text-overflow: ellipsis;*/}
white-space: nowrap; {/*white-space: nowrap;*/}
color: #05101a; {/*color: #05101a;*/}
} {/*}*/}
` {/*`*/}
} {/*}*/}
</style> {/*</style>*/}
{this.state.fileList.length===0?"":this.state.fileList.map((item,key)=>{ {/*{this.state.fileList.length===0?"":this.state.fileList.map((item,key)=>{*/}
return( {/*return(*/}
<p className="color-grey mt10" key={key} > {/*<p className="color-grey mt10" key={key} >*/}
<a className="color-grey fl"> {/*<a className="color-grey fl">*/}
<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i> {/*<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i>*/}
</a> {/*</a>*/}
<span className="mr12 color9B9B maxwidth500 fl" length="58"> {/*<span className="mr12 color9B9B maxwidth500 fl" length="58">*/}
{item.name} {/*{item.name}*/}
</span> {/*</span>*/}
<span className="color656565 mt2 color-grey-6 font-12 mr8"> {/*<span className="color656565 mt2 color-grey-6 font-12 mr8">*/}
{item.response===undefined?"":bytesToSize(item.size)} {/*{item.response===undefined?"":bytesToSize(item.size)}*/}
</span> {/*</span>*/}
<i className="font-14 iconfont icon-guanbi " {/*<i className="font-14 iconfont icon-guanbi "*/}
id={item.response===undefined?"":item.response.id} {/*id={item.response===undefined?"":item.response.id}*/}
aria-hidden="true" onClick={()=>this.onAttachmentRemove(item.response===undefined?"":item.response.id&&item.response.id)}></i> {/*aria-hidden="true" onClick={()=>this.onAttachmentRemove(item.response===undefined?"":item.response.id&&item.response.id)}></i>*/}
</p> {/*</p>*/}
) {/*)*/}
})} {/*})}*/}
</div> </div>
@ -638,7 +652,7 @@ render(){
> >
<div> <div>
<div className={"fl ml20"}>成员要求25</div> <div className={"fl ml20"}>成员要求{workslist&&workslist.min_num}{workslist&&workslist.max_num}</div>
<input type="text" style={{width:"0px",height:"0px",display:"none"}} onKeyUp={(e) => this.onSearchKeywordKeyUp(e)} <input type="text" style={{width:"0px",height:"0px",display:"none"}} onKeyUp={(e) => this.onSearchKeywordKeyUp(e)}
onkeydown={(e)=>this.onSearchKeywordKeyUps(e)}/> onkeydown={(e)=>this.onSearchKeywordKeyUps(e)}/>

@ -7,15 +7,9 @@ import axios from 'axios';
import Modals from '../../../modals/Modals'; import Modals from '../../../modals/Modals';
import DownloadMessage from '../../../modals/DownloadMessage'; import DownloadMessage from '../../../modals/DownloadMessage';
import CoursesListType from '../../coursesPublic/CoursesListType'; import CoursesListType from '../../coursesPublic/CoursesListType';
import PublishModals from "../../coursesPublic/PublishModals";
import HomeworkModal from "../../coursesPublic/HomeworkModal"; import HomeworkModal from "../../coursesPublic/HomeworkModal";
import moment from 'moment'; import moment from 'moment';
const { Option} = Select; const { Option} = Select;
const CheckboxGroup = Checkbox.Group;
const confirm = Modal.confirm;
let GraduationTasksnewtype=true;
// const $ = window.$;
const Search = Input.Search;
const RadioGroup = Radio.Group; const RadioGroup = Radio.Group;
function range(start, end) { function range(start, end) {

@ -376,7 +376,7 @@ class GraduationTasksquestions extends Component{
width: '100%', width: '100%',
border: '1px solid transparent' border: '1px solid transparent'
}}> }}>
<div dangerouslySetInnerHTML={{__html: markdownToHTML(questionslist.description).replace(/▁/g,"▁▁▁")}}></div> <div className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML(questionslist.description).replace(/▁/g,"▁▁▁")}}></div>
</div>:"" </div>:""
} }

@ -0,0 +1,80 @@
import React, { useState, useEffect } from 'react'
import { trigger } from 'educoder'
import { Input, Checkbox } from "antd";
function CourseGroupChooser({ course_groups, isAdminOrCreator, item, index, arg_course_groups, checkAllValue
, coursesids, onCheckAllChange, joinCourseGroup }) {
const [state, setState] = useState({counter: 0})
const [search, setSearch] = useState('')
// useEffect(() => {
// console.log(' cdm')
// return () => {
// console.log(' cwum')
// };
// // , [state.counter] 加了这个后onClick就消失了 加错位置了?
// }, [state.counter] )
// TODO 为什么每次onClick都会执行 cwum
// const add1ToCounter = () => {
// const newCounterValue = state.counter + 1
// setState({ counter: newCounterValue })
// }
/**
that.state.groupSearchValue
that.setState({groupSearchValue: e.target.value})
that.onCheckAllChange(e, item, index) - onCheckAllChange(e, item, index)
that.joinCourseGroup(checkedValues, item, index) - joinCourseGroup(checkedValues, item, index)
that.state.checkAllArray[index] - checkAllValue
*/
return (
<ul className="drop_down_menu" style={{"lef":"tunset", minWidth: '262px'}}>
{
course_groups && course_groups.length > 10?
(<p className="drop_down_search">
<Input placeholder="搜索" value={search} onChange={(e) => {setSearch(e.target.value)}} allowClear/>
</p>):
''
}
<Checkbox.Group onChange={(checkedValues) => joinCourseGroup(checkedValues, item, index)}
value={arg_course_groups.map(item => item.id)}
disabled={!isAdminOrCreator} className="mainGroup"
>
{course_groups && course_groups.length > 1 && <li key={'_all' + index} >
{/* 防止被外面group包裹 */}
<Checkbox.Group>
<Checkbox
checked={checkAllValue}
style={{ marginRight: '6px' }} onClick={(e) => onCheckAllChange(e, item, index)} onChange={() => {}}
>全选</Checkbox>
</Checkbox.Group>
</li>}
{
course_groups && course_groups.filter((item) => {
return (!search || item.name.indexOf(search) != -1)
}).map((item,key)=>{
return(
<li key={item.id} value={item.id} >
<Checkbox value={item.id}
style={{ marginRight: '6px' }}
></Checkbox>
{item.name}
</li>
)
})
}
</Checkbox.Group>
<p className="drop_down_btn">
<a href="javascript:void(0)" className="color-grey-6"
onClick={() => trigger('groupAdd', coursesids)}
>添加分班...</a>
</p>
</ul>
)
}
export default CourseGroupChooser

@ -21,6 +21,7 @@ import { from } from "array-flatten";
import AddGraduationGroupModal from './modal/AddGraduationGroupModal' import AddGraduationGroupModal from './modal/AddGraduationGroupModal'
import AddAdminModal from './modal/AddAdminModal' import AddAdminModal from './modal/AddAdminModal'
import { ROLE_TEACHER_NUM, ROLE_ASSISTANT_NUM } from './common' import { ROLE_TEACHER_NUM, ROLE_ASSISTANT_NUM } from './common'
import CourseGroupChooser from './CourseGroupChooser'
const Search = Input.Search; const Search = Input.Search;
const ROLE_ADMIN = "管理员" const ROLE_ADMIN = "管理员"
@ -95,49 +96,13 @@ function buildColumns(that) {
{ isAdmin && { isAdmin &&
<React.Fragment> <React.Fragment>
<i className="iconfont icon-xiajiantou font-12 ml2"></i> <i className="iconfont icon-xiajiantou font-12 ml2"></i>
{!noGroups && <ul className="drop_down_menu" style={{"lef":"tunset", minWidth: '262px'}}> {!noGroups && <CourseGroupChooser
{ {...{course_groups, isAdminOrCreator, item, index, arg_course_groups,
course_groups && course_groups.length > 10? checkAllValue: that.state.checkAllArray[index],
(<p className="drop_down_search"> joinCourseGroup: that.joinCourseGroup,
<Input placeholder="搜索" value={that.state.groupSearchValue} onChange={(e) => {that.setState({groupSearchValue: e.target.value})}} allowClear/> onCheckAllChange: that.onCheckAllChange,
</p>): coursesids: that.props.coursesids }}
'' ></CourseGroupChooser>}
}
{course_groups && course_groups.length > 1 && <li key={'_all' + index} >
{/* 防止被外面group包裹 */}
<Checkbox.Group>
<Checkbox
checked={that.state.checkAllArray[index]}
style={{ marginRight: '6px' }} onClick={(e) => that.onCheckAllChange(e, item, index)} onChange={() => {}}
>全选</Checkbox>
</Checkbox.Group>
</li>}
<Checkbox.Group onChange={(checkedValues) => that.joinCourseGroup(checkedValues, item, index)}
value={arg_course_groups.map(item => item.id)}
disabled={!isAdminOrCreator}
>
{
course_groups && course_groups.filter((item) => {
return (!that.state.groupSearchValue || item.name.indexOf(that.state.groupSearchValue) != -1)
}).map((item,key)=>{
return(
<li key={key} value={item.id} >
<Checkbox value={item.id}
style={{ marginRight: '6px' }}
></Checkbox>
{item.name}
</li>
)
})
}
<p className="drop_down_btn">
<a href="javascript:void(0)" className="color-grey-6"
onClick={() => trigger('groupAdd', that.props.coursesids)}
>添加分班...</a>
</p>
</Checkbox.Group>
</ul>}
</React.Fragment> } </React.Fragment> }
</span> </span>
</ConditionToolTip>) </ConditionToolTip>)
@ -328,7 +293,7 @@ class studentsList extends Component{
}); });
} }
joinCourseGroup = (ids, item, index) => { joinCourseGroup = (ids, item, index) => {
console.log('join ', ids, item) // console.log('join ', ids, item)
const courseId = this.props.match.params.coursesId const courseId = this.props.match.params.coursesId
@ -663,6 +628,11 @@ class studentsList extends Component{
></Titlesearchsection> ></Titlesearchsection>
<style>{` <style>{`
/* CourseGroupChooser */
.drop_down_menu .mainGroup.ant-checkbox-group {
max-height: 380px;
overflow-y: auto;
}
.task_menu_ul .ant-menu-item, .task_menu_ul .ant-menu-submenu-title{ .task_menu_ul .ant-menu-item, .task_menu_ul .ant-menu-submenu-title{
padding:0px; padding:0px;
margin-right: 30px; margin-right: 30px;
@ -676,7 +646,7 @@ class studentsList extends Component{
} }
`}</style> `}</style>
<div className="mt20 edu-back-white padding20 teacherList"> <div className="mt20 edu-back-white padding20 teacherList">
<div className="clearfix stu_head" style={{paddingLeft: '15px'}}> {filterKey == '1' && <div className="clearfix stu_head" style={{paddingLeft: '15px'}}>
{ isAdminOrTeacher && hasGraduationModule && <Checkbox className="fl" onChange={this.onCheckAll} checked={checkAllValue} >已选 {checkBoxValues.length} </Checkbox> } { isAdminOrTeacher && hasGraduationModule && <Checkbox className="fl" onChange={this.onCheckAll} checked={checkAllValue} >已选 {checkBoxValues.length} </Checkbox> }
{ filterKey == '1' && <div className="studentList_operation_ul"> { filterKey == '1' && <div className="studentList_operation_ul">
{ hasGraduationModule && isAdminOrTeacher && <li className="li_line drop_down"> { hasGraduationModule && isAdminOrTeacher && <li className="li_line drop_down">
@ -715,7 +685,7 @@ class studentsList extends Component{
</ul> </ul>
</li> */} </li> */}
</div> } </div> }
</div> </div>}
<Spin size="large" spinning={this.state.isSpin}> <Spin size="large" spinning={this.state.isSpin}>
<div className="clearfix stu_table"> <div className="clearfix stu_table">
<Checkbox.Group style={{ width: '100%' }} onChange={this.onCheckBoxChange} value={checkBoxValues}> <Checkbox.Group style={{ width: '100%' }} onChange={this.onCheckBoxChange} value={checkBoxValues}>

@ -160,7 +160,7 @@ class CommitSummary extends Component{
max: 5000, message: '最大限制为5000个字符', max: 5000, message: '最大限制为5000个字符',
}], }],
})( })(
<TPMMDEditor ref={this.mdRef} placeholder={'请在此输入帖子详情,最大限制为5000个字符'} <TPMMDEditor ref={this.mdRef} placeholder={'请在此输入总结内容,最多5000个字符'}
mdID={'courseMessageMD'} initValue={this.state.description} className="courseMessageMD"></TPMMDEditor> mdID={'courseMessageMD'} initValue={this.state.description} className="courseMessageMD"></TPMMDEditor>
)} )}
</div> </div>

@ -751,7 +751,7 @@ class ShixunStudentWork extends Component {
</style> </style>
{data&&data? {data&&data?
<div> <div style={{display:duplicatechecking===false?"":"none"}}>
<ul className="clearfix" style={{padding: '20px 16px 10px'}}> <ul className="clearfix" style={{padding: '20px 16px 10px'}}>
<li className="clearfix "> <li className="clearfix ">

@ -1,5 +1,5 @@
import React, {Component} from "react"; import React, {Component} from "react";
import {WordsBtn} from 'educoder'; import {WordsBtn,markdownToHTML} from 'educoder';
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider,InputNumber, Tag,DatePicker,Radio,Tooltip,Spin} from "antd"; import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider,InputNumber, Tag,DatePicker,Radio,Tooltip,Spin} from "antd";
import {Link,Switch,Route,Redirect} from 'react-router-dom'; import {Link,Switch,Route,Redirect} from 'react-router-dom';
import axios from 'axios'; import axios from 'axios';
@ -13,12 +13,10 @@ import 'codemirror/mode/cmake/cmake';
import 'codemirror/mode/xml/xml'; import 'codemirror/mode/xml/xml';
import 'codemirror/mode/javascript/javascript'; import 'codemirror/mode/javascript/javascript';
import 'codemirror/mode/clike/clike'; import 'codemirror/mode/clike/clike';
import '../css/members.css'; import '../css/members.css';
import "../common/formCommon.css"; import "../common/formCommon.css";
import '../css/Courses.css'; import '../css/Courses.css';
import './style.css'; import './style.css';
import moment from 'moment';
import 'moment/locale/zh-cn'; import 'moment/locale/zh-cn';
class ShixunWorkReport extends Component { class ShixunWorkReport extends Component {
@ -172,7 +170,6 @@ class ShixunWorkReport extends Component {
<style> <style>
{` {`
.personalsummary{ .personalsummary{
height:115px;
border:1px solid rgba(235,235,235,1); border:1px solid rgba(235,235,235,1);
border-radius:2px; border-radius:2px;
} }
@ -194,7 +191,9 @@ class ShixunWorkReport extends Component {
</style> </style>
<div className={"pad040"}> <div className={"pad040"}>
<div className={"personalsummary"}> <div className={"personalsummary"}>
{data&&data.work_description}
<div className={"markdown-body"}
dangerouslySetInnerHTML={{__html: markdownToHTML(data&&data.work_description).replace(/▁/g, "▁▁▁")}}></div>
</div> </div>
</div> </div>
</div> </div>

@ -184,10 +184,10 @@ class ShixunWorkModal extends Component{
if (response.data.status === 0) { if (response.data.status === 0) {
this.props.updatas() this.props.updatas()
this.props.issCancel() this.props.issCancel()
notification.open({ // notification.open({
message:"提示", // message:"提示",
description: response.data.message // description: response.data.message
}); // });
this.props.history.replace(`/courses/${this.props.match.params.coursesId}/shixun_homeworks/${this.props.match.params.homeworkid}/student_work`); this.props.history.replace(`/courses/${this.props.match.params.coursesId}/shixun_homeworks/${this.props.match.params.homeworkid}/student_work`);
}else if(response.data.status === -1){ }else if(response.data.status === -1){
notification.open({ notification.open({

@ -509,7 +509,7 @@ class Workquestionandanswer extends Component {
} }
</style> </style>
<div className={"font-16 color-dark fl pl20 "}> <div className={"font-16 color-dark fl pl20 "}>
<div <div className={"markdown-body"}
dangerouslySetInnerHTML={{__html: markdownToHTML(jobsettingsdata.data.description).replace(/▁/g, "▁▁▁")}}></div> dangerouslySetInnerHTML={{__html: markdownToHTML(jobsettingsdata.data.description).replace(/▁/g, "▁▁▁")}}></div>
{/* /!*{}}></div> {/* /!*{}}></div>
{/* /!*{jobsettingsdata.data.description}*!/*/} {/* /!*{jobsettingsdata.data.description}*!/*/}
@ -559,7 +559,7 @@ class Workquestionandanswer extends Component {
<div className="pl20 markdown-body" style={{"padding": "10px 10px 10px 20px"}}> <div className="pl20 markdown-body" style={{"padding": "10px 10px 10px 20px"}}>
{jobsettingsdata === undefined ? "无" : jobsettingsdata === null ? "无" : jobsettingsdata === "null" ? "无" : {jobsettingsdata === undefined ? "无" : jobsettingsdata === null ? "无" : jobsettingsdata === "null" ? "无" :
jobsettingsdata.data.explanation === undefined ? "无" : jobsettingsdata.data.explanation === null ? "无" : jobsettingsdata.data.explanation === undefined ? "无" : jobsettingsdata.data.explanation === null ? "无" :
<div <div className={"markdown-body"}
dangerouslySetInnerHTML={{__html: markdownToHTML(jobsettingsdata.data.explanation).replace(/▁/g, "▁▁▁")}}></div> dangerouslySetInnerHTML={{__html: markdownToHTML(jobsettingsdata.data.explanation).replace(/▁/g, "▁▁▁")}}></div>
} }

@ -58,6 +58,14 @@ class MainContent extends Component {
font-family: 微软雅黑,宋体 !important; font-family: 微软雅黑,宋体 !important;
overflow: hidden !important; overflow: hidden !important;
} }
.can-drag {
width: 100%;
height: 100%;
z-index: 100;
position: fixed;
cursor: col-resize;
top: 0px;
}
`}</style> `}</style>
<div className="-layout -stretch -fit labelN" id="game_show_content"> <div className="-layout -stretch -fit labelN" id="game_show_content">
<div className="split-panel--first -layout -vertical -flex -relative -flex-basic40" <div className="split-panel--first -layout -vertical -flex -relative -flex-basic40"
@ -67,7 +75,7 @@ class MainContent extends Component {
{/* 左侧任务说明等功能的区域 */} {/* 左侧任务说明等功能的区域 */}
<LeftViewContainer {...newProps}></LeftViewContainer> <LeftViewContainer {...newProps}></LeftViewContainer>
</div> </div>
<div id="can-drag" className="can-drag" style={{display: 'none'}}></div>
<div className="b-label -layout" style={{left: '687px'}}> <div className="b-label -layout" style={{left: '687px'}}>
<div className="resize-helper "> <div className="resize-helper ">
<Button variant="fab" aria-label="Swap" mini onClick={this.onResizeButtonClick}> <Button variant="fab" aria-label="Swap" mini onClick={this.onResizeButtonClick}>

@ -342,7 +342,7 @@ class PathDetailIndex extends Component{
<div className="color-grey-6 clearfix"> <div className="color-grey-6 clearfix">
<div id="shixuns_propaedeutics" className="new_li fl" style={{"padding":" 0px","textAlign": "justify;"}}> <div id="shixuns_propaedeutics" className="new_li fl" style={{"padding":" 0px","textAlign": "justify;"}}>
{detailInfoList === undefined ? "" :detailInfoList.description===null?"": {detailInfoList === undefined ? "" :detailInfoList.description===null?"":
<div dangerouslySetInnerHTML={{__html: markdownToHTML(detailInfoList.description).replace(/▁/g,"▁▁▁")}}></div> <div className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML(detailInfoList.description).replace(/▁/g,"▁▁▁")}}></div>
} }
</div> </div>
</div> </div>

@ -304,7 +304,7 @@ class Challenges extends Component {
id="challenge_editorMd_description"> id="challenge_editorMd_description">
<p id="ReactMarkdown" style={{overflow:'hidden'}}> <p id="ReactMarkdown" style={{overflow:'hidden'}}>
{ChallengesDataList === undefined ? "" :ChallengesDataList&&ChallengesDataList.description===null?"": {ChallengesDataList === undefined ? "" :ChallengesDataList&&ChallengesDataList.description===null?"":
<div dangerouslySetInnerHTML={{__html: markdownToHTML(ChallengesDataList.description).replace(/▁/g,"▁▁▁")}}></div> <div className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML(ChallengesDataList.description).replace(/▁/g,"▁▁▁")}}></div>
} }
</p> </p>

Loading…
Cancel
Save