You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/public/react/src/modules/tpm/newshixuns/Newshixuns.js

1333 lines
54 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import React, {Component} from 'react';
import {TPMIndexHOC} from '../TPMIndexHOC';
import {SnackbarHOC} from 'educoder';
import {Input, Select, Radio, Checkbox, Modal, Icon, DatePicker,Upload,Button,message,Form,notification} from 'antd';
// import "antd/dist/antd.css";
import locale from 'antd/lib/date-picker/locale/zh_CN';
import axios from 'axios';
import './css/Newshixuns.css';
import {getUrl} from 'educoder'
import moment from 'moment';
let path = getUrl("/editormd/lib/")
const $ = window.$;
let timeout;
let currentValue;
const Option = Select.Option;
const RadioGroup = Radio.Group;
const confirm = Modal.confirm;
// 处理整点 半点
// 取传入时间往后的第一个半点
export function handleDateStrings(dateString) {
if (!dateString) return dateString;
const ar = dateString.split(':')
if (ar[1] == '00' || ar[1] == '30') {
return dateString
}
const miniute = parseInt(ar[1]);
if (miniute < 30 || miniute == 60) {
return [ar[0], '30'].join(':')
}
if (miniute < 60) {
// 加一个小时
const tempStr = [ar[0], '00'].join(':');
const format = "YYYY-MM-DD HH:mm";
const _moment = moment(tempStr, format)
_moment.add(1, 'hours')
return _moment.format(format)
}
return dateString
}
// 恢复数据
function md_rec_data(k, mdu, id, editor) {
if (window.sessionStorage.getItem(k + mdu) !== null) {
editor.setValue(window.sessionStorage.getItem(k + mdu));
md_clear_data(k, mdu, id);
}
}
// 保存数据
function md_add_data(k, mdu, d) {
window.sessionStorage.setItem(k + mdu, d);
}
// 清空保存的数据
function md_clear_data(k, mdu, id) {
window.sessionStorage.removeItem(k + mdu);
var id1 = "#e_tip_" + id;
var id2 = "#e_tips_" + id;
if (k == 'content') {
$(id2).html("");
} else {
$(id1).html("");
}
}
function md_elocalStorage(editor, mdu, id) {
if (window.sessionStorage) {
var oc = window.sessionStorage.getItem('content' + mdu);
if (oc !== null) {
$("#e_tips_" + id).data('editor', editor);
var h = '您上次有已保存的数据,是否<a style="cursor: pointer;" class="link-color-blue" onclick="md_rec_data(\'content\',\'' + mdu + '\',\'' + id + '\')">恢复</a> ? / <a style="cursor: pointer;" class="link-color-blue" onclick="md_clear_data(\'content\',\'' + mdu + '\',\'' + id + '\')">不恢复</a>';
$("#e_tips_" + id).html(h);
}
setInterval(function () {
var d = new Date();
var h = d.getHours();
var m = d.getMinutes();
var s = d.getSeconds();
h = h < 10 ? '0' + h : h;
m = m < 10 ? '0' + m : m;
s = s < 10 ? '0' + s : s;
if (editor.getValue().trim() != "") {
md_add_data("content", mdu, editor.getValue());
var id1 = "#e_tip_" + id;
var id2 = "#e_tips_" + id;
$(id1).html(" 数据已于 " + h + ':' + m + ':' + s + " 保存 ");
$(id2).html("");
}
}, 10000);
} else {
$("#e_tip_" + id).after('您的浏览器不支持localStorage.无法开启自动保存草稿服务,请升级浏览器!');
}
}
function create_editorMD(id, width, high, placeholder, imageUrl, callback) {
var editorName = window.editormd(id, {
width: width,
height: high,
path: path, // "/editormd/lib/"
syncScrolling: "single",
tex: true,
tocm: true,
emoji: true,
taskList: true,
codeFold: true,
searchReplace: true,
htmlDecode: "style,script,iframe",
sequenceDiagram: true,
autoFocus: false,
toolbarIcons: function () {
// Or return editormd.toolbarModes[name]; // full, simple, mini
// Using "||" set icons align right.
return ["bold", "italic", "|", "list-ul", "list-ol", "|", "code", "code-block", "|", "testIcon", "testIcon1", '|', "image", "table", '|', "watch", "clear"]
},
toolbarCustomIcons: {
testIcon: "<a type=\"inline\" class=\"latex\" ><div class='zbg'></div></a>",
testIcon1: "<a type=\"latex\" class=\"latex\" ><div class='zbg_latex'></div></a>"
},
//这个配置在simple.html中并没有但是为了能够提交表单使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中方便post提交表单。
saveHTMLToTextarea: true,
// 用于增加自定义工具栏的功能可以直接插入HTML标签不使用默认的元素创建图标
dialogMaskOpacity: 0.6,
placeholder: placeholder,
imageUpload: true,
imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"],
imageUploadURL: imageUrl,//url
onload: function () {
// this.previewing();
$("#" + id + " [type=\"latex\"]").bind("click", function () {
editorName.cm.replaceSelection("```latex");
editorName.cm.replaceSelection("\n");
editorName.cm.replaceSelection("\n");
editorName.cm.replaceSelection("```");
var __Cursor = editorName.cm.getDoc().getCursor();
editorName.cm.setCursor(__Cursor.line - 1, 0);
});
$("#" + id + " [type=\"inline\"]").bind("click", function () {
editorName.cm.replaceSelection("$$$$");
var __Cursor = editorName.cm.getDoc().getCursor();
editorName.cm.setCursor(__Cursor.line, __Cursor.ch - 2);
editorName.cm.focus();
});
$("[type=\"inline\"]").attr("title", "行内公式");
$("[type=\"latex\"]").attr("title", "多行公式");
md_elocalStorage(editorName, `memoNew_${id}`, "memoNew");
callback && callback()
}
});
return editorName;
}
function range(start, end) {
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
}
function disabledDateTime() {
return {
// disabledHours: () => range(0, 24).splice(4, 20),
disabledMinutes: () => range(1, 30).concat(range(31, 60)),
// disabledSeconds: () => [0, 60],
};
}
function disabledDate(current) {
return current && current < moment().endOf('day').subtract(1, 'days');
}
class Newshixuns extends Component {
constructor(props) {
super(props)
this.state = {
fileList: [],
newshixunlist: undefined,
departmentslist: undefined,
name: "",
main_type: "",
small_type: "",
trainee: "",
webssh: 0,
use_scope: 0,
can_copy: "",
scope_partment: undefined,
vnc: "",
scopetype: false,
postapplyvisible: false,
sendsure_applyvalue: undefined,
postapplytitle: false,
shixun_nametype: false,
main_types: false,
trainee_types: false,
SelectTheCommandtype: false,
opers: false,
operss: false,
TimePickervalue: "",
opensmail: false,
onSearchvalue: "",
scope_partmenttype: false,
languagewrite: undefined,
systemenvironment:undefined,
testcoderunmode:undefined,
file:undefined,
deleteisnot:true,
languagewritetype:false,
systemenvironmenttype:false,
testcoderunmodetype:false,
attachmentidstype:false,
datalisttype:false
}
}
initMD(initValue) {
this.contentChanged = false;
const placeholder = "";
// amp;
// 编辑时要传memoId
const imageUrl = `/api/attachments.json`;
// 创建editorMd
const taskpass_editormd = create_editorMD("memoMD", '100%', 400, placeholder, imageUrl, () => {
setTimeout(() => {
taskpass_editormd.resize()
taskpass_editormd.cm && taskpass_editormd.cm.refresh()
}, 500)
if (initValue) {
taskpass_editormd.setValue(initValue)
}
taskpass_editormd.cm.on("change", (_cm, changeObj) => {
// console.log('....contentChanged')
this.contentChanged = true;
})
});
this.taskpass_editormd = taskpass_editormd;
window.taskpass_editormd = taskpass_editormd;
}
componentDidMount() {
let newshixunUrl = `/shixuns/new.json`;
axios.get(newshixunUrl).then((response) => {
if (response.status === 200) {
if (response.data.message===undefined) {
this.setState({
newshixunlist: response.data
});
this.initMD(response.data.sample[0][1]);
}
}
}).catch((error) => {
console.log(error)
});
let departmentsUrl = `/shixuns/departments.json`;
axios.get(departmentsUrl).then((response) => {
if (response.status === 200) {
if (response.data.message===undefined) {
this.setState({
departmentslist: response.data.shools_name
});
}
}
}).catch((error) => {
console.log(error)
});
}
setlanguagewrite = (e)=>{
this.setState({
languagewrite: e.target.value
})
}
setsystemenvironment = (e) => {
this.setState({
systemenvironment: e.target.value
})
}
settestcoderunmode = (e) => {
this.setState({
testcoderunmode: e.target.value
})
}
shixunname = (e) => {
this.setState({
name: e.target.value,
shixun_nametype: false
});
}
bigClass = (value) => {
this.setState({
main_type: value
})
}
littleClass = (value) => {
this.setState({
small_type: value
})
}
Selectthestudent = (value) => {
this.setState({
trainee: value
})
}
SelectTheCommand = (e) => {
this.setState({
webssh: e.target.value,
});
if (e.target.value === 2) {
this.setState({
SelectTheCommandtype: true,
multi_webssh: false
});
} else {
this.setState({
SelectTheCommandtype: false,
multi_webssh: false
});
}
}
Selectpublic = (e) => {
this.setState({
scopetype: false,
use_scope: e.target.value,
});
if (e.target.value === 1) {
this.setState({
scopetype: true
});
}
}
Teacherscopy = (e) => {
let sum = ""
if (e.target.checked === false) {
sum = 0
} else if (e.target.checked === true) {
sum = 1
}
this.setState({
can_copy: sum,
});
}
TeachersUbuntu = (e) => {
let sum = ""
if (e.target.checked === false) {
sum = 0
} else if (e.target.checked === true) {
sum = 1
}
this.setState({
vnc: sum,
});
}
adduse_scopeinput = () => {
let {scope_partment} = this.state;
let array = scope_partment;
let newarray = ""
array.push(newarray)
this.setState({
scope_partment: array,
});
}
shixunScopeInput = (e, id) => {
let types=false
let {scope_partment} = this.state;
let datalist = scope_partment;
if (datalist === undefined) {
datalist = []
}
datalist.map((item,key)=>{
if(e===item){
types=true
this.setState({
datalisttype:true
})
return
}
})
if(types===false){
datalist.push(e)
this.setState({
scope_partment: datalist,
onSearchvalue: ""
});
}
}
deleteScopeInput = (key) => {
let {scope_partment} = this.state;
let datalist = scope_partment;
datalist.splice(key, 1);
this.setState({
scope_partment: datalist
});
}
//提交数据
submit_new_shixun = () => {
const mdVal = this.taskpass_editormd.getValue();
let {can_copy, main_type, name, scope_partment, small_type, trainee, use_scope, vnc, webssh, multi_webssh, TimePickervalue} = this.state;
let Url = `/shixuns.json`
if (name === "") {
this.setState({
shixun_nametype: true
})
this.props.showSnackbar("实训名称为空");
$('html').animate({
scrollTop: 10
}, 1000);
return
}
if (main_type === "") {
this.setState({
main_types: true
})
$('html').animate({
scrollTop: 700
}, 1000);
this.props.showSnackbar("请选择技术平台大类别");
return
}
if (use_scope === 1) {
if (scope_partment === undefined || scope_partment.length === 0) {
this.setState({
scope_partmenttype: true
})
$('html').animate({
scrollTop: 900
}, 1000);
this.props.showSnackbar("公开程度,指定单位为空");
return
}
}
if (trainee === "") {
this.setState({
trainee_types: true
})
// $('html').animate({
// scrollTop: 700
// }, 1000);
this.props.showSnackbar("请选择发布信息");
return
}
let newmulti_webssh = multi_webssh;
if (newmulti_webssh === true) {
newmulti_webssh = 1
} else {
newmulti_webssh = ""
}
axios.post(Url, {
name: name,
can_copy: can_copy,
description: mdVal,
main_type: main_type,
scope_partment: scope_partment,
small_type: small_type,
trainee: trainee,
use_scope: use_scope,
vnc: vnc,
webssh: webssh,
multi_webssh: newmulti_webssh,
task_pass: 1,
opening_time: TimePickervalue
}
).then((response) => {
if (response.status === 200) {
window.location.href = "/shixuns/" + response.data.shixun_identifier + "/challenges";
// window.open("/shixuns/"+response.data.shixun_identifier+"/challenges");
}
}).catch((error) => {
console.log(error)
})
}
shixunsfetch = (value, callback) => {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
currentValue = value;
function fake() {
let departmentsUrl = `/shixuns/departments.json?q=` + currentValue;
axios.get(departmentsUrl).then((response) => {
if (response.data.message===undefined) {
callback(response.data.shools_name);
}
}).catch((error) => {
console.log(error)
});
}
timeout = setTimeout(fake, 300);
}
shixunHandleSearch = (value) => {
this.shixunsfetch(value, departmentslist => this.setState({departmentslist}));
this.setState({
onSearchvalue: ""
})
}
post_apply = () => {
this.setState({
postapplyvisible: true
})
}
sendsure_apply = () => {
let {languagewrite,systemenvironment,testcoderunmode} = this.state;
// console.log("点击确定")
// console.log("languagewrite"+languagewrite);
// console.log("systemenvironment"+systemenvironment);
// console.log("testcoderunmode"+testcoderunmode);
// let attachment_ids = undefined
// if (this.state.fileList) {
// attachment_ids = this.state.fileList.map(item => {
// return item.response ? item.response.id : item.id
// })
// }
if(languagewrite === undefined || languagewrite === "" ){
// this.props.showNotification(`请填写该镜像是基于什么语言`);
this.setState({
languagewritetype:true
})
return
}
if(systemenvironment === undefined || systemenvironment === ""){
// this.props.showNotification(`请填写该镜像是基于什么语言系统环境`);
this.setState({
systemenvironmenttype:true
})
return;
}
if(testcoderunmode === undefined || testcoderunmode === "") {
// this.props.showNotification(`请填写该镜像中测试代码运行方式`);
this.setState({
testcoderunmodetype:true
})
return;
}
var attachment_ids=undefined;
if (this.state.fileList) {
attachment_ids = this.state.fileList.map(item => {
return item.response ? item.response.id : item.id
})
}
if( attachment_ids === undefined || attachment_ids.length===0){
// notification.open(
// {
// message: '提示',
// description:
// '请上传附件!',
//
// }
// )
this.setState({
attachmentidstype:true
})
return;
}
// console.log("attachment_ids"+attachment_ids);
// alert(languagewrite +" "+systemenvironment +" "+testcoderunmode + " "+attachment_ids);
var data={
language:languagewrite,
runtime:systemenvironment,
run_method:testcoderunmode,
attachment_id:attachment_ids[0],
}
var url =`/shixuns/apply_shixun_mirror.json`;
axios.post(url,data
).then((response) => {
try {
if (response.data) {
// const { id } = response.data;
// if (id) {
if(this.state.file !== undefined){
console.log("549");
// this.deleteAttachment(this.state.file);
this.setState({
file:undefined,
languagewrite:"",
systemenvironment:"",
testcoderunmode:"",
})
}else {
this.setState({
file:undefined,
languagewrite:"",
systemenvironment:"",
testcoderunmode:"",
})
}
// this.props.showNotification('提交成功!');
notification.open(
{
message: '提示',
description:
'提交成功!',
}
)
this.sendhideModaly()
// this.props.history.push(`/courses/${cid}/graduation_topics`);
// }
}
}catch (e) {
}
})
}
sendhideModaly = () => {
this.setState({
postapplyvisible: false,
})
if(this.state.file !== undefined){
console.log("580");
// this.deleteAttachment(this.state.file);
this.setState({
file:undefined,
languagewrite:"",
systemenvironment:"",
testcoderunmode:"",
})
}else {
this.setState({
file:undefined,
languagewrite:"",
systemenvironment:"",
testcoderunmode:"",
})
}
}
sendsure_applyvalues = (e) => {
this.setState({
sendsure_applyvalue: e.target.value
})
}
yeshidemodel = () => {
this.setState({
postapplytitle: false
})
}
SelectTheCommandonChange = (e) => {
this.setState({
multi_webssh: e.target.checked
})
}
bigopen = (e) => {
this.setState({
opers: true
})
}
bigopens = (e) => {
this.setState({
opers: false,
operss: false,
opensmail: false
})
}
bigopensmal = (e) => {
this.setState({
opensmail: true
})
}
sbigopen = (e) => {
this.setState({
operss: true
})
}
// sbigopens=()=>{
// this.setState({
// operss:false
// })
// }
onChangeTimePicker = (value, dateString) => {
this.setState({
TimePickervalue: dateString=== ""?"":moment(handleDateStrings(dateString))
})
}
// 附件相关 START
handleChange = (info) => {
console.log("handleChange1");
let fileList = info.fileList;
this.setState({ fileList:fileList,
deleteisnot:false});
}
onAttachmentRemove = (file) => {
confirm({
title: '确定要删除这个附件吗?',
okText: '确定',
cancelText: '取消',
// content: 'Some descriptions',
onOk: () => {
console.log("665")
this.deleteAttachment(file)
},
onCancel() {
console.log('Cancel');
},
});
return false;
}
deleteAttachment = (file) => {
console.log(file);
let id=file.response ==undefined ? file.id : file.response.id
const url = `/attachments/${id}.json`
axios.delete(url, {
})
.then((response) => {
if (response.data) {
const { status } = response.data;
if (status == 0) {
// console.log('--- success')
this.setState((state) => {
const index = state.fileList.indexOf(file);
const newFileList = state.fileList.slice();
newFileList.splice(index, 1);
return {
fileList: newFileList,
deleteisnot:true
};
});
}
}
})
.catch(function (error) {
console.log(error);
});
}
handleSubmit=()=>{
// console.log(this.state.languagewrite)
// console.log(this.state.systemenvironment)
// console.log(this.state.testcoderunmode)
var attachment_ids;
if (this.state.fileList) {
attachment_ids = this.state.fileList.map(item => {
return item.response ? item.response.id : item.id
})
}
// console.log(attachment_ids);
// var data={
// language:"",
// runtime:"",
// run_method:"",
// attachment_id:"",
// }
// axios.post(url,data
// ).then((response) => {
// if (response.data) {
// // const { id } = response.data;
// // if (id) {
// this.props.showNotification('提交成功!');
// // this.props.history.push(`/courses/${cid}/graduation_topics`);
// // }
// }
// })
}
render() {
const { getFieldDecorator } = this.props.form;
const thiss=this;
let {testcoderunmode ,systemenvironment,languagewrite,deleteisnot, fileList,TimePickervalue, scope_partmenttype, opensmail, newshixunlist, name, scope_partment, departmentslist, postapplyvisible, sendsure_applyvalue, postapplytitle, shixun_nametype, main_types, trainee_types, SelectTheCommandtype, opers, datalisttype, onSearchvalue} = this.state;
let options
if (departmentslist != undefined) {
options = this.state.departmentslist.map((d, k) => {
return (
<Option key={d} id={k}>{d}</Option>
)
})
}
const uploadProps = {
width: 600,
fileList,
multiple: true,
// https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false,
action: `${getUrl()}/api/attachments.json`,
onChange: this.handleChange,
onRemove: this.onAttachmentRemove,
beforeUpload: (file) => {
// console.log('beforeUpload', file.name);
const isLt150M = file.size / 1024 / 1024 < 50;
if (!isLt150M) {
// this.props.showNotification(`文件大小必须小于50MB`);
notification.open(
{
message: '提示',
description:
'文件大小必须小于50MB',
}
)
}
if(thiss.state.file !== undefined){
console.log("763")
// thiss.deleteAttachment(thiss.state.file);
thiss.setState({
file:file
})
}else {
thiss.setState({
file:file
})
}
console.log("handleChange2");
return isLt150M;
},
}
// const uploadProps = {
// width: 600,
// fileList,
// multiple: true,
// // https://github.com/ant-design/ant-design/issues/15505
// // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// // showUploadList: false,
// action: `${getUrl()}/api/attachments.json`,
// onChange: this.handleChange,
// onRemove: this.onAttachmentRemove,
// beforeUpload: (file) => {
// // console.log('beforeUpload', file.name);
// const isLt50M = file.size / 1024 / 1024 < 50;
// if (!isLt50M) {
// message.error('文件大小必须小于150MB!');
// }
// return isLt50M;
// },
// };
return (
<div className="newMain clearfix" onClick={this.bigopens}>
<div className="educontent mt20 mb60 clearfix">
<div className="new_shixun">
<div className="mb10 edu-back-white">
<p className="padding10-20 bor-bottom-greyE color-grey-3 clearfix">
<span className="fl font-18 lineh-35">创建实训</span>
<a className="fr font-16 mt3 color-blue" href="/forums/2943"
target="_blank">实训制作指南</a>
</p>
<div className="padding30-20">
<p className="color-grey-6 font-16 mb15">实训名称</p>
<div className="df">
<span className="mr30 color-orange pt10">*</span>
<div className="flex1">
<input
className={shixun_nametype === true ? "input-100-45 greyInput bor-red" : "input-100-45 greyInput"}
id="shixun_name" maxLength="60"
name="shixun[name]"
value={name}
onInput={this.shixunname}
placeholder="请输入实训名称最多60个字符"
size="60"
type="text"
style={{width: shixun_nametype === false ? '1123px' : '93%'}}
/>
<span
className={shixun_nametype === true ? "color-orange fr mt10" : "color-orange fr none"}
id="shixun_name_notice">
<i className="fa fa-exclamation-circle mr3"></i>
</span>
</div>
</div>
</div>
</div>
<div className="mb10 edu-back-white padding30-20">
<p className="color-grey-6 font-16 mb15">简介</p>
<div className="df">
<div className="flex1 break_word show_content_grey new_li" id="memoMD">
<textarea style={{display: 'none'}} id="evaluate_script_shows"
name="content"></textarea>
</div>
</div>
<p id="e_tip_memoNew" className="edu-txt-right color-grey-cd font-12"></p>
<p id="e_tips_memoNew" className="edu-txt-right color-grey-cd font-12"></p>
</div>
<div className="mb10 edu-back-white padding30-20">
<p className="color-grey-6 font-16 mb15">技术平台</p>
<div className="clearfix mb20">
<span className="mr30 color-orange pt5 fl">*</span>
<div className="width15 fl mr20"
// onMouseLeave={this.bigopens}
>
<Select placeholder="请选择主类别"
style={{width: 180}}
onChange={this.bigClass}
// onMouseEnter={this.bigopen}
onSelect={this.bigopens}
defaultOpen={false}
// open={opers}
>
{
newshixunlist === undefined ? "" : newshixunlist.main_type.map((item, key) => {
return (
<Option value={item.id} key={key}>{item.type_name}</Option>
)
})
}
</Select>
<p className="edu-txt-left font-12">
列表中没有
<a className="color-blue" onClick={this.post_apply}> 申请新建</a>
</p>
<Modal
keyboard={false}
title="申请新建"
visible={postapplyvisible}
closable={false}
footer={null}
width={850}
heigth={720}
>
{/*<Form onSubmit={this.handleSubmit}>*/}
<div>
<li className="clearfix ml85" >
<label className="fl mt10 "><span
className="color-red fl mt3">*</span>&nbsp;&nbsp;</label>
<textarea className="fl task-form-80 task-height-150"
style={{width:'89%',height:'100px'}}
onInput={this.setlanguagewrite}
value={languagewrite}
placeholder="请填写该镜像是基于什么语言示例Python"
id="demand_info"></textarea>
</li>
<div className={"color-red shixunspanred"}>{this.state.languagewritetype===true?"请填写该镜像语言":""}</div>
<li className="clearfix">
<label className="panel-form-label fl ml50"><span
className="color-red fl mt3">*</span>&nbsp;&nbsp;</label>
<textarea className="fl task-form-80 task-height-150 "
onInput={this.setsystemenvironment}
style={{height:'100px'}}
value={systemenvironment}
placeholder="请填写该镜像是基于什么linux系统环境,代码运行环境"
id="demand_info"></textarea>
</li>
<div className={"color-red shixunspanred"}>{this.state.systemenvironmenttype===true?"请填写该镜像语言系统环境":""}</div>
<li className="clearfix">
<label className="fl mt10" ><span
className="color-red fl mt3">*</span>&nbsp;&nbsp;</label>
<textarea className="fl task-form-80 task-height-150 "
onInput={this.settestcoderunmode}
value={testcoderunmode}
style={{height:'100px'}}
placeholder="请填写该镜像中测试代码运行方式"
id="demand_info"></textarea>
</li>
<div className={"color-red shixunspanred"}>{this.state.testcoderunmodetype===true?"请填写该镜像测试代码运行方式":""}</div>
<li className="clearfix ml50">
<label className="panel-form-label fl mt-5"><span
className="color-red fl">*</span>&nbsp;&nbsp;</label>
<div className="mt10" style={{
display: "inline-block"
}}>
{/*<Form.Item>*/}
{/* {*/}
{/* getFieldDecorator('file',{*/}
{/* rules:[{*/}
{/* }]*/}
{/* })(*/}
{
deleteisnot=== true?
<Upload {...uploadProps} >
<Icon type="upload" className="fl mt3" > </Icon>
<span className="color-blue fl">上传附件</span>
<span className="color-grey-c fl ml10 ">(单个文件50M以内)</span>
</Upload>
:
<Upload {...uploadProps} disabled={true} >
<Icon type="upload" className="fl mt3" > </Icon>
<span className="color-grey-c fl">上传附件</span>
<span className="color-grey-c fl ml10 ">(单个文件50M以内)</span>
</Upload>
}
{/* )*/}
{/* }*/}
{/*</Form.Item>*/}
</div>
</li>
<div className={"color-red shixunspanred"}>
{this.state.attachmentidstype===true?"请上传附件":""}
</div>
<li className="edu-txt-center clearfix ">
<a className="pop_close task-btn mr30"
onClick={() => this.sendhideModaly()}
>取消</a>
<Button type="primary" onClick={()=>this.sendsure_apply()}
className="task-btn task-btn-orange">确定</Button>
</li>
<div className="cl"></div>
</div>
{/*</Form>*/}
</Modal>
<Modal
keyboard={false}
title="提示"
visible={postapplytitle}
closable={false}
footer={null}
>
<div>
<div className="task-popup-content"><p
className="task-popup-text-center font-16"><span
className="font-17 mt10">新建申请已提交请等待管理员的审核</span></p>
<li className="font-14 mt15 color-grey-6 edu-txt-center">我们将在1-2个工作日内与您联系
</li>
</div>
<div className="task-popup-OK clearfix">
<a className="task-btn task-btn-orange"
onClick={this.yeshidemodel}>知道啦</a>
</div>
</div>
</Modal>
</div>
<div className=" fl pr mr20"
// onMouseLeave={this.bigopens}
>
<Select mode="multiple" placeholder="请选择小类别"
style={{minWidth: 180}}
onChange={this.littleClass}
// onMouseEnter={this.bigopensmal}
onSelect={this.bigopens}
defaultOpen={false}
// open={opensmail}
>
{
newshixunlist === undefined ? "" : newshixunlist.small_type.map((item, key) => {
return (
<Option value={item.id} key={key}>{item.type_name}</Option>
)
})
}
</Select>
</div>
<p className="fl ml10 color-grey-9 mt5">请在配置页面完成后续的评测脚本设置操作</p>
<div style={{width: '57px'}} className="ml20 fl">
<span className={main_types === true ? "color-orange fl" : "color-orange fl none"}
id="shixun_tech_platform_notice"><i
className="fa fa-exclamation-circle mr3"></i></span>
</div>
</div>
</div>
<div className="mb10 edu-back-white padding30-20">
<p className="color-grey-6 font-16 mb20">命令行</p>
<div className="pl25">
<RadioGroup onChange={this.SelectTheCommand} value={this.state.webssh}>
<Radio className="radioStyle" value={0}><span>无命令行窗口</span> <span
className="color-grey-9">选中则不给学员的实践任务提供命令窗口</span></Radio>
<Radio className="radioStyle" value={1}><span>命令行练习窗口</span> <span
className="color-grey-9">选中则给学员提供用于练习操作的命令行窗口</span></Radio>
<Radio className="radioStyle" value={2}><span>命令行评测窗口</span> <span
className="color-grey-9">选中则给学员提供用于关卡评测的命令行窗口</span></Radio>
<Checkbox style={{display: SelectTheCommandtype ? "block" : "none"}}
className={"ml36"} checked={this.state.multi_webssh}
onChange={this.SelectTheCommandonChange}>
多个命令行窗口<span className="color-grey-9">选中则允许学员同时开启多个命令行窗口</span>
</Checkbox>
</RadioGroup>
</div>
</div>
<div className="mb10 edu-back-white padding30-20">
<p className="color-grey-6 font-16 mb20">公开程度</p>
<div className="pl25">
<RadioGroup onChange={this.Selectpublic} value={this.state.use_scope}>
<Radio className="radioStyle" value={0}><span>对所有公开</span> <span
className="color-grey-9">(选中则所有已被试用授权的用户可以学习)</span></Radio>
<Radio className="radioStyle" value={1}><span>对指定单位公开</span> <span
className="color-grey-9">(选中则下方指定单位的已被试用授权的用户可以学习)</span></Radio>
</RadioGroup>
<div className="clearfix none" id="unit-all"
style={{display: this.state.scopetype === false ? 'none' : 'block'}}>
<div className="fl ml25">
<div className="fl" id="unit-input-part" style={{width: '100%'}}>
<div id="person-unit" className="fl pr mr10">
<div className="shixunScopeInput fl">
<Select
style={{width: '200px'}}
placeholder="请输入并选择单位名称"
onChange={(value) => this.shixunScopeInput(value)}
onSearch={this.shixunHandleSearch}
showSearch
defaultActiveFirstOption={false}
showArrow={false}
filterOption={false}
notFoundContent={null}
value={onSearchvalue}
className={scope_partmenttype === true ? "bor-red" : ""}
// ifd={key}
>
{options}
</Select>
</div>
<span className="color-grey-9">(搜索选中添加单位名称)</span>
{this.state.datalisttype===true?<span className="color-red ml10">请勿选择重复单位</span>:""}
{/*<a className="white-btn orange-btn fl mt1 use_scope-btn" onClick={this.adduse_scopeinput}>+ 添加</a>*/}
</div>
</div>
<div style={{width: '100%'}}>
<div className="mt20 clearfix" id="task_tag_content">
{
scope_partment === undefined ? "" : scope_partment.map((item, key) => {
return (
<li className="task_tag_span" key={key}><span>{item}</span>
<a style={{color: 'rgba(0,0,0,.25)'}}
onClick={() => this.deleteScopeInput(key)}>×</a>
</li>
)
})
}
</div>
{/*{*/}
{/*scope_partment===undefined?"":scope_partment.map((item,key)=>{*/}
{/*return(*/}
{/*<div className="shixunScopeInput fl" key={key}>*/}
{/*<Input*/}
{/*style={{width:'200px'}}*/}
{/*key={key}*/}
{/*className=""*/}
{/*suffix={<Icon type="close-circle" onClick={(key)=>this.deleteScopeInput(key)} style={{ color: 'rgba(0,0,0,.25)' }} />}*/}
{/*value={item}*/}
{/*/>*/}
{/*</div>*/}
{/*)*/}
{/*})*/}
{/*}*/}
</div>
<span className={scope_partmenttype === true ? "color-orange ml20 fl" : "none"}
id="public_unit_notice">
<i className="fa fa-exclamation-circle mr3"></i>
请选择需要公开的单位
</span>
</div>
</div>
</div>
</div>
<div className="mb10 edu-back-white padding30-20">
<p className="color-grey-6 font-16 mb20">发布信息</p>
<div className="clearfix"
// onMouseLeave={this.bigopens}
>
<div className="clearfix mb20 pl25">
<span className="fl color-grey-6 lineh-30 mr20"><span
className="mr10 color-orange mt2 fl">*</span></span>
<div className="with15 fl pr">
<Select placeholder="请选择学员类别"
style={{width: 180}}
onChange={this.Selectthestudent}
// onMouseEnter={this.sbigopen}
onSelect={this.bigopens}
// open={operss}
>
<Option value={1}>初级学员</Option>
<Option value={2}>中级学员</Option>
<Option value={3}>高级学员</Option>
<Option value={4}>顶级学员</Option>
</Select>
</div>
<span className="fl ml20 mt3 color-grey">实训难易度定位不限定用户群体</span>
<div style={{width: '57px'}} className="ml20 mt2 fl">
<span
className={trainee_types === true ? "color-orange fl" : "color-orange fl none"}
id="shixun_tech_platform_notice"><i
className="fa fa-exclamation-circle mr3"></i></span>
</div>
</div>
</div>
<li className="mb20 pl25">
<span className="fl edu-txt-right color-grey-6 mr20"
style={{"width": "86px"}}>复制</span>
<Checkbox onChange={this.Teacherscopy}></Checkbox>
<label style={{top: '6px'}} className="color-grey-6 ml10">勾选则允许已认证的教师复制该实训</label>
</li>
<div className="clearfix pl25">
<span className="fl edu-txt-right color-grey-6 lineh-30 mr20"
style={{"width": "86px"}}>开启时间</span>
<li className="fl">
<DatePicker
showToday={false}
locale={locale}
showTime={{ format: 'HH:mm' }}
style={{"width": "184px"}}
format="YYYY-MM-DD HH:mm"
placeholder="请选择开启时间"
onChange={this.onChangeTimePicker}
value={TimePickervalue && moment(TimePickervalue, "YYYY-MM-DD HH:mm")}
disabledDate={disabledDate}
disabledTime={disabledDateTime}
dropdownClassName="hideDisable"
/>
<label style={{top: '6px'}} className="color-grey-6 ml10">
为空则学员在实训发布后能随时开启实训挑战否则学员在开启时间后才能开启实训挑战
</label>
</li>
</div>
</div>
{/*<div className="mb10 edu-back-white padding30-20">*/}
{/*<p className="color-grey-6 font-16 mb10">VNC图形化</p>*/}
{/*<li className="mb20">*/}
{/*<Checkbox onChange={this.TeachersUbuntu}></Checkbox>*/}
{/*<label style={{top:'6px'}} className="color-grey-6 ml10">勾选则给学员的实践任务提供Ubuntu系统图形化实践窗口否则不提供</label>*/}
{/*</li>*/}
{/*</div>*/}
<div className="clearfix mt30">
<a className="defalutSubmitbtn fl mr20" onClick={this.submit_new_shixun}>提交</a>
<a href="/shixuns" className="defalutCancelbtn fl">取消</a>
</div>
</div>
</div>
</div>
);
}
}
const NewshixunsNew = Form.create({ name: 'newshixunsnew' })(Newshixuns);
export default SnackbarHOC()(TPMIndexHOC(NewshixunsNew));