page.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import React from 'react';
  2. import { Form, Input, Button, Row, Col, DatePicker } from 'antd';
  3. import './index.less';
  4. import Page from '@src/containers/Page';
  5. import Block from '@src/components/Block';
  6. import Select from '@src/components/Select';
  7. // import FileUpload from '@src/components/FileUpload';
  8. import { formatFormError, generateSearch } from '@src/services/Tools';
  9. import { asyncSMessage } from '@src/services/AsyncTools';
  10. // import { PreviewMode } from '../../../../Constant';
  11. import QuestionNoList from '../../../components/QuestionNoList';
  12. import { Preview } from '../../../stores/preview';
  13. import { User } from '../../../stores/user';
  14. // import { Question } from '../../../stores/question';
  15. import { Exercise } from '../../../stores/exercise';
  16. import config from './index';
  17. export default class extends Page {
  18. constructor(props) {
  19. super(props);
  20. const { id } = this.params;
  21. if (id) {
  22. config.title = '编辑预习作业';
  23. } else {
  24. config.title = '添加预习作业';
  25. }
  26. }
  27. init() {
  28. Exercise.allStruct().then(result => {
  29. result = result.filter(row => row.level === 2).map(row => { row.title = `${row.titleZh}/${row.titleEn}`; row.value = row.id; return row; });
  30. this.setState({ exercise: result });
  31. });
  32. }
  33. initData() {
  34. const { id } = this.params;
  35. const { form } = this.props;
  36. let handler;
  37. if (id) {
  38. handler = Preview.get({ id });
  39. } else {
  40. handler = Promise.resolve({ questionNoIds: [] });
  41. }
  42. handler
  43. .then(result => {
  44. const { questionNoIds } = result;
  45. result.time = [result.startTime, result.endTime];
  46. form.setFieldsValue(result);
  47. generateSearch('userIds', { mode: 'multiple' }, this, (search) => {
  48. return User.list(search);
  49. }, (row) => {
  50. return {
  51. title: `${row.nickname}(${row.mobile})`,
  52. value: row.id,
  53. };
  54. }, result.userIds, null);
  55. this.setState({ questionNoIds });
  56. });
  57. }
  58. submit() {
  59. const { form } = this.props;
  60. form.validateFields((err) => {
  61. if (!err) {
  62. const data = form.getFieldsValue();
  63. [data.startTime, data.endTime] = data.time;
  64. let handler;
  65. data.questionNoIds = this.state.questionNos.map(row => row.id);
  66. if (!data.id) {
  67. handler = Preview.add(data);
  68. } else {
  69. handler = Preview.edit(data);
  70. }
  71. handler.then(() => {
  72. asyncSMessage('保存成功');
  73. }).catch((e) => {
  74. if (e.result) form.setFields(formatFormError(data, e.result));
  75. });
  76. }
  77. });
  78. }
  79. deleteQuestion(index) {
  80. const { questionNos } = this.state;
  81. questionNos.splice(index, 1);
  82. this.setState({ questionNos });
  83. this.props.form.setFieldsValue({ questionNos: questionNos.map(row => row.no) });
  84. }
  85. orderQuestion(oldIndex, newIndex) {
  86. const { questionNos } = this.state;
  87. const tmp = questionNos[oldIndex];
  88. questionNos[oldIndex] = questionNos[newIndex];
  89. questionNos[newIndex] = tmp;
  90. this.setState({ questionNos });
  91. this.props.form.setFieldsValue({ questionNos: questionNos.map(row => row.no) });
  92. }
  93. renderBase() {
  94. const { getFieldDecorator } = this.props.form;
  95. return <Block>
  96. <Form>
  97. {getFieldDecorator('id')(<input hidden />)}
  98. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='选择课程'>
  99. {getFieldDecorator('category', {
  100. rules: [
  101. { required: true, message: '请选择课程' },
  102. ],
  103. })(
  104. <Select select={this.state.exercise} placeholder='请选择课程' />,
  105. )}
  106. </Form.Item>
  107. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='起止时间'>
  108. {getFieldDecorator('time', {
  109. rules: [
  110. { required: true, message: '请输入起止时间' },
  111. ],
  112. })(
  113. <DatePicker.RangePicker />,
  114. )}
  115. </Form.Item>
  116. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='作业标题'>
  117. {getFieldDecorator('title', {
  118. rules: [
  119. { required: true, message: '请输入作业标题' },
  120. ],
  121. })(
  122. <Input placeholder='请输入作业标题' />,
  123. )}
  124. </Form.Item>
  125. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='指定做题人'>
  126. {getFieldDecorator('userIds', {
  127. rules: [
  128. { required: true, message: '请指定做题人' },
  129. ],
  130. })(
  131. <Select {...this.state.userIds} placeholder='请指定做题人' />,
  132. )}
  133. </Form.Item>
  134. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='选择作业题'>
  135. {getFieldDecorator('questionNos', {
  136. rules: [
  137. { required: true, message: '请选择作业题' },
  138. ],
  139. })(
  140. <Select mode='multiple' maxTagCount={200} notFoundContent={null} placeholder='输入题目id, 逗号分隔' tokenSeparators={[',', ',']} {...this.state.questionNos} onChange={(values) => {
  141. // todo 查找
  142. this.setState({ questionNos: values });
  143. }} />,
  144. )}
  145. </Form.Item>
  146. </Form>
  147. </Block>;
  148. }
  149. renderQuestionList() {
  150. const { getFieldDecorator, setFieldsValue } = this.props.form;
  151. return <Block>
  152. <h1>题目预览</h1>
  153. <QuestionNoList loading={false} questionNos={this.state.questionNos} onChange={(nos) => {
  154. getFieldDecorator('questionNos');
  155. setFieldsValue({ questionNos: nos.map(row => row.id) });
  156. }} />
  157. </Block>;
  158. }
  159. renderView() {
  160. return <div flex>
  161. {this.renderBase()}
  162. {this.renderQuestionList()}
  163. <Row type="flex" justify="center">
  164. <Col>
  165. <Button type="primary" onClick={() => {
  166. this.submit();
  167. }}>保存</Button>
  168. </Col>
  169. </Row>
  170. </div>;
  171. }
  172. }