page.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import React, { Component } from 'react';
  2. import './index.less';
  3. import { Drawer, Picker } from 'antd-mobile';
  4. import Page from '@src/containers/Page';
  5. import Assets from '@src/components/Assets';
  6. import { List } from 'antd';
  7. import Switch from '../../../components/Switch';
  8. import Icon from '../../../components/Icon';
  9. import { SpecialRadioGroup } from '../../../components/Radio';
  10. import Button from '../../../components/Button';
  11. import { TextbookQuality } from '../../../../Constant';
  12. import { Textbook } from '../../../stores/textbook';
  13. class Detail extends Component {
  14. constructor(props) {
  15. super(props);
  16. this.state = { show: false };
  17. }
  18. render() {
  19. const { show, data = {} } = this.state;
  20. return (
  21. <div className="detail">
  22. <div className="detail-title">{data.no || 0}.{data.keyword}</div>
  23. <div className="detail-desc" dangerouslySetInnerHTML={{ __html: data.detail }} />
  24. <div className="detail-switch">
  25. 显示答案
  26. <Switch size="small" checked={show} onClick={() => this.setState({ show: !show })} />
  27. </div>
  28. <div hidden={!show} className="detail-result" dangerouslySetInnerHTML={{ __html: data.content }} />
  29. </div>
  30. );
  31. }
  32. }
  33. export default class extends Page {
  34. initState() {
  35. return { pageData: [{ label: 1, value: 1 }] };
  36. }
  37. init() {
  38. const { search } = this.state;
  39. search.isOld = false;
  40. search.qualitys = [];
  41. search.order = '';
  42. this.setState({ search });
  43. }
  44. initData() {
  45. this.setState({ filter: false });
  46. Textbook.listTopic(Object.assign({ latest: true }, this.state.search))
  47. .then(result => {
  48. this.setTableData(result.list, result.total);
  49. const pageData = [];
  50. let i = 0;
  51. let page = 1;
  52. while (i < result.total) {
  53. pageData.push({ label: page, value: page });
  54. i += this.state.search.size;
  55. page += 1;
  56. }
  57. this.setState({ pageData });
  58. });
  59. }
  60. prev() {
  61. const { search } = this.state;
  62. if (search.page > 1) {
  63. search.page -= 1;
  64. } else {
  65. return;
  66. }
  67. this.setState({ search });
  68. this.refresh();
  69. }
  70. next() {
  71. const { search, page } = this.state;
  72. if (search.page < Math.ceil(page.total / page.pageSize)) {
  73. search.page += 1;
  74. } else {
  75. return;
  76. }
  77. this.setState({ search });
  78. this.refresh();
  79. }
  80. changeQuality(value) {
  81. const { search = {} } = this.state;
  82. const { qualitys = [] } = search;
  83. const index = qualitys.indexOf(value);
  84. if (index >= 0) {
  85. qualitys.splice(index, 1);
  86. } else {
  87. qualitys.push(value);
  88. }
  89. search.qualitys = qualitys;
  90. this.setState({ search });
  91. }
  92. changeOld() {
  93. const { search = {} } = this.state;
  94. search.isOld = !search.isOld;
  95. this.setState({ search });
  96. }
  97. changeDirection(direction) {
  98. const { search = {} } = this.state;
  99. search.direction = direction;
  100. this.setState({ search });
  101. }
  102. changePage(page) {
  103. const { search = {} } = this.state;
  104. if (search.page === page) return;
  105. search.page = page;
  106. this.refresh();
  107. }
  108. renderView() {
  109. const { filter, search, pageData } = this.state;
  110. return (
  111. <Drawer
  112. style={{ minHeight: document.documentElement.clientHeight }}
  113. position="right"
  114. open={filter}
  115. sidebar={this.renderFilter()}
  116. onOpenChange={isOpen => this.setState({ filter: isOpen })}
  117. >
  118. <div className="title">【逻辑】0515 起逻辑机经整理</div>
  119. <div className="detail-list">
  120. <Detail />
  121. <Detail />
  122. </div>
  123. <div className="fixed">
  124. <div className="prev" onClick={() => {
  125. this.prev();
  126. }}>
  127. <Icon type="left" />
  128. Previous
  129. </div>
  130. <div className="next" onClick={() => {
  131. this.next();
  132. }}>
  133. Next
  134. <Icon type="right" />
  135. </div>
  136. <div className="page">
  137. <Picker title="选择页数"
  138. cols={1}
  139. value={[this.state.search.page]}
  140. data={pageData}
  141. onChange={(i) => {
  142. this.changePage(i[0]);
  143. }}><List.Item><span>跳转至</span>第{search.page}页<Assets name="down_down3" /></List.Item>
  144. </Picker>
  145. </div>
  146. </div>
  147. <div hidden={filter} className="filter-switch">
  148. <Assets name="setting" onClick={() => this.setState({ filter: true })} />
  149. </div>
  150. </Drawer>
  151. );
  152. }
  153. renderFilter() {
  154. const { search } = this.state;
  155. return (
  156. <div className="filter">
  157. <div className="body">
  158. <div className="item">
  159. <div className="label">机经质量</div>
  160. <div className="value">
  161. <SpecialRadioGroup
  162. list={TextbookQuality}
  163. values={search.qualitys}
  164. onChange={(value) => {
  165. this.changeQuality(value);
  166. }}
  167. />
  168. </div>
  169. </div>
  170. <div className="item">
  171. <div className="label left">更新时间</div>
  172. <div className="value right">
  173. <Picker title="更新时间"
  174. cols={1}
  175. value={[this.state.search.direction]}
  176. data={[{ label: '由远到近', value: 'asc' }, { label: '由近到远', value: 'desc' }]}
  177. onChange={(i) => {
  178. this.changeDirection(i[0]);
  179. }}><List.Item extra={false}>{search.direction === 'asc' ? '由远到近' : '由近到远'} <Assets className="arrow" name="down_down3" /></List.Item>
  180. </Picker>
  181. </div>
  182. </div>
  183. <div className="item">
  184. <div className="label left">看考古</div>
  185. <div className="value right">
  186. <Switch checked={search.isOld} onClick={() => {
  187. this.changeOld();
  188. }} />
  189. </div>
  190. </div>
  191. </div>
  192. <div className="footer">
  193. <Button radius width={90} onClick={() => {
  194. this.refresh();
  195. }}>
  196. 确定
  197. </Button>
  198. </div>
  199. </div>
  200. );
  201. }
  202. }