2024-12-31 02:20:52 -05:00
|
|
|
import moment from 'moment'
|
2024-12-28 18:52:06 -05:00
|
|
|
import { TASK_COLOR } from './Colors.jsx'
|
|
|
|
|
2025-02-25 23:39:59 -05:00
|
|
|
const priorityOrder = [1, 2, 3, 4, 0]
|
|
|
|
|
2025-03-05 19:43:32 -05:00
|
|
|
export const ChoresGrouper = (groupBy, chores, filter) => {
|
|
|
|
if (filter) {
|
|
|
|
chores = chores.filter(chore => filter(chore))
|
|
|
|
}
|
|
|
|
|
2024-12-28 18:52:06 -05:00
|
|
|
// sort by priority then due date:
|
2025-02-25 23:39:59 -05:00
|
|
|
chores.sort(ChoreSorter)
|
2024-12-28 18:52:06 -05:00
|
|
|
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
|
|
|
|
}
|
2025-02-25 23:39:59 -05:00
|
|
|
export const ChoreSorter = (a, b) => {
|
|
|
|
const priorityA = priorityOrder.indexOf(a.priority)
|
|
|
|
const priorityB = priorityOrder.indexOf(b.priority)
|
|
|
|
if (priorityA !== priorityB) {
|
|
|
|
return priorityA - priorityB
|
|
|
|
}
|
2024-12-31 02:20:52 -05:00
|
|
|
|
2025-02-25 23:39:59 -05:00
|
|
|
// Status sorting (0 > 1 > ... ascending order)
|
|
|
|
if (a.status !== b.status) {
|
|
|
|
return a.status - b.status
|
|
|
|
}
|
|
|
|
|
|
|
|
// Due date sorting (earlier dates first, null/undefined last)
|
|
|
|
if (!a.nextDueDate && !b.nextDueDate) return 0
|
|
|
|
if (!a.nextDueDate) return 1
|
|
|
|
if (!b.nextDueDate) return -1
|
|
|
|
|
|
|
|
return new Date(a.nextDueDate) - new Date(b.nextDueDate)
|
|
|
|
}
|
2024-12-31 02:20:52 -05:00
|
|
|
export const notInCompletionWindow = chore => {
|
|
|
|
return (
|
|
|
|
chore.completionWindow &&
|
|
|
|
chore.completionWindow > -1 &&
|
|
|
|
chore.nextDueDate &&
|
|
|
|
moment().add(chore.completionWindow, 'hours') < moment(chore.nextDueDate)
|
|
|
|
)
|
|
|
|
}
|
2025-03-05 19:43:32 -05:00
|
|
|
export const ChoreFilters = userProfile => ({
|
|
|
|
anyone: () => true,
|
|
|
|
assigned_to_me: chore => {
|
2025-03-05 22:04:28 -05:00
|
|
|
return chore.assignedTo && chore.assignedTo === userProfile?.id
|
2025-03-05 19:43:32 -05:00
|
|
|
},
|
|
|
|
assigned_to_others: chore => {
|
2025-03-05 22:04:28 -05:00
|
|
|
return chore.assignedTo && chore.assignedTo !== userProfile?.id
|
2025-03-05 19:43:32 -05:00
|
|
|
},
|
|
|
|
})
|