index.tsx 7.52 KB
Newer Older
1 2 3
import React, { PureComponent } from 'react';
import moment from 'moment';
import { connect } from 'dva';
zinkey's avatar
zinkey committed
4
import Link from 'umi/link';
5
import { Row, Col, Card, List, Avatar } from 'antd';
愚道's avatar
愚道 committed
6
import { Dispatch } from 'redux';
愚道's avatar
愚道 committed
7

愚道's avatar
愚道 committed
8

9 10
import EditableLinkGroup from './components/EditableLinkGroup';
import PageHeaderWrapper from './components/PageHeaderWrapper';
愚道's avatar
愚道 committed
11
import Radar from './components/Radar';
愚道's avatar
愚道 committed
12 13
import { ModalState } from './model';
import { CurrentUser, Activeties, RadarData, Notice } from './data';
14

15 16
import styles from './style.less';

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 43
const links = [
  {
    title: '操作一',
    href: '',
  },
  {
    title: '操作二',
    href: '',
  },
  {
    title: '操作三',
    href: '',
  },
  {
    title: '操作四',
    href: '',
  },
  {
    title: '操作五',
    href: '',
  },
  {
    title: '操作六',
    href: '',
  },
];

愚道's avatar
愚道 committed
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
interface BLOCK_NAME_CAMEL_CASEProps {
  currentUser: CurrentUser;
  projectNotice: Notice[];
  activities: Activeties[];
  radarData: RadarData[];
  dispatch: Dispatch;
  currentUserLoading: boolean;
  projectLoading: boolean;
  activitiesLoading: boolean;
}

@connect(({
  BLOCK_NAME_CAMEL_CASE: { currentUser, projectNotice, activities, radarData },
  loading,
}: {
  BLOCK_NAME_CAMEL_CASE: ModalState,
  loading: { effects: any },
}) => ({
  currentUser,
  projectNotice,
Andreas Cederström's avatar
Andreas Cederström committed
64
  activities,
愚道's avatar
愚道 committed
65
  radarData,
66 67 68
  currentUserLoading: loading.effects['BLOCK_NAME_CAMEL_CASE/fetchUserCurrent'],
  projectLoading: loading.effects['BLOCK_NAME_CAMEL_CASE/fetchProjectNotice'],
  activitiesLoading: loading.effects['BLOCK_NAME_CAMEL_CASE/fetchActivitiesList'],
69
}))
愚道's avatar
愚道 committed
70
class PAGE_NAME_UPPER_CAMEL_CASE extends PureComponent<BLOCK_NAME_CAMEL_CASEProps> {
71 72
  componentDidMount() {
    const { dispatch } = this.props;
ddcat1115's avatar
ddcat1115 committed
73
    dispatch({
74
      type: 'BLOCK_NAME_CAMEL_CASE/init',
75 76 77 78 79 80
    });
  }

  componentWillUnmount() {
    const { dispatch } = this.props;
    dispatch({
81
      type: 'BLOCK_NAME_CAMEL_CASE/clear',
82 83 84
    });
  }

afc163's avatar
afc163 committed
85
  renderActivities() {
86
    const {
愚道's avatar
愚道 committed
87
      activities,
88
    } = this.props;
愚道's avatar
愚道 committed
89
    return activities.map(item => {
jim's avatar
jim committed
90
      const events = item.template.split(/@\{([^{}]*)\}/gi).map(key => {
afc163's avatar
afc163 committed
91
        if (item[key]) {
jim's avatar
jim committed
92 93 94 95 96
          return (
            <a href={item[key].link} key={item[key].name}>
              {item[key].name}
            </a>
          );
afc163's avatar
afc163 committed
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
        }
        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>
      );
    });
  }

122 123
  render() {
    const {
ddcat1115's avatar
ddcat1115 committed
124
      currentUser,
愚道's avatar
愚道 committed
125
      projectNotice,
Andreas Cederström's avatar
Andreas Cederström committed
126 127
      projectLoading,
      activitiesLoading,
愚道's avatar
愚道 committed
128
      radarData,
129 130
    } = this.props;

131 132 133 134 135 136 137
    const pageHeaderContent =
      currentUser && Object.keys(currentUser).length ? (
        <div className={styles.pageHeaderContent}>
          <div className={styles.avatar}>
            <Avatar size="large" src={currentUser.avatar} />
          </div>
          <div className={styles.content}>
138 139 140 141 142
            <div className={styles.contentTitle}>
              早安,
              {currentUser.name}
              ,祝你开心每一天!
            </div>
143
            <div>
144
              {currentUser.title} |{currentUser.group}
ddcat1115's avatar
ddcat1115 committed
145
            </div>
jim's avatar
jim committed
146
          </div>
147 148
        </div>
      ) : null;
149

afc163's avatar
afc163 committed
150 151 152
    const extraContent = (
      <div className={styles.extraContent}>
        <div className={styles.statItem}>
niko's avatar
niko committed
153
          <p>项目数</p>
154 155
          <p>56</p>
        </div>
afc163's avatar
afc163 committed
156
        <div className={styles.statItem}>
niko's avatar
niko committed
157
          <p>团队内排名</p>
jim's avatar
jim committed
158
          <p>
159
            8<span> / 24</span>
jim's avatar
jim committed
160
          </p>
161
        </div>
afc163's avatar
afc163 committed
162
        <div className={styles.statItem}>
niko's avatar
niko committed
163
          <p>项目访问</p>
164 165 166 167 168 169
          <p>2,223</p>
        </div>
      </div>
    );

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

266
export default PAGE_NAME_UPPER_CAMEL_CASE;