118 lines
3.5 KiB
TypeScript
118 lines
3.5 KiB
TypeScript
import {ChartCallback, ChartJSNodeCanvas} from 'chartjs-node-canvas';
|
|
import {Chart} from 'chart.js';
|
|
import {promises as fs} from 'fs';
|
|
import * as dataOrgmode from '/home/tykayn/Nextcloud/ressources/social sorting/output/export_all_tasks.org_parsed.json'
|
|
|
|
const ouput_folder = '/home/tykayn/Nextcloud/ressources/social sorting/output/'
|
|
const width = 1000 // define width and height of canvas
|
|
const height = 1000
|
|
const typeOfRender = 'png'
|
|
const chartType = 'line'
|
|
|
|
// time in : weeks, months, years, days
|
|
|
|
const time_agreggate = 'days'
|
|
// const time_agreggate = 'weeks'
|
|
// const time_agreggate = 'months'
|
|
// const time_agreggate = 'years'
|
|
function convertStats(tasks: any) {
|
|
let converted = []
|
|
let weeks = Object.keys(tasks['statistics']['statistics']['dates'][time_agreggate]);
|
|
|
|
let labels = []
|
|
let dataSets_done = {
|
|
label: 'Done tasks',
|
|
data: [],
|
|
backgroundColor: 'rgb(81,148,84)',
|
|
fill: {
|
|
target: 'origin',
|
|
above: 'rgb(81,148,84)',
|
|
below: 'rgb(115,190,75)',
|
|
}
|
|
}
|
|
let dataSets_created = {
|
|
label: 'Created tasks',
|
|
data: [],
|
|
backgroundColor: 'rgb(69,219,255)',
|
|
fill: {
|
|
target: 'origin',
|
|
above: 'rgb(69,219,255)',
|
|
below: 'rgb(115,190,75)',
|
|
}
|
|
}
|
|
weeks.forEach(time_period => {
|
|
|
|
if (time_period !== 'Nan-Nan') {
|
|
labels.push(time_period)
|
|
let info = tasks['statistics']['statistics']['dates'][time_agreggate][time_period]
|
|
if (info.created) {
|
|
dataSets_created.data.push(info.created)
|
|
} else {
|
|
dataSets_created.data.push(0)
|
|
}
|
|
if (info.closed) {
|
|
dataSets_done.data.push(info.closed)
|
|
} else {
|
|
dataSets_created.data.push(0)
|
|
}
|
|
}
|
|
})
|
|
// console.log('weeks', weeks)
|
|
return {
|
|
labels,
|
|
dataSets: {
|
|
dataSets_created,
|
|
dataSets_done,
|
|
}
|
|
}
|
|
}
|
|
|
|
let convertedStats = convertStats(dataOrgmode)
|
|
console.log('convertedStats', convertedStats)
|
|
|
|
|
|
|
|
async function main(): Promise<void> {
|
|
|
|
const configurationWithData: any = {
|
|
type: chartType,
|
|
title: {
|
|
display: true,
|
|
text: 'Custom Chart Title'
|
|
},
|
|
data: {
|
|
labels: convertedStats.labels,
|
|
datasets:
|
|
[
|
|
convertedStats.dataSets.dataSets_created,
|
|
convertedStats.dataSets.dataSets_done,
|
|
]
|
|
},
|
|
options: {},
|
|
plugins: [{
|
|
id: 'background-colour',
|
|
beforeDraw: (chart: Chart): void => {
|
|
const ctx = chart.ctx;
|
|
ctx.save();
|
|
ctx.fillStyle = 'white';
|
|
ctx.fillRect(0, 0, width, height);
|
|
ctx.restore();
|
|
}
|
|
}]
|
|
};
|
|
const chartCallback: ChartCallback = (ChartJS: any) => {
|
|
ChartJS.defaults.responsive = true;
|
|
ChartJS.defaults.borderColor = '#36a2eb';
|
|
ChartJS.defaults.maintainAspectRatio = false;
|
|
};
|
|
const chartJSNodeCanvas = new ChartJSNodeCanvas({width, height, chartCallback});
|
|
const buffer = await chartJSNodeCanvas.renderToBuffer(configurationWithData);
|
|
let outpath = ouput_folder + 'tasks_in_'+time_agreggate+'-created_and_done_' + chartType + ' -- chart.'+typeOfRender
|
|
|
|
await fs.writeFile(outpath, buffer, 'base64');
|
|
console.log('wrote graph ',outpath
|
|
)
|
|
}
|
|
|
|
main().then(r => console.log(r));
|