Workplace.js 7.48 KB
Newer Older
1 2 3 4
import React, { PureComponent } from 'react';
import moment from 'moment';
import { connect } from 'dva';
import { Link } from 'dva/router';
niko's avatar
niko committed
5
import { Row, Col, Card, List, Avatar } from 'antd';
6

niko's avatar
niko committed
7 8
import { Radar } from 'components/Charts';
import EditableLinkGroup from 'components/EditableLinkGroup';
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
import PageHeaderLayout from '../../layouts/PageHeaderLayout';

import styles from './Workplace.less';

const links = [
  {
    title: '操作一',
    href: '',
  },
  {
    title: '操作二',
    href: '',
  },
  {
    title: '操作三',
    href: '',
  },
  {
    title: '操作四',
    href: '',
  },
  {
    title: '操作五',
    href: '',
  },
  {
    title: '操作六',
    href: '',
  },
];

const members = [
  {
    id: 'members-1',
niko's avatar
niko committed
43
    title: '科学搬砖组',
afc163's avatar
afc163 committed
44
    logo: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
45 46 47 48
    link: '',
  },
  {
    id: 'members-2',
niko's avatar
niko committed
49
    title: '程序员日常',
afc163's avatar
afc163 committed
50
    logo: 'https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png',
51 52 53 54
    link: '',
  },
  {
    id: 'members-3',
niko's avatar
niko committed
55
    title: '设计天团',
afc163's avatar
afc163 committed
56
    logo: 'https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png',
57 58 59 60
    link: '',
  },
  {
    id: 'members-4',
niko's avatar
niko committed
61
    title: '中二少女团',
afc163's avatar
afc163 committed
62
    logo: 'https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png',
63 64 65 66
    link: '',
  },
  {
    id: 'members-5',
niko's avatar
niko committed
67
    title: '骗你学计算机',
afc163's avatar
afc163 committed
68
    logo: 'https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png',
69 70 71 72
    link: '',
  },
];

Andreas Cederström's avatar
Andreas Cederström committed
73 74 75 76 77 78
@connect(({ project, activities, chart, loading }) => ({
  project,
  activities,
  chart,
  projectLoading: loading.effects['project/fetchNotice'],
  activitiesLoading: loading.effects['activities/fetchList'],
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
}))
export default class Workplace extends PureComponent {
  componentDidMount() {
    const { dispatch } = this.props;
    dispatch({
      type: 'project/fetchNotice',
    });
    dispatch({
      type: 'activities/fetchList',
    });
    dispatch({
      type: 'chart/fetch',
    });
  }

