161 lines
4 KiB
React
161 lines
4 KiB
React
![]() |
import { TASK_COLOR } from './Colors.jsx'
|
||
|
|
||
|
export const ChoresGrouper = (groupBy, chores) => {
|
||
|
// sort by priority then due date:
|
||
|
chores.sort((a, b) => {
|
||
|
// no priority is lowest priority:
|
||
|
if (a.priority === 0) {
|
||
|
return 1
|
||
|
}
|
||
|
if (a.priority !== b.priority) {
|
||
|
return a.priority - b.priority
|
||
|
}
|
||
|
if (a.nextDueDate === null) {
|
||
|
return 1
|
||
|
}
|
||
|
if (b.nextDueDate === null) {
|
||
|
return -1
|
||
|
}
|
||
|
return new Date(a.nextDueDate) - new Date(b.nextDueDate)
|
||
|
})
|
||
|
|
||
|
var groups = []
|
||
|
switch (groupBy) {
|
||
|
case 'due_date':
|
||
|
var groupRaw = {
|
||
|
Today: [],
|
||
|
'In a week': [],
|
||
|
'This month': [],
|
||
|
Later: [],
|
||
|
Overdue: [],
|
||
|
Anytime: [],
|
||
|
}
|
||
|
chores.forEach(chore => {
|
||
|
if (chore.nextDueDate === null) {
|
||
|
groupRaw['Anytime'].push(chore)
|
||
|
} else if (new Date(chore.nextDueDate) < new Date()) {
|
||
|
groupRaw['Overdue'].push(chore)
|
||
|
} else if (
|
||
|
new Date(chore.nextDueDate).toDateString() ===
|
||
|
new Date().toDateString()
|
||
|
) {
|
||
|
groupRaw['Today'].push(chore)
|
||
|
} else if (
|
||
|
new Date(chore.nextDueDate) <
|
||
|
new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) &&
|
||
|
new Date(chore.nextDueDate) > new Date()
|
||
|
) {
|
||
|
groupRaw['In a week'].push(chore)
|
||
|
} else if (
|
||
|
new Date(chore.nextDueDate).getMonth() === new Date().getMonth()
|
||
|
) {
|
||
|
groupRaw['This month'].push(chore)
|
||
|
} else {
|
||
|
groupRaw['Later'].push(chore)
|
||
|
}
|
||
|
})
|
||
|
groups = [
|
||
|
{
|
||
|
name: 'Overdue',
|
||
|
content: groupRaw['Overdue'],
|
||
|
color: TASK_COLOR.OVERDUE,
|
||
|
},
|
||
|
{ name: 'Today', content: groupRaw['Today'], color: TASK_COLOR.TODAY },
|
||
|
{
|
||
|
name: 'In a week',
|
||
|
content: groupRaw['In a week'],
|
||
|
color: TASK_COLOR.IN_A_WEEK,
|
||
|
},
|
||
|
{
|
||
|
name: 'This month',
|
||
|
content: groupRaw['This month'],
|
||
|
color: TASK_COLOR.THIS_MONTH,
|
||
|
},
|
||
|
{ name: 'Later', content: groupRaw['Later'], color: TASK_COLOR.LATER },
|
||
|
{
|
||
|
name: 'Anytime',
|
||
|
content: groupRaw['Anytime'],
|
||
|
color: TASK_COLOR.ANYTIME,
|
||
|
},
|
||
|
]
|
||
|
break
|
||
|
case 'priority':
|
||
|
groupRaw = {
|
||
|
p1: [],
|
||
|
p2: [],
|
||
|
p3: [],
|
||
|
p4: [],
|
||
|
no_priority: [],
|
||
|
}
|
||
|
chores.forEach(chore => {
|
||
|
switch (chore.priority) {
|
||
|
case 1:
|
||
|
groupRaw['p1'].push(chore)
|
||
|
break
|
||
|
case 2:
|
||
|
groupRaw['p2'].push(chore)
|
||
|
break
|
||
|
case 3:
|
||
|
groupRaw['p3'].push(chore)
|
||
|
break
|
||
|
case 4:
|
||
|
groupRaw['p4'].push(chore)
|
||
|
break
|
||
|
default:
|
||
|
groupRaw['no_priority'].push(chore)
|
||
|
break
|
||
|
}
|
||
|
})
|
||
|
groups = [
|
||
|
{
|
||
|
name: 'Priority 1',
|
||
|
content: groupRaw['p1'],
|
||
|
color: TASK_COLOR.PRIORITY_1,
|
||
|
},
|
||
|
{
|
||
|
name: 'Priority 2',
|
||
|
content: groupRaw['p2'],
|
||
|
color: TASK_COLOR.PRIORITY_2,
|
||
|
},
|
||
|
{
|
||
|
name: 'Priority 3',
|
||
|
content: groupRaw['p3'],
|
||
|
color: TASK_COLOR.PRIORITY_3,
|
||
|
},
|
||
|
{
|
||
|
name: 'Priority 4',
|
||
|
content: groupRaw['p4'],
|
||
|
color: TASK_COLOR.PRIORITY_4,
|
||
|
},
|
||
|
{
|
||
|
name: 'No Priority',
|
||
|
content: groupRaw['no_priority'],
|
||
|
color: TASK_COLOR.NO_PRIORITY,
|
||
|
},
|
||
|
]
|
||
|
break
|
||
|
case 'labels':
|
||
|
groupRaw = {}
|
||
|
var labels = {}
|
||
|
chores.forEach(chore => {
|
||
|
chore.labelsV2.forEach(label => {
|
||
|
labels[label.id] = label
|
||
|
if (groupRaw[label.id] === undefined) {
|
||
|
groupRaw[label.id] = []
|
||
|
}
|
||
|
groupRaw[label.id].push(chore)
|
||
|
})
|
||
|
})
|
||
|
groups = Object.keys(groupRaw).map(key => {
|
||
|
return {
|
||
|
name: labels[key].name,
|
||
|
content: groupRaw[key],
|
||
|
}
|
||
|
})
|
||
|
groups.sort((a, b) => {
|
||
|
a.name < b.name ? 1 : -1
|
||
|
})
|
||
|
}
|
||
|
return groups
|
||
|
}
|