educoder/public/react/src/modules/courses/busyWork/commonWork.js

497 lines
16 KiB

This file contains ambiguous Unicode characters!

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

import React,{ Component } from "react";
import { Input,Checkbox,Menu,Pagination,Spin} from "antd";
import CourseLayoutcomponent from '../common/CourseLayoutComponent';
import UseBank from './UseBank'
import '../css/members.css'
import '../css/busyWork.css'
import CoursesListType from '../coursesPublic/CoursesListType'
import CommonWorkItem from './CommonWorkItem'
import PublishRightnow from './PublishRightnow'
import ConnectProject from './ConnectProject'
import { WordsBtn, on, off } from 'educoder'
import Modals from '../../modals/Modals'
import NoneData from "../coursesPublic/NoneData"
import Titlesearchsection from '../common/titleSearch/TitleSearchSection';
import { RouteHOC } from './common'
import axios from 'axios';
import _ from 'lodash'
const Search = Input.Search;
const map={1:"普通作业",2:"",3:"分组作业"}
const COMMON_WORK = 1
// const COMMON_WORK = 2
class commonWork extends Component{
constructor(props){
super(props);
this.state={
modalsType:"",
modalsTopval:"",
modalsBottomval:"",
modalCancel:"",
mainList:undefined,
selectedKeys: 'all',
order:"",
page:1,
search:"",
totalCount:0,
checkAll:false,
checkBoxValues:[],
isSpin:false
}
}
//输入搜索条件
inputStudent=(e)=>{
this.setState({
search:e.target.value,
page:1
})
}
//搜索查询
searchStudent=()=>{
let {page,search,order}=this.state;
this.getList(page,search,order);
}
openConnectionProject = (work) => {
this.refs['connectProject'].openConnectionProject(work)
}
// 新建
createCommonWork=(type)=>{
this.props.toNewPage(this.props.match.params)
}
cancelDelClasses=()=>{
this.setState({
modalsType:false,
modalsTopval:"",
modalsBottomval:"",
modalCancel:false
})
}
sureDelClasses(){
}
componentDidUpdate(prevProps, prevState) {
if (prevProps.match.path != this.props.match.path) {
this.clearSelection()
this.setState({ selectedKeys: 'all', order: '' }, () => {
this._getList()
})
}
}
_getList = () => {
this.setState({
isSpin:true
})
let {page,search,order}=this.state;
this.getList(page,search,order);
}
componentDidMount(){
this._getList()
on('updateNavSuccess', this.updateNavSuccess)
}
componentWillUnmount() {
off('updateNavSuccess', this.updateNavSuccess)
}
updateNavSuccess = () => {
this._getList()
}
useBankSuccess = (checkBoxValues, newWorkIdArray) => {
this.setState({
page:1,
checkBoxValues: newWorkIdArray
}, () => {
this.refs['publishModalRef'].open()
})
let {search, order}=this.state;
this.getList(1, search, order);
}
getList=(page,search,order)=>{
this.setState({
isSpin:true
})
let id=this.props.match.params.coursesId;
let workType = this.props.getModuleType()
let url="/courses/"+id+"/homework_commons.json?type="+workType+"&page="+page;
if(order!=""){
url+="&order="+order;
}
if(search!=""){
url+="&search="+search;
}
axios.get(encodeURI(url)).then((result)=>{
if(result.status==200){
this.setState({
mainList:result.data,
totalCount:result.data.task_count,
isSpin:false,
...result.data
})
}
}).catch((error)=>{
console.log(error);
})
}
//筛选条件
selectedStatus=(e)=>{
this.clearSelection()
this.setState({
order:e.key==="all"?"":e.key,
selectedKeys: e.key,
page:1,
isSpin:true,
checkBoxValues:[],
checkAll:false
})
let {search}=this.state;
this.getList(1,search,e.key==="all"?"":e.key);
}
onPageChange=(pageNumber)=>{
this.setState({
page:pageNumber,
checkBoxValues:[]
})
let {search,order}=this.state;
this.getList(pageNumber,search,order);
}
// 全选和反选
changeAll=(e)=>{
this.setState({
checkAll: e.target.checked
})
const valueId=this.state.mainList.homeworks.map(item=>{
return item.homework_id
})
if (e.target.checked) {
const concated = this.state.checkBoxValues.concat(valueId);
const sortedUniqed = _.uniq(concated)
this.setState({
checkBoxValues: sortedUniqed
})
} else {
this.setState({
checkBoxValues: _.difference(this.state.checkBoxValues, valueId)
})
}
}
onChangeSelect=(checkedValues)=>{
this.setState({
checkBoxValues: checkedValues,
checkAll: checkedValues.length == this.state.mainList.homeworks.length
})
}
onWorkDelete = () => {
const { checkBoxValues } = this.state;
const len = checkBoxValues.length;
if (len == 0) {
this.props.showNotification('请先选择要删除的作业')
return;
}
this.props.confirm({
// content: `确认要删除所选的${len}个作业吗?`,
content: <div>
<div>已提交作品将全部被删除不可恢复</div>
<div>是否确认删除?</div>
</div>,
onOk: () => {
let coursesId=this.props.match.params.coursesId;
const url = `/courses/${coursesId}/homework_commons/multi_destroy.json`
axios.post(url, {
homework_ids: checkBoxValues,
all_check: 0,
// group_ids
}).then((response) => {
if (response.data.status == 0) {
this.props.showNotification('删除成功')
this.clearSelection()
let {search,order}=this.state;
this.getList(1,search,order);
this.props.updataleftNavfun()
}
console.log(response)
}).catch((error) => {
console.log(error)
})
}
})
}
clearSelection = () => {
this.setState({ checkBoxValues: [], checkAll: false })
}
//
onSetPublic = () => {
const { checkBoxValues } = this.state;
const len = checkBoxValues.length;
if (len == 0) {
this.props.showNotification('请先选择要公开的作业')
return;
}
this.props.confirm({
content: <div>
<div>设为公开后非课堂成员也可以访问查看</div>
<div>是否确认设为公开</div>
</div>,
onOk: () => {
let coursesId=this.props.match.params.coursesId;
const url = `/courses/${coursesId}/homework_commons/set_public.json`
axios.post(url, {
homework_ids: checkBoxValues,
all_check: 0
}).then((response) => {
if (response.data.status == 0) {
this.props.showNotification('设为公开操作成功')
let {search,order, page}=this.state;
this.getList(page,search,order);
}
console.log(response)
}).catch((error) => {
console.log(error)
})
}
})
}
doWhenSuccess = () => {
let {search,order, page}=this.state;
this.getList(page,search,order);
this.setState({
checkBoxValues:[]
})
}
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.onChangeSelect(checkBoxValues)
}
addToBank = () => {
const { checkBoxValues } = this.state;
const len = checkBoxValues.length;
if (len == 0) {
this.props.showNotification('请先选择要加入题库的作业')
return;
}
const coursesId = this.props.match.params.coursesId
const url = `/courses/${coursesId}/homework_commons/add_to_homework_bank.json`
axios.post(url, {
homework_ids: checkBoxValues,
all_check: 0
}).then((response) => {
if (response.data.status == 0) {
this.props.showNotification('加入成功')
let {search,order}=this.state;
this.getList(1,search,order);
}
console.log(response)
}).catch((error) => {
console.log(error)
})
}
connectSuccess = () => {
let {page,search,order}=this.state;
this.getList(page,search,order);
}
cancelConnectionProject = (work) => {
let workId=this.props.match.params.workId;
let courseId=this.props.match.params.coursesId;
const url = `/homework_commons/${work.homework_id}/student_works/cancel_relate_project.json`
axios.get(url).then((response)=> {
if (response.data.status == 0) {
let {page,search,order}=this.state;
this.getList(page,search,order);
this.props.showNotification('取消关联成功')
}
}).catch((error)=>{
console.log(error)
})
}
render(){
let {
search,
page,
modalsType,
modalsTopval,
modalsBottomval,
mainList,
totalCount,
checkAll,
checkBoxValues,
task_count,
published_count,
unpublished_count,
main_category_name,
}=this.state;
const { coursedata } = this.props;
if (!coursedata) {
return ''
}
let workType = this.props.getModuleType()
const moduleChineseName = this.props.getModuleName(true)
const { course_public } = coursedata;
const isGroup = this.props.isGroup()
const isAdmin = this.props.isAdmin()
// <CourseLayoutcomponent {...this.props}>
// </CourseLayoutcomponent>
return(
<div>
{/* <div className="edu-back-white">
<p className="clearfix padding30 bor-bottom-greyE">
<span className="font-18 fl color-dark-21">{moduleChineseName}</span>
</p>
<div className="clearfix pl30 pr30">
<div className="fl mt6 task_menu_ul">
<Menu mode="horizontal" defaultSelectedKeys="all" onClick={this.selectedStatus}>
<Menu.Item key="all">全部</Menu.Item>
{isAdmin && <Menu.Item key="0">未发布</Menu.Item>}
<Menu.Item key="1">提交中</Menu.Item>
<Menu.Item key="2">补交中</Menu.Item>
<Menu.Item key="3">匿评中</Menu.Item>
<Menu.Item key="4">申诉中</Menu.Item>
<Menu.Item key="5">评阅中</Menu.Item>
</Menu>
</div>
<div className="fr mt16 mb16 searchView">
<Search
value={search}
placeholder="请输入姓名进行搜索"
onInput={this.inputStudent}
onSearch={this.searchStudent}
></Search>
</div>
</div>
</div> */}
<ConnectProject ref="connectProject" {...this.props} connectSuccess={this.connectSuccess}></ConnectProject>
<Titlesearchsection
title={main_category_name}
searchValue={ search }
// searchtype={this.props.isAdmin||this.props.isStudent ?true:false}
onInputSearchChange={this.inputStudent}
onPressEnter={this.searchStudent}
firstRowRight={
<React.Fragment>
{ isAdmin && <WordsBtn style="blue" className="fr" onClick={()=>this.createCommonWork(1)}>新建</WordsBtn>}
{ isAdmin && <li className="fr">
<UseBank {...this.props} {...this.state} object_type={isGroup ? "group" : "normal"} useBankSuccess={this.useBankSuccess}></UseBank>
</li> }
</React.Fragment>
}
secondRowBotton={
<div className="fl mt6 task_menu_ul">
<Menu mode="horizontal" selectedKeys={this.state.selectedKeys} onClick={this.selectedStatus}>
<Menu.Item key="all">全部</Menu.Item>
{isAdmin && <Menu.Item key="0">未发布</Menu.Item>}
<Menu.Item key="1">提交中</Menu.Item>
<Menu.Item key="2">补交中</Menu.Item>
<Menu.Item key="3">匿评中</Menu.Item>
<Menu.Item key="4">申诉中</Menu.Item>
<Menu.Item key="5">评阅中</Menu.Item>
</Menu>
</div>
}
secondRowLeft={
<div style={{"display":"inline-block", "marginTop": "22px"}}>
<span> {mainList&&mainList.all_count} {moduleChineseName}</span>
<span style={{"marginLeft":"16px"}}>已发布{published_count}</span>
{/* {this.props.isAdmin()?:""} */}
<span style={{"marginLeft":"16px"}}>未发布{unpublished_count}</span>
</div>
}
searchPlaceholder={"请输入名称进行搜索"}
showSearchInput={true}
></Titlesearchsection>
<PublishRightnow ref="publishModalRef" showActionButton={true} {...this.props} checkBoxValues={checkBoxValues}
showActionButton={false}
isPublish={true}
isPublishtype={1}
doWhenSuccess={this.doWhenSuccess} fromListPage={true}></PublishRightnow>
{
mainList && mainList.course_identity < 5 && mainList.homeworks.length>0 &&
<div className="mt20 edu-back-white padding20-30">
<div className="clearfix" >
<Checkbox className="fl" onChange={this.changeAll} checked={checkAll}>已选 {checkBoxValues.length} 不支持跨页勾选</Checkbox>
<div className="studentList_operation_ul">
<li className="li_line">
<a href="javascript:void(0)" className="color-grey-9"
onClick={this.onWorkDelete}>删除</a>
</li>
<li className="li_line">
<a href="javascript:void(0)" className="color-grey-9" onClick={() => this.refs['publishModalRef'].homeworkstart()}>{ "立即发布" }</a>
</li>
<li className="li_line">
<PublishRightnow showActionButton={true} {...this.props} checkBoxValues={checkBoxValues}
isPublish={false} doWhenSuccess={this.doWhenSuccess} fromListPage={true}></PublishRightnow>
</li>
{ !!course_public && <li className="li_line"><a href="javascript:void(0)" onClick={this.onSetPublic} className="color-grey-9">设为公开</a></li>}
<li><a href="javascript:void(0)" className="color-grey-9"
onClick={this.addToBank}
>加入题库</a></li>
</div>
{/* 设为公开 */}
<Modals
modalsType={modalsType}
modalsTopval={modalsTopval}
modalsBottomval={modalsBottomval}
modalCancel={this.cancelDelClasses}
modalSave={this.sureDelClasses}
>
</Modals>
</div>
</div>
}
<Spin size="large" spinning={this.state.isSpin}>
<Checkbox.Group style={{"width":"100%"}} onChange={this.onChangeSelect} value={checkBoxValues}>
<CommonWorkItem mainList={mainList} {...this.props} workType={workType} onItemClick={this.onItemClick}
openConnectionProject={this.openConnectionProject}
cancelConnectionProject={this.cancelConnectionProject}
></CommonWorkItem>
</Checkbox.Group>
</Spin>
{
mainList && mainList.homeworks && mainList.homeworks.length==0 && <NoneData></NoneData>
}
{
!!totalCount && totalCount > 15 &&
<div className="edu-txt-center pt30 pb10 clearfix">
<Pagination current={page} showQuickJumper pageSize={15} total={totalCount} onChange={this.onPageChange}></Pagination>
</div>
}
</div>
)
}
}
export default RouteHOC() (commonWork);