page.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import React from 'react';
  2. import { Form, Button, Row, Col, List, Icon, Switch, Typography, Input } from 'antd';
  3. import './index.less';
  4. // import Editor from '@src/components/Editor';
  5. import Page from '@src/containers/Page';
  6. import Block from '@src/components/Block';
  7. import DragList from '@src/components/DragList';
  8. // import FileUpload from '@src/components/FileUpload';
  9. import { formatFormError, formatDate, formatTreeData, getMap } from '@src/services/Tools';
  10. import { asyncSMessage } from '@src/services/AsyncTools';
  11. import { PcUrl } from '../../../../Constant';
  12. import { Exercise } from '../../../stores/exercise';
  13. import { Course } from '../../../stores/course';
  14. export default class extends Page {
  15. init() {
  16. Exercise.courseStruct().then((result) => {
  17. const list = result.map(row => { row.title = `${row.titleZh}`; row.value = row.id; return row; });
  18. this.filterForm[0].tree = formatTreeData(list, 'id', 'title', 'parentId');
  19. this.exerciseMap = getMap(result.map(row => {
  20. row.title = `${row.titleZh}`;
  21. row.value = row.id;
  22. return row;
  23. }), 'id', 'title');
  24. this.setState({ exercise: result });
  25. });
  26. }
  27. initData() {
  28. const { id } = this.params;
  29. let handler;
  30. if (id) {
  31. handler = Course.getAsk({ id });
  32. } else {
  33. handler = Promise.resolve({ others: [] });
  34. }
  35. handler
  36. .then(result => {
  37. result.ignoreStatus = result.answerStatus === 2;
  38. const { getFieldDecorator, setFieldsValue } = this.props.form;
  39. getFieldDecorator('id');
  40. getFieldDecorator('answer');
  41. getFieldDecorator('showStatus');
  42. getFieldDecorator('content');
  43. setFieldsValue({ id: result.id, content: result.content, answer: result.answer });
  44. this.setState({ data: result });
  45. });
  46. }
  47. orderQuestion(oldIndex, newIndex) {
  48. const { data } = this.state;
  49. const { others = [] } = data;
  50. const tmp = others.splice(oldIndex, 1);
  51. if (newIndex === others.length) {
  52. others.push(tmp[0]);
  53. } else {
  54. others.splice(newIndex, 0, tmp[0]);
  55. }
  56. this.setState({ others });
  57. }
  58. addOrder() {
  59. const { data } = this.state;
  60. const { others } = data;
  61. others.push(data);
  62. this.setState({ data });
  63. }
  64. removeOrder() {
  65. const { data } = this.state;
  66. const { others } = data;
  67. data.others = others.filter(row => row.id !== data.id);
  68. this.setState({ data });
  69. }
  70. submit() {
  71. const { form } = this.props;
  72. form.validateFields((err) => {
  73. if (!err) {
  74. const data = form.getFieldsValue();
  75. data.showStatus = data.showStatus ? 1 : 0;
  76. data.other = this.state.data.others.map(row => row.id);
  77. Course.editAsk(data).then(() => {
  78. asyncSMessage('保存成功');
  79. }).catch((e) => {
  80. if (e.result) form.setFields(formatFormError(data, e.result));
  81. });
  82. }
  83. });
  84. }
  85. ignore() {
  86. const { data } = this.state;
  87. Course.editAsk({ id: data.id, ignoreStatus: 1 }).then(() => {
  88. asyncSMessage('操作成功');
  89. goBack();
  90. });
  91. }
  92. renderBase() {
  93. const { data } = this.state;
  94. const { course = {} } = data;
  95. return <Block>
  96. <h1>提问信息</h1>
  97. <Form>
  98. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='学科'>
  99. {this.exerciseMap[course.structId]}
  100. </Form.Item>
  101. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='课程'>
  102. <a href='' target='_blank'>{course.title}</a>
  103. </Form.Item>
  104. </Form>
  105. </Block>;
  106. }
  107. renderAsk() {
  108. const { getFieldDecorator, getFieldValue } = this.props.form;
  109. const { data, editContent } = this.state;
  110. const { user = {}, createTime, courseNo, position, originContent, content } = data;
  111. return <Block>
  112. <h1>提问信息</h1>
  113. <Form>
  114. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='用户姓名'>
  115. {user.nickname}
  116. </Form.Item>
  117. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='提问时间'>
  118. {formatDate(createTime, 'YYYY-MM-DD HH:mm:ss')}
  119. </Form.Item>
  120. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='提问位置'>
  121. {`P${courseNo.no}:${position}-${position + 5}min`}
  122. </Form.Item>
  123. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='提问内容'>
  124. {originContent}
  125. </Form.Item>
  126. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='提问详情'>
  127. {!editContent && content}
  128. {getFieldDecorator('content', {
  129. })(
  130. editContent ? <Input.TextArea placeholder='输入内容' /> : <input hidden />,
  131. )}
  132. <Switch checked={editContent} checkedChildren='编辑模式' unCheckedChildren='关闭' onChange={(value) => {
  133. data.content = getFieldValue('content');
  134. this.setState({ editContent: value, data });
  135. }} />
  136. </Form.Item>
  137. </Form>
  138. </Block>;
  139. }
  140. renderQuestionList() {
  141. return <Block>
  142. <h1>该时段的展示中问题</h1>
  143. <DragList
  144. loading={this.props.core.loading}
  145. dataSource={this.state.data.others || []}
  146. handle={'.icon'}
  147. onMove={(oldIndex, newIndex) => {
  148. this.orderQuestion(oldIndex, newIndex);
  149. }}
  150. renderItem={(item) => (
  151. <List.Item actions={[<Icon type='bars' className='icon' />, <Typography.Text copyable={{ text: `${PcUrl}/course/answer/${item.courseId}?courseNoId=${item.courseNoId}&askId=${item.id}` }} />]}>
  152. <Row style={{ width: '100%' }}>
  153. <Col span={11}>问题:<span dangerouslySetInnerHTML={{ __html: item.content }} /></Col>
  154. <Col span={11} offset={1}>答复:<span dangerouslySetInnerHTML={{ __html: item.answer }} /></Col>
  155. </Row>
  156. </List.Item>
  157. )}
  158. /></Block>;
  159. }
  160. renderAnswer() {
  161. const { getFieldDecorator } = this.props.form;
  162. return <Block>
  163. <Form>
  164. {getFieldDecorator('id')(<input hidden />)}
  165. <Form.Item label='教师回复'>
  166. {getFieldDecorator('answer', {
  167. })(
  168. <Input.TextArea placeholder='输入内容' />,
  169. )}
  170. </Form.Item>
  171. <Row type="flex" justify="center">
  172. <Col span={12}>
  173. <Form.Item labelCol={{ span: 12 }} wrapperCol={{ span: 10 }} label='显示状态'>
  174. {getFieldDecorator('showStatus', {
  175. valuePropName: 'checked',
  176. })(
  177. <Switch onChange={(value) => {
  178. if (value) {
  179. this.addOrder();
  180. } else {
  181. this.removeOrder();
  182. }
  183. }} checkedChildren='on' unCheckedChildren='off' />,
  184. )}
  185. </Form.Item>
  186. </Col>
  187. </Row>
  188. </Form>
  189. </Block>;
  190. }
  191. renderView() {
  192. return <div flex>
  193. {this.renderBase()}
  194. {this.renderAsk()}
  195. {this.renderQuestionList()}
  196. {this.renderAnswer()}
  197. <Row type="flex" justify="center">
  198. <Col>
  199. <Button type="drange" onClick={() => {
  200. this.ignore();
  201. }}>忽略问题</Button>
  202. </Col>
  203. <Col>
  204. <Button type="primary" onClick={() => {
  205. this.submit();
  206. }}>保存</Button>
  207. </Col>
  208. </Row>
  209. </div>;
  210. }
  211. }