forgeplus-react/src/modules/courses/busyWork/reply/CommonWorkAppraiseReply.js

316 lines
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React,{ Component } from "react";
import { Pagination } from "antd";
import update from 'immutability-helper';
import axios from 'axios';
import moment from 'moment';
import _ from 'lodash';
import {ImageLayerOfCommentHOC} from '../../../page/layers/ImageLayerOfCommentHOC';
import GraduationTasksappraiseMainEditor from '../../graduation/tasks/GraduationTasksappraiseMainEditor';
import CCommentItem from '../../common/comments/CCommentItem';
import '../../../comment/Comment.css';
import '../../common/courseMessage.css';
import '../../graduation/tasks/GraduationTasksappraiseReply.css';
import './CommonWorkAppraiseReply.css';
import ModulationModal from "../../coursesPublic/ModulationModal";
import Modals from '../../../modals/Modals';
const REPLY_PAGE_COUNT = 10
const $ = window.$;
/*
*/
class CommonWorkAppraiseReply extends Component{
constructor(props){
super(props);
this.editorRef = React.createRef();
this.state={
total_count: 0,
comment_scores: [],
}
}
fetchAllComments = () => {
let category_id= this.props.match.params.category_id;
// const url = `/graduation_works/${category_id}/comment_list.json`
const task_id = this.props.task_id
const url = `/student_works/${task_id}/comment_list.json`
axios.get(url).then((result)=>{
if(result.data.comment_scores){
const comment_scores = result.data.comment_scores.map(item => {
return this.transformReply(item)
})
this.setState({
...result.data,
comment_scores
})
}
}).catch((error)=>{
console.log(error)
})
}
replySuccess = () => {
this.fetchAllComments()
}
componentDidMount(){
this.fetchAllComments()
}
addSuccess = () => {
this.fetchAllComments()
}
transformReply = (reply, children = []) => {
const isAdmin = this.props.isAdmin()
const isSuperAdmin = this.props.isSuperAdmin()
if (reply.appeal_info && reply.appeal_info.time) {
reply.appeal_info.user_info = {
"user_name": reply.appeal_info.user_name,
"user_login": reply.appeal_info.user_login,
"user_image_url": reply.appeal_info.user_image_url
}
reply.appeal_info.is_appeal_info = true
reply.appeal_info.appeal_status = reply.appeal_status
reply.appeal_info.score_id = reply.score_id
reply.journals.push(reply.appeal_info)
reply.journals = _.orderBy(reply.journals, 'time', 'asc')
}
return {
isSuperAdmin: isSuperAdmin,
admin: isAdmin, //
journals: reply.journals,
appeal_status: reply.appeal_status,
attachments: reply.attachments,
can_appeal: reply.can_appeal,
can_reply: reply.can_reply,
child_message_count: reply.child_message_count,
id: reply.comment_id,
// time: moment(reply.comment_time).fromNow(),
time: moment(reply.comment_time).format('YYYY-MM-DD HH:mm'),
image_url: reply.user_image_url,
user_id: reply.user_id,
user_login: reply.user_login,
username: reply.user_name,
content: reply.content,
score: reply.score,
delete: reply.delete,
is_invalid: reply.is_invalid,
comment_role: reply.comment_role
}
}
onDelete = (item) => {
this.props.confirm({
content: '确定要删除这个评阅吗?',
okText: '确定',
cancelText: '取消',
onOk: () => {
let category_id= this.props.match.params.category_id;
const task_id = this.props.task_id
// 作业是使用 task_id
const url = `/student_works/${task_id}/destroy_score.json`
axios.delete(url, { data: {
score_id: item.id
}
}).then((result)=>{
if(result.data.status == 0){
this.props.showNotification('删除成功')
this.fetchAllComments()
}
}).catch((error)=>{
console.log(error)
})
},
onCancel() {
console.log('Cancel');
},
});
}
showModulationtype=(id)=>{
// console.log(id)
this.setState({
Modulationtype:true,
operationId:id
})
}
cancelmodel=()=>{
this.setState({
Modalstype:false,
Loadtype:false,
visible:false,
Modulationtype:false,
Allocationtype:false,
Modalstopval:"",
ModalCancel:"",
ModalSave:"",
})
}
saveModulationModal=(value,num)=>{
let {operationId}=this.state;
let studentWorkId =this.props.match.params.studentWorkId;
let url ="/student_works/"+studentWorkId+"/adjust_score.json";
axios.post(url,{
score:num,
comment:value
}).then((result)=>{
if(result.data.status===0){
this.cancelmodel()
this.props.showNotification('调分成功')
this.props.onReplySuccess && this.props.onReplySuccess()
this.fetchAllComments();
}
}).catch((error)=>{
console.log(error)
})
}
onReply = (params) => {
const { task_id } = this.props;
const replyUrl = `/student_works/${task_id}/add_score.json`
axios.post(replyUrl, params).then((response)=>{
if(response.data.status == 0) {
this.editorRef.current.clearInputs()
this.fetchAllComments();
this.props.onReplySuccess && this.props.onReplySuccess()
}
}).catch((error)=>{
console.log(error)
})
}
render(){
let { total_count, comments, pageCount, comment_scores, allow_score } = this.state
const { current_user, memo, homework_status } = this.props
const isAdmin = this.props.isAdmin()
const isNiPing = homework_status && homework_status.indexOf('匿评中') != -1
const isGroup = this.props.isGroup()
/**
isAdmin || 评阅入口:超级管理员、老师和助教显示; -》 改成admin也不显示
匿评人:匿评期间显示
*/
// && isNiPing
const needNiPingEditor = (allow_score );
if (!needNiPingEditor && comment_scores.length == 0) {
return ''
}
return(
<React.Fragment>
<div className="edu-back-white padding10-10" style={{marginTop: '16px'}}>
<div className={"stud-class-set edu-back-white mb10"} style={{height:"100%"}}>
<Modals
modalsType={this.state.Modalstype}
modalsTopval={this.state.Modalstopval}
modalCancel={this.state.ModalCancel}
modalSave={this.state.ModalSave}
closable={false}
footer={null}
destroyOnClose={true}
centered={true}
/>
{this.state.Modulationtype===true?<ModulationModal
modalname={"调分"}
visible={this.state.Modulationtype}
Cancelname={"取消"}
Savesname={"保存"}
Cancel={this.cancelmodel}
Saves={(value,num)=>this.saveModulationModal(value,num)}
closable={false}
footer={null}
destroyOnClose={true}
centered={true}
/>:""}
{/*<div style={{ width:'100%',height:'75px'}} >*/}
{/*<p className=" fl color-black mt25 summaryname">{datalist&&datalist.task_name}</p>*/}
{/*<a className="color-grey-6 fr font-16 mt10 mr20" onClick={this.goback}>返回</a>*/}
{/*{this.props.isStudent()?<a className={"fr color-blue font-16 mt10 mr20"} onClick={this.addAccessory}>补交附件</a>:""}*/}
{/*</div>*/}
{/* {
(!!comment_scores.length &&
<div className={"color-grey-6 mb10"}>
<span className="labal">全部评阅</span>
<span className="count">{comment_scores.length}</span>
</div>)} */}
<div className={`padding20-30 ${comment_scores.length ? 'bor-bottom-greyE' : ''}`}>
{!!comment_scores.length && <div className={"color-grey-6 font-16"}>
全部评阅<span className="count">{comment_scores.length===0?"":`(${comment_scores.length})`}</span>
{/* <div style={{ width:'100%',height:'75px'}} ></div> */}
{/* true: 老师身份显示“调分”入口false: 不显示调分入口 */}
{isAdmin && !allow_score &&
<a className={"fr color-blue font-16"} onClick={()=>this.showModulationtype(this.props.task_id)}>调分</a>
}
</div> }
{needNiPingEditor && <GraduationTasksappraiseMainEditor {...this.props}
title={'评语'}
showModulationtype={this.showModulationtype}
addSuccess={this.addSuccess} ref={this.editorRef} totalCount={comment_scores.length}
onReply={this.onReply} placeholder={"请在此输入对本作品的评语最大限制2000个字符"}
showSameScore={isGroup && isAdmin}
get_next_works={()=>this.props.get_next_works()}
></GraduationTasksappraiseMainEditor> }
</div>
{/* ${!!comment_scores.length ? 'bor-bottom-greyE' : ''} */}
<div className={`padding20 memoReplies commentsDelegateParent course-message`}
style={{ paddingTop: '0px', paddingBottom: '0px' }}
>
{/*
.course-message .panel-comment_item {
margin-top: ${needNiPingEditor ? 56 : 28}px;
}
*/}
<style>{`
.course-message .panel-comment_item .comment_orig_content {
width: 1040px;
}
.course-message .childrenCommentsView .comment_orig_content {
width: 1000px;
}
.comment_item_cont:last-child {
border-bottom: none;
}
`}</style>
{!!comment_scores.length && <div className="panel-comment_item">
{ comment_scores.map((item, index) => {
return <CCommentItem item={item} onDelete={this.onDelete} {...this.props} commentIndex={index} replySuccess={this.replySuccess}></CCommentItem>
}) }
</div>}
</div>
</div>
</div>
</React.Fragment>
)
}
}
export default ImageLayerOfCommentHOC() (CommonWorkAppraiseReply);