Workplace.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. import React, { PureComponent } from 'react';
  2. import moment from 'moment';
  3. import { connect } from 'dva';
  4. import { Link } from 'dva/router';
  5. import { Row, Col, Card, List, Avatar, Icon } from 'antd';
  6. import PageHeaderLayout from '../../layouts/PageHeaderLayout';
  7. import EditableLinkGroup from '../../components/EditableLinkGroup';
  8. import { Radar } from '../../components/Charts';
  9. import styles from './Workplace.less';
  10. const links = [
  11. {
  12. title: '操作一',
  13. href: '',
  14. },
  15. {
  16. title: '操作二',
  17. href: '',
  18. },
  19. {
  20. title: '操作三',
  21. href: '',
  22. },
  23. {
  24. title: '操作四',
  25. href: '',
  26. },
  27. {
  28. title: '操作五',
  29. href: '',
  30. },
  31. {
  32. title: '操作六',
  33. href: '',
  34. },
  35. ];
  36. const members = [
  37. {
  38. id: 'members-1',
  39. title: '凤蝶精英小分队',
  40. logo: 'https://gw.alipayobjects.com/zos/rmsportal/CRxBvUggxBYzWBTGmkxF.png',
  41. link: '',
  42. },
  43. {
  44. id: 'members-2',
  45. title: 'Ant Design',
  46. logo: 'https://gw.alipayobjects.com/zos/rmsportal/RBytOnluTcyeyDazAbvs.png',
  47. link: '',
  48. },
  49. {
  50. id: 'members-3',
  51. title: 'DesignLab',
  52. logo: 'https://gw.alipayobjects.com/zos/rmsportal/HQVJYAXtWHEJvLxQjmPa.png',
  53. link: '',
  54. },
  55. {
  56. id: 'members-4',
  57. title: 'Basement',
  58. logo: 'https://gw.alipayobjects.com/zos/rmsportal/HQVJYAXtWHEJvLxQjmPa.png',
  59. link: '',
  60. },
  61. {
  62. id: 'members-5',
  63. title: 'Github',
  64. logo: 'https://gw.alipayobjects.com/zos/rmsportal/RBytOnluTcyeyDazAbvs.png',
  65. link: '',
  66. },
  67. ];
  68. @connect(state => ({
  69. project: state.project,
  70. activities: state.activities,
  71. chart: state.chart,
  72. }))
  73. export default class Workplace extends PureComponent {
  74. componentDidMount() {
  75. const { dispatch } = this.props;
  76. dispatch({
  77. type: 'project/fetchNotice',
  78. });
  79. dispatch({
  80. type: 'activities/fetchList',
  81. });
  82. dispatch({
  83. type: 'chart/fetch',
  84. });
  85. }
  86. componentWillUnmount() {
  87. const { dispatch } = this.props;
  88. dispatch({
  89. type: 'chart/clear',
  90. });
  91. }
  92. render() {
  93. const {
  94. project: { loading: projectLoading, notice },
  95. activities: { loading: activitiesLoading, list: activitiesList },
  96. chart: { radarData },
  97. } = this.props;
  98. const pageHeaderContent = (
  99. <div className={styles.pageHeaderContent}>
  100. <div className={styles.avatar}>
  101. <Avatar size="large" src="https://gw.alipayobjects.com/zos/rmsportal/XertDCubOxUvZbCdgWTW.png" />
  102. </div>
  103. <div className={styles.content}>
  104. <p className={styles.contentTitle}>早安, 曲丽丽, 祝你开心每一天</p>
  105. <p>交互专家 | 蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED</p>
  106. </div>
  107. </div>
  108. );
  109. const pageHeaderExtra = (
  110. <div className={styles.pageHeaderExtra}>
  111. <div>
  112. <p><Icon type="appstore-o" /> 项目数</p>
  113. <p>56</p>
  114. <em />
  115. </div>
  116. <div>
  117. <p><Icon type="trophy" /> 团队内排名</p>
  118. <p>8<span> / 24</span></p>
  119. <em />
  120. </div>
  121. <div>
  122. <p><Icon type="eye-o" /> 项目访问</p>
  123. <p>2,223</p>
  124. </div>
  125. </div>
  126. );
  127. return (
  128. <PageHeaderLayout
  129. content={pageHeaderContent}
  130. extraContent={pageHeaderExtra}
  131. >
  132. <Row gutter={24}>
  133. <Col xl={16} lg={24} md={24} sm={24} xs={24}>
  134. <Card
  135. className={styles.projectList}
  136. style={{ marginBottom: 24 }}
  137. title="进行中的项目"
  138. bordered={false}
  139. extra={<Link to="/">全部项目</Link>}
  140. loading={projectLoading}
  141. bodyStyle={{ padding: 0 }}
  142. >
  143. {
  144. notice.map(item => (
  145. <Card.Grid className={styles.projectGrid} key={item.id}>
  146. <Card bodyStyle={{ padding: 0 }} bordered={false}>
  147. <Card.Meta
  148. title={(
  149. <span className={styles.cardTitle}>
  150. <Avatar size="small" src={item.logo} />
  151. <Link to={item.href}>{item.title}</Link>
  152. </span>
  153. )}
  154. description={item.description}
  155. />
  156. <div className={styles.projectItemContent}>
  157. <Link to={item.memberLink}>{item.member || ''}</Link>
  158. {
  159. item.updatedAt && <span>{moment(item.updatedAt).fromNow()}</span>
  160. }
  161. </div>
  162. </Card>
  163. </Card.Grid>
  164. ))
  165. }
  166. </Card>
  167. <Card
  168. bodyStyle={{ padding: 0 }}
  169. bordered={false}
  170. className={styles.activeCard}
  171. title="动态"
  172. loading={activitiesLoading}
  173. >
  174. <List loading={activitiesLoading}>
  175. <div className={styles.activitiesList}>
  176. {
  177. activitiesList.map(item => (
  178. <List.Item key={item.id}>
  179. <List.Item.Meta
  180. avatar={<Avatar style={{ marginTop: -12 }} src={item.user.avatar} />}
  181. title={
  182. <p>
  183. <a>{item.user.name}</a> 在 <a>xx</a> 新建了项目 <a>xxxx</a>
  184. </p>
  185. }
  186. description={moment(item.updatedAt).fromNow()}
  187. />
  188. </List.Item>
  189. ))
  190. }
  191. </div>
  192. </List>
  193. </Card>
  194. </Col>
  195. <Col xl={8} lg={24} md={24} sm={24} xs={24}>
  196. <Card
  197. style={{ marginBottom: 24 }}
  198. title="快速开始 / 便捷导航"
  199. bordered={false}
  200. bodyStyle={{ padding: 0 }}
  201. >
  202. <EditableLinkGroup
  203. onAdd={() => {}}
  204. links={links}
  205. />
  206. </Card>
  207. <Card
  208. style={{ marginBottom: 24 }}
  209. bordered={false}
  210. title="xx 指数"
  211. loading={radarData.length === 0}
  212. >
  213. <div className={styles.chart}>
  214. {
  215. <Radar
  216. hasLegend
  217. height={286}
  218. data={radarData}
  219. />
  220. }
  221. </div>
  222. </Card>
  223. <Card
  224. bodyStyle={{ paddingBottom: 0 }}
  225. bordered={false}
  226. title="团队"
  227. >
  228. <div className={styles.members}>
  229. <Row gutter={48}>
  230. {
  231. members.map(item => (
  232. <Col span={12} key={`members-item-${item.id}`}>
  233. <Link to={item.link}>
  234. <img src={item.logo} alt={item.title} />
  235. <span>{item.title}</span>
  236. </Link>
  237. </Col>
  238. ))
  239. }
  240. </Row>
  241. </div>
  242. </Card>
  243. </Col>
  244. </Row>
  245. </PageHeaderLayout>
  246. );
  247. }
  248. }