caishi 6 years ago
commit 1c3c85b480

File diff suppressed because one or more lines are too long

@ -106,6 +106,7 @@
position: absolute;
top: -30px;
left: -30px;
left: -24px;
z-index: 999;
}

@ -484,7 +484,7 @@ class Comments extends Component {
const goldRewardInputErrorObj = goldRewardInputError ? {'error': 'error'} : {}
return (
<div className="fit -scroll">
<div className="fit -scroll" style={{ 'overflow-x': 'hidden'}}>
{ usingAntdModal ? <Modals

@ -0,0 +1,78 @@
import React,{ Component } from "react";
import {Tooltip, Modal, Input } from 'antd'
import moment from 'moment'
import { getUrl, WordsBtn } from 'educoder'
import axios from 'axios'
class AddDirModal extends Component{
constructor(props){
super(props);
this.state = {
}
}
onInput = (e) => {
this.setState({
inputValue: e.target.value
})
}
open = () => {
this.setState({ visible: true, inputValue: '' })
}
onSave = () => {
let coursesId = this.props.match.params.coursesId;
const url = `/courses/${coursesId}/boards.json`
let { inputValue } = this.state;
axios.post(url,{
name: inputValue
}).then((response)=>{
if (response.data.status == 0) {
this.onCancel()
this.props.showNotification('添加成功')
this.props.addSuccess && this.props.addSuccess()
}
}).catch((error)=>{
console.log(error)
})
}
onCancel = () => {
this.setState({ visible: false, inputValue: '' })
}
render(){
let { inputValue, visible } = this.state;
const { title } = this.props;
return(
<Modal
keyboard={false}
title={title}
visible={visible}
className={"Navmodal"}
closable={false}
footer={null}
destroyOnClose={true}
centered={true}
>
<div className="df">
<div className={"fl mt5"}>{this.props.label}</div>
<Input placeholder={this.props.inputPlaceholder || '示例讨论小组A'}
className={"input-flex-35 greyInput fl"}
maxLength="60"
value={inputValue}
onInput={this.onInput}
/>
</div>
{/* {this.state.NavmodalValuetype===true?<span className={"color-red"}>
{this.state.NavmodalValues}
</span>:""} */}
{/* this.state.NavmodalValuetype===true?"clearfix mt20 edu-txt-center": */}
<div className={"clearfix mt50 edu-txt-center"}>
<a className="task-btn mr30" onClick={this.onCancel}>取消</a>
<a className="task-btn task-btn-orange" onClick={this.onSave}>确定</a>
</div>
</Modal>
)
}
}
export default AddDirModal;

@ -3,13 +3,13 @@ import React,{ Component } from "react";
import {
Form, Input, InputNumber, Switch, Radio,
Slider, Button, Upload, Icon, Rate, Checkbox, message,
Row, Col, Select, Modal
Row, Col, Select, Modal, Divider
} from 'antd';
import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor';
import axios from 'axios'
import './board.css'
import "../common/formCommon.css"
import AddDirModal from './AddDirModal'
import { RouteHOC } from './common.js'
import CBreadcrumb from '../common/CBreadcrumb'
import {getUploadActionUrl, bytesToSize, uploadNameSizeSeperator, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll} from 'educoder';
@ -29,14 +29,14 @@ class BoardsNew extends Component{
boards: []
}
}
componentDidMount = () => {
const topicId = this.props.match.params.topicId
addSuccess = () => {
this.fetchBoards()
}
fetchBoards = () => {
const isEdit = this.isEdit
const boardId = this.props.match.params.boardId
const boardsUrl = `/courses/board_list.json?board_id=${boardId}`
const isEdit = !!topicId
const boardsUrl = `/courses/board_list.json?board_id=${boardId}`
axios.get(boardsUrl, { })
.then((response) => {
if (response.data.status == 0) {
@ -57,8 +57,17 @@ class BoardsNew extends Component{
.catch(function (error) {
console.log(error);
});
}
componentDidMount = () => {
const topicId = this.props.match.params.topicId
const isEdit = !!topicId
this.isEdit = isEdit
const boardId = this.props.match.params.boardId
this.fetchBoards()
if (isEdit) {
const url = `/messages/${topicId}.json`
axios.get(url, {
@ -260,6 +269,12 @@ class BoardsNew extends Component{
return(
<div className="newMain ">
<AddDirModal {...this.props}
title="添加目录"
label="目录名称"
ref="addDirModal"
addSuccess={this.addSuccess}
></AddDirModal>
<style>{`
.courseForm .ant-form {
}
@ -312,7 +327,17 @@ class BoardsNew extends Component{
{getFieldDecorator('select_board_id', {
// initialValue: '3779',
})(
<Select style={{ width: 230 }}>
<Select style={{ width: 230 }}
dropdownRender={menu => (
<div>
{menu}
<Divider style={{ margin: '4px 0' }} />
<div style={{ padding: '8px', cursor: 'pointer' }} onMouseDown={() => this.refs['addDirModal'].open()}>
<Icon type="plus" /> 添加目录
</div>
</div>
)}
>
{this.state.boards.map(item => {
return (
<Option value={item.id}>{item.name}</Option>

@ -71,9 +71,10 @@ function buildColumns(that, student_works) {
width: 90,
dataIndex: 'user_name',
key: 'user_name',
// width: '110px',
render: (text, record) => (
<div style={{
width: '110px',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap'

@ -242,15 +242,17 @@ class CommonReply extends Component{
padding-bottom: 56px !important;
}
.course-message .commentInput.mockInputWrapper {
padding-bottom: 30px !important;
padding-bottom: 20px !important;
}
.course-message .memoReplies {
border-top: 1px solid #EDEDED;
/* border-top: 1px solid #EDEDED; */
padding-bottom: 30px;
}
`}</style>
<MemoDetailMDEditor ref="editor" memo={memo} usingMockInput={true} placeholder="说点什么"
height={160} showError={true}
replyComment={this.replyComment}
commentsLength={comments ? comments.length : 0}
></MemoDetailMDEditor>
{/* bor-bottom-greyE */}
<div className="padding40 memoReplies commentsDelegateParent"

@ -22,6 +22,7 @@ class Associationmodel extends Component{
projects:undefined,
projectvalue:undefined,
projectvaluetype:false,
searchtypes:false
}
}
@ -38,10 +39,10 @@ class Associationmodel extends Component{
search: search
}
}).then((result)=>{
console.log(result)
if(result.status===200){
this.setState({
projects:result.data.projects
projects:result.data.projects,
searchtypes:search===undefined&&result.data.projects.length==0?true:false
})
}
@ -58,13 +59,11 @@ class Associationmodel extends Component{
goback=()=>{
this.props.funlist()
this.props.Cancel()
console.log(this.props)
this.setState({
Modalstype:false,
})
this.props.funlist()
this.props.Cancel()
}
@ -80,13 +79,13 @@ class Associationmodel extends Component{
if(result.status===200){
if(result.data.status===0){
this.setState({
Modalstype:true,
Modalstopval:result.data.message,
ModalSave:this.goback,
loadtype:true
})
this.props.funlist()
// this.setState({
// Modalstype:true,
// Modalstopval:result.data.message,
// ModalSave:this.goback,
// loadtype:true
// })
this.goback
}
}
@ -96,7 +95,9 @@ class Associationmodel extends Component{
})
}
Saves=()=>{
let {projectvalue}=this.state;
let {projectvalue,searchtypes}=this.state
if(searchtypes===false){
if(projectvalue===undefined||projectvalue===""){
this.setState({
projectvaluetype:true,
@ -114,29 +115,25 @@ class Associationmodel extends Component{
project_id: projectvalue
}
}).then((result)=>{
if(result.status===200){
if(result.data.is_relate===false){
this.setSaves()
}else{
this.setState({
Modalstype:true,
Modalstopval:"该项目已被"+result.data.relate_user+"关联",
ModalSave:this.ModalSave,
loadtype:true
})
}
}
}).catch((error)=>{
console.log(error)
})
}else{
this.goback()
}
}
onChange = (e) => {
@ -190,7 +187,7 @@ class Associationmodel extends Component{
destroyOnClose={true}
>
<div className="task-popup-content">
<p className="task-popup-text-center font-16">
{this.state.searchtypes===false? <p className="task-popup-text-center font-16">
<Search
placeholder="请输入项目名称进行搜索"
@ -201,31 +198,55 @@ class Associationmodel extends Component{
autoComplete="off"
></Search>
</p>
<div className={"Association mb20"}>
</p>:""}
<style>
{
`
.project_namestyle{
width: 470px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
`
}
</style>
{this.state.searchtypes===false?<div className={"Association mb20"} style={{
paddingLeft:'0px'
}}>
<RadioGroup onChange={this.onChange} value={projectvalue}>
{projects&&projects.map((item,key)=>{
return(
<div key={key} style={{
width: '375px',
height: '30px'
}}>
<Radio value={item.project_id} className="fl "></Radio>
<div className={"fl ml5"}>{item.project_name}</div>
<div className={"fl ml5 project_namestyle"}>{item.project_name}</div>
</div>
)
})}
</RadioGroup>
</div>:
<div style={{
paddingLeft:'0px'
}}>
<div style={{
margin:'0px 20%'
}}>
你当前尚未管理任何项目请先 <span><a style={{color:'#1890ff'}} href={"/projects/new"}>创建项目</a> </span>
</div>
</div>}
{projectvaluetype===true?<span className={"color-red ml20 "}>请先选择项目</span>:""}
<div className="clearfix mt30 edu-txt-center mb10">
<div className="clearfix mt25 edu-txt-center mb10">
<a className="task-btn color-white mr80" onClick={this.props.Cancel}>取消</a>
<a className="task-btn task-btn-orange" onClick={this.Saves}>确认</a>
</div>

@ -613,7 +613,7 @@ class Selectsetting extends Component{
{item.name}
</span>
<span className="color656565 mt2 color-grey-6 font-12 mr8">
{item.response===undefined?"":isNaN(this.props.bytesToSize(item.response.filesize))?"":this.props.bytesToSize(item.response.filesize)}
{item.response===undefined?"":isNaN(this.props.bytesToSize(item.response.filesize))?"123":this.props.bytesToSize(item.response.filesize)}
</span>
<i className="font-14 iconfont icon-guanbi "
id={item.response===undefined?"":item.response.id}

@ -1314,8 +1314,8 @@ a.white-btn.use_scope-btn:hover{
.Association{
width: 100%;
height: 400px;
padding: 20px;
height: 240px;
margin-top: 14px;
overflow: auto;
}

@ -98,7 +98,7 @@ class SingleEditor extends Component{
}
}
if(!answerArray || answerArray.length == 0) {
this.props.showNotification('请先点击本选择题的正确选项'); return;
this.props.showNotification('请先点击选择本选择题的正确选项'); return;
}
if(!question_title) {
this.props.showNotification('请先输入题目题干'); return;

@ -2,7 +2,7 @@ import React,{Component} from "React";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Spin,Tooltip} from "antd";
import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
import { WordsBtn,getUrl } from 'educoder';
import { WordsBtn,getUrl ,bytesToSize} from 'educoder';
import axios from 'axios';
import Modals from '../../../modals/Modals';
const Search = Input.Search;
@ -80,7 +80,8 @@ class GraduationTasksSubmitedit extends Component{
let workId=this.props.match.params.work_Id;
let {workslist}=this.state
let task_id=workslist&&workslist.task_id;
window.location.href="/courses/"+coursesId+"/graduation_tasks/"+task_id+"/"+workId+"/works/edit";
// window.location.href="/courses/"+coursesId+"/graduation_tasks/"+task_id+"/"+workId+"/works/edit";
window.location.href="/courses/"+coursesId+"/graduation_tasks/"+workId+"/appraise";
}
handleSubmit=(e) => {
@ -248,7 +249,7 @@ class GraduationTasksSubmitedit extends Component{
onAttachmentRemove = (file) => {
let {attachments,fileList}=this.state;
const url = `/attachments/${file.uid===undefined?file.id:file.uid}.json`
const url = `/attachments/${file}.json`
axios.delete(url, {
})
.then((response) => {
@ -576,7 +577,7 @@ class GraduationTasksSubmitedit extends Component{
{item.name}
</span>
<span className="color656565 mt2 color-grey-6 font-12 mr8">
{item.response===undefined?"":isNaN(this.props.bytesToSize(item.response.filesize))?"":this.props.bytesToSize(item.response.filesize)}
{item.response===undefined?"":bytesToSize(item.size)}
</span>
<i className="font-14 iconfont icon-guanbi "
id={item.response===undefined?"":item.response.id}
@ -592,7 +593,9 @@ class GraduationTasksSubmitedit extends Component{
{workslist&&workslist.task_type===1?"":
<div className="stud-class-set pd20 coursenavbox edu-back-white">
<div className="stud-class-set pd20 coursenavbox edu-back-white"
style={{borderTop:'1px solid #ccc'}}
>
<Form.Item
label="小组成员"
@ -632,6 +635,7 @@ class GraduationTasksSubmitedit extends Component{
<div className={"members fl"}
style={{paddingLeft: '9px'}}
onScroll={this.contentViewScroll}>
<CheckboxGroup value={task_status} onChange={this.funtaskstatus} style={{ paddingTop: '4px'}}>
@ -653,9 +657,7 @@ class GraduationTasksSubmitedit extends Component{
})
}
disabled={item.commit_status===true?true:false} className="fl "></Checkbox>
<Tooltip placement="bottom" title={item.user_name}>
<div className={"fl ml5 fonthidden width87"} style={{width: '70px'}}>{item.user_name}</div>
</Tooltip>
<div className={"fl ml5 fonthidden width87"} style={{width: '70px'}} title={item.user_name}>{item.user_name}</div>
<div className={"fl ml5 fonthidden width87 color-grey-9"} style={{width: '70px'}}>{item.group_name}</div>
<div className={"fl ml5 color-grey-9 fonthidden width87"} style={{width: '70px'}}>{item.student_id}</div>
<div className={"fl ml20"}>{item.commit_status===false?<span className={"color-orange"}>已提交</span> :""}</div>
@ -680,12 +682,10 @@ class GraduationTasksSubmitedit extends Component{
height: '30px',
display:item.user_name===undefined?"none":""
}}>
<Tooltip placement="bottom" title={item.user_name}>
<div className={"fl ml5 fonthidden width87"} style={{width: '50px'}}>{item.user_name}</div>
</Tooltip>
<div className={"fl ml5 fonthidden width87"} style={{width: '50px'}} title={item.user_name}>{item.user_name}</div>
<div className={"fl ml5 fonthidden width87 color-grey-9"}>{item.group_name}</div>
<div className={"fl ml5 color-grey-9 fonthidden width87"}>{item.student_id}</div>
{key>0?<div className={"fl ml20"}><i className={"iconfont icon-shanchudiao fl "} style={{marginTop:'-4px'}} onClick={()=>this.delecttask_status(item.user_id)}></i></div>:""}
{key>0?<div className={"fr ml20"}><i className={"iconfont icon-shanchudiao fl color-grey-9"} style={{marginTop:'-4px'}} onClick={()=>this.delecttask_status(item.user_id)}></i></div>:""}
</div>
)
})}

@ -2,7 +2,7 @@ import React,{Component} from "React";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal,Tooltip,Spin} from "antd";
import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
import { WordsBtn,getUrl,getImageUrl} from 'educoder';
import { WordsBtn,getUrl,getImageUrl,bytesToSize} from 'educoder';
import axios from 'axios';
import Modals from '../../../modals/Modals';
const Search = Input.Search;
@ -263,7 +263,7 @@ class GraduationTasksSubmitnew extends Component{
}
deleteAttachment = (file) => {
const url = `/attachments/${file.response ? file.response.id : file.uid}.json`
const url = `/attachments/${file}.json`
axios.delete(url, {
})
.then((response) => {
@ -446,7 +446,7 @@ render(){
multiple: true,
// https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false,
showUploadList: false,
action: `${getUrl()}/api/attachments.json`,
onChange: this.handleChange,
onRemove: this.onAttachmentRemove,
@ -545,12 +545,46 @@ render(){
</Button>
<span className={"color-grey-9"}>(单个文件150M以内)</span>
</Upload>
<style>
{
`
.maxwidth500{
max-width:500px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #05101a;
}
`
}
</style>
{this.state.fileList.length===0?"":this.state.fileList.map((item,key)=>{
return(
<p className="color-grey mt10" key={key} >
<a className="color-grey fl">
<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i>
</a>
<span className="mr12 color9B9B maxwidth500 fl" length="58">
{item.name}
</span>
<span className="color656565 mt2 color-grey-6 font-12 mr8">
{item.response===undefined?"":bytesToSize(item.size)}
</span>
<i className="font-14 iconfont icon-guanbi "
id={item.response===undefined?"":item.response.id}
aria-hidden="true" onClick={()=>this.onAttachmentRemove(item.response===undefined?"":item.response.id&&item.response.id)}></i>
</p>
)
})}
</div>
{workslist&&workslist.task_type===1?"":
<div className="stud-class-set pd20 coursenavbox edu-back-white">
<div className="stud-class-set pd20 coursenavbox edu-back-white"
style={{borderTop:'1px solid #ccc'}}
>
<Form.Item
label="小组成员"
@ -605,6 +639,7 @@ render(){
<div className={"ml20"} style={{width:"100%"}}>
<div className={"members fl"}
style={{paddingLeft: '9px'}}
onScroll={this.contentViewScroll}>
<CheckboxGroup value={task_status} onChange={this.funtaskstatus} style={{ paddingTop: '4px'}}>
{memberslist===undefined?"":memberslist.members.length===0?
@ -626,9 +661,7 @@ render(){
})
}
disabled={item.commit_status===true?true:false} className="fl "></Checkbox>
<Tooltip placement="bottom" title={item.user_name}>
<div className={"fl ml5 fonthidden width87"}>{item.user_name}</div>
</Tooltip>
<div className={"fl ml5 fonthidden width87"} title={item.user_name} >{item.user_name}</div>
<div className={"fl ml5 fonthidden width87 color-grey-9"} title={item.group_name}>{item.group_name}</div>
<div className={"fl ml5 color-grey-9 fonthidden width87"} title={item.student_id}>{item.student_id}</div>
<div className={"fl ml20"}>{item.commit_status===true?<span className={"color-orange"}>已提交</span> :""}</div>
@ -657,12 +690,10 @@ render(){
height: '30px',
display:item.user_name===undefined?"none":""
}}>
<Tooltip placement="bottom" title={item.user_name}>
<div className={"fl ml5 fonthidden width87"}>{item.user_name}</div>
</Tooltip>
<div className={"fl ml5 fonthidden width87"} title={item.user_name}>{item.user_name}</div>
<div className={"fl ml5 fonthidden width87 color-grey-9"}>{item.group_name}</div>
<div className={"fl ml5 color-grey-9 fonthidden width87"}>{item.student_id}</div>
{key>0?<div className={"fl ml20"}><i className={"iconfont icon-shanchudiao fl "} style={{marginTop:'-4px'}} onClick={()=>this.delecttask_status(item.user_id)}></i></div>:""}
{key>0?<div className={"fr ml20"}><i className={"iconfont icon-shanchudiao fl color-grey-9 "} style={{marginTop:'-4px'}} onClick={()=>this.delecttask_status(item.user_id)}></i></div>:""}
</div>
)

@ -213,7 +213,7 @@ class GraduationTasksappraise extends Component{
{/*<span className={"mr10 color9B9B"}>15M</span>*/}
{/*</div>*/}
{datalist&&datalist.attachments.map((item,key)=>{
{datalist&& datalist.attachments && datalist.attachments.map((item,key)=>{
return(
<div className="color-grey" key={key}>
<a className="color-grey ml20">
@ -258,7 +258,7 @@ class GraduationTasksappraise extends Component{
</div>
<div className="color-grey" key={key}>
<div className="color-grey">
{firelistdata===undefined?"":firelistdata.length===0?"":firelistdata.revise_attachments.map((item,key)=>{
return(

@ -304,7 +304,7 @@ class GraduationTasksedit extends Component{
{description===undefined?"":<Form labelCol={{ span: 5 }} wrapperCol={{ span: 12 }} onSubmit={this.handleSubmit} >
{/*内容*/}
<div className="stud-class-set bor-bottom-greyE pd20 edu-back-white">
<div className="stud-class-set bor-bottom-greyE pt20 pl20 pr20 pb0 edu-back-white">
<Form.Item label="类型">
{getFieldDecorator('tasktype', {
@ -323,13 +323,13 @@ class GraduationTasksedit extends Component{
<Form.Item label="任务标题" >
{getFieldDecorator('name', {
rules: [{ required: true, message: "请输入标题" }],
})(<Input placeholder="请输入任务名称,最大限制20个字符" value={name} onInput={this.changeTitle} className="searchView searchViewAfter" style={{"width":"100%"}} maxLength="60" addonAfter={String(title_num)}/>)}
})(<Input placeholder="请输入任务名称,最大限制60个字符" value={name} onInput={this.changeTitle} className="searchView searchViewAfter" style={{"width":"100%"}} maxLength="60" addonAfter={String(title_num)}/>)}
</Form.Item>
<input type="hidden" id='nametypes' />
</div>
<div className="stud-class-set pd20 coursenavbox edu-back-white">
<div className="stud-class-set pt20 pl20 pr20 pb0 coursenavbox edu-back-white">
<style>{`
.uploadBtn.ant-btn {
border: none;
@ -348,7 +348,7 @@ class GraduationTasksedit extends Component{
`}</style>
<Form.Item
label="内容"
style={{marginBottom:'0px'}}
>
{getFieldDecorator('description', {
rules: [{

@ -294,7 +294,7 @@ class GraduationTasksnew extends Component {
}
</style>
{/*内容*/}
<div className="stud-class-set bor-bottom-greyE pt20 pl20 pr20 edu-back-white">
<div className="stud-class-set bor-bottom-greyE pt20 pl20 pr20 pb25 edu-back-white">
<Form.Item label="类型" >
{getFieldDecorator('tasktype', {
@ -313,7 +313,7 @@ class GraduationTasksnew extends Component {
{getFieldDecorator('name', {
rules: [{required: true, message: "不能为空"}],
})(<Input placeholder="请输入任务名称最大限制60个字符" value={title_value} onInput={this.changeTitle}
className="searchView searchViewAfter mb20 h40" style={{"width": "100%"}} maxLength="60"
className="searchView searchViewAfter h40" style={{"width": "100%"}} maxLength="60"
addonAfter={String(title_num)}/>)}
</Form.Item>
<input type="hidden" id='nametypes' />

@ -317,73 +317,59 @@ class GraduationTaskssettingapp extends Component{
}
funcrosscomment=(e)=>{
let {latetime,end_time}=this.state;
let {latetime,end_time,allowlate}=this.state;
let newtime;
if(latetime!=null&&end_time!=null){
if(e.target.checked===true){
if(moment(latetime)>moment(end_time)){
newtime=moment(latetime)+604800000;
newtime=new Date(newtime)
}else if(moment(latetime)<moment(end_time)){
newtime=moment(end_time)+604800000;
newtime=new Date(newtime)
}
if(allowlate===1||allowlate===true){
if(latetime===null||latetime===""){
let newlatetime=moment(new Date()).add(7, 'days').format("YYYY-MM-DD HH:mm");
let newcommenttime=moment(new Date()).format("YYYY-MM-DD HH:mm");
this.setState({
latetime:newlatetime,
crosscomment:e.target.checked,
commenttime:moment(moment(newtime)).format("YYYY-MM-DD HH:mm"),
commenttime:newcommenttime
})
}else{
let newlatetime=moment(latetime).add(7, 'days').format("YYYY-MM-DD HH:mm");
let newcommenttime=moment(latetime).format("YYYY-MM-DD HH:mm");
this.setState({
latetime:newlatetime,
crosscomment:e.target.checked,
commenttime:undefined
commenttime:newcommenttime
})
}
}else if(latetime===null&&end_time!=null){
if(e.target.checked===true){
newtime=moment(end_time)+604800000;
newtime=new Date(newtime)
this.setState({
crosscomment:e.target.checked,
commenttime:newtime
})
}else{
if(end_time===null||end_time===""){
let newend_time=moment(new Date()).add(7, 'days').format("YYYY-MM-DD HH:mm");
let newcommenttime=moment(new Date()).add(8, 'days').format("YYYY-MM-DD HH:mm");
this.setState({
end_time:newend_time,
crosscomment:e.target.checked,
commenttime:undefined
})
}
}else if(latetime!=null&&end_time===null){
if(e.target.checked===true){
newtime=moment(latetime)+604800000;
newtime=new Date(newtime)
this.setState({
crosscomment:e.target.checked,
commenttime:newtime
commenttime:newcommenttime
})
}else{
let newend_time=moment(end_time).add(7, 'days').format("YYYY-MM-DD HH:mm");
let newcommenttime=moment(end_time).add(8, 'days').format("YYYY-MM-DD HH:mm");
this.setState({
end_time:newend_time,
crosscomment:e.target.checked,
commenttime:undefined
commenttime:newcommenttime
})
}
}else if(latetime===null&&end_time===null){
if(e.target.checked===true){
newtime=moment(new Date())+604800000;
newtime=new Date(newtime)
this.setState({
crosscomment:e.target.checked,
commenttime:newtime
})
}
}else{
this.setState({
crosscomment:e.target.checked,
commenttime:undefined
})
}
}
}
@ -588,7 +574,6 @@ class GraduationTaskssettingapp extends Component{
commenttimetype:false
})
}
debugger
if(moment(this.state.commenttime)<moment(publish_time)){
this.setState({
commenttimetype:true,

@ -560,6 +560,7 @@ class GraduationTaskssettinglist extends Component{
AssociationItems=()=>{
this.setState({
visibles:true
})
@ -1264,8 +1265,6 @@ class GraduationTaskssettinglist extends Component{
}
}
console.log(columns)
return(
<React.Fragment>
@ -1346,13 +1345,15 @@ class GraduationTaskssettinglist extends Component{
/>:""}
{/*关联项目*/}
{visibles===true?<Associationmodel
{visibles===true?
<Associationmodel
modalname={"关联项目"}
visible={visibles}
Cancel={this.Cancel}
Cancel={()=>this.Cancel()}
taskid={taskslistdata&&taskslistdata.task_id}
funlist={this.searchValue()}
/>:""}
funlist={()=>this.searchValue()}
/>
:""}
{taskslistdata&&taskslistdata?
// 教师列表
@ -1572,13 +1573,13 @@ class GraduationTaskssettinglist extends Component{
<span className="mr15 color-grey9">
<span className={"color-orange"}>{taskslistdata&&taskslistdata.uncommit_count}
</span> </span>
<Tooltip title={taskslistdata&&taskslistdata.left_time.status} placement="bottom">
{taskslistdata&&taskslistdata.left_time.status===null?"":<Tooltip title={taskslistdata&&taskslistdata.left_time.status} placement="bottom">
<span className="mr15 color-grey9">
{taskslistdata&&taskslistdata.left_time.status} :
<span className={"ml10 color-orange"}>
{taskslistdata&&taskslistdata.left_time.time}</span>
</span>
</Tooltip>
</Tooltip>}
</div>
:""}
@ -1833,13 +1834,13 @@ class GraduationTaskssettinglist extends Component{
<span className="mr15 color-grey9">
<span className={"color-orange"}>{taskslistdata&&taskslistdata.uncommit_count}
</span> </span>
<Tooltip title={taskslistdata&&taskslistdata.left_time.status} placement="bottom">
{taskslistdata&&taskslistdata.left_time.status===null?"":<Tooltip title={taskslistdata&&taskslistdata.left_time.status} placement="bottom">
<span className="mr15 color-grey9">
{taskslistdata&&taskslistdata.left_time.status} :
<span className={"ml10 color-orange"}>
{taskslistdata&&taskslistdata.left_time.time}</span>
</span>
</Tooltip>
</Tooltip>}
</div>
:""}

@ -36,7 +36,7 @@ class Graduationtaskitem extends Component{
</a>
<span className="t_area fl">{item.time}</span>
{/* 分数 */}
<span className="score_area fl">{item.score}</span>
{item.score && <span className="score_area fl">{item.score}</span>}
{ !item.is_invalid && item.delete && <Tooltip title={ "删除" } >
<i className="iconfont icon-shanchu mr5 fr" style={{marginLeft: '6px'}}

@ -40,6 +40,15 @@ const buildColumns = (that) => {
render: (id, student, index) => {
return (that.state.page - 1) * 20 + index + 1
}
}, {
title: '用户id',
dataIndex: 'login',
key: 'login',
align:'center',
className:"color-grey-6",
// render: (name, record) => {
// return <a className="color-dark" target="_blank" href={`/users/${record.login}`}>{name}</a>
// }
}, {
title: '姓名',
dataIndex: 'name',
@ -316,6 +325,7 @@ class studentsList extends Component{
}).then((result)=>{
if (result.data.status == 0) {
this.props.showNotification('移动成功')
this.setState({checkBoxValues: []})
this.fetchAll()
this.props.updataleftNavfun()

@ -33,6 +33,7 @@ function buildColumns(that) {
const { course_groups } = that.state
const columns = [{
title: '序号',
width: 28,
// dataIndex: 'name',
key: 'index',
render: (content, item, index) => {
@ -40,12 +41,13 @@ function buildColumns(that) {
}
},{
title: '用户ID',
width: 82,
dataIndex: 'login',
key: 'login'
}, {
title: '姓名',
dataIndex: 'name',
width: 160,
width: 140,
key: 'name',
render: (name, record) => {
return <a href={`/login/${record.login}`} target="_blank">{name}</a>
@ -57,7 +59,7 @@ function buildColumns(that) {
}]
that.state.course_groups && that.state.course_groups.length && columns.push({
title: <Tooltip title="仅能批阅指定分班的作品">管理权限</Tooltip>,
width: 230,
// width: 230,
key: 'course_groups',
dataIndex: 'course_groups',
// onClick={() => that.joinCourseGroup(item.id)}
@ -113,6 +115,7 @@ function buildColumns(that) {
if (hasGraduationModule) {
columns.push({
title: '答辩组',
width: 74,
key: 'graduation_group',
dataIndex: 'graduation_group',
render: text => (
@ -126,6 +129,8 @@ function buildColumns(that) {
columns.push({
title: '操作',
key: 'action',
width: 150,
align:'center',
render: (text, record) => {
if (record.application_id) {
return (

@ -91,6 +91,7 @@ class Listofworks extends Component {
unlimited: 0,
unlimitedtwo: 1,
code_review: false,
boolgalist:true,
columns: [
{
title: '序号',
@ -555,7 +556,7 @@ class Listofworks extends Component {
align: 'center',
width:'96px',
render: (text, record) => (
record.submitstate === "未提交" ? "--" :
record.submitstate === "未提交" ? <span style={{color:'#9A9A9A'}}>--</span>:
<span>
<a style={this.props.isNotMember() === true ? this.state.mystyles : this.state.mystyle}
onClick={() => this.Viewstudenttraininginformations(record)}>调分</a>
@ -778,7 +779,7 @@ class Listofworks extends Component {
// console.log(JSON.stringify(result))
let datalist = [];
var game_list = result.data.game_list
var boolgalist=true;
for (var i = 0; i < game_list.length; i++) {
datalist.push({
@ -789,6 +790,10 @@ class Listofworks extends Component {
complete_status: game_list[i].complete_status,
})
if(game_list[i].complete_status === 2 || game_list[i].complete_status===3){
boolgalist=false;
}
}
// console.log("viewtraining");
// console.log(datalist);
@ -796,7 +801,8 @@ class Listofworks extends Component {
this.setState({
viewtrainingdata: result.data,
visibles: true,
game_list: datalist
game_list: datalist,
boolgalist:boolgalist,
})
}
}).catch((error) => {
@ -1001,7 +1007,7 @@ class Listofworks extends Component {
render() {
// console.log("Listofworks.js000")
let {columns, page, limit, course_groupysls, course_groupyslstwo, unlimited, unlimitedtwo, loadingstate, viewtrainingdata, game_list, data, course_group_info, order, teacherdata, task_status, checkedValuesine, searchtext, teacherlist, visible, visibles, jobsettingsdata} = this.state;
let {columns, page, boolgalist,limit, course_groupysls, course_groupyslstwo, unlimited, unlimitedtwo, loadingstate, viewtrainingdata, game_list, data, course_group_info, order, teacherdata, task_status, checkedValuesine, searchtext, teacherlist, visible, visibles, jobsettingsdata} = this.state;
//
// console.log(teacherdata&&teacherdata.shixun_identifier)
// console.log(course_group_info)
@ -1045,6 +1051,7 @@ class Listofworks extends Component {
viewtrainingdata={viewtrainingdata}
game_list={game_list}
visible={visibles}
boolgalist={boolgalist}
Cancel={() => this.cancelModulationModels()}
/>
@ -1080,12 +1087,12 @@ class Listofworks extends Component {
<span className="color-grey-9 fl ml3 mr3">&gt;</span>
<ActionBtn
className=" btn colorgrey fl hovercolorblue "
to={`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${jobsettingsdata === undefined ? "" : jobsettingsdata.data.category.category_id}`}>{jobsettingsdata === undefined ? "" : jobsettingsdata.data.category.category_name}</ActionBtn>
to={`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${jobsettingsdata === undefined ? "" : jobsettingsdata.data.category.category_id===undefined?"":jobsettingsdata.data.category.category_id}`}>{jobsettingsdata === undefined ? "" : jobsettingsdata.data.category.category_name}</ActionBtn>
<span className="color-grey-9 fl ml3 mr3">&gt;</span>
<WordsBtn className="fl">作业详情</WordsBtn>
</p>
</div>
<div className="educontent mb30">
<div className="educontent mb30" style={{width:"1250px"}}>
<p className=" fl color-black summaryname">
{teacherdata === undefined ? "" : teacherdata.homework_name}
</p>
@ -1101,7 +1108,7 @@ class Listofworks extends Component {
</div>
<div className="edu-back-white">
<div className="edu-back-white" style={{width:"1250px"}}>
<div className="stud-class-set bor-bottom-greyE ">
<div className=" clearfix edu-back-white poll_list">
<Link className="active"
@ -1164,7 +1171,7 @@ class Listofworks extends Component {
</CheckboxGroup>
{/*请输入姓名或学号搜索*/}
<div className="fr mr5 search-new" style={{marginBottom: '1px'}}>
<div className="fr mr5 search-newysl" style={{marginBottom: '1px'}}>
<Search
placeholder="请输入姓名或学号搜索"
id="subject_search_input"

@ -688,7 +688,7 @@ class Listofworksstudentone extends Component {
<WordsBtn className="fl">作业详情</WordsBtn>
</p>
</div>
<div className="educontent mb30">
<div className="educontent mb30" style={{width:"1250px"}}>
<p className=" fl color-black summaryname">
{teacherdata === undefined ? "" : teacherdata.homework_name}
</p>
@ -696,11 +696,11 @@ class Listofworksstudentone extends Component {
typelist={teacherdata === undefined ? [""] : teacherdata.homework_status}
/>
<a className="color-grey-9 fr font-16 summaryname ml20 mr20"
href={`/courses/${this.state.props.match.params.coursesId}/${this.state.shixuntypes}/${jobsettingsdata === undefined ? "" :jobsettingsdata.data.category.category_id}`}>返回</a>
href={`/courses/${this.state.props.match.params.coursesId}/${this.state.shixuntypes}/${jobsettingsdata === undefined ? "" :jobsettingsdata.data.category.category_id===undefined?"":jobsettingsdata.data.category.category_id}`}>返回</a>
<p className="color-grey-9 fr font-16"></p>
</div>
<div className="edu-back-white">
<div className="edu-back-white" style={{width:"1250px"}}>
<div className="stud-class-set bor-bottom-greyE ">
<div className=" clearfix edu-back-white poll_list">
<Link className="active"

@ -36,7 +36,7 @@ class TraineetraininginformationModal extends Component {
props: this.props,
userids: this.props.userids,
game_list:this.props.game_list,
gline:0,
boolgalist:this.props.boolgalist,
})
// console.log("TraineetraininginformationModal")
@ -51,17 +51,22 @@ class TraineetraininginformationModal extends Component {
// this.seacthdata();
}
// 设置数据
// seacthdata = () => {
//
// console.log(datalist)
// }
LimitNumber=(txt)=> {
var str = txt;
if(str.length>25){
str = str.substring(0,25)+"......"
}
return str;
}
render() {
const columns = [
var columns;
if(this.props.boolgalist === true) {
columns = [
{
title: '关卡',
dataIndex: 'number',
key: 'number',
width: 92,
align: "center",
render: (text, record) => (
<span>
@ -77,7 +82,24 @@ class TraineetraininginformationModal extends Component {
align: "center",
render: (text, record) => (
<span>
<a style={{"color":'#989898', "text-align": "center"}} >{record.name==='Invalid date'?"--":record.name}</a>
<a style={{
"color": '#989898',
"text-align": "center"
}}>{record.name === 'Invalid date' ? "--" : record.name}</a>
</span>
),
},
{
title: '',
dataIndex: 'complete_status',
key: 'complete_status',
width: 100,
align: "center",
render: (text, record) => (
<span>
{record.complete_status === 2 ? <img src={delay}/> : record.complete_status === 3 ?
<img src={invalid}/> : ""}
</span>
),
},
@ -85,6 +107,7 @@ class TraineetraininginformationModal extends Component {
title: '耗时',
dataIndex: 'stduynumber',
key: 'stduynumber',
width: 92,
align: "center",
render: (text, record) => (
<span>
@ -95,6 +118,7 @@ class TraineetraininginformationModal extends Component {
{
title: '经验值',
key: 'classroom',
width: 92,
dataIndex: 'classroom',
align: "center",
render: (text, record) => (
@ -103,13 +127,14 @@ class TraineetraininginformationModal extends Component {
</span>
),
}
];
const columnss = [
]
}
else {
columns = [
{
title: '关卡',
dataIndex: 'number',
key: 'number',
width: 92,
align: "center",
render: (text, record) => (
<span >
@ -128,25 +153,11 @@ class TraineetraininginformationModal extends Component {
<a style={{"color":'#989898', "text-align": "center"}} >{record.name==='Invalid date'?"--":record.name}</a>
</span>
),
},
{
title: '',
dataIndex: 'complete_status',
key: 'complete_status',
width: 100,
align: "center",
render: (text, record) => (
<span>
{record.complete_status===2?<img src={delay}/>:record.complete_status===3?<img src={invalid}/>:""}
</span>
),
},
{
title: '耗时',
dataIndex: 'stduynumber',
key: 'stduynumber',
width: 92,
align: "center",
render: (text, record) => (
<span>
@ -157,7 +168,6 @@ class TraineetraininginformationModal extends Component {
{
title: '经验值',
key: 'classroom',
width: 92,
dataIndex: 'classroom',
align: "center",
render: (text, record) => (
@ -166,8 +176,8 @@ class TraineetraininginformationModal extends Component {
</span>
),
}
];
]
}
return (
<div>
<Modal
@ -181,7 +191,7 @@ class TraineetraininginformationModal extends Component {
<div style={{width:"100%" }}className="login_register_content" >
<div style={{"width": "100%","text-align": "left","clear": "both"}}>
<div className="mt5 fl" >
<span style={{"text-align": "left"}}>{this.props.viewtrainingdata === undefined ? "" : this.props.viewtrainingdata.shixun_name}</span>
<span style={{"text-align": "left"}}>{this.props.viewtrainingdata === undefined ? "" : this.LimitNumber(this.props.viewtrainingdata.shixun_name)}</span>
<span className="ml10 " style={{"text-align": "left","color":'#29BD8B'}} >经验值<span style={{"color":'#29BD8B'}}> {this.props.viewtrainingdata === undefined ? "" : this.props.viewtrainingdata.shixun_score}</span></span>
</div>
{/*<Button type="primary" className="ml30" >实训报告</Button>*/}
@ -200,12 +210,12 @@ class TraineetraininginformationModal extends Component {
src={this.props.viewtrainingdata === undefined ? "" : "https://www.educoder.net/images/" + `${this.props.viewtrainingdata.image_url}`}
width="70"/>
</div>
<div className="fl edu-back-white ml20 mt10">
<div className="fl edu-back-white ml20 mt15">
<li>{this.props.viewtrainingdata === undefined ? "" :this.props.viewtrainingdata.username}<span style={{"color":"#323232"}}> 通关</span><span style={{"color": '#FF6800'}}>{this.props.viewtrainingdata === undefined ? "" :this.props.viewtrainingdata.complete_count}/{this.props.viewtrainingdata === undefined ? "" :this.props.viewtrainingdata.challenges_count}</span></li>
<li><span style={{"color":"#989898"}} >完成效率</span><span style={{"color":"#4C4C4C"}}>{this.props.viewtrainingdata === undefined ? "" :this.props.viewtrainingdata.efficiency}</span></li>
<li><span style={{"color":"#989898"}}>通关时间</span> <span style={{"color":"#4C4C4C"}}>{this.props.viewtrainingdata === undefined ? "":moment(this.props.viewtrainingdata.passed_time).format('YYYY-MM-DD HH:mm')==="Invalid date"?"--":moment(this.props.viewtrainingdata.passed_time).format('YYYY-MM-DD HH:mm')}</span> </li>
</div>
<div className="fl edu-back-white ml20 mt10">
<div className="fl edu-back-white ml20 mt15">
<li className="mt20"> <span style={{"color":"#989898"}}>课堂最高完成效率</span> <span style={{"color":"#4C4C4C"}}>{this.props.viewtrainingdata === undefined ? "" :this.props.viewtrainingdata.max_efficiency} </span> </li>
<li><span style={{"color":"#989898"}}>总耗时:</span> <span style={{"color":"#4C4C4C"}}> {this.props.viewtrainingdata === undefined ? "" :this.props.viewtrainingdata.total_spend_time}</span> </li>
@ -213,7 +223,7 @@ class TraineetraininginformationModal extends Component {
</div>
{
this.props.game_list === undefined?"" : this.props.game_list.length<4?
<div>
<div className="edu-table edu-back-white ">
<style>
{
` .ant-table-body{
@ -233,7 +243,7 @@ class TraineetraininginformationModal extends Component {
/>}
</div>
:
<div>
<div className="edu-table edu-back-white ">
<div className={"both"}></div>
{this.props.game_list === undefined ? "" : <Table
className="mt20"

@ -642,10 +642,10 @@ class Trainingjobsetting extends Component {
if(e.target.value ==="允许补交"){
if(this.state.end_time !== null && this.state.end_time!== undefined){
// console.log(this.state.end_time);
var times = this.state.deadline.format('YYYY-MM-DD HH:mm');
// var times = this.state.deadline.format('YYYY-MM-DD HH:mm');
this.setState({
late_time:moment(handleDateString(times)).add(1, 'months'),
late_times:moment(handleDateString(times)).add(1, 'months').format('YYYY-MM-DD HH:mm'),
late_time:moment(handleDateString(this.state.deadline)).add(1, 'months'),
late_times:moment(handleDateString(this.state.deadline)).add(1, 'months').format('YYYY-MM-DD HH:mm'),
})
}
@ -1184,10 +1184,12 @@ class Trainingjobsetting extends Component {
} catch (e) {
}
this.setState({
end_time:moment(handleDateString(dateString))
})
// this.onChangedata('end_time', value, dateString);
if(this.state.allowreplenishment === "允许补交"){
this.setState({
end_time:moment(handleDateString(dateString)),
deadline:moment(handleDateString(dateString)).format('YYYY-MM-DD HH:mm'),
late_time:moment(handleDateString(dateString)).add(2, 'months'),
late_times:moment(handleDateString(dateString)).add(2, 'months').format('YYYY-MM-DD HH:mm'),

@ -148,13 +148,13 @@ class MemoDetailMDEditor extends Component {
margin-right: 0px !important;
}
.commentInput {
border-bottom: 1px solid #EEEEEE;
}
.commentInput .editormd{
width:100%!important;
}
`}</style>
<div style={{ display: isInited ? 'none' : ''}} className="mockInputWrapper commentInput" >
<div style={{ display: isInited ? 'none' : '', borderBottom: `${this.props.commentsLength == 0 ? 'none' : '1px solid #EEEEEE'}`}}
className="mockInputWrapper commentInput" >
<input onClick={this.onMockInputClick} placeholder={placeholder || '我要回复'}></input>
<a href="javascript:void(0)"
onClick={this.onMockInputClick} className="commentsbtn task-btn task-btn-blue">

@ -2,6 +2,7 @@
.educontent {
margin-bottom: 20px;
}
/* 左侧区域最小高度*/
#forum_index_list {
min-height: 400px;

@ -7,7 +7,12 @@
width:237px!important;
height: 30px;
margin-bottom: 30px;
margin-right: 35px;
/*margin-right: 35px;*/
}
.search-newysl {
width:237px!important;
height: 30px;
margin-bottom: 30px;
}
.search-new-input {
padding-left: 16px;

@ -319,7 +319,7 @@ class LoginDialog extends Component {
this.setState({
isRender: false
})
window.location.href="/";
// window.location.href="/";
}
loginEDU=()=>{

@ -32,6 +32,7 @@ class Trialapplication extends Component {
readonlyInput: true,
user_phone_binded: false,
showTrial: false,
user: undefined,
}
//user_phone_binded 判断是否手机号验证
// console.log("Trialapplication");
@ -43,15 +44,32 @@ class Trialapplication extends Component {
}
componentWillReceiveProps(nextProps) {
// console.log("46");
// console.log(nextProps);
// console.log(this.props);
if (nextProps.user != this.props.user) {
// console.log("50");
// console.log(nextProps.user);
if (nextProps.user !== undefined) {
// console.log("53");
// console.log(nextProps.user);
this.setState({
user_phone_binded: nextProps.user.user_phone_binded,
})
}
}
}
//初始化数据
componentDidMount() {
console.log("53");
console.log(this.props.isRenders);
// console.log("53");
//
// console.log(this.props.isRenders);
if (this.props.isRenders != undefined) {
this.setState({
@ -77,21 +95,6 @@ class Trialapplication extends Component {
//TODO 这里如果样式变了会出现css不加载的情况
});
// console.log(this.props.isRenders);
// console.log("89");
// console.log(this.state.props.user_phone_binded );
try {
if (this.state.props.user_phone_binded !== undefined) {
console.log(this.state.props.user_phone_binded);
this.setState({
user_phone_binded: this.state.props.user_phone_binded,
})
}
} catch (e) {
console.log(e);
}
}
@ -384,9 +387,6 @@ class Trialapplication extends Component {
<style>
{
`
// .dialogBox{
// height: 370px;
// }
.dialogBox2{
height: 420px;
}
@ -553,7 +553,7 @@ class Trialapplication extends Component {
<div className={"login_register_content"} style={
user_phone_binded === true ?
{
"width": "560px", "height": "304px",
"width": "560px", "height": "280px",
"border-radius": "15px",
"background": " #FFFFff",
"text-align": "center",

@ -33,7 +33,7 @@ class MainContent extends Component {
}
render() {
const { challenge, output_sets, onRunCodeTest, latest_output, record, st, readRepoTimeout,
onTestSetHeaderClick, loading, codeLoading, shixun} = this.props
onTestSetHeaderClick, loading, codeLoading, shixun, vnc_url} = this.props
// if (output_sets && output_sets.test_sets) {
// const test_sets_array = JSON.parse("[" + output_sets.test_sets + "]");
@ -86,9 +86,11 @@ class MainContent extends Component {
<div className="fl pr tip-right-con" id="update_game_tip"></div>
</div>*/}
{/* { showIframeContent && vnc_url ? <VNCDisplay
{ showIframeContent && vnc_url ? <VNCDisplay
vnc_url={vnc_url}
></VNCDisplay> */}
></VNCDisplay>
:
<React.Fragment>
<div className="-layout-v -flex">
<div className="-flex -relative">
@ -143,6 +145,9 @@ class MainContent extends Component {
<div id="actionView" className="-layout-h -center -bg-grey-90 -grey-20 -bg-darkblack" style={{height:'48px'}}>
<ActionView onRunCodeTest={onRunCodeTest} {...this.props}></ActionView>
</div>
</React.Fragment>
}
</div>
</div>
</div>

@ -1,154 +1,154 @@
// import React, { Component } from 'react';
import React, { Component } from 'react';
// import RFB from '@novnc/novnc/lib/rfb.js';
import RFB from '@novnc/novnc/lib/rfb.js';
// const $ = window.$;
// // const showIframeContent = window.location.search.indexOf('vnc=1') != -1;
// class VNCDisplay extends Component {
// componentDidMount() {
// console.log(RFB)
const $ = window.$;
// const showIframeContent = window.location.search.indexOf('vnc=1') != -1;
class VNCDisplay extends Component {
componentDidMount() {
console.log(RFB)
// let rfb;
// let desktopName;
// // When this function is called we have
// // successfully connected to a server
// function connectedToServer(e) {
// status("Connected to " + desktopName);
// }
// // This function is called when we are disconnected
// function disconnectedFromServer(e) {
// if (e.detail.clean) {
// status("Disconnected");
// } else {
// status("Something went wrong, connection is closed");
// }
// }
// // When this function is called, the server requires
// // credentials to authenticate
// function credentialsAreRequired(e) {
// const password = prompt("Password Required:");
// rfb.sendCredentials({ password: password });
// }
// // When this function is called we have received
// // a desktop name from the server
// function updateDesktopName(e) {
// desktopName = e.detail.name;
// }
// // Since most operating systems will catch Ctrl+Alt+Del
// // before they get a chance to be intercepted by the browser,
// // we provide a way to emulate this key sequence.
// function sendCtrlAltDel() {
// rfb.sendCtrlAltDel();
// return false;
// }
// // Show a status text in the top bar
// function status(text) {
// document.getElementById('status').textContent = text;
// }
// // This function extracts the value of one variable from the
// // query string. If the variable isn't defined in the URL
// // it returns the default value instead.
// function readQueryVariable(name, defaultValue) {
// // A URL with a query parameter can look like this:
// // https://www.example.com?myqueryparam=myvalue
// //
// // Note that we use location.href instead of location.search
// // because Firefox < 53 has a bug w.r.t location.search
// const re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
// match = document.location.href.match(re);
// if (typeof defaultValue === 'undefined') { defaultValue = null; }
// if (match) {
// // We have to decode the URL since want the cleartext value
// return decodeURIComponent(match[1]);
// }
// return defaultValue;
// }
// document.getElementById('sendCtrlAltDelButton')
// .onclick = sendCtrlAltDel;
// // Read parameters specified in the URL query string
// // By default, use the host and port of server that served this file
let rfb;
let desktopName;
// When this function is called we have
// successfully connected to a server
function connectedToServer(e) {
status("Connected to " + desktopName);
}
// This function is called when we are disconnected
function disconnectedFromServer(e) {
if (e.detail.clean) {
status("Disconnected");
} else {
status("Something went wrong, connection is closed");
}
}
// When this function is called, the server requires
// credentials to authenticate
function credentialsAreRequired(e) {
const password = prompt("Password Required:");
rfb.sendCredentials({ password: password });
}
// When this function is called we have received
// a desktop name from the server
function updateDesktopName(e) {
desktopName = e.detail.name;
}
// Since most operating systems will catch Ctrl+Alt+Del
// before they get a chance to be intercepted by the browser,
// we provide a way to emulate this key sequence.
function sendCtrlAltDel() {
rfb.sendCtrlAltDel();
return false;
}
// Show a status text in the top bar
function status(text) {
document.getElementById('status').textContent = text;
}
// This function extracts the value of one variable from the
// query string. If the variable isn't defined in the URL
// it returns the default value instead.
function readQueryVariable(name, defaultValue) {
// A URL with a query parameter can look like this:
// https://www.example.com?myqueryparam=myvalue
//
// Note that we use location.href instead of location.search
// because Firefox < 53 has a bug w.r.t location.search
const re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
match = document.location.href.match(re);
if (typeof defaultValue === 'undefined') { defaultValue = null; }
if (match) {
// We have to decode the URL since want the cleartext value
return decodeURIComponent(match[1]);
}
return defaultValue;
}
document.getElementById('sendCtrlAltDelButton')
.onclick = sendCtrlAltDel;
// Read parameters specified in the URL query string
// By default, use the host and port of server that served this file
// // const host = readQueryVariable('host', window.location.hostname);
// // let port = readQueryVariable('port', window.location.port);
// // const password = readQueryVariable('password', '');
// const host = readQueryVariable('host', window.location.hostname);
// let port = readQueryVariable('port', window.location.port);
// const password = readQueryVariable('password', '');
// const { vnc_url } = this.props;
// // http://117.50.12.63:43149/vnc_lite.html?password=headless
// let _ar1 = vnc_url.split('/');
// let ipAndPort = _ar1[2].split(':')
// let passwordAr = _ar1[3].split('password=')
// const host = ipAndPort[0]
// let port = ipAndPort[1]
// const password = passwordAr[1].split('&')[0]
const { vnc_url } = this.props;
// http://117.50.12.63:43149/vnc_lite.html?password=headless
let _ar1 = vnc_url.split('/');
let ipAndPort = _ar1[2].split(':')
let passwordAr = _ar1[3].split('password=')
const host = ipAndPort[0]
let port = ipAndPort[1]
const password = passwordAr[1].split('&')[0]
// const path = readQueryVariable('path', 'websockify');
// // | | | | | |
// // | | | Connect | | |
// // v v v v v v
// status("Connecting");
// // Build the websocket URL used to connect
// let url;
// if (vnc_url.indexOf("https:") != -1) {
// url = 'wss';
// } else {
// url = 'ws';
// }
// url += '://' + host;
// if(port) {
// url += ':' + port;
// }
// url += '/' + path;
// // Creating a new RFB object will start a new connection
// rfb = new RFB(document.getElementById('screen'), url,
// { credentials: { password: password } });
// // Add listeners to important events from the RFB module
// rfb.addEventListener("connect", connectedToServer);
// rfb.addEventListener("disconnect", disconnectedFromServer);
// rfb.addEventListener("credentialsrequired", credentialsAreRequired);
// rfb.addEventListener("desktopname", updateDesktopName);
// // Set parameters that can be changed on an active connection
// rfb.viewOnly = readQueryVariable('view_only', false);
// rfb.scaleViewport = readQueryVariable('scale', false);
// }
const path = readQueryVariable('path', 'websockify');
// | | | | | |
// | | | Connect | | |
// v v v v v v
status("Connecting");
// Build the websocket URL used to connect
let url;
if (vnc_url.indexOf("https:") != -1) {
url = 'wss';
} else {
url = 'ws';
}
url += '://' + host;
if(port) {
url += ':' + port;
}
url += '/' + path;
// Creating a new RFB object will start a new connection
rfb = new RFB(document.getElementById('screen'), url,
{ credentials: { password: password } });
// Add listeners to important events from the RFB module
rfb.addEventListener("connect", connectedToServer);
rfb.addEventListener("disconnect", disconnectedFromServer);
rfb.addEventListener("credentialsrequired", credentialsAreRequired);
rfb.addEventListener("desktopname", updateDesktopName);
// Set parameters that can be changed on an active connection
rfb.viewOnly = readQueryVariable('view_only', false);
rfb.scaleViewport = readQueryVariable('scale', false);
}
// render() {
// const { challenge, vnc_url } = this.props
render() {
const { challenge, vnc_url } = this.props
// return (
// <div className="">
// <style>{`
// #top_bar {
// background-color: #6e84a3;
// color: white;
// font: bold 12px Helvetica;
// padding: 6px 5px 4px 5px;
// border-bottom: 1px outset;
// }
// #status {
// text-align: center;
// }
// #sendCtrlAltDelButton {
// position: fixed;
// top: 0px;
// right: 0px;
// border: 1px outset;
// padding: 5px 5px 4px 5px;
// cursor: pointer;
// }
// #screen {
// flex: 1; /* fill remaining space */
// overflow: hidden;
// }
// `}</style>
// <div id="top_bar">
// <div id="status">Loading</div>
// <div id="sendCtrlAltDelButton">Send CtrlAltDel</div>
// </div>
// <div id="screen"></div>
// </div>
// );
// }
// }
return (
<div className="">
<style>{`
#top_bar {
background-color: #6e84a3;
color: white;
font: bold 12px Helvetica;
padding: 6px 5px 4px 5px;
border-bottom: 1px outset;
}
#status {
text-align: center;
}
#sendCtrlAltDelButton {
position: fixed;
top: 0px;
right: 0px;
border: 1px outset;
padding: 5px 5px 4px 5px;
cursor: pointer;
}
#screen {
flex: 1; /* fill remaining space */
overflow: hidden;
}
`}</style>
<div id="top_bar">
<div id="status">Loading</div>
<div id="sendCtrlAltDelButton">Send CtrlAltDel</div>
</div>
<div id="screen"></div>
</div>
);
}
}
// export default VNCDisplay;
export default VNCDisplay;

@ -192,16 +192,23 @@ class CodeEvaluateView extends Component {
<React.Fragment>
<div>{`已经过职业认证的教师可以免金币查看隐藏测试集。`}</div>
<div>{`解锁本关所有测试集需要扣除${challenge.score*5}金币,确定要解锁吗?`}</div>
<div onClick={()=>this.goToCertification()} style={{color: '#4CACFF', cursor: 'pointer', 'text-decoration': 'underline'
, 'margin-top': '12px'}}>立即认证</div>
</React.Fragment> :
`解锁本关所有测试集需要扣除${challenge.score*5}金币,确定要解锁吗?`
<React.Fragment>
<div>{`解锁本关所有测试集需要扣除${challenge.score*5}金币`}</div>
<div>{`确定要解锁吗?`}</div>
</React.Fragment>
const moreButtonsRender = () => {
return (power === 0 && user.is_teacher) ? (
<Button variant="raised" style={{ marginRight: '20px'}}
onClick={()=>this.goToCertification()} color="primary">
{ '立即认证' }
</Button>
) : ''
return ''
// ${this.props.classes.button}
// return (power === 0 && user.is_teacher) ? (
// <Button variant="raised" style={{ marginRight: '20px'}} className={``}
// onClick={()=>this.goToCertification()} color="primary">
// { '立即认证' }
// </Button>
// ) : ''
}
testSetsComponentArray.push(
<div className="-task-ces-box mb10 clearfix tabContent" key={index+'-1'}>

@ -229,6 +229,9 @@ body>div[role=dialog]>div {
/* padding-bottom: 10px; */
}
/* tpi 窗口宽度*/
#tpi-dialog>div[role=document] {
border-radius: 10px;
}
body>div[role=dialog] div[role=document] {
min-width: 400px;
}

@ -170,8 +170,7 @@ class NewHeader extends Component {
submitapplications:false,
isRender:false,
isRenders:false,
user_phone_binded:false,
showTrial:false,
showTrial:true,
}
// console.log("176")
// console.log(props);
@ -209,18 +208,18 @@ class NewHeader extends Component {
}
componentDidUpdate = (prevProps) => {
if(prevProps.user!=this.props.user){
// console.log("216")
// console.log(prevProps.user);
// console.log(this.props.user);
if(this.props.user !== undefined){
this.setState({
user_phone_binded :this.props.user.user_phone_binded,
})
}
}
// if(prevProps.user!=this.props.user){
// // console.log("216")
// // console.log(prevProps.user);
// // console.log(this.props.user);
// if(this.props.user !== undefined){
// this.setState({
// user_phone_binded :this.props.user.user_phone_binded,
// })
// }
//
//
// }
}
componentWillReceiveProps(newProps, oldProps) {
this.setState({
@ -581,7 +580,6 @@ submittojoinclass=(value)=>{
user,
isRender,
isRenders,
user_phone_binded,
}=this.state;
/*
用户名称 用户头像url
@ -627,7 +625,7 @@ submittojoinclass=(value)=>{
{/* />*/}
{/* :""*/}
{/*}*/}
<Trialapplication {...this.state} user_phone_binded={user_phone_binded} ></Trialapplication>
<Trialapplication {...this.state} ></Trialapplication>
<div className="educontent clearfix">
{/*<%= link_to image_tag("/images/educoder/logo.png", alt:"高校智能化教学与实训平台", className:"logoimg"), home_path %>*/}
<a href="/">

@ -782,3 +782,4 @@ html>body #ajax-indicator { position: fixed; }
.editormd-dialog-footer{
padding: 0px;
}
.educontentysl{width: 1250px;margin:0px auto;box-sizing: border-box}/*中间部分宽度固定为1200*/

Loading…
Cancel
Save