  componentWillUnmount() {
    const { dispatch } = this.props;
    dispatch({
      type: 'chart/clear',
    });
  }

afc163's avatar
afc163 committed
101
  renderActivities() {
jim's avatar
jim committed
102 103 104
    const { activities: { list } } = this.props;
    return list.map(item => {
      const events = item.template.split(/@\{([^{}]*)\}/gi).map(key => {
afc163's avatar
afc163 committed
105
        if (item[key]) {
jim's avatar
jim committed
106 107 108 109 110
          return (
            <a href={item[key].link} key={item[key].name}>
              {item[key].name}
            </a>
          );
afc163's avatar
afc163 committed
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
        }
        return key;
      });
      return (
        <List.Item key={item.id}>
          <List.Item.Meta
            avatar={<Avatar src={item.user.avatar} />}
            title={
              <span>
                <a className={styles.username}>{item.user.name}</a>
                &nbsp;
                <span className={styles.event}>{events}</span>
              </span>
            }
            description={
              <span className={styles.datetime} title={item.updatedAt}>
                {moment(item.updatedAt).fromNow()}
              </span>
            }
          />
        </List.Item>
      );
    });
  }

136 137
  render() {
    const {
Andreas Cederström's avatar
Andreas Cederström committed
138 139 140
      project: { notice },
      projectLoading,
      activitiesLoading,
141 142 143
      chart: { radarData },
    } = this.props;

144 145 146
    const pageHeaderContent = (
      <div className={styles.pageHeaderContent}>
        <div className={styles.avatar}>
jim's avatar
jim committed
147 148 149 150
          <Avatar
            size="large"
            src="https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png"
          />
151
        </div>
152
        <div className={styles.content}>
afc163's avatar
afc163 committed
153 154
          <div className={styles.contentTitle}>早安曲丽丽祝你开心每一天</div>
          <div>交互专家 | 蚂蚁金服某某某事业群某某平台部某某技术部UED</div>
155 156 157 158
        </div>
      </div>
    );

afc163's avatar
afc163 committed
159 160 161
    const extraContent = (
      <div className={styles.extraContent}>
        <div className={styles.statItem}>
niko's avatar
niko committed
162
          <p>项目数</p>
163 164
          <p>56</p>
        </div>
afc163's avatar
afc163 committed
165
        <div className={styles.statItem}>
niko's avatar
niko committed
166
          <p>团队内排名</p>
jim's avatar
jim committed
167 168 169
          <p>
            8<span> / 24</span>
          </p>
170
        </div>
afc163's avatar
afc163 committed
171
        <div className={styles.statItem}>
niko's avatar
niko committed
172
          <p>项目访问</p>
173 174 175 176 177 178
          <p>2,223</p>
        </div>
      </div>
    );

    return (
jim's avatar
jim committed
179
      <PageHeaderLayout content={pageHeaderContent} extraContent={extraContent}>
180
        <Row gutter={24}>
181
          <Col xl={16} lg={24} md={24} sm={24} xs={24}>
182 183 184 185 186 187 188 189 190
            <Card
              className={styles.projectList}
              style={{ marginBottom: 24 }}
              title="进行中的项目"
              bordered={false}
              extra={<Link to="/">全部项目</Link>}
              loading={projectLoading}
              bodyStyle={{ padding: 0 }}
            >
jim's avatar
jim committed
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
              {notice.map(item => (
                <Card.Grid className={styles.projectGrid} key={item.id}>
                  <Card bodyStyle={{ padding: 0 }} bordered={false}>
                    <Card.Meta
                      title={
                        <div className={styles.cardTitle}>
                          <Avatar size="small" src={item.logo} />
                          <Link to={item.href}>{item.title}</Link>
                        </div>
                      }
                      description={item.description}
                    />
                    <div className={styles.projectItemContent}>
                      <Link to={item.memberLink}>{item.member || ''}</Link>
                      {item.updatedAt && (
                        <span className={styles.datetime} title={item.updatedAt}>
                          {moment(item.updatedAt).fromNow()}
                        </span>
                      )}
                    </div>
                  </Card>
                </Card.Grid>
              ))}
214 215 216 217
            </Card>
            <Card
              bodyStyle={{ padding: 0 }}
              bordered={false}
nikogu's avatar
nikogu committed
218
              className={styles.activeCard}
219 220 221
              title="动态"
              loading={activitiesLoading}
            >
niko's avatar
niko committed
222
              <List loading={activitiesLoading} size="large">
jim's avatar
jim committed
223
                <div className={styles.activitiesList}>{this.renderActivities()}</div>
224 225 226
              </List>
            </Card>
          </Col>
227
          <Col xl={8} lg={24} md={24} sm={24} xs={24}>
228 229 230 231 232 233
            <Card
              style={{ marginBottom: 24 }}
              title="快速开始 / 便捷导航"
              bordered={false}
              bodyStyle={{ padding: 0 }}
            >
jim's avatar
jim committed
234
              <EditableLinkGroup onAdd={() => {}} links={links} linkElement={Link} />
235 236 237 238
            </Card>
            <Card
              style={{ marginBottom: 24 }}
              bordered={false}
afc163's avatar
afc163 committed
239
              title="XX 指数"
nikogu's avatar
nikogu committed
240
              loading={radarData.length === 0}
241 242
            >
              <div className={styles.chart}>
243
                <Radar hasLegend height={343} data={radarData} />
244 245
              </div>
            </Card>
jim's avatar
jim committed
246
            <Card bodyStyle={{ paddingTop: 12, paddingBottom: 12 }} bordered={false} title="团队">
247 248
              <div className={styles.members}>
                <Row gutter={48}>
jim's avatar
jim committed
249 250 251 252 253 254 255 256
                  {members.map(item => (
                    <Col span={12} key={`members-item-${item.id}`}>
                      <Link to={item.link}>
                        <Avatar src={item.logo} size="small" />
                        <span className={styles.member}>{item.title}</span>
                      </Link>
                    </Col>
                  ))}
257 258 259 260 261 262 263 264 265
                </Row>
              </div>
            </Card>
          </Col>
        </Row>
      </PageHeaderLayout>
    );
  }
}