add month stat for done

This commit is contained in:
Tykayn 2022-07-21 16:06:44 +02:00 committed by caligulanorris
parent 9774c15d65
commit ced08a36ac
1 changed files with 225 additions and 168 deletions

393
app.js
View File

@ -1,15 +1,18 @@
const fs = require('node-fs')
const fs = require('node-fs');
const sourceFilePath = './sources/tasks.json';
const stats = {
countAllTasks: 0,
tasksByDay: {}
}
countAllTasks: 0,
tasksByDay : [],
tasksByMonth : [],
tasksByYear : [],
};
// const enableFilterByTag = true;
const enableFilterByTag = false;
const filterByTag = "work";
const filterByTag = 'work';
// const outputFileName = "work_report";
const outputFileName = "all_tasks_report";
const outputFileName = 'all_tasks_report';
let countExcluded = 0;
let countIncluded = 0;
@ -17,237 +20,291 @@ let countIncluded = 0;
console.log(` ### lecture de ${sourceFilePath}`);
fs.stat(sourceFilePath, function (err, stat) {
if (err == null) {
console.log(`File ${sourceFilePath} exists`);
sortTasksFromJson(stat)
} else if (err.code === 'ENOENT') {
// file does not exist
console.error(`le fichier ${sourceFilePath} est introuvable. Impossible d en extraire des infos.`, err)
} else {
console.log('Some other error: ', err.code);
}
if (err == null) {
console.log(`File ${sourceFilePath} exists`);
sortTasksFromJson(stat);
} else if (err.code === 'ENOENT') {
// file does not exist
console.error(`le fichier ${sourceFilePath} est introuvable. Impossible d en extraire des infos.`, err);
} else {
console.log('Some other error: ', err.code);
}
});
// parcourir les tâches
function sortTasksFromJson(statObject) {
console.log('sortTasksFromJson')
fs.readFile(sourceFilePath, 'utf8', function (err, data) {
if (err) {
return console.log(err);
}
let dataTransformed = JSON.parse(data);
// console.log('data keys ', Object.keys(dataTransformed))
if (dataTransformed["contents"]) {
console.log('sortTasksFromJson');
fs.readFile(sourceFilePath, 'utf8', function (err, data) {
if (err) {
return console.log(err);
}
let dataTransformed = JSON.parse(data);
// console.log('data keys ', Object.keys(dataTransformed))
if (dataTransformed['contents']) {
countTasks = dataTransformed['contents'].length;
stats.countAllTasks = countTasks;
countTasks = dataTransformed["contents"].length
stats.countAllTasks = countTasks;
console.log('yes data ! tasks:', countTasks);
console.log('yes data ! tasks:', countTasks)
dataTransformed['contents'].forEach((elem, index) => {
dataTransformed["contents"].forEach((elem, index) => {
// console.log('tâche ', index)
// évacuer les sous tâches
// if (elem['contents']) {
// console.log('content ception, on évacue')
// countExcluded++;
// return;
// }
// filtrer par tag les tâches
if (enableFilterByTag) {
console.log('filtre activé', filterByTag)
if (!elem['drawer'] || !elem['properties']['tags']) {
console.log('on vire cette tâche n\'ayant pas de drawer :', elem)
countExcluded++;
return;
} else if (
elem['properties'] &&
typeof elem['properties']['tags'] !== "undefined" &&
elem['properties']['tags'].indexOf(filterByTag) === -1
) {
console.log('on vire cette tâche ayant les itags :', elem['drawer']['ARCHIVE_ITAGS'])
countExcluded++;
return;
}
} else {
console.log(' - filtre désactivé')
}
// après le filtre, on range les tâches
if (elem['properties']) {
console.log(' - ref ', elem['ref'])
let title = elem['properties']['raw-value'];
let tags = elem['tags'] ? elem['tags'] : [];
let closeDate = 'Indéfini';
let todoKeyword = 'DONE';
if (elem['properties']['closed']) {
closeDate = elem['properties']['closed']['end'];
} else if (elem['drawer'] && elem['drawer']['ARCHIVE_TIME']) {
closeDate = elem['drawer']['ARCHIVE_TIME'];
}
if (elem['drawer'] && elem['drawer']['ARCHIVE_TODO']) {
todoKeyword = elem['drawer']['ARCHIVE_TODO'];
}
if (!tags.length && elem['drawer'] && elem['drawer']['ARCHIVE_ITAGS']) {
tags += elem['drawer']['ARCHIVE_ITAGS'];
}
// jour, 11 premiers caractères
let day = closeDate.substring(0, 10);
if (!stats.tasksByDay[day]) {
stats.tasksByDay[day] = []
}
stats.tasksByDay[day].push({
todoKeyword,
title,
day,
closeDate,
tags,
})
// console.log(' ' + title)
countIncluded++;
} else {
console.log('no', elem['properties']['raw-value'])
}
})
// console.log('tâche ', index)
// évacuer les sous tâches
// if (elem['contents']) {
// console.log('content ception, on évacue')
// countExcluded++;
// return;
// }
// filtrer par tag les tâches
if (enableFilterByTag) {
console.log('filtre activé', filterByTag);
if (!elem['drawer'] || !elem['properties']['tags']) {
console.log('on vire cette tâche n\'ayant pas de drawer :', elem);
countExcluded++;
return;
} else if (
elem['properties'] &&
typeof elem['properties']['tags'] !== 'undefined' &&
elem['properties']['tags'].indexOf(filterByTag) === -1
) {
console.log('on vire cette tâche ayant les itags :', elem['drawer']['ARCHIVE_ITAGS']);
countExcluded++;
return;
}
} else {
console.log('no content')
console.log(' - filtre désactivé');
}
// console.log(data);
console.log('tâches inclues:', countIncluded)
writeHtmlOutput()
});
// après le filtre, on range les tâches
if (elem['properties']) {
console.log(' - ref ', elem['ref']);
let title = elem['properties']['raw-value'];
let tags = elem['tags'] ? elem['tags'] : [];
let closeDate = 'Indéfini';
let todoKeyword = 'DONE';
if (elem['properties']['closed']) {
closeDate = elem['properties']['closed']['end'];
// les répartir dans des tableaux selon les périodes de temps
} else if (elem['drawer'] && elem['drawer']['ARCHIVE_TIME']) {
closeDate = elem['drawer']['ARCHIVE_TIME'];
}
if (elem['drawer'] && elem['drawer']['ARCHIVE_TODO']) {
todoKeyword = elem['drawer']['ARCHIVE_TODO'];
}
if (!tags.length && elem['drawer'] && elem['drawer']['ARCHIVE_ITAGS']) {
tags += elem['drawer']['ARCHIVE_ITAGS'];
}
// jour, 11 premiers caractères
let day = closeDate.substring(0, 10);
let month = closeDate.substring(0, 7);
console.log('month', month)
let year = closeDate.substring(0, 4);
let taskDescription = {
todoKeyword,
title,
day,
closeDate,
tags,
};
if (!stats.tasksByDay[day]) {
stats.tasksByDay[day] = [];
}
if (!stats.tasksByMonth[month]) {
stats.tasksByMonth[month] = {
period: month,
tasks : [],
};
}
if (!stats.tasksByYear[year]) {
stats.tasksByYear[year] = {
period: year,
tasks : [],
};
}
stats.tasksByDay[day].push(taskDescription);
stats.tasksByMonth[month].tasks.push(taskDescription);
stats.tasksByYear[year].tasks.push(taskDescription);
// console.log(' ' + title)
countIncluded++;
} else {
console.log('no', elem['properties']['raw-value']);
}
});
} else {
console.log('no content');
}
// console.log(data);
console.log('tâches inclues:', countIncluded);
writeHtmlOutput();
});
// les répartir dans des tableaux selon les périodes de temps
}
/**
* Retourne un html présentant le nombre de tâches réalisées pour chaque mois
* @return {string}
*/
function RenderStatsMonth() {
let months = Object.keys(stats.tasksByMonth);
console.log('months.length', months.length);
let monthHTML = '';
months.forEach((elem) => {
monthData = stats.tasksByMonth[elem]
console.log('monthData.tasks.length', monthData.tasks.length)
monthHTML += `
<div class='columns'>
<div class='column'>
<h2 class='title is-2'>
${monthData.period}
</h2>
</div>
<div class='column'>
${monthData.tasks.length}
</div>
</div>
`;
});
return `
<div class='box'>
<h1 class='title is-1'>Stats mensuelles</h1>
${monthHTML}
</div>
`;
}
// sortir un html présentant les périodes de temps et les tâches réalisées
function writeHtmlOutput() {
console.log('writeHtmlOutput', stats.countAllTasks)
console.log('writeHtmlOutput', stats.countAllTasks);
let daysListRef = Object.keys(stats.tasksByDay).sort()
let filterInfo = ``
if (enableFilterByTag) {
filterInfo = `<p class="is-info">Contenu filtré sur le tag: ${filterByTag}. ${countExcluded} tâches exclues, ${countIncluded} tâches inclues sur le total de ${countExcluded + countIncluded}</p>`
}
let daysListRef = Object.keys(stats.tasksByDay).sort();
let filterInfo = ``;
if (enableFilterByTag) {
filterInfo = `<p class='is-info'>Contenu filtré sur le tag: ${filterByTag}. ${countExcluded} tâches exclues, ${countIncluded} tâches inclues sur le total de ${countExcluded + countIncluded}</p>`;
}
let htmlOut = `
let htmlOut = `
<html>
<head>
<title>
Rapport d'activité
</title>
<meta charset="UTF-8" />
<meta charset='UTF-8' />
<style>
@import "https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css";
</style>
</head>
<body>
<div id="report_days" class="container content">
<h1 class="title is-1">Feuille de rapport d'activité</h1>
<p class="subtitle is-1">par <a href="https://www.cipherbliss.com">Tykayn</a> </p>
<div id='report_days' class='container content'>
<h1 class='title is-1'>Feuille de rapport d'activité</h1>
<p class='subtitle is-1'>par <a href='https://www.cipherbliss.com'>Tykayn</a> </p>
${filterInfo}
${RenderStatsMonth()}
`
daysListRef.reverse().forEach((dayRefString) => {
`;
daysListRef.reverse().forEach((dayRefString) => {
let tasksOfTheDay = '';
let tasksOfTheDay = '';
stats.tasksByDay[dayRefString].forEach((dayObj) => {
let graphicKeyword = '✅'
if ('DONE' !== dayObj.todoKeyword) {
graphicKeyword = dayObj.todoKeyword;
}
stats.tasksByDay[dayRefString].forEach((dayObj) => {
let graphicKeyword = '✅';
if ('DONE' !== dayObj.todoKeyword) {
graphicKeyword = dayObj.todoKeyword;
}
let tagDisplay = '';
// console.log('dayObj.tags', dayObj.tags)
if (dayObj.tags && dayObj.tags.length ) {
tagDisplay = ` <p class="archived-tags tag is-light is-primary">
let tagDisplay = '';
// console.log('dayObj.tags', dayObj.tags)
if (dayObj.tags && dayObj.tags.length) {
tagDisplay = ` <p class='archived-tags tag is-light is-primary'>
${dayObj.tags}
</p>
`
}
`;
}
tasksOfTheDay += ` <li>
tasksOfTheDay += ` <li>
<h2>
<span class="keyword"> ${graphicKeyword}</span>
<span class="title"> ${dayObj.title} </span>
<span class='keyword'> ${graphicKeyword}</span>
<span class='title'> ${dayObj.title} </span>
</h2>
${tagDisplay}
</li>`
})
htmlOut += `
<div class="box">
</li>`;
});
htmlOut += `
<div class='box'>
<h1 class="title is-1">
<span class="day-ref">
<h1 class='title is-1'>
<span class='day-ref'>
${dayRefString}
</span>
<span class="counter pull-right tag is-success is-light">
<span class='counter pull-right tag is-success is-light'>
${stats.tasksByDay[dayRefString].length}
</span>
</h1>
<div class="day-detail">
<div class='day-detail'>
<ul>
${tasksOfTheDay}
</ul>
</div>
</div> `
})
htmlOut += `
<div class="box">
<h1 class="title is-1">
</div> `;
});
htmlOut += `
<div class='box'>
<h1 class='title is-1'>
Tadam, c'est tout!
</h1>
<p>
Source: <a href="https://forge.chapril.org/tykayn/org-report-stats">org-report-stats</a>
Source: <a href='https://forge.chapril.org/tykayn/org-report-stats'>org-report-stats</a>
<br>
Contactez-moi: <a href="https://www.cipherbliss.com/contact">par un de ces moyens</a>
Contactez-moi: <a href='https://www.cipherbliss.com/contact'>par un de ces moyens</a>
</p>
</div>
</div>
</body>
</html>
`
`;
fs.writeFile('output/output.json', JSON.stringify(stats), function (err, data) {
if (err) {
return console.log(err);
}
console.log('wrote output json', data)
})
fs.writeFile('output/output_' + outputFileName + '.html', htmlOut, function (err, data) {
if (err) {
return console.log(err);
}
console.log('wrote output html ' + outputFileName, data)
})
if (enableFilterByTag) {
console.log('excluded tasks by tag filter ', countExcluded)
fs.writeFile('output/output.json', JSON.stringify(stats), function (err, data) {
if (err) {
return console.log(err);
}
}
console.log('wrote output json', data);
});
fs.writeFile('output/output_' + outputFileName + '.html', htmlOut, function (err, data) {
if (err) {
return console.log(err);
}
console.log('wrote output html ' + outputFileName, data);
});
if (enableFilterByTag) {
console.log('excluded tasks by tag filter ', countExcluded);
}
}
function sortObj(obj) {
return Object.keys(obj).sort().reduce(function (result, key) {
result[key] = obj[key];
return result;
}, {});
return Object.keys(obj).sort().reduce(function (result, key) {
result[key] = obj[key];
return result;
}, {});
}