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 { 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));