diff --git a/src/browser/components/molecules/OverdueTaskList/index.css b/src/browser/components/molecules/OverdueTaskList/index.css new file mode 100644 index 0000000..630a195 --- /dev/null +++ b/src/browser/components/molecules/OverdueTaskList/index.css @@ -0,0 +1,3 @@ +td{ + max-width: 600px; +} diff --git a/src/browser/components/molecules/OverdueTaskList/index.js b/src/browser/components/molecules/OverdueTaskList/index.js new file mode 100644 index 0000000..2734b19 --- /dev/null +++ b/src/browser/components/molecules/OverdueTaskList/index.js @@ -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 ){ + for( let task of this.state.tasks ){ + if( task.user_id == user_id ){ + if(task.email !== null) { + return ( + + {task.github_handle} + + ) + } 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 ( + Overdue By: {diffInDays} days + ) + } + + render() { + return ( +
+
+
Overdue Tasks
+
+
+
+ + + + + + + + + + + {this.state.tasks.map(task => + + + + + + )} + +
GitHub Handle Title Description Days Overdue
+ {this.findEmailByUUID(task.user_id)} + + {task.title} + + {task.description} + + {this.daysOverdue(task.due_date)} +
+
+
+
+ ) + } +} diff --git a/src/browser/components/pages/Dashboard/index.js b/src/browser/components/pages/Dashboard/index.js index 7a20708..0deda71 100644 --- a/src/browser/components/pages/Dashboard/index.js +++ b/src/browser/components/pages/Dashboard/index.js @@ -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 { @@ -40,6 +40,7 @@ export default class Dashboard extends Component { if(user.role === 'admin') { return (

Admin Dashboard

+ Overdue Tasks
) } else if (user.role === 'mentor') { diff --git a/src/browser/components/pages/OverdueTask/index.js b/src/browser/components/pages/OverdueTask/index.js new file mode 100644 index 0000000..6545c7f --- /dev/null +++ b/src/browser/components/pages/OverdueTask/index.js @@ -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 ( +
+
+

Overdue Tasks

+
+ +
+ ) + } +} diff --git a/src/browser/main.js b/src/browser/main.js index 2cbdd30..62fbb70 100644 --- a/src/browser/main.js +++ b/src/browser/main.js @@ -5,6 +5,7 @@ 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() { @@ -12,6 +13,7 @@ class Root extends Component { + ) diff --git a/src/database/queries/task.js b/src/database/queries/task.js index 245278d..e152d30 100644 --- a/src/database/queries/task.js +++ b/src/database/queries/task.js @@ -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 ) @@ -49,5 +52,6 @@ export { add, update, expunge, deleteAll, + getTasksAndUsers, convertTemplateTasks, addTemplateTasksByRole } diff --git a/src/routes/task.js b/src/routes/task.js index 7c42ad6..de1e542 100644 --- a/src/routes/task.js +++ b/src/routes/task.js @@ -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 diff --git a/src/routes/users.js b/src/routes/users.js index 9e5b936..40c92bd 100644 --- a/src/routes/users.js +++ b/src/routes/users.js @@ -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