@stevescruz/task-master
Version:
A command-line todo list that allows you to write your tasks, set priorities, view existing tasks and view the next tasks due.
113 lines (88 loc) • 2.98 kB
JavaScript
const {
BOARD,
STATISTICS,
DESCRIPTION,
TIME_STAMP,
CHECKED,
UNTICKED,
TICK,
HIGH_PRIORITY,
} = require('../enums/MessageColorEnum');
function renderTasks(tasks, title, showDate) {
const itemSymbol = {
pending: UNTICKED('☐'),
done: TICK('✓'),
};
const descriptionColor = {
done: CHECKED,
pending: DESCRIPTION,
}
const priorityColor = {
L: `${CHECKED(' (low)')}`,
N: '',
H: `${HIGH_PRIORITY(' (!)')}`,
};
if (showDate) {
const tasksAtDatesMap = tasks.reduce((acc, task) => {
const localeOptions = {
day: '2-digit',
month: '2-digit',
year: 'numeric',
};
const date = new Date(task.timestamp)
.toLocaleDateString(undefined, localeOptions);
if (!acc.has(date)) {
acc.set(date, [task]);
} else {
const tasksAtDate = acc.get(date);
tasksAtDate.push(task);
}
return acc
}, new Map());
const tasksAtDates = Array.from(tasksAtDatesMap, taskAtDate => ({ [taskAtDate[0]]: taskAtDate[1] }));
const tasksSortedByDate = tasksAtDates.sort((a, b) => {
const dateA = new Date (Object.keys(a)[0])
.getTime();
const dateB = new Date (Object.keys(b)[0])
.getTime();
return dateA - dateB;
});
tasksSortedByDate.forEach(tasksAtDate => {
const date = (Object.keys(tasksAtDate)).pop();
const tasks = Object.values(tasksAtDate).pop();
const localeOptions = {
weekday: 'long',
day: '2-digit',
month: 'long',
year: 'numeric',
};
let [weekday, monthAndDay, year] = new Date(date)
.toLocaleDateString(undefined, localeOptions)
.split(', ');
const formattedDate = `${weekday}, ${monthAndDay} ${year}`;
console.log();
renderTasks(tasks, formattedDate, !showDate);
});
return;
}
let completedTasks = 0;
tasks.forEach(task => {
if (task.status === 'done') {
completedTasks += 1;
}
});
const boardName = title ? `${title.toLowerCase()}` : 'tasks';
const totalTasks = tasks.length;
const pendingTasks = totalTasks - completedTasks;
const completedTasksFraction = `${completedTasks}/${totalTasks}`;
console.log(`${BOARD(boardName)} ${STATISTICS(completedTasksFraction)}`);
if (tasks.length !== 0) {
const mappedTasks = tasks.map(task => ` ${STATISTICS(`${task.id}.`)} ${itemSymbol[task.status]} ${descriptionColor[task.status](task.description)} ${TIME_STAMP(task.age)}${task.status === 'pending' ? priorityColor[task.priority] : ''}`);
mappedTasks.map(task => console.log(task));
const percentage = +((completedTasks * 100) / tasks.length).toFixed(2);
const statisticsMessage = `${percentage}% completed`;
console.log(`\n${STATISTICS(statisticsMessage)}`);
}
console.log(`${TICK(completedTasks)} ${STATISTICS(`done -`)} ${UNTICKED(pendingTasks)} ${STATISTICS(`pending`)}`);
}
module.exports = renderTasks;