lancetw/react-isomorphic-bundle

View on GitHub
src/client/admin/components/StatisticsComponent.js

Summary

Maintainability
C
7 hrs
Test Coverage
import React, { Component, PropTypes } from 'react'
import ReactDOM from 'react-dom'
import { Link } from 'react-router'
import { isEmpty } from 'lodash'
import {
  Menu
} from 'client/admin/components/widget'
import moment from 'moment'

export default class Statistics extends Component {

  static propTypes = {
    collect: PropTypes.object.isRequired,
    fetchData: PropTypes.func.isRequired
  }

  constructor (props) {
    super(props)
  }

  componentDidUpdate() {
    Plotly.newPlot('plot', [{
      x: this.props.collect.data.map((d,_)=>moment(d.day).format()),
      y: this.props.collect.data.map((d,_)=>d.count),
      type: 'bar',
      marker: {
        color: 'orange'
      }
    }], {
      height: 250,
      width: '100%',
      margin: {
        t: 0, r: 30, l: 30
      },
      xaxis: {
        gridcolor: 'transparent'
      }
    }, {
      displayModeBar: false
    })
  }

  handleSubmit = (event) => {
    event.preventDefault()
    const year = +ReactDOM.findDOMNode(this.refs.year).value
    const month = +ReactDOM.findDOMNode(this.refs.month).value
    this.props.fetchData(year, month)
  }

  render () {
    const { items, countPosts, countUsers, year, month } = this.props.collect

    return (
      <main className="ui column page grid container">
        <div className="column">
          <div className="row">
            <div className="image logo admin"></div>
          </div>
          <Menu {...this.props} />
          <div className="ui grid">
            <div className="column">
              <div className="ui segment">
                <div className="ui mini form">
                  <div className="inline fields">
                    <div className="field">
                      <input ref="year" type="number" max="2038" min="1970" placeholder="年" defaultValue={year} />
                    </div>
                    <div className="field">
                      <input ref="month" type="number" max="12" min="1" placeholder="月" defaultValue={month} />
                    </div>
                    <button className="ui icon button" onClick={this.handleSubmit}>
                      <i className="search icon"></i>
                    </button>
                  </div>
                </div>
                <div className="ui statistics">
                  <div className="ui horizontal statistic">
                    <div className="value">
                      {countPosts}
                    </div>
                    <div className="label">
                      則活動訊息佈告
                    </div>
                  </div>
                  <div className="ui horizontal statistic">
                    <div className="value">
                      {countUsers}
                    </div>
                    <div className="label">
                      人張貼佈告
                    </div>
                  </div>
                </div>
                <div className="ui hidden divider"></div>
                <div id="plot"></div>
                <table className="ui very basic  table">
                  <thead>
                    <tr><th>帳號(Email)</th>
                    <th>發文數量</th>
                  </tr></thead>
                  <tbody>
                  {!isEmpty(items) && items.map((item, i) => {
                    return (
                    <tr>
                      <td>
                        <h4 className="ui image header">
                          <div className="content">
                            {item['user.email']}
                            <div className="sub header">{item['user.name']}
                          </div>
                        </div>
                      </h4></td>
                      <td>
                        {item.count}
                      </td>
                    </tr>
                    )
                  })}
                  </tbody>
                </table>
              </div>
            </div>
          </div>
        </div>
      </main>
    )
  }
}