Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/browser/components/molecules/OverdueTaskList/index.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
td{
max-width: 600px;
}
97 changes: 97 additions & 0 deletions src/browser/components/molecules/OverdueTaskList/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import React, { Component } from 'react'
import {fetchURL, toStandardDate } from '../../../common/utils'
import moment from 'moment'
import styles from './index.css'

export default class OverdueTaskList extends Component {
constructor (props) {
super(props)
this.state = {
tasks:[]
}
}

componentDidMount(){
fetchURL('api/task/tasksAndUsers')
.then(results => {
this.setState({
tasks: results.filter(this.isOverdue),
})
})
.catch(err => {
return err
})
}


findEmailByUUID( user_id ){

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why does this function exist? Since you are now fetching the task, and the associated user of the task(by joining the task and user table), the email should be a property on the task object.

for( let task of this.state.tasks ){
if( task.user_id == user_id ){
if(task.email !== null) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these 2 if statements can be combined

return (
<a href={`mailto:${task.email}`}>
{task.github_handle}
</a>
)
} else {
return task.github_handle
}
}
}
}

isOverdue(task){
if (moment().isAfter(task.due_date) && task.is_complete === false){
return true
}
}

daysOverdue(task_due_date) {
let diffInDays = Math.abs(moment(task_due_date).diff(moment(), 'days'))

return (
<span className="label label-danger">Overdue By: {diffInDays} days</span>
)
}

render() {
return (
<div className='panel panel-info'>
<div className='panel-heading'>
<div className='panel-title'>Overdue Tasks</div>
</div>
<div className='panel-body'>
<div className='list-group'>
<table className='table'>
<thead>
<tr>
<th> GitHub Handle </th>
<th> Title </th>
<th> Description </th>
<th> Days Overdue </th>
</tr>
</thead>
<tbody>
{this.state.tasks.map(task =>
<tr key={task.id}>
<td>
{this.findEmailByUUID(task.user_id)}
</td>
<td>
{task.title}
</td>
<td>
{task.description}
</td>
<td>
{this.daysOverdue(task.due_date)}
</td>
</tr>)}
</tbody>
</table>
</div>
</div>
</div>
)
}
}
3 changes: 2 additions & 1 deletion src/browser/components/pages/Dashboard/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import GenericDashboard from '../GenericDashboard/index'
import MentorDashboard from '../MentorDashboard/index'
import NewbieDashboard from '../NewbieDashboard/index'
import TemplateTask from '../TemplateTask/index'
import {browserHistory} from 'react-router'
import {Link, browserHistory} from 'react-router'

export default class Dashboard extends Component {

Expand Down Expand Up @@ -40,6 +40,7 @@ export default class Dashboard extends Component {
if(user.role === 'admin') {
return (<div>
<h3>Admin Dashboard</h3>
<Link to={'/overdue_tasks'} > Overdue Tasks </Link>
<TemplateTask />
</div>)
} else if (user.role === 'mentor') {
Expand Down
18 changes: 18 additions & 0 deletions src/browser/components/pages/OverdueTask/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import React, { Component } from 'react'
import OverdueTaskList from '../../molecules/OverdueTaskList/index'
import { fetchURL, toStandardDate } from '../../../common/utils'
import moment from 'moment'

export default class OverdueTask extends Component {

render() {
return (
<div className='container'>
<div>
<h1>Overdue Tasks</h1>
</div>
<OverdueTaskList/>
</div>
)
}
}
2 changes: 2 additions & 0 deletions src/browser/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ import { Router, Route, Link, browserHistory } from 'react-router'
import TemplateTask from './components/pages/TemplateTask/index'
import Signup from './components/pages/Signup/index'
import Dashboard from './components/pages/Dashboard'
import OverdueTask from './components/pages/OverdueTask'

class Root extends Component {
render() {
return (
<Router history={browserHistory}>
<Route path='/' component={Dashboard} />
<Route path='/signup' component={Signup} />
<Route path='/overdue_tasks' component={OverdueTask} />
<Route path='/template_tasks' component={TemplateTask}/>
</Router>
)
Expand Down
4 changes: 4 additions & 0 deletions src/database/queries/task.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ const add = attributes =>
const getAll = () =>
_.findAll( 'task' )

const getTasksAndUsers = () =>
knex.select('*').from('task').leftJoin('users', 'task.user_id', 'users.id')

const getBy = ( column, data ) =>
_.findAllWhere( 'task', column, data )

Expand Down Expand Up @@ -49,5 +52,6 @@ export { add,
update,
expunge,
deleteAll,
getTasksAndUsers,
convertTemplateTasks,
addTemplateTasksByRole }
6 changes: 4 additions & 2 deletions src/routes/task.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,11 @@ router.post('/:task_id', (request, response, next) => {
console.log(`Error loading user ${currentUser.handle}, or Task id ${task_id}.`);
throw err
})
})



router.get('/tasksAndUsers', (request, response, next) => {
task.getTasksAndUsers()
.then(results => response.json(results))
})

export default router
5 changes: 4 additions & 1 deletion src/routes/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ router.post('/', (request, response, next) => {
})
})


router.get('/all', function(request, response){
users.findAll()
.then(results => response.json(results))
})

export default router