|
|
import React,{ Component } from "react";
|
|
|
import {Checkbox, Menu, Pagination,Spin} from "antd";
|
|
|
|
|
|
import Titlesearchsection from '../../common/titleSearch/TitleSearchSection'
|
|
|
import DownloadMessageysl from "../../../modals/DownloadMessageysl";
|
|
|
|
|
|
import { WordsBtn ,getRandomcode} from 'educoder'
|
|
|
import NoneData from '../../coursesPublic/NoneData'
|
|
|
import Modals from "../../../modals/Modals"
|
|
|
import axios from 'axios'
|
|
|
|
|
|
import _ from 'lodash'
|
|
|
|
|
|
import GraduateTopicItem from './GraduateTopicItem'
|
|
|
import ChooseGraduateTopicModal from './ChooseGraduateTopicModal'
|
|
|
import '../../css/members.css'
|
|
|
import '../../css/busyWork.css'
|
|
|
import '../style.css'
|
|
|
|
|
|
|
|
|
class Boards extends Component{
|
|
|
constructor(props){
|
|
|
super(props);
|
|
|
this.state = {
|
|
|
searchValue: '',
|
|
|
checkAllValue: false,
|
|
|
checkBoxValues: [],
|
|
|
data:[],
|
|
|
topicList: undefined,
|
|
|
course_public:1,
|
|
|
page:1,
|
|
|
totalCount:undefined,
|
|
|
status:"all",
|
|
|
pageSize:15,
|
|
|
modalsType:"",
|
|
|
modalsTopval:"",
|
|
|
modalsBottomval:"",
|
|
|
topicId:undefined,
|
|
|
index:undefined,
|
|
|
flag:true,
|
|
|
delType:false,
|
|
|
delTopval:"",
|
|
|
delLoadType:false,
|
|
|
delOrPublic:1,
|
|
|
isSpin:true,
|
|
|
DownloadType:false,
|
|
|
DownloadMessageval:undefined,
|
|
|
}
|
|
|
}
|
|
|
fetchAll = (searchValue,page,status) => {
|
|
|
this.setState({
|
|
|
checkAllValue: false,
|
|
|
isSpin:true
|
|
|
})
|
|
|
|
|
|
let {pageSize}=this.state;
|
|
|
const cid = this.props.match.params.coursesId
|
|
|
|
|
|
let url = `/courses/${cid}/graduation_topics.json?limit=${pageSize}`
|
|
|
if(searchValue!=""){
|
|
|
url+="&search="+searchValue
|
|
|
}
|
|
|
if(page!=""){
|
|
|
url+="&page="+page
|
|
|
}
|
|
|
if(status!="" && status != "all"){
|
|
|
url+="&status="+status;
|
|
|
}
|
|
|
url=encodeURI(url);//IE11传参为乱码(search)
|
|
|
axios.get(url
|
|
|
// ,{
|
|
|
// params:{
|
|
|
// search:encodeURI(searchValue),
|
|
|
// page:page,
|
|
|
// status:status,
|
|
|
// limit:pageSize
|
|
|
// }
|
|
|
// }
|
|
|
).then((response) => {
|
|
|
if (response.status == 200 && response.status) {
|
|
|
this.setState({
|
|
|
data:response.data,
|
|
|
topicList:response.data.graduation_topic,
|
|
|
totalCount:response.data.graduation_topic_count,
|
|
|
course_public:response.data.course_public,
|
|
|
isSpin:false,
|
|
|
page:page
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
.catch(function (error) {
|
|
|
this.setState({
|
|
|
isSpin:false
|
|
|
})
|
|
|
});
|
|
|
}
|
|
|
componentDidMount = () => {
|
|
|
this.setState({
|
|
|
isSpin:true
|
|
|
})
|
|
|
let{searchValue,page,status}=this.state
|
|
|
this.fetchAll(searchValue,page,status);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//搜索
|
|
|
onPressEnter = (value) => {
|
|
|
this.setState({
|
|
|
page:1,
|
|
|
searchValue:value,
|
|
|
checkBoxValues:[]
|
|
|
})
|
|
|
let {status}=this.state;
|
|
|
this.fetchAll(value,1,status);
|
|
|
}
|
|
|
|
|
|
onInputSearchChange = (e) => {
|
|
|
this.setState({
|
|
|
searchValue:e.target.value,
|
|
|
})
|
|
|
}
|
|
|
|
|
|
|
|
|
// 全选or反选
|
|
|
onCheckAll = (e) => {
|
|
|
this.setState({
|
|
|
checkAllValue: e.target.checked
|
|
|
})
|
|
|
const values = this.state.topicList.map(item => {
|
|
|
return item.id
|
|
|
})
|
|
|
if (e.target.checked) {
|
|
|
const concated = this.state.checkBoxValues.concat(values);
|
|
|
const uniq=_.uniq(concated)
|
|
|
this.setState({
|
|
|
checkBoxValues: uniq
|
|
|
})
|
|
|
} else {
|
|
|
this.setState({
|
|
|
checkBoxValues: _.difference(this.state.checkBoxValues, values)
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
onItemClick = (item) => {
|
|
|
const checkBoxValues = this.state.checkBoxValues.slice(0);
|
|
|
const index = checkBoxValues.indexOf(item.id);
|
|
|
if (index != -1) {
|
|
|
_.remove(checkBoxValues, (listItem)=> listItem === item.id)
|
|
|
} else {
|
|
|
checkBoxValues.push(item.id)
|
|
|
}
|
|
|
this.onCheckBoxChange(checkBoxValues)
|
|
|
}
|
|
|
|
|
|
onCheckBoxChange = (checkedValues) => {
|
|
|
this.setState({
|
|
|
checkBoxValues: checkedValues,
|
|
|
checkAllValue: checkedValues.length == this.state.topicList.length
|
|
|
})
|
|
|
}
|
|
|
|
|
|
// 分页
|
|
|
onChangePage=(pageNum)=>{
|
|
|
this.setState({
|
|
|
page:pageNum,
|
|
|
checkBoxValues:[]
|
|
|
})
|
|
|
let {status,searchValue}=this.state;
|
|
|
this.fetchAll(searchValue,pageNum,status);
|
|
|
console.log(this.state.checkBoxValues);
|
|
|
}
|
|
|
|
|
|
// 筛选
|
|
|
onChangeStatus =(e)=>{
|
|
|
this.setState({
|
|
|
page:1,
|
|
|
status:e.key,
|
|
|
checkBoxValues:[],
|
|
|
isSpin:true
|
|
|
})
|
|
|
let {searchValue}=this.state;
|
|
|
this.fetchAll(searchValue,1,e.key==="all"?"":e.key);
|
|
|
}
|
|
|
|
|
|
// 选题or取消选题
|
|
|
chooseTopic=(topicId,index,flag)=>{
|
|
|
this.setState({
|
|
|
modalsType:true,
|
|
|
modalsTopval:flag ==true ? "是否确认取消选题?":"是否确认选题?",
|
|
|
modalsBottomval:"",
|
|
|
modalCancel:true,
|
|
|
topicId:topicId,
|
|
|
index:index,
|
|
|
flag:flag
|
|
|
})
|
|
|
}
|
|
|
cancelOperateTopic=()=>{
|
|
|
this.setState({
|
|
|
modalsType:false,
|
|
|
modalsTopval:"",
|
|
|
modalsBottomval:"",
|
|
|
modalCancel:false
|
|
|
})
|
|
|
}
|
|
|
sureOperateTopic=()=>{
|
|
|
let{topicId,index,flag}=this.state;
|
|
|
let courseid=this.props.match.params.coursesId
|
|
|
|
|
|
let url="/courses/"+courseid+"/graduation_topics/"+topicId+"/"
|
|
|
if(flag){
|
|
|
url+="student_cancel_topic.json"
|
|
|
}else{
|
|
|
url+="student_select_topic.json"
|
|
|
}
|
|
|
axios.post((url)).then((result)=>{
|
|
|
if(result.data.status == 0){
|
|
|
this.props.showNotification(`${result.data.message}`);
|
|
|
let {searchValue,page,status} =this.state
|
|
|
this.fetchAll(searchValue,page,status);
|
|
|
this.cancelOperateTopic();
|
|
|
}
|
|
|
}).catch(error=>{
|
|
|
console.log(error);
|
|
|
})
|
|
|
}
|
|
|
// 删除
|
|
|
onDelete=(index)=>{
|
|
|
let {checkBoxValues}=this.state;
|
|
|
if(checkBoxValues.length>0){
|
|
|
if(index<3){
|
|
|
this.setState({
|
|
|
delType:true,
|
|
|
delTopval:index==1?"是否确认删除?":"是否设为公开?",
|
|
|
delLoadType:false,
|
|
|
delOrPublic:index
|
|
|
})
|
|
|
}else{
|
|
|
// 加入题库
|
|
|
let courseid=this.props.match.params.coursesId
|
|
|
let url=`/courses/${courseid}/graduation_topics/add_to_bank.json`;
|
|
|
axios.post((url),{
|
|
|
topic_ids:checkBoxValues
|
|
|
}).then((result)=>{
|
|
|
if(result){
|
|
|
this.props.showNotification(`题库更新成功`);
|
|
|
let {searchValue,page,status} =this.state
|
|
|
this.fetchAll(searchValue,page,status);
|
|
|
this.setState({
|
|
|
checkBoxValues:[],
|
|
|
checkAllValue:false
|
|
|
})
|
|
|
}
|
|
|
}).catch((error)=>{
|
|
|
console.log(error)
|
|
|
})
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
this.setState({
|
|
|
// delType:true,
|
|
|
// delTopval:"请先在列表中选择数据",
|
|
|
// delLoadType:true,
|
|
|
delOrPublic:index
|
|
|
})
|
|
|
this.props.showNotification("请先在列表中选择数据");
|
|
|
}
|
|
|
}
|
|
|
cancelDelTopic=()=>{
|
|
|
this.setState({
|
|
|
delType:false,
|
|
|
delTopval:"",
|
|
|
delLoadType:false
|
|
|
})
|
|
|
}
|
|
|
sureDelTopic=()=>{
|
|
|
let {checkBoxValues,delOrPublic}=this.state;
|
|
|
if(checkBoxValues.length>0){
|
|
|
let courseid=this.props.match.params.coursesId;
|
|
|
let url="";
|
|
|
// 删除
|
|
|
if(delOrPublic==1){
|
|
|
url="/courses/"+courseid+"/graduation_topics/destroys.json";
|
|
|
axios.delete((url), { data: {
|
|
|
graduation_topic_ids: this.state.checkBoxValues
|
|
|
}})
|
|
|
.then((result)=>{
|
|
|
if(result.data.status==0){
|
|
|
this.props.showNotification(`${result.data.message}`);
|
|
|
this.setState({
|
|
|
delType:false,
|
|
|
delTopval:"",
|
|
|
checkBoxValues:[]
|
|
|
})
|
|
|
let {searchValue,status} =this.state;
|
|
|
this.fetchAll(searchValue,1,status);
|
|
|
}
|
|
|
}).catch((error)=>{
|
|
|
console.log(error);
|
|
|
})
|
|
|
}else if(delOrPublic==2){
|
|
|
// 设为公开
|
|
|
url="/courses/"+courseid+"/graduation_topics/set_public.json";
|
|
|
axios.post((url), {
|
|
|
graduation_topic_ids: this.state.checkBoxValues
|
|
|
}).then((result)=>{
|
|
|
if(result.data.status==0){
|
|
|
this.props.showNotification(`${result.data.message}`);
|
|
|
this.setState({
|
|
|
delType:false,
|
|
|
delTopval:"",
|
|
|
checkBoxValues:[]
|
|
|
})
|
|
|
let {searchValue,status} =this.state;
|
|
|
this.fetchAll(searchValue,1,status);
|
|
|
}
|
|
|
}).catch((error)=>{
|
|
|
console.log(error);
|
|
|
})
|
|
|
}
|
|
|
}else{
|
|
|
this.setState({
|
|
|
delType:false,
|
|
|
delTopval:"",
|
|
|
delLoadType:false
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
// 新建
|
|
|
onBoardsNew=()=>{
|
|
|
let courseId=this.props.match.params.coursesId
|
|
|
this.props.history.push(`/courses/${courseId}/graduation_topics/new`)
|
|
|
}
|
|
|
/// 确认是否下载
|
|
|
confirmysl(url){
|
|
|
axios.get(url + '?export=true').then((response) => {
|
|
|
if(response.data.status&&response.data.status===-1){
|
|
|
|
|
|
}else if(response.data.status&&response.data.status===-2){
|
|
|
if(response.data.message === "100"){
|
|
|
// 已超出文件导出的上限数量(100 ),建议:
|
|
|
|
|
|
this.setState({
|
|
|
DownloadType:true,
|
|
|
DownloadMessageval:100
|
|
|
})
|
|
|
}else {
|
|
|
//因附件资料超过500M
|
|
|
this.setState({
|
|
|
DownloadType:true,
|
|
|
DownloadMessageval:500
|
|
|
})
|
|
|
}
|
|
|
}else {
|
|
|
this.props.showNotification(`正在下载中`);
|
|
|
window.open(getRandomcode("/api"+url), '_blank');
|
|
|
}
|
|
|
}).catch((error) => {
|
|
|
console.log(error)
|
|
|
});
|
|
|
}
|
|
|
|
|
|
Downloadcal=()=>{
|
|
|
this.setState({
|
|
|
DownloadType:false,
|
|
|
DownloadMessageval:undefined
|
|
|
})
|
|
|
}
|
|
|
|
|
|
// 题库选用成功后刷新页面
|
|
|
useBankSuccess=(checkBoxValues,object_ids)=>{
|
|
|
//debugger
|
|
|
let {searchValue,page,status} =this.state
|
|
|
this.fetchAll(searchValue,page,status);
|
|
|
}
|
|
|
render(){
|
|
|
let {
|
|
|
searchValue,
|
|
|
topicList,
|
|
|
data,
|
|
|
course_public,
|
|
|
checkBoxValues,
|
|
|
checkAllValue,
|
|
|
page,
|
|
|
totalCount,
|
|
|
pageSize,
|
|
|
//选题和取消选题
|
|
|
modalsType,
|
|
|
modalsTopval,
|
|
|
modalsBottomval,
|
|
|
// 删除弹框
|
|
|
delType,
|
|
|
delTopval,
|
|
|
delLoadType
|
|
|
} = this.state;
|
|
|
// let {course_identity}=this.props.coursedata
|
|
|
const isAdmin =this.props.isAdmin();
|
|
|
return(
|
|
|
<React.Fragment >
|
|
|
<ChooseGraduateTopicModal ref="chooseGraduateTopicModal"></ChooseGraduateTopicModal>
|
|
|
<DownloadMessageysl
|
|
|
{...this.props}
|
|
|
value={this.state.DownloadMessageval}
|
|
|
modalCancel={this.Downloadcal}
|
|
|
modalsType={this.state.DownloadType}
|
|
|
/>
|
|
|
<Titlesearchsection
|
|
|
title="毕设选题"
|
|
|
searchValue={ searchValue }
|
|
|
onInputSearchChange={this.onInputSearchChange}
|
|
|
allowClearonChange={this.onInputSearchChange}
|
|
|
firstRowRight=
|
|
|
{ isAdmin ?
|
|
|
(<React.Fragment>
|
|
|
{/* 参考普通作业 - 题库选用 */}
|
|
|
{/* <WordsBtn style="blue" className="mr30" onClick={()=>this.useFromBank()}>题库选用</WordsBtn> 正式版没有,先隐藏*/}
|
|
|
< a className={"fl color-blue mr30 font-16"} onClick={(url)=>this.confirmysl(`/courses/${this.props.match.params.coursesId}/graduation_topics/export.xlsx`)}>导出</a>
|
|
|
{/*<p className="fl"><UseBank {...this.props} {...this.state} object_type={"gtopic"} useBankSuccess={this.useBankSuccess}></UseBank></p> 题库选用*/}
|
|
|
<WordsBtn style="blue" className="font-16" onClick={()=>this.onBoardsNew()}>新建</WordsBtn>
|
|
|
</React.Fragment>):""
|
|
|
}
|
|
|
secondRowLeft={
|
|
|
<div className="fl mt6 task_menu_ul">
|
|
|
<Menu mode="horizontal" defaultSelectedKeys="all" onClick={this.onChangeStatus}>
|
|
|
<Menu.Item key="all">全部</Menu.Item>
|
|
|
<Menu.Item key="0">待选中</Menu.Item>
|
|
|
<Menu.Item key="1">待确认</Menu.Item>
|
|
|
<Menu.Item key="2">已确认</Menu.Item>
|
|
|
</Menu>
|
|
|
</div>
|
|
|
}
|
|
|
onPressEnter={this.onPressEnter}
|
|
|
searchPlaceholder={"请输入名称进行搜索"}
|
|
|
showSearchInput={topicList&&topicList.length >= pageSize}
|
|
|
></Titlesearchsection>
|
|
|
<Spin size="large" spinning={this.state.isSpin}>
|
|
|
{
|
|
|
topicList && topicList.length > 0 ?
|
|
|
(
|
|
|
<div>
|
|
|
{
|
|
|
// 超级管理员、教师、助教
|
|
|
isAdmin ?
|
|
|
<div className="clearfix mt20 edu-back-white padding20-30">
|
|
|
<Checkbox className="fl" onChange={this.onCheckAll} checked={checkAllValue}>已选 {checkBoxValues.length} 个 (不支持跨页勾选)</Checkbox>
|
|
|
<div className="studentList_operation_ul">
|
|
|
<li className="li_line"><a href="javascript:void(0)" className="color-grey-9" onClick={()=>this.onDelete(1)}>删除</a></li>
|
|
|
{
|
|
|
course_public && course_public==1 ? <li className="li_line"><a href="javascript:void(0)" className="color-grey-9" onClick={()=>this.onDelete(2)}>设为公开</a></li>:""
|
|
|
}
|
|
|
{/*<li className="li_line"><a className="color-grey-9" onClick={()=>this.onDelete(3)}>加入题库</a></li>*/}
|
|
|
{/* <li className="li_line"><a href="javascript:void(0)" className="color-grey-9">加入题库</a></li> */}
|
|
|
</div>
|
|
|
</div>
|
|
|
:""
|
|
|
}
|
|
|
<Modals
|
|
|
modalsType={delType}
|
|
|
modalsTopval={delTopval}
|
|
|
modalsBottomval=""
|
|
|
modalCancel={this.cancelDelTopic}
|
|
|
modalSave={this.sureDelTopic}
|
|
|
loadtype={delLoadType}
|
|
|
>
|
|
|
</Modals>
|
|
|
|
|
|
<div className="clearfix stu_table mt20">
|
|
|
<Checkbox.Group style={{ width: '100%' }} onChange={this.onCheckBoxChange} value={checkBoxValues}>
|
|
|
{ topicList.map((item, index) => {
|
|
|
return (
|
|
|
<div>
|
|
|
<GraduateTopicItem
|
|
|
{...this.props}
|
|
|
discussMessage={item}
|
|
|
data={data}
|
|
|
checkBox={<Checkbox value={item.id} key={item.id} onClick={() => this.onItemClick(item)} className="mr15"></Checkbox>}
|
|
|
onItemClick={this.onItemClick}
|
|
|
index={index}
|
|
|
chooseTopic={this.chooseTopic}
|
|
|
></GraduateTopicItem>
|
|
|
</div>
|
|
|
)
|
|
|
})
|
|
|
}
|
|
|
</Checkbox.Group>
|
|
|
</div>
|
|
|
|
|
|
<Modals
|
|
|
modalsType={modalsType}
|
|
|
modalsTopval={modalsTopval}
|
|
|
modalsBottomval={modalsBottomval}
|
|
|
modalCancel={this.cancelOperateTopic}
|
|
|
modalSave={this.sureOperateTopic}
|
|
|
>
|
|
|
</Modals>
|
|
|
</div>
|
|
|
):(topicList && topicList.length===0?<NoneData></NoneData>:<div className="clearfix stu_table mt20"></div>)
|
|
|
}
|
|
|
</Spin>
|
|
|
{
|
|
|
totalCount && totalCount > pageSize ?
|
|
|
<div className="padding30 edu-txt-center clearfix">
|
|
|
<Pagination defaultCurrent={page} current={page} pageSize={pageSize} showQuickJumper onChange={this.onChangePage} total={totalCount}></Pagination>
|
|
|
</div>
|
|
|
:
|
|
|
<div></div>
|
|
|
}
|
|
|
|
|
|
<div>
|
|
|
</div>
|
|
|
</React.Fragment>
|
|
|
)
|
|
|
}
|
|
|
}
|
|
|
export default Boards; |