Read the statement by Michael Teeuw here.
MMM-Todoist - Your todoist tasks on your mirror
-
This post is deleted! -
Has anyone solved this yet? I was unable to get Wunderlist to work (installed both regular and enhanced - would never show more than the heading title) and now I can’t get Todoist to work. All settings are correct - I’ve updated the List ID in the MMM-todoist.js file in addition to the config.js file. I also assigned deadlines to everything just to make sure that wasn’t an issue. Here’s my section of config file:
{ module: "MMM-Todoist", position: "top_center", // This can be any of the regions. Best results in left or right regions. header: "ToDo List", // This is optional config: { // See 'Configuration options' for more information. accessToken: "XXXXXXXXXX", maximumEntries: 60, interval: 60, // lists: ["XXXXXXXXX"], fade: false, } },
I’d really like ANY todo list to work on the mirror. I appreciate any help or suggestions. Thanks!
-
Follow-up question - I’ve been trying to put all the config options in both the MMM-Todoist file and the config.js file (commenting them on and off as needed) but it’s not working. Is there a way for me to find a LOG of what Todoist is responding with so I know if it’s working? I’m a relative beginner but am hoping there’s a place for me to look and diagnose what’s not working.
-
@jsp196 A possible reason for your tasks not displaying is if you have any tasks with no due dates, there is a known bug in MMM-Todoist that will not display any of the tasks. I have a fork at https://github.com/tkotz8105/MMM-Todoist that corrects the bug. I hope it solves your issue.
-
@tkotz8621 Thanks. I had tried that but I just went through and deleted all the MMM-Todoist files, started over with your fork and now it works.
One other question - if I want to change the color of this module, is the CSS entry .module.MMM-Todoist? And has anyone had any luck with it working in custom.css or does it need to go into main.css?
Thanks!
-
Have anyone added a feature where it shows duedate?
-
@Lange Good idea… I thought about looking to adding it as an option set in config file. It may be a few weeks before I can maybe start to take a look at it.
-
I want to extend the module a little bit:
- Project Name as header
- Project color in front of the name / the todos
- reminder icon behind the todo (due date like the discussion above)
I tried a few things (from @tidus5 within the fetcher). But I can’t get it to work. Any hints / ideas?
-
@djsunrise19 Hello
i’m on holiday. Can send you the files when i’m back. you need to change the fetcher indeed.
Have a nice day
-
This is my code
it’s based on 2 users (i badly commented the code)/* Magic Mirror * Fetcher * * * By Michael Teeuw http://michaelteeuw.nl edited for Wunderlist by Paul-Vincent Roll * Edited again for Todoist by Chris Brooker * * MIT Licensed. */ var request = require("request"); /* Fetcher * Responsible for requesting an update on the set interval and broadcasting the data. * * attribute listID string - ID of the Wunderlist list. * attribute reloadInterval number - Reload interval in milliseconds. */ function dateDiff(date1, date2){ var diff = {} // Initialisation du retour var tmp = date2 - date1; tmp = Math.floor(tmp/1000); // Nombre de secondes entre les 2 dates diff.sec = tmp % 60; // Extraction du nombre de secondes tmp = Math.floor((tmp-diff.sec)/60); // Nombre de minutes (partie entière) diff.min = tmp % 60; // Extraction du nombre de minutes tmp = Math.floor((tmp-diff.min)/60); // Nombre d'heures (entières) diff.hour = tmp % 24; // Extraction du nombre d'heures tmp = Math.floor((tmp-diff.hour)/24); // Nombre de jours restants diff.day = tmp; return diff; } var Fetcher = function(listID, reloadInterval, accessToken, clientID) { var self = this; if (reloadInterval < 1000) { reloadInterval = 1000; } var reloadTimer = null; var items = []; var fetchFailedCallback = function() {}; var itemsReceivedCallback = function() {}; /* private methods */ /* fetchTodos() * Request the new items. */ var fetchTodos = function() { clearTimeout(reloadTimer); reloadTimer = null; request({ url: "https://todoist.com/API/v7/sync/", method: "POST", headers: { 'content-type': 'application/x-www-form-urlencoded', 'cache-control': 'no-cache' }, form: { token: accessToken, sync_token: '*', resource_types: '["items"]' } }, function(error, response, body) { if (!error && response.statusCode == 200) { items = []; for (var i = 0; i < JSON.parse(body).items.length; i++) { if (JSON.parse(body).items[i].project_id == listID) { donneetableau = JSON.parse(body).items[i]; onbalance = []; icontodo = []; assignedname = []; datedueretour = []; contentretour = []; assignedtodoname = []; checkedretour = []; if (donneetableau.priority == '1') {icontodo ='<i></i> '} else if (donneetableau.priority == '2') {icontodo ='<i></i> '} else if (donneetableau.priority == '3') {icontodo ='<i></i> '} else {icontodo ='<i></i> '} if (donneetableau.assigned_by_uid == 'XXXXXXXX') {assignedname ='(XXXXX)'}//TEST first XXX UID second XXXX yourname else if (donneetableau.assigned_by_uid == 'XXXXXXX') {assignedname ='(XXXXXX)'}//TEST first XXX UID second XXXX yourname else {assignedname ='Inconnu'}; if (donneetableau.due_date_utc) { date1 = new Date(); date2 = new Date(donneetableau.due_date_utc); diff = dateDiff(date1, date2); if (diff.day = '1') {datedueretour += diff.day + 'd <i></i> ';} else if (diff.hour >= '1') {datedueretour += diff.hour + 'h <i></i> ';} else {datedueretour += diff.min + 'min <i></i> ';}; } else {datedueretour =''}; contentretour = donneetableau.content; if (donneetableau.responsible_uid ) { if (donneetableau.responsible_uid == 'XXXXXXX') { assignedtodoname ='<i></i> ' } ////YOUR UID USER else if (donneetableau.responsible_uid == 'XXXXXXX') {assignedtodoname ='<i></i> '} else {assignedtodoname ='Inconnu'}; // YOUR UID USER } else { assignedtodoname ='' }; checkedretour = donneetableau.checked; onbalance +=assignedtodoname + icontodo + datedueretour + contentretour; items.push(onbalance); //items.split('\n'); //priority.push(JSON.parse(body).priority[i].priority); //datedue.push(JSON.parse(body).datedue[i].due_date_utc); } } self.broadcastItems(); scheduleTimer(); } }); }; /* scheduleTimer() * Schedule the timer for the next update. */ var scheduleTimer = function() { //console.log('Schedule update timer.'); clearTimeout(reloadTimer); reloadTimer = setTimeout(function() { fetchTodos(); }, reloadInterval); }; /* public methods */ /* setReloadInterval() * Update the reload interval, but only if we need to increase the speed. * * attribute interval number - Interval for the update in milliseconds. */ this.setReloadInterval = function(interval) { if (interval > 1000 && interval < reloadInterval) { reloadInterval = interval; } }; /* startFetch() * Initiate fetchTodos(); */ this.startFetch = function() { fetchTodos(); }; /* broadcastItems() * Broadcast the exsisting items. */ this.broadcastItems = function() { if (items.length