Skip to content

Instantly share code, notes, and snippets.

@vanadium23
Created June 22, 2022 06:40
Show Gist options
  • Select an option

  • Save vanadium23/55bc62afde8bdf422394dbe96124cc63 to your computer and use it in GitHub Desktop.

Select an option

Save vanadium23/55bc62afde8bdf422394dbe96124cc63 to your computer and use it in GitHub Desktop.
cssClasses table-max
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));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment