page.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import React from 'react';
  2. import './index.less';
  3. import Page from '@src/containers/Page';
  4. import { asyncSMessage } from '@src/services/AsyncTools';
  5. import UserLayout from '../../../layouts/User';
  6. import menu from '../index';
  7. import UserTable from '../../../components/UserTable';
  8. import UserAction from '../../../components/UserAction';
  9. import Tabs from '../../../components/Tabs';
  10. import { My } from '../../../stores/my';
  11. import { MessageType } from '../../../../Constant';
  12. import { getMap, formatDate } from '../../../../../src/services/Tools';
  13. const MessageTypeMap = getMap(MessageType, 'value', 'label');
  14. const columns = [
  15. {
  16. title: '消息',
  17. key: 'title',
  18. render: (text, row) => {
  19. return <div>
  20. {!row.isRead ? <span className='dot'>{text}</span> : text}
  21. {row.content && <div className=''>{row.content}{row.link && <a className='m-l-5' href={row.link} target="_blank">查看详情</a>}</div>}
  22. </div>;
  23. },
  24. },
  25. { title: '类型', key: 'type', width: 120 },
  26. {
  27. title: '发送时间',
  28. key: 'date',
  29. width: 180,
  30. render: (text) => {
  31. return <div className="sub">
  32. <div className="t-2 t-s-12">{text.split(' ')[0]}</div>
  33. <div className="t-6 t-s-12">{text.split(' ')[1]}</div>
  34. </div>;
  35. },
  36. }];
  37. export default class extends Page {
  38. constructor(props) {
  39. props.size = 15;
  40. super(props);
  41. }
  42. initState() {
  43. return {
  44. tab: '',
  45. filterMap: {},
  46. };
  47. }
  48. initData() {
  49. const data = Object.assign(this.state, this.state.search);
  50. if (data.order) {
  51. data.sortMap = { [data.order]: data.direction };
  52. }
  53. data.filterMap = this.state.search;
  54. data.messageTypeSelect = MessageType.map(row => {
  55. row.title = row.label;
  56. row.key = row.value;
  57. return row;
  58. });
  59. data.messageTypeSelect.unshift({
  60. title: '消息类型',
  61. key: '',
  62. });
  63. this.setState(data);
  64. My.message(Object.assign({ read: data.tab === 'unread' ? 0 : null }, this.state.search)).then(result => {
  65. result.list = result.list.map(row => {
  66. row.type = MessageTypeMap[row.type];
  67. row.date = formatDate(row.createTime, 'YYYY-MM-DD HH:mm:ss');
  68. return row;
  69. });
  70. result.page = data.page;
  71. this.setState(result);
  72. });
  73. }
  74. onFilter(value) {
  75. this.search(value);
  76. }
  77. onTabChange(tab) {
  78. const data = { tab };
  79. this.refreshQuery(data);
  80. }
  81. onChangePage(page) {
  82. this.search({ page });
  83. }
  84. readAllMessage() {
  85. My.readAllMessage().then(() => {
  86. asyncSMessage('操作成功');
  87. this.refresh();
  88. });
  89. }
  90. renderView() {
  91. const { config } = this.props;
  92. return <UserLayout active={config.key} menu={menu} center={this.renderTable()} />;
  93. }
  94. renderTable() {
  95. const { tab, list, messageTypeSelect, filterMap, page, total } = this.state;
  96. return (
  97. <div className="table-layout">
  98. <UserAction
  99. left={
  100. <Tabs
  101. type="tag"
  102. theme="white"
  103. size="small"
  104. space={5}
  105. width={54}
  106. active={tab}
  107. tabs={[{ key: '', title: '全部' }, { key: 'unread', title: '未读' }]}
  108. onChange={key => this.onTabChange(key)}
  109. />
  110. }
  111. right={<span style={{ cursor: 'pointer' }} onClick={() => {
  112. this.readAllMessage();
  113. }}>全部已读</span>}
  114. selectList={[
  115. {
  116. select: messageTypeSelect,
  117. key: 'messageType',
  118. },
  119. ]}
  120. filterMap={filterMap}
  121. onFilter={value => this.onFilter(value)}
  122. />
  123. <UserTable
  124. size="small"
  125. columns={columns}
  126. data={list}
  127. current={page}
  128. total={total}
  129. pageSize={this.state.search.size}
  130. onChange={(value) => {
  131. this.onChangePage(value);
  132. }}
  133. />
  134. </div>
  135. );
  136. }
  137. }