page.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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' },
  26. {
  27. title: '发送时间',
  28. key: 'date',
  29. render: (text) => {
  30. return <div className="sub">
  31. <div className="t-2 t-s-12">{text.split(' ')[0]}</div>
  32. <div className="t-6 t-s-12">{text.split(' ')[1]}</div>
  33. </div>;
  34. },
  35. }];
  36. export default class extends Page {
  37. constructor(props) {
  38. props.size = 15;
  39. super(props);
  40. }
  41. initState() {
  42. return {
  43. tab: '',
  44. filterMap: {},
  45. };
  46. }
  47. initData() {
  48. const data = Object.assign(this.state, this.state.search);
  49. if (data.order) {
  50. data.sortMap = { [data.order]: data.direction };
  51. }
  52. data.filterMap = this.state.search;
  53. data.messageTypeSelect = MessageType.map(row => {
  54. row.title = row.label;
  55. row.key = row.value;
  56. return row;
  57. });
  58. data.messageTypeSelect.unshift({
  59. title: '消息类型',
  60. key: '',
  61. });
  62. this.setState(data);
  63. My.message(Object.assign({ read: data.tab === 'unread' ? 0 : null }, this.state.search)).then(result => {
  64. result.list = result.list.map(row => {
  65. row.type = MessageTypeMap[row.type];
  66. row.date = formatDate(row.createTime, 'YYYY-MM-DDHH:mm:ss');
  67. return row;
  68. });
  69. result.page = data.page;
  70. this.setState(result);
  71. });
  72. }
  73. onFilter(value) {
  74. this.search(value);
  75. }
  76. onTabChange(tab) {
  77. const data = { tab };
  78. this.refreshQuery(data);
  79. }
  80. onChangePage(page) {
  81. this.search({ page });
  82. }
  83. readAllMessage() {
  84. My.readAllMessage().then(() => {
  85. asyncSMessage('操作成功');
  86. });
  87. }
  88. renderView() {
  89. const { config } = this.props;
  90. return <UserLayout active={config.key} menu={menu} center={this.renderTable()} />;
  91. }
  92. renderTable() {
  93. const { tab, list, messageTypeSelect, filterMap, page, total } = this.state;
  94. return (
  95. <div className="table-layout">
  96. <UserAction
  97. left={
  98. <Tabs
  99. type="tag"
  100. theme="white"
  101. size="small"
  102. space={5}
  103. width={54}
  104. active={tab}
  105. tabs={[{ key: '', title: '全部' }, { key: 'unread', title: '未读' }]}
  106. onChange={key => this.onTabChange(key)}
  107. />
  108. }
  109. right={<span style={{ cursor: 'pointer' }} onClick={() => {
  110. this.readAllMessage();
  111. }}>全部已读</span>}
  112. selectList={[
  113. {
  114. select: messageTypeSelect,
  115. key: 'messageType',
  116. },
  117. ]}
  118. filterMap={filterMap}
  119. onFilter={value => this.onFilter(value)}
  120. />
  121. <UserTable
  122. size="small"
  123. columns={columns}
  124. data={list}
  125. current={page}
  126. total={total}
  127. pageSize={this.state.search.size}
  128. onChange={(value) => {
  129. this.onChangePage(value);
  130. }}
  131. />
  132. </div>
  133. );
  134. }
  135. }