import React, { Component } from 'react'; import { SnackbarHOC } from 'educoder'; import {Link} from 'react-router-dom'; import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; import Loadable from 'react-loadable'; import Loading from '../../../Loading'; import { CNotificationHOC } from '../common/CNotificationHOC' import { RouteHOC } from './common' import locale from 'antd/lib/date-picker/locale/zh_CN'; import { WordsBtn, MarkdownToHtml, trigger, queryString, downloadFile } from 'educoder'; import axios from 'axios'; import Modals from '../../modals/Modals'; import CoursesListType from '../coursesPublic/CoursesListType'; import AccessoryModal from "../coursesPublic/AccessoryModal"; import PublishRightnow from './PublishRightnow' import '../css/Courses.css' import CBreadcrumb from '../common/CBreadcrumb' import DownloadMessageysl from "../../modals/DownloadMessageysl"; import ConnectProject from './ConnectProject' import { Spin } from 'antd' //引入对应跳转的组件 //新建分组/普通作业 const NewWork = Loadable({ loader: () => import('./NewWork'), loading:Loading, }) const CommonWorkSetting = Loadable({ loader: () => import('./CommonWorkSetting'), loading:Loading, }) const CommonWorkList = Loadable({ loader: () => import('./CommonWorkList'), loading:Loading, }) const CommonWorkQuestion = Loadable({ loader: () => import('./CommonWorkQuestion'), loading:Loading, }) const CommonWorkAnswer = Loadable({ loader: () => import('./CommonWorkAnswer'), loading:Loading, }) const CommonWorkAppraise = Loadable({ loader: () => import('./CommonWorkAppraise'), loading:Loading, }) const CommonWorkPost = Loadable({ loader: () => import('./CommonWorkPost'), loading:Loading, }) const CommonWork = Loadable({ loader: () => import('./commonWork'), loading:Loading, }) class CommonWorkDetailIndex extends Component{ constructor(props) { super(props) this.publishModal = React.createRef(); this.endModal = React.createRef(); this.state = { DownloadType:false, DownloadMessageval:undefined, donwloading:false, } } initWorkDetailCommonState = (data) => { this.setState({ ...data }) } goback = () => { let workId=this.props.match.params.workId; // if ( window.location.pathname.indexOf('appraise') == -1) { let category_id= this.state.category.category_id; this.props.toListPage(this.props.match.params, category_id) } else { this.props.toWorkListPage(this.props.match.params, workId) } // this.props.history.goBack() } // 补交附件 Cancelvisible=()=>{ this.setState({ accessoryVisible:false }) } addAccessory=()=>{ this.setState({ accessoryVisible:true }) } setupdate = () => { } doWhenSuccess = () => { trigger('commonwork_fetch_all') } /// 确认是否下载 confirmysl(url){ axios.get(url+ '&export=true').then((response) => { if(response===undefined){ return } 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.slowDownload(url) // this.props.showNotification(`正在下载中`); // this.setState({ donwloading: true }) // downloadFile({ // url: url, // successCallback: (url) => { // this.setState({ donwloading: false }) // console.log('successCallback') // }, // failCallback: (responseHtml, url) => { // this.setState({ donwloading: false }) // console.log('failCallback') // } // }) // window.open("/api"+url, '_blank'); } }).catch((error) => { console.log(error) }); } Downloadcal=()=>{ this.setState({ DownloadType:false, DownloadMessageval:undefined }) } bindRef = ref => { this.child = ref }; // 关联项目 openConnectionProject = (work) => { this.refs['connectProject'].openConnectionProject(work) } connectSuccess = () => { this.child.fetchData && this.child.fetchData() } 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) { this.child.fetchData && this.child.fetchData() this.props.showNotification('取消关联成功') } }).catch((error)=>{ console.log(error) }) } // 关联项目 END render() { let {course_name, homework_name, homework_status, noTab , view_answer, author_name, category, work_id , end_immediately, publish_immediately, work_statuses, accessoryVisible } =this.state; const { current_user } = this.props let courseId=this.props.match.params.coursesId; let category_id= category && category.category_id; let category_name= category && category.category_name; let workId=this.props.match.params.workId; const studentWorkId = this.props.match.params.studentWorkId const isGroup = this.props.isGroup() const moduleName = !isGroup? "普通作业":"分组作业"; const moduleEngName = this.props.getModuleName() const childModuleName = this.state.moduleName const commonHandler = { initWorkDetailCommonState: this.initWorkDetailCommonState, triggerRef: this.bindRef } const isAdmin = this.props.isAdmin() let exportParams = {} const isListModule = childModuleName == '作品列表'; // 是列表页 let params = {} if (isListModule) { // TODO if(this.child && this.child._getRequestParams) { params = this.child._getRequestParams() !== undefined ? this.child._getRequestParams() : {}; } } // console.log("普通作业176176176"); // console.log(params); let exportUrl = `/homework_commons/${workId}/works_list.zip?${queryString.stringify(params)}` let exportResultUrl = `/homework_commons/${workId}/works_list.xlsx?${queryString.stringify(params)}` return ( <div> <PublishRightnow ref={this.publishModal} showActionButton={false} {...this.props} checkBoxValues={[workId]} isPublish={true} doWhenSuccess={this.doWhenSuccess} checkBeforePost={this.saveWorkSetting} onToPublishClick={this.onToPublishClick} ></PublishRightnow> <DownloadMessageysl {...this.props} value={this.state.DownloadMessageval} modalCancel={this.Downloadcal} modalsType={this.state.DownloadType} /> <PublishRightnow ref={this.endModal} showActionButton={false} {...this.props} checkBoxValues={[workId]} isPublish={false} doWhenSuccess={this.doWhenSuccess}></PublishRightnow> <div className="newMain clearfix worklist1"> <div className={"educontent mt20"}> <style>{` .memoContent { background: #fff; } `}</style> {current_user && <CBreadcrumb items={[ { to: current_user&¤t_user.first_category_url , name: course_name}, { to: `/courses/${courseId}/${moduleEngName}/${category_id}`, name: category_name }, window.location.pathname.indexOf('appraise') == -1 ? { } : { to: `/courses/${courseId}/${moduleEngName}/${workId}/list`, name: '作业详情' }, // 1. 与上一条联动,当匿评他人作品时,TA人作品的作者真实姓名切换为“匿名” window.location.pathname.indexOf('appraise') == -1 ? { name: '作业详情' } : { name: author_name }, // window.location.pathname.indexOf('appraise') == -1 ? { } : { to: `/courses/${courseId}/${moduleEngName}/${workId}/list`, name: '作品列表' }, // { name: childModuleName } ]}></CBreadcrumb>} <div style={{ width:'100%',height:'52px'}} > <span className=" fl color-black summaryname" title={`${homework_name && homework_name.length > 36 ? homework_name : ''}`} style={{height: 'auto'}} > {homework_name} {/* <Link to={"/courses/"+courseId+"/graduation"+"/graduation_tasks/"}>{homework_name}</Link> */} </span> <CoursesListType typelist={homework_status} typesylename={"mt12"} /> {category && <a className="color-grey-6 fr font-16 ml30 mt5 mr20" onClick={this.goback} style={{ marginRight: '26px'}}>返回</a>} {this.state.update_atta && <React.Fragment> {this.state.accessoryVisible===true? <AccessoryModal {...this.props} modalname={"补交附件"} visible={this.state.accessoryVisible} Cancelname={"取消"} Savesname={"确认"} Cancel={this.Cancelvisible} setupdate={this.setupdate} seeworks={undefined} reviseAttachmentUrl={`/student_works/${work_id || studentWorkId}/revise_attachment.json`} />:""} <a className={"fr color-blue font-16 mt7"} href={"javascript:void(0)"} onClick={this.addAccessory} >补交附件</a> </React.Fragment> } </div> { noTab !== true && <div className="stud-class-set bor-bottom-greyE floatSpinParent"> <div className="mt10 clearfix edu-back-white poll_list pl5"> <Link onClick={() => this.setState({moduleName: '作品列表'})} className={`${isListModule ? 'active' : '' } `} to={`/courses/${courseId}/${moduleEngName}/${workId}/list`}>作品列表</Link> <Link onClick={() => this.setState({moduleName: '作业描述'})} className={`${childModuleName == '作业描述' ? 'active' : '' } `} to={`/courses/${courseId}/${moduleEngName}/${workId}/question`}>作业描述</Link> {view_answer == true && <Link onClick={() => this.setState({moduleName: '参考答案'})} className={`${childModuleName == '参考答案' ? 'active' : '' } `} to={`/courses/${courseId}/${moduleEngName}/${workId}/answer`}>参考答案</Link>} {this.props.isAdmin() ? <Link onClick={() => this.setState({moduleName: '设置'})} className={`${childModuleName == '设置' ? 'active' : '' } `} style={{paddingLeft:'38px'}} to={`/courses/${courseId}/${moduleEngName}/${workId}/setting`}>设置</Link>: "" } {/* { this.props.tabRightComponents } */} <React.Fragment> <style>{` .drop_down_menu li a { padding: 0px; font-size: 14px; } .drop_down_menu { width: 121px; } .drop_down_menu li { overflow: visible; width: 121px; } .drop_down_menu, .drop_down_normal { padding-top: 10px; padding-bottom: 8px; } .floatSpinParent .ant-spin-nested-loading { float: right; } `}</style> {this.props.isAdmin()? <Spin spinning={this.state.donwloading} style={{ }}> <li className="li_line drop_down fr color-blue font-16 mr8 mt20" style={{"padding":"0 20px"}}> 导出<i className="iconfont icon-xiajiantou font-12 ml2"></i> <ul className="drop_down_menu" style={{"right":"-34px","left":"unset","height":"auto"}}> <li> <a href={"javascript:void(0)"} className="color-dark" onClick={() => this.confirmysl(exportResultUrl)} >导出成绩</a> </li> <li> <a href={"javascript:void(0)"} className="color-dark" onClick={() => this.confirmysl(exportUrl)} >导出作品附件</a> </li> </ul> </li> </Spin>:""} {/* {isAdmin && <a className={"fr color-blue font-16"} href={exportUrl}>导出作品附件</a>} {isAdmin && <a className={"fr color-blue font-16"} href={exportResultUrl}>导出成绩</a>} */} {/*<a className={"fr color-blue font-16"}>导出</a>*/} {end_immediately && <a className={"fr color-blue font-16"} onClick={() => { this.endModal.current.open() } }>立即截止</a>} {publish_immediately && <a className={"fr color-blue font-16"} onClick={() => { this.publishModal.current.open() } } >立即发布</a>} {/*<a className={"fr color-blue font-16"}>项目在线质量检测</a>*/} {isAdmin && <a className={"fr color-blue font-16"} onClick={() => this.props.toEditPage(this.props.match.params, workId)}>编辑作业</a>} { // work_statuses && work_statuses.indexOf('关联项目') != -1 && <React.Fragment> <ConnectProject ref="connectProject" {...this.props} connectSuccess={this.connectSuccess}></ConnectProject> <WordsBtn style="blue" className={` font-16 fr`} onClick={() => this.openConnectionProject({ homework_id: workId })}>关联项目</WordsBtn> <WordsBtn style="blue" className={` font-16 fr`} onClick={() => this.props.toCreateProject()}>创建项目</WordsBtn> </React.Fragment> } { // work_statuses && work_statuses.indexOf('取消关联') != -1 && <WordsBtn style="blue" className={` font-16 fr`} onClick={() => this.cancelConnectionProject( {homework_id: workId} )}>取消关联</WordsBtn> } {work_statuses && work_statuses.indexOf('提交作品') != -1 && <a className={"fr color-blue font-16"} href={"javascript:void(0)"} onClick={() => { this.props.toWorkPostPage(this.props.match.params)}} >提交作品</a>} { work_statuses && work_statuses.indexOf('补交作品') != -1 && <a className={"fr color-blue font-16"} href={"javascript:void(0)"} onClick={() => { this.props.toWorkPostPage(this.props.match.params, null, true, work_id)}}> 补交作品</a> } {work_statuses && work_statuses.indexOf('修改作品') != -1 && <a className={"fr color-blue font-16"} href={"javascript:void(0)"} onClick={() => { this.props.toWorkPostPage(this.props.match.params, null, true, work_id)}} >修改作品</a>} {work_statuses && work_statuses.indexOf('补交附件') != -1 && <React.Fragment> <AccessoryModal {...this.props} modalname={"补交附件"} visible={accessoryVisible} Cancelname={"取消"} Savesname={"确认"} Cancel={this.Cancelvisible} setupdate={this.setupdate} reviseAttachmentUrl={`/student_works/${work_id}/revise_attachment.json`} /> <a className={"fr color-blue font-16"} href={"javascript:void(0)"} onClick={this.addAccessory} >补交附件</a> </React.Fragment> } </React.Fragment> </div> </div> } {/* 内容区 */} <Switch {...this.props}> {/* --------------------------------------------------------------------- */} {/* 作业设置 */} {/* http://localhost:3007/courses/1309/homework/9300/setting */} <Route exact path="/courses/:coursesId/common_homeworks/:workId/setting" render={ (props) => (<CommonWorkSetting {...this.props} {...props} {...this.state} {...commonHandler}/>) } ></Route> {/* 作品列表 */} <Route exact path="/courses/:coursesId/common_homeworks/:workId/list" render={ (props) => (<CommonWorkList ref="commonWorkList" triggerRef={this.bindRef} {...this.props} {...props} {...this.state} {...commonHandler}/>) } ></Route> {/* 作业问答 */} <Route exact path="/courses/:coursesId/common_homeworks/:workId/question" render={ (props) => (<CommonWorkQuestion {...this.props} {...props} {...this.state} {...commonHandler}/>) } ></Route> <Route exact path="/courses/:coursesId/common_homeworks/:workId/answer" render={ (props) => (<CommonWorkAnswer {...this.props} {...props} {...this.state} {...commonHandler}/>) } ></Route> <Route exact path="/courses/:coursesId/group_homeworks/:workId/setting" render={ (props) => (<CommonWorkSetting {...this.props} {...props} {...this.state} {...commonHandler}/>) } ></Route> {/* 作品列表 */} <Route exact path="/courses/:coursesId/group_homeworks/:workId/list" render={ (props) => (<CommonWorkList triggerRef={this.bindRef} {...this.props} {...props} {...this.state} {...commonHandler}/>) } ></Route> {/* 作业问答 */} <Route exact path="/courses/:coursesId/group_homeworks/:workId/question" render={ (props) => (<CommonWorkQuestion {...this.props} {...props} {...this.state} {...commonHandler}/>) } ></Route> <Route exact path="/courses/:coursesId/group_homeworks/:workId/answer" render={ (props) => (<CommonWorkAnswer {...this.props} {...props} {...this.state} {...commonHandler}/>) } ></Route> </Switch> </div> </div> </div> ) } } export default ( CommonWorkDetailIndex) ;