Merge branches 'dev_aliyun' and 'topic_bank' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun
	
		
	
				
					
				
			
						commit
						9f9532eb69
					
				
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| @ -0,0 +1,5 @@ | |||||||
|  | class ModifyIsTestForUser < ActiveRecord::Migration[5.2] | ||||||
|  |   def change | ||||||
|  |     change_column :users, :is_test, :integer, :limit => 1 | ||||||
|  |   end | ||||||
|  | end | ||||||
| @ -0,0 +1,449 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | 
 | ||||||
|  | import {Link} from 'react-router-dom'; | ||||||
|  | import {Tooltip,Menu} from 'antd'; | ||||||
|  | import Loadable from 'react-loadable'; | ||||||
|  | import Loading from '../../../../Loading'; | ||||||
|  | import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; | ||||||
|  | import axios from 'axios'; | ||||||
|  | import HomeworkModal from "../../coursesPublic/HomeworkModal"; | ||||||
|  | import AccessoryModal from "../../coursesPublic/AccessoryModal"; | ||||||
|  | import Associationmodel from '../../coursesPublic/Associationmodel'; | ||||||
|  | import CoursesListType from '../../coursesPublic/CoursesListType'; | ||||||
|  | import moment from 'moment'; | ||||||
|  | import "../../css/members.css" | ||||||
|  | import "../../css/Courses.css" | ||||||
|  | 
 | ||||||
|  | import Modals from '../../../modals/Modals'; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //毕设描述
 | ||||||
|  | const GraduationTasksquestions= Loadable({ | ||||||
|  |   loader: () => import('./GraduationTaskssettingquestions'), | ||||||
|  |   loading: Loading, | ||||||
|  | }) | ||||||
|  | //毕设任务设置
 | ||||||
|  | const GraduationTaskssetting=Loadable({ | ||||||
|  |   loader: () => import('./GraduationTaskssetting'), | ||||||
|  |   loading: Loading, | ||||||
|  | }) | ||||||
|  | //毕设任务列表
 | ||||||
