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 (
+
+
+
+
+
+
+
+ | GitHub Handle |
+ Title |
+ Description |
+ Days Overdue |
+
+
+
+ {this.state.tasks.map(task =>
+
+ |
+ {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 (
+
+ )
+ }
+}
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