function calcTasks(project) {
const tasks = project.file.tasks.filter(t => t.tags?.includes('#task'));
project.tasks = tasks;
return project;
}
function calcSteps(project) {
const steps = project.file.tasks.filter(t => !t.tags?.includes('#task'));
project.steps = steps;
return project;
}
function calcProgress(project) {
const totalSteps = project.steps.length;
const completedSteps = project.steps.filter(s => s.completed).length;
const percent = Math.round(100 * completedSteps / totalSteps);
const progress = `<progress value="${percent}" max="100"></progress><br>${completedSteps}/${totalSteps}`;
project.progress = progress;
return project;
}
function calcStartDate(project) {
if(!!!project.start_date) {
return project;
};
const today = dv.date('today');
const startDate = project.start_date.setLocale('ru').toFormat('d MMM, ccc');
let dayPassed = today.diff(project.start_date, 'days');
dayPassed = Math.round(dayPassed.days, 2);
let emoji = '';
if (dayPassed > 90) {
emoji = '🆘';
} else if (dayPassed > 60) {
emoji = '⚠';
}
project.startDate = `${emoji}${dayPassed} дней с ${startDate}`;
return project;
}
function calcDueDate(project) {
if(!!!project.due_date) {
return project;
};
const today = dv.date('today');
const dueDate = project.due_date.setLocale('ru').toFormat('d MMM, ccc');
let dayLeft = project.due_date.diff(today, 'days');
dayLeft = Math.round(dayLeft.days);
let emoji = '';
if (dayLeft < 7) {
emoji = '🆘';
} else if (dayLeft < 14) {
emoji = '⚠';
}
project.dueDate = `${emoji}${dayLeft} дней до ${dueDate}`;
return project;
}
function calcTotalTasks(project) {
const totalTasks = project.tasks.length;
const completedTasks = project.tasks.filter(s => s.completed).length;
project.totalTasks = `🛠${completedTasks}/${totalTasks} задач`;
return project;
}
// End of fields calculation
const fields = [
"Project",
"Goal",
"Next",
"Progress",
"Start Date",
"Due Date",
"Tasks",
];
function mapProject(project) {
return [
project.file.link,
project.goal,
project.next,
project.progress,
project.startDate,
project.dueDate,
project.totalTasks
];
}
// End of mapping
const currentProjects = dv.pages('"Actions/projects"')
.filter(p => p.status !== 'Archive')
.filter(p => p.status !== 'Completed')
.map(calcTasks)
.map(calcSteps)
.map(calcProgress)
.map(calcStartDate)
.map(calcDueDate)
.map(calcTotalTasks);
const sortStatus = ["In Progress", "Todo", "Waiting", "Completed", "Discarded", "Archive"];
const projectsByStatus = currentProjects.groupBy(p => p.status).sort(g => sortStatus.indexOf(g.key));
for (let group of projectsByStatus) {
dv.header(2, group.key);
dv.table(fields, group.rows.map(mapProject));
}