import React from 'react'; import moment from 'moment'; import { DatePicker, Checkbox, Modal, Form, Input, Row, Col, Button, Upload, List, Comment } from 'antd'; import './index.less'; import Page from '@src/containers/Page'; import Block from '@src/components/Block'; // import FilterLayout from '@src/layouts/FilterLayout'; import ActionLayout from '@src/layouts/ActionLayout'; import TableLayout from '@src/layouts/TableLayout'; import { formatDate, formatSecond, formatPercent } from '@src/services/Tools'; import { asyncSMessage, asyncForm } from '@src/services/AsyncTools'; import { PcUrl } from '../../../../Constant'; import { Course } from '../../../stores/course'; import { User } from '../../../stores/user'; import { System } from '../../../stores/system'; export default class extends Page { init() { this.videoColumns = [{ title: '课时', dataIndex: 'courseNo.no', }, { title: '课时名称', dataIndex: 'courseNo.title', }, { title: '学习记录', dataIndex: 'records', render: (text) => { return (text || []).map(row => { return <p>{formatDate(row.createTime, 'YYYY-MM-DD HH:mm:ss')} {formatSecond(row.userTime)}</p>; }); }, }, { title: '预习作业进度', dataIndex: 'userPaper', render: (text, record) => { return `${text.times}遍+${formatPercent(record.userReport.userNumber, record.userReport.questionNumber)}`; }, }, { title: '操作', dataIndex: 'handler', render: (text, record) => { return <div className="table-button"> {<a onClick={() => { User.locationUser(record.userId, `${PcUrl}/my/report`); }}>查看</a>} </div>; }, }]; this.vsAction = [{ key: 'addAppointment', name: '添加预约', }]; this.vsList = [{ key: 'id', type: 'hidden', }, { key: 'title', type: 'input', name: '课程名称', }, { key: 'timerange', type: 'daterange', showTime: true, name: '上课时间', }, { key: 'cctalkChannel', type: 'input', name: '频道号', }]; this.vsColumns = [{ title: '课时序号', dataIndex: 'no', render: (text) => { const { data } = this.state; return `${text}/${data.number}`; }, }, { title: '上课时间', dataIndex: 'time', render: (text, record) => { return <DatePicker.RangePicker showTime value={[record.startTime, record.endTime]} onChange={(value) => { this.changeAppointment(record.id, { startTime: value[0], endTime: value[1] }); }} />; }, }, { title: '课程名称', dataIndex: 'title', }, { title: '频道号', dataIndex: 'cctalkChannel', }, { title: '学习进度', dataIndex: 'isFinish', render: (text, record) => { return <Checkbox checked={text > 0} onChange={(e) => { this.changeAppointment(record.id, { isFinish: e.target.checked ? 1 : 0 }); }} />; }, }, { title: '预习作业', dataIndex: 'userPaper', render: (text, record) => { return text ? <a onClick={() => { User.locationUser(record.userId, `${PcUrl}/paper/report/${record.reportId}`); }}>查看{text.times > 0 ? '(已完成)' : ''}</a> : ''; }, }, { title: '笔记批阅', dataIndex: 'noteList', render: (text, record) => { return <a onClick={() => { this.noteAction(record); }}>查看</a>; }, }, { title: '课后补充', dataIndex: 'supplyList', render: (text, record) => { return <a onClick={() => { this.supplyAction(record); }}>查看</a>; }, }]; } initData() { const { id } = this.params; let handler; if (id) { handler = Course.listStudy({ ids: [id] }); } handler .then(result => { const [row] = result.list; if (!row) { asyncSMessage('记录不存在'); return; } const { course } = row; this.setState({ data: row, module: course.courseModule }); this.refresh(); }); } refresh() { // const { id } = this.params; const { module } = this.state; switch (module) { case 'video': this.refreshVideo(); break; case 'online': break; case 'vs': this.refreshVs(); break; default: } } refreshVideo() { const { id } = this.params; User.allCourseRecord(Object.assign({ recordId: id }, this.state.search)).then(result => { this.setTableData(result, result ? result.length : 0); }); } refreshVs() { const { id } = this.params; User.listCourseAppointment(Object.assign({ recordId: id }, this.state.search)).then(result => { result.list = result.list.map(row => { row.startTime = moment(row.startTime); row.endTime = moment(row.endTime); return row; }); this.setTableData(result.list, result.total); }); } refreshComment(appointmentId, type) { this.setState({ comment: {} }); User.allCourseAppointmentComment({ appointmentId, type }) .then(result => { const commentMap = {}; result.forEach((row) => { commentMap[row.id] = row; }); this.setState({ commentList: result, commentMap }); }); } changeAppointment(id, data) { data.id = id; return User.editCourseAppointment(data).then(() => { this.refreshVs(); this.cleanInfo(); }); } addAppointmentAction() { const { id } = this.params; asyncForm('添加', this.vsList, {}, info => { const { data } = this.state; ([info.startTime, info.endTime] = info.timerange); return User.addCourseAppointment(Object.assign({ recordId: id, userId: data.userId, courseId: data.courseId, noteList: [], supplyList: [] }, info)).then(() => { asyncSMessage('添加成功!'); this.refreshVs(); }); }).catch(err => { console.log(err); }); } noteAction(record) { this.open(record, 'note'); this.refreshComment(record.id, 'note'); } supplyAction(record) { this.open(record, 'supply'); this.refreshComment(record.id, 'supply'); } submitComment(comment) { if (comment.id) { User.editCourseAppointmentComment(comment) .then(() => { this.refreshComment(comment.appointmentId, comment.type); this.setState({ comment: {} }); }); } else { User.addCourseAppointmentComment(comment) .then(() => { this.refreshComment(comment.appointmentId, comment.type); this.setState({ comment: {} }); }); } } deleteComment(comment) { User.delCourseAppointmentComment({ id: comment }).then(() => { this.refreshComment(comment.appointmentId, comment.type); }); } deleteAppointment(row) { User.delCourseAppointment({ id: row.id }).then(() => { asyncSMessage('删除成功!'); this.refresh(); }); } changeInfo(key, data) { const info = this.state[key] || {}; this.setState({ [key]: Object.assign(info, data) }); } renderVs() { const { data, page, commentMap } = this.state; return <div flex> {data.number > page.total && <ActionLayout itemList={this.vsAction} selectedKeys={this.state.selectedKeys} onAction={key => this.onAction(key)} />} <TableLayout columns={this.vsColumns} list={this.state.list} pagination={this.state.page} loading={this.props.core.loading} onChange={(pagination, filters, sorter) => this.tableChange(pagination, filters, sorter)} onSelect={(keys, rows) => this.tableSelect(keys, rows)} selectedKeys={this.state.selectedKeys} /> {this.state.note && <Modal visible closable title='课后笔记' footer={null} onCancel={() => { this.close(false, 'note'); }}> <List className="comment-list" itemLayout="horizontal" dataSource={this.state.commentList} renderItem={item => ( <Comment actions={[!!item.userId && <span onClick={() => this.changeInfo('comment', { id: null, parentId: item.id, file: null, content: null })}>回复</span>, !item.userId && <span onClick={() => this.changeInfo('comment', item)}>编辑</span>, !item.userId && <span onClick={() => this.deleteComment(item)}>删除</span>]} author={item.userId ? '学生' : '老师'} // avatar={item.userId ? '学' : '师'} content={<p>{item.reply && <span>{item.reply}</span>}{item.content}<br /> {item.file && <a href={item.file} target="_blank">{item.name || '文件'}</a>}</p>} datetime={formatDate(item.createTime, 'YYYY-MM-DD')} /> )} /> <Form> <Row> {this.state.comment.parentId && <Col span={24}><span>回复:{(commentMap[this.state.comment.parentId] || {}).content}</span></Col>} <Col span={12}> <Input value={(this.state.comment || {}).content || ''} onChange={e => { this.changeInfo('comment', { content: e.target.value }); }} /> </Col> <Col span={1}><Upload showUploadList={false} beforeUpload={(file) => System.uploadImage(file).then((result) => { this.changeInfo('comment', { file: result.url, name: file.name }); return Promise.reject(); })} > <Button>上传文档{(this.state.comment || {}).file ? '(已上传)' : ''}</Button> </Upload></Col> <Col span={1} offset={8}><Button type='primary' onClick={() => { if (!this.state.comment || !this.state.comment.content) return; this.state.comment.appointmentId = this.state.note.id; this.state.comment.type = 'note'; this.state.comment.recordId = this.state.note.recordId; this.submitComment(this.state.comment); }}>{(this.state.comment || {}).id ? '修改' : '发布'}</Button></Col> </Row> </Form> </Modal>} {this.state.supply && <Modal visible closable title='课后补充' footer={null} onCancel={() => { this.close(false, 'supply'); }}> <List className="comment-list" itemLayout="horizontal" dataSource={this.state.commentList} renderItem={item => ( <Comment actions={[!!item.userId && <span onClick={() => this.changeInfo('comment', { id: null, parentId: item.id, file: null, content: null })}>回复</span>, !item.userId && <span onClick={() => this.changeInfo('comment', item)}>编辑</span>, !item.userId && <span onClick={() => this.deleteComment(item)}>删除</span>]} author={item.userId ? '学生' : '老师'} // avatar={item.userId ? '学' : '师'} content={<p>{item.reply && <span>{item.reply}</span>}{item.content}<br /> {item.file && <a href={item.file} target="_blank">{item.name || '文件'}</a>}</p>} datetime={formatDate(item.createTime, 'YYYY-MM-DD')} /> )} /> <Form> <Row> {this.state.comment.parentId && <Col span={24}><span>回复:{(commentMap[this.state.comment.parentId] || {}).content}</span></Col>} <Col span={12}> <Input value={(this.state.comment || {}).content || ''} onChange={e => { this.changeInfo('comment', { content: e.target.value }); }} /> </Col> <Col span={1}><Upload showUploadList={false} beforeUpload={(file) => System.uploadImage(file).then((result) => { this.changeInfo('comment', { file: result.url, name: file.name }); return Promise.reject(); })} > <Button>上传文档{(this.state.comment || {}).file ? '(已上传)' : ''}</Button> </Upload></Col> <Col span={1} offset={8}><Button type='primary' onClick={() => { if (!this.state.comment || !this.state.comment.content) return; this.state.comment.appointmentId = this.state.supply.id; this.state.comment.type = 'supply'; this.state.comment.recordId = this.state.supply.recordId; this.submitComment(this.state.comment); }}>{(this.state.comment || {}).id ? '修改' : '发布'}</Button></Col> </Row> </Form> </Modal>} </div>; } renderVideo() { return <div flex> <TableLayout columns={this.videoColumns} list={this.state.list} pagination={this.state.page} loading={this.props.core.loading} onChange={(pagination, filters, sorter) => this.tableChange(pagination, filters, sorter)} onSelect={(keys, rows) => this.tableSelect(keys, rows)} selectedKeys={this.state.selectedKeys} /> </div>; } renderDetail() { switch (this.state.module) { case 'online': return []; case 'vs': return [this.renderVs()]; case 'video': return [this.renderVideo()]; default: return <div />; } } renderView() { const { data = {} } = this.state; const { course = {} } = data; return <Block flex> <h1>{course.title}{data.vsNo > 0 ? `V${data.vsNo}` : ''}{data.number > 0 ? `(${data.number}课时)` : ''}</h1> {this.renderDetail()} </Block>; } }