Dashboard: init activities display
This commit is contained in:
		@@ -18,7 +18,8 @@ activities_blueprint = Blueprint('activities', __name__)
 | 
				
			|||||||
@authenticate
 | 
					@authenticate
 | 
				
			||||||
def get_activities(auth_user_id):
 | 
					def get_activities(auth_user_id):
 | 
				
			||||||
    """Get all activities for authenticated user"""
 | 
					    """Get all activities for authenticated user"""
 | 
				
			||||||
    activities = Activity.query.filter_by(user_id=auth_user_id).all()
 | 
					    activities = Activity.query.filter_by(user_id=auth_user_id)\
 | 
				
			||||||
 | 
					        .order_by(Activity.activity_date.desc()).all()
 | 
				
			||||||
    activities_list = []
 | 
					    activities_list = []
 | 
				
			||||||
    for activity in activities:
 | 
					    for activity in activities:
 | 
				
			||||||
        activities_list.append(activity.serialize())
 | 
					        activities_list.append(activity.serialize())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,18 +51,18 @@ def test_get_all_activities_for_authenticated_user(app):
 | 
				
			|||||||
    assert len(data['data']['activities']) == 2
 | 
					    assert len(data['data']['activities']) == 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert 'creation_date' in data['data']['activities'][0]
 | 
					    assert 'creation_date' in data['data']['activities'][0]
 | 
				
			||||||
    assert 'Mon, 01 Jan 2018 00:00:00 GMT' == data['data']['activities'][0]['activity_date']  # noqa
 | 
					    assert 'Sun, 01 Apr 2018 00:00:00 GMT' == data['data']['activities'][0]['activity_date']  # noqa
 | 
				
			||||||
    assert 1 == data['data']['activities'][0]['user_id']
 | 
					    assert 1 == data['data']['activities'][0]['user_id']
 | 
				
			||||||
    assert 2 == data['data']['activities'][0]['sport_id']
 | 
					    assert 1 == data['data']['activities'][0]['sport_id']
 | 
				
			||||||
    assert '0:17:04' == data['data']['activities'][0]['duration']
 | 
					    assert '1:40:00' == data['data']['activities'][0]['duration']
 | 
				
			||||||
    assert data['data']['activities'][0]['with_gpx'] is False
 | 
					    assert data['data']['activities'][0]['with_gpx'] is False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert 'creation_date' in data['data']['activities'][1]
 | 
					    assert 'creation_date' in data['data']['activities'][1]
 | 
				
			||||||
    assert 'Sun, 01 Apr 2018 00:00:00 GMT' == data['data']['activities'][1]['activity_date']  # noqa
 | 
					    assert 'Mon, 01 Jan 2018 00:00:00 GMT' == data['data']['activities'][1]['activity_date']  # noqa
 | 
				
			||||||
    assert 1 == data['data']['activities'][1]['user_id']
 | 
					    assert 1 == data['data']['activities'][1]['user_id']
 | 
				
			||||||
    assert 1 == data['data']['activities'][1]['sport_id']
 | 
					    assert 2 == data['data']['activities'][1]['sport_id']
 | 
				
			||||||
    assert '1:40:00' == data['data']['activities'][1]['duration']
 | 
					    assert '0:17:04' == data['data']['activities'][1]['duration']
 | 
				
			||||||
    assert data['data']['activities'][0]['with_gpx'] is False
 | 
					    assert data['data']['activities'][1]['with_gpx'] is False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_get_activities_for_authenticated_user_no_activity(app):
 | 
					def test_get_activities_for_authenticated_user_no_activity(app):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,6 +57,10 @@ input, textarea {
 | 
				
			|||||||
  text-align: center;
 | 
					  text-align: center;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.activity-card {
 | 
				
			||||||
 | 
					    margin-bottom: 15px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.add-activity {
 | 
					.add-activity {
 | 
				
			||||||
  margin-top: 50px;
 | 
					  margin-top: 50px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										30
									
								
								mpwo_client/src/components/Dashboard/ActivityCard.jsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								mpwo_client/src/components/Dashboard/ActivityCard.jsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					import React from 'react'
 | 
				
			||||||
 | 
					import { Link } from 'react-router-dom'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function ActivityCard (props) {
 | 
				
			||||||
 | 
					  const { activity, sports } = props
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <div className="card activity-card">
 | 
				
			||||||
 | 
					      <div className="card-header">
 | 
				
			||||||
 | 
					        <Link to={`/activities/${activity.id}`}>
 | 
				
			||||||
 | 
					        {sports.filter(sport => sport.id === activity.sport_id)
 | 
				
			||||||
 | 
					               .map(sport => sport.label)} -{' '}
 | 
				
			||||||
 | 
					        {activity.activity_date}
 | 
				
			||||||
 | 
					        </Link>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div className="card-body">
 | 
				
			||||||
 | 
					        <p>
 | 
				
			||||||
 | 
					          <i className="fa fa-calendar" aria-hidden="true" />{' '}
 | 
				
			||||||
 | 
					          Start at {activity.activity_date}
 | 
				
			||||||
 | 
					        </p>
 | 
				
			||||||
 | 
					        <p>
 | 
				
			||||||
 | 
					          <i className="fa fa-clock-o" aria-hidden="true" />{' '}
 | 
				
			||||||
 | 
					          Duration: {activity.duration} -{' '}
 | 
				
			||||||
 | 
					          <i className="fa fa-road" aria-hidden="true" />{' '}
 | 
				
			||||||
 | 
					          Distance: {activity.distance} km
 | 
				
			||||||
 | 
					        </p>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								mpwo_client/src/components/Dashboard/Statistics.jsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								mpwo_client/src/components/Dashboard/Statistics.jsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					import React from 'react'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function ActivityCard () {
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <div className="card activity-card">
 | 
				
			||||||
 | 
					      <div className="card-header">
 | 
				
			||||||
 | 
					        Statistics
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div className="card-body">
 | 
				
			||||||
 | 
					        coming soon...
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,15 +2,43 @@ import React from 'react'
 | 
				
			|||||||
import { Helmet } from 'react-helmet'
 | 
					import { Helmet } from 'react-helmet'
 | 
				
			||||||
import { connect } from 'react-redux'
 | 
					import { connect } from 'react-redux'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import ActivityCard from './ActivityCard'
 | 
				
			||||||
 | 
					import Statistics from './Statistics'
 | 
				
			||||||
 | 
					import { getData } from '../../actions/index'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DashBoard extends React.Component {
 | 
					class DashBoard extends React.Component {
 | 
				
			||||||
  componentDidMount() {}
 | 
					  componentDidMount() {
 | 
				
			||||||
 | 
					    this.props.loadActivities()
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render() {
 | 
					  render() {
 | 
				
			||||||
 | 
					    const { activities, sports } = this.props
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <div>
 | 
					      <div>
 | 
				
			||||||
        <Helmet>
 | 
					        <Helmet>
 | 
				
			||||||
          <title>mpwo - Dashboard</title>
 | 
					          <title>mpwo - Dashboard</title>
 | 
				
			||||||
        </Helmet>
 | 
					        </Helmet>
 | 
				
			||||||
        <h1 className="page-title">Dashboard</h1>
 | 
					        <h1 className="page-title">Dashboard</h1>
 | 
				
			||||||
 | 
					        <div className="container">
 | 
				
			||||||
 | 
					          <div className="row">
 | 
				
			||||||
 | 
					            <div className="col-md-6">
 | 
				
			||||||
 | 
					              {activities.length > 0 ? (
 | 
				
			||||||
 | 
					                activities.map(activity => (
 | 
				
			||||||
 | 
					                  <ActivityCard
 | 
				
			||||||
 | 
					                    activity={activity}
 | 
				
			||||||
 | 
					                    key={activity.id}
 | 
				
			||||||
 | 
					                    sports={sports}
 | 
				
			||||||
 | 
					                  />
 | 
				
			||||||
 | 
					                ))
 | 
				
			||||||
 | 
					              ) : (
 | 
				
			||||||
 | 
					                'No activities for now'
 | 
				
			||||||
 | 
					              )}
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <div className="col-md-6">
 | 
				
			||||||
 | 
					              <Statistics />
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -18,6 +46,15 @@ class DashBoard extends React.Component {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export default connect(
 | 
					export default connect(
 | 
				
			||||||
  state => ({
 | 
					  state => ({
 | 
				
			||||||
 | 
					    activities: state.activities.data,
 | 
				
			||||||
 | 
					    message: state.message,
 | 
				
			||||||
 | 
					    sports: state.sports.data,
 | 
				
			||||||
    user: state.user,
 | 
					    user: state.user,
 | 
				
			||||||
 | 
					  }),
 | 
				
			||||||
 | 
					  dispatch => ({
 | 
				
			||||||
 | 
					    loadActivities: () => {
 | 
				
			||||||
 | 
					      dispatch(getData('activities'))
 | 
				
			||||||
 | 
					      dispatch(getData('sports'))
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
)(DashBoard)
 | 
					)(DashBoard)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user