page.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import React from 'react';
  2. import { Form, Input, Button, Row, Col, InputNumber, Switch } 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 Select from '@src/components/Select';
  8. // import FileUpload from '@src/components/FileUpload';
  9. import { formatFormError, getMap } from '@src/services/Tools';
  10. import { asyncSMessage } from '@src/services/AsyncTools';
  11. import { Sentence } from '../../../stores/sentence';
  12. import config from './index';
  13. export default class extends Page {
  14. constructor(props) {
  15. super(props);
  16. this.structMap = {};
  17. this.partList = [];
  18. const { id } = this.params;
  19. if (id) {
  20. config.title = '编辑长难句文章';
  21. } else {
  22. config.title = '添加长难句文章';
  23. }
  24. }
  25. init() {
  26. Sentence.getStruct().then(result => {
  27. return this.refreshStruct(result);
  28. });
  29. }
  30. refreshStruct(result) {
  31. result = result || {};
  32. result.chapters = result.chapters || [];
  33. const chapters = result.chapters.map((row, index) => { row.value = index + 1; return row; }).filter(row => !row.exercise);
  34. this.structMap = getMap(chapters, 'value');
  35. this.setState({ struct: result, chapters });
  36. }
  37. refreshPart(chapter) {
  38. const { form } = this.props;
  39. const { id } = this.params;
  40. Sentence.listArticle({ chapter }).then(result => {
  41. this.partList = result.list.map(row => row.part);
  42. if (id) {
  43. this.partList = this.partList.filter(row => row !== this.data.part);
  44. }
  45. form.validateFields(['part'], { force: true });
  46. });
  47. }
  48. initData() {
  49. const { id } = this.params;
  50. const { form } = this.props;
  51. let handler;
  52. if (id) {
  53. handler = Sentence.getArticle({ id }).then((result) => {
  54. this.refreshPart(result.chapter);
  55. return result;
  56. });
  57. } else {
  58. handler = Promise.resolve({ part: 1 });
  59. }
  60. handler
  61. .then(result => {
  62. this.data = result;
  63. form.setFieldsValue(result);
  64. });
  65. }
  66. submit() {
  67. const { form } = this.props;
  68. form.validateFields((err) => {
  69. if (!err) {
  70. const data = form.getFieldsValue();
  71. data.isTrail = data.isTrail ? 1 : 0;
  72. let handler;
  73. if (data.id) {
  74. handler = Sentence.editArticle(data);
  75. } else {
  76. handler = Sentence.addArticle(data);
  77. }
  78. handler.then(() => {
  79. asyncSMessage('保存成功');
  80. goBack();
  81. }).catch((e) => {
  82. if (e.result) form.setFields(formatFormError(data, e.result));
  83. });
  84. }
  85. });
  86. }
  87. renderBase() {
  88. const { getFieldDecorator } = this.props.form;
  89. return <Block>
  90. <Form>
  91. {getFieldDecorator('id')(<input hidden />)}
  92. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='Chapter'>
  93. {getFieldDecorator('chapter', {
  94. rules: [
  95. { required: true, message: '请选择章节' },
  96. ],
  97. })(
  98. <Select select={this.state.chapters} placeholder='请选择章节' onChange={(v) => {
  99. this.refreshPart(v);
  100. }} />,
  101. )}
  102. </Form.Item>
  103. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='Part'>
  104. {getFieldDecorator('part', {
  105. rules: [
  106. { required: true, message: '请输入Part' },
  107. {
  108. validator: (rule, value, callback) => {
  109. if (this.partList.indexOf(value) >= 0) callback('该part已被使用');
  110. else callback();
  111. },
  112. },
  113. ],
  114. })(
  115. <InputNumber min={1} precision={0} formatter={(v) => parseInt(v, 10) || 1} />,
  116. )}
  117. </Form.Item>
  118. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='名称'>
  119. {getFieldDecorator('title', {
  120. rules: [
  121. { required: true, message: '请输入名称' },
  122. ],
  123. })(
  124. <Input placeholder='请输入名称' />,
  125. )}
  126. </Form.Item>
  127. <Form.Item labelCol={{ span: 5 }} wrapperCol={{ span: 16 }} label='开放试用'>
  128. {getFieldDecorator('isTrail', {
  129. valuePropName: 'checked',
  130. })(
  131. <Switch checkedChildren='on' unCheckedChildren='off' />,
  132. )}
  133. </Form.Item>
  134. </Form>
  135. </Block>;
  136. }
  137. renderContent() {
  138. const { getFieldDecorator } = this.props.form;
  139. return <Block flex>
  140. <Form>
  141. <Form.Item label='文章录入'>
  142. {getFieldDecorator('content', {
  143. })(
  144. <Editor placeholder='输入内容' />,
  145. )}
  146. </Form.Item>
  147. </Form>
  148. </Block>;
  149. }
  150. renderView() {
  151. return <div flex>
  152. {this.renderBase()}
  153. {this.renderContent()}
  154. <Row type="flex" justify="center">
  155. <Col>
  156. <Button type="primary" onClick={() => {
  157. this.submit();
  158. }}>保存</Button>
  159. </Col>
  160. </Row>
  161. </div>;
  162. }
  163. }