|  | const GraduationTaskslist=Loadable({ | ||||||
|  |   loader: () => import('./GraduationTaskssettinglist'), | ||||||
|  |   loading: Loading, | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | class GraduationTaskDetail extends Component{ | ||||||
|  |   constructor(props){ | ||||||
|  |     super(props); | ||||||
|  |     this.state={ | ||||||
|  |       modalname:undefined, | ||||||
|  |       visible:false, | ||||||
|  | 			Topval:undefined, | ||||||
|  | 			starttime:undefined, | ||||||
|  | 			starttimes:undefined, | ||||||
|  | 			typs:undefined, | ||||||
|  |       endtime:undefined, | ||||||
|  |       Cancelname:undefined, | ||||||
|  |       Savesname:undefined, | ||||||
|  |       Cancel:undefined, | ||||||
|  |       Saves:undefined, | ||||||
|  |       Topvalright:undefined, | ||||||
|  |       Botvalleft:undefined, | ||||||
|  |       course_groupslist:undefined, | ||||||
|  |       course_groups:undefined, | ||||||
|  |       questionslist:undefined, | ||||||
|  |       tab:"list", | ||||||
|  |       visibles:undefined, | ||||||
|  |       Modalstype:undefined, | ||||||
|  |       Modalstopval:undefined, | ||||||
|  |       ModalCancel:undefined, | ||||||
|  |       ModalSave:undefined | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   componentDidMount(){ | ||||||
|  |     this.getdatas() | ||||||
|  |    } | ||||||
|  |    getdatas=()=>{ | ||||||
|  |      const task_Id = this.props.match.params.task_Id; | ||||||
|  |      let url="/graduation_tasks/"+task_Id+".json"; | ||||||
|  |   | ||||||
|  |      axios.get(url).then((result)=>{ | ||||||
|  |        if(result.status===200){ | ||||||
|  |          this.setState({ | ||||||
|  |            questionslist:result.data | ||||||
|  |          }) | ||||||
|  |   | ||||||
|  |        } | ||||||
|  |      }).catch((error)=>{ | ||||||
|  |        console.log(error) | ||||||
|  |      }) | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |   //返回
 | ||||||
|  |   goback=()=>{ | ||||||
|  |     // let courseId=this.props.match.params.coursesId;
 | ||||||
|  |     // let category_id=this.props.match.params.category_id;
 | ||||||
|  |     // window.location.href="/courses/"+courseId+"/graduation_tasks/"+category_id;
 | ||||||
|  | 		// let courseId = this.props.match.params.coursesId;
 | ||||||
|  | 		// if(courseId===undefined){
 | ||||||
|  | 		// 	this.props.history.push("/courses");
 | ||||||
|  | 		// }else{
 | ||||||
|  | 		// 	this.props.history.push(this.props.current_user.first_category_url);
 | ||||||
|  | 		// }
 | ||||||
|  | 
 | ||||||
|  | 		// this.props.history.goBack()
 | ||||||
|  | 		this.props.history.replace(`/courses/${this.state.questionslist.course_id}/graduation_tasks/${this.state.questionslist.graduation_id}`); | ||||||
|  |   } | ||||||
|  |   //立即发布
 | ||||||
|  |   publish=()=>{ | ||||||
|  |     let starttime= this.props.getNowFormatDates(1,1); | ||||||
|  |     let endtime=this.props.getNowFormatDates(2,1); | ||||||
|  |     // this.homeworkstart()
 | ||||||
|  |     this.setState({ | ||||||
|  |       modalname:"立即发布", | ||||||
|  |       visible:true, | ||||||
|  | 			Topval:"学生将立即收到毕设任务", | ||||||
|  |       // Botvalleft:"点击修改",
 | ||||||
|  | 			// Botval:`本操作只对"未发布"的分班有效`,
 | ||||||
|  | 			starttime:moment(moment(new Date())).format("YYYY-MM-DD HH:mm") , | ||||||
|  | 			starttimes:this.props.getNowFormatDates(1), | ||||||
|  | 			typs:"start", | ||||||
|  |       endtime:endtime, | ||||||
|  |       Cancelname:"暂不发布", | ||||||
|  |       Savesname:"立即发布", | ||||||
|  |       Cancel:this.cancelmodel, | ||||||
|  |       Saves:this.homepublish, | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |   // 确定立即发布
 | ||||||
|  |   homepublish=(ids,endtime)=>{ | ||||||
|  |     this.cancelmodel(); | ||||||
|  |     let task_Id=this.props.match.params.task_Id; | ||||||
|  |     const cid = this.props.match.params.coursesId; | ||||||
|  |     // let url = `/courses/${cid}/graduation_tasks/publish_task.json`;
 | ||||||
|  | 
 | ||||||
|  |     let url="/courses/"+cid+"/graduation_tasks/publish_task.json" | ||||||
|  |     axios.post(url,{ | ||||||
|  |       task_ids:[task_Id], | ||||||
|  |       group_ids: this.state.course_groupslist, | ||||||
|  | 			end_time:endtime, | ||||||
|  |     }).then((response)=>{ | ||||||
|  |       if (response.data.status == 0) { | ||||||
|  | 				this.getdatas() | ||||||
|  |         this.props.showNotification(response.data.message); | ||||||
|  |          | ||||||
|  |         this.setState({ | ||||||
|  |           // Modalstopval:response.data.message,
 | ||||||
|  |           // ModalSave:this.cancelmodel,
 | ||||||
|  |           // Loadtype:true,
 | ||||||
|  |           course_groupslist:[], | ||||||
|  |           checkAllValue:false | ||||||
|  |         }) | ||||||
|  |       } | ||||||
|  |     }).catch((error)=>{ | ||||||
|  | 
 | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 刷新
 | ||||||
|  |   resetList=()=>{ | ||||||
|  |     this.getdatas(); | ||||||
|  |     this.child && this.child.searchValue(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 立即截止
 | ||||||
|  |   end=()=>{ | ||||||
|  | 		// this.homeworkstart()
 | ||||||
|  | 		this.setState({ | ||||||
|  | 			modalname:"立即截止", | ||||||
|  | 			visible:true, | ||||||
|  | 			Topval:"学生将不能再提交作品", | ||||||
|  | 			// Botvalleft:"暂不截止",
 | ||||||
|  | 			// Botval:`本操作只对"提交中"的分班有效`,
 | ||||||
|  | 			Cancelname:"暂不截止", | ||||||
|  | 			Savesname:"立即截止", | ||||||
|  | 			Cancel:this.cancelmodel, | ||||||
|  | 			Saves:this.coursetaskend, | ||||||
|  | 			typs:"end", | ||||||
|  | 		}) | ||||||
|  |   } | ||||||
|  |   // 取消
 | ||||||
|  |   cancelmodel=()=>{ | ||||||
|  |     this.setState({ | ||||||
|  |       Modalstype:false, | ||||||
|  |       Loadtype:false, | ||||||
|  |       visible:false, | ||||||
|  |       Modulationtype:false, | ||||||
|  |       Allocationtype:false, | ||||||
|  |       Modalstopval:"", | ||||||
|  |       ModalCancel:"", | ||||||
|  |       ModalSave:"", | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   getcourse_groupslist=(id)=>{ | ||||||
|  |     this.setState({ | ||||||
|  |       course_groupslist:id | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   setTab = (tab) =>{ | ||||||
|  |     this.setState({ | ||||||
|  |       tab | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 关联项目
 | ||||||
|  |   AssociationItems=()=>{ | ||||||
|  | 		this.setState({ | ||||||
|  | 			visibles:true | ||||||
|  | 		}) | ||||||
|  |   } | ||||||
|  |   Cancel=()=>{ | ||||||
|  | 		this.setState({ | ||||||
|  | 			visibles:false | ||||||
|  | 		}) | ||||||
|  |   } | ||||||
|  |   // 取消关联
 | ||||||
|  |   cannelAssociation=()=>{ | ||||||
|  | 		this.setState({ | ||||||
|  | 			Modalstype:true, | ||||||
|  | 			Modalstopval:"确定要取消该项目关联?", | ||||||
|  | 			ModalCancel:this.cannerassocition, | ||||||
|  | 			ModalSave:this.savetassociton | ||||||
|  | 		}) | ||||||
|  |   } | ||||||
|  |   savetassociton=()=>{ | ||||||
|  | 		this.cannerassocition(); | ||||||
|  | 		let {questionslist}=this.state; | ||||||
|  | 		let url = "/graduation_tasks/"+questionslist.task_id+"/graduation_works/cancel_relate_project.json"; | ||||||
|  | 		console.log(url) | ||||||
|  | 		axios.get(url).then((result)=>{ | ||||||
|  | 			if(result.data.status===0){ | ||||||
|  | 				this.resetList(); | ||||||
|  | 			} | ||||||
|  | 		}).catch((error)=>{ | ||||||
|  | 			console.log(error) | ||||||
|  | 		}) | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  |   cannerassocition=()=>{ | ||||||
|  | 		this.setState({ | ||||||
|  | 			Modalstype:false, | ||||||
|  | 			Modalstopval:"", | ||||||
|  | 			ModalCancel:"", | ||||||
|  | 			ModalSave:"", | ||||||
|  | 			loadtype:false, | ||||||
|  | 			visibles:false | ||||||
|  | 		}) | ||||||
|  |   } | ||||||
|  |   // 补交附件
 | ||||||
|  |   handaccessory=()=>{ | ||||||
|  | 	  // let {taskslistdata}=this.state;
 | ||||||
|  | 		// let courseId=this.props.match.params.coursesId;
 | ||||||
|  | 		//
 | ||||||
|  | 		// let url="/courses/"+courseId+"/graduation_tasks/"+taskslistdata.work_id+"/appraise"
 | ||||||
|  | 		//
 | ||||||
|  | 		// window.location.href=url;
 | ||||||
|  | 		this.setState({ | ||||||
|  | 			avisible:true | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 	Cancelvisible=()=>{ | ||||||
|  | 		this.setState({ | ||||||
|  | 			avisible:false | ||||||
|  | 		}) | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   bindRef = ref => { this.child = ref } ; | ||||||
|  |   render(){ | ||||||
|  |      | ||||||
|  |     let courseId=this.props.match.params.coursesId; | ||||||
|  |     let category_id=this.props.match.params.category_id; | ||||||
|  |     let task_Id=this.props.match.params.task_Id; | ||||||
|  |     let {  | ||||||
|  |       questionslist ,  | ||||||
|  |       tab ,  | ||||||
|  |       visibles ,  | ||||||
|  |       Modalstype, | ||||||
|  |       Modalstopval, | ||||||
|  |       ModalCancel, | ||||||
|  |       ModalSave | ||||||
|  |     } = this.state | ||||||
|  |      | ||||||
|  |     const commom = { | ||||||
|  |       setTab:this.setTab | ||||||
|  |     } | ||||||
|  |     return( | ||||||
|  |       <div className="newMain clearfix"> | ||||||
|  |         { | ||||||
|  |           questionslist &&  | ||||||
|  |           <div className={"educontent mb20"}> | ||||||
|  |           <HomeworkModal | ||||||
|  |             starttimes={this.state.starttimes} | ||||||
|  |             typs={this.state.typs} | ||||||
|  |             modalname={this.state.modalname} | ||||||
|  |             visible={this.state.visible} | ||||||
|  |             Topval={this.state.Topval} | ||||||
|  |             Topvalright={this.state.Topvalright} | ||||||
|  |             Botvalleft={this.state.Botvalleft} | ||||||
|  |             Botval={this.state.Botval} | ||||||
|  |             starttime={this.state.starttime} | ||||||
|  |             endtime={this.state.endtime} | ||||||
|  |             Cancelname={this.state.Cancelname} | ||||||
|  |             Savesname={this.state.Savesname} | ||||||
|  |             Cancel={this.state.Cancel} | ||||||
|  |             Saves={this.state.Saves} | ||||||
|  |             course_groups={this.state.course_groups} | ||||||
|  |             modaltype={this.state.modaltype} | ||||||
|  |             getcourse_groupslist={(id) => this.getcourse_groupslist(id)} | ||||||
|  |           /> | ||||||
|  |           {/*关联项目*/} | ||||||
|  | 					{visibles===true? | ||||||
|  | 						<Associationmodel | ||||||
|  | 						modalname={"关联项目"} | ||||||
|  | 						visible={visibles} | ||||||
|  | 						Cancel={()=>this.Cancel()} | ||||||
|  | 						taskid={ questionslist && questionslist.task_id } | ||||||
|  | 						funlist={this.resetList} | ||||||
|  | 					  /> | ||||||
|  |           :""} | ||||||
|  | 
 | ||||||
|  |           {this.state.avisible===true?<AccessoryModal | ||||||
|  | 						{...this.props} | ||||||
|  | 						modalname={"补交附件"} | ||||||
|  | 						visible={this.state.avisible} | ||||||
|  | 						Cancelname={"取消"} | ||||||
|  | 						Savesname={"确认"} | ||||||
|  | 						Cancel={this.Cancelvisible} | ||||||
|  | 						categoryid={questionslist.work_id} | ||||||
|  | 						setupdate={this.resetList} | ||||||
|  | 					/>:""} | ||||||
|  |           {/*提示*/} | ||||||
|  | 					<Modals | ||||||
|  | 						modalsType={Modalstype} | ||||||
|  | 						modalsTopval={Modalstopval} | ||||||
|  | 						modalCancel={ModalCancel} | ||||||
|  | 						modalSave={ModalSave} | ||||||
|  | 						closable={false} | ||||||
|  | 						footer={null} | ||||||
|  | 						destroyOnClose={true} | ||||||
|  | 						centered={true} | ||||||
|  | 					/> | ||||||
|  |           <p className="clearfix mt10"> | ||||||
|  |             <a onClick={this.goback} className="color-grey-9 fl">{questionslist.course_name}</a> | ||||||
|  |             <span className="color-grey-9 fl ml3 mr3">></span> | ||||||
|  |             <Link to={`/courses/${courseId}/graduation_tasks/${category_id}`} className="color-grey-9 fl">{questionslist.graduation_name}</Link> | ||||||
|  |             <span className="color-grey-9 fl ml3 mr3">></span> | ||||||
|  |             <span className="color-grey-6">任务详情</span> | ||||||
|  |           </p> | ||||||
|  |           <div className="clearfix mt20 mb20 lineh-25 linbox"> | ||||||
|  |             <p className=" fl color-black summaryname"> | ||||||
|  |                 <Link to={`/courses/${courseId}/graduation_tasks/${category_id}`} className="color-grey-3">{questionslist.task_name}</Link> | ||||||
|  |             </p> | ||||||
|  |             <CoursesListType | ||||||
|  |               typelist={questionslist.task_status} | ||||||
|  |             /> | ||||||
|  |             <a className="color-grey-3 fr font-16 ml30 mr20" onClick={this.goback}>返回</a> | ||||||
|  |           </div> | ||||||
|  |           <div className="stud-class-set bor-bottom-greyE"> | ||||||
|  |                 <div className="clearfix edu-back-white pl30 pr30 graduationTaskMenu"> | ||||||
|  | 
 | ||||||
|  |                   <Link className={tab && tab == "list" ? "active" : ""} to={"/courses/"+courseId+"/graduation_tasks/"+category_id+"/"+task_Id+"/list"}>任务列表</Link> | ||||||
|  |                   <Link className={tab && tab == "questions" ? "active" : ""} to={"/courses/"+courseId+"/graduation_tasks/"+category_id+"/"+task_Id+"/questions"}>毕设描述</Link> | ||||||
|  |                   <Link className={tab && tab == "setting" ? "active" : ""} to={"/courses/"+courseId+"/graduation_tasks/"+category_id+"/"+task_Id+"/setting?tab=3"}>设置</Link> | ||||||
|  | 
 | ||||||
|  |                   {/*<a className={"fr color-blue font-16"}>导出成绩</a>*/} | ||||||
|  |                   {/*{this.props.isAdmin()?<a href={"/api/graduation_tasks/"+task_Id+"/tasks_list.xls"} className={"fr color-blue font-16"}>导出成绩</a>:""}*/} | ||||||
|  |                   {/*{this.props.isAdmin()?<a href={"/api/graduation_tasks/"+task_Id+"/tasks_list.zip"} className={"fr color-blue font-16"}>导出作品附件</a>:""}*/} | ||||||
|  | 
 | ||||||
|  |                   <style> | ||||||
|  |                     { ` | ||||||
|  | 													.drop_down_menu{ | ||||||
|  | 														height: 118px; | ||||||
|  | 														left:0px; | ||||||
|  | 														width: 121px; | ||||||
|  | 													 } | ||||||
|  | 													.drop_down_menu li { | ||||||
|  | 														 overflow: visible; | ||||||
|  | 															 width: 121px; | ||||||
|  | 														 } | ||||||
|  | 														.drop_down_menu li a{ | ||||||
|  | 																 padding:  0px; | ||||||
|  | 																font-size: 14px; | ||||||
|  | 														 } | ||||||
|  | 														 .mt19{ | ||||||
|  | 															margin-top:19px; | ||||||
|  | 														 } | ||||||
|  | 														 .drop_down_menu, .drop_down_normal{ | ||||||
|  | 																padding-top: 10px; | ||||||
|  | 																padding-bottom: 8px; | ||||||
|  | 														 } | ||||||
|  | 														 	 .drop_down_menu li .color-dark{ | ||||||
|  | 																	color: #666 !important; | ||||||
|  |                               } | ||||||
|  |                             .linbox{ | ||||||
|  |                               height: 26px; | ||||||
|  |                             } | ||||||
|  | 													`}
 | ||||||
|  |                   </style> | ||||||
|  |                   {this.props.isAdmin()? <li className="li_line drop_down fr color-blue font-16 mt20" style={{"paddingLeft":"0px"}}> | ||||||
|  |                     导出<i className="iconfont icon-xiajiantou font-12 ml2"></i> | ||||||
|  |                     <ul className="drop_down_menu" style={{"right":"-34px","left":"unset","height":"auto"}}> | ||||||
|  |                       <li><a onClick={()=>this.confirmysl("/graduation_tasks/"+task_Id+"/tasks_list.xlsx")} className="color-dark">导出成绩</a></li> | ||||||
|  |                       <li><a onClick={()=>this.confirmysl("/graduation_tasks/"+task_Id+"/tasks_list.zip")} className="color-dark">导出作品附件</a></li> | ||||||
|  |                     </ul> | ||||||
|  |                   </li>:""} | ||||||
|  |                   {questionslist.work_status===undefined||questionslist.work_status===null||questionslist.work_status.length===0?"":questionslist.work_status.map((item,key)=>{ | ||||||
|  |                     return( | ||||||
|  |                       <span key={key}> | ||||||
|  |                           {item==="提交作品"?<a className={"fr color-blue font-16"} href={"/courses/"+courseId+"/graduation_tasks/"+category_id+"/"+task_Id+"/works/new"}>提交作品</a>:""} | ||||||
|  |                           {item==="补交作品"?<a className={"fr color-blue font-16"} href={"/courses/"+courseId+"/graduation_tasks/"+category_id+"/"+task_Id+"/works/new"}>补交作品</a>:""} | ||||||
|  |                           {item==="修改作品"?<a className={"fr color-blue font-16"} href={"/courses/"+courseId+"/graduation_tasks/"+category_id+"/"+questionslist.work_id+"/works/edit"}>修改作品</a>:""} | ||||||
|  |                           {item==="查看作品"?<a className={"fr color-blue font-16"} href={"/courses/"+courseId+"/graduation_tasks/"+category_id+"/"+questionslist.work_id+"/works/edit"}>查看作品</a> :""} | ||||||
|  |                           {item==="创建项目"?<a className={"fr color-blue font-16"} href={'/projects/new'} target="_blank">创建项目</a>:""} | ||||||
|  |                           {item==="关联项目"?<a className={"fr color-blue font-16"} onClick={this.AssociationItems}>关联项目</a>:""} | ||||||
|  |                           {item==="取消关联"?<a className={"fr color-blue font-16"} onClick={this.cannelAssociation}>取消关联</a>:""} | ||||||
|  |                           {item==="补交附件"?<a className={"fr color-blue font-16"} onClick={this.handaccessory}>补交附件</a>:""} | ||||||
|  |                       </span> | ||||||
|  | 
 | ||||||
|  |                     ) | ||||||
|  |                   })} | ||||||
|  | 
 | ||||||
|  |                   {/*<a className={"fr color-blue font-16"}>项目在线质量检测</a>*/} | ||||||
|  |                   { this.props.isAdmin() ? questionslist.status===1 ? <a className={"fr color-blue font-16 mr20"} onClick={() => { this.end()} }>立即截止</a> : "" : "" } | ||||||
|  |                   { this.props.isAdmin() ? questionslist.status===0 ? <a className={"fr color-blue font-16 mr20"} onClick={() => { this.publish()} }>立即发布</a> : "" : "" } | ||||||
|  | 
 | ||||||
|  |                   { this.props.isAdmin() ? <a className={"fr color-blue font-16"} href={"/courses/"+courseId+"/graduation_tasks/"+task_Id+"/edit"}>编辑任务</a> : "" } | ||||||
|  |                 </div> | ||||||
|  |               </div> | ||||||
|  |           <Switch {...this.props}> | ||||||
|  | 
 | ||||||
|  |             <Route exact path="/courses/:coursesId/graduation_tasks/:category_id/:task_Id/list" | ||||||
|  |               render={ | ||||||
|  |                   (props) => (<GraduationTaskslist {...this.props} {...props} {...this.state} {...commom} triggerRef={this.bindRef} tab={`list`}/>) | ||||||
|  |               } | ||||||
|  |             ></Route> | ||||||
|  | 
 | ||||||
|  | 						<Route exact path="/courses/:coursesId/graduation_tasks/:category_id/:task_Id/setting" | ||||||
|  |               render={ | ||||||
|  |                   (props) => (<GraduationTaskssetting {...this.props} {...props} {...this.state} {...commom} tab={`setting`}/>) | ||||||
|  |               } | ||||||
|  |             ></Route> | ||||||
|  | 
 | ||||||
|  |             <Route exact path="/courses/:coursesId/graduation_tasks/:category_id/:task_Id/questions" | ||||||
|  |             render={ | ||||||
|  |                 (props) => (<GraduationTasksquestions {...this.props} {...props} {...this.state} {...commom} tab={`questions`}/>) | ||||||
|  |             }></Route> | ||||||
|  |              | ||||||
|  |           </Switch> | ||||||
|  |         </div> | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |       </div> | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | // CNotificationHOC() ( SnackbarHOC() ( TPMIndexHOC))
 | ||||||
|  | export default (GraduationTaskDetail) ; | ||||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| @ -0,0 +1,45 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | 
 | ||||||
|  | import { Redirect } from 'react-router'; | ||||||
|  | 
 | ||||||
|  | import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; | ||||||
|  | 
 | ||||||
|  | import Loading from '../../Loading' | ||||||
|  | 
 | ||||||
|  | import Loadable from 'react-loadable'; | ||||||
|  | import { TPMIndexHOC } from '../tpm/TPMIndexHOC' | ||||||
|  | import { SnackbarHOC } from 'educoder' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const PackageIndex = Loadable({ | ||||||
|  | 	loader: () => import('../user/usersInfo/InfosTopics'), | ||||||
|  | 	loading: Loading, | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Topic_bank extends Component { | ||||||
|  | 	constructor(props) { | ||||||
|  | 		super(props) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	componentDidMount(){ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	render() { | ||||||
|  | 		return ( | ||||||
|  | 			<div className="newMain clearfix"> | ||||||
|  | 
 | ||||||
|  | 				<Switch> | ||||||
|  | 					<Route path="/topicbank/:username/:topicstype" | ||||||
|  | 								 render={ | ||||||
|  | 									 (props) => (<PackageIndex {...this.props} {...props} {...this.state} />) | ||||||
|  | 								 } | ||||||
|  | 					></Route> | ||||||
|  | 				</Switch> | ||||||
|  | 
 | ||||||
|  | 			</div> | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export default SnackbarHOC() (TPMIndexHOC (Topic_bank)) ; | ||||||
| @ -0,0 +1,589 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | import { SnackbarHOC } from 'educoder'; | ||||||
|  | import {BrowserRouter as Router,Route,Switch,Link} from 'react-router-dom'; | ||||||
|  | import {Tooltip,Menu,Pagination,Spin, Dropdown,Checkbox} from 'antd'; | ||||||
|  | import axios from 'axios'; | ||||||
|  | import {getImageUrl,WordsBtn} from 'educoder'; | ||||||
|  | import moment from 'moment'; | ||||||
|  | import Modals from '../../modals/Modals'; | ||||||
|  | import SendTopics from '../../modals/SendTopics' | ||||||
|  | import NoneData from '../../courses/coursesPublic/NoneData'; | ||||||
|  | import "./usersInfo.css"; | ||||||
|  | import Withoutpermission from './Withoutpermission.png'; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class InfosTopics extends Component{ | ||||||
|  | 	constructor(props){ | ||||||
|  | 		super(props); | ||||||
|  | 		this.state={ | ||||||
|  | 			isSpin:false, | ||||||
|  | 			category:"normal", | ||||||
|  | 			course_list_id:undefined, | ||||||
|  | 			sort_by:"updated_at", | ||||||
|  | 			sort_direction:"desc", | ||||||
|  | 			page:1, | ||||||
|  | 			data:undefined, | ||||||
|  | 			checkBoxValues:[], | ||||||
|  | 			per_page:15, | ||||||
|  | 			isshowprofes:false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	componentDidMount(){ | ||||||
|  | 		let types=this.props.match.params.topicstype; | ||||||
|  |     let professional_certification=this.props.current_user&&this.props.current_user.professional_certification; | ||||||
|  | 
 | ||||||
|  | 		if(professional_certification===false&&types==="publicly"){ | ||||||
|  |       this.setState({ | ||||||
|  | 				isshowprofes:true | ||||||
|  | 			}) | ||||||
|  | 		}else{ | ||||||
|  | 			this.updataslist() | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	componentDidUpdate(prevProps) { | ||||||
|  | 
 | ||||||
|  | 		if(prevProps.current_user!=this.props.current_user){ | ||||||
|  | 			let types=this.props.match.params.topicstype; | ||||||
|  | 			let professional_certification=this.props.current_user&&this.props.current_user.professional_certification; | ||||||
|  | 
 | ||||||
|  | 			console.log(professional_certification) | ||||||
|  | 			if(professional_certification===false&&types==="publicly"){ | ||||||
|  | 				this.setState({ | ||||||
|  | 					isshowprofes:true | ||||||
|  | 				}) | ||||||
|  | 			}else{ | ||||||
|  | 				this.updataslist() | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	updataslist=()=>{ | ||||||
|  | 		let types=this.props.match.params.topicstype; | ||||||
|  | 		let { category,course_list_id,sort_by,sort_direction,page}=this.state; | ||||||
|  | 		this.searchAlldata(types,category,course_list_id,sort_by,sort_direction,page) | ||||||
|  | 	} | ||||||
|  | 	searchAlldata=(type,category,course_list_id,sort_by,sort_direction,page)=>{ | ||||||
|  | 
 | ||||||
|  | 		// if(this.props.current_user.login!=this.props.match.params.username){
 | ||||||
|  | 		// 	return
 | ||||||
|  | 		// }else{
 | ||||||
|  | 		//
 | ||||||
|  | 		// }
 | ||||||
|  | 		this.setState({ | ||||||
|  | 			isSpin:true | ||||||
|  | 		}) | ||||||
|  | 		let types=this.props.match.params.topicstype; | ||||||
|  | 		let user_id=""; | ||||||
|  | 
 | ||||||
|  | 		if(types==="publicly"){ | ||||||
|  | 			  user_id=this.props.current_user&&this.props.current_user.login; | ||||||
|  | 		}else{ | ||||||
|  |         user_id=this.props.match.params&&this.props.match.params.username; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if(user_id!=undefined){ | ||||||
|  | 			console.log(user_id) | ||||||
|  | 			let {per_page}=this.state; | ||||||
|  | 			let url=`/users/${user_id}/question_banks.json`; | ||||||
|  | 
 | ||||||
|  | 			axios.get(encodeURI(url),{params:{ | ||||||
|  | 					type, | ||||||
|  | 					object_type:category, | ||||||
|  | 					course_list_id, | ||||||
|  | 					sort_by, | ||||||
|  | 					sort_direction, | ||||||
|  | 					page, | ||||||
|  | 					per_page | ||||||
|  | 				} | ||||||
|  | 			}).then((response) => { | ||||||
|  | 				this.setState({ | ||||||
|  | 					data:response.data, | ||||||
|  | 					checkBoxValues:[], | ||||||
|  | 					isSpin:false | ||||||
|  | 				}) | ||||||
|  | 			}).catch((error) => { | ||||||
|  | 				this.setState({ | ||||||
|  | 					isSpin:false | ||||||
|  | 				}) | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	searchCategory=(type)=>{ | ||||||
|  | 		this.setState({ | ||||||
|  | 			category:type, | ||||||
|  | 			course_list_id:undefined, | ||||||
|  | 		}) | ||||||
|  | 
 | ||||||
|  | 		let types=this.props.match.params.topicstype; | ||||||
|  | 		let { category,course_list_id,sort_by,sort_direction,page}=this.state; | ||||||
|  | 		this.searchAlldata(types,type,undefined,sort_by,sort_direction,page) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	searchCourselistid=(id)=>{ | ||||||
|  | 		this.setState({ | ||||||
|  | 			course_list_id:id | ||||||
|  | 		}) | ||||||
|  | 
 | ||||||
|  | 		let types=this.props.match.params.topicstype; | ||||||
|  | 		let { category,course_list_id,sort_by,sort_direction,page}=this.state; | ||||||
|  | 		this.searchAlldata(types,category,id,sort_by,sort_direction,page) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	onCheckBoxChange=(checkedValues)=>{ | ||||||
|  | 		if(checkedValues.length>15){ | ||||||
|  | 				this.props.showNotification("选择条数不能大于15条") | ||||||
|  | 		}else{ | ||||||
|  | 			this.setState({ | ||||||
|  | 				checkBoxValues:checkedValues | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	updatedlist=(updatedtype)=>{ | ||||||
|  | 		let types=this.props.match.params.topicstype; | ||||||
|  | 		let { category,course_list_id,sort_by,sort_direction,page}=this.state; | ||||||
|  | 		  if(updatedtype===sort_by){ | ||||||
|  | 		  	 if(sort_direction==="desc"){ | ||||||
|  | 							this.setState({ | ||||||
|  | 								sort_direction:"asc", | ||||||
|  | 								sort_by:updatedtype | ||||||
|  | 							}) | ||||||
|  | 					 this.searchAlldata(types,category,course_list_id,updatedtype,"asc",page) | ||||||
|  | 				 }else{ | ||||||
|  | 							this.setState({ | ||||||
|  | 								sort_direction:"desc", | ||||||
|  | 								sort_by:updatedtype | ||||||
|  | 							}) | ||||||
|  | 					 this.searchAlldata(types,category,course_list_id,updatedtype,"desc",page) | ||||||
|  | 				 } | ||||||
|  | 			}else{ | ||||||
|  | 				this.setState({ | ||||||
|  | 					sort_direction:"desc", | ||||||
|  | 					sort_by:updatedtype | ||||||
|  | 				}) | ||||||
|  | 				this.searchAlldata(types,category,course_list_id,updatedtype,"desc",page) | ||||||
|  | 			} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	changePage=(pageNumber)=>{ | ||||||
|  | 		let types=this.props.match.params.topicstype; | ||||||
|  | 		let { category,course_list_id,sort_by,sort_direction,page}=this.state; | ||||||
|  | 		this.searchAlldata(types,category,course_list_id,sort_by,sort_direction,pageNumber) | ||||||
|  | 		this.setState({ | ||||||
|  | 			page:pageNumber, | ||||||
|  | 			checkBoxValues:[] | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	deletecheckBoxValues=()=>{ | ||||||
|  | 		let {checkBoxValues}=this.state; | ||||||
|  | 
 | ||||||
|  | 		if(checkBoxValues.length===0){ | ||||||
|  | 			this.props.showNotification("请选择题库") | ||||||
|  | 		}else{ | ||||||
|  | 			this.setState({ | ||||||
|  | 				Modalstype:true, | ||||||
|  | 				Modalstopval:"是否确认删除?", | ||||||
|  | 				ModalCancel:this.topicscancelmodel, | ||||||
|  | 				ModalSave:this.topicssavedelete, | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	topicssavedelete=()=>{ | ||||||
|  |     let {checkBoxValues,category}=this.state; | ||||||
|  | 		const url = `/question_banks/multi_delete.json`; | ||||||
|  | 		axios.delete(url, { data: { | ||||||
|  | 				object_id: checkBoxValues, | ||||||
|  | 				object_type:category | ||||||
|  | 				}}) | ||||||
|  | 			.then((response) => { | ||||||
|  | 				if(response.data.status===0){ | ||||||
|  | 					this.updataslist() | ||||||
|  | 					this.props.showNotification(response.data.message) | ||||||
|  | 				}else{ | ||||||
|  | 					this.props.showNotification(response.data.message) | ||||||
|  | 				} | ||||||
|  | 			}) | ||||||
|  | 			.catch(function (error) { | ||||||
|  | 				console.log(error); | ||||||
|  | 			}); | ||||||
|  | 
 | ||||||
|  | 		  this.topicscancelmodel() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	topicscancelmodel=()=>{ | ||||||
|  | 		this.setState({ | ||||||
|  | 			Modalstype:false, | ||||||
|  | 			Loadtype:false, | ||||||
|  | 			visible:false, | ||||||
|  | 			Modalstopval:"", | ||||||
|  | 			ModalCancel:"", | ||||||
|  | 			ModalSave:"", | ||||||
|  | 			checkBoxValues:[], | ||||||
|  | 			checkedtype:false | ||||||
|  | 		}) | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 	openTopics=(id)=>{ | ||||||
|  | 		this.setState({ | ||||||
|  | 			Modalstype:true, | ||||||
|  | 			Modalstopval:"公开后不能重设为私有", | ||||||
|  | 			ModalsBottomval:"是否确认设为公开?", | ||||||
|  | 			ModalCancel:this.topicscancelmodel, | ||||||
|  | 			ModalSave:()=>this.topicssaveonOpen(id), | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	topicssaveonOpen=(id)=>{ | ||||||
|  | 
 | ||||||
|  | 		let {category}=this.state; | ||||||
|  | 		const url = `/question_banks/multi_public.json`; | ||||||
|  | 		axios.post(url,{ | ||||||
|  | 				object_id:[id], | ||||||
|  | 				object_type:category | ||||||
|  | 		}).then((response) => { | ||||||
|  | 			if(response.data.status===0){ | ||||||
|  | 				this.updataslist() | ||||||
|  | 				this.props.showNotification(response.data.message) | ||||||
|  | 			}else{ | ||||||
|  | 				this.props.showNotification(response.data.message) | ||||||
|  | 			} | ||||||
|  | 			}).catch(function (error) { | ||||||
|  | 				console.log(error); | ||||||
|  | 			}); | ||||||
|  | 
 | ||||||
|  | 		this.topicscancelmodel() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	sendTopics=()=>{ | ||||||
|  | 		let {checkBoxValues}=this.state; | ||||||
|  | 		if(checkBoxValues.length===0){ | ||||||
|  | 			this.props.showNotification("请选择题库") | ||||||
|  | 		}else{ | ||||||
|  | 			this.setState({ | ||||||
|  | 				visible:true | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 	render(){ | ||||||
|  | 		let{ | ||||||
|  | 			category, | ||||||
|  | 			course_list_id, | ||||||
|  | 			isSpin, | ||||||
|  | 			data, | ||||||
|  | 			page, | ||||||
|  | 			sort_direction, | ||||||
|  | 			sort_by, | ||||||
|  | 			checkBoxValues, | ||||||
|  | 			Modalstype, | ||||||
|  | 			visible, | ||||||
|  | 			isshowprofes | ||||||
|  | 		} = this.state; | ||||||
|  | 		let { | ||||||
|  | 			is_current, | ||||||
|  | 			current_user, | ||||||
|  | 		}=this.props; | ||||||
|  | 
 | ||||||
|  | 		let categorylist=[ | ||||||
|  | 			{val:"普通作业",type:"normal"}, | ||||||
|  | 			{val:"分组作业",type:"group"}, | ||||||
|  | 			{val:"毕设选题",type:"gtopic"}, | ||||||
|  | 			{val:"毕设任务",type:"gtask"}, | ||||||
|  | 			{val:"试卷",type:"exercise"}, | ||||||
|  | 			{val:"问卷",type:"poll"}, | ||||||
|  | 			] | ||||||
|  | 
 | ||||||
|  | 		let types=this.props.match.params.topicstype; | ||||||
|  | 		let username=this.props.match.params.username; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		//types===publicly  公共
 | ||||||
|  | 		//types===personal  私有
 | ||||||
|  | 		let user_id=this.props.current_user&&this.props.current_user.user_id; | ||||||
|  | 		let user_type=this.props.current_user&&this.props.current_user.user_identity; | ||||||
|  | 		let targetuserid=this.props.data&&this.props.data.id; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		// console.log(is_current)
 | ||||||
|  | 		// console.log(current_user)
 | ||||||
|  | 		// console.log(current_user.is_teacher)
 | ||||||
|  | 		// console.log(current_user.admin)
 | ||||||
|  | 		const menu = ( | ||||||
|  | 			<Menu> | ||||||
|  | 				<Menu.Item onClick={()=>this.updatedlist("updated_at")}> | ||||||
|  | 					最近更新 | ||||||
|  | 				</Menu.Item> | ||||||
|  | 				<Menu.Item onClick={()=>this.updatedlist("name")}> | ||||||
|  | 					题目名称 | ||||||
|  | 				</Menu.Item> | ||||||
|  | 				{types==="publicly"?<Menu.Item onClick={()=>this.updatedlist("contributor")}> | ||||||
|  | 					贡献者 | ||||||
|  | 				</Menu.Item>:""} | ||||||
|  | 			</Menu> | ||||||
|  | 		); | ||||||
|  | 		return( | ||||||
|  | 			<div className="educontent mb50 mt40"> | ||||||
|  | 				{/*提示*/} | ||||||
|  | 				<style> | ||||||
|  | 					{ | ||||||
|  | 						` | ||||||
|  | 						.mt40{ | ||||||
|  |     					margin-top: 40px !important; | ||||||
|  | 						} | ||||||
|  | 						` | ||||||
|  | 					} | ||||||
|  | 				</style> | ||||||
|  | 				{Modalstype&&Modalstype===true?<Modals | ||||||
|  | 					modalsType={this.state.Modalstype} | ||||||
|  | 					modalsTopval={this.state.Modalstopval} | ||||||
|  | 					modalCancel={this.state.ModalCancel} | ||||||
|  | 					modalSave={this.state.ModalSave} | ||||||
|  | 					modalsBottomval={this.state.ModalsBottomval} | ||||||
|  | 					loadtype={this.state.Loadtype} | ||||||
|  | 				/>:""} | ||||||
|  | 
 | ||||||
|  | 				{/*发送至弹窗*/} | ||||||
|  | 				{ | ||||||
|  | 					visible&&visible===true? | ||||||
|  | 					<SendTopics | ||||||
|  | 						{...this.state} | ||||||
|  | 						{...this.props} | ||||||
|  | 						visible={visible} | ||||||
|  | 						updataslist={()=>this.updataslist()} | ||||||
|  | 						topicscancelmodel={()=>this.topicscancelmodel()} | ||||||
|  | 					/>:"" | ||||||
|  | 				} | ||||||
|  | 				<style> | ||||||
|  | 
 | ||||||
|  | 					{ | ||||||
|  | 						` | ||||||
|  | 						  ::-webkit-scrollbar-thumb { | ||||||
|  | 									background-color: #cde5fe; | ||||||
|  | 
 | ||||||
|  | 									box-shadow: 0px 0px black; | ||||||
|  | 							} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 							::-webkit-scrollbar-track { | ||||||
|  | 									-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0); | ||||||
|  | 									background-color: #fff; | ||||||
|  | 							} | ||||||
|  | 
 | ||||||
|  | 							.shaiContent li.shaiItem { | ||||||
|  | 					    padding: 0px 9px; | ||||||
|  | 							float: left; | ||||||
|  | 							border-radius: 4px; | ||||||
|  | 							cursor: pointer; | ||||||
|  | 					    margin-right: 15px !important; | ||||||
|  | 							display: block; | ||||||
|  | 							margin-bottom: 2px; | ||||||
|  | 					    color: #666; | ||||||
|  | 							} | ||||||
|  | 
 | ||||||
|  | 							.maxwidth900{ | ||||||
|  | 									max-width: 900px; | ||||||
|  | 									overflow:hidden; | ||||||
|  | 									text-overflow:ellipsis; | ||||||
|  | 									white-space:nowrap | ||||||
|  | 							} | ||||||
|  | 
 | ||||||
|  | 						 .homepagePostSettingname{ | ||||||
|  | 							 width:192px !important; | ||||||
|  | 						 } | ||||||
|  | 
 | ||||||
|  | 						 .homepagePostSettingbox{ | ||||||
|  | 							 width:139px !important; | ||||||
|  | 						 } | ||||||
|  | 							.marright0{ | ||||||
|  |     						margin-right: 0px !important; | ||||||
|  | 							} | ||||||
|  | 
 | ||||||
|  | 							.gongkais{ | ||||||
|  | 								min-width: 50px; | ||||||
|  | 								height: 22px !important; | ||||||
|  | 								line-height: 22px !important; | ||||||
|  | 								color: #fff !important; | ||||||
|  | 							  margin-top: 4px; | ||||||
|  | 							} | ||||||
|  | 						 	` | ||||||
|  | 					} | ||||||
|  | 				</style> | ||||||
|  | 
 | ||||||
|  | 				<Spin size="large" spinning={isSpin}> | ||||||
|  | 					<div className="clearfix topicsbox"> | ||||||
|  | 						{types==="publicly"?<div className={"topcschild"}> | ||||||
|  | 							<a className={types==="personal"?"topicstopfont fr ":"topicstopfont fr topcsactive"} | ||||||
|  | 								 href={`/users/${this.props.current_user&&this.props.current_user.login}/topics/personal`}>我的题库</a> | ||||||
|  | 							<div className={types==="publicly"?"topicstopfont fl ":"topicstopfont fl topcsactive"} | ||||||
|  | 							>公共题库</div> | ||||||
|  | 						</div>:<div className={"topcschild"}> | ||||||
|  | 							<div className={types==="personal"?"topicstopfont fl ":"topicstopfont fl topcsactive"} | ||||||
|  | 							 >我的题库</div> | ||||||
|  | 							<a className={types==="publicly"?"topicstopfont fr ":"topicstopfont fr topcsactive"} | ||||||
|  | 								 href={`/topicbank/${this.props.current_user&&this.props.current_user.login}/publicly`} | ||||||
|  | 							>公共题库</a> | ||||||
|  | 						</div>} | ||||||
|  | 
 | ||||||
|  | 						{isshowprofes===false? | ||||||
|  | 						<div> | ||||||
|  | 
 | ||||||
|  | 							<div className={"topcsmid"}> | ||||||
|  | 								{categorylist.map((item,key)=>{ | ||||||
|  | 									return( | ||||||
|  | 										<span key={key} className={category===item.type?"topicsmidfont fl mr30 topcsactive":"topicsmidfont fl mr30"} onClick={()=>this.searchCategory(item.type)}>{item.val}</span> | ||||||
|  | 									) | ||||||
|  | 								})} | ||||||
|  | 
 | ||||||
|  | 							</div> | ||||||
|  | 
 | ||||||
|  | 							{data&&data.count===undefined?"":data&&data.count===0?"":<div className={data===undefined?"":data.course_list===undefined||data.course_list.length===0?"shaiContent mb45":"shaiContent"}> | ||||||
|  | 									<li className={course_list_id===undefined?"shaiItem shixun_repertoire active fl":"shaiItem shixun_repertoire fl"}  onClick={()=>this.searchCourselistid(undefined)}>全部</li> | ||||||
|  | 									<div className="fl pr topicsItem mb20"> | ||||||
|  | 										{data===undefined?"":data.course_list===undefined||data.course_list.length===0?"":data.course_list.map((item,key)=>{ | ||||||
|  | 											return( | ||||||
|  | 												<li key={key} className={course_list_id===item.id?"shaiItem shixun_repertoire active marright0":"shaiItem shixun_repertoire marright0"} onClick={()=>this.searchCourselistid(item.id)}>{item.name}</li> | ||||||
|  | 											) | ||||||
|  | 										})} | ||||||
|  | 									</div> | ||||||
|  | 								</div>} | ||||||
|  | 
 | ||||||
|  | 						</div>:<div className={"professional_certificationbox"}> | ||||||
|  | 									<p className="clearfix "> | ||||||
|  | 										<div className={"stud-class-set pd115200 coursenavbox edu-back-white"}> | ||||||
|  | 											<div className={"sumbtongs mb10"}><img className={"topicsItemimg"} src={Withoutpermission}/></div> | ||||||
|  | 											<div className={"terraces mb5 topicsItemfont"}>通过职业认证的教师才能访问公共题库</div> | ||||||
|  | 											<div className="clearfix mt30 mb30 padding251"> | ||||||
|  | 												<a className="defalutSubmitbtn fl ml60 defalutSubmitbtns" target="_blank" href="/account/certification">立即认证</a> | ||||||
|  | 											</div> | ||||||
|  | 										</div> | ||||||
|  | 									</p> | ||||||
|  | 							</div>} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 					</div> | ||||||
|  | 
 | ||||||
|  | 					{isshowprofes===false?data&&data.count===undefined?"":data&&data.count===0?"":<div className="clearfix font-12 mt20"> | ||||||
|  | 						<p className="font-12 ml5 fl"> | ||||||
|  | 								<span className="fl color-grey-9 mr20">共   <span className={"color-orange"}>{data&&data.count===undefined?0:data&&data.count}</span>   个</span> | ||||||
|  | 								<span className="fr color-grey-9">已选择   <span  className={"color-orange"}>{checkBoxValues.length}</span>  个   (不支持跨页勾选)</span> | ||||||
|  | 						</p> | ||||||
|  | 						<p className="font-12 alltopiscright ml25 fr"> | ||||||
|  | 							<style> | ||||||
|  | 								{ | ||||||
|  | 									` | ||||||
|  | 									.yslbottomsj{ | ||||||
|  | 									position: absolute; | ||||||
|  | 									bottom: -8px; | ||||||
|  | 									} | ||||||
|  | 									` | ||||||
|  | 								} | ||||||
|  | 							</style> | ||||||
|  | 								<Dropdown overlay={menu}> | ||||||
|  | 										<span className="fr color-grey-9 mr10 pointer "> | ||||||
|  | 											<span>{sort_by==="updated_at"?'最近更新':sort_by==="name"?'题目名称':sort_by==="contributor"?"贡献者":""}</span> | ||||||
|  | 											<sapn className="relativef ml10" onClick={()=>this.updatedlist(sort_by)}> | ||||||
|  | 												<i className={sort_direction==="asc"? | ||||||
|  | 													"iconfont icon-sanjiaoxing-up font-12 topsj color-blue" :"iconfont icon-sanjiaoxing-up font-12 topsj"}></i> | ||||||
|  | 												<i className={sort_direction==="desc"? | ||||||
|  | 													"iconfont icon-sanjiaoxing-down font-12 yslbottomsj color-blue":"iconfont icon-sanjiaoxing-down font-12 yslbottomsj"}></i> | ||||||
|  | 											</sapn> | ||||||
|  | 										</span> | ||||||
|  | 								</Dropdown> | ||||||
|  | 						  	{user_type!="学生"?<span className="fr mr30 topcsactive pointer" onClick={()=>this.sendTopics()}>发送</span>:""} | ||||||
|  | 								{types==="personal"?((is_current && current_user && current_user.is_teacher ) || current_user && current_user.admin) | ||||||
|  | 									&&<span className="fr mr30 topcsactive pointer" onClick={()=>this.deletecheckBoxValues()}>删除</span>:""} | ||||||
|  | 						</p> | ||||||
|  | 					</div>:""} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 					{isshowprofes===true?"":data===undefined?<NoneData></NoneData>:data.question_banks===undefined||data.question_banks.length===0?<NoneData></NoneData>: | ||||||
|  | 						<Checkbox.Group style={{ width: '100%' ,minHeight:'297px'}} onChange={this.onCheckBoxChange} value={checkBoxValues}> | ||||||
|  | 							{data.question_banks.map((item,key)=>{ | ||||||
|  | 					  return( | ||||||
|  | 						<div className="mt20 edu-back-white pd1323 relativef" key={key} > | ||||||
|  | 							<div className="clearfix"> | ||||||
|  | 								<div className="item-body"> | ||||||
|  | 
 | ||||||
|  | 									<div className="clearfix ds pr pt10 contentSection" > | ||||||
|  | 										{user_type!="学生"?<Checkbox value={item.id} key={item.id} className={"fl mt5"}></Checkbox>:""} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 									  <a title={item.name.length>55?item.name:""} className="ml10 fl mt3 font-16  color-dark maxwidth900" href={ | ||||||
|  | 											category==="normal"?`/banks/normal/${item.id}/${types}?tab=0`: | ||||||
|  | 												category==="group"?`/banks/group/${item.id}/${types}?tab=0`: | ||||||
|  | 													category==="poll"?`/banks/poll/${item.id}/${types}`: | ||||||
|  | 														category==="exercise"?`/banks/exercise/${item.id}/${types}`: | ||||||
|  | 															category==="gtask"?`/banks/gtask/${item.id}/${types}`: | ||||||
|  | 																category==="gtopic"?`/banks/gtopic/${item.id}/${types}`:"" | ||||||
|  | 										} | ||||||
|  | 										> | ||||||
|  | 											{item.name} | ||||||
|  | 									  </a> | ||||||
|  | 
 | ||||||
|  | 										{item.is_public===true?types==="publicly"?"":<span className="edu-filter-btn edu-filter-btn-4CACFF ml15 fl gongkais">公开</span>:""} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 										<div className="cl"></div> | ||||||
|  | 
 | ||||||
|  | 										<p className="color-grey panel-lightgrey mt16 fl"> | ||||||
|  | 											<span className={"topicswidth600"}> | ||||||
|  | 												 {types==="publicly"?<span className="topsics135 color-grey9 mr50">{item.creator_name}</span>:""} | ||||||
|  | 												 <span className="mr50 color-grey9">{item.quotes_count}  次引用</span> | ||||||
|  | 												 <span className="mr50 color-grey9">{item.solve_count}   次答题</span> | ||||||
|  | 											   <span className="mr50 color-grey9">{moment(item.updated_at).fromNow()}</span> | ||||||
|  | 											</span> | ||||||
|  | 											{item.course_list_name===null?"":<span className={"topsicrelative topsicinline"} title={item.course_list_name}> | ||||||
|  | 												<div className={types==="personal"?"topicsbtn topsicsmax550":"topsicsmax550 topicsbtn"}>{item.course_list_name}</div> | ||||||
|  | 											</span>} | ||||||
|  | 										</p> | ||||||
|  | 
 | ||||||
|  | 										<div className="homepagePostSetting homepagePostSettingname topscisright"> | ||||||
|  | 											{types==="personal"?((is_current && current_user && current_user.is_teacher ) || current_user && current_user.admin) | ||||||
|  | 												&&<a className="btn colorblue mr25 font-16 fr" | ||||||
|  | 													 href={category==="normal"?`/banks/normal/${item.id}/edit/${types}`: | ||||||
|  | 														 category==="group"?`/banks/group/${item.id}/edit/${types}`: | ||||||
|  | 															 category==="poll"?`/banks/poll/${item.id}/edit/${types}`: | ||||||
|  | 																 category==="exercise"?`/banks/exercise/${item.id}/edit/${types}`: | ||||||
|  | 																	 category==="gtask"?`/banks/gtask/${item.id}/edit/${types}`: | ||||||
|  | 																		 category==="gtopic"?`/banks/gtopic/${item.id}/edit/${types}`:"" | ||||||
|  | 													 } | ||||||
|  | 												>编辑</a> | ||||||
|  | 												:""} | ||||||
|  | 											{types==="personal"&&item.is_public===false?((is_current && current_user && current_user.is_teacher ) || current_user && current_user.admin) | ||||||
|  | 												&&<a className="btn colorblue mr25 fr font-16" onClick={()=>this.openTopics(item.id)}>设为公开</a>:""} | ||||||
|  | 
 | ||||||
|  | 										</div> | ||||||
|  | 									</div> | ||||||
|  | 								</div> | ||||||
|  | 								 | ||||||
|  | 							</div> | ||||||
|  | 						</div> | ||||||
|  | 					)})} | ||||||
|  | 						</Checkbox.Group> | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					{ | ||||||
|  | 						isshowprofes===true?"":data&&data.count >15 && | ||||||
|  | 						<div className="mt30 mb50 edu-txt-center"> | ||||||
|  | 							<Pagination showQuickJumper total={data&&data.count} onChange={this.changePage} pageSize={15} current={page}/> | ||||||
|  | 						</div> | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 				</Spin> | ||||||
|  | 			</div> | ||||||
|  | 		) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | export default InfosTopics; | ||||||
| After Width: | Height: | Size: 7.9 KiB | 
| @ -0,0 +1,90 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | 
 | ||||||
|  | import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import Loadable from 'react-loadable'; | ||||||
|  | import Loading from '../../../../Loading'; | ||||||
|  | 
 | ||||||
|  | import BanksMenu from './banksMenu' | ||||||
|  | // 毕设选题
 | ||||||
|  | const GtopicBanks = Loadable({ | ||||||
|  | 	loader: () => import('./GtopicBanks'), | ||||||
|  | 	loading: Loading, | ||||||
|  | }) | ||||||
|  | // 问卷内容
 | ||||||
|  | const PollBanks = Loadable({ | ||||||
|  | 	loader: () => import('./PollBanksContent'), | ||||||
|  | 	loading: Loading, | ||||||
|  | }) | ||||||
|  | // 试卷详情
 | ||||||
|  | const ExerciseBanksDetail = Loadable({ | ||||||
|  | 	loader: () => import('./ExerciseBanksDetail'), | ||||||
|  | 	loading: Loading, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | class BanksTabIndex extends Component{ | ||||||
|  |   constructor(props){ | ||||||
|  |     super(props); | ||||||
|  |     this.state={ | ||||||
|  |       banksMenu:undefined | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   initPublic = (crumbData,menuData) =>{ | ||||||
|  |     this.setState({ | ||||||
|  |       banksMenu:menuData | ||||||
|  |     }) | ||||||
|  |     this.props.initPublic(crumbData); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   render(){ | ||||||
|  |     let{ | ||||||
|  |       banksMenu       | ||||||
|  |     }=this.state | ||||||
|  | 
 | ||||||
|  |     const common={ | ||||||
|  |       initPublic:this.initPublic, | ||||||
|  |     }; | ||||||
|  |     console.log("BanksTabIndex"); | ||||||
|  |     console.log(banksMenu); | ||||||
|  |     console.log(this.props); | ||||||
|  |     return( | ||||||
|  |       <React.Fragment> | ||||||
|  |         { | ||||||
|  |           banksMenu &&  | ||||||
|  |           <BanksMenu  | ||||||
|  |             banksMenu={banksMenu} | ||||||
|  |             {...this.props} | ||||||
|  |             {...this.state}  | ||||||
|  |             {...common} | ||||||
|  |           ></BanksMenu> | ||||||
|  |         } | ||||||
|  |         <Switch {...this.props}> | ||||||
|  |           <Route path={`/banks/exercise/:Id/:type`} | ||||||
|  |             render={ | ||||||
|  |               (props) => { | ||||||
|  |                 return (<ExerciseBanksDetail {...this.props} {...props} {...this.state} {...common} | ||||||
|  |                 />) | ||||||
|  |               } | ||||||
|  |           }></Route>   | ||||||
|  | 
 | ||||||
|  |           <Route path={`/banks/gtopic/:bankId/:type`} | ||||||
|  |             render={ | ||||||
|  |               (props) => { | ||||||
|  |                 return (<GtopicBanks {...this.props} {...props} {...this.state} {...common} />) | ||||||
|  |               } | ||||||
|  |           }></Route> | ||||||
|  |           <Route path={`/banks/poll/:bankId/:type`} | ||||||
|  |             render={ | ||||||
|  |               (props) => { | ||||||
|  |                 return (<PollBanks {...this.props} {...props} {...this.state} {...common} />) | ||||||
|  |               } | ||||||
|  |           }></Route> | ||||||
|  | 
 | ||||||
|  |         </Switch> | ||||||
|  |       </React.Fragment> | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | export default (BanksTabIndex); | ||||||
| @ -0,0 +1,56 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | import axios from 'axios' | ||||||
|  | 
 | ||||||
|  | import ExerciseDisplay from '../../../courses/exercise/ExerciseDisplay' | ||||||
|  | 
 | ||||||
|  | class ExerciseBanksDetail extends Component{ | ||||||
|  |   constructor(props){ | ||||||
|  |     super(props); | ||||||
|  |     this.state={ | ||||||
|  |          | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   componentDidMount = () =>{ | ||||||
|  |        | ||||||
|  |   } | ||||||
|  |   detailFetchCallback = (result) => { | ||||||
|  |     let Id=this.props.match.params.Id; | ||||||
|  | 
 | ||||||
|  |     const crumbData={ | ||||||
|  |         title: result.data.exercise && result.data.exercise.name, | ||||||
|  |         is_public: result.data.exercise && result.data.exercise.is_public, | ||||||
|  |         crumbArray:[ | ||||||
|  |             {content:'详情'}, | ||||||
|  |         ] | ||||||
|  |     } | ||||||
|  |     const menuData={ | ||||||
|  |         tab:'0',//tab选中的index
 | ||||||
|  |         menuArray:[//tab以及tab路由
 | ||||||
|  |             {to:`/banks/exercise/${Id}/${this.props.match.params.type}?tab=0`,content:'内容详情'} | ||||||
|  |         ], | ||||||
|  |         category:'exercise',//
 | ||||||
|  |         tos: `/banks/exercise/${Id}/edit/${this.props.match.params.type}`, | ||||||
|  |         id: Id, | ||||||
|  |         is_public: result.data.exercise && result.data.exercise.is_public, | ||||||
|  |         type:this.props.match.params.type, | ||||||
|  |         authorize:result && result.data && result.data.authorize, | ||||||
|  |     } | ||||||
|  |     this.props.initPublic(crumbData,menuData); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   render(){ | ||||||
|  |     let { pollDetail } = this.state | ||||||
|  |      | ||||||
|  |     return( | ||||||
|  |       <div> | ||||||
|  |         <ExerciseDisplay {...this.props} {...this.state}  | ||||||
|  |             urlPath = {'exercise_banks'} | ||||||
|  |             detailFetchCallback={this.detailFetchCallback} | ||||||
|  |         > | ||||||
|  |         </ExerciseDisplay> | ||||||
|  |       </div> | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | export default ExerciseBanksDetail | ||||||
| @ -0,0 +1,71 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | import axios from 'axios' | ||||||
|  | import { ActionBtn } from 'educoder' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import ExerciseNewCommon from '../../../courses/exercise/ExerciseNewCommon' | ||||||
|  | 
 | ||||||
|  | class ExerciseBanksEdit extends Component { | ||||||
|  |   constructor(props){ | ||||||
|  |     super(props); | ||||||
|  |     this.state = { | ||||||
|  |       isPublic: undefined, | ||||||
|  |     //   isGroup: false
 | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   componentDidMount = () =>{ | ||||||
|  |        | ||||||
|  |      | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   initData = (responseData) =>{ | ||||||
|  |       const Id = this.props.match.params.Id; | ||||||
|  | 
 | ||||||
|  |       const crumbData={ | ||||||
|  |         title:'编辑', | ||||||
|  |         is_public: responseData && responseData.data && responseData.data.exercise.is_public, | ||||||
|  |         crumbArray:[ | ||||||
|  |             {to:`/banks/exercise/${Id}/${this.props.match.params.type}`,content:'详情'}, | ||||||
|  |             {content:'编辑'} | ||||||
|  |         ] | ||||||
|  |     } | ||||||
|  |     this.props.initPublic(crumbData); | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   render(){ | ||||||
|  |     let { Id, type } = this.props.match.params | ||||||
|  |     const common = { | ||||||
|  |     //   onCancel:this.onCancel,
 | ||||||
|  |     //   isGroup: this.isGroup,
 | ||||||
|  |     //   doNew: this.doNew,
 | ||||||
|  |     //   doEdit: this.doEdit,
 | ||||||
|  |       initData: this.initData | ||||||
|  |     } | ||||||
|  |     return( | ||||||
|  |       <div className="courseForm"> | ||||||
|  |         <style> | ||||||
|  |           {` | ||||||
|  |             .courseForm .ant-col-sm-24{ | ||||||
|  |               text-align:left; | ||||||
|  |             } | ||||||
|  |           `}
 | ||||||
|  |         </style> | ||||||
|  |         <ExerciseNewCommon  | ||||||
|  |           {...this.props}  | ||||||
|  |           {...this.state}  | ||||||
|  |           {...common}  | ||||||
|  |           hidePreviewButton={true} | ||||||
|  |           wrappedComponentRef={(ref) => this.exerciseNewCommonRef = ref} | ||||||
|  |           isEdit={true} | ||||||
|  |           shixunsUrl={`/exercise_banks/choose_shixun.json`} | ||||||
|  |           exercise_url={'exercise_banks'} | ||||||
|  |           exercise_url_questions={'exercise_bank_questions'} | ||||||
|  |           bottomSection={<ActionBtn style="blue" className="fr" to={`/banks/exercise/${Id}/${this.props.match.params.type}`}> | ||||||
|  |             完成 | ||||||
|  |           </ActionBtn>} | ||||||
|  |         ></ExerciseNewCommon> | ||||||
|  |       </div> | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | export default ExerciseBanksEdit; | ||||||
| @ -0,0 +1,99 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | import axios from 'axios' | ||||||
|  | import NewGtaskForm from './NewGtaskForm'; | ||||||
|  | import NewWorkForm from "./HomeworkBanksEdit"; | ||||||
|  | 
 | ||||||
|  | class GtaskBanksEdit extends Component { | ||||||
|  | 	constructor(props){ | ||||||
|  | 		super(props); | ||||||
|  | 		this.state = { | ||||||
|  | 			isPublic: undefined, | ||||||
|  | 			isGroup: false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	componentDidMount = () =>{ | ||||||
|  | 		let workId = this.props.match.params.workId; | ||||||
|  | 		this.initData(workId); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	initData = (workId) =>{ | ||||||
|  | 
 | ||||||
|  | 		let url = `/task_banks/${workId}.json`; | ||||||
|  | 		axios.get(url).then((result)=>{ | ||||||
|  | 			if(result){ | ||||||
|  | 				const crumbData={ | ||||||
|  | 					title:'编辑', | ||||||
|  | 					is_public:result && result.data && result.data.is_public, | ||||||
|  | 					crumbArray:[ | ||||||
|  | 						{to:`/banks/gtask/${workId}/${this.props.match.params.type}?tab=0`,content:'详情'}, | ||||||
|  | 						{content:'编辑'} | ||||||
|  | 					] | ||||||
|  | 				} | ||||||
|  | 				this.props.initPublic(crumbData); | ||||||
|  | 				result.data.isEdit = true; | ||||||
|  | 				this.setState({ data:result.data}) | ||||||
|  | 				this.newWorkFormRef.initValue(result.data); | ||||||
|  | 			} | ||||||
|  | 		}).catch((error)=>{ | ||||||
|  | 			console.log(error) | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	doNew = () => { | ||||||
|  | 	} | ||||||
|  | 	doEdit = (params) => { | ||||||
|  | 		const workId = this.props.match.params.workId | ||||||
|  | 		const newUrl = `/homework_banks/${workId}.json` | ||||||
|  | 
 | ||||||
|  | 		// const isGroup = this.props.isGroup()
 | ||||||
|  | 		axios.put(newUrl, params) | ||||||
|  | 			.then((response) => { | ||||||
|  | 				if (response.data.status == 0) { | ||||||
|  | 					this.props.showNotification('保存成功') | ||||||
|  | 					this.toWorkDetail() | ||||||
|  | 				} | ||||||
|  | 			}) | ||||||
|  | 			.catch(function (error) { | ||||||
|  | 				console.log(error); | ||||||
|  | 			}); | ||||||
|  | 	} | ||||||
|  | 	toWorkDetail = () => { | ||||||
|  | 		this.props.history.push(`/banks/gtask/${this.props.match.params.workId}/${this.props.match.params.type}`); | ||||||
|  | 		this.props.initPublic(undefined); | ||||||
|  | 	} | ||||||
|  | 	onCancel = () => { | ||||||
|  | 		this.toWorkDetail() | ||||||
|  | 	} | ||||||
|  | 	isGroup = () => { | ||||||
|  | 		return this.state.isGroup; | ||||||
|  | 	} | ||||||
|  | 	render(){ | ||||||
|  | 
 | ||||||
|  | 		const common = { | ||||||
|  | 			onCancel:this.onCancel, | ||||||
|  | 			isGroup: this.isGroup, | ||||||
|  | 			doNew: this.doNew, | ||||||
|  | 			doEdit: this.doEdit, | ||||||
|  | 		} | ||||||
|  | 		return( | ||||||
|  | 			<div className="courseForm"> | ||||||
|  | 				<style> | ||||||
|  | 					{` | ||||||
|  |             .courseForm .ant-col-sm-24{ | ||||||
|  |               text-align:left; | ||||||
|  |             } | ||||||
|  |           `}
 | ||||||
|  | 				</style> | ||||||
|  | 				<NewGtaskForm | ||||||
|  | 					{...this.props} | ||||||
|  | 					{...this.state} | ||||||
|  | 					{...common} | ||||||
|  | 					wrappedComponentRef={(ref) => this.newWorkFormRef = ref} | ||||||
|  | 					topicId={this.props.match.params.workId} | ||||||
|  | 				></NewGtaskForm> | ||||||
|  | 			</div> | ||||||
|  | 		) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | export default GtaskBanksEdit; | ||||||
| @ -0,0 +1,89 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | import axios from 'axios' | ||||||
|  | 
 | ||||||
|  | import GraduateTopicNewFrom from '../../../courses/graduation/topics/GraduateTopicNewFrom' | ||||||
|  | 
 | ||||||
|  | class GtopicBanksEdit extends Component{ | ||||||
|  |   constructor(props){ | ||||||
|  |     super(props); | ||||||
|  |     this.state = { | ||||||
|  |       isPublic:undefined | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   componentDidMount = () =>{ | ||||||
|  |     let bankId = this.props.match.params.bankId; | ||||||
|  |      | ||||||
|  |     this.initData(bankId); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   initData = (bankId) =>{ | ||||||
|  |     let url = `/gtopic_banks/${bankId}/edit.json`; | ||||||
|  |     axios.get(url).then((result)=>{ | ||||||
|  |       if(result){ | ||||||
|  |         const crumbData={ | ||||||
|  |           title:'编辑', | ||||||
|  |           is_public:result && result.data.selected_data && result.data.selected_data.is_public, | ||||||
|  |           crumbArray:[ | ||||||
|  |             {to:`/banks/gtopic/${bankId}/${this.props.match.params.type}?tab=0`,content:'详情'}, | ||||||
|  |             {content:'编辑'} | ||||||
|  |           ] | ||||||
|  |         } | ||||||
|  |         this.props.initPublic(crumbData); | ||||||
|  | 
 | ||||||
|  |         this.GraduateTopicNewFromRef.initValue(result); | ||||||
|  |       } | ||||||
|  |     }).catch((error)=>{ | ||||||
|  |       console.log(error) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 编辑保存
 | ||||||
|  |   editSave = (param,attachments,bankId) =>{ | ||||||
|  |     const url = `/gtopic_banks/${bankId}.json`; | ||||||
|  |     let params = { | ||||||
|  |       gtopic_bank:param, | ||||||
|  |       attachment_ids:attachments | ||||||
|  |     } | ||||||
|  |     axios.put(url,params).then((result)=>{ | ||||||
|  |       if(result){ | ||||||
|  |         this.props.showNotification('保存成功!'); | ||||||
|  |         this.props.history.push(`/banks/gtopic/${bankId}/${this.props.match.params.type}`); | ||||||
|  |       } | ||||||
|  |     }).catch((error)=>{ | ||||||
|  |       console.log(error); | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // 取消
 | ||||||
|  |   editCancel = () =>{ | ||||||
|  |     this.props.history.push(`/banks/gtopic/${this.props.match.params.bankId}/${this.props.match.params.type}`); | ||||||
|  | 		this.props.initPublic(undefined); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   render(){ | ||||||
|  |     let { bankId } = this.props.match.params | ||||||
|  |     const common = { | ||||||
|  |       editSave:this.editSave, | ||||||
|  |       editCancel:this.editCancel | ||||||
|  |     } | ||||||
|  |     return( | ||||||
|  |       <div className="courseForm"> | ||||||
|  |         <style> | ||||||
|  |           {` | ||||||
|  |             .courseForm .ant-col-sm-24{ | ||||||
|  |               text-align:left; | ||||||
|  |             } | ||||||
|  |           `}
 | ||||||
|  |         </style> | ||||||
|  |         <GraduateTopicNewFrom  | ||||||
|  |           {...this.props}  | ||||||
|  |           {...this.state}  | ||||||
|  |           {...common}  | ||||||
|  |           wrappedComponentRef={(ref) => this.GraduateTopicNewFromRef = ref} | ||||||
|  |           topicId={bankId} | ||||||
|  |         ></GraduateTopicNewFrom> | ||||||
|  |       </div> | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | export default GtopicBanksEdit; | ||||||
| @ -0,0 +1,103 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | import axios from 'axios' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import NewWorkForm from '../../../courses/busyWork/NewWorkForm' | ||||||
|  | 
 | ||||||
|  | class HomeworkBanksEdit extends Component { | ||||||
|  |   constructor(props){ | ||||||
|  |     super(props); | ||||||
|  |     this.state = { | ||||||
|  |       isPublic: undefined, | ||||||
|  |     //   isGroup: false
 | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   componentDidMount = () =>{ | ||||||
|  |     let workId = this.props.match.params.workId; | ||||||
|  |      | ||||||
|  |     this.initData(workId); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   initData = (workId) =>{ | ||||||
|  |     let url = `/homework_banks/${workId}.json`; | ||||||
|  |     axios.get(url).then((result)=>{ | ||||||
|  |       if(result){ | ||||||
|  |         const crumbData={ | ||||||
|  |           title:'编辑', | ||||||
|  |           is_public:result && result.data && result.data.is_public, | ||||||
|  |           crumbArray:[ | ||||||
|  |             {to:`/banks/${this.getModuleName()}/${workId}/${this.props.match.params.type}?tab=0`,content:'详情'}, | ||||||
|  |             {content:'编辑'} | ||||||
|  |           ] | ||||||
|  |         } | ||||||
|  |         this.props.initPublic(crumbData); | ||||||
|  |         result.data.isEdit = true; | ||||||
|  |         result.data.ref_attachments = result.data.reference_attachments | ||||||
|  |         // this.setState({ isGroup: result.data.min_num || result.data.max_num })
 | ||||||
|  |         this.newWorkFormRef.initValue(result.data); | ||||||
|  |       } | ||||||
|  |     }).catch((error)=>{ | ||||||
|  |       console.log(error) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   | ||||||
|  |   doNew = () => { | ||||||
|  |   } | ||||||
|  |   doEdit = (params) => { | ||||||
|  |     const workId = this.props.match.params.workId | ||||||
|  |     const newUrl = `/homework_banks/${workId}.json` | ||||||
|  | 
 | ||||||
|  |     // const isGroup = this.props.isGroup()
 | ||||||
|  |     axios.put(newUrl, params) | ||||||
|  |     .then((response) => { | ||||||
|  |       if (response.data.status == 0) { | ||||||
|  |         this.props.showNotification('保存成功') | ||||||
|  |         this.toWorkDetail() | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     .catch(function (error) { | ||||||
|  |       console.log(error); | ||||||
|  |     });    | ||||||
|  |   } | ||||||
|  |   getModuleName = () => { | ||||||
|  |     return this.props.isGroup ? 'group' : 'normal' | ||||||
|  |   } | ||||||
|  |   toWorkDetail = () => { | ||||||
|  |     this.props.history.push(`/banks/${this.getModuleName()}/${this.props.match.params.workId}/${this.props.match.params.type}`) | ||||||
|  | 		this.props.initPublic(undefined); | ||||||
|  |   } | ||||||
|  |   onCancel = () => { | ||||||
|  |     this.toWorkDetail() | ||||||
|  |   } | ||||||
|  |   isGroup = () => { | ||||||
|  |     return this.props.isGroup; | ||||||
|  |   } | ||||||
|  |   render(){ | ||||||
|  |     let { bankId } = this.props.match.params | ||||||
|  |     const common = { | ||||||
|  |       onCancel:this.onCancel, | ||||||
|  |       isGroup: this.isGroup, | ||||||
|  |       doNew: this.doNew, | ||||||
|  |       doEdit: this.doEdit, | ||||||
|  |     } | ||||||
|  |     return( | ||||||
|  |       <div className="courseForm"> | ||||||
|  |         <style> | ||||||
|  |           {` | ||||||
|  |             .courseForm .ant-col-sm-24{ | ||||||
|  |               text-align:left; | ||||||
|  |             } | ||||||
|  |           `}
 | ||||||
|  |         </style> | ||||||
|  |         <NewWorkForm  | ||||||
|  |           {...this.props}  | ||||||
|  |           {...this.state}  | ||||||
|  |           {...common}  | ||||||
|  |           wrappedComponentRef={(ref) => this.newWorkFormRef = ref} | ||||||
|  |         ></NewWorkForm> | ||||||
|  |       </div> | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | export default HomeworkBanksEdit; | ||||||
| @ -0,0 +1,69 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | import axios from 'axios' | ||||||
|  | 
 | ||||||
|  | import PollDetailTabThirdInfo from '../../../courses/poll/PollDetailTabThirdInfo' | ||||||
|  | 
 | ||||||
|  | class PollBanksContent extends Component{ | ||||||
|  |   constructor(props){ | ||||||
|  |     super(props); | ||||||
|  |     this.state={ | ||||||
|  |       pollDetail:undefined | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   componentDidMount = () =>{ | ||||||
|  |     console.log("PollBanksContent"); | ||||||
|  |     console.log(this.props) | ||||||
|  |     let bankId=this.props.match.params.bankId; | ||||||
|  |     let url = `/exercise_banks/${bankId}.json` | ||||||
|  |     axios.get(url).then((result)=>{ | ||||||
|  |       if(result){ | ||||||
|  |         let pollDetail = { | ||||||
|  |           poll:{ | ||||||
|  |             id: result.data.poll && result.data.poll.id , | ||||||
|  |             polls_description: result.data.poll && result.data.poll.description, | ||||||
|  |             polls_name: result.data.poll && result.data.poll.name, | ||||||
|  |             is_public:result.data.poll && result.data.poll.is_public | ||||||
|  |           }, | ||||||
|  |           question_types:result.data.question_types, | ||||||
|  |           questions:result.data.questions, | ||||||
|  |         } | ||||||
|  |         const crumbData={ | ||||||
|  |           title:result.data.poll && result.data.poll.name, | ||||||
|  |           is_public:result.data.poll && result.data.poll.is_public, | ||||||
|  |           crumbArray:[ | ||||||
|  |             {content:'详情'}, | ||||||
|  |           ] | ||||||
|  |         } | ||||||
|  |         const menuData={ | ||||||
|  |           tab:'0',//tab选中的index
 | ||||||
|  |           menuArray:[//tab以及tab路由
 | ||||||
|  |             {to:`/banks/poll/${bankId}/${this.props.match.params.type}`,content:'内容详情'} | ||||||
|  |           ], | ||||||
|  |           category:'poll',//毕设选题
 | ||||||
|  |           tos:`/banks/poll/${bankId}/edit/${this.props.match.params.type}`, | ||||||
|  |           id:bankId, | ||||||
|  |           is_public:result.data.poll && result.data.poll.is_public, | ||||||
|  |           type:this.props.match.params.type, | ||||||
|  |           authorize:result && result.data && result.data.authorize, | ||||||
|  |         } | ||||||
|  |         this.props.initPublic(crumbData,menuData); | ||||||
|  |         this.setState({ | ||||||
|  |           pollDetail | ||||||
|  |         }) | ||||||
|  |       } | ||||||
|  |     }).catch((error)=>{ | ||||||
|  |       console.log(error); | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   render(){ | ||||||
|  |     let { pollDetail } = this.state | ||||||
|  |     return( | ||||||
|  |       <div> | ||||||
|  |         <PollDetailTabThirdInfo {...this.props} {...this.state} pollDetail = {pollDetail}></PollDetailTabThirdInfo> | ||||||
|  |       </div> | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | export default PollBanksContent | ||||||
| @ -0,0 +1,196 @@ | |||||||
|  | import React, { Component } from 'react'; | ||||||
|  | 
 | ||||||
|  | import { Menu } from 'antd' | ||||||
|  | import { Link } from 'react-router-dom' | ||||||
|  | import { WordsBtn } from 'educoder' | ||||||
|  | import "../usersInfo.css" | ||||||
|  | import "../../../courses/css/Courses.css" | ||||||
|  | import "../../../courses/css/busyWork.css" | ||||||
|  | import SendTopics from '../../../modals/SendTopics'; | ||||||
|  | import Modals from '../../../modals/Modals'; | ||||||
|  | import axios from 'axios'; | ||||||
|  | class BanksMenu extends Component{ | ||||||
|  |   constructor(props){ | ||||||
|  |     super(props); | ||||||
|  |     this.state={ | ||||||
|  |       visible:false, | ||||||
|  |       tab:['0'], | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   //发送至相关
 | ||||||
|  |   sendTopics=()=>{ | ||||||
|  |     this.setState({ | ||||||
|  |       visible:true | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |   componentDidMount() { | ||||||
|  |     debugger | ||||||
|  |     try { | ||||||
|  |       const query = this.props.location.search; | ||||||
|  |       const type = query.split('?tab='); | ||||||
|  |       if(type[1]===undefined){ | ||||||
|  |         this.setState({ | ||||||
|  |           tab:['0'], | ||||||
|  |         }); | ||||||
|  |       }else{ | ||||||
|  |         if(type[1]==="0"){ | ||||||
|  |           this.setState({ | ||||||
|  |             tab:['0'], | ||||||
|  |           }); | ||||||
|  |         }else if(type[1]==="1"){ | ||||||
|  |           this.setState({ | ||||||
|  |             tab:['1'], | ||||||
|  |           }); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |     }catch (e) { | ||||||
|  |       this.setState({ | ||||||
|  |         tab:['0'], | ||||||
|  |       }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   topicscancelmodel=()=>{ | ||||||
|  |     this.setState({ | ||||||
|  |       Modalstype:false, | ||||||
|  |       Loadtype:false, | ||||||
|  |       visible:false, | ||||||
|  |       Modalstopval:"", | ||||||
|  |       ModalCancel:"", | ||||||
|  |       ModalSave:"", | ||||||
|  |       checkBoxValues:[], | ||||||
|  |       checkedtype:false | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   //删除相关
 | ||||||
|  | 
 | ||||||
|  |   deletecheckBoxValues=(id,type)=>{ | ||||||
|  | 
 | ||||||
|  |     this.setState({ | ||||||
|  |       Modalstype:true, | ||||||
|  |       Modalstopval:"是否确认删除?", | ||||||
|  |       ModalCancel:this.topicscancelmodel, | ||||||
|  |       ModalSave:()=>this.topicssavedelete(id,type), | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   topicssavedelete=(id,type)=>{ | ||||||
|  |     console.log("删除了"); | ||||||
|  |     console.log(id); | ||||||
|  |     console.log(type); | ||||||
|  |     const url = `/question_banks/multi_delete.json`; | ||||||
|  |     axios.delete(url, { data: { | ||||||
|  |           object_id: [id], | ||||||
|  |           object_type:type | ||||||
|  |         }}) | ||||||
|  |       .then((response) => { | ||||||
|  |         console.log(response); | ||||||
|  |         if(response){ | ||||||
|  |           if(response.data){ | ||||||
|  |             if(response.data.status===0){ | ||||||
|  |               this.props.showNotification(response.data.message) | ||||||
|  |               window.location.href=`/users/${this.props.current_user.login}/topics/personal`; | ||||||
|  |             }else{ | ||||||
|  |               this.props.showNotification(response.data.message) | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |       }) | ||||||
|  |       .catch(function (error) { | ||||||
|  |         console.log(error); | ||||||
|  |       }); | ||||||
|  |     this.topicscancelmodel() | ||||||
|  |   } | ||||||
|  |   changeTab=(e)=>{ | ||||||
|  |     this.setState({ | ||||||
|  |       tab:e.key | ||||||
|  |     }) | ||||||
|  |     console.log(e.key); | ||||||
|  |     // if(e.key === 0){
 | ||||||
|  |     //
 | ||||||
|  |     // }else{
 | ||||||
|  |     //
 | ||||||
|  |     //
 | ||||||
|  |     // }
 | ||||||
|  |   } | ||||||
|  |   render(){ | ||||||
|  |     let { banksMenu} = this.props; | ||||||
|  |     let {visible,tab}=this.state; | ||||||
|  |     // console.log("问卷预览");
 | ||||||
|  |     // console.log(visible);
 | ||||||
|  |     let user_id=this.props.current_user&&this.props.current_user.user_id; | ||||||
|  |     let user_type=this.props.current_user&&this.props.current_user.user_identity; | ||||||
|  |     let targetuserid=this.props.data&&this.props.data.id; | ||||||
|  |     // console.log("_____________________________");
 | ||||||
|  |     // console.log(this.props);
 | ||||||
|  |     // console.log("++++++++++++++++=");
 | ||||||
|  |     // console.log("banksMenubanksMenubanksMenubanksMenu");
 | ||||||
|  |     // console.log(banksMenu);
 | ||||||
|  |     return( | ||||||
|  |       <div className="clearfix bor-bottom-greyE edu-back-white" style={{padding:"0px 30px"}}> | ||||||
|  |         {this.state.Modalstype&&this.state.Modalstype===true?<Modals | ||||||
|  |           modalsType={this.state.Modalstype} | ||||||
|  |           modalsTopval={this.state.Modalstopval} | ||||||
|  |           modalCancel={this.state.ModalCancel} | ||||||
|  |           modalSave={this.state.ModalSave} | ||||||
|  |           modalsBottomval={this.state.ModalsBottomval} | ||||||
|  |           loadtype={this.state.Loadtype} | ||||||
|  |         />:""} | ||||||
|  |         {/*发送至弹窗*/} | ||||||
|  |         { | ||||||
|  |           visible&&visible===true? | ||||||
|  |             <SendTopics | ||||||
|  |               {...this.state} | ||||||
|  |               {...this.props} | ||||||
|  |               visible={visible} | ||||||
|  |               category={banksMenu&&banksMenu.category} | ||||||
|  |               checkBoxValues={[banksMenu&&banksMenu.id]} | ||||||
|  |               topicscancelmodel={()=>this.topicscancelmodel()} | ||||||
|  |             />:"" | ||||||
|  |         } | ||||||
|  |         { | ||||||
|  |           banksMenu && | ||||||
|  |           <div className="task_menu_ul fl"> | ||||||
|  |             <Menu mode="horizontal" selectedKeys={tab} onClick={this.changeTab}> | ||||||
|  |               { | ||||||
|  |                 banksMenu.menuArray && banksMenu.menuArray.map((item,key)=>{ | ||||||
|  |                   console.log("BanksMenu"); | ||||||
|  |                   console.log(item); | ||||||
|  |                   return( | ||||||
|  |                     <Menu.Item key={key}><Link to={`${item.to}`}>{item.content}</Link></Menu.Item> | ||||||
|  |                   ) | ||||||
|  |                 }) | ||||||
|  |               } | ||||||
|  |             </Menu> | ||||||
|  |           </div> | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         { | ||||||
|  |           banksMenu===undefined? | ||||||
|  |           <span className="fr mt18"> | ||||||
|  |           <WordsBtn onClick={()=>this.deletecheckBoxValues(banksMenu&&banksMenu.id,banksMenu&&banksMenu.category)}style="blue" className="ml20 font-16">删除</WordsBtn> | ||||||
|  |           <WordsBtn to={ banksMenu.tos ? banksMenu.tos:""} style="blue" className="ml20 font-16">编辑</WordsBtn> | ||||||
|  |           <WordsBtn onClick={()=>this.sendTopics()} style="blue" className="ml20 font-16">发送</WordsBtn> | ||||||
|  |           </span> | ||||||
|  |             :banksMenu.authorize===true? | ||||||
|  |           <span className="fr mt18"> | ||||||
|  |           <WordsBtn onClick={()=>this.deletecheckBoxValues(banksMenu&&banksMenu.id,banksMenu&&banksMenu.category)}style="blue" className="ml20 font-16">删除</WordsBtn> | ||||||
|  |           <WordsBtn to={ banksMenu.tos ? banksMenu.tos:""} style="blue" className="ml20 font-16">编辑</WordsBtn> | ||||||
|  |           <WordsBtn onClick={()=>this.sendTopics()} style="blue" className="ml20 font-16">发送</WordsBtn> | ||||||
|  |           </span> | ||||||
|  |             : | ||||||
|  |             <span className="fr mt18"> | ||||||
|  |             <WordsBtn onClick={()=>this.sendTopics()} style="blue" className="ml20 font-16">发送</WordsBtn> | ||||||
|  |             </span> | ||||||
|  |         } | ||||||
|  |       </div> | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | export default BanksMenu; | ||||||
					Loading…
					
					
				
		Reference in new issue