page.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. import React from 'react';
  2. import './index.less';
  3. import { Drawer, ListView } from 'antd-mobile';
  4. import Page from '@src/containers/Page';
  5. import Assets from '@src/components/Assets';
  6. import { formatTreeData } from '@src/services/Tools';
  7. import ListData from '@src/services/ListData';
  8. import { DataBlock } from '../../../components/Block';
  9. import { SpecialRadioGroup } from '../../../components/Radio';
  10. import Switch from '../../../components/Switch';
  11. import Button from '../../../components/Button';
  12. import Checkbox from '../../../components/CheckBox';
  13. import { Course } from '../../../stores/course';
  14. import { Main } from '../../../stores/main';
  15. import { DataType } from '../../../../Constant';
  16. export default class extends Page {
  17. initState() {
  18. return {
  19. listMap: {},
  20. };
  21. }
  22. init() {
  23. Main.dataStruct().then((list) => {
  24. const structTree = formatTreeData(list.map(row => {
  25. row.title = `${row.titleZh} ${row.titleEn}`;
  26. row.label = row.title;
  27. row.key = row.id;
  28. return row;
  29. }), 'id', 'title', 'parentId');
  30. this.setState({ structTree });
  31. });
  32. const { search } = this.state;
  33. if (!search.order) search.order = 'saleNumber';
  34. this.setState({ search });
  35. }
  36. initData() {
  37. return this.initListKeys(['data'])
  38. .then(() => {
  39. return this.getList('data', 1);
  40. });
  41. }
  42. initListKeys(keys) {
  43. const { listMap = {} } = this.state;
  44. keys.forEach((key) => {
  45. listMap[key] = new ListData();
  46. });
  47. this.setState({ listMap });
  48. return Promise.resolve();
  49. }
  50. getList(key, page) {
  51. Course.listData(Object.assign({ page }, this.state.search))
  52. .then((result) => {
  53. const { listMap = {} } = this.state;
  54. if (page === 1) { // todo 是否重新读取第一页为刷新所有数据
  55. listMap[key] = new ListData();
  56. }
  57. listMap[key].get(page, result, this.state.search.size);
  58. this.setState({ listMap });
  59. });
  60. }
  61. changeOrder(order, direction) {
  62. const { search = {} } = this.state;
  63. search.order = order;
  64. search.direction = direction;
  65. this.setState({ search });
  66. this.refresh();
  67. }
  68. changeNovice() {
  69. const { search = {} } = this.state;
  70. search.isNovice = !search.isNovice;
  71. this.setState({ search });
  72. }
  73. changeOriginal() {
  74. const { search = {} } = this.state;
  75. search.isOriginal = !search.isOriginal;
  76. this.setState({ search });
  77. }
  78. changeDataType(value) {
  79. const { search = {} } = this.state;
  80. search.dataType = value;
  81. this.setState({ search });
  82. }
  83. changeStruct(value) {
  84. const { search = {} } = this.state;
  85. search.structId = value;
  86. this.setState({ search });
  87. }
  88. renderView() {
  89. const { filter, search = {} } = this.state;
  90. return (<Drawer
  91. style={{ minHeight: document.documentElement.clientHeight }}
  92. position="right"
  93. open={filter}
  94. sidebar={this.renderFilter()}
  95. onOpenChange={isOpen => this.setState({ filter: isOpen })}
  96. >
  97. <div className="top">
  98. <div className={search.order === 'saleNumber' ? 'tab active' : 'tab'} onClick={() => {
  99. if (search.order !== 'saleNumber') this.changeOrder('saleNumber', 'desc');
  100. }}>销量</div>
  101. <div className={search.order === 'updateTime' ? 'tab active' : 'tab'} onClick={() => {
  102. if (search.order !== 'updateTime') this.changeOrder('updateTime', 'desc');
  103. }}>更新时间</div>
  104. <div className="right" onClick={() => this.setState({ filter: true })}>
  105. 筛选
  106. <Assets name="screen" />
  107. </div>
  108. </div>
  109. {this.renderList()}
  110. </Drawer>
  111. );
  112. }
  113. renderRow(rowData) {
  114. return <DataBlock data={rowData} />;
  115. }
  116. renderList() {
  117. const { listMap } = this.state;
  118. const { data = {} } = listMap;
  119. const { dataSource = {}, bottom, loading, finish, maxSectionId = 1, total } = data;
  120. if (total === 0) return this.renderEmpty();
  121. return <ListView
  122. className="list"
  123. ref={el => { this.lv = el; }}
  124. dataSource={dataSource}
  125. renderFooter={() => (<div style={{ padding: 30, textAlign: 'center' }}>
  126. {loading ? '加载中...' : (bottom ? '没有更多了' : '')}
  127. </div>)}
  128. renderRow={(rowData, sectionID, rowID) => this.renderRow(rowData, sectionID, rowID)}
  129. style={{
  130. height: this.state.height,
  131. overflow: 'auto',
  132. }}
  133. pageSize={this.state.search.size}
  134. scrollRenderAheadDistance={500}
  135. onEndReached={() => {
  136. if (loading) return;
  137. if (bottom) {
  138. if (!finish) {
  139. data.finish = true;
  140. // this.setState({ time: new Date() })
  141. }
  142. return;
  143. }
  144. this.getList('data', maxSectionId + 1);
  145. }}
  146. onEndReachedThreshold={10}
  147. />;
  148. }
  149. renderEmpty() {
  150. return <div />;
  151. }
  152. renderFilter() {
  153. const { search, structTree = [] } = this.state;
  154. return (
  155. <div className="filter">
  156. <div className="body">
  157. <div className="item">
  158. <div className="label left">适合新手</div>
  159. <div className="value right">
  160. <Switch checked={search.isNovice} onClick={() => {
  161. this.changeNovice();
  162. }} />
  163. </div>
  164. </div>
  165. <div className="item">
  166. <div className="label left">原创资料</div>
  167. <div className="value right">
  168. <Switch checked={search.isOriginal} onClick={() => {
  169. this.changeOriginal();
  170. }} />
  171. </div>
  172. </div>
  173. <div className="item">
  174. <div className="label left">资料形式</div>
  175. <div className="value right">
  176. <SpecialRadioGroup
  177. list={DataType}
  178. value={search.dataType}
  179. onChange={(value) => {
  180. this.changeDataType(value);
  181. }}
  182. />
  183. </div>
  184. </div>
  185. <div className="sub">
  186. <div className="title">筛选学科</div>
  187. {structTree.map((row) => {
  188. return <div className="item">
  189. <div className={row.children.length > 0 ? 'label' : 'label left'}>{row.title}</div>
  190. {row.children.length > 0 && <div className="value">
  191. <SpecialRadioGroup
  192. list={row.children}
  193. value={search.structId}
  194. onChange={(value) => {
  195. this.changeStruct(value);
  196. }}
  197. />
  198. </div>}
  199. {row.children.length === 0 && <div className="value right">
  200. <Checkbox checked={search.structId === row.id} onClick={() => {
  201. this.changeStruct(row.id);
  202. }} />
  203. </div>}
  204. </div>;
  205. })}
  206. </div>
  207. </div>
  208. <div className="footer">
  209. <Button radius width={90} onClick={() => {
  210. this.getList('data', 1);
  211. }}>
  212. 确定
  213. </Button>
  214. </div>
  215. </div>
  216. );
  217. }
  218. }