page.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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 } from '@src/services/Tools';
  10. import { asyncSMessage } from '@src/services/AsyncTools';
  11. // import { AskTarget } from '../../../../Constant';
  12. // import { User } from '../../../stores/user';
  13. import { Course } from '../../../stores/course';
  14. export default class extends Page {
  15. init() {
  16. // Exercise.allStruct().then(result => {
  17. // result = result.filter(row => row.level === 2).map(row => { row.title = `${row.titleZh}/${row.titleEn}`; row.value = row.id; return row; });
  18. // this.setState({ exercise: result });
  19. // });
  20. }
  21. initData() {
  22. const { id } = this.params;
  23. let handler;
  24. if (id) {
  25. handler = Course.getAsk({ id });
  26. } else {
  27. handler = Promise.resolve({ others: [{ content: 123123123, answer: 123123 }, {}] });
  28. }
  29. handler
  30. .then(result => {
  31. const { getFieldDecorator, setFieldsValue } = this.props.form;
  32. getFieldDecorator('id');
  33. getFieldDecorator('answer');
  34. getFieldDecorator('showStatus');
  35. setFieldsValue({ id: result.id, answer: result.answer, showStatus: result.showStatus });
  36. this.setState({ data: result });
  37. });
  38. }
  39. orderQuestion(oldIndex, newIndex) {
  40. const { data } = this.state;
  41. const { others = [] } = data;
  42. const tmp = others[oldIndex];
  43. others[oldIndex] = others[newIndex];
  44. others[newIndex] = tmp;
  45. this.setState({ others });
  46. }
  47. addOrder() {
  48. const { data } = this.state;
  49. const { others } = data;
  50. others.push(data);
  51. this.setState({ data });
  52. }
  53. removeOrder() {
  54. const { data } = this.state;
  55. const { others } = data;
  56. data.others = others.filter(row => row.id !== data.id);
  57. this.setState({ data });
  58. }
  59. submit() {
  60. const { form } = this.props;
  61. form.validateFields((err) => {
  62. if (!err) {
  63. const data = form.getFieldsValue();
  64. data.other = this.state.data.others.map(row => row.id);
  65. Course.editAsk(data).then(() => {
  66. asyncSMessage('保存成功');
  67. }).catch((e) => {
  68. if (e.result) form.setFields(formatFormError(data, e.result));
  69. });
  70. }
  71. });
  72. }
  73. renderBase() {
  74. const { data } = this.state;
  75. const { course = {} } = data;
  76. return <Block>
  77. <h1>提问信息</h1>
  78. <Form>
  79. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='学科'>
  80. {/* {QuestionTypeMap[question.type]} */}
  81. </Form.Item>
  82. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='课程'>
  83. <a href='' target='_blank'>{course.title}</a>
  84. </Form.Item>
  85. </Form>
  86. </Block>;
  87. }
  88. renderAsk() {
  89. const { data } = this.state;
  90. const { user = {}, createTime, courseNo, position, originContent, content } = data;
  91. return <Block>
  92. <h1>提问信息</h1>
  93. <Form>
  94. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='用户姓名'>
  95. {user.realName}
  96. </Form.Item>
  97. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='提问时间'>
  98. {formatDate(createTime)}
  99. </Form.Item>
  100. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='提问位置'>
  101. {`P${courseNo.no}:${position}`}
  102. </Form.Item>
  103. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='提问内容'>
  104. {originContent}
  105. </Form.Item>
  106. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='提问详情'>
  107. {content}
  108. </Form.Item>
  109. </Form>
  110. </Block>;
  111. }
  112. renderQuestionList() {
  113. return <Block>
  114. <h1>该时段的展示中问题</h1>
  115. <DragList
  116. loading={this.props.core.loading}
  117. dataSource={this.state.data.others || []}
  118. handle={'.icon'}
  119. onMove={(oldIndex, newIndex) => {
  120. this.orderQuestion(oldIndex, newIndex);
  121. }}
  122. renderItem={(item) => (
  123. <List.Item actions={[<Icon type='bars' className='icon' />, <Typography.Text copyable={{ text: 'url' }} />]}>
  124. <Row style={{ width: '100%' }}>
  125. <Col span={11}>问题:{item.content}</Col>
  126. <Col span={11} offset={1}>答复:{item.answer}</Col>
  127. </Row>
  128. </List.Item>
  129. )}
  130. /></Block>;
  131. }
  132. renderAnswer() {
  133. const { getFieldDecorator } = this.props.form;
  134. return <Block>
  135. <Form>
  136. {getFieldDecorator('id')(<input hidden />)}
  137. <Form.Item label='教师回复'>
  138. {getFieldDecorator('answer', {
  139. })(
  140. <Input.TextArea placeholder='输入内容' />,
  141. )}
  142. </Form.Item>
  143. <Row type="flex" justify="center">
  144. <Col span={12}>
  145. <Form.Item labelCol={{ span: 12 }} wrapperCol={{ span: 10 }} label='显示状态'>
  146. {getFieldDecorator('showStatus', {
  147. valuePropName: 'checked',
  148. })(
  149. <Switch onChange={(value) => {
  150. if (value) {
  151. this.addOrder();
  152. } else {
  153. this.removeOrder();
  154. }
  155. }} checkedChildren='on' unCheckedChildren='off' />,
  156. )}
  157. </Form.Item>
  158. </Col>
  159. </Row>
  160. </Form>
  161. </Block>;
  162. }
  163. renderView() {
  164. return <div flex>
  165. {this.renderBase()}
  166. {this.renderAsk()}
  167. {this.renderQuestionList()}
  168. {this.renderAnswer()}
  169. <Row type="flex" justify="center">
  170. <Col>
  171. <Button type="primary" onClick={() => {
  172. this.submit();
  173. }}>保存</Button>
  174. </Col>
  175. </Row>
  176. </div>;
  177. }
  178